chartkick 5.1.4 → 5.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98a76e20f3a13e13184687cb845f461cfd5ef0e3bd75273922a5da56b97597ab
4
- data.tar.gz: 6017e645dff4678208f3c57fc682d8343f19063a494a39f9f45788092e123492
3
+ metadata.gz: 7a5f1633a78d2567d005d45366a1d13e85c98feb784220658270ac32b0bd666e
4
+ data.tar.gz: b317306658b5e4f557c1acf9a6c1055acf1dff9e284f3927ebf25a60bb8c87f3
5
5
  SHA512:
6
- metadata.gz: 1d8567e2dc6bb53efac3426b4fb8c6bef2b870db845e12fadb28aa0a069b64c8c9edae98e06003d00806959fee51f0de600d358b8620a7e9453654f7def44291
7
- data.tar.gz: 5150b0d42f154e2ff17722e6af8a3b2798ab4c764ce937a14a83a2f13d44a0fc6f812a45caac77a9e753bd28162046b387d9dee317d2ad27383f1d2deb284394
6
+ metadata.gz: 83675f87191af965cdee382091eb73206f48614ba4b668619e7d396664f4695def489cccfd824d84b22d7ea1ca0fae0e866c5ecc467829115faf2e329d7538df
7
+ data.tar.gz: 73e8abf43cf9f35221610e20f5c18e0804496aa7c7197b648314e0b74a95e70106cb400511cbae9eb83b8b173d04b260991f1aee43f07a6569b37076e8fc5887
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 5.2.0 (2025-06-16)
2
+
3
+ - Updated Chart.js to 4.5.0
4
+ - Dropped support for Ruby < 3.2
5
+
6
+ ## 5.1.5 (2025-04-15)
7
+
8
+ - Updated Chart.js to 4.4.9
9
+
1
10
  ## 5.1.4 (2025-02-19)
2
11
 
3
12
  - Updated Chart.js to 4.4.8
@@ -1,3 +1,3 @@
1
1
  module Chartkick
2
- VERSION = "5.1.4"
2
+ VERSION = "5.2.0"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Chart.js v4.4.8
2
+ * Chart.js v4.5.0
3
3
  * https://www.chartjs.org
4
4
  * (c) 2025 Chart.js Contributors
5
5
  * Released under the MIT License
@@ -4047,6 +4047,35 @@
4047
4047
  };
4048
4048
  return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);
4049
4049
  }
4050
+ function getSizeForArea(scale, chartArea, field) {
4051
+ return scale.options.clip ? scale[field] : chartArea[field];
4052
+ }
4053
+ function getDatasetArea(meta, chartArea) {
4054
+ var xScale = meta.xScale,
4055
+ yScale = meta.yScale;
4056
+ if (xScale && yScale) {
4057
+ return {
4058
+ left: getSizeForArea(xScale, chartArea, 'left'),
4059
+ right: getSizeForArea(xScale, chartArea, 'right'),
4060
+ top: getSizeForArea(yScale, chartArea, 'top'),
4061
+ bottom: getSizeForArea(yScale, chartArea, 'bottom')
4062
+ };
4063
+ }
4064
+ return chartArea;
4065
+ }
4066
+ function getDatasetClipArea(chart, meta) {
4067
+ var clip = meta._clip;
4068
+ if (clip.disabled) {
4069
+ return false;
4070
+ }
4071
+ var area = getDatasetArea(meta, chart.chartArea);
4072
+ return {
4073
+ left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),
4074
+ right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),
4075
+ top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),
4076
+ bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)
4077
+ };
4078
+ }
4050
4079
 
4051
4080
  var Animator = /*#__PURE__*/function () {
4052
4081
  function Animator() {
@@ -5757,6 +5786,39 @@
5757
5786
  value: function _getStackCount(index) {
5758
5787
  return this._getStacks(undefined, index).length;
5759
5788
  }
5789
+ }, {
5790
+ key: "_getAxisCount",
5791
+ value: function _getAxisCount() {
5792
+ return this._getAxis().length;
5793
+ }
5794
+ }, {
5795
+ key: "getFirstScaleIdForIndexAxis",
5796
+ value: function getFirstScaleIdForIndexAxis() {
5797
+ var scales = this.chart.scales;
5798
+ var indexScaleId = this.chart.options.indexAxis;
5799
+ return Object.keys(scales).filter(function (key) {
5800
+ return scales[key].axis === indexScaleId;
5801
+ }).shift();
5802
+ }
5803
+ }, {
5804
+ key: "_getAxis",
5805
+ value: function _getAxis() {
5806
+ var axis = {};
5807
+ var firstScaleAxisId = this.getFirstScaleIdForIndexAxis();
5808
+ var _iterator5 = _createForOfIteratorHelper$1(this.chart.data.datasets),
5809
+ _step5;
5810
+ try {
5811
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
5812
+ var dataset = _step5.value;
5813
+ axis[valueOrDefault(this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId)] = true;
5814
+ }
5815
+ } catch (err) {
5816
+ _iterator5.e(err);
5817
+ } finally {
5818
+ _iterator5.f();
5819
+ }
5820
+ return Object.keys(axis);
5821
+ }
5760
5822
  }, {
5761
5823
  key: "_getStackIndex",
5762
5824
  value: function _getStackIndex(datasetIndex, name, dataIndex) {
@@ -5861,10 +5923,13 @@
5861
5923
  var skipNull = options.skipNull;
5862
5924
  var maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);
5863
5925
  var center, size;
5926
+ var axisCount = this._getAxisCount();
5864
5927
  if (ruler.grouped) {
5865
5928
  var stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;
5866
- var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);
5867
- var stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);
5929
+ var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount) : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);
5930
+ var axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;
5931
+ var axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));
5932
+ var stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;
5868
5933
  center = range.start + range.chunk * stackIndex + range.chunk / 2;
