Spaces:
No application file
No application file
//set global Chart defaults | |
if (typeof Chart != 'undefined') { | |
// configure global Chart options | |
Chart.defaults.global.elements.line.borderWidth = 2; | |
Chart.defaults.global.elements.point.radius = 0; | |
Chart.defaults.global.legend.labels.boxWidth = 12; | |
Chart.defaults.global.maintainAspectRatio = false; | |
Chart.defaults.scale.ticks.padding = 10; | |
Chart.defaults.global.elements.point.hoverRadius = 6; | |
Chart.defaults.global.elements.point.hitRadius = 20; | |
Chart.defaults.global.legend.labels.usePointStyle = true; | |
Chart.defaults.global.legend.labels.pointStyle = 'circle'; | |
} | |
/** | |
* Render the chart.js charts | |
* | |
* @param mQuery|string scope | |
*/ | |
Mautic.renderCharts = function(scope) { | |
var charts = []; | |
if (!Mautic.chartObjects) Mautic.chartObjects = []; | |
if (mQuery.type(scope) === 'string') { | |
charts = mQuery(scope).find('canvas.chart'); | |
} else if (scope) { | |
charts = scope.find('canvas.chart'); | |
} else { | |
charts = mQuery('canvas.chart'); | |
} | |
if (charts.length) { | |
charts.each(function(index, canvas) { | |
canvas = mQuery(canvas); | |
if (!canvas.hasClass('chart-rendered')) { | |
if (canvas.hasClass('line-chart')) { | |
Mautic.renderLineChart(canvas) | |
} else if (canvas.hasClass('pie-chart')) { | |
Mautic.renderPieChart(canvas) | |
} else if (canvas.hasClass('bar-chart')) { | |
Mautic.renderBarChart(canvas) | |
} else if (canvas.hasClass('liefechart-bar-chart')) { | |
Mautic.renderLifechartBarChart(canvas) | |
} else if (canvas.hasClass('simple-bar-chart')) { | |
Mautic.renderSimpleBarChart(canvas) | |
} else if (canvas.hasClass('horizontal-bar-chart')) { | |
Mautic.renderHorizontalBarChart(canvas) | |
} | |
} | |
canvas.addClass('chart-rendered'); | |
}); | |
} | |
}; | |
/** | |
* Render the chart.js line chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderLineChart = function(canvas) { | |
var data = JSON.parse(canvas.text()); | |
if (!data.labels.length || !data.datasets.length) return; | |
var chart = new Chart(canvas, { | |
type: 'line', | |
data: data, | |
options: { | |
lineTension : 0.2, | |
borderWidth: 1, | |
tooltips: { | |
mode: 'index', | |
intersect: false | |
}, | |
scales: { | |
xAxes: [{ | |
gridLines: { | |
display: false | |
}, | |
ticks: { | |
maxRotation: 0, | |
callback: function(value, index, values) { | |
if (index === 0 || index === values.length - 1) { | |
return value; | |
} | |
return ''; | |
} | |
} | |
}], | |
yAxes: [{ | |
afterBuildTicks: function(scale) { | |
scale.ticks = []; | |
scale.ticks.push(scale.min); | |
scale.ticks.push((scale.max - scale.min) / 2); | |
scale.ticks.push(scale.max); | |
}, | |
gridLines: { | |
drawBorder: false, | |
}, | |
ticks: { | |
beginAtZero: true, | |
callback: function(value, index, values) { | |
if (index === 0 || index === values.length - 1) { | |
return value; | |
} | |
if (/^\d+\.5$/.test(value.toString())) { | |
return ''; | |
} | |
if (index === Math.floor(values.length / 2)) { | |
return value !== 0.5 ? value : ''; | |
} | |
return ''; | |
} | |
} | |
}] | |
} | |
} | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render the chart.js pie chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderPieChart = function(canvas) { | |
var data = JSON.parse(canvas.text()); | |
var options = {borderWidth: 1}; | |
var disableLegend = canvas.attr('data-disable-legend'); | |
if (typeof disableLegend !== 'undefined' && disableLegend !== false) { | |
options.legend = { | |
display: false | |
} | |
} | |
// data = Mautic.emulateNoDataForPieChart(data); | |
var chart = new Chart(canvas, { | |
type: 'pie', | |
data: data, | |
options: options | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render the chart.js bar chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderBarChart = function(canvas) { | |
var data = JSON.parse(canvas.text()); | |
var chart = new Chart(canvas, { | |
type: 'bar', | |
data: data, | |
options: { | |
scales: { | |
xAxes: [{ | |
barPercentage: 0.9, | |
}] | |
} | |
} | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render the chart.js bar chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderLifechartBarChart = function(canvas) { | |
var canvasWidth = mQuery(canvas).parent().width(); | |
var barWidth = (canvasWidth < 300) ? 5 : 25; | |
var data = JSON.parse(canvas.text()); | |
var chart = new Chart(canvas, { | |
type: 'bar', | |
data: data, | |
options: { | |
scales: { | |
xAxes: [ | |
{ | |
barThickness: barWidth, | |
} | |
] | |
} | |
} | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render the chart.js simple bar chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderSimpleBarChart = function(canvas) { | |
var data = JSON.parse(canvas.text()); | |
var chart = new Chart(canvas, { | |
type: 'bar', | |
data: data, | |
options: { | |
scales: { | |
xAxes: [{ | |
stacked: false, | |
ticks: {fontSize: 9}, | |
gridLines: {display:false}, | |
}], | |
yAxes: [{ | |
display: false, | |
stacked: false, | |
ticks: {beginAtZero: true, display: false}, | |
gridLines: {display:false} | |
}], | |
display: false | |
}, | |
legend: { | |
display: false | |
} | |
} | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render the chart.js simple bar chart | |
* | |
* @param mQuery element canvas | |
*/ | |
Mautic.renderHorizontalBarChart = function(canvas) { | |
var data = JSON.parse(canvas.text()); | |
var chart = new Chart(canvas, { | |
type: 'horizontalBar', | |
data: data, | |
options: { | |
scales: { | |
xAxes: [{ | |
display: true, | |
stacked: false, | |
gridLines: {display:false}, | |
ticks: {beginAtZero: true,display: true, fontSize: 8, stepSize: 5} | |
}], | |
yAxes: [{ | |
stacked: false, | |
ticks: {beginAtZero: true, display: true, fontSize: 9}, | |
gridLines: {display:false}, | |
barPercentage: 0.5, | |
categorySpacing: 1 | |
}], | |
display: false | |
}, | |
legend: { | |
display: false | |
}, | |
tooltips: { | |
mode: 'single', | |
bodyFontSize: 9, | |
bodySpacing: 0, | |
callbacks: { | |
title: function(tooltipItems, data) { | |
// Title doesn't make sense for scatter since we format the data as a point | |
return ''; | |
}, | |
label: function(tooltipItem, data) { | |
return tooltipItem.xLabel + ': ' + tooltipItem.yLabel; | |
} | |
} | |
} | |
} | |
}); | |
Mautic.chartObjects.push(chart); | |
}; | |
/** | |
* Render vector maps | |
* @deprecated please use MauticMap class | |
* @param mQuery element scope | |
*/ | |
Mautic.renderMaps = function(scope) { | |
var maps = []; | |
if (mQuery.type(scope) === 'string') { | |
maps = mQuery(scope).find('.vector-map'); | |
} else if (scope) { | |
maps = scope.find('.vector-map'); | |
} else { | |
maps = mQuery('.vector-map'); | |
} | |
if (maps.length) { | |
maps.each(function(index, element) { | |
Mautic.renderMap(mQuery(element)); | |
}); | |
} | |
}; | |
/** | |
* @deprecated please use MauticMap class | |
* @param wrapper | |
* @returns {*} | |
*/ | |
Mautic.renderMap = function(wrapper) { | |
// Map render causes a JS error on FF when the element is hidden | |
if (wrapper.is(':visible')) { | |
if (!Mautic.mapObjects) Mautic.mapObjects = []; | |
var data = wrapper.data('map-data'); | |
if (typeof data === 'undefined' || !data.length) { | |
try { | |
data = JSON.parse(wrapper.text()); | |
wrapper.data('map-data', data); | |
} catch (error) { | |
return; | |
} | |
} | |
// Markers have numerical indexes | |
var firstKey = Object.keys(data)[0]; | |
// Check type of data | |
if (firstKey == "0") { | |
// Markers | |
var markersData = data, | |
regionsData = {}; | |
} else { | |
// Regions | |
var markersData = {}, | |
regionsData = data; | |
} | |
wrapper.text(''); | |
wrapper.vectorMap({ | |
backgroundColor: 'transparent', | |
zoomOnScroll: false, | |
markers: markersData, | |
markerStyle: { | |
initial: { | |
fill: '#40C7B5' | |
}, | |
selected: { | |
fill: '#40C7B5' | |
} | |
}, | |
regionStyle: { | |
initial: { | |
"fill": '#dce0e5', | |
"fill-opacity": 1, | |
"stroke": 'none', | |
"stroke-width": 0, | |
"stroke-opacity": 1 | |
}, | |
hover: { | |
"fill-opacity": 0.7, | |
"cursor": 'pointer' | |
} | |
}, | |
map: 'world_mill_en', | |
series: { | |
regions: [{ | |
values: regionsData, | |
scale: ['#dce0e5', '#40C7B5'], | |
normalizeFunction: 'polynomial' | |
}] | |
}, | |
onRegionTipShow: function (event, label, index) { | |
if (data[index] > 0) { | |
label.html( | |
'<b>'+label.html()+'</b></br>'+ | |
data[index]+' Leads' | |
); | |
} | |
} | |
}); | |
wrapper.addClass('map-rendered'); | |
Mautic.mapObjects.push(wrapper); | |
return wrapper; | |
} | |
}; | |
/** | |
* Destroy a jVector map | |
* @deprecated please use MauticMap class | |
*/ | |
Mautic.destroyMap = function(wrapper) { | |
if (wrapper.hasClass('map-rendered')) { | |
var map = wrapper.vectorMap('get', 'mapObject'); | |
map.removeAllMarkers(); | |
map.remove(); | |
wrapper.empty(); | |
wrapper.removeClass('map-rendered'); | |
} | |
}; | |
/** | |
* Initialize graph date range selectors | |
*/ | |
Mautic.initDateRangePicker = function (fromId, toId) { | |
var dateFrom = mQuery(fromId); | |
var dateTo = mQuery(toId); | |
if (dateFrom.length && dateTo.length) { | |
dateFrom.datetimepicker({ | |
format: 'M j, Y', | |
onShow: function (ct) { | |
this.setOptions({ | |
maxDate: dateTo.val() ? new Date(dateTo.val()) : false | |
}); | |
}, | |
timepicker: false, | |
scrollMonth: false, | |
scrollInput: false | |
}); | |
dateTo.datetimepicker({ | |
format: 'M j, Y', | |
onShow: function (ct) { | |
this.setOptions({ | |
maxDate: new Date(), | |
minDate: dateFrom.val() ? new Date(dateFrom.val()) : false | |
}); | |
}, | |
timepicker: false, | |
scrollMonth: false, | |
scrollInput: false | |
}); | |
} | |
}; | |
/** | |
* Helper function to timeframe based graphs | |
* | |
* @param element | |
* @param action | |
* @param query | |
* @param callback | |
*/ | |
Mautic.getChartData = function(element, action, query, callback) { | |
var element = mQuery(element); | |
var wrapper = element.closest('ul'); | |
var button = mQuery('#time-scopes .button-label'); | |
wrapper.find('a').removeClass('bg-primary'); | |
element.addClass('bg-primary'); | |
button.text(element.text()); | |
// Append action | |
query = query + '&action=' + action; | |
mQuery.ajax({ | |
showLoadingBar: true, | |
url: mauticAjaxUrl, | |
type: 'POST', | |
data: query, | |
dataType: "json", | |
success: function (response) { | |
if (response.success) { | |
Mautic.stopPageLoadingBar(); | |
if (typeof callback == 'function') { | |
callback(response); | |
} else if(typeof window["Mautic"][callback] !== 'undefined') { | |
window["Mautic"][callback].apply('window', [response]); | |
} | |
} | |
}, | |
error: function (request, textStatus, errorThrown) { | |
Mautic.processAjaxError(request, textStatus, errorThrown); | |
} | |
}); | |
}; | |
/** | |
* Emulates empty data object if doughnut/pie chart data are empty. | |
* | |
* | |
* @param data | |
*/ | |
Mautic.emulateNoDataForPieChart = function (data) { | |
var dataEmpty = true; | |
mQuery.each(data, function (i, part) { | |
if (part.value) { | |
dataEmpty = false; | |
} | |
}); | |
if (dataEmpty) { | |
data = [{ | |
value: 1, | |
color: "#efeeec", | |
highlight: "#EBEBEB", | |
label: "No data" | |
}]; | |
} | |
return data; | |
}; |