PluginProbe
Chartify – WordPress Chart Plugin / 3.7.8
Chartify – WordPress Chart Plugin v3.7.8
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.8, at public/js/chart-builder-public-chartjs.js

553 lines 17.1 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.rotationDegree,
182 borderColor: nSettings.sliceBorderColor,
183 hover: nSettings.enableInteractivity ? {
184 mode: 'nearest',
185 intersect: true
186 } : {
187 mode: null,
188 intersect: false
189 },
190 plugins: {
191 tooltip:{
192 enabled: nSettings.enableInteractivity,
193 titleColor: nSettings.tooltipColor,
194 bodyColor: nSettings.tooltipColor,
195 footerColor: nSettings.tooltipColor,
196 titleFont: {
197 size: nSettings.tooltipFontSize || 12,
198 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
199 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
200 },
201 bodyFont: {
202 size: nSettings.tooltipFontSize || 12,
203 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
204 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
205 },
206 footerFont: {
207 size: nSettings.tooltipFontSize || 12,
208 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
209 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
210 },
211 position: 'nearest',
212 events: ['click'],
213 callbacks: nSettings.showColorCode ? {
214 label: function(context) {
215 var label = context.label || '';
216 var value = context.parsed || 0;
217 var color = context.dataset.backgroundColor[context.dataIndex];
218 return label + ': ' + value + ' (Color: ' + color + ')';
219 }
220 } : {
221 label: function(context) {
222 var label = context.label || '';
223 var value = context.parsed || 0;
224 return label + ': ' + value;
225 }
226 }
227 },
228 legend: {
229 position: nSettings.legendPosition,
230 align: nSettings.legendAlignment,
231 reverse: nSettings.legendReverse,
232 labels: {
233 color: nSettings.legendColor,
234 font: {
235 size: nSettings.legendFontSize,
236 weight: nSettings.legendBoldText ? 'bold' : 'normal',
237 style: nSettings.legendItalicText ? 'italic' : 'normal'
238 }
239 }
240 }
241 }
242 }
243 });
244
245 _this.resizeChart();
246 }
247
248 // Load chart by bar chart
249 ChartBuilderChartJs.prototype.barChartView = function(){
250 var _this = this;
251 var getChartSource = _this.dbData.source;
252
253 var dataTypes = _this.chartConvertData( getChartSource );
254
255 var settings = _this.dbData.options;
256 var nSettings = _this.configOptionsForCharts(settings);
257
258 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
259 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
260 var canvasId = parentId + '-canvas';
261
262 var parentElement = document.getElementById(parentId);
263 var canvasElement = document.getElementById(canvasId);
264
265 if (!canvasElement) {
266 canvasElement = document.createElement('canvas');
267 canvasElement.id = canvasId;
268 parentElement.appendChild(canvasElement);
269 }
270
271 var ctx = canvasElement;
272
273 ctx.width = nSettings.chartWidth;
274 ctx.height = nSettings.chartHeight;
275
276 if (nSettings.chartWidthFormat === 'px') {
277 ctx.width = parseInt(nSettings.chartWidth);
278 } else if (nSettings.chartWidthFormat === '%') {
279 ctx.style.width = nSettings.chartWidth + '%';
280 }
281
282 if (nSettings.chartHeightFormat === 'px') {
283 ctx.height = parseInt(nSettings.chartHeight);
284 } else if (nSettings.chartHeightFormat === '%') {
285 ctx.style.height = nSettings.chartHeight + '%';
286 }
287 _this.chartObject = new Chart(ctx, {
288 type: 'bar',
289 data: {
290 labels: dataTypes?.labels,
291 datasets: dataTypes?.dataSets,
292 },
293 options: {
294 hover: nSettings.enableInteractivity ? {
295 mode: 'nearest',
296 intersect: true
297 } : {
298 mode: null,
299 intersect: false
300 },
301 plugins: {
302 tooltip:{
303 enabled: nSettings.enableInteractivity,
304 titleColor: nSettings.tooltipColor,
305 bodyColor: nSettings.tooltipColor,
306 footerColor: nSettings.tooltipColor,
307 titleFont: {
308 size: nSettings.tooltipFontSize || 12,
309 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
310 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
311 },
312 bodyFont: {
313 size: nSettings.tooltipFontSize || 12,
314 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
315 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
316 },
317 footerFont: {
318 size: nSettings.tooltipFontSize || 12,
319 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
320 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
321 },
322 },
323 legend: {
324 position: nSettings.legendPosition,
325 align: nSettings.legendAlignment,
326 labels: {
327 color: nSettings.legendColor,
328 font: {
329 size: nSettings.legendFontSize,
330 weight: nSettings.legendBoldText ? 'bold' : 'normal',
331 style: nSettings.legendItalicText ? 'italic' : 'normal'
332 }
333 }
334 }
335 }
336 }
337 });
338
339 _this.resizeChart();
340 }
341
342 // Load chart by line chart
343 ChartBuilderChartJs.prototype.lineChartView = function(){
344 var _this = this;
345 var getChartSource = _this.dbData.source;
346
347 var dataTypes = _this.chartConvertData( getChartSource );
348
349 var settings = _this.dbData.options;
350 var nSettings = _this.configOptionsForCharts(settings);
351
352 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
353 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
354 var canvasId = parentId + '-canvas';
355
356 var parentElement = document.getElementById(parentId);
357 var canvasElement = document.getElementById(canvasId);
358
359 if (!canvasElement) {
360 canvasElement = document.createElement('canvas');
361 canvasElement.id = canvasId;
362 parentElement.appendChild(canvasElement);
363 }
364
365 var ctx = canvasElement;
366
367 ctx.width = nSettings.chartWidth;
368 ctx.height = nSettings.chartHeight;
369
370 if (nSettings.chartWidthFormat === 'px') {
371 ctx.width = parseInt(nSettings.chartWidth);
372 } else if (nSettings.chartWidthFormat === '%') {
373 ctx.style.width = nSettings.chartWidth + '%';
374 }
375
376 if (nSettings.chartHeightFormat === 'px') {
377 ctx.height = parseInt(nSettings.chartHeight);
378 } else if (nSettings.chartHeightFormat === '%') {
379 ctx.style.height = nSettings.chartHeight + '%';
380 }
381
382 _this.chartObject = new Chart(ctx, {
383 type: 'line',
384 data: {
385 labels: dataTypes?.labels,
386 datasets: dataTypes?.dataSets,
387 },
388 options: {
389 maintainAspectRatio: false,
390 hover: nSettings.enableInteractivity ? {
391 mode: 'nearest',
392 intersect: true
393 } : {
394 mode: null,
395 intersect: false
396 },
397 plugins: {
398 tooltip:{
399 enabled: nSettings.enableInteractivity,
400 titleColor: nSettings.tooltipColor,
401 bodyColor: nSettings.tooltipColor,
402 footerColor: nSettings.tooltipColor,
403 titleFont: {
404 size: nSettings.tooltipFontSize || 12,
405 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
406 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
407 },
408 bodyFont: {
409 size: nSettings.tooltipFontSize || 12,
410 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
411 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
412 },
413 footerFont: {
414 size: nSettings.tooltipFontSize || 12,
415 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
416 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
417 },
418 },
419 legend: {
420 position: nSettings.legendPosition,
421 align: nSettings.legendAlignment,
422 labels: {
423 color: nSettings.legendColor,
424 font: {
425 size: nSettings.legendFontSize,
426 weight: nSettings.legendBoldText ? 'bold' : 'normal',
427 style: nSettings.legendItalicText ? 'italic' : 'normal'
428 }
429 }
430 }
431 }
432 }
433 });
434
435 _this.resizeChart();
436 }
437
438 /*
439 Configure all settings for all chart types
440 Getting settings for each chart type in respective function
441 */
442 ChartBuilderChartJs.prototype.configOptionsForCharts = function (settings) {
443 var newSettings = {};
444
445 newSettings.chartWidth = parseInt(settings['chart_width']);
446 newSettings.chartWidthFormat = settings['chart_width_format'];
447 newSettings.chartHeight = settings['chart_height'];
448 newSettings.chartHeightFormat = settings['chart_height_format'];
449 newSettings.outerRadius = settings['outer_radius'];
450 newSettings.sliceSpacing = settings['slice_spacing'];
451 newSettings.circumference = settings['circumference'];
452 newSettings.startAngle = settings['start_angle'];
453 newSettings.rotationDegree = settings['rotation_degree'];
454 newSettings.sliceColor = settings['slice_color'];
455 newSettings.slicesBorderColor = settings['slices_border_color'];
456 newSettings.sliceColorDefault = settings['slice_colors_default'];
457 newSettings.sliceBorderWidth = settings['slice_border_width'];
458 newSettings.sliceBorderColor = settings['slice_border_color'];
459 newSettings.legendPosition = settings['legend_position'];
460 newSettings.legendAlignment = settings['legend_alignment'];
461 newSettings.legendColor = settings['legend_color'];
462 newSettings.legendFontSize = settings['legend_font_size'];
463 newSettings.legendReverse = settings['legend_reverse'];
464 newSettings.legendItalicText = (settings['legend_italic'] == 'on') ? true : false;
465 newSettings.legendBoldText = (settings['legend_bold'] == 'on') ? true : false;
466 newSettings.tooltipColor = settings['tooltip_text_color'];
467 newSettings.tooltipItalicText = (settings['tooltip_italic'] == 'italic') ? true : false;
468 newSettings.tooltipFontSize = settings['tooltip_font_size'];
469 newSettings.tooltipBoldText = settings['tooltip_bold'];
470 newSettings.showColorCode = (settings['show_color_code'] == 'checked') ? true : false;
471 newSettings.enableInteractivity = (settings['enable_interactivity'] == 'off') ? false : true;
472 return newSettings;
473 }
474
475 // Detect window resize moment to draw charts responsively
476 ChartBuilderChartJs.prototype.resizeChart = function(){
477 var _this = this;
478
479 //create trigger to resizeEnd event
480 $(window).resize(function() {
481 if(this.resizeTO) clearTimeout(this.resizeTO);
482 this.resizeTO = setTimeout(function() {
483 $(this).trigger('resizeEnd');
484 }, 100);
485 });
486
487 //redraw graph when window resize is completed
488 $(window).on('resizeEnd', function() {
489 _this.chartObject.resize();
490 });
491 }
492
493 // Load chart by pie chart
494 ChartBuilderChartJs.prototype.chartConvertData = function( data ){
495 var _this = this;
496 var dataTypes = [];
497
498 var dataTypes = Array.from({ length: data[0].length }, () => []);
499 for (var i = 0; i < data.length; i++) {
500 for (var j = 0; j < data[i].length; j++) {
501 if (i === 0) {
502 dataTypes[j].push(data[i][j]);
503 } else {
504 dataTypes[j].push(i === 0 || j === 0 ? data[i][j] : +data[i][j]);
505 }
506 }
507 }
508
509 var labels = dataTypes.shift();
510 labels.shift();
511 var dataSets = dataTypes.map(item => ({
512 label: item[0],
513 data: item.slice(1).map(Number),
514 }));
515
516 return {labels, dataSets};
517 }
518
519 // Update chart data and display immediately
520 ChartBuilderChartJs.prototype.updateChartData = function( newData ){
521 var _this = this;
522 var newData = _this.chartConvertData( _this.chartData );
523
524 _this.chartObject.data = {
525 ..._this.chartObject.data,
526 labels: newData?.labels,
527 datasets: newData?.dataSets,
528 },
529 _this.chartObject.update();
530 }
531
532 ChartBuilderChartJs.prototype.htmlDecode = function (input) {
533 var e = document.createElement('div');
534 e.innerHTML = input;
535 return e.childNodes[0].nodeValue;
536 }
537
538 $.fn.ChartBuilderChartJsMain = function(options) {
539 return this.each(function() {
540 if (!$.data(this, 'ChartBuilderChartJsMain')) {
541 $.data(this, 'ChartBuilderChartJsMain', new ChartBuilderChartJs(this, options));
542 } else {
543 try {
544 $(this).data('ChartBuilderChartJsMain').init();
545 } catch (err) {
546 console.error('ChartBuilderChartJsMain has not initiated properly');
547 }
548 }
549 });
550 };
551
552 })(jQuery);
553