5869
5934
  size = Math.min(maxBarThickness, range.chunk * range.ratio);
5870
5935
  } else {
@@ -7369,11 +7434,11 @@
7369
7434
  }
7370
7435
  function buildStacks(layouts) {
7371
7436
  var stacks = {};
7372
- var _iterator5 = _createForOfIteratorHelper$1(layouts),
7373
- _step5;
7437
+ var _iterator6 = _createForOfIteratorHelper$1(layouts),
7438
+ _step6;
7374
7439
  try {
7375
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
7376
- var wrap = _step5.value;
7440
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
7441
+ var wrap = _step6.value;
7377
7442
  var stack = wrap.stack,
7378
7443
  pos = wrap.pos,
7379
7444
  stackWeight = wrap.stackWeight;
@@ -7390,9 +7455,9 @@
7390
7455
  _stack.weight += stackWeight;
7391
7456
  }
7392
7457
  } catch (err) {
7393
- _iterator5.e(err);
7458
+ _iterator6.e(err);
7394
7459
  } finally {
7395
- _iterator5.f();
7460
+ _iterator6.f();
7396
7461
  }
7397
7462
  return stacks;
7398
7463
  }
@@ -7536,11 +7601,11 @@
7536
7601
  var userPadding = params.padding;
7537
7602
  var x = chartArea.x,
7538
7603
  y = chartArea.y;
7539
- var _iterator6 = _createForOfIteratorHelper$1(boxes),
7540
- _step6;
7604
+ var _iterator7 = _createForOfIteratorHelper$1(boxes),
7605
+ _step7;
7541
7606
  try {
7542
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
7543
- var layout = _step6.value;
7607
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
7608
+ var layout = _step7.value;
7544
7609
  var box = layout.box;
7545
7610
  var stack = stacks[layout.stack] || {
7546
7611
  count: 1,
@@ -7579,9 +7644,9 @@
7579
7644
  }
7580
7645
  }
7581
7646
  } catch (err) {
7582
- _iterator6.e(err);
7647
+ _iterator7.e(err);
7583
7648
  } finally {
7584
- _iterator6.f();
7649
+ _iterator7.f();
7585
7650
  }
7586
7651
  chartArea.x = x;
7587
7652
  chartArea.y = y;
@@ -7820,37 +7885,37 @@
7820
7885
  };
7821
7886
  }
7822
7887
  function nodeListContains(nodeList, canvas) {
7823
- var _iterator7 = _createForOfIteratorHelper$1(nodeList),
7824
- _step7;
7888
+ var _iterator8 = _createForOfIteratorHelper$1(nodeList),
7889
+ _step8;
7825
7890
  try {
7826
- for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
7827
- var node = _step7.value;
7891
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
7892
+ var node = _step8.value;
7828
7893
  if (node === canvas || node.contains(canvas)) {
7829
7894
  return true;
7830
7895
  }
7831
7896
  }
7832
7897
  } catch (err) {
7833
- _iterator7.e(err);
7898
+ _iterator8.e(err);
7834
7899
  } finally {
7835
- _iterator7.f();
7900
+ _iterator8.f();
7836
7901
  }
7837
7902
  }
