chartkick 3.4.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,15 @@
1
- /*
1
+ /*!
2
2
  * Chartkick.js
3
3
  * Create beautiful charts with one line of JavaScript
4
4
  * https://github.com/ankane/chartkick.js
5
- * v3.2.1
5
+ * v4.0.0
6
6
  * MIT License
7
7
  */
8
8
 
9
9
  (function (global, factory) {
10
10
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
11
11
  typeof define === 'function' && define.amd ? define(factory) :
12
- (global = global || self, global.Chartkick = factory());
12
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Chartkick = factory());
13
13
  }(this, (function () { 'use strict';
14
14
 
15
15
  function isArray(variable) {
@@ -55,42 +55,6 @@
55
55
 
56
56
  var DATE_PATTERN = /^(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)$/i;
57
57
 
58
- // https://github.com/Do/iso8601.js
59
- var ISO8601_PATTERN = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)?(:)?(\d\d)?([.,]\d+)?($|Z|([+-])(\d\d)(:)?(\d\d)?)/i;
60
- var DECIMAL_SEPARATOR = String(1.5).charAt(1);
61
-
62
- function parseISO8601(input) {
63
- var day, hour, matches, milliseconds, minutes, month, offset, result, seconds, type, year;
64
- type = Object.prototype.toString.call(input);
65
- if (type === "[object Date]") {
66
- return input;
67
- }
68
- if (type !== "[object String]") {
69
- return;
70
- }
71
- matches = input.match(ISO8601_PATTERN);
72
- if (matches) {
73
- year = parseInt(matches[1], 10);
74
- month = parseInt(matches[3], 10) - 1;
75
- day = parseInt(matches[5], 10);
76
- hour = parseInt(matches[7], 10);
77
- minutes = matches[9] ? parseInt(matches[9], 10) : 0;
78
- seconds = matches[11] ? parseInt(matches[11], 10) : 0;
79
- milliseconds = matches[12] ? parseFloat(DECIMAL_SEPARATOR + matches[12].slice(1)) * 1000 : 0;
80
- result = Date.UTC(year, month, day, hour, minutes, seconds, milliseconds);
81
- if (matches[13] && matches[14]) {
82
- offset = matches[15] * 60;
83
- if (matches[17]) {
84
- offset += parseInt(matches[17], 10);
85
- }
86
- offset *= matches[14] === "-" ? -1 : 1;
87
- result -= offset * 60 * 1000;
88
- }
89
- return new Date(result);
90
- }
91
- }
92
- // end iso8601.js
93
-
94
58
  function negativeValues(series) {
95
59
  var i, j, data;
96
60
  for (i = 0; i < series.length; i++) {
@@ -120,15 +84,15 @@
120
84
  } else {
121
85
  n = toStr(n);
122
86
  if ((matches = n.match(DATE_PATTERN))) {
123
- year = parseInt(matches[1], 10);
124
- month = parseInt(matches[3], 10) - 1;
125
- day = parseInt(matches[5], 10);
126
- return new Date(year, month, day);
127
- } else { // str
87
+ year = parseInt(matches[1], 10);
88
+ month = parseInt(matches[3], 10) - 1;
89
+ day = parseInt(matches[5], 10);
90
+ return new Date(year, month, day);
91
+ } else {
128
92
  // try our best to get the str into iso8601
129
93
  // TODO be smarter about this
130
94
  var str = n.replace(/ /, "T").replace(" ", "").replace("UTC", "Z");
131
- n = parseISO8601(str) || new Date(n);
95
+ n = new Date(str) || new Date(n);
132
96
  }
133
97
  }
134
98
  }
@@ -154,8 +118,8 @@
154
118
  var options = merge({}, defaultOptions);
155
119
  options = merge(options, chartOptions || {});
156
120
 
157
- if (chart.hideLegend || "legend" in opts) {
158
- hideLegend(options, opts.legend, chart.hideLegend);
121
+ if (chart.singleSeriesFormat || "legend" in opts) {
122
+ hideLegend(options, opts.legend, chart.singleSeriesFormat);
159
123
  }
160
124
 
161
125
  if (opts.title) {
@@ -361,42 +325,49 @@
361
325
  var baseOptions = {
362
326
  maintainAspectRatio: false,
363
327
  animation: false,
364
- tooltips: {
365
- displayColors: false,
366
- callbacks: {}
328
+ plugins: {
329
+ legend: {},
330
+ tooltip: {
331
+ displayColors: false,
332
+ callbacks: {}
333
+ },
334
+ title: {
335
+ font: {
336
+ size: 20
337
+ },
338
+ color: "#333"
339
+ }
367
340
  },
368
- legend: {},
369
- title: {fontSize: 20, fontColor: "#333"}
341
+ interaction: {}
370
342
  };
371
343
 
372
- var defaultOptions = {
344
+ var defaultOptions$2 = {
373
345
  scales: {
374
- yAxes: [
375
- {
376
- ticks: {
377
- maxTicksLimit: 4
378
- },
379
- scaleLabel: {
380
- fontSize: 16,
381
- // fontStyle: "bold",
382
- fontColor: "#333"
383
- }
384
- }
385
- ],
386
- xAxes: [
387
- {
388
- gridLines: {
389
- drawOnChartArea: false
346
+ y: {
347
+ ticks: {
348
+ maxTicksLimit: 4
349
+ },
350
+ title: {
351
+ font: {
352
+ size: 16
390
353
  },
391
- scaleLabel: {
392
- fontSize: 16,
393
- // fontStyle: "bold",
394
- fontColor: "#333"
354
+ color: "#333"
355
+ },
356
+ grid: {}
357
+ },
358
+ x: {
359
+ grid: {
360
+ drawOnChartArea: false
361
+ },
362
+ title: {
363
+ font: {
364
+ size: 16
395
365
  },
396
- time: {},
397
- ticks: {}
398
- }
399
- ]
366
+ color: "#333"
367
+ },
368
+ time: {},
369
+ ticks: {}
370
+ }
400
371
  }
401
372
  };
402
373
 
@@ -407,66 +378,66 @@
407
378
  "#6633CC", "#E67300", "#8B0707", "#329262", "#5574A6", "#651067"
408
379
  ];
409
380
 
410
- var hideLegend = function (options, legend, hideLegend) {
381
+ var hideLegend$2 = function (options, legend, hideLegend) {
411
382
  if (legend !== undefined) {
412
- options.legend.display = !!legend;
383
+ options.plugins.legend.display = !!legend;
413
384
  if (legend && legend !== true) {
414
- options.legend.position = legend;
385
+ options.plugins.legend.position = legend;
415
386
  }
416
387
  } else if (hideLegend) {
417
- options.legend.display = false;
388
+ options.plugins.legend.display = false;
418
389
  }
419
390
  };
420
391
 
421
- var setTitle = function (options, title) {
422
- options.title.display = true;
423
- options.title.text = title;
392
+ var setTitle$2 = function (options, title) {
393
+ options.plugins.title.display = true;
394
+ options.plugins.title.text = title;
424
395
  };
425
396
 
426
- var setMin = function (options, min) {
397
+ var setMin$2 = function (options, min) {
427
398
  if (min !== null) {
428
- options.scales.yAxes[0].ticks.min = toFloat(min);
399
+ options.scales.y.min = toFloat(min);
429
400
  }
430
401
  };
431
402
 
432
- var setMax = function (options, max) {
433
- options.scales.yAxes[0].ticks.max = toFloat(max);
403
+ var setMax$2 = function (options, max) {
404
+ options.scales.y.max = toFloat(max);
434
405
  };
435
406
 
436
- var setBarMin = function (options, min) {
407
+ var setBarMin$1 = function (options, min) {
437
408
  if (min !== null) {
438
- options.scales.xAxes[0].ticks.min = toFloat(min);
409
+ options.scales.x.min = toFloat(min);
439
410
  }
440
411
  };
441
412
 
442
- var setBarMax = function (options, max) {
443
- options.scales.xAxes[0].ticks.max = toFloat(max);
413
+ var setBarMax$1 = function (options, max) {
414
+ options.scales.x.max = toFloat(max);
444
415
  };
445
416
 
446
- var setStacked = function (options, stacked) {
447
- options.scales.xAxes[0].stacked = !!stacked;
448
- options.scales.yAxes[0].stacked = !!stacked;
417
+ var setStacked$2 = function (options, stacked) {
418
+ options.scales.x.stacked = !!stacked;
419
+ options.scales.y.stacked = !!stacked;
449
420
  };
450
421
 
451
- var setXtitle = function (options, title) {
452
- options.scales.xAxes[0].scaleLabel.display = true;
453
- options.scales.xAxes[0].scaleLabel.labelString = title;
422
+ var setXtitle$2 = function (options, title) {
423
+ options.scales.x.title.display = true;
424
+ options.scales.x.title.text = title;
454
425
  };
455
426
 
456
- var setYtitle = function (options, title) {
457
- options.scales.yAxes[0].scaleLabel.display = true;
458
- options.scales.yAxes[0].scaleLabel.labelString = title;
427
+ var setYtitle$2 = function (options, title) {
428
+ options.scales.y.title.display = true;
429
+ options.scales.y.title.text = title;
459
430
  };
460
431
 
461
432
  // https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
462
- var addOpacity = function(hex, opacity) {
433
+ var addOpacity = function (hex, opacity) {
463
434
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
464
435
  return result ? "rgba(" + parseInt(result[1], 16) + ", " + parseInt(result[2], 16) + ", " + parseInt(result[3], 16) + ", " + opacity + ")" : hex;
465
436
  };
466
437
 
467
438
  // check if not null or undefined
468
439
  // https://stackoverflow.com/a/27757708/1177228
469
- var notnull = function(x) {
440
+ var notnull = function (x) {
470
441
  return x != null;
471
442
  };
472
443
 
@@ -477,9 +448,9 @@
477
448
  } else if (maxLabelSize < 10) {
478
449
  maxLabelSize = 10;
479
450
  }
480
- if (!options.scales.xAxes[0].ticks.callback) {
481
- options.scales.xAxes[0].ticks.callback = function (value) {
482
- value = toStr(value);
451
+ if (!options.scales.x.ticks.callback) {
452
+ options.scales.x.ticks.callback = function (value) {
453
+ value = toStr(this.getLabelForValue(value));
483
454
  if (value.length > maxLabelSize) {
484
455
  return value.substring(0, maxLabelSize - 2) + "...";
485
456
  } else {
@@ -489,7 +460,7 @@
489
460
  }
490
461
  };
491
462
 
492
- var setFormatOptions = function(chart, options, chartType) {
463
+ var setFormatOptions$1 = function (chart, options, chartType) {
493
464
  var formatOptions = {
494
465
  prefix: chart.options.prefix,
495
466
  suffix: chart.options.suffix,
@@ -529,49 +500,49 @@
529
500
  }
530
501
 
531
502
  if (chartType !== "pie") {
532
- var myAxes = options.scales.yAxes;
503
+ var axis = options.scales.y;
533
504
  if (chartType === "bar") {
534
- myAxes = options.scales.xAxes;
505
+ axis = options.scales.x;
535
506
  }
536
507
 
537
508
  if (formatOptions.byteScale) {
538
- if (!myAxes[0].ticks.stepSize) {
539
- myAxes[0].ticks.stepSize = formatOptions.byteScale / 2;
509
+ if (!axis.ticks.stepSize) {
510
+ axis.ticks.stepSize = formatOptions.byteScale / 2;
540
511
  }
541
- if (!myAxes[0].ticks.maxTicksLimit) {
542
- myAxes[0].ticks.maxTicksLimit = 4;
512
+ if (!axis.ticks.maxTicksLimit) {
513
+ axis.ticks.maxTicksLimit = 4;
543
514
  }
544
515
  }
545
516
 
546
- if (!myAxes[0].ticks.callback) {
547
- myAxes[0].ticks.callback = function (value) {
517
+ if (!axis.ticks.callback) {
518
+ axis.ticks.callback = function (value) {
548
519
  return formatValue("", value, formatOptions, true);
549
520
  };
550
521
  }
551
522
  }
552
523
 
553
- if (!options.tooltips.callbacks.label) {
524
+ if (!options.plugins.tooltip.callbacks.label) {
554
525
  if (chartType === "scatter") {
555
- options.tooltips.callbacks.label = function (item, data) {
556
- var label = data.datasets[item.datasetIndex].label || '';
526
+ options.plugins.tooltip.callbacks.label = function (context) {
527
+ var label = context.dataset.label || '';
557
528
  if (label) {
558
529
  label += ': ';
559
530
  }
560
- return label + '(' + item.xLabel + ', ' + item.yLabel + ')';
531
+ return label + '(' + context.label + ', ' + context.formattedValue + ')';
561
532
  };
562
533
  } else if (chartType === "bubble") {
563
- options.tooltips.callbacks.label = function (item, data) {
564
- var label = data.datasets[item.datasetIndex].label || '';
534
+ options.plugins.tooltip.callbacks.label = function (context) {
535
+ var label = context.dataset.label || '';
565
536
  if (label) {
566
537
  label += ': ';
567
538
  }
568
- var dataPoint = data.datasets[item.datasetIndex].data[item.index];
569
- return label + '(' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.v + ')';
539
+ var dataPoint = context.raw;
540
+ return label + '(' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.v + ')';
570
541
  };
571
542
  } else if (chartType === "pie") {
572
543
  // need to use separate label for pie charts
573
- options.tooltips.callbacks.label = function (tooltipItem, data) {
574
- var dataLabel = data.labels[tooltipItem.index];
544
+ options.plugins.tooltip.callbacks.label = function (context) {
545
+ var dataLabel = context.label;
575
546
  var value = ': ';
576
547
 
577
548
  if (isArray(dataLabel)) {
@@ -583,24 +554,24 @@
583
554
  dataLabel += value;
584
555
  }
585
556
 
586
- return formatValue(dataLabel, data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index], formatOptions);
557
+ return formatValue(dataLabel, context.parsed, formatOptions);
587
558
  };
588
559
  } else {
589
- var valueLabel = chartType === "bar" ? "xLabel" : "yLabel";
590
- options.tooltips.callbacks.label = function (tooltipItem, data) {
591
- var label = data.datasets[tooltipItem.datasetIndex].label || '';
560
+ var valueLabel = chartType === "bar" ? "x" : "y";
561
+ options.plugins.tooltip.callbacks.label = function (context) {
562
+ var label = context.dataset.label || '';
592
563
  if (label) {
593
564
  label += ': ';
594
565
  }
595
- return formatValue(label, tooltipItem[valueLabel], formatOptions);
566
+ return formatValue(label, context.parsed[valueLabel], formatOptions);
596
567
  };
597
568
  }
598
569
  }
599
570
  };
600
571
 
601
- var jsOptions = jsOptionsFunc(merge(baseOptions, defaultOptions), hideLegend, setTitle, setMin, setMax, setStacked, setXtitle, setYtitle);
572
+ var jsOptions$2 = jsOptionsFunc(merge(baseOptions, defaultOptions$2), hideLegend$2, setTitle$2, setMin$2, setMax$2, setStacked$2, setXtitle$2, setYtitle$2);
602
573
 
603
- var createDataTable = function (chart, options, chartType, library) {
574
+ var createDataTable = function (chart, options, chartType) {
604
575
  var datasets = [];
605
576
  var labels = [];
606
577
 
@@ -702,11 +673,23 @@
702
673
  }
703
674
  }
704
675
 
676
+ var color;
677
+ var backgroundColor;
678
+
705
679
  for (i = 0; i < series.length; i++) {
706
680
  s = series[i];
707
681
 
708
- var color = s.color || colors[i];
709
- var backgroundColor = chartType !== "line" ? addOpacity(color, 0.5) : color;
682
+ // use colors for each bar for single series format
683
+ if (chart.options.colors && chart.singleSeriesFormat && (chartType === "bar" || chartType === "column") && !s.color) {
684
+ color = colors;
685
+ backgroundColor = [];
686
+ for (var j$3 = 0; j$3 < colors.length; j$3++) {
687
+ backgroundColor[j$3] = addOpacity(color[j$3], 0.5);
688
+ }
689
+ } else {
690
+ color = s.color || colors[i];
691
+ backgroundColor = chartType !== "line" ? addOpacity(color, 0.5) : color;
692
+ }
710
693
 
711
694
  var dataset = {
712
695
  label: s.name || "",
@@ -714,24 +697,37 @@
714
697
  fill: chartType === "area",
715
698
  borderColor: color,
716
699
  backgroundColor: backgroundColor,
717
- pointBackgroundColor: color,
718
- borderWidth: 2,
719
- pointHoverBackgroundColor: color
700
+ borderWidth: 2
720
701
  };
721
702
 
703
+ var pointChart = chartType === "line" || chartType === "area" || chartType === "scatter" || chartType === "bubble";
704
+ if (pointChart) {
705
+ dataset.pointBackgroundColor = color;
706
+ dataset.pointHoverBackgroundColor = color;
707
+ dataset.pointHitRadius = 50;
708
+ }
709
+
710
+ if (chartType === "bubble") {
711
+ dataset.pointBackgroundColor = backgroundColor;
712
+ dataset.pointHoverBackgroundColor = backgroundColor;
713
+ dataset.pointHoverBorderWidth = 2;
714
+ }
715
+
722
716
  if (s.stack) {
723
717
  dataset.stack = s.stack;
724
718
  }
725
719
 
726
720
  var curve = seriesOption(chart, s, "curve");
727
721
  if (curve === false) {
728
- dataset.lineTension = 0;
722
+ dataset.tension = 0;
723
+ } else if (pointChart) {
724
+ dataset.tension = 0.4;
729
725
  }
730
726
 
731
727
  var points = seriesOption(chart, s, "points");
732
728
  if (points === false) {
733
729
  dataset.pointRadius = 0;
734
- dataset.pointHitRadius = 5;
730
+ dataset.pointHoverRadius = 0;
735
731
  }
736
732
 
737
733
  dataset = merge(dataset, chart.options.dataset || {});
@@ -745,22 +741,18 @@
745
741
  var xmax = chart.options.xmax;
746
742
 
747
743
  if (chart.xtype === "datetime") {
748
- // hacky check for Chart.js >= 2.9.0
749
- // https://github.com/chartjs/Chart.js/compare/v2.8.0...v2.9.0
750
- var gte29 = "math" in library.helpers;
751
- var ticksKey = gte29 ? "ticks" : "time";
752
744
  if (notnull(xmin)) {
753
- options.scales.xAxes[0][ticksKey].min = toDate(xmin).getTime();
745
+ options.scales.x.ticks.min = toDate(xmin).getTime();
754
746
  }
755
747
  if (notnull(xmax)) {
756
- options.scales.xAxes[0][ticksKey].max = toDate(xmax).getTime();
748
+ options.scales.x.ticks.max = toDate(xmax).getTime();
757
749
  }
758
750
  } else if (chart.xtype === "number") {
759
751
  if (notnull(xmin)) {
760
- options.scales.xAxes[0].ticks.min = xmin;
752
+ options.scales.x.ticks.min = xmin;
761
753
  }
762
754
  if (notnull(xmax)) {
763
- options.scales.xAxes[0].ticks.max = xmax;
755
+ options.scales.x.ticks.max = xmax;
764
756
  }
765
757
  }
766
758
 
@@ -796,24 +788,24 @@
796
788
 
797
789
  var timeDiff = (maxTime - minTime) / (86400 * 1000.0);
798
790
 
799
- if (!options.scales.xAxes[0].time.unit) {
791
+ if (!options.scales.x.time.unit) {
800
792
  var step;
801
793
  if (year || timeDiff > 365 * 10) {
802
- options.scales.xAxes[0].time.unit = "year";
794
+ options.scales.x.time.unit = "year";
803
795
  step = 365;
804
796
  } else if (month || timeDiff > 30 * 10) {
805
- options.scales.xAxes[0].time.unit = "month";
797
+ options.scales.x.time.unit = "month";
806
798
  step = 30;
807
799
  } else if (day || timeDiff > 10) {
808
- options.scales.xAxes[0].time.unit = "day";
800
+ options.scales.x.time.unit = "day";
809
801
  step = 1;
810
802
  } else if (hour || timeDiff > 0.5) {
811
- options.scales.xAxes[0].time.displayFormats = {hour: "MMM D, h a"};
812
- options.scales.xAxes[0].time.unit = "hour";
803
+ options.scales.x.time.displayFormats = {hour: "MMM d, h a"};
804
+ options.scales.x.time.unit = "hour";
813
805
  step = 1 / 24.0;
814
806
  } else if (minute) {
815
- options.scales.xAxes[0].time.displayFormats = {minute: "h:mm a"};
816
- options.scales.xAxes[0].time.unit = "minute";
807
+ options.scales.x.time.displayFormats = {minute: "h:mm a"};
808
+ options.scales.x.time.unit = "minute";
817
809
  step = 1 / 24.0 / 60.0;
818
810
  }
819
811
 
@@ -822,17 +814,17 @@
822
814
  if (week && step === 1) {
823
815
  unitStepSize = Math.ceil(unitStepSize / 7.0) * 7;
824
816
  }
825
- options.scales.xAxes[0].time.unitStepSize = unitStepSize;
817
+ options.scales.x.time.stepSize = unitStepSize;
826
818
  }
827
819
  }
828
820
 
829
- if (!options.scales.xAxes[0].time.tooltipFormat) {
821
+ if (!options.scales.x.time.tooltipFormat) {
830
822
  if (day) {
831
- options.scales.xAxes[0].time.tooltipFormat = "ll";
823
+ options.scales.x.time.tooltipFormat = "PP";
832
824
  } else if (hour) {
833
- options.scales.xAxes[0].time.tooltipFormat = "MMM D, h a";
825
+ options.scales.x.time.tooltipFormat = "MMM d, h a";
834
826
  } else if (minute) {
835
- options.scales.xAxes[0].time.tooltipFormat = "h:mm a";
827
+ options.scales.x.time.tooltipFormat = "h:mm a";
836
828
  }
837
829
  }
838
830
  }
@@ -845,49 +837,49 @@
845
837
  return data;
846
838
  };
847
839
 
848
- var defaultExport = function defaultExport(library) {
840
+ var defaultExport$2 = function defaultExport(library) {
849
841
  this.name = "chartjs";
850
842
  this.library = library;
851
843
  };
852
844
 
853
- defaultExport.prototype.renderLineChart = function renderLineChart (chart, chartType) {
845
+ defaultExport$2.prototype.renderLineChart = function renderLineChart (chart, chartType) {
854
846
  var chartOptions = {};
855
847
  // fix for https://github.com/chartjs/Chart.js/issues/2441
856
848
  if (!chart.options.max && allZeros(chart.data)) {
857
849
  chartOptions.max = 1;
858
850
  }
859
851
 
860
- var options = jsOptions(chart, merge(chartOptions, chart.options));
861
- setFormatOptions(chart, options, chartType);
852
+ var options = jsOptions$2(chart, merge(chartOptions, chart.options));
853
+ setFormatOptions$1(chart, options, chartType);
862
854
 
863
- var data = createDataTable(chart, options, chartType || "line", this.library);
855
+ var data = createDataTable(chart, options, chartType || "line");
864
856
 
865
857
  if (chart.xtype === "number") {
866
- options.scales.xAxes[0].type = "linear";
867
- options.scales.xAxes[0].position = "bottom";
858
+ options.scales.x.type = "linear";
859
+ options.scales.x.position = "bottom";
868
860
  } else {
869
- options.scales.xAxes[0].type = chart.xtype === "string" ? "category" : "time";
861
+ options.scales.x.type = chart.xtype === "string" ? "category" : "time";
870
862
  }
871
863
 
872
864
  this.drawChart(chart, "line", data, options);
873
865
  };
874
866
 
875
- defaultExport.prototype.renderPieChart = function renderPieChart (chart) {
867
+ defaultExport$2.prototype.renderPieChart = function renderPieChart (chart) {
876
868
  var options = merge({}, baseOptions);
877
869
  if (chart.options.donut) {
878
- options.cutoutPercentage = 50;
870
+ options.cutout = "50%";
879
871
  }
880
872
 
881
873
  if ("legend" in chart.options) {
882
- hideLegend(options, chart.options.legend);
874
+ hideLegend$2(options, chart.options.legend);
883
875
  }
884
876
 
885
877
  if (chart.options.title) {
886
- setTitle(options, chart.options.title);
878
+ setTitle$2(options, chart.options.title);
887
879
  }
888
880
 
889
881
  options = merge(options, chart.options.library || {});
890
- setFormatOptions(chart, options, "pie");
882
+ setFormatOptions$1(chart, options, "pie");
891
883
 
892
884
  var labels = [];
893
885
  var values = [];
@@ -911,61 +903,73 @@
911
903
  this.drawChart(chart, "pie", data, options);
912
904
  };
913
905
 
914
- defaultExport.prototype.renderColumnChart = function renderColumnChart (chart, chartType) {
906
+ defaultExport$2.prototype.renderColumnChart = function renderColumnChart (chart, chartType) {
915
907
  var options;
916
908
  if (chartType === "bar") {
917
- var barOptions = merge(baseOptions, defaultOptions);
918
- delete barOptions.scales.yAxes[0].ticks.maxTicksLimit;
919
- options = jsOptionsFunc(barOptions, hideLegend, setTitle, setBarMin, setBarMax, setStacked, setXtitle, setYtitle)(chart, chart.options);
909
+ var barOptions = merge(baseOptions, defaultOptions$2);
910
+ barOptions.indexAxis = "y";
911
+
912
+ // ensure gridlines have proper orientation
913
+ barOptions.scales.x.grid.drawOnChartArea = true;
914
+ barOptions.scales.y.grid.drawOnChartArea = false;
915
+ delete barOptions.scales.y.ticks.maxTicksLimit;
916
+
917
+ options = jsOptionsFunc(barOptions, hideLegend$2, setTitle$2, setBarMin$1, setBarMax$1, setStacked$2, setXtitle$2, setYtitle$2)(chart, chart.options);
920
918
  } else {
921
- options = jsOptions(chart, chart.options);
919
+ options = jsOptions$2(chart, chart.options);
922
920
  }
923
- setFormatOptions(chart, options, chartType);
924
- var data = createDataTable(chart, options, "column", this.library);
921
+ setFormatOptions$1(chart, options, chartType);
922
+ var data = createDataTable(chart, options, "column");
925
923
  if (chartType !== "bar") {
926
924
  setLabelSize(chart, data, options);
927
925
  }
928
- this.drawChart(chart, (chartType === "bar" ? "horizontalBar" : "bar"), data, options);
926
+ this.drawChart(chart, "bar", data, options);
929
927
  };
930
928
 
931
- defaultExport.prototype.renderAreaChart = function renderAreaChart (chart) {
929
+ defaultExport$2.prototype.renderAreaChart = function renderAreaChart (chart) {
932
930
  this.renderLineChart(chart, "area");
933
931
  };
934
932
 
935
- defaultExport.prototype.renderBarChart = function renderBarChart (chart) {
933
+ defaultExport$2.prototype.renderBarChart = function renderBarChart (chart) {
936
934
  this.renderColumnChart(chart, "bar");
937
935
  };
938
936
 
939
- defaultExport.prototype.renderScatterChart = function renderScatterChart (chart, chartType) {
937
+ defaultExport$2.prototype.renderScatterChart = function renderScatterChart (chart, chartType) {
940
938
  chartType = chartType || "scatter";
941
939
 
942
- var options = jsOptions(chart, chart.options);
943
- setFormatOptions(chart, options, chartType);
940
+ var options = jsOptions$2(chart, chart.options);
941
+ setFormatOptions$1(chart, options, chartType);
944
942
 
945
- if (!("showLines" in options)) {
946
- options.showLines = false;
943
+ if (!("showLine" in options)) {
944
+ options.showLine = false;
947
945
  }
948
946
 
949
- var data = createDataTable(chart, options, chartType, this.library);
947
+ var data = createDataTable(chart, options, chartType);
948
+
949
+ options.scales.x.type = "linear";
950
+ options.scales.x.position = "bottom";
950
951
 
951
- options.scales.xAxes[0].type = "linear";
952
- options.scales.xAxes[0].position = "bottom";
952
+ // prevent grouping hover and tooltips
953
+ if (!("mode" in options.interaction)) {
954
+ options.interaction.mode = "nearest";
955
+ }
953
956
 
954
957
  this.drawChart(chart, chartType, data, options);
955
958
  };
956
959
 
957
- defaultExport.prototype.renderBubbleChart = function renderBubbleChart (chart) {
960
+ defaultExport$2.prototype.renderBubbleChart = function renderBubbleChart (chart) {
958
961
  this.renderScatterChart(chart, "bubble");
959
962
  };
960
963
 
961
- defaultExport.prototype.destroy = function destroy (chart) {
964
+ defaultExport$2.prototype.destroy = function destroy (chart) {
962
965
  if (chart.chart) {
963
966
  chart.chart.destroy();
964
967
  }
965
968
  };
966
969
 
967
- defaultExport.prototype.drawChart = function drawChart (chart, type, data, options) {
970
+ defaultExport$2.prototype.drawChart = function drawChart (chart, type, data, options) {
968
971
  this.destroy(chart);
972
+ if (chart.destroyed) { return; }
969
973
 
970
974
  var chartOptions = {
971
975
  type: type,
@@ -1024,6 +1028,9 @@
1024
1028
  series: {
1025
1029
  marker: {}
1026
1030
  }
1031
+ },
1032
+ time: {
1033
+ useUTC: false
1027
1034
  }
1028
1035
  };
1029
1036
 
@@ -1073,7 +1080,7 @@
1073
1080
 
1074
1081
  var jsOptions$1 = jsOptionsFunc(defaultOptions$1, hideLegend$1, setTitle$1, setMin$1, setMax$1, setStacked$1, setXtitle$1, setYtitle$1);
1075
1082
 
1076
- var setFormatOptions$1 = function(chart, options, chartType) {
1083
+ var setFormatOptions = function(chart, options, chartType) {
1077
1084
  var formatOptions = {
1078
1085
  prefix: chart.options.prefix,
1079
1086
  suffix: chart.options.suffix,
@@ -1136,7 +1143,7 @@
1136
1143
  if (!options.chart.type) {
1137
1144
  options.chart.type = chartType;
1138
1145
  }
1139
- setFormatOptions$1(chart, options, chartType);
1146
+ setFormatOptions(chart, options, chartType);
1140
1147
 
1141
1148
  var series = chart.data;
1142
1149
  for (i = 0; i < series.length; i++) {
@@ -1181,7 +1188,7 @@
1181
1188
  }
1182
1189
 
1183
1190
  var options = merge(chartOptions, chart.options.library || {});
1184
- setFormatOptions$1(chart, options, "pie");
1191
+ setFormatOptions(chart, options, "pie");
1185
1192
  var series = [{
1186
1193
  type: "pie",
1187
1194
  name: chart.options.label || "Value",
@@ -1196,7 +1203,7 @@
1196
1203
  var series = chart.data;
1197
1204
  var options = jsOptions$1(chart, chart.options), i, j, s, d, rows = [], categories = [];
1198
1205
  options.chart.type = chartType;
1199
- setFormatOptions$1(chart, options, chartType);
1206
+ setFormatOptions(chart, options, chartType);
1200
1207
 
1201
1208
  for (i = 0; i < series.length; i++) {
1202
1209
  s = series[i];
@@ -1254,6 +1261,7 @@
1254
1261
 
1255
1262
  defaultExport$1.prototype.drawChart = function drawChart (chart, data, options) {
1256
1263
  this.destroy(chart);
1264
+ if (chart.destroyed) { return; }
1257
1265
 
1258
1266
  options.chart.renderTo = chart.element.id;
1259
1267
  options.series = data;
@@ -1269,7 +1277,7 @@
1269
1277
  var callbacks = [];
1270
1278
 
1271
1279
  // Set chart options
1272
- var defaultOptions$2 = {
1280
+ var defaultOptions = {
1273
1281
  chartArea: {},
1274
1282
  fontName: "'Lucida Grande', 'Lucida Sans Unicode', Verdana, Arial, Helvetica, sans-serif",
1275
1283
  pointSize: 6,
@@ -1311,7 +1319,7 @@
1311
1319
  }
1312
1320
  };
1313
1321
 
1314
- var hideLegend$2 = function (options, legend, hideLegend) {
1322
+ var hideLegend = function (options, legend, hideLegend) {
1315
1323
  if (legend !== undefined) {
1316
1324
  var position;
1317
1325
  if (!legend) {
@@ -1327,42 +1335,42 @@
1327
1335
  }
1328
1336
  };
1329
1337
 
1330
- var setTitle$2 = function (options, title) {
1338
+ var setTitle = function (options, title) {
1331
1339
  options.title = title;
1332
1340
  options.titleTextStyle = {color: "#333", fontSize: "20px"};
1333
1341
  };
1334
1342
 
1335
- var setMin$2 = function (options, min) {
1343
+ var setMin = function (options, min) {
1336
1344
  options.vAxis.viewWindow.min = min;
1337
1345
  };
1338
1346
 
1339
- var setMax$2 = function (options, max) {
1347
+ var setMax = function (options, max) {
1340
1348
  options.vAxis.viewWindow.max = max;
1341
1349
  };
1342
1350
 
1343
- var setBarMin$1 = function (options, min) {
1351
+ var setBarMin = function (options, min) {
1344
1352
  options.hAxis.viewWindow.min = min;
1345
1353
  };
1346
1354
 
1347
- var setBarMax$1 = function (options, max) {
1355
+ var setBarMax = function (options, max) {
1348
1356
  options.hAxis.viewWindow.max = max;
1349
1357
  };
1350
1358
 
1351
- var setStacked$2 = function (options, stacked) {
1359
+ var setStacked = function (options, stacked) {
1352
1360
  options.isStacked = stacked ? stacked : false;
1353
1361
  };
1354
1362
 
1355
- var setXtitle$2 = function (options, title) {
1363
+ var setXtitle = function (options, title) {
1356
1364
  options.hAxis.title = title;
1357
1365
  options.hAxis.titleTextStyle.italic = false;
1358
1366
  };
1359
1367
 
1360
- var setYtitle$2 = function (options, title) {
1368
+ var setYtitle = function (options, title) {
1361
1369
  options.vAxis.title = title;
1362
1370
  options.vAxis.titleTextStyle.italic = false;
1363
1371
  };
1364
1372
 
1365
- var jsOptions$2 = jsOptionsFunc(defaultOptions$2, hideLegend$2, setTitle$2, setMin$2, setMax$2, setStacked$2, setXtitle$2, setYtitle$2);
1373
+ var jsOptions = jsOptionsFunc(defaultOptions, hideLegend, setTitle, setMin, setMax, setStacked, setXtitle, setYtitle);
1366
1374
 
1367
1375
  var resize = function (callback) {
1368
1376
  if (window.attachEvent) {
@@ -1373,12 +1381,12 @@
1373
1381
  callback();
1374
1382
  };
1375
1383
 
1376
- var defaultExport$2 = function defaultExport(library) {
1384
+ var defaultExport = function defaultExport(library) {
1377
1385
  this.name = "google";
1378
1386
  this.library = library;
1379
1387
  };
1380
1388
 
1381
- defaultExport$2.prototype.renderLineChart = function renderLineChart (chart) {
1389
+ defaultExport.prototype.renderLineChart = function renderLineChart (chart) {
1382
1390
  var this$1 = this;
1383
1391
 
1384
1392
  this.waitForLoaded(chart, function () {
@@ -1392,14 +1400,14 @@
1392
1400
  chartOptions.pointSize = 0;
1393
1401
  }
1394
1402
 
1395
- var options = jsOptions$2(chart, chart.options, chartOptions);
1403
+ var options = jsOptions(chart, chart.options, chartOptions);
1396
1404
  var data = this$1.createDataTable(chart.data, chart.xtype);
1397
1405
 
1398
1406
  this$1.drawChart(chart, "LineChart", data, options);
1399
1407
  });
1400
1408
  };
1401
1409
 
1402
- defaultExport$2.prototype.renderPieChart = function renderPieChart (chart) {
1410
+ defaultExport.prototype.renderPieChart = function renderPieChart (chart) {
1403
1411
  var this$1 = this;
1404
1412
 
1405
1413
  this.waitForLoaded(chart, function () {
@@ -1417,12 +1425,12 @@
1417
1425
  chartOptions.pieHole = 0.5;
1418
1426
  }
1419
1427
  if ("legend" in chart.options) {
1420
- hideLegend$2(chartOptions, chart.options.legend);
1428
+ hideLegend(chartOptions, chart.options.legend);
1421
1429
  }
1422
1430
  if (chart.options.title) {
1423
- setTitle$2(chartOptions, chart.options.title);
1431
+ setTitle(chartOptions, chart.options.title);
1424
1432
  }
1425
- var options = merge(merge(defaultOptions$2, chartOptions), chart.options.library || {});
1433
+ var options = merge(merge(defaultOptions, chartOptions), chart.options.library || {});
1426
1434
 
1427
1435
  var data = new this$1.library.visualization.DataTable();
1428
1436
  data.addColumn("string", "");
@@ -1433,18 +1441,18 @@
1433
1441
  });
1434
1442
  };
1435
1443
 
1436
- defaultExport$2.prototype.renderColumnChart = function renderColumnChart (chart) {
1444
+ defaultExport.prototype.renderColumnChart = function renderColumnChart (chart) {
1437
1445
  var this$1 = this;
1438
1446
 
1439
1447
  this.waitForLoaded(chart, function () {
1440
- var options = jsOptions$2(chart, chart.options);
1448
+ var options = jsOptions(chart, chart.options);
1441
1449
  var data = this$1.createDataTable(chart.data, chart.xtype);
1442
1450
 
1443
1451
  this$1.drawChart(chart, "ColumnChart", data, options);
1444
1452
  });
1445
1453
  };
1446
1454
 
1447
- defaultExport$2.prototype.renderBarChart = function renderBarChart (chart) {
1455
+ defaultExport.prototype.renderBarChart = function renderBarChart (chart) {
1448
1456
  var this$1 = this;
1449
1457
 
1450
1458
  this.waitForLoaded(chart, function () {
@@ -1455,14 +1463,14 @@
1455
1463
  }
1456
1464
  }
1457
1465
  };
1458
- var options = jsOptionsFunc(defaultOptions$2, hideLegend$2, setTitle$2, setBarMin$1, setBarMax$1, setStacked$2, setXtitle$2, setYtitle$2)(chart, chart.options, chartOptions);
1466
+ var options = jsOptionsFunc(defaultOptions, hideLegend, setTitle, setBarMin, setBarMax, setStacked, setXtitle, setYtitle)(chart, chart.options, chartOptions);
1459
1467
  var data = this$1.createDataTable(chart.data, chart.xtype);
1460
1468
 
1461
1469
  this$1.drawChart(chart, "BarChart", data, options);
1462
1470
  });
1463
1471
  };
1464
1472
 
1465
- defaultExport$2.prototype.renderAreaChart = function renderAreaChart (chart) {
1473
+ defaultExport.prototype.renderAreaChart = function renderAreaChart (chart) {
1466
1474
  var this$1 = this;
1467
1475
 
1468
1476
  this.waitForLoaded(chart, function () {
@@ -1472,14 +1480,14 @@
1472
1480
  areaOpacity: 0.5
1473
1481
  };
1474
1482
 
1475
- var options = jsOptions$2(chart, chart.options, chartOptions);
1483
+ var options = jsOptions(chart, chart.options, chartOptions);
1476
1484
  var data = this$1.createDataTable(chart.data, chart.xtype);
1477
1485
 
1478
1486
  this$1.drawChart(chart, "AreaChart", data, options);
1479
1487
  });
1480
1488
  };
1481
1489
 
1482
- defaultExport$2.prototype.renderGeoChart = function renderGeoChart (chart) {
1490
+ defaultExport.prototype.renderGeoChart = function renderGeoChart (chart) {
1483
1491
  var this$1 = this;
1484
1492
 
1485
1493
  this.waitForLoaded(chart, "geochart", function () {
@@ -1489,7 +1497,7 @@
1489
1497
  colors: chart.options.colors || ["#f6c7b6", "#ce502d"]
1490
1498
  }
1491
1499
  };
1492
- var options = merge(merge(defaultOptions$2, chartOptions), chart.options.library || {});
1500
+ var options = merge(merge(defaultOptions, chartOptions), chart.options.library || {});
1493
1501
 
1494
1502
  var data = new this$1.library.visualization.DataTable();
1495
1503
  data.addColumn("string", "");
@@ -1500,12 +1508,12 @@
1500
1508
  });
1501
1509
  };
1502
1510
 
1503
- defaultExport$2.prototype.renderScatterChart = function renderScatterChart (chart) {
1511
+ defaultExport.prototype.renderScatterChart = function renderScatterChart (chart) {
1504
1512
  var this$1 = this;
1505
1513
 
1506
1514
  this.waitForLoaded(chart, function () {
1507
1515
  var chartOptions = {};
1508
- var options = jsOptions$2(chart, chart.options, chartOptions);
1516
+ var options = jsOptions(chart, chart.options, chartOptions);
1509
1517
 
1510
1518
  var series = chart.data, rows2 = [], i, j, data, d;
1511
1519
  for (i = 0; i < series.length; i++) {
@@ -1530,7 +1538,7 @@
1530
1538
  });
1531
1539
  };
1532
1540
 
1533
- defaultExport$2.prototype.renderTimeline = function renderTimeline (chart) {
1541
+ defaultExport.prototype.renderTimeline = function renderTimeline (chart) {
1534
1542
  var this$1 = this;
1535
1543
 
1536
1544
  this.waitForLoaded(chart, "timeline", function () {
@@ -1541,7 +1549,7 @@
1541
1549
  if (chart.options.colors) {
1542
1550
  chartOptions.colors = chart.options.colors;
1543
1551
  }
1544
- var options = merge(merge(defaultOptions$2, chartOptions), chart.options.library || {});
1552
+ var options = merge(merge(defaultOptions, chartOptions), chart.options.library || {});
1545
1553
 
1546
1554
  var data = new this$1.library.visualization.DataTable();
1547
1555
  data.addColumn({type: "string", id: "Name"});
@@ -1555,14 +1563,16 @@
1555
1563
  });
1556
1564
  };
1557
1565
 
1558
- defaultExport$2.prototype.destroy = function destroy (chart) {
1566
+ // TODO remove resize events
1567
+ defaultExport.prototype.destroy = function destroy (chart) {
1559
1568
  if (chart.chart) {
1560
1569
  chart.chart.clearChart();
1561
1570
  }
1562
1571
  };
1563
1572
 
1564
- defaultExport$2.prototype.drawChart = function drawChart (chart, type, data, options) {
1573
+ defaultExport.prototype.drawChart = function drawChart (chart, type, data, options) {
1565
1574
  this.destroy(chart);
1575
+ if (chart.destroyed) { return; }
1566
1576
 
1567
1577
  if (chart.options.code) {
1568
1578
  window.console.log("var data = new google.visualization.DataTable(" + data.toJSON() + ");\nvar chart = new google.visualization." + type + "(element);\nchart.draw(data, " + JSON.stringify(options) + ");");
@@ -1574,7 +1584,7 @@
1574
1584
  });
1575
1585
  };
1576
1586
 
1577
- defaultExport$2.prototype.waitForLoaded = function waitForLoaded (chart, pack, callback) {
1587
+ defaultExport.prototype.waitForLoaded = function waitForLoaded (chart, pack, callback) {
1578
1588
  var this$1 = this;
1579
1589
 
1580
1590
  if (!callback) {
@@ -1606,7 +1616,7 @@
1606
1616
  }
1607
1617
  };
1608
1618
 
1609
- defaultExport$2.prototype.runCallbacks = function runCallbacks () {
1619
+ defaultExport.prototype.runCallbacks = function runCallbacks () {
1610
1620
  var cb, call;
1611
1621
  for (var i = 0; i < callbacks.length; i++) {
1612
1622
  cb = callbacks[i];
@@ -1620,7 +1630,7 @@
1620
1630
  };
1621
1631
 
1622
1632
  // cant use object as key
1623
- defaultExport$2.prototype.createDataTable = function createDataTable (series, columnType) {
1633
+ defaultExport.prototype.createDataTable = function createDataTable (series, columnType) {
1624
1634
  var i, j, s, d, key, rows = [], sortedLabels = [];
1625
1635
  for (i = 0; i < series.length; i++) {
1626
1636
  s = series[i];
@@ -1764,7 +1774,12 @@
1764
1774
  }
1765
1775
  }
1766
1776
 
1767
- function fetchDataSource(chart, dataSource) {
1777
+ function fetchDataSource(chart, dataSource, showLoading) {
1778
+ // only show loading message for urls and callbacks
1779
+ if (showLoading && chart.options.loading && (typeof dataSource === "string" || typeof dataSource === "function")) {
1780
+ setText(chart.element, chart.options.loading);
1781
+ }
1782
+
1768
1783
  if (typeof dataSource === "string") {
1769
1784
  pushRequest(dataSource, function (data) {
1770
1785
  chart.rawData = data;
@@ -1874,9 +1889,9 @@
1874
1889
  if (library.product === "Highcharts") {
1875
1890
  return defaultExport$1;
1876
1891
  } else if (library.charts) {
1877
- return defaultExport$2;
1878
- } else if (isFunction(library)) {
1879
1892
  return defaultExport;
1893
+ } else if (isFunction(library)) {
1894
+ return defaultExport$2;
1880
1895
  }
1881
1896
  }
1882
1897
  throw new Error("Unknown adapter");
@@ -1919,8 +1934,9 @@
1919
1934
  }
1920
1935
 
1921
1936
  function renderChart(chartType, chart) {
1922
- if (chart.options.messages && chart.options.messages.empty && dataEmpty(chart.data, chartType)) {
1923
- setText(chart.element, chart.options.messages.empty);
1937
+ if (dataEmpty(chart.data, chartType)) {
1938
+ var message = chart.options.empty || (chart.options.messages && chart.options.messages.empty) || "No data";
1939
+ setText(chart.element, message);
1924
1940
  } else {
1925
1941
  callAdapter(chartType, chart);
1926
1942
  if (chart.options.download && !chart.__downloadAttached && chart.adapter === "chartjs") {
@@ -2039,9 +2055,9 @@
2039
2055
  // see if one series or multiple
2040
2056
  if (!isArray(series) || typeof series[0] !== "object" || isArray(series[0])) {
2041
2057
  series = [{name: opts.label, data: series}];
2042
- chart.hideLegend = true;
2058
+ chart.singleSeriesFormat = true;
2043
2059
  } else {
2044
- chart.hideLegend = false;
2060
+ chart.singleSeriesFormat = false;
2045
2061
  }
2046
2062
 
2047
2063
  // convert to array
@@ -2086,7 +2102,7 @@
2086
2102
 
2087
2103
  Chartkick.charts[element.id] = this;
2088
2104
 
2089
- fetchDataSource(this, dataSource);
2105
+ fetchDataSource(this, dataSource, true);
2090
2106
 
2091
2107
  if (this.options.refresh) {
2092
2108
  this.startRefresh();
@@ -2122,7 +2138,7 @@
2122
2138
  if (options) {
2123
2139
  this.__updateOptions(options);
2124
2140
  }
2125
- fetchDataSource(this, dataSource);
2141
+ fetchDataSource(this, dataSource, true);
2126
2142
  };
2127
2143
 
2128
2144
  Chart.prototype.setOptions = function setOptions (options) {
@@ -2197,6 +2213,9 @@
2197
2213
  };
2198
2214
 
2199
2215
  Chart.prototype.destroy = function destroy () {
2216
+ this.destroyed = true;
2217
+ this.stopRefresh();
2218
+
2200
2219
  if (this.__adapterObject) {
2201
2220
  this.__adapterObject.destroy(this);
2202
2221
  }
@@ -2441,6 +2460,14 @@
2441
2460
  }
2442
2461
  }
2443
2462
  },
2463
+ destroyAll: function() {
2464
+ for (var chartId in Chartkick.charts) {
2465
+ if (Chartkick.charts.hasOwnProperty(chartId)) {
2466
+ Chartkick.charts[chartId].destroy();
2467
+ delete Chartkick.charts[chartId];
2468
+ }
2469
+ }
2470
+ },
2444
2471
  config: config,
2445
2472
  options: {},
2446
2473
  adapters: adapters,
@@ -2454,6 +2481,16 @@
2454
2481
  // not ideal, but allows for simpler integration
2455
2482
  if (typeof window !== "undefined" && !window.Chartkick) {
2456
2483
  window.Chartkick = Chartkick;
2484
+
2485
+ // clean up previous charts before Turbolinks loads new page
2486
+ document.addEventListener("turbolinks:before-render", function() {
2487
+ Chartkick.destroyAll();
2488
+ });
2489
+
2490
+ // use setTimeout so charting library can come later in same JS file
2491
+ setTimeout(function() {
2492
+ window.dispatchEvent(new Event("chartkick:load"));
2493
+ }, 0);
2457
2494
  }
2458
2495
 
2459
2496
  // backwards compatibility for esm require