chartkick 4.0.3 → 4.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +4 -4
- data/lib/chartkick/version.rb +1 -1
- data/vendor/assets/javascripts/Chart.bundle.js +465 -251
- data/vendor/assets/javascripts/chartkick.js +18 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e28ff576b7b488cc3ca1add95bf96832461189f5b085816e67d9923fdf13494
|
4
|
+
data.tar.gz: 282c01fdc0d199d4dd9d17a0aa887a67a0d8ce52df584a46d172e636496ad25e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a450c12a1973131b412d99525d400d2910e63e24edb93cb6ce27670dc6a1eaf70e13dfec9829a67cae6afcf4e77737eea2c442232c00bdd3c5d5e7b126a1a93
|
7
|
+
data.tar.gz: 3d59060b8e7dd24f3239dccc0b7079a66e3d1351a1e565e948e46faa2a2b28a462ee6d91b99602a334f91861ea2cf3a77419bf0c86677a83c278b4f97ef3d4fb
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -29,7 +29,7 @@ yarn add chartkick chart.js
|
|
29
29
|
And in `app/javascript/packs/application.js`, add:
|
30
30
|
|
31
31
|
```js
|
32
|
-
|
32
|
+
import "chartkick/chart.js"
|
33
33
|
```
|
34
34
|
|
35
35
|
For Rails 5 / Sprockets, in `app/assets/javascripts/application.js`, add:
|
@@ -430,7 +430,7 @@ yarn add chartkick chart.js
|
|
430
430
|
And in `app/javascript/packs/application.js`, add:
|
431
431
|
|
432
432
|
```js
|
433
|
-
|
433
|
+
import "chartkick/chart.js"
|
434
434
|
```
|
435
435
|
|
436
436
|
For Rails 5 / Sprockets, in `app/assets/javascripts/application.js`, add:
|
@@ -457,7 +457,7 @@ yarn add chartkick
|
|
457
457
|
And in `app/javascript/packs/application.js`, add:
|
458
458
|
|
459
459
|
```js
|
460
|
-
|
460
|
+
import "chartkick"
|
461
461
|
```
|
462
462
|
|
463
463
|
For Rails 5 / Sprockets, in `app/assets/javascripts/application.js`, add:
|
@@ -485,7 +485,7 @@ yarn add chartkick highcharts
|
|
485
485
|
And in `app/javascript/packs/application.js`, add:
|
486
486
|
|
487
487
|
```js
|
488
|
-
|
488
|
+
import "chartkick/highcharts"
|
489
489
|
```
|
490
490
|
|
491
491
|
For Rails 5 / Sprockets, download [highcharts.js](https://code.highcharts.com/highcharts.js) into `vendor/assets/javascripts` (or use `yarn add highcharts` in Rails 5.1+), and in `app/assets/javascripts/application.js`, add:
|
data/lib/chartkick/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Chart.js v3.1
|
2
|
+
* Chart.js v3.2.1
|
3
3
|
* https://www.chartjs.org
|
4
4
|
* (c) 2021 Chart.js Contributors
|
5
5
|
* Released under the MIT License
|
@@ -9,7 +9,7 @@
|
|
9
9
|
* (c) 2021 chartjs-adapter-date-fns Contributors
|
10
10
|
* Released under the MIT license
|
11
11
|
*
|
12
|
-
* date-fns v2.
|
12
|
+
* date-fns v2.21.1
|
13
13
|
* https://date-fns.org
|
14
14
|
* (c) 2020 Sasha Koss and Lesha Koss
|
15
15
|
* Released under the MIT License
|
@@ -594,6 +594,31 @@
|
|
594
594
|
return typeof value === 'function';
|
595
595
|
};
|
596
596
|
|
597
|
+
var setsEqual = function setsEqual(a, b) {
|
598
|
+
if (a.size !== b.size) {
|
599
|
+
return false;
|
600
|
+
}
|
601
|
+
|
602
|
+
var _iterator = _createForOfIteratorHelper(a),
|
603
|
+
_step;
|
604
|
+
|
605
|
+
try {
|
606
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
607
|
+
var item = _step.value;
|
608
|
+
|
609
|
+
if (!b.has(item)) {
|
610
|
+
return false;
|
611
|
+
}
|
612
|
+
}
|
613
|
+
} catch (err) {
|
614
|
+
_iterator.e(err);
|
615
|
+
} finally {
|
616
|
+
_iterator.f();
|
617
|
+
}
|
618
|
+
|
619
|
+
return true;
|
620
|
+
};
|
621
|
+
|
597
622
|
var PI = Math.PI;
|
598
623
|
var TAU = 2 * PI;
|
599
624
|
var PITAU = TAU + PI;
|
@@ -2107,18 +2132,18 @@
|
|
2107
2132
|
return value;
|
2108
2133
|
};
|
2109
2134
|
|
2110
|
-
var
|
2111
|
-
|
2135
|
+
var _iterator2 = _createForOfIteratorHelper(keys),
|
2136
|
+
_step2;
|
2112
2137
|
|
2113
2138
|
try {
|
2114
|
-
for (
|
2115
|
-
var prop =
|
2139
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
2140
|
+
var prop = _step2.value;
|
2116
2141
|
ret[prop] = numberOrZero$1(read(prop));
|
2117
2142
|
}
|
2118
2143
|
} catch (err) {
|
2119
|
-
|
2144
|
+
_iterator2.e(err);
|
2120
2145
|
} finally {
|
2121
|
-
|
2146
|
+
_iterator2.f();
|
2122
2147
|
}
|
2123
2148
|
|
2124
2149
|
return ret;
|
@@ -2561,19 +2586,19 @@
|
|
2561
2586
|
|
2562
2587
|
value = [];
|
2563
2588
|
|
2564
|
-
var
|
2565
|
-
|
2589
|
+
var _iterator3 = _createForOfIteratorHelper(arr),
|
2590
|
+
_step3;
|
2566
2591
|
|
2567
2592
|
try {
|
2568
|
-
for (
|
2569
|
-
var item =
|
2593
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
2594
|
+
var item = _step3.value;
|
2570
2595
|
var resolver = createSubResolver(scopes, _proxy, prop, item);
|
2571
2596
|
value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));
|
2572
2597
|
}
|
2573
2598
|
} catch (err) {
|
2574
|
-
|
2599
|
+
_iterator3.e(err);
|
2575
2600
|
} finally {
|
2576
|
-
|
2601
|
+
_iterator3.f();
|
2577
2602
|
}
|
2578
2603
|
}
|
2579
2604
|
|
@@ -2589,12 +2614,12 @@
|
|
2589
2614
|
};
|
2590
2615
|
|
2591
2616
|
function addScopes(set, parentScopes, key, parentFallback) {
|
2592
|
-
var
|
2593
|
-
|
2617
|
+
var _iterator4 = _createForOfIteratorHelper(parentScopes),
|
2618
|
+
_step4;
|
2594
2619
|
|
2595
2620
|
try {
|
2596
|
-
for (
|
2597
|
-
var parent =
|
2621
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
2622
|
+
var parent = _step4.value;
|
2598
2623
|
var scope = getScope(key, parent);
|
2599
2624
|
|
2600
2625
|
if (scope) {
|
@@ -2609,9 +2634,9 @@
|
|
2609
2634
|
}
|
2610
2635
|
}
|
2611
2636
|
} catch (err) {
|
2612
|
-
|
2637
|
+
_iterator4.e(err);
|
2613
2638
|
} finally {
|
2614
|
-
|
2639
|
+
_iterator4.f();
|
2615
2640
|
}
|
2616
2641
|
|
2617
2642
|
return false;
|
@@ -2659,12 +2684,12 @@
|
|
2659
2684
|
function _resolveWithPrefixes(prop, prefixes, scopes, proxy) {
|
2660
2685
|
var value;
|
2661
2686
|
|
2662
|
-
var
|
2663
|
-
|
2687
|
+
var _iterator5 = _createForOfIteratorHelper(prefixes),
|
2688
|
+
_step5;
|
2664
2689
|
|
2665
2690
|
try {
|
2666
|
-
for (
|
2667
|
-
var prefix =
|
2691
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
2692
|
+
var prefix = _step5.value;
|
2668
2693
|
value = _resolve(readKey(prefix, prop), scopes);
|
2669
2694
|
|
2670
2695
|
if (defined(value)) {
|
@@ -2672,19 +2697,19 @@
|
|
2672
2697
|
}
|
2673
2698
|
}
|
2674
2699
|
} catch (err) {
|
2675
|
-
|
2700
|
+
_iterator5.e(err);
|
2676
2701
|
} finally {
|
2677
|
-
|
2702
|
+
_iterator5.f();
|
2678
2703
|
}
|
2679
2704
|
}
|
2680
2705
|
|
2681
2706
|
function _resolve(key, scopes) {
|
2682
|
-
var
|
2683
|
-
|
2707
|
+
var _iterator6 = _createForOfIteratorHelper(scopes),
|
2708
|
+
_step6;
|
2684
2709
|
|
2685
2710
|
try {
|
2686
|
-
for (
|
2687
|
-
var scope =
|
2711
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
2712
|
+
var scope = _step6.value;
|
2688
2713
|
|
2689
2714
|
if (!scope) {
|
2690
2715
|
continue;
|
@@ -2697,9 +2722,9 @@
|
|
2697
2722
|
}
|
2698
2723
|
}
|
2699
2724
|
} catch (err) {
|
2700
|
-
|
2725
|
+
_iterator6.e(err);
|
2701
2726
|
} finally {
|
2702
|
-
|
2727
|
+
_iterator6.f();
|
2703
2728
|
}
|
2704
2729
|
}
|
2705
2730
|
|
@@ -2716,33 +2741,33 @@
|
|
2716
2741
|
function resolveKeysFromAllScopes(scopes) {
|
2717
2742
|
var set = new Set();
|
2718
2743
|
|
2719
|
-
var
|
2720
|
-
|
2744
|
+
var _iterator7 = _createForOfIteratorHelper(scopes),
|
2745
|
+
_step7;
|
2721
2746
|
|
2722
2747
|
try {
|
2723
|
-
for (
|
2724
|
-
var scope =
|
2748
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
2749
|
+
var scope = _step7.value;
|
2725
2750
|
|
2726
|
-
var
|
2751
|
+
var _iterator8 = _createForOfIteratorHelper(Object.keys(scope).filter(function (k) {
|
2727
2752
|
return !k.startsWith('_');
|
2728
2753
|
})),
|
2729
|
-
|
2754
|
+
_step8;
|
2730
2755
|
|
2731
2756
|
try {
|
2732
|
-
for (
|
2733
|
-
var key =
|
2757
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
2758
|
+
var key = _step8.value;
|
2734
2759
|
set.add(key);
|
2735
2760
|
}
|
2736
2761
|
} catch (err) {
|
2737
|
-
|
2762
|
+
_iterator8.e(err);
|
2738
2763
|
} finally {
|
2739
|
-
|
2764
|
+
_iterator8.f();
|
2740
2765
|
}
|
2741
2766
|
}
|
2742
2767
|
} catch (err) {
|
2743
|
-
|
2768
|
+
_iterator7.e(err);
|
2744
2769
|
} finally {
|
2745
|
-
|
2770
|
+
_iterator7.f();
|
2746
2771
|
}
|
2747
2772
|
|
2748
2773
|
return _toConsumableArray(set);
|
@@ -3558,12 +3583,12 @@
|
|
3558
3583
|
var start = segments[0].start;
|
3559
3584
|
var i = start;
|
3560
3585
|
|
3561
|
-
var
|
3562
|
-
|
3586
|
+
var _iterator9 = _createForOfIteratorHelper(segments),
|
3587
|
+
_step9;
|
3563
3588
|
|
3564
3589
|
try {
|
3565
|
-
for (
|
3566
|
-
var segment =
|
3590
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
3591
|
+
var segment = _step9.value;
|
3567
3592
|
var prevStyle = void 0,
|
3568
3593
|
style = void 0;
|
3569
3594
|
var prev = points[start % count];
|
@@ -3602,9 +3627,9 @@
|
|
3602
3627
|
}
|
3603
3628
|
}
|
3604
3629
|
} catch (err) {
|
3605
|
-
|
3630
|
+
_iterator9.e(err);
|
3606
3631
|
} finally {
|
3607
|
-
|
3632
|
+
_iterator9.f();
|
3608
3633
|
}
|
3609
3634
|
|
3610
3635
|
return result;
|
@@ -3644,6 +3669,7 @@
|
|
3644
3669
|
callbacks.forEach(function (fn) {
|
3645
3670
|
return fn({
|
3646
3671
|
chart: chart,
|
3672
|
+
initial: anims.initial,
|
3647
3673
|
numSteps: numSteps,
|
3648
3674
|
currentStep: Math.min(date - anims.start, numSteps)
|
3649
3675
|
});
|
@@ -3712,6 +3738,8 @@
|
|
3712
3738
|
anims.running = false;
|
3713
3739
|
|
3714
3740
|
me._notify(chart, anims, date, 'complete');
|
3741
|
+
|
3742
|
+
anims.initial = false;
|
3715
3743
|
}
|
3716
3744
|
|
3717
3745
|
remaining += items.length;
|
@@ -3732,6 +3760,7 @@
|
|
3732
3760
|
if (!anims) {
|
3733
3761
|
anims = {
|
3734
3762
|
running: false,
|
3763
|
+
initial: true,
|
3735
3764
|
items: [],
|
3736
3765
|
listeners: {
|
3737
3766
|
complete: [],
|
@@ -4331,6 +4360,28 @@
|
|
4331
4360
|
return subStack[indexValue] || (subStack[indexValue] = {});
|
4332
4361
|
}
|
4333
4362
|
|
4363
|
+
function getLastIndexInStack(stack, vScale, positive) {
|
4364
|
+
var _iterator2 = _createForOfIteratorHelper(vScale.getMatchingVisibleMetas('bar').reverse()),
|
4365
|
+
_step2;
|
4366
|
+
|
4367
|
+
try {
|
4368
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
4369
|
+
var meta = _step2.value;
|
4370
|
+
var value = stack[meta.index];
|
4371
|
+
|
4372
|
+
if (positive && value > 0 || !positive && value < 0) {
|
4373
|
+
return meta.index;
|
4374
|
+
}
|
4375
|
+
}
|
4376
|
+
} catch (err) {
|
4377
|
+
_iterator2.e(err);
|
4378
|
+
} finally {
|
4379
|
+
_iterator2.f();
|
4380
|
+
}
|
4381
|
+
|
4382
|
+
return null;
|
4383
|
+
}
|
4384
|
+
|
4334
4385
|
function updateStacks(controller, parsed) {
|
4335
4386
|
var chart = controller.chart,
|
4336
4387
|
meta = controller._cachedMeta;
|
@@ -4351,6 +4402,8 @@
|
|
4351
4402
|
var itemStacks = item._stacks || (item._stacks = {});
|
4352
4403
|
stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);
|
4353
4404
|
stack[datasetIndex] = value;
|
4405
|
+
stack._top = getLastIndexInStack(stack, vScale, true);
|
4406
|
+
stack._bottom = getLastIndexInStack(stack, vScale, false);
|
4354
4407
|
}
|
4355
4408
|
}
|
4356
4409
|
|
@@ -4388,12 +4441,12 @@
|
|
4388
4441
|
function clearStacks(meta, items) {
|
4389
4442
|
items = items || meta._parsed;
|
4390
4443
|
|
4391
|
-
var
|
4392
|
-
|
4444
|
+
var _iterator3 = _createForOfIteratorHelper(items),
|
4445
|
+
_step3;
|
4393
4446
|
|
4394
4447
|
try {
|
4395
|
-
for (
|
4396
|
-
var parsed =
|
4448
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
4449
|
+
var parsed = _step3.value;
|
4397
4450
|
var stacks = parsed._stacks;
|
4398
4451
|
|
4399
4452
|
if (!stacks || stacks[meta.vScale.id] === undefined || stacks[meta.vScale.id][meta.index] === undefined) {
|
@@ -4403,9 +4456,9 @@
|
|
4403
4456
|
delete stacks[meta.vScale.id][meta.index];
|
4404
4457
|
}
|
4405
4458
|
} catch (err) {
|
4406
|
-
|
4459
|
+
_iterator3.e(err);
|
4407
4460
|
} finally {
|
4408
|
-
|
4461
|
+
_iterator3.f();
|
4409
4462
|
}
|
4410
4463
|
}
|
4411
4464
|
|
@@ -4601,6 +4654,7 @@
|
|
4601
4654
|
if (me._parsing === false) {
|
4602
4655
|
meta._parsed = data;
|
4603
4656
|
meta._sorted = true;
|
4657
|
+
parsed = data;
|
4604
4658
|
} else {
|
4605
4659
|
if (isArray(data[start])) {
|
4606
4660
|
parsed = me.parseArrayData(meta, data, start, count);
|
@@ -5181,7 +5235,14 @@
|
|
5181
5235
|
var i, ilen, curr, prev;
|
5182
5236
|
|
5183
5237
|
var updateMinAndPrev = function updateMinAndPrev() {
|
5184
|
-
|
5238
|
+
if (curr === 32767 || curr === -32768) {
|
5239
|
+
return;
|
5240
|
+
}
|
5241
|
+
|
5242
|
+
if (defined(prev)) {
|
5243
|
+
min = Math.min(min, Math.abs(curr - prev) || min);
|
5244
|
+
}
|
5245
|
+
|
5185
5246
|
prev = curr;
|
5186
5247
|
};
|
5187
5248
|
|
@@ -5190,6 +5251,8 @@
|
|
5190
5251
|
updateMinAndPrev();
|
5191
5252
|
}
|
5192
5253
|
|
5254
|
+
prev = undefined;
|
5255
|
+
|
5193
5256
|
for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {
|
5194
5257
|
curr = scale.getPixelForTick(i);
|
5195
5258
|
updateMinAndPrev();
|
@@ -5412,9 +5475,11 @@
|
|
5412
5475
|
|
5413
5476
|
var ipixels = me._calculateBarIndexPixels(i, ruler);
|
5414
5477
|
|
5478
|
+
var stack = (parsed._stacks || {})[vScale.axis];
|
5415
5479
|
var properties = {
|
5416
5480
|
horizontal: horizontal,
|
5417
5481
|
base: vpixels.base,
|
5482
|
+
enableBorderRadius: !stack || isFloatBar(parsed._custom) || me.index === stack._top || me.index === stack._bottom,
|
5418
5483
|
x: horizontal ? vpixels.head : ipixels.center,
|
5419
5484
|
y: horizontal ? ipixels.center : vpixels.head,
|
5420
5485
|
height: horizontal ? ipixels.size : undefined,
|
@@ -5473,8 +5538,8 @@
|
|
5473
5538
|
}
|
5474
5539
|
}, {
|
5475
5540
|
key: "_getStackIndex",
|
5476
|
-
value: function _getStackIndex(datasetIndex, name) {
|
5477
|
-
var stacks = this._getStacks(datasetIndex);
|
5541
|
+
value: function _getStackIndex(datasetIndex, name, dataIndex) {
|
5542
|
+
var stacks = this._getStacks(datasetIndex, dataIndex);
|
5478
5543
|
|
5479
5544
|
var index = name !== undefined ? stacks.indexOf(name) : -1;
|
5480
5545
|
return index === -1 ? stacks.length - 1 : index;
|
@@ -5588,14 +5653,15 @@
|
|
5588
5653
|
var me = this;
|
5589
5654
|
var scale = ruler.scale;
|
5590
5655
|
var options = me.options;
|
5656
|
+
var skipNull = options.skipNull;
|
5591
5657
|
var maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);
|
5592
5658
|
var center, size;
|
5593
5659
|
|
5594
5660
|
if (ruler.grouped) {
|
5595
|
-
var stackCount =
|
5661
|
+
var stackCount = skipNull ? me._getStackCount(index) : ruler.stackCount;
|
5596
5662
|
var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);
|
5597
5663
|
|
5598
|
-
var stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack);
|
5664
|
+
var stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack, skipNull ? index : undefined);
|
5599
5665
|
|
5600
5666
|
center = range.start + range.chunk * stackIndex + range.chunk / 2;
|
5601
5667
|
size = Math.min(maxBarThickness, range.chunk * range.ratio);
|
@@ -7994,7 +8060,10 @@
|
|
7994
8060
|
minor: {},
|
7995
8061
|
major: {},
|
7996
8062
|
align: 'center',
|
7997
|
-
crossAlign: 'near'
|
8063
|
+
crossAlign: 'near',
|
8064
|
+
showLabelBackdrop: false,
|
8065
|
+
backdropColor: 'rgba(255, 255, 255, 0.75)',
|
8066
|
+
backdropPadding: 2
|
7998
8067
|
}
|
7999
8068
|
});
|
8000
8069
|
defaults.route('scale.ticks', 'color', '', 'color');
|
@@ -8320,6 +8389,7 @@
|
|
8320
8389
|
_this4.labelRotation = undefined;
|
8321
8390
|
_this4.min = undefined;
|
8322
8391
|
_this4.max = undefined;
|
8392
|
+
_this4._range = undefined;
|
8323
8393
|
_this4.ticks = [];
|
8324
8394
|
_this4._gridLineItems = null;
|
8325
8395
|
_this4._labelItems = null;
|
@@ -8476,6 +8546,7 @@
|
|
8476
8546
|
me.beforeDataLimits();
|
8477
8547
|
me.determineDataLimits();
|
8478
8548
|
me.afterDataLimits();
|
8549
|
+
me._range = _addGrace(me, me.options.grace);
|
8479
8550
|
me._dataLimitsCached = true;
|
8480
8551
|
}
|
8481
8552
|
|
@@ -8613,6 +8684,14 @@
|
|
8613
8684
|
tick = ticks[i];
|
8614
8685
|
tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me);
|
8615
8686
|
}
|
8687
|
+
|
8688
|
+
for (i = 0; i < ilen; i++) {
|
8689
|
+
if (isNullOrUndef(ticks[i].label)) {
|
8690
|
+
ticks.splice(i, 1);
|
8691
|
+
ilen--;
|
8692
|
+
i--;
|
8693
|
+
}
|
8694
|
+
}
|
8616
8695
|
}
|
8617
8696
|
}, {
|
8618
8697
|
key: "afterTickToLabelConversion",
|
@@ -8900,7 +8979,9 @@
|
|
8900
8979
|
first: valueAt(0),
|
8901
8980
|
last: valueAt(length - 1),
|
8902
8981
|
widest: valueAt(widest),
|
8903
|
-
highest: valueAt(highest)
|
8982
|
+
highest: valueAt(highest),
|
8983
|
+
widths: widths,
|
8984
|
+
heights: heights
|
8904
8985
|
};
|
8905
8986
|
}
|
8906
8987
|
}, {
|
@@ -9012,7 +9093,7 @@
|
|
9012
9093
|
var ticksLength = ticks.length + (offset ? 1 : 0);
|
9013
9094
|
var tl = getTickMarkLength(grid);
|
9014
9095
|
var items = [];
|
9015
|
-
var borderOpts = grid.setContext(me.getContext(
|
9096
|
+
var borderOpts = grid.setContext(me.getContext());
|
9016
9097
|
var axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;
|
9017
9098
|
var axisHalfWidth = axisWidth / 2;
|
9018
9099
|
|
@@ -9235,6 +9316,44 @@
|
|
9235
9316
|
textOffset = (1 - lineCount) * lineHeight / 2;
|
9236
9317
|
}
|
9237
9318
|
|
9319
|
+
var backdrop = void 0;
|
9320
|
+
|
9321
|
+
if (optsAtIndex.showLabelBackdrop) {
|
9322
|
+
var labelPadding = toPadding(optsAtIndex.backdropPadding);
|
9323
|
+
var height = labelSizes.heights[i];
|
9324
|
+
var width = labelSizes.widths[i];
|
9325
|
+
var top = y + textOffset - labelPadding.top;
|
9326
|
+
var left = x - labelPadding.left;
|
9327
|
+
|
9328
|
+
switch (textBaseline) {
|
9329
|
+
case 'middle':
|
9330
|
+
top -= height / 2;
|
9331
|
+
break;
|
9332
|
+
|
9333
|
+
case 'bottom':
|
9334
|
+
top -= height;
|
9335
|
+
break;
|
9336
|
+
}
|
9337
|
+
|
9338
|
+
switch (textAlign) {
|
9339
|
+
case 'center':
|
9340
|
+
left -= width / 2;
|
9341
|
+
break;
|
9342
|
+
|
9343
|
+
case 'right':
|
9344
|
+
left -= width;
|
9345
|
+
break;
|
9346
|
+
}
|
9347
|
+
|
9348
|
+
backdrop = {
|
9349
|
+
left: left,
|
9350
|
+
top: top,
|
9351
|
+
width: width + labelPadding.width,
|
9352
|
+
height: height + labelPadding.height,
|
9353
|
+
color: optsAtIndex.backdropColor
|
9354
|
+
};
|
9355
|
+
}
|
9356
|
+
|
9238
9357
|
items.push({
|
9239
9358
|
rotation: rotation,
|
9240
9359
|
label: label,
|
@@ -9245,7 +9364,8 @@
|
|
9245
9364
|
textOffset: textOffset,
|
9246
9365
|
textAlign: textAlign,
|
9247
9366
|
textBaseline: textBaseline,
|
9248
|
-
translation: [x, y]
|
9367
|
+
translation: [x, y],
|
9368
|
+
backdrop: backdrop
|
9249
9369
|
});
|
9250
9370
|
}
|
9251
9371
|
|
@@ -9410,9 +9530,6 @@
|
|
9410
9530
|
var me = this;
|
9411
9531
|
var grid = me.options.grid;
|
9412
9532
|
var ctx = me.ctx;
|
9413
|
-
var chart = me.chart;
|
9414
|
-
var borderOpts = grid.setContext(me.getContext());
|
9415
|
-
var axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;
|
9416
9533
|
|
9417
9534
|
var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));
|
9418
9535
|
|
@@ -9465,33 +9582,43 @@
|
|
9465
9582
|
}
|
9466
9583
|
}
|
9467
9584
|
}
|
9585
|
+
}
|
9586
|
+
}, {
|
9587
|
+
key: "drawBorder",
|
9588
|
+
value: function drawBorder() {
|
9589
|
+
var me = this;
|
9590
|
+
var chart = me.chart,
|
9591
|
+
ctx = me.ctx,
|
9592
|
+
grid = me.options.grid;
|
9593
|
+
var borderOpts = grid.setContext(me.getContext());
|
9594
|
+
var axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;
|
9468
9595
|
|
9469
|
-
if (axisWidth) {
|
9470
|
-
|
9471
|
-
|
9472
|
-
var x1, x2, y1, y2;
|
9596
|
+
if (!axisWidth) {
|
9597
|
+
return;
|
9598
|
+
}
|
9473
9599
|
|
9474
|
-
|
9475
|
-
|
9476
|
-
|
9477
|
-
y1 = y2 = borderValue;
|
9478
|
-
} else {
|
9479
|
-
y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;
|
9480
|
-
y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;
|
9481
|
-
x1 = x2 = borderValue;
|
9482
|
-
}
|
9600
|
+
var lastLineWidth = grid.setContext(me.getContext(0)).lineWidth;
|
9601
|
+
var borderValue = me._borderValue;
|
9602
|
+
var x1, x2, y1, y2;
|
9483
9603
|
|
9484
|
-
|
9485
|
-
|
9486
|
-
|
9487
|
-
|
9488
|
-
|
9489
|
-
|
9490
|
-
|
9491
|
-
|
9492
|
-
color: borderOpts.borderColor
|
9493
|
-
});
|
9604
|
+
if (me.isHorizontal()) {
|
9605
|
+
x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2;
|
9606
|
+
x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;
|
9607
|
+
y1 = y2 = borderValue;
|
9608
|
+
} else {
|
9609
|
+
y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;
|
9610
|
+
y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;
|
9611
|
+
x1 = x2 = borderValue;
|
9494
9612
|
}
|
9613
|
+
|
9614
|
+
ctx.save();
|
9615
|
+
ctx.lineWidth = borderOpts.borderWidth;
|
9616
|
+
ctx.strokeStyle = borderOpts.borderColor;
|
9617
|
+
ctx.beginPath();
|
9618
|
+
ctx.moveTo(x1, y1);
|
9619
|
+
ctx.lineTo(x2, y2);
|
9620
|
+
ctx.stroke();
|
9621
|
+
ctx.restore();
|
9495
9622
|
}
|
9496
9623
|
}, {
|
9497
9624
|
key: "drawLabels",
|
@@ -9519,6 +9646,12 @@
|
|
9519
9646
|
var item = items[i];
|
9520
9647
|
var tickFont = item.font;
|
9521
9648
|
var label = item.label;
|
9649
|
+
|
9650
|
+
if (item.backdrop) {
|
9651
|
+
ctx.fillStyle = item.backdrop.color;
|
9652
|
+
ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);
|
9653
|
+
}
|
9654
|
+
|
9522
9655
|
var y = item.textOffset;
|
9523
9656
|
renderText(ctx, label, 0, y, tickFont, item);
|
9524
9657
|
}
|
@@ -9581,6 +9714,7 @@
|
|
9581
9714
|
|
9582
9715
|
me.drawBackground();
|
9583
9716
|
me.drawGrid(chartArea);
|
9717
|
+
me.drawBorder();
|
9584
9718
|
me.drawTitle();
|
9585
9719
|
me.drawLabels(chartArea);
|
9586
9720
|
}
|
@@ -9592,7 +9726,7 @@
|
|
9592
9726
|
var tz = opts.ticks && opts.ticks.z || 0;
|
9593
9727
|
var gz = opts.grid && opts.grid.z || 0;
|
9594
9728
|
|
9595
|
-
if (!me._isVisible() ||
|
9729
|
+
if (!me._isVisible() || me.draw !== Scale.prototype.draw) {
|
9596
9730
|
return [{
|
9597
9731
|
z: tz,
|
9598
9732
|
draw: function draw(chartArea) {
|
@@ -9608,6 +9742,11 @@
|
|
9608
9742
|
me.drawGrid(chartArea);
|
9609
9743
|
me.drawTitle();
|
9610
9744
|
}
|
9745
|
+
}, {
|
9746
|
+
z: gz + 1,
|
9747
|
+
draw: function draw() {
|
9748
|
+
me.drawBorder();
|
9749
|
+
}
|
9611
9750
|
}, {
|
9612
9751
|
z: tz,
|
9613
9752
|
draw: function draw(chartArea) {
|
@@ -9640,6 +9779,15 @@
|
|
9640
9779
|
var opts = this.options.ticks.setContext(this.getContext(index));
|
9641
9780
|
return toFont(opts.font);
|
9642
9781
|
}
|
9782
|
+
}, {
|
9783
|
+
key: "_maxDigits",
|
9784
|
+
value: function _maxDigits() {
|
9785
|
+
var me = this;
|
9786
|
+
|
9787
|
+
var fontSize = me._resolveTickFontOptions(0).lineHeight;
|
9788
|
+
|
9789
|
+
return me.isHorizontal() ? me.width / fontSize / 0.7 : me.height / fontSize;
|
9790
|
+
}
|
9643
9791
|
}]);
|
9644
9792
|
|
9645
9793
|
return Scale;
|
@@ -9965,12 +10113,12 @@
|
|
9965
10113
|
value: function _notify(descriptors, chart, hook, args) {
|
9966
10114
|
args = args || {};
|
9967
10115
|
|
9968
|
-
var
|
9969
|
-
|
10116
|
+
var _iterator4 = _createForOfIteratorHelper(descriptors),
|
10117
|
+
_step4;
|
9970
10118
|
|
9971
10119
|
try {
|
9972
|
-
for (
|
9973
|
-
var descriptor =
|
10120
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
10121
|
+
var descriptor = _step4.value;
|
9974
10122
|
var plugin = descriptor.plugin;
|
9975
10123
|
var method = plugin[hook];
|
9976
10124
|
var params = [chart, args, descriptor.options];
|
@@ -9980,9 +10128,9 @@
|
|
9980
10128
|
}
|
9981
10129
|
}
|
9982
10130
|
} catch (err) {
|
9983
|
-
|
10131
|
+
_iterator4.e(err);
|
9984
10132
|
} finally {
|
9985
|
-
|
10133
|
+
_iterator4.f();
|
9986
10134
|
}
|
9987
10135
|
|
9988
10136
|
return true;
|
@@ -10189,14 +10337,16 @@
|
|
10189
10337
|
options.scales = mergeScaleConfig(config, options);
|
10190
10338
|
}
|
10191
10339
|
|
10192
|
-
function
|
10193
|
-
|
10194
|
-
var data = config.data = config.data || {
|
10195
|
-
datasets: [],
|
10196
|
-
labels: []
|
10197
|
-
};
|
10340
|
+
function initData(data) {
|
10341
|
+
data = data || {};
|
10198
10342
|
data.datasets = data.datasets || [];
|
10199
10343
|
data.labels = data.labels || [];
|
10344
|
+
return data;
|
10345
|
+
}
|
10346
|
+
|
10347
|
+
function initConfig(config) {
|
10348
|
+
config = config || {};
|
10349
|
+
config.data = initData(config.data);
|
10200
10350
|
initOptions(config);
|
10201
10351
|
return config;
|
10202
10352
|
}
|
@@ -10247,7 +10397,7 @@
|
|
10247
10397
|
return this._config.data;
|
10248
10398
|
},
|
10249
10399
|
set: function set(data) {
|
10250
|
-
this._config.data = data;
|
10400
|
+
this._config.data = initData(data);
|
10251
10401
|
}
|
10252
10402
|
}, {
|
10253
10403
|
key: "options",
|
@@ -10396,18 +10546,18 @@
|
|
10396
10546
|
options = _attachContext(resolver, context, subResolver);
|
10397
10547
|
}
|
10398
10548
|
|
10399
|
-
var
|
10400
|
-
|
10549
|
+
var _iterator5 = _createForOfIteratorHelper(names),
|
10550
|
+
_step5;
|
10401
10551
|
|
10402
10552
|
try {
|
10403
|
-
for (
|
10404
|
-
var prop =
|
10553
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
10554
|
+
var prop = _step5.value;
|
10405
10555
|
result[prop] = options[prop];
|
10406
10556
|
}
|
10407
10557
|
} catch (err) {
|
10408
|
-
|
10558
|
+
_iterator5.e(err);
|
10409
10559
|
} finally {
|
10410
|
-
|
10560
|
+
_iterator5.f();
|
10411
10561
|
}
|
10412
10562
|
|
10413
10563
|
return result;
|
@@ -10459,27 +10609,27 @@
|
|
10459
10609
|
isScriptable = _descriptors2.isScriptable,
|
10460
10610
|
isIndexable = _descriptors2.isIndexable;
|
10461
10611
|
|
10462
|
-
var
|
10463
|
-
|
10612
|
+
var _iterator6 = _createForOfIteratorHelper(names),
|
10613
|
+
_step6;
|
10464
10614
|
|
10465
10615
|
try {
|
10466
|
-
for (
|
10467
|
-
var prop =
|
10616
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
10617
|
+
var prop = _step6.value;
|
10468
10618
|
|
10469
10619
|
if (isScriptable(prop) && isFunction(proxy[prop]) || isIndexable(prop) && isArray(proxy[prop])) {
|
10470
10620
|
return true;
|
10471
10621
|
}
|
10472
10622
|
}
|
10473
10623
|
} catch (err) {
|
10474
|
-
|
10624
|
+
_iterator6.e(err);
|
10475
10625
|
} finally {
|
10476
|
-
|
10626
|
+
_iterator6.f();
|
10477
10627
|
}
|
10478
10628
|
|
10479
10629
|
return false;
|
10480
10630
|
}
|
10481
10631
|
|
10482
|
-
var version = "3.1
|
10632
|
+
var version = "3.2.1";
|
10483
10633
|
var KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];
|
10484
10634
|
|
10485
10635
|
function positionIsHorizontal(position, axis) {
|
@@ -10917,6 +11067,13 @@
|
|
10917
11067
|
var animsDisabled = me._animationsDisabled = !me.options.animation;
|
10918
11068
|
me.ensureScalesHaveIDs();
|
10919
11069
|
me.buildOrUpdateScales();
|
11070
|
+
var existingEvents = new Set(Object.keys(me._listeners));
|
11071
|
+
var newEvents = new Set(me.options.events);
|
11072
|
+
|
11073
|
+
if (!setsEqual(existingEvents, newEvents)) {
|
11074
|
+
me.unbindEvents();
|
11075
|
+
me.bindEvents();
|
11076
|
+
}
|
10920
11077
|
|
10921
11078
|
me._plugins.invalidate();
|
10922
11079
|
|
@@ -11408,7 +11565,7 @@
|
|
11408
11565
|
return;
|
11409
11566
|
}
|
11410
11567
|
|
11411
|
-
|
11568
|
+
me._listeners = {};
|
11412
11569
|
each(listeners, function (listener, type) {
|
11413
11570
|
me.platform.removeEventListener(me, type, listener);
|
11414
11571
|
});
|
@@ -11950,23 +12107,30 @@
|
|
11950
12107
|
return _steppedLineTo;
|
11951
12108
|
}
|
11952
12109
|
|
11953
|
-
if (options.tension) {
|
12110
|
+
if (options.tension || options.cubicInterpolationMode === 'monotone') {
|
11954
12111
|
return _bezierCurveTo;
|
11955
12112
|
}
|
11956
12113
|
|
11957
12114
|
return lineTo;
|
11958
12115
|
}
|
11959
12116
|
|
11960
|
-
function pathVars(points, segment
|
11961
|
-
params =
|
12117
|
+
function pathVars(points, segment) {
|
12118
|
+
var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
11962
12119
|
var count = points.length;
|
11963
|
-
var start =
|
11964
|
-
|
12120
|
+
var _params$start = params.start,
|
12121
|
+
paramsStart = _params$start === void 0 ? 0 : _params$start,
|
12122
|
+
_params$end = params.end,
|
12123
|
+
paramsEnd = _params$end === void 0 ? count - 1 : _params$end;
|
12124
|
+
var segmentStart = segment.start,
|
12125
|
+
segmentEnd = segment.end;
|
12126
|
+
var start = Math.max(paramsStart, segmentStart);
|
12127
|
+
var end = Math.min(paramsEnd, segmentEnd);
|
12128
|
+
var outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;
|
11965
12129
|
return {
|
11966
12130
|
count: count,
|
11967
12131
|
start: start,
|
11968
12132
|
loop: segment.loop,
|
11969
|
-
ilen: end < start ? count + end - start : end - start
|
12133
|
+
ilen: end < start && !outside ? count + end - start : end - start
|
11970
12134
|
};
|
11971
12135
|
}
|
11972
12136
|
|
@@ -12082,7 +12246,7 @@
|
|
12082
12246
|
function _getSegmentMethod(line) {
|
12083
12247
|
var opts = line.options;
|
12084
12248
|
var borderDash = opts.borderDash && opts.borderDash.length;
|
12085
|
-
var useFastPath = !line._decimated && !line._loop && !opts.tension && !opts.stepped && !borderDash;
|
12249
|
+
var useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;
|
12086
12250
|
return useFastPath ? fastPathSegment : pathSegment;
|
12087
12251
|
}
|
12088
12252
|
|
@@ -12091,7 +12255,7 @@
|
|
12091
12255
|
return _steppedInterpolation;
|
12092
12256
|
}
|
12093
12257
|
|
12094
|
-
if (options.tension) {
|
12258
|
+
if (options.tension || options.cubicInterpolationMode === 'monotone') {
|
12095
12259
|
return _bezierInterpolation;
|
12096
12260
|
}
|
12097
12261
|
|
@@ -12119,12 +12283,12 @@
|
|
12119
12283
|
|
12120
12284
|
var segmentMethod = _getSegmentMethod(line);
|
12121
12285
|
|
12122
|
-
var
|
12123
|
-
|
12286
|
+
var _iterator7 = _createForOfIteratorHelper(segments),
|
12287
|
+
_step7;
|
12124
12288
|
|
12125
12289
|
try {
|
12126
|
-
for (
|
12127
|
-
var segment =
|
12290
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
12291
|
+
var segment = _step7.value;
|
12128
12292
|
setStyle(ctx, options, segment.style);
|
12129
12293
|
ctx.beginPath();
|
12130
12294
|
|
@@ -12138,9 +12302,9 @@
|
|
12138
12302
|
ctx.stroke();
|
12139
12303
|
}
|
12140
12304
|
} catch (err) {
|
12141
|
-
|
12305
|
+
_iterator7.e(err);
|
12142
12306
|
} finally {
|
12143
|
-
|
12307
|
+
_iterator7.f();
|
12144
12308
|
}
|
12145
12309
|
}
|
12146
12310
|
|
@@ -12188,7 +12352,7 @@
|
|
12188
12352
|
var me = this;
|
12189
12353
|
var options = me.options;
|
12190
12354
|
|
12191
|
-
if (options.tension && !options.stepped && !me._pointsUpdated) {
|
12355
|
+
if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !me._pointsUpdated) {
|
12192
12356
|
var loop = options.spanGaps ? me._loop : me._fullLoop;
|
12193
12357
|
|
12194
12358
|
_updateBezierControlPoints(me._points, options, chartArea, loop);
|
@@ -12293,21 +12457,21 @@
|
|
12293
12457
|
start = start || 0;
|
12294
12458
|
count = count || me.points.length - start;
|
12295
12459
|
|
12296
|
-
var
|
12297
|
-
|
12460
|
+
var _iterator8 = _createForOfIteratorHelper(segments),
|
12461
|
+
_step8;
|
12298
12462
|
|
12299
12463
|
try {
|
12300
|
-
for (
|
12301
|
-
var segment =
|
12464
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
12465
|
+
var segment = _step8.value;
|
12302
12466
|
loop &= segmentMethod(ctx, me, segment, {
|
12303
12467
|
start: start,
|
12304
12468
|
end: start + count - 1
|
12305
12469
|
});
|
12306
12470
|
}
|
12307
12471
|
} catch (err) {
|
12308
|
-
|
12472
|
+
_iterator8.e(err);
|
12309
12473
|
} finally {
|
12310
|
-
|
12474
|
+
_iterator8.f();
|
12311
12475
|
}
|
12312
12476
|
|
12313
12477
|
return !!loop;
|
@@ -12560,15 +12724,19 @@
|
|
12560
12724
|
}
|
12561
12725
|
|
12562
12726
|
function parseBorderRadius(bar, maxW, maxH) {
|
12727
|
+
var _bar$getProps2 = bar.getProps(['enableBorderRadius']),
|
12728
|
+
enableBorderRadius = _bar$getProps2.enableBorderRadius;
|
12729
|
+
|
12563
12730
|
var value = bar.options.borderRadius;
|
12564
12731
|
var o = toTRBLCorners(value);
|
12565
12732
|
var maxR = Math.min(maxW, maxH);
|
12566
12733
|
var skip = parseBorderSkipped(bar);
|
12734
|
+
var enableBorder = enableBorderRadius || isObject(value);
|
12567
12735
|
return {
|
12568
|
-
topLeft: skipOrLimit(skip.top || skip.left, o.topLeft, 0, maxR),
|
12569
|
-
topRight: skipOrLimit(skip.top || skip.right, o.topRight, 0, maxR),
|
12570
|
-
bottomLeft: skipOrLimit(skip.bottom || skip.left, o.bottomLeft, 0, maxR),
|
12571
|
-
bottomRight: skipOrLimit(skip.bottom || skip.right, o.bottomRight, 0, maxR)
|
12736
|
+
topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),
|
12737
|
+
topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),
|
12738
|
+
bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),
|
12739
|
+
bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)
|
12572
12740
|
};
|
12573
12741
|
}
|
12574
12742
|
|
@@ -12712,6 +12880,7 @@
|
|
12712
12880
|
borderSkipped: 'start',
|
12713
12881
|
borderWidth: 0,
|
12714
12882
|
borderRadius: 0,
|
12883
|
+
enableBorderRadius: true,
|
12715
12884
|
pointStyle: undefined
|
12716
12885
|
};
|
12717
12886
|
BarElement.defaultRoutes = {
|
@@ -12842,16 +13011,20 @@
|
|
12842
13011
|
return decimated;
|
12843
13012
|
}
|
12844
13013
|
|
13014
|
+
function cleanDecimatedDataset(dataset) {
|
13015
|
+
if (dataset._decimated) {
|
13016
|
+
var data = dataset._data;
|
13017
|
+
delete dataset._decimated;
|
13018
|
+
delete dataset._data;
|
13019
|
+
Object.defineProperty(dataset, 'data', {
|
13020
|
+
value: data
|
13021
|
+
});
|
13022
|
+
}
|
13023
|
+
}
|
13024
|
+
|
12845
13025
|
function cleanDecimatedData(chart) {
|
12846
13026
|
chart.data.datasets.forEach(function (dataset) {
|
12847
|
-
|
12848
|
-
var data = dataset._data;
|
12849
|
-
delete dataset._decimated;
|
12850
|
-
delete dataset._data;
|
12851
|
-
Object.defineProperty(dataset, 'data', {
|
12852
|
-
value: data
|
12853
|
-
});
|
12854
|
-
}
|
13027
|
+
cleanDecimatedDataset(dataset);
|
12855
13028
|
});
|
12856
13029
|
}
|
12857
13030
|
|
@@ -12925,6 +13098,7 @@
|
|
12925
13098
|
count = _getStartAndCountOfVi2.count;
|
12926
13099
|
|
12927
13100
|
if (count <= 4 * availableWidth) {
|
13101
|
+
cleanDecimatedDataset(dataset);
|
12928
13102
|
return;
|
12929
13103
|
}
|
12930
13104
|
|
@@ -13396,12 +13570,12 @@
|
|
13396
13570
|
var tpoints = target.points;
|
13397
13571
|
var parts = [];
|
13398
13572
|
|
13399
|
-
var
|
13400
|
-
|
13573
|
+
var _iterator9 = _createForOfIteratorHelper(segments),
|
13574
|
+
_step9;
|
13401
13575
|
|
13402
13576
|
try {
|
13403
|
-
for (
|
13404
|
-
var segment =
|
13577
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
13578
|
+
var segment = _step9.value;
|
13405
13579
|
var bounds = getBounds(property, points[segment.start], points[segment.end], segment.loop);
|
13406
13580
|
|
13407
13581
|
if (!target.segments) {
|
@@ -13416,22 +13590,22 @@
|
|
13416
13590
|
|
13417
13591
|
var targetSegments = _boundSegments(target, bounds);
|
13418
13592
|
|
13419
|
-
var
|
13420
|
-
|
13593
|
+
var _iterator10 = _createForOfIteratorHelper(targetSegments),
|
13594
|
+
_step10;
|
13421
13595
|
|
13422
13596
|
try {
|
13423
|
-
for (
|
13424
|
-
var tgt =
|
13597
|
+
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
|
13598
|
+
var tgt = _step10.value;
|
13425
13599
|
var subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);
|
13426
13600
|
|
13427
13601
|
var fillSources = _boundSegment(segment, points, subBounds);
|
13428
13602
|
|
13429
|
-
var
|
13430
|
-
|
13603
|
+
var _iterator11 = _createForOfIteratorHelper(fillSources),
|
13604
|
+
_step11;
|
13431
13605
|
|
13432
13606
|
try {
|
13433
|
-
for (
|
13434
|
-
var fillSource =
|
13607
|
+
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
|
13608
|
+
var fillSource = _step11.value;
|
13435
13609
|
parts.push({
|
13436
13610
|
source: fillSource,
|
13437
13611
|
target: tgt,
|
@@ -13440,21 +13614,21 @@
|
|
13440
13614
|
});
|
13441
13615
|
}
|
13442
13616
|
} catch (err) {
|
13443
|
-
|
13617
|
+
_iterator11.e(err);
|
13444
13618
|
} finally {
|
13445
|
-
|
13619
|
+
_iterator11.f();
|
13446
13620
|
}
|
13447
13621
|
}
|
13448
13622
|
} catch (err) {
|
13449
|
-
|
13623
|
+
_iterator10.e(err);
|
13450
13624
|
} finally {
|
13451
|
-
|
13625
|
+
_iterator10.f();
|
13452
13626
|
}
|
13453
13627
|
}
|
13454
13628
|
} catch (err) {
|
13455
|
-
|
13629
|
+
_iterator9.e(err);
|
13456
13630
|
} finally {
|
13457
|
-
|
13631
|
+
_iterator9.f();
|
13458
13632
|
}
|
13459
13633
|
|
13460
13634
|
return parts;
|
@@ -13494,16 +13668,16 @@
|
|
13494
13668
|
|
13495
13669
|
var segments = _segments(line, target, property);
|
13496
13670
|
|
13497
|
-
var
|
13498
|
-
|
13671
|
+
var _iterator12 = _createForOfIteratorHelper(segments),
|
13672
|
+
_step12;
|
13499
13673
|
|
13500
13674
|
try {
|
13501
|
-
for (
|
13502
|
-
var
|
13503
|
-
src =
|
13504
|
-
tgt =
|
13505
|
-
start =
|
13506
|
-
end =
|
13675
|
+
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
|
13676
|
+
var _step12$value = _step12.value,
|
13677
|
+
src = _step12$value.source,
|
13678
|
+
tgt = _step12$value.target,
|
13679
|
+
start = _step12$value.start,
|
13680
|
+
end = _step12$value.end;
|
13507
13681
|
var _src$style = src.style;
|
13508
13682
|
_src$style = _src$style === void 0 ? {} : _src$style;
|
13509
13683
|
var _src$style$background = _src$style.backgroundColor,
|
@@ -13535,9 +13709,9 @@
|
|
13535
13709
|
ctx.restore();
|
13536
13710
|
}
|
13537
13711
|
} catch (err) {
|
13538
|
-
|
13712
|
+
_iterator12.e(err);
|
13539
13713
|
} finally {
|
13540
|
-
|
13714
|
+
_iterator12.f();
|
13541
13715
|
}
|
13542
13716
|
}
|
13543
13717
|
|
@@ -13548,7 +13722,7 @@
|
|
13548
13722
|
below = cfg.below,
|
13549
13723
|
area = cfg.area,
|
13550
13724
|
scale = cfg.scale;
|
13551
|
-
var property = line._loop ? 'angle' :
|
13725
|
+
var property = line._loop ? 'angle' : cfg.axis;
|
13552
13726
|
ctx.save();
|
13553
13727
|
|
13554
13728
|
if (property === 'x' && below !== above) {
|
@@ -13582,7 +13756,8 @@
|
|
13582
13756
|
function drawfill(ctx, source, area) {
|
13583
13757
|
var target = getTarget(source);
|
13584
13758
|
var line = source.line,
|
13585
|
-
scale = source.scale
|
13759
|
+
scale = source.scale,
|
13760
|
+
axis = source.axis;
|
13586
13761
|
var lineOpts = line.options;
|
13587
13762
|
var fillOption = lineOpts.fill;
|
13588
13763
|
var color = lineOpts.backgroundColor;
|
@@ -13601,7 +13776,8 @@
|
|
13601
13776
|
above: above,
|
13602
13777
|
below: below,
|
13603
13778
|
area: area,
|
13604
|
-
scale: scale
|
13779
|
+
scale: scale,
|
13780
|
+
axis: axis
|
13605
13781
|
});
|
13606
13782
|
unclipArea(ctx);
|
13607
13783
|
}
|
@@ -13625,6 +13801,7 @@
|
|
13625
13801
|
index: i,
|
13626
13802
|
fill: decodeFill(line, i, count),
|
13627
13803
|
chart: chart,
|
13804
|
+
axis: meta.controller.options.indexAxis,
|
13628
13805
|
scale: meta.vScale,
|
13629
13806
|
line: line
|
13630
13807
|
};
|
@@ -13644,19 +13821,37 @@
|
|
13644
13821
|
source.fill = resolveTarget(sources, i, options.propagate);
|
13645
13822
|
}
|
13646
13823
|
},
|
13647
|
-
|
13824
|
+
beforeDraw: function beforeDraw(chart, _args, options) {
|
13825
|
+
var draw = options.drawTime === 'beforeDraw';
|
13648
13826
|
var metasets = chart.getSortedVisibleDatasetMetas();
|
13649
13827
|
var area = chart.chartArea;
|
13650
13828
|
|
13651
13829
|
for (var i = metasets.length - 1; i >= 0; --i) {
|
13652
13830
|
var source = metasets[i].$filler;
|
13653
13831
|
|
13654
|
-
if (source) {
|
13655
|
-
|
13832
|
+
if (!source) {
|
13833
|
+
continue;
|
13834
|
+
}
|
13656
13835
|
|
13657
|
-
|
13658
|
-
|
13659
|
-
|
13836
|
+
source.line.updateControlPoints(area);
|
13837
|
+
|
13838
|
+
if (draw) {
|
13839
|
+
drawfill(chart.ctx, source, area);
|
13840
|
+
}
|
13841
|
+
}
|
13842
|
+
},
|
13843
|
+
beforeDatasetsDraw: function beforeDatasetsDraw(chart, _args, options) {
|
13844
|
+
if (options.drawTime !== 'beforeDatasetsDraw') {
|
13845
|
+
return;
|
13846
|
+
}
|
13847
|
+
|
13848
|
+
var metasets = chart.getSortedVisibleDatasetMetas();
|
13849
|
+
|
13850
|
+
for (var i = metasets.length - 1; i >= 0; --i) {
|
13851
|
+
var source = metasets[i].$filler;
|
13852
|
+
|
13853
|
+
if (source) {
|
13854
|
+
drawfill(chart.ctx, source, chart.chartArea);
|
13660
13855
|
}
|
13661
13856
|
}
|
13662
13857
|
},
|
@@ -13926,12 +14121,12 @@
|
|
13926
14121
|
|
13927
14122
|
var left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);
|
13928
14123
|
|
13929
|
-
var
|
13930
|
-
|
14124
|
+
var _iterator13 = _createForOfIteratorHelper(hitboxes),
|
14125
|
+
_step13;
|
13931
14126
|
|
13932
14127
|
try {
|
13933
|
-
for (
|
13934
|
-
var hitbox =
|
14128
|
+
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
|
14129
|
+
var hitbox = _step13.value;
|
13935
14130
|
|
13936
14131
|
if (row !== hitbox.row) {
|
13937
14132
|
row = hitbox.row;
|
@@ -13943,21 +14138,21 @@
|
|
13943
14138
|
left += hitbox.width + padding;
|
13944
14139
|
}
|
13945
14140
|
} catch (err) {
|
13946
|
-
|
14141
|
+
_iterator13.e(err);
|
13947
14142
|
} finally {
|
13948
|
-
|
14143
|
+
_iterator13.f();
|
13949
14144
|
}
|
13950
14145
|
} else {
|
13951
14146
|
var col = 0;
|
13952
14147
|
|
13953
14148
|
var top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);
|
13954
14149
|
|
13955
|
-
var
|
13956
|
-
|
14150
|
+
var _iterator14 = _createForOfIteratorHelper(hitboxes),
|
14151
|
+
_step14;
|
13957
14152
|
|
13958
14153
|
try {
|
13959
|
-
for (
|
13960
|
-
var _hitbox =
|
14154
|
+
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
|
14155
|
+
var _hitbox = _step14.value;
|
13961
14156
|
|
13962
14157
|
if (_hitbox.col !== col) {
|
13963
14158
|
col = _hitbox.col;
|
@@ -13969,9 +14164,9 @@
|
|
13969
14164
|
top += _hitbox.height + padding;
|
13970
14165
|
}
|
13971
14166
|
} catch (err) {
|
13972
|
-
|
14167
|
+
_iterator14.e(err);
|
13973
14168
|
} finally {
|
13974
|
-
|
14169
|
+
_iterator14.f();
|
13975
14170
|
}
|
13976
14171
|
}
|
13977
14172
|
}
|
@@ -14571,6 +14766,10 @@
|
|
14571
14766
|
};
|
14572
14767
|
},
|
14573
14768
|
nearest: function nearest(items, eventPosition) {
|
14769
|
+
if (!items.length) {
|
14770
|
+
return false;
|
14771
|
+
}
|
14772
|
+
|
14574
14773
|
var x = eventPosition.x;
|
14575
14774
|
var y = eventPosition.y;
|
14576
14775
|
var minDistance = Number.POSITIVE_INFINITY;
|
@@ -15520,9 +15719,11 @@
|
|
15520
15719
|
}, {
|
15521
15720
|
key: "_positionChanged",
|
15522
15721
|
value: function _positionChanged(active, e) {
|
15523
|
-
var
|
15524
|
-
|
15525
|
-
|
15722
|
+
var caretX = this.caretX,
|
15723
|
+
caretY = this.caretY,
|
15724
|
+
options = this.options;
|
15725
|
+
var position = positioners[options.position].call(this, active, e);
|
15726
|
+
return position !== false && (caretX !== position.x || caretY !== position.y);
|
15526
15727
|
}
|
15527
15728
|
}]);
|
15528
15729
|
|
@@ -15901,7 +16102,9 @@
|
|
15901
16102
|
max = generationOptions.max,
|
15902
16103
|
precision = generationOptions.precision,
|
15903
16104
|
count = generationOptions.count,
|
15904
|
-
maxTicks = generationOptions.maxTicks
|
16105
|
+
maxTicks = generationOptions.maxTicks,
|
16106
|
+
maxDigits = generationOptions.maxDigits,
|
16107
|
+
horizontal = generationOptions.horizontal;
|
15905
16108
|
var unit = step || 1;
|
15906
16109
|
var maxSpaces = maxTicks - 1;
|
15907
16110
|
var rmin = dataRange.min,
|
@@ -15909,6 +16112,7 @@
|
|
15909
16112
|
var minDefined = !isNullOrUndef(min);
|
15910
16113
|
var maxDefined = !isNullOrUndef(max);
|
15911
16114
|
var countDefined = !isNullOrUndef(count);
|
16115
|
+
var minSpacing = (rmax - rmin) / maxDigits;
|
15912
16116
|
var spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;
|
15913
16117
|
var factor, niceMin, niceMax, numSpaces;
|
15914
16118
|
|
@@ -15968,7 +16172,7 @@
|
|
15968
16172
|
j++;
|
15969
16173
|
}
|
15970
16174
|
|
15971
|
-
if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min,
|
16175
|
+
if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, minSpacing * (horizontal ? ('' + min).length : 1))) {
|
15972
16176
|
j++;
|
15973
16177
|
}
|
15974
16178
|
}
|
@@ -15980,7 +16184,7 @@
|
|
15980
16184
|
}
|
15981
16185
|
|
15982
16186
|
if (maxDefined) {
|
15983
|
-
if (almostEquals(ticks[ticks.length - 1].value, max,
|
16187
|
+
if (almostEquals(ticks[ticks.length - 1].value, max, minSpacing * (horizontal ? ('' + max).length : 1))) {
|
15984
16188
|
ticks[ticks.length - 1].value = max;
|
15985
16189
|
} else {
|
15986
16190
|
ticks.push({
|
@@ -16114,9 +16318,12 @@
|
|
16114
16318
|
max: opts.max,
|
16115
16319
|
precision: tickOpts.precision,
|
16116
16320
|
step: tickOpts.stepSize,
|
16117
|
-
count: tickOpts.count
|
16321
|
+
count: tickOpts.count,
|
16322
|
+
maxDigits: me._maxDigits(),
|
16323
|
+
horizontal: me.isHorizontal()
|
16118
16324
|
};
|
16119
|
-
var
|
16325
|
+
var dataRange = me._range || me;
|
16326
|
+
var ticks = generateTicks$1(numericGeneratorOptions, dataRange);
|
16120
16327
|
|
16121
16328
|
if (opts.bounds === 'ticks') {
|
16122
16329
|
_setMinAndMaxByKey(ticks, me, 'value');
|
@@ -16896,6 +17103,9 @@
|
|
16896
17103
|
ctx.restore();
|
16897
17104
|
}
|
16898
17105
|
}
|
17106
|
+
}, {
|
17107
|
+
key: "drawBorder",
|
17108
|
+
value: function drawBorder() {}
|
16899
17109
|
}, {
|
16900
17110
|
key: "drawLabels",
|
16901
17111
|
value: function drawLabels() {
|
@@ -16962,8 +17172,6 @@
|
|
16962
17172
|
startAngle: 0,
|
16963
17173
|
ticks: {
|
16964
17174
|
showLabelBackdrop: true,
|
16965
|
-
backdropColor: 'rgba(255,255,255,0.75)',
|
16966
|
-
backdropPadding: 2,
|
16967
17175
|
callback: Ticks.formatters.numeric
|
16968
17176
|
},
|
16969
17177
|
pointLabels: {
|
@@ -17047,10 +17255,10 @@
|
|
17047
17255
|
}
|
17048
17256
|
|
17049
17257
|
var adapter = scale._adapter;
|
17050
|
-
var
|
17051
|
-
|
17052
|
-
round =
|
17053
|
-
isoWeekday =
|
17258
|
+
var _scale$_parseOpts = scale._parseOpts,
|
17259
|
+
parser = _scale$_parseOpts.parser,
|
17260
|
+
round = _scale$_parseOpts.round,
|
17261
|
+
isoWeekday = _scale$_parseOpts.isoWeekday;
|
17054
17262
|
var value = input;
|
17055
17263
|
|
17056
17264
|
if (typeof parser === 'function') {
|
@@ -17175,6 +17383,7 @@
|
|
17175
17383
|
_this18._majorUnit = undefined;
|
17176
17384
|
_this18._offsets = {};
|
17177
17385
|
_this18._normalized = false;
|
17386
|
+
_this18._parseOpts = undefined;
|
17178
17387
|
return _this18;
|
17179
17388
|
}
|
17180
17389
|
|
@@ -17184,6 +17393,11 @@
|
|
17184
17393
|
var time = scaleOpts.time || (scaleOpts.time = {});
|
17185
17394
|
var adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);
|
17186
17395
|
mergeIf(time.displayFormats, adapter.formats());
|
17396
|
+
this._parseOpts = {
|
17397
|
+
parser: time.parser,
|
17398
|
+
round: time.round,
|
17399
|
+
isoWeekday: time.isoWeekday
|
17400
|
+
};
|
17187
17401
|
|
17188
17402
|
_get(_getPrototypeOf(TimeScale.prototype), "init", this).call(this, scaleOpts);
|
17189
17403
|
|
@@ -17766,8 +17980,8 @@
|
|
17766
17980
|
*
|
17767
17981
|
* @param {Date|Number} date - the date to be changed
|
17768
17982
|
* @param {Number} amount - the amount of days to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.
|
17769
|
-
* @returns {Date} the new date with the days added
|
17770
|
-
* @throws {TypeError} 2 arguments required
|
17983
|
+
* @returns {Date} - the new date with the days added
|
17984
|
+
* @throws {TypeError} - 2 arguments required
|
17771
17985
|
*
|
17772
17986
|
* @example
|
17773
17987
|
* // Add 10 days to 1 September 2014:
|
@@ -17831,7 +18045,7 @@
|
|
17831
18045
|
}
|
17832
18046
|
|
17833
18047
|
var dayOfMonth = date.getDate(); // The JS Date object supports date math by accepting out-of-bounds values for
|
17834
|
-
// month, day, etc. For example, new Date(2020,
|
18048
|
+
// month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and
|
17835
18049
|
// new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we
|
17836
18050
|
// want except that dates will wrap around the end of a month, meaning that
|
17837
18051
|
// new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So
|
@@ -17943,12 +18157,12 @@
|
|
17943
18157
|
*
|
17944
18158
|
* @example
|
17945
18159
|
* // The start of a week for 2 September 2014 11:55:00:
|
17946
|
-
*
|
18160
|
+
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))
|
17947
18161
|
* //=> Sun Aug 31 2014 00:00:00
|
17948
18162
|
*
|
17949
18163
|
* @example
|
17950
18164
|
* // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:
|
17951
|
-
*
|
18165
|
+
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })
|
17952
18166
|
* //=> Mon Sep 01 2014 00:00:00
|
17953
18167
|
*/
|
17954
18168
|
|
@@ -18891,6 +19105,36 @@
|
|
18891
19105
|
return result === 0 ? 0 : result;
|
18892
19106
|
}
|
18893
19107
|
|
19108
|
+
/**
|
19109
|
+
* @name startOfMinute
|
19110
|
+
* @category Minute Helpers
|
19111
|
+
* @summary Return the start of a minute for the given date.
|
19112
|
+
*
|
19113
|
+
* @description
|
19114
|
+
* Return the start of a minute for the given date.
|
19115
|
+
* The result will be in the local timezone.
|
19116
|
+
*
|
19117
|
+
* ### v2.0.0 breaking changes:
|
19118
|
+
*
|
19119
|
+
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
|
19120
|
+
*
|
19121
|
+
* @param {Date|Number} date - the original date
|
19122
|
+
* @returns {Date} the start of a minute
|
19123
|
+
* @throws {TypeError} 1 argument required
|
19124
|
+
*
|
19125
|
+
* @example
|
19126
|
+
* // The start of a minute for 1 December 2014 22:15:45.400:
|
19127
|
+
* const result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400))
|
19128
|
+
* //=> Mon Dec 01 2014 22:15:00
|
19129
|
+
*/
|
19130
|
+
|
19131
|
+
function startOfMinute(dirtyDate) {
|
19132
|
+
requiredArgs(1, arguments);
|
19133
|
+
var date = toDate(dirtyDate);
|
19134
|
+
date.setSeconds(0, 0);
|
19135
|
+
return date;
|
19136
|
+
}
|
19137
|
+
|
18894
19138
|
/**
|
18895
19139
|
* @name startOfQuarter
|
18896
19140
|
* @category Quarter Helpers
|
@@ -21121,7 +21365,7 @@
|
|
21121
21365
|
* | | ss | 00, 01, ..., 59 | |
|
21122
21366
|
* | Fraction of second | S | 0, 1, ..., 9 | |
|
21123
21367
|
* | | SS | 00, 01, ..., 99 | |
|
21124
|
-
* | | SSS | 000,
|
21368
|
+
* | | SSS | 000, 001, ..., 999 | |
|
21125
21369
|
* | | SSSS | ... | 3 |
|
21126
21370
|
* | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |
|
21127
21371
|
* | | XX | -0800, +0530, Z | |
|
@@ -23536,36 +23780,6 @@
|
|
23536
23780
|
return date;
|
23537
23781
|
}
|
23538
23782
|
|
23539
|
-
/**
|
23540
|
-
* @name startOfMinute
|
23541
|
-
* @category Minute Helpers
|
23542
|
-
* @summary Return the start of a minute for the given date.
|
23543
|
-
*
|
23544
|
-
* @description
|
23545
|
-
* Return the start of a minute for the given date.
|
23546
|
-
* The result will be in the local timezone.
|
23547
|
-
*
|
23548
|
-
* ### v2.0.0 breaking changes:
|
23549
|
-
*
|
23550
|
-
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
|
23551
|
-
*
|
23552
|
-
* @param {Date|Number} date - the original date
|
23553
|
-
* @returns {Date} the start of a minute
|
23554
|
-
* @throws {TypeError} 1 argument required
|
23555
|
-
*
|
23556
|
-
* @example
|
23557
|
-
* // The start of a minute for 1 December 2014 22:15:45.400:
|
23558
|
-
* const result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400))
|
23559
|
-
* //=> Mon Dec 01 2014 22:15:00
|
23560
|
-
*/
|
23561
|
-
|
23562
|
-
function startOfMinute(dirtyDate) {
|
23563
|
-
requiredArgs(1, arguments);
|
23564
|
-
var date = toDate(dirtyDate);
|
23565
|
-
date.setSeconds(0, 0);
|
23566
|
-
return date;
|
23567
|
-
}
|
23568
|
-
|
23569
23783
|
/**
|
23570
23784
|
* @name startOfSecond
|
23571
23785
|
* @category Second Helpers
|