7838
7903
  function createAttachObserver(chart, type, listener) {
7839
7904
  var canvas = chart.canvas;
7840
7905
  var observer = new MutationObserver(function (entries) {
7841
7906
  var trigger = false;
7842
- var _iterator8 = _createForOfIteratorHelper$1(entries),
7843
- _step8;
7907
+ var _iterator9 = _createForOfIteratorHelper$1(entries),
7908
+ _step9;
7844
7909
  try {
7845
- for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
7846
- var entry = _step8.value;
7910
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
7911
+ var entry = _step9.value;
7847
7912
  trigger = trigger || nodeListContains(entry.addedNodes, canvas);
7848
7913
  trigger = trigger && !nodeListContains(entry.removedNodes, canvas);
7849
7914
  }
7850
7915
  } catch (err) {
7851
- _iterator8.e(err);
7916
+ _iterator9.e(err);
7852
7917
  } finally {
7853
- _iterator8.f();
7918
+ _iterator9.f();
7854
7919
  }
7855
7920
  if (trigger) {
7856
7921
  listener();
@@ -7866,18 +7931,18 @@
7866
7931
  var canvas = chart.canvas;
7867
7932
  var observer = new MutationObserver(function (entries) {
7868
7933
  var trigger = false;
7869
- var _iterator9 = _createForOfIteratorHelper$1(entries),
7870
- _step9;
7934
+ var _iterator10 = _createForOfIteratorHelper$1(entries),
7935
+ _step10;
7871
7936
  try {
7872
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
7873
- var entry = _step9.value;
7937
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
7938
+ var entry = _step10.value;
7874
7939
  trigger = trigger || nodeListContains(entry.removedNodes, canvas);
7875
7940
  trigger = trigger && !nodeListContains(entry.addedNodes, canvas);
7876
7941
  }
7877
7942
  } catch (err) {
7878
- _iterator9.e(err);
7943
+ _iterator10.e(err);
7879
7944
  } finally {
7880
- _iterator9.f();
7945
+ _iterator10.f();
7881
7946
  }
7882
7947
  if (trigger) {
7883
7948
  listener();
@@ -9526,11 +9591,11 @@
9526
9591
  clipArea(ctx, area);
9527
9592
  }
9528
9593
  var items = this.getLabelItems(chartArea);
9529
- var _iterator10 = _createForOfIteratorHelper$1(items),
9530
- _step10;
9594
+ var _iterator11 = _createForOfIteratorHelper$1(items),
9595
+ _step11;
9531
9596
  try {
9532
- for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
9533
- var item = _step10.value;
9597
+ for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
9598
+ var item = _step11.value;
9534
9599
  var renderTextOptions = item.options;
9535
9600
  var tickFont = item.font;
9536
9601
  var label = item.label;
@@ -9538,9 +9603,9 @@
9538
9603
  renderText(ctx, label, 0, y, tickFont, renderTextOptions);
9539
9604
  }
9540
9605
  } catch (err) {
9541
- _iterator10.e(err);
9606
+ _iterator11.e(err);
9542
9607
  } finally {
9543
- _iterator10.f();
9608
+ _iterator11.f();
9544
9609
  }
9545
9610
  if (area) {
9546
9611
  unclipArea(ctx);
@@ -9923,11 +9988,11 @@
9923
9988
  key: "_notify",
9924
9989
  value: function _notify(descriptors, chart, hook, args) {
9925
9990
  args = args || {};
9926
- var _iterator11 = _createForOfIteratorHelper$1(descriptors),
9927
- _step11;
9991
+ var _iterator12 = _createForOfIteratorHelper$1(descriptors),
9992
+ _step12;
9928
9993
  try {
9929
- for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
9930
- var descriptor = _step11.value;
9994
+ for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
9995
+ var descriptor = _step12.value;
9931
9996
  var plugin = descriptor.plugin;
9932
9997
  var method = plugin[hook];
9933
9998
  var params = [chart, args, descriptor.options];
@@ -9936,9 +10001,9 @@
9936
10001
  }
9937
10002
  }
9938
10003
  } catch (err) {
9939
- _iterator11.e(err);
10004
+ _iterator12.e(err);
9940
10005
  } finally {
9941
- _iterator11.f();
10006
+ _iterator12.f();
9942
10007
  }
9943
10008
  return true;
9944
10009
  }
@@ -10019,11 +10084,11 @@
10019
10084
  localIds = _ref2.localIds;
10020
10085
  var result = [];
10021
10086
  var context = chart.getContext();
10022
- var _iterator12 = _createForOfIteratorHelper$1(plugins),
10023
- _step12;
10087
+ var _iterator13 = _createForOfIteratorHelper$1(plugins),
10088
+ _step13;
10024
10089
  try {
10025
- for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
10026
- var plugin = _step12.value;
10090
+ for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
10091
+ var plugin = _step13.value;
10027
10092
  var id = plugin.id;
10028
10093
  var opts = getOpts(options[id], all);
10029
10094
  if (opts === null) {
@@ -10038,9 +10103,9 @@
10038
10103
  });
10039
10104
  }
10040
10105
  } catch (err) {
10041
- _iterator12.e(err);
10106
+ _iterator13.e(err);
10042
10107
  } finally {
10043
- _iterator12.f();
10108
+ _iterator13.f();
10044
10109
  }
10045
10110
  return result;
10046
10111
  }
@@ -10359,17 +10424,17 @@
10359
10424
  var subResolver = this.createResolver(scopes, context, subPrefixes);
10360
10425
  options = _attachContext(resolver, context, subResolver);
10361
10426
  }
10362
- var _iterator13 = _createForOfIteratorHelper$1(names),
10363
- _step13;
10427
+ var _iterator14 = _createForOfIteratorHelper$1(names),
10428
+ _step14;
10364
10429
  try {
10365
- for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
10366
- var prop = _step13.value;
10430
+ for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
10431
+ var prop = _step14.value;
10367
10432
  result[prop] = options[prop];
10368
10433
  }
10369
10434
  } catch (err) {
10370
- _iterator13.e(err);
10435
+ _iterator14.e(err);
10371
10436
  } finally {
10372
- _iterator13.f();
10437
+ _iterator14.f();
10373
10438
  }
10374
10439
  return result;
10375
10440
  }
@@ -10413,11 +10478,11 @@
10413
10478
  var _descriptors2 = _descriptors(proxy),
10414
10479
  isScriptable = _descriptors2.isScriptable,
10415
10480
  isIndexable = _descriptors2.isIndexable;
