PluginProbe
Chartify – WordPress Chart Plugin / 3.7.5
Chartify – WordPress Chart Plugin v3.7.5
3.8.1 3.8.0 3.7.9 3.7.8 3.7.7 3.7.6 3.7.5 trunk 1.0.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 All 84 releases
chart-builder / public / js / chart-builder-public-chartjs.js

chart-builder-public-chartjs.js in Chartify – WordPress Chart Plugin 3.7.5, at public/js/chart-builder-public-chartjs.js

508 lines 14.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function($) {
2 'use strict';
3
4 var hoverGlowPluginRegistered = false;
5 function registerHoverGlowPlugin() {
6 if (hoverGlowPluginRegistered || typeof Chart === 'undefined') {
7 return;
8 }
9 Chart.register({
10 id: 'hoverGlowPlugin',
11 beforeDraw(chart) {
12 if (chart.config.type !== 'pie') {
13 return;
14 }
15 var ctx = chart.ctx;
16 var activeElements = chart.getActiveElements();
17
18 if (activeElements.length === 0) {
19 return;
20 }
21 var meta = chart.getDatasetMeta(activeElements[0].datasetIndex);
22 var element = meta.data[activeElements[0].index];
23
24 if (!element) {
25 return;
26 }
27 var sliceColor = element.options.backgroundColor || 'rgba(0, 0, 0, 1)';
28 ctx.save();
29 ctx.shadowColor = sliceColor;
30 ctx.shadowBlur = 15;
31 ctx.shadowOffsetX = 0;
32 ctx.shadowOffsetY = 0;
33
34 element.draw(ctx);
35 ctx.restore();
36 }
37 });
38 hoverGlowPluginRegistered = true;
39 }
40
41 function ChartBuilderChartJs(element, options) {
42 this.el = element;
43 this.$el = $(element);
44 this.htmlClassPrefix = 'ays-chart-';
45 this.htmlNamePrefix = 'ays_';
46 this.uniqueId;
47 this.dbData = undefined;
48 this.chartSourceData = undefined;
49 this.chartObj = undefined;
50 this.chartOptions = null;
51 this.chartData = null;
52 this.chartTempData = null;
53 this.chartType = 'pie_chart';
54 this.chartId = null;
55 this.chartSourceType = 'chart-js';
56 this.chartObject = null;
57
58 this.chartSources = {
59 'pie_chart' : 'Pie Chart',
60 'bar_chart' : 'Bar Chart',
61 'line_chart' : 'Line Chart',
62 }
63
64 registerHoverGlowPlugin();
65 this.init();
66
67 return this;
68 }
69
70 ChartBuilderChartJs.prototype.init = function() {
71 var _this = this;
72 _this.uniqueId = _this.$el.data('id');
73
74 if ( typeof window['aysChartOptions'+_this.uniqueId] != 'undefined' ) {
75 _this.dbData = JSON.parse( atob( window['aysChartOptions'+_this.uniqueId]['aysChartOptions'] ) );
76 }
77
78 _this.setEvents();
79 }
80
81 ChartBuilderChartJs.prototype.setEvents = function(e){
82 var _this = this;
83
84 _this.chartId = _this.dbData.id;
85 _this.chartType = _this.dbData.chart_type;
86 _this.chartSourceType = _this.dbData.chartSourceType;
87 _this.chartData = _this.dbData.source;
88
89 _this.loadChartBySource();
90 _this.resizeChart();
91
92 $(document).on('click', '.elementor-tab-title, .e-n-tab-title, .ays-load-chart-source', function (e) {
93 _this.loadChartBySource();
94 });
95 $(document).on('change', '.ays-load-chart-source', function (e) {
96 _this.loadChartBySource();
97 });
98 }
99
100 // Load charts by given type main function
101 ChartBuilderChartJs.prototype.loadChartBySource = function(){
102 var _this = this;
103
104 if(typeof _this.chartType !== undefined && _this.chartType){
105 switch (_this.chartType) {
106 case 'pie_chart':
107 _this.pieChartView();
108 break;
109 case 'bar_chart':
110 _this.barChartView();
111 break;
112 case 'line_chart':
113 _this.lineChartView();
114 break;
115 default:
116 _this.pieChartView();
117 break;
118 }
119 }
120 }
121
122
123 // Load chart by pie chart
124 ChartBuilderChartJs.prototype.pieChartView = function(){
125 var _this = this;
126 var getChartSource = _this.dbData.source;
127
128 var dataTypes = _this.chartConvertData( getChartSource );
129
130 var settings = _this.dbData.options;
131 var nSettings = _this.configOptionsForCharts(settings);
132
133 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
134 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
135 var canvasId = parentId + '-canvas';
136
137 var parentElement = document.getElementById(parentId);
138 var canvasElement = document.getElementById(canvasId);
139
140 if (!canvasElement) {
141 canvasElement = document.createElement('canvas');
142 canvasElement.id = canvasId;
143 parentElement.appendChild(canvasElement);
144 }
145
146 var ctx = canvasElement;
147 ctx.width = nSettings.chartWidth;
148 ctx.height = nSettings.chartHeight;
149
150 if (nSettings.chartWidthFormat === 'px') {
151 ctx.width = parseInt(nSettings.chartWidth);
152 } else if (nSettings.chartWidthFormat === '%') {
153 ctx.style.width = nSettings.chartWidth + '%';
154 }
155
156 if (nSettings.chartHeightFormat === 'px') {
157 ctx.height = parseInt(nSettings.chartHeight);
158 } else if (nSettings.chartHeightFormat === '%') {
159 ctx.style.height = nSettings.chartHeight + '%';
160 }
161
162 var sliceCount = dataTypes?.dataSets[0]?.data?.length || 0;
163 dataTypes.dataSets[0].backgroundColor = [];
164 dataTypes.dataSets[0].borderColor = [];
165
166 for (var i = 0; i < sliceCount; i++) {
167 dataTypes.dataSets[0].backgroundColor[i] = nSettings.sliceColor?.[i] || nSettings.sliceColorDefault?.[i % nSettings.sliceColorDefault.length];
168 dataTypes.dataSets[0].borderColor[i] = nSettings.slicesBorderColor?.[i] || 'transparent';
169 }
170 dataTypes.dataSets[0].borderWidth = nSettings.sliceBorderWidth;
171 _this.chartObject = new Chart(ctx, {
172 type: 'pie',
173 data: {
174 labels: dataTypes?.labels,
175 datasets: dataTypes?.dataSets,
176 },
177 options: {
178 radius: nSettings.outerRadius,
179 spacing: nSettings.sliceSpacing,
180 circumference: nSettings.circumference,
181 rotation: nSettings.startAngle,
182 borderColor: nSettings.sliceBorderColor,
183 plugins: {
184 tooltip:{
185 titleColor: nSettings.tooltipColor,
186 bodyColor: nSettings.tooltipColor,
187 footerColor: nSettings.tooltipColor,
188 titleFont: {
189 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
190 },
191 bodyFont: {
192 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
193 },
194 footerFont: {
195 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
196 },
197 position: 'nearest',
198 events: ['click'],
199 callbacks: nSettings.showColorCode ? {
200 label: function(context) {
201 var label = context.label || '';
202 var value = context.parsed || 0;
203 var color = context.dataset.backgroundColor[context.dataIndex];
204 return label + ': ' + value + ' (Color: ' + color + ')';
205 }
206 } : {
207 label: function(context) {
208 var label = context.label || '';
209 var value = context.parsed || 0;
210 return label + ': ' + value;
211 }
212 }
213 },
214 legend: {
215 position: nSettings.legendPosition,
216 align: nSettings.legendAlignment,
217 reverse: nSettings.legendReverse,
218 labels: {
219 color: nSettings.legendColor,
220 font: {
221 size: nSettings.legendFontSize,
222 weight: nSettings.legendBoldText ? 'bold' : 'normal',
223 style: nSettings.legendItalicText ? 'italic' : 'normal'
224 }
225 }
226 }
227 }
228 }
229 });
230
231 _this.resizeChart();
232 }
233
234 // Load chart by bar chart
235 ChartBuilderChartJs.prototype.barChartView = function(){
236 var _this = this;
237 var getChartSource = _this.dbData.source;
238
239 var dataTypes = _this.chartConvertData( getChartSource );
240
241 var settings = _this.dbData.options;
242 var nSettings = _this.configOptionsForCharts(settings);
243
244 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
245 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
246 var canvasId = parentId + '-canvas';
247
248 var parentElement = document.getElementById(parentId);
249 var canvasElement = document.getElementById(canvasId);
250
251 if (!canvasElement) {
252 canvasElement = document.createElement('canvas');
253 canvasElement.id = canvasId;
254 parentElement.appendChild(canvasElement);
255 }
256
257 var ctx = canvasElement;
258
259 ctx.width = nSettings.chartWidth;
260 ctx.height = nSettings.chartHeight;
261
262 if (nSettings.chartWidthFormat === 'px') {
263 ctx.width = parseInt(nSettings.chartWidth);
264 } else if (nSettings.chartWidthFormat === '%') {
265 ctx.style.width = nSettings.chartWidth + '%';
266 }
267
268 if (nSettings.chartHeightFormat === 'px') {
269 ctx.height = parseInt(nSettings.chartHeight);
270 } else if (nSettings.chartHeightFormat === '%') {
271 ctx.style.height = nSettings.chartHeight + '%';
272 }
273 _this.chartObject = new Chart(ctx, {
274 type: 'bar',
275 data: {
276 labels: dataTypes?.labels,
277 datasets: dataTypes?.dataSets,
278 },
279 options: {
280 plugins: {
281 tooltip:{
282 titleColor: nSettings.tooltipColor,
283 bodyColor: nSettings.tooltipColor,
284 footerColor: nSettings.tooltipColor,
285 titleFont: {
286 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
287 },
288 bodyFont: {
289 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
290 },
291 footerFont: {
292 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
293 },
294 },
295 legend: {
296 position: nSettings.legendPosition,
297 align: nSettings.legendAlignment,
298 labels: {
299 color: nSettings.legendColor,
300 font: {
301 size: nSettings.legendFontSize,
302 weight: nSettings.legendBoldText ? 'bold' : 'normal',
303 style: nSettings.legendItalicText ? 'italic' : 'normal'
304 }
305 }
306 }
307 }
308 }
309 });
310
311 _this.resizeChart();
312 }
313
314 // Load chart by line chart
315 ChartBuilderChartJs.prototype.lineChartView = function(){
316 var _this = this;
317 var getChartSource = _this.dbData.source;
318
319 var dataTypes = _this.chartConvertData( getChartSource );
320
321 var settings = _this.dbData.options;
322 var nSettings = _this.configOptionsForCharts(settings);
323
324 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
325 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
326 var canvasId = parentId + '-canvas';
327
328 var parentElement = document.getElementById(parentId);
329 var canvasElement = document.getElementById(canvasId);
330
331 if (!canvasElement) {
332 canvasElement = document.createElement('canvas');
333 canvasElement.id = canvasId;
334 parentElement.appendChild(canvasElement);
335 }
336
337 var ctx = canvasElement;
338
339 ctx.width = nSettings.chartWidth;
340 ctx.height = nSettings.chartHeight;
341
342 if (nSettings.chartWidthFormat === 'px') {
343 ctx.width = parseInt(nSettings.chartWidth);
344 } else if (nSettings.chartWidthFormat === '%') {
345 ctx.style.width = nSettings.chartWidth + '%';
346 }
347
348 if (nSettings.chartHeightFormat === 'px') {
349 ctx.height = parseInt(nSettings.chartHeight);
350 } else if (nSettings.chartHeightFormat === '%') {
351 ctx.style.height = nSettings.chartHeight + '%';
352 }
353
354 _this.chartObject = new Chart(ctx, {
355 type: 'line',
356 data: {
357 labels: dataTypes?.labels,
358 datasets: dataTypes?.dataSets,
359 },
360 options: {
361 maintainAspectRatio: false,
362 plugins: {
363 tooltip:{
364 titleColor: nSettings.tooltipColor,
365 bodyColor: nSettings.tooltipColor,
366 footerColor: nSettings.tooltipColor,
367 titleFont: {
368 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
369 },
370 bodyFont: {
371 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
372 },
373 footerFont: {
374 style: nSettings.tooltipItalicText ? 'italic' : 'normal'
375 },
376 },
377 legend: {
378 position: nSettings.legendPosition,
379 align: nSettings.legendAlignment,
380 labels: {
381 color: nSettings.legendColor,
382 font: {
383 size: nSettings.legendFontSize,
384 weight: nSettings.legendBoldText ? 'bold' : 'normal',
385 style: nSettings.legendItalicText ? 'italic' : 'normal'
386 }
387 }
388 }
389 }
390 }
391 });
392
393 _this.resizeChart();
394 }
395
396 /*
397 Configure all settings for all chart types
398 Getting settings for each chart type in respective function
399 */
400 ChartBuilderChartJs.prototype.configOptionsForCharts = function (settings) {
401 var newSettings = {};
402
403 newSettings.chartWidth = parseInt(settings['chart_width']);
404 newSettings.chartWidthFormat = settings['chart_width_format'];
405 newSettings.chartHeight = settings['chart_height'];
406 newSettings.chartHeightFormat = settings['chart_height_format'];
407 newSettings.outerRadius = settings['outer_radius'];
408 newSettings.sliceSpacing = settings['slice_spacing'];
409 newSettings.circumference = settings['circumference'];
410 newSettings.startAngle = settings['start_angle'];
411 newSettings.sliceColor = settings['slice_color'];
412 newSettings.slicesBorderColor = settings['slices_border_color'];
413 newSettings.sliceColorDefault = settings['slice_colors_default'];
414 newSettings.sliceBorderWidth = settings['slice_border_width'];
415 newSettings.sliceBorderColor = settings['slice_border_color'];
416 newSettings.legendPosition = settings['legend_position'];
417 newSettings.legendAlignment = settings['legend_alignment'];
418 newSettings.legendColor = settings['legend_color'];
419 newSettings.legendFontSize = settings['legend_font_size'];
420 newSettings.legendReverse = settings['legend_reverse'];
421 newSettings.legendItalicText = (settings['legend_italic'] == 'on') ? true : false;
422 newSettings.legendBoldText = (settings['legend_bold'] == 'on') ? true : false;
423 newSettings.tooltipColor = settings['tooltip_text_color'];
424 console.log('tooltip_italic value:', settings['tooltip_italic']);
425 newSettings.tooltipItalicText = (settings['tooltip_italic'] == 'italic') ? true : false;
426 newSettings.showColorCode = (settings['show_color_code'] == 'checked') ? true : false;
427 return newSettings;
428 }
429
430 // Detect window resize moment to draw charts responsively
431 ChartBuilderChartJs.prototype.resizeChart = function(){
432 var _this = this;
433
434 //create trigger to resizeEnd event
435 $(window).resize(function() {
436 if(this.resizeTO) clearTimeout(this.resizeTO);
437 this.resizeTO = setTimeout(function() {
438 $(this).trigger('resizeEnd');
439 }, 100);
440 });
441
442 //redraw graph when window resize is completed
443 $(window).on('resizeEnd', function() {
444 _this.chartObject.resize();
445 });
446 }
447
448 // Load chart by pie chart
449 ChartBuilderChartJs.prototype.chartConvertData = function( data ){
450 var _this = this;
451 var dataTypes = [];
452
453 var dataTypes = Array.from({ length: data[0].length }, () => []);
454 for (var i = 0; i < data.length; i++) {
455 for (var j = 0; j < data[i].length; j++) {
456 if (i === 0) {
457 dataTypes[j].push(data[i][j]);
458 } else {
459 dataTypes[j].push(i === 0 || j === 0 ? data[i][j] : +data[i][j]);
460 }
461 }
462 }
463
464 var labels = dataTypes.shift();
465 labels.shift();
466 var dataSets = dataTypes.map(item => ({
467 label: item[0],
468 data: item.slice(1).map(Number),
469 }));
470
471 return {labels, dataSets};
472 }
473
474 // Update chart data and display immediately
475 ChartBuilderChartJs.prototype.updateChartData = function( newData ){
476 var _this = this;
477 var newData = _this.chartConvertData( _this.chartData );
478
479 _this.chartObject.data = {
480 ..._this.chartObject.data,
481 labels: newData?.labels,
482 datasets: newData?.dataSets,
483 },
484 _this.chartObject.update();
485 }
486
487 ChartBuilderChartJs.prototype.htmlDecode = function (input) {
488 var e = document.createElement('div');
489 e.innerHTML = input;
490 return e.childNodes[0].nodeValue;
491 }
492
493 $.fn.ChartBuilderChartJsMain = function(options) {
494 return this.each(function() {
495 if (!$.data(this, 'ChartBuilderChartJsMain')) {
496 $.data(this, 'ChartBuilderChartJsMain', new ChartBuilderChartJs(this, options));
497 } else {
498 try {
499 $(this).data('ChartBuilderChartJsMain').init();
500 } catch (err) {
501 console.error('ChartBuilderChartJsMain has not initiated properly');
502 }
503 }
504 });
505 };
506
507 })(jQuery);
508