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

741 lines 23.4 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 'donut_chart':
110 _this.donutChartView();
111 break;
112 case 'bar_chart':
113 _this.barChartView();
114 break;
115 case 'line_chart':
116 _this.lineChartView();
117 break;
118 default:
119 _this.pieChartView();
120 break;
121 }
122 }
123 }
124
125
126 // Load chart by pie chart
127 ChartBuilderChartJs.prototype.pieChartView = function(){
128 var _this = this;
129 var getChartSource = _this.dbData.source;
130
131 var dataTypes = _this.chartConvertData( getChartSource );
132
133 var settings = _this.dbData.options;
134 var nSettings = _this.configOptionsForCharts(settings);
135 _this.applyPieDataGrouping(dataTypes, nSettings);
136
137 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
138 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
139 var canvasId = parentId + '-canvas';
140
141 var parentElement = document.getElementById(parentId);
142 var canvasElement = document.getElementById(canvasId);
143
144 if (!canvasElement) {
145 canvasElement = document.createElement('canvas');
146 canvasElement.id = canvasId;
147 parentElement.appendChild(canvasElement);
148 }
149
150 var ctx = canvasElement;
151 ctx.width = nSettings.chartWidth;
152 ctx.height = nSettings.chartHeight;
153
154 if (nSettings.chartWidthFormat === 'px') {
155 ctx.width = parseInt(nSettings.chartWidth);
156 } else if (nSettings.chartWidthFormat === '%') {
157 ctx.style.width = nSettings.chartWidth + '%';
158 }
159
160 if (nSettings.chartHeightFormat === 'px') {
161 ctx.height = parseInt(nSettings.chartHeight);
162 } else if (nSettings.chartHeightFormat === '%') {
163 ctx.style.height = nSettings.chartHeight + '%';
164 }
165
166 var sliceCount = dataTypes?.dataSets[0]?.data?.length || 0;
167 dataTypes.dataSets[0].backgroundColor = [];
168 dataTypes.dataSets[0].borderColor = [];
169
170 for (var i = 0; i < sliceCount; i++) {
171 dataTypes.dataSets[0].backgroundColor[i] = i === dataTypes.dataSets[0].groupedSliceIndex ? nSettings.dataGroupingColor : (nSettings.sliceColor?.[i] || nSettings.sliceColorDefault?.[i % nSettings.sliceColorDefault.length]);
172 dataTypes.dataSets[0].borderColor[i] = nSettings.slicesBorderColor?.[i] || 'transparent';
173 }
174 dataTypes.dataSets[0].borderWidth = nSettings.sliceBorderWidth;
175 _this.chartObject = new Chart(ctx, {
176 type: 'pie',
177 data: {
178 labels: dataTypes?.labels,
179 datasets: dataTypes?.dataSets,
180 },
181 options: {
182 radius: nSettings.outerRadius,
183 spacing: nSettings.sliceSpacing,
184 circumference: nSettings.circumference,
185 rotation: nSettings.rotationDegree,
186 borderColor: nSettings.sliceBorderColor,
187 hover: nSettings.enableInteractivity ? {
188 mode: 'nearest',
189 intersect: true
190 } : {
191 mode: null,
192 intersect: false
193 },
194 plugins: {
195 tooltip:{
196 enabled: nSettings.enableInteractivity,
197 titleColor: nSettings.tooltipColor,
198 bodyColor: nSettings.tooltipColor,
199 footerColor: nSettings.tooltipColor,
200 titleFont: {
201 size: nSettings.tooltipFontSize || 12,
202 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
203 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
204 },
205 bodyFont: {
206 size: nSettings.tooltipFontSize || 12,
207 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
208 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
209 },
210 footerFont: {
211 size: nSettings.tooltipFontSize || 12,
212 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
213 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
214 },
215 position: 'nearest',
216 events: ['click'],
217 callbacks: _this.getTooltipCallbacks(nSettings.tooltipText, nSettings.showColorCode)
218 },
219 legend: {
220 position: nSettings.legendPosition,
221 align: nSettings.legendAlignment,
222 reverse: nSettings.legendReverse,
223 labels: {
224 color: nSettings.legendColor,
225 font: {
226 size: nSettings.legendFontSize,
227 weight: nSettings.legendBoldText ? 'bold' : 'normal',
228 style: nSettings.legendItalicText ? 'italic' : 'normal'
229 }
230 }
231 }
232 }
233 }
234 });
235
236 _this.resizeChart();
237 }
238
239 // Load chart by pie chart
240 ChartBuilderChartJs.prototype.donutChartView = function(){
241 var _this = this;
242 var getChartSource = _this.dbData.source;
243
244 var dataTypes = _this.chartConvertData( getChartSource );
245
246 var settings = _this.dbData.options;
247 var nSettings = _this.configOptionsForCharts(settings);
248 _this.applyPieDataGrouping(dataTypes, nSettings);
249
250 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
251 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
252 var canvasId = parentId + '-canvas';
253
254 var parentElement = document.getElementById(parentId);
255 var canvasElement = document.getElementById(canvasId);
256
257 if (!canvasElement) {
258 canvasElement = document.createElement('canvas');
259 canvasElement.id = canvasId;
260 parentElement.appendChild(canvasElement);
261 }
262
263 var ctx = canvasElement;
264 ctx.width = nSettings.chartWidth;
265 ctx.height = nSettings.chartHeight;
266
267 if (nSettings.chartWidthFormat === 'px') {
268 ctx.width = parseInt(nSettings.chartWidth);
269 } else if (nSettings.chartWidthFormat === '%') {
270 ctx.style.width = nSettings.chartWidth + '%';
271 }
272
273 if (nSettings.chartHeightFormat === 'px') {
274 ctx.height = parseInt(nSettings.chartHeight);
275 } else if (nSettings.chartHeightFormat === '%') {
276 ctx.style.height = nSettings.chartHeight + '%';
277 }
278
279 var sliceCount = dataTypes?.dataSets[0]?.data?.length || 0;
280 dataTypes.dataSets[0].backgroundColor = [];
281 dataTypes.dataSets[0].borderColor = [];
282
283 for (var i = 0; i < sliceCount; i++) {
284 dataTypes.dataSets[0].backgroundColor[i] = nSettings.sliceColor?.[i] || nSettings.sliceColorDefault?.[i % nSettings.sliceColorDefault.length];
285 dataTypes.dataSets[0].borderColor[i] = nSettings.slicesBorderColor?.[i] || 'transparent';
286 }
287 dataTypes.dataSets[0].borderWidth = nSettings.sliceBorderWidth;
288 _this.chartObject = new Chart(ctx, {
289 type: 'doughnut',
290 data: {
291 labels: dataTypes?.labels,
292 datasets: dataTypes?.dataSets,
293 },
294 options: {
295 radius: nSettings.outerRadius,
296 spacing: nSettings.sliceSpacing,
297 circumference: nSettings.circumference,
298 rotation: nSettings.rotationDegree,
299 borderColor: nSettings.sliceBorderColor,
300 hover: nSettings.enableInteractivity ? {
301 mode: 'nearest',
302 intersect: true
303 } : {
304 mode: null,
305 intersect: false
306 },
307 plugins: {
308 tooltip:{
309 enabled: nSettings.enableInteractivity,
310 titleColor: nSettings.tooltipColor,
311 bodyColor: nSettings.tooltipColor,
312 footerColor: nSettings.tooltipColor,
313 titleFont: {
314 size: nSettings.tooltipFontSize || 12,
315 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
316 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
317 },
318 bodyFont: {
319 size: nSettings.tooltipFontSize || 12,
320 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
321 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
322 },
323 footerFont: {
324 size: nSettings.tooltipFontSize || 12,
325 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
326 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
327 },
328 position: 'nearest',
329 events: ['click'],
330 callbacks: _this.getTooltipCallbacks(nSettings.tooltipText, nSettings.showColorCode)
331 },
332 legend: {
333 position: nSettings.legendPosition,
334 align: nSettings.legendAlignment,
335 reverse: nSettings.legendReverse,
336 labels: {
337 color: nSettings.legendColor,
338 font: {
339 size: nSettings.legendFontSize,
340 weight: nSettings.legendBoldText ? 'bold' : 'normal',
341 style: nSettings.legendItalicText ? 'italic' : 'normal'
342 }
343 }
344 }
345 }
346 }
347 });
348
349 _this.resizeChart();
350 }
351
352 // Load chart by bar chart
353 ChartBuilderChartJs.prototype.barChartView = function(){
354 var _this = this;
355 var getChartSource = _this.dbData.source;
356
357 var dataTypes = _this.chartConvertData( getChartSource );
358
359 var settings = _this.dbData.options;
360 var nSettings = _this.configOptionsForCharts(settings);
361
362 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
363 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
364 var canvasId = parentId + '-canvas';
365
366 var parentElement = document.getElementById(parentId);
367 var canvasElement = document.getElementById(canvasId);
368
369 if (!canvasElement) {
370 canvasElement = document.createElement('canvas');
371 canvasElement.id = canvasId;
372 parentElement.appendChild(canvasElement);
373 }
374
375 var ctx = canvasElement;
376
377 ctx.width = nSettings.chartWidth;
378 ctx.height = nSettings.chartHeight;
379
380 if (nSettings.chartWidthFormat === 'px') {
381 ctx.width = parseInt(nSettings.chartWidth);
382 } else if (nSettings.chartWidthFormat === '%') {
383 ctx.style.width = nSettings.chartWidth + '%';
384 }
385
386 if (nSettings.chartHeightFormat === 'px') {
387 ctx.height = parseInt(nSettings.chartHeight);
388 } else if (nSettings.chartHeightFormat === '%') {
389 ctx.style.height = nSettings.chartHeight + '%';
390 }
391 _this.chartObject = new Chart(ctx, {
392 type: 'bar',
393 data: {
394 labels: dataTypes?.labels,
395 datasets: dataTypes?.dataSets,
396 },
397 options: {
398 hover: nSettings.enableInteractivity ? {
399 mode: 'nearest',
400 intersect: true
401 } : {
402 mode: null,
403 intersect: false
404 },
405 plugins: {
406 tooltip:{
407 enabled: nSettings.enableInteractivity,
408 titleColor: nSettings.tooltipColor,
409 bodyColor: nSettings.tooltipColor,
410 footerColor: nSettings.tooltipColor,
411 titleFont: {
412 size: nSettings.tooltipFontSize || 12,
413 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
414 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
415 },
416 bodyFont: {
417 size: nSettings.tooltipFontSize || 12,
418 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
419 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
420 },
421 footerFont: {
422 size: nSettings.tooltipFontSize || 12,
423 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
424 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
425 },
426 },
427 legend: {
428 position: nSettings.legendPosition,
429 align: nSettings.legendAlignment,
430 labels: {
431 color: nSettings.legendColor,
432 font: {
433 size: nSettings.legendFontSize,
434 weight: nSettings.legendBoldText ? 'bold' : 'normal',
435 style: nSettings.legendItalicText ? 'italic' : 'normal'
436 }
437 }
438 }
439 }
440 }
441 });
442
443 _this.resizeChart();
444 }
445
446 // Load chart by line chart
447 ChartBuilderChartJs.prototype.lineChartView = function(){
448 var _this = this;
449 var getChartSource = _this.dbData.source;
450
451 var dataTypes = _this.chartConvertData( getChartSource );
452
453 var settings = _this.dbData.options;
454 var nSettings = _this.configOptionsForCharts(settings);
455
456 // var ctx = document.getElementById(_this.htmlClassPrefix + _this.uniqueId + '-canvas');
457 var parentId = _this.htmlClassPrefix + _this.chartType + '-' + _this.uniqueId;
458 var canvasId = parentId + '-canvas';
459
460 var parentElement = document.getElementById(parentId);
461 var canvasElement = document.getElementById(canvasId);
462
463 if (!canvasElement) {
464 canvasElement = document.createElement('canvas');
465 canvasElement.id = canvasId;
466 parentElement.appendChild(canvasElement);
467 }
468
469 var ctx = canvasElement;
470
471 ctx.width = nSettings.chartWidth;
472 ctx.height = nSettings.chartHeight;
473
474 if (nSettings.chartWidthFormat === 'px') {
475 ctx.width = parseInt(nSettings.chartWidth);
476 } else if (nSettings.chartWidthFormat === '%') {
477 ctx.style.width = nSettings.chartWidth + '%';
478 }
479
480 if (nSettings.chartHeightFormat === 'px') {
481 ctx.height = parseInt(nSettings.chartHeight);
482 } else if (nSettings.chartHeightFormat === '%') {
483 ctx.style.height = nSettings.chartHeight + '%';
484 }
485
486 _this.chartObject = new Chart(ctx, {
487 type: 'line',
488 data: {
489 labels: dataTypes?.labels,
490 datasets: dataTypes?.dataSets,
491 },
492 options: {
493 maintainAspectRatio: false,
494 hover: nSettings.enableInteractivity ? {
495 mode: 'nearest',
496 intersect: true
497 } : {
498 mode: null,
499 intersect: false
500 },
501 plugins: {
502 tooltip:{
503 enabled: nSettings.enableInteractivity,
504 titleColor: nSettings.tooltipColor,
505 bodyColor: nSettings.tooltipColor,
506 footerColor: nSettings.tooltipColor,
507 titleFont: {
508 size: nSettings.tooltipFontSize || 12,
509 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
510 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
511 },
512 bodyFont: {
513 size: nSettings.tooltipFontSize || 12,
514 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
515 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
516 },
517 footerFont: {
518 size: nSettings.tooltipFontSize || 12,
519 style: nSettings.tooltipItalicText ? 'italic' : 'normal',
520 weight: nSettings.tooltipBoldText === 'true' ? 'bold' : (nSettings.tooltipBoldText === 'false' ? 'normal' : undefined)
521 },
522 },
523 legend: {
524 position: nSettings.legendPosition,
525 align: nSettings.legendAlignment,
526 labels: {
527 color: nSettings.legendColor,
528 font: {
529 size: nSettings.legendFontSize,
530 weight: nSettings.legendBoldText ? 'bold' : 'normal',
531 style: nSettings.legendItalicText ? 'italic' : 'normal'
532 }
533 }
534 }
535 }
536 }
537 });
538
539 _this.resizeChart();
540 }
541
542 /*
543 Configure all settings for all chart types
544 Getting settings for each chart type in respective function
545 */
546 ChartBuilderChartJs.prototype.configOptionsForCharts = function (settings) {
547 var newSettings = {};
548
549 newSettings.chartWidth = parseInt(settings['chart_width']);
550 newSettings.chartWidthFormat = settings['chart_width_format'];
551 newSettings.chartHeight = settings['chart_height'];
552 newSettings.chartHeightFormat = settings['chart_height_format'];
553 newSettings.outerRadius = settings['outer_radius'];
554 newSettings.sliceSpacing = settings['slice_spacing'];
555 newSettings.circumference = settings['circumference'];
556 newSettings.startAngle = settings['start_angle'];
557 newSettings.rotationDegree = settings['rotation_degree'];
558 newSettings.sliceColor = settings['slice_color'];
559 newSettings.slicesBorderColor = settings['slices_border_color'];
560 newSettings.sliceColorDefault = settings['slice_colors_default'];
561 newSettings.sliceBorderWidth = settings['slice_border_width'];
562 newSettings.sliceBorderColor = settings['slice_border_color'];
563 newSettings.dataGroupingLimit = parseFloat(settings['data_grouping_limit']) / 100;
564 newSettings.dataGroupingLabel = settings['data_grouping_label'];
565 newSettings.dataGroupingColor = settings['data_grouping_color'];
566 newSettings.legendPosition = settings['legend_position'];
567 newSettings.legendAlignment = settings['legend_alignment'];
568 newSettings.legendColor = settings['legend_color'];
569 newSettings.legendFontSize = settings['legend_font_size'];
570 newSettings.legendReverse = settings['legend_reverse'];
571 newSettings.legendItalicText = (settings['legend_italic'] == 'on') ? true : false;
572 newSettings.legendBoldText = (settings['legend_bold'] == 'on') ? true : false;
573 newSettings.tooltipColor = settings['tooltip_text_color'];
574 newSettings.tooltipItalicText = (settings['tooltip_italic'] == 'italic') ? true : false;
575 newSettings.tooltipFontSize = settings['tooltip_font_size'];
576 newSettings.tooltipBoldText = settings['tooltip_bold'];
577 newSettings.showColorCode = (settings['show_color_code'] == 'checked') ? true : false;
578 newSettings.tooltipText = settings['tooltip_text'];
579 newSettings.enableInteractivity = (settings['enable_interactivity'] == 'off') ? false : true;
580 return newSettings;
581 }
582
583 ChartBuilderChartJs.prototype.applyPieDataGrouping = function (dataTypes, settings) {
584 var groupingLimit = parseFloat(settings.dataGroupingLimit);
585 var dataSet = dataTypes && dataTypes.dataSets && dataTypes.dataSets[0];
586
587 if (!(groupingLimit > 0) || !dataSet || !Array.isArray(dataSet.data)) {
588 return;
589 }
590
591 var total = dataSet.data.reduce(function (sum, value) {
592 return sum + (Number(value) || 0);
593 }, 0);
594 var groupedValue = 0;
595 var groupedSlices = 0;
596 var labels = [];
597 var values = [];
598
599 dataSet.data.forEach(function (value, index) {
600 var numericValue = Number(value) || 0;
601 if (total > 0 && numericValue / total < groupingLimit) {
602 groupedValue += numericValue;
603 groupedSlices++;
604 } else {
605 labels.push(dataTypes.labels[index]);
606 values.push(numericValue);
607 }
608 });
609
610 if (groupedSlices > 0) {
611 dataTypes.labels = labels.concat([settings.dataGroupingLabel]);
612 dataSet.data = values.concat([groupedValue]);
613 dataSet.groupedSliceIndex = values.length;
614 }
615 }
616
617 // Detect window resize moment to draw charts responsively
618 ChartBuilderChartJs.prototype.resizeChart = function(){
619 var _this = this;
620
621 //create trigger to resizeEnd event
622 $(window).resize(function() {
623 if(this.resizeTO) clearTimeout(this.resizeTO);
624 this.resizeTO = setTimeout(function() {
625 $(this).trigger('resizeEnd');
626 }, 100);
627 });
628
629 //redraw graph when window resize is completed
630 $(window).on('resizeEnd', function() {
631 _this.chartObject.resize();
632 });
633 }
634
635 // Load chart by pie chart
636 ChartBuilderChartJs.prototype.chartConvertData = function( data ){
637 var _this = this;
638 var dataTypes = [];
639
640 var dataTypes = Array.from({ length: data[0].length }, () => []);
641 for (var i = 0; i < data.length; i++) {
642 for (var j = 0; j < data[i].length; j++) {
643 if (i === 0) {
644 dataTypes[j].push(data[i][j]);
645 } else {
646 dataTypes[j].push(i === 0 || j === 0 ? data[i][j] : +data[i][j]);
647 }
648 }
649 }
650
651 var labels = dataTypes.shift();
652 labels.shift();
653 var dataSets = dataTypes.map(item => ({
654 label: item[0],
655 data: item.slice(1).map(Number),
656 }));
657
658 return {labels, dataSets};
659 }
660
661 ChartBuilderChartJs.prototype.getTooltipCallbacks = function(tooltipText, showColorCode) {
662 var _this = this;
663 if (showColorCode === true) {
664 return {
665 label: function(context) {
666 var label = context.label || '';
667 var value = context.parsed || 0;
668 var color = context.dataset.backgroundColor[context.dataIndex];
669 return ' ' + label + ': ' + value + ' (Color: ' + color + ')';
670 }
671 };
672 } else {
673 switch(tooltipText) {
674 case 'percentage':
675 return {
676 label: function(context) {
677 var label = context.label || '';
678 var value = context.parsed || 0;
679 var total = context.chart._metasets[context.datasetIndex].total;
680 var percentage = ((value / total) * 100).toFixed(1) + '%';
681 return ' ' + label + ': ' + percentage;
682 }
683 };
684 case 'both':
685 return {
686 label: function(context) {
687 var label = context.label || '';
688 var value = context.parsed || 0;
689 var total = context.chart._metasets[context.datasetIndex].total;
690 var percentage = ((value / total) * 100).toFixed(1) + '%';
691 return ' ' + label + ': ' + value + ' (' + percentage + ')';
692 }
693 };
694 case 'value':
695 default:
696 return {
697 label: function(context) {
698 var label = context.label || '';
699 var value = context.parsed || 0;
700 return ' ' + label + ': ' + value;
701 }
702 };
703 }
704 }
705 }
706
707 // Update chart data and display immediately
708 ChartBuilderChartJs.prototype.updateChartData = function( newData ){
709 var _this = this;
710 var newData = _this.chartConvertData( _this.chartData );
711
712 _this.chartObject.data = {
713 ..._this.chartObject.data,
714 labels: newData?.labels,
715 datasets: newData?.dataSets,
716 },
717 _this.chartObject.update();
718 }
719
720 ChartBuilderChartJs.prototype.htmlDecode = function (input) {
721 var e = document.createElement('div');
722 e.innerHTML = input;
723 return e.childNodes[0].nodeValue;
724 }
725
726 $.fn.ChartBuilderChartJsMain = function(options) {
727 return this.each(function() {
728 if (!$.data(this, 'ChartBuilderChartJsMain')) {
729 $.data(this, 'ChartBuilderChartJsMain', new ChartBuilderChartJs(this, options));
730 } else {
731 try {
732 $(this).data('ChartBuilderChartJsMain').init();
733 } catch (err) {
734 console.error('ChartBuilderChartJsMain has not initiated properly');
735 }
736 }
737 });
738 };
739
740 })(jQuery);
741