10416
- var _iterator14 = _createForOfIteratorHelper$1(names),
10417
- _step14;
10481
+ var _iterator15 = _createForOfIteratorHelper$1(names),
10482
+ _step15;
10418
10483
  try {
10419
- for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
10420
- var prop = _step14.value;
10484
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
10485
+ var prop = _step15.value;
10421
10486
  var scriptable = isScriptable(prop);
10422
10487
  var indexable = isIndexable(prop);
10423
10488
  var value = (indexable || scriptable) && proxy[prop];
@@ -10426,13 +10491,13 @@
10426
10491
  }
10427
10492
  }
10428
10493
  } catch (err) {
10429
- _iterator14.e(err);
10494
+ _iterator15.e(err);
10430
10495
  } finally {
10431
- _iterator14.f();
10496
+ _iterator15.f();
10432
10497
  }
10433
10498
  return false;
10434
10499
  }
10435
- var version = "4.4.8";
10500
+ var version = "4.5.0";
10436
10501
  var KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];
10437
10502
  function positionIsHorizontal(position, axis) {
10438
10503
  return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';
@@ -10494,22 +10559,6 @@
10494
10559
  }
10495
10560
  return e;
10496
10561
  }
10497
- function getSizeForArea(scale, chartArea, field) {
10498
- return scale.options.clip ? scale[field] : chartArea[field];
10499
- }
10500
- function getDatasetArea(meta, chartArea) {
10501
- var xScale = meta.xScale,
10502
- yScale = meta.yScale;
10503
- if (xScale && yScale) {
10504
- return {
10505
- left: getSizeForArea(xScale, chartArea, 'left'),
10506
- right: getSizeForArea(xScale, chartArea, 'right'),
10507
- top: getSizeForArea(yScale, chartArea, 'top'),
10508
- bottom: getSizeForArea(yScale, chartArea, 'bottom')
10509
- };
10510
- }
10511
- return chartArea;
10512
- }
10513
10562
  var Chart = /*#__PURE__*/function () {
10514
10563
  function Chart(item, userConfig) {
10515
10564
  var _this12 = this;
@@ -10898,21 +10947,21 @@
10898
10947
  value: function _updateHiddenIndices() {
10899
10948
  var _hiddenIndices = this._hiddenIndices;
10900
10949
  var changes = this._getUniformDataChanges() || [];
10901
- var _iterator15 = _createForOfIteratorHelper$1(changes),
10902
- _step15;
10950
+ var _iterator16 = _createForOfIteratorHelper$1(changes),
10951
+ _step16;
10903
10952
  try {
10904
- for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
10905
- var _step15$value = _step15.value,
10906
- method = _step15$value.method,
10907
- start = _step15$value.start,
10908
- count = _step15$value.count;
10953
+ for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
10954
+ var _step16$value = _step16.value,
10955
+ method = _step16$value.method,
10956
+ start = _step16$value.start,
10957
+ count = _step16$value.count;
10909
10958
  var move = method === '_removeElements' ? -count : count;
10910
10959
  moveNumericKeys(_hiddenIndices, start, move);
10911
10960
  }
10912
10961
  } catch (err) {
10913
- _iterator15.e(err);
10962
+ _iterator16.e(err);
10914
10963
  } finally {
10915
- _iterator15.f();
10964
+ _iterator16.f();
10916
10965
  }
10917
10966
  }
10918
10967
  }, {
@@ -11099,27 +11148,20 @@
11099
11148
  key: "_drawDataset",
11100
11149
  value: function _drawDataset(meta) {
11101
11150
  var ctx = this.ctx;
11102
- var clip = meta._clip;
11103
- var useClip = !clip.disabled;
11104
- var area = getDatasetArea(meta, this.chartArea);
11105
11151
  var args = {
11106
11152
  meta: meta,
11107
11153
  index: meta.index,
11108
11154
  cancelable: true
11109
11155
  };
11156
+ var clip = getDatasetClipArea(this, meta);
11110
11157
  if (this.notifyPlugins('beforeDatasetDraw', args) === false) {
11111
11158
  return;
11112
11159
  }
11113
- if (useClip) {
11114
- clipArea(ctx, {
11115
- left: clip.left === false ? 0 : area.left - clip.left,
11116
- right: clip.right === false ? this.width : area.right + clip.right,
11117
- top: clip.top === false ? 0 : area.top - clip.top,
11118
- bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom
11119
- });
11160
+ if (clip) {
11161
+ clipArea(ctx, clip);
11120
11162
  }
11121
11163
  meta.controller.draw();
11122
- if (useClip) {
11164
+ if (clip) {
11123
11165
  unclipArea(ctx);
11124
11166
  }
11125
11167
  args.cancelable = false;
@@ -11529,6 +11571,40 @@
11529
11571
  return chart._plugins.invalidate();
11530
11572
  });
11531
11573
  }
11574
+ function clipSelf(ctx, element, endAngle) {
11575
+ var startAngle = element.startAngle,
11576
+ x = element.x,
11577
+ y = element.y,
11578
+ outerRadius = element.outerRadius,
11579
+ innerRadius = element.innerRadius,
11580
+ options = element.options;
11581
+ var borderWidth = options.borderWidth,
11582
+ borderJoinStyle = options.borderJoinStyle;
11583
+ var outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));
11584
+ ctx.beginPath();
11585
+ ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);
11586
+ if (innerRadius > 0) {
11587
+ var innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));
11588
+ ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);
11589
+ } else {
11590
+ var clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));
11591
+ if (borderJoinStyle === 'round') {
11592
+ ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);
11593
+ } else if (borderJoinStyle === 'bevel') {
11594
+ var r = 2 * clipWidth * clipWidth;
11595
+ var endX = -r * Math.cos(endAngle + PI / 2) + x;
11596
+ var endY = -r * Math.sin(endAngle + PI / 2) + y;
11597
+ var startX = r * Math.cos(startAngle + PI / 2) + x;
11598
+ var startY = r * Math.sin(startAngle + PI / 2) + y;
11599
+ ctx.lineTo(endX, endY);
11600
+ ctx.lineTo(startX, startY);
11601
+ }
11602
+ }
11603
+ ctx.closePath();
11604
+ ctx.moveTo(0, 0);
11605
+ ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);
11606
+ ctx.clip('evenodd');
11607
+ }
11532
11608
  function clipArc(ctx, element, endAngle) {
11533
11609
  var startAngle = element.startAngle,
11534
11610
  pixelMargin = element.pixelMargin,
@@ -11711,7 +11787,8 @@
11711
11787
  var borderWidth = options.borderWidth,
11712
11788
  borderJoinStyle = options.borderJoinStyle,
11713
11789
  borderDash = options.borderDash,
11714
- borderDashOffset = options.borderDashOffset;
11790
+ borderDashOffset = options.borderDashOffset,
11791
+ borderRadius = options.borderRadius;
11715
11792
  var inner = options.borderAlign === 'inner';
11716
11793
  if (!borderWidth) {
11717
11794
  return;
@@ -11738,6 +11815,9 @@
11738
11815
  if (inner) {
11739
11816
  clipArc(ctx, element, endAngle);
11740
11817
  }
11818
+ if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {
11819
+ clipSelf(ctx, element, endAngle);
11820
+ }
11741
11821
  if (!fullCircles) {
11742
11822
  pathArc(ctx, element, offset, spacing, endAngle, circular);
11743
11823
  ctx.stroke();
@@ -11855,7 +11935,8 @@
11855
11935
  offset: 0,
11856
11936
  spacing: 0,
11857
11937
  angle: undefined,
11858
- circular: true
11938
+ circular: true,
11939
+ selfJoin: false
11859
11940
  });
11860
11941
  _defineProperty$1(ArcElement, "defaultRoutes", {
11861
11942
  backgroundColor: 'backgroundColor'
@@ -12021,11 +12102,11 @@
12021
12102
  var segments = line.segments,
12022
12103
  options = line.options;
12023
12104
  var segmentMethod = _getSegmentMethod(line);
12024
- var _iterator16 = _createForOfIteratorHelper$1(segments),
12025
- _step16;
12105
+ var _iterator17 = _createForOfIteratorHelper$1(segments),
12106
+ _step17;
12026
12107
  try {
12027
- for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
12028
- var segment = _step16.value;
12108
+ for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
12109
+ var segment = _step17.value;
12029
12110
  setStyle(ctx, options, segment.style);
12030
12111
  ctx.beginPath();
12031
12112
  if (segmentMethod(ctx, line, segment, {
@@ -12037,9 +12118,9 @@
12037
12118
  ctx.stroke();
12038
12119
  }
12039
12120
  } catch (err) {
12040
- _iterator16.e(err);
12121
+ _iterator17.e(err);
12041
12122
  } finally {
12042
- _iterator16.f();
12123
+ _iterator17.f();
12043
12124
  }
12044
12125
  }
12045
12126
  var usePath2D = typeof Path2D === 'function';
@@ -12161,20 +12242,20 @@
12161
12242
  var loop = this._loop;
12162
12243
  start = start || 0;
12163
12244
  count = count || this.points.length - start;
12164
- var _iterator17 = _createForOfIteratorHelper$1(segments),
12165
- _step17;
12245
+ var _iterator18 = _createForOfIteratorHelper$1(segments),
12246
+ _step18;
12166
12247
  try {
12167
- for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
12168
- var segment = _step17.value;
12248
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
12249
+ var segment = _step18.value;
12169
12250
  loop &= segmentMethod(ctx, this, segment, {
12170
12251
  start: start,
12171
12252
  end: start + count - 1
12172
12253
  });
12173
12254
  }
12174
12255
  } catch (err) {
12175
- _iterator17.e(err);
12256
+ _iterator18.e(err);
12176
12257
  } finally {
12177
- _iterator17.f();
12258
+ _iterator18.f();
12178
12259
  }
12179
12260
  return !!loop;
12180
12261
  }
@@ -12823,11 +12904,11 @@
12823
12904
  var points = line.points;
12824
12905
  var tpoints = target.points;
12825
12906
  var parts = [];
12826
- var _iterator18 = _createForOfIteratorHelper$1(segments),
12827
- _step18;
12907
+ var _iterator19 = _createForOfIteratorHelper$1(segments),
12908
+ _step19;
12828
12909
  try {
12829
- for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
12830
- var segment = _step18.value;
12910
+ for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
12911
+ var segment = _step19.value;
12831
12912
  var start = segment.start,
12832
12913
  end = segment.end;
12833
12914
  end = _findSegmentEnd(start, end, points);
@@ -12842,18 +12923,18 @@
12842
12923
  continue;
12843
12924
  }
12844
12925
  var targetSegments = _boundSegments(target, bounds);
12845
- var _iterator19 = _createForOfIteratorHelper$1(targetSegments),
12846
- _step19;
12926
+ var _iterator20 = _createForOfIteratorHelper$1(targetSegments),
12927
+ _step20;
12847
12928
  try {
12848
- for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
12849
- var tgt = _step19.value;
12929
+ for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
12930
+ var tgt = _step20.value;
12850
12931
  var subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);
12851
12932
  var fillSources = _boundSegment(segment, points, subBounds);
12852
- var _iterator20 = _createForOfIteratorHelper$1(fillSources),
12853
- _step20;
12933
+ var _iterator21 = _createForOfIteratorHelper$1(fillSources),
12934
+ _step21;
12854
12935
  try {
12855
- for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
12856
- var fillSource = _step20.value;
12936
+ for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
12937
+ var fillSource = _step21.value;
12857
12938
  parts.push({
12858
12939
  source: fillSource,
12859
12940
  target: tgt,
@@ -12862,21 +12943,21 @@
12862
12943
  });
12863
12944
  }
12864
12945
  } catch (err) {
12865
- _iterator20.e(err);
12946
+ _iterator21.e(err);
12866
12947
  } finally {
12867
- _iterator20.f();
12948
+ _iterator21.f();
12868
12949
  }
12869
12950
  }
12870
12951
  } catch (err) {
12871
- _iterator19.e(err);
12952
+ _iterator20.e(err);
12872
12953
  } finally {
12873
- _iterator19.f();
12954
+ _iterator20.f();
12874
12955
  }
12875
12956
  }
12876
12957
  } catch (err) {
12877
- _iterator18.e(err);
12958
+ _iterator19.e(err);
12878
12959
  } finally {
12879
- _iterator18.f();
12960
+ _iterator19.f();
12880
12961
  }
12881
12962
  return parts;
12882
12963
  }
@@ -13241,7 +13322,9 @@
13241
13322
  }
13242
13323
  function _drawfill(ctx, source, area) {
13243
13324
  var target = _getTarget(source);
13244
- var line = source.line,
13325
+ var chart = source.chart,
13326
+ index = source.index,
13327
+ line = source.line,
13245
13328
  scale = source.scale,
13246
13329
  axis = source.axis;
13247
13330
  var lineOpts = line.options;
@@ -13252,6 +13335,8 @@
13252
13335
  above = _ref9$above === void 0 ? color : _ref9$above,
13253
13336
  _ref9$below = _ref9.below,
13254
13337
  below = _ref9$below === void 0 ? color : _ref9$below;
13338
+ var meta = chart.getDatasetMeta(index);
13339
+ var clip = getDatasetClipArea(chart, meta);
13255
13340
  if (target && line.points.length) {
13256
13341
  clipArea(ctx, area);
13257
13342
  doFill(ctx, {
@@ -13261,7 +13346,8 @@
13261
13346
  below: below,
13262
13347
  area: area,
13263
13348
  scale: scale,
13264
- axis: axis
13349
+ axis: axis,
13350
+ clip: clip
13265
13351
  });
13266
13352
  unclipArea(ctx);
13267
13353
  }
@@ -13272,28 +13358,48 @@
13272
13358
  above = cfg.above,
13273
13359
  below = cfg.below,
13274
13360
  area = cfg.area,
13275
- scale = cfg.scale;
13361
+ scale = cfg.scale,
13362
+ clip = cfg.clip;
13276
13363
  var property = line._loop ? 'angle' : cfg.axis;
13277
13364
  ctx.save();
13278
- if (property === 'x' && below !== above) {
13279
- clipVertical(ctx, target, area.top);
13280
- fill(ctx, {
13281
- line: line,
13282
- target: target,
13283
- color: above,
13284
- scale: scale,
13285
- property: property
13286
- });
13287
- ctx.restore();
13288
- ctx.save();
13289
- clipVertical(ctx, target, area.bottom);
13365
+ var fillColor = below;
13366
+ if (below !== above) {
13367
+ if (property === 'x') {
13368
+ clipVertical(ctx, target, area.top);
13369
+ fill(ctx, {
13370
+ line: line,
13371
+ target: target,
13372
+ color: above,
13373
+ scale: scale,
13374
+ property: property,
13375
+ clip: clip
13376
+ });
13377
+ ctx.restore();
13378
+ ctx.save();
13379
+ clipVertical(ctx, target, area.bottom);
13380
+ } else if (property === 'y') {
13381
+ clipHorizontal(ctx, target, area.left);
13382
+ fill(ctx, {
13383
+ line: line,
13384
+ target: target,
13385
+ color: below,
13386
+ scale: scale,
13387
+ property: property,
13388
+ clip: clip
13389
+ });
13390
+ ctx.restore();
13391
+ ctx.save();
13392
+ clipHorizontal(ctx, target, area.right);
13393
+ fillColor = above;
13394
+ }
13290
13395
  }
13291
13396
  fill(ctx, {
13292
13397
  line: line,
13293
13398
  target: target,
13294
- color: below,
13399
+ color: fillColor,
13295
13400
  scale: scale,
13296
- property: property
13401
+ property: property,
13402
+ clip: clip
13297
13403
  });
13298
13404
  ctx.restore();
13299
13405
  }
@@ -13303,11 +13409,11 @@
13303
13409
  var first = true;
13304
13410
  var lineLoop = false;
13305
13411
  ctx.beginPath();
13306
- var _iterator21 = _createForOfIteratorHelper$1(segments),
13307
- _step21;
13412
+ var _iterator22 = _createForOfIteratorHelper$1(segments),
13413
+ _step22;
13308
13414
  try {
13309
- for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
13310
- var segment = _step21.value;
13415
+ for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
13416
+ var segment = _step22.value;
13311
13417
  var start = segment.start,
13312
13418
  end = segment.end;
13313
13419
  var firstPoint = points[start];
@@ -13329,30 +13435,71 @@
13329
13435
  }
13330
13436
  }
13331
13437
  } catch (err) {
13332
- _iterator21.e(err);
13438
+ _iterator22.e(err);
13333
13439
  } finally {
13334
- _iterator21.f();
13440
+ _iterator22.f();
13335
13441
  }
13336
13442
  ctx.lineTo(target.first().x, clipY);
13337
13443
  ctx.closePath();
13338
13444
  ctx.clip();
13339
13445
  }
13446
+ function clipHorizontal(ctx, target, clipX) {
13447
+ var segments = target.segments,
13448
+ points = target.points;
13449
+ var first = true;
13450
+ var lineLoop = false;
13451
+ ctx.beginPath();
13452
+ var _iterator23 = _createForOfIteratorHelper$1(segments),
13453
+ _step23;
13454
+ try {
13455
+ for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
13456
+ var segment = _step23.value;
13457
+ var start = segment.start,
13458
+ end = segment.end;
13459
+ var firstPoint = points[start];
13460
+ var lastPoint = points[_findSegmentEnd(start, end, points)];
13461
+ if (first) {
13462
+ ctx.moveTo(firstPoint.x, firstPoint.y);
13463
+ first = false;
13464
+ } else {
13465
+ ctx.lineTo(clipX, firstPoint.y);
13466
+ ctx.lineTo(firstPoint.x, firstPoint.y);
13467
+ }
13468
+ lineLoop = !!target.pathSegment(ctx, segment, {
13469
+ move: lineLoop
13470
+ });
13471
+ if (lineLoop) {
13472
+ ctx.closePath();
13473
+ } else {
13474
+ ctx.lineTo(clipX, lastPoint.y);
13475
+ }
13476
+ }
13477
+ } catch (err) {
13478
+ _iterator23.e(err);
13479
+ } finally {
13480
+ _iterator23.f();
13481
+ }
13482
+ ctx.lineTo(clipX, target.first().y);
13483
+ ctx.closePath();
13484
+ ctx.clip();
13485
+ }
13340
13486
  function fill(ctx, cfg) {
13341
13487
  var line = cfg.line,
13342
13488
  target = cfg.target,
13343
13489
  property = cfg.property,
13344
13490
  color = cfg.color,
13345
- scale = cfg.scale;
13491
+ scale = cfg.scale,
13492
+ clip = cfg.clip;
13346
13493
  var segments = _segments(line, target, property);
13347
- var _iterator22 = _createForOfIteratorHelper$1(segments),
13348
- _step22;
13494
+ var _iterator24 = _createForOfIteratorHelper$1(segments),
13495
+ _step24;
13349
13496
  try {
13350
- for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
13351
- var _step22$value = _step22.value,
13352
- src = _step22$value.source,
13353
- tgt = _step22$value.target,
13354
- start = _step22$value.start,
13355
- end = _step22$value.end;
13497
+ for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
13498
+ var _step24$value = _step24.value,
13499
+ src = _step24$value.source,
13500
+ tgt = _step24$value.target,
13501
+ start = _step24$value.start,
13502
+ end = _step24$value.end;
13356
13503
  var _src$style = src.style,
13357
13504
  _src$style2 = _src$style === void 0 ? {} : _src$style,
13358
13505
  _src$style2$backgroun = _src$style2.backgroundColor,
@@ -13360,7 +13507,7 @@
13360
13507
  var notShape = target !== true;
13361
13508
  ctx.save();
13362
13509
  ctx.fillStyle = backgroundColor;
13363
- clipBounds(ctx, scale, notShape && _getBounds(property, start, end));
13510
+ clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));
13364
13511
  ctx.beginPath();
13365
13512
  var lineLoop = !!line.pathSegment(ctx, src);
13366
13513
  var loop = void 0;
@@ -13384,22 +13531,38 @@
13384
13531
  ctx.restore();
13385
13532
  }
13386
13533
  } catch (err) {
13387
- _iterator22.e(err);
13534
+ _iterator24.e(err);
13388
13535
  } finally {
13389
- _iterator22.f();
13536
+ _iterator24.f();
13390
13537
  }
13391
13538
  }
13392
- function clipBounds(ctx, scale, bounds) {
13393
- var _scale$chart$chartAre = scale.chart.chartArea,
13394
- top = _scale$chart$chartAre.top,
13395
- bottom = _scale$chart$chartAre.bottom;
13539
+ function clipBounds(ctx, scale, clip, bounds) {
13540
+ var chartArea = scale.chart.chartArea;
13396
13541
  var _ref10 = bounds || {},
13397
13542
  property = _ref10.property,
13398
13543
  start = _ref10.start,
13399
13544
  end = _ref10.end;
13400
- if (property === 'x') {
13545
+ if (property === 'x' || property === 'y') {
13546
+ var left, top, right, bottom;
13547
+ if (property === 'x') {
13548
+ left = start;
13549
+ top = chartArea.top;
13550
+ right = end;
13551
+ bottom = chartArea.bottom;
13552
+ } else {
13553
+ left = chartArea.left;
13554
+ top = start;
13555
+ right = chartArea.right;
13556
+ bottom = end;
13557
+ }
13401
13558
  ctx.beginPath();
13402
- ctx.rect(start, top, end - start, bottom - top);
13559
+ if (clip) {
13560
+ left = Math.max(left, clip.left);
13561
+ right = Math.min(right, clip.right);
13562
+ top = Math.max(top, clip.top);
13563
+ bottom = Math.min(bottom, clip.bottom);
13564
+ }
13565
+ ctx.rect(left, top, right - left, bottom - top);
13403
13566
  ctx.clip();
13404
13567
  }
13405
13568
  }
@@ -13694,11 +13857,11 @@
13694
13857
  if (this.isHorizontal()) {
13695
13858
  var row = 0;
13696
13859
  var left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);
13697
- var _iterator23 = _createForOfIteratorHelper$1(hitboxes),
13698
- _step23;
13860
+ var _iterator25 = _createForOfIteratorHelper$1(hitboxes),
13861
+ _step25;
13699
13862
  try {
13700
- for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
13701
- var hitbox = _step23.value;
13863
+ for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
13864
+ var hitbox = _step25.value;
13702
13865
  if (row !== hitbox.row) {
13703
13866
  row = hitbox.row;
13704
13867
  left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);
@@ -13708,18 +13871,18 @@
13708
13871
  left += hitbox.width + padding;
13709
13872
  }
13710
13873
  } catch (err) {
13711
- _iterator23.e(err);
13874
+ _iterator25.e(err);
13712
13875
  } finally {
13713
- _iterator23.f();
13876
+ _iterator25.f();
13714
13877
  }
13715
13878
  } else {
13716
13879
  var col = 0;
13717
13880
  var top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);
13718
- var _iterator24 = _createForOfIteratorHelper$1(hitboxes),
13719
- _step24;
13881
+ var _iterator26 = _createForOfIteratorHelper$1(hitboxes),
13882
+ _step26;
13720
13883
  try {
13721
- for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
13722
- var _hitbox = _step24.value;
13884
+ for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
13885
+ var _hitbox = _step26.value;
13723
13886
  if (_hitbox.col !== col) {
13724
13887
  col = _hitbox.col;
13725
13888
  top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);
@@ -13730,9 +13893,9 @@
13730
13893
  top += _hitbox.height + padding;
13731
13894
  }
13732
13895
  } catch (err) {
13733
- _iterator24.e(err);
13896
+ _iterator26.e(err);
13734
13897
  } finally {
13735
- _iterator24.f();
13898
+ _iterator26.f();
13736
13899
  }
13737
13900
  }
13738
13901
  }
@@ -15460,21 +15623,21 @@
15460
15623
  var added = this._addedLabels;
15461
15624
  if (added.length) {
15462
15625
  var labels = this.getLabels();
15463
- var _iterator25 = _createForOfIteratorHelper$1(added),
15464
- _step25;
15626
+ var _iterator27 = _createForOfIteratorHelper$1(added),
15627
+ _step27;
15465
15628
  try {
15466
- for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
15467
- var _step25$value = _step25.value,
15468
- _index3 = _step25$value.index,
15469
- label = _step25$value.label;
15629
+ for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {
15630
+ var _step27$value = _step27.value,
15631
+ _index3 = _step27$value.index,
15632
+ label = _step27$value.label;
15470
15633
  if (labels[_index3] === label) {
15471
15634
  labels.splice(_index3, 1);
15472
15635
  }
15473
15636
  }
15474
15637
  } catch (err) {
15475
- _iterator25.e(err);
15638
+ _iterator27.e(err);
15476
15639
  } finally {
15477
- _iterator25.f();
15640
+ _iterator27.f();
15478
15641
  }
15479
15642
  this._addedLabels = [];
15480
15643
  }
@@ -17344,6 +17507,7 @@
17344
17507
  fontString: fontString,
17345
17508
  formatNumber: formatNumber,
17346
17509
  getAngleFromPoint: getAngleFromPoint,
17510
+ getDatasetClipArea: getDatasetClipArea,
17347
17511
  getHoverColor: getHoverColor,
17348
17512
  getMaximumSize: getMaximumSize,
17349
17513
  getRelativePosition: getRelativePosition,
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chartkick
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.4
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-02-19 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  email: andrew@ankane.org
13
13
  executables: []
@@ -42,14 +42,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: '3.1'
45
+ version: '3.2'
46
46
  required_rubygems_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubygems_version: 3.6.2
52
+ rubygems_version: 3.6.7
53
53
  specification_version: 4
54
54
  summary: Create beautiful JavaScript charts with one line of Ruby
55
55
  test_files: []