highcharts-rails 5.0.10 → 5.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +48 -0
- data/app/assets/javascripts/highcharts.js +2395 -1517
- data/app/assets/javascripts/highcharts/highcharts-3d.js +212 -116
- data/app/assets/javascripts/highcharts/highcharts-more.js +17 -11
- data/app/assets/javascripts/highcharts/modules/accessibility.js +29 -16
- data/app/assets/javascripts/highcharts/modules/annotations.js +3 -4
- data/app/assets/javascripts/highcharts/modules/boost.js +392 -356
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +42 -17
- data/app/assets/javascripts/highcharts/modules/data.js +6 -6
- data/app/assets/javascripts/highcharts/modules/drilldown.js +54 -27
- data/app/assets/javascripts/highcharts/modules/exporting.js +125 -102
- data/app/assets/javascripts/highcharts/modules/funnel.js +17 -9
- data/app/assets/javascripts/highcharts/modules/grid-axis.js +1 -1
- data/app/assets/javascripts/highcharts/modules/heatmap.js +12 -2
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +12 -4
- data/app/assets/javascripts/highcharts/modules/overlapping-datalabels.js +1 -1
- data/app/assets/javascripts/highcharts/modules/series-label.js +1 -1
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +2 -2
- data/app/assets/javascripts/highcharts/modules/stock.js +182 -101
- data/app/assets/javascripts/highcharts/modules/treemap.js +4 -7
- data/app/assets/javascripts/highcharts/modules/xrange-series.js +1 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +1 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.11 (2017-05-04)
|
3
3
|
* Highcharts funnel module
|
4
4
|
*
|
5
5
|
* (c) 2010-2017 Torstein Honsi
|
@@ -28,6 +28,7 @@
|
|
28
28
|
var seriesType = Highcharts.seriesType,
|
29
29
|
seriesTypes = Highcharts.seriesTypes,
|
30
30
|
noop = Highcharts.noop,
|
31
|
+
pick = Highcharts.pick,
|
31
32
|
each = Highcharts.each;
|
32
33
|
|
33
34
|
|
@@ -115,8 +116,8 @@
|
|
115
116
|
neckWidth :
|
116
117
|
neckWidth + (width - neckWidth) * (1 - (y - top) / (height - neckHeight));
|
117
118
|
};
|
118
|
-
series.getX = function(y, half) {
|
119
|
-
return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? 2 * centerY - y : y) / 2) +
|
119
|
+
series.getX = function(y, half, point) {
|
120
|
+
return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? 2 * centerY - y : y) / 2) + point.labelDistance);
|
120
121
|
};
|
121
122
|
|
122
123
|
// Expose
|
@@ -250,8 +251,9 @@
|
|
250
251
|
* Extend the pie data label method
|
251
252
|
*/
|
252
253
|
drawDataLabels: function() {
|
253
|
-
var
|
254
|
-
|
254
|
+
var series = this,
|
255
|
+
data = series.data,
|
256
|
+
labelDistance = series.options.dataLabels.distance,
|
255
257
|
leftSide,
|
256
258
|
sign,
|
257
259
|
point,
|
@@ -262,7 +264,7 @@
|
|
262
264
|
// In the original pie label anticollision logic, the slots are distributed
|
263
265
|
// from one labelDistance above to one labelDistance below the pie. In funnels
|
264
266
|
// we don't want this.
|
265
|
-
|
267
|
+
series.center[2] -= 2 * labelDistance;
|
266
268
|
|
267
269
|
// Set the label position array for each point.
|
268
270
|
while (i--) {
|
@@ -270,15 +272,21 @@
|
|
270
272
|
leftSide = point.half;
|
271
273
|
sign = leftSide ? 1 : -1;
|
272
274
|
y = point.plotY;
|
273
|
-
|
275
|
+
point.labelDistance = pick(
|
276
|
+
point.options.dataLabels && point.options.dataLabels.distance,
|
277
|
+
labelDistance
|
278
|
+
);
|
279
|
+
|
280
|
+
series.maxLabelDistance = Math.max(point.labelDistance, series.maxLabelDistance || 0);
|
281
|
+
x = series.getX(y, leftSide, point);
|
274
282
|
|
275
283
|
// set the anchor point for data labels
|
276
284
|
point.labelPos = [
|
277
285
|
0, // first break of connector
|
278
286
|
y, // a/a
|
279
|
-
x + (labelDistance - 5) * sign, // second break, right outside point shape
|
287
|
+
x + (point.labelDistance - 5) * sign, // second break, right outside point shape
|
280
288
|
y, // a/a
|
281
|
-
x + labelDistance * sign, // landing point for connector
|
289
|
+
x + point.labelDistance * sign, // landing point for connector
|
282
290
|
y, // a/a
|
283
291
|
leftSide ? 'right' : 'left', // alignment
|
284
292
|
0 // center angle
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.11 (2017-05-04)
|
3
3
|
*
|
4
4
|
* (c) 2009-2017 Torstein Honsi
|
5
5
|
*
|
@@ -440,7 +440,7 @@
|
|
440
440
|
// When updating data classes, destroy old items and make sure new ones are created (#3207)
|
441
441
|
if (newOptions.dataClasses && legend.allItems) {
|
442
442
|
each(legend.allItems, function(item) {
|
443
|
-
if (item.isDataClass) {
|
443
|
+
if (item.isDataClass && item.legendGroup) {
|
444
444
|
item.legendGroup.destroy();
|
445
445
|
}
|
446
446
|
});
|
@@ -458,6 +458,16 @@
|
|
458
458
|
}
|
459
459
|
},
|
460
460
|
|
461
|
+
/**
|
462
|
+
* Extend basic axis remove by also removing the legend item.
|
463
|
+
*/
|
464
|
+
remove: function() {
|
465
|
+
if (this.legendItem) {
|
466
|
+
this.chart.legend.destroyItem(this);
|
467
|
+
}
|
468
|
+
Axis.prototype.remove.call(this);
|
469
|
+
},
|
470
|
+
|
461
471
|
/**
|
462
472
|
* Get the legend item symbols for data classes
|
463
473
|
*/
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.11 (2017-05-04)
|
3
3
|
* Client side exporting module
|
4
4
|
*
|
5
5
|
* (c) 2015 Torstein Honsi / Oystein Moseng
|
@@ -109,7 +109,6 @@
|
|
109
109
|
if (a.download !== undefined) {
|
110
110
|
a.href = dataURL;
|
111
111
|
a.download = filename; // HTML5 download attribute
|
112
|
-
a.target = '_blank';
|
113
112
|
doc.body.appendChild(a);
|
114
113
|
a.click();
|
115
114
|
doc.body.removeChild(a);
|
@@ -443,7 +442,16 @@
|
|
443
442
|
};
|
444
443
|
|
445
444
|
/**
|
446
|
-
*
|
445
|
+
* Exporting and offline-exporting modules required. Export a chart to an image
|
446
|
+
* locally in the user's browser.
|
447
|
+
*
|
448
|
+
* @param {Object} exportingOptions
|
449
|
+
* Exporting options, the same as in {@link
|
450
|
+
* Highcharts.Chart#exportChart}.
|
451
|
+
* @param {Options} chartOptions
|
452
|
+
* Additional chart options for the exported chart. For example a
|
453
|
+
* different background color can be added here, or `dataLabels`
|
454
|
+
* for export only.
|
447
455
|
*/
|
448
456
|
Highcharts.Chart.prototype.exportChartLocal = function(exportingOptions, chartOptions) {
|
449
457
|
var chart = this,
|
@@ -500,7 +508,7 @@
|
|
500
508
|
|
501
509
|
// Extend the default options to use the local exporter logic
|
502
510
|
merge(true, Highcharts.getOptions().exporting, {
|
503
|
-
libURL: 'https://code.highcharts.com/5.0.
|
511
|
+
libURL: 'https://code.highcharts.com/5.0.11/lib/',
|
504
512
|
buttons: {
|
505
513
|
contextButton: {
|
506
514
|
menuItems: [{
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.11 (2017-05-04)
|
3
3
|
* Solid angular gauge module
|
4
4
|
*
|
5
5
|
* (c) 2010-2017 Torstein Honsi
|
@@ -313,7 +313,7 @@
|
|
313
313
|
}
|
314
314
|
} else {
|
315
315
|
point.graphic = renderer.arc(shapeArgs)
|
316
|
-
.addClass(
|
316
|
+
.addClass(point.getClassName(), true)
|
317
317
|
.attr({
|
318
318
|
fill: toColor,
|
319
319
|
'sweep-flag': 0
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.11 (2017-05-04)
|
3
3
|
* Highstock as a plugin for Highcharts
|
4
4
|
*
|
5
5
|
* (c) 2017 Torstein Honsi
|
@@ -687,37 +687,6 @@
|
|
687
687
|
}
|
688
688
|
});
|
689
689
|
|
690
|
-
|
691
|
-
|
692
|
-
/**
|
693
|
-
* Extend getGraphPath by identifying gaps in the ordinal data so that we can draw a gap in the
|
694
|
-
* line or area
|
695
|
-
*/
|
696
|
-
Series.prototype.gappedPath = function() {
|
697
|
-
var gapSize = this.options.gapSize,
|
698
|
-
points = this.points.slice(),
|
699
|
-
i = points.length - 1;
|
700
|
-
|
701
|
-
if (gapSize && i > 0) { // #5008
|
702
|
-
|
703
|
-
// extension for ordinal breaks
|
704
|
-
while (i--) {
|
705
|
-
if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {
|
706
|
-
points.splice( // insert after this one
|
707
|
-
i + 1,
|
708
|
-
0, {
|
709
|
-
isNull: true
|
710
|
-
}
|
711
|
-
);
|
712
|
-
}
|
713
|
-
}
|
714
|
-
}
|
715
|
-
|
716
|
-
// Call base method
|
717
|
-
//return proceed.call(this, points, a, b);
|
718
|
-
return this.getGraphPath(points);
|
719
|
-
};
|
720
|
-
|
721
690
|
/* ****************************************************************************
|
722
691
|
* End ordinal axis logic *
|
723
692
|
*****************************************************************************/
|
@@ -879,17 +848,14 @@
|
|
879
848
|
length = 0,
|
880
849
|
inBrk,
|
881
850
|
repeat,
|
882
|
-
brk,
|
883
851
|
min = axis.userMin || axis.min,
|
884
852
|
max = axis.userMax || axis.max,
|
885
853
|
pointRangePadding = pick(axis.pointRangePadding, 0),
|
886
854
|
start,
|
887
|
-
i
|
888
|
-
j;
|
855
|
+
i;
|
889
856
|
|
890
857
|
// Min & max check (#4247)
|
891
|
-
|
892
|
-
brk = breaks[i];
|
858
|
+
each(breaks, function(brk) {
|
893
859
|
repeat = brk.repeat || Infinity;
|
894
860
|
if (axis.isInBreak(brk, min)) {
|
895
861
|
min += (brk.to % repeat) - (min % repeat);
|
@@ -897,11 +863,10 @@
|
|
897
863
|
if (axis.isInBreak(brk, max)) {
|
898
864
|
max -= (max % repeat) - (brk.from % repeat);
|
899
865
|
}
|
900
|
-
}
|
866
|
+
});
|
901
867
|
|
902
868
|
// Construct an array holding all breaks in the axis
|
903
|
-
|
904
|
-
brk = breaks[i];
|
869
|
+
each(breaks, function(brk) {
|
905
870
|
start = brk.from;
|
906
871
|
repeat = brk.repeat || Infinity;
|
907
872
|
|
@@ -912,18 +877,18 @@
|
|
912
877
|
start += repeat;
|
913
878
|
}
|
914
879
|
|
915
|
-
for (
|
880
|
+
for (i = start; i < max; i += repeat) {
|
916
881
|
breakArrayT.push({
|
917
|
-
value:
|
882
|
+
value: i,
|
918
883
|
move: 'in'
|
919
884
|
});
|
920
885
|
breakArrayT.push({
|
921
|
-
value:
|
886
|
+
value: i + (brk.to - brk.from),
|
922
887
|
move: 'out',
|
923
888
|
size: brk.breakSize
|
924
889
|
});
|
925
890
|
}
|
926
|
-
}
|
891
|
+
});
|
927
892
|
|
928
893
|
breakArrayT.sort(function(a, b) {
|
929
894
|
var ret;
|
@@ -939,8 +904,7 @@
|
|
939
904
|
inBrk = 0;
|
940
905
|
start = min;
|
941
906
|
|
942
|
-
|
943
|
-
brk = breakArrayT[i];
|
907
|
+
each(breakArrayT, function(brk) {
|
944
908
|
inBrk += (brk.move === 'in' ? 1 : -1);
|
945
909
|
|
946
910
|
if (inBrk === 1 && brk.move === 'in') {
|
@@ -954,7 +918,7 @@
|
|
954
918
|
});
|
955
919
|
length += brk.value - start - (brk.size || 0);
|
956
920
|
}
|
957
|
-
}
|
921
|
+
});
|
958
922
|
|
959
923
|
axis.breakArray = breakArray;
|
960
924
|
|
@@ -966,7 +930,7 @@
|
|
966
930
|
|
967
931
|
if (axis.options.staticScale) {
|
968
932
|
axis.transA = axis.options.staticScale;
|
969
|
-
} else {
|
933
|
+
} else if (axis.unitLength) {
|
970
934
|
axis.transA *= (max - axis.min + pointRangePadding) /
|
971
935
|
axis.unitLength;
|
972
936
|
}
|
@@ -1053,6 +1017,36 @@
|
|
1053
1017
|
});
|
1054
1018
|
};
|
1055
1019
|
|
1020
|
+
|
1021
|
+
/**
|
1022
|
+
* Extend getGraphPath by identifying gaps in the data so that we can draw a gap
|
1023
|
+
* in the line or area. This was moved from ordinal axis module to broken axis
|
1024
|
+
* module as of #5045.
|
1025
|
+
*/
|
1026
|
+
H.Series.prototype.gappedPath = function() {
|
1027
|
+
var gapSize = this.options.gapSize,
|
1028
|
+
points = this.points.slice(),
|
1029
|
+
i = points.length - 1;
|
1030
|
+
|
1031
|
+
if (gapSize && i > 0) { // #5008
|
1032
|
+
|
1033
|
+
// extension for ordinal breaks
|
1034
|
+
while (i--) {
|
1035
|
+
if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {
|
1036
|
+
points.splice( // insert after this one
|
1037
|
+
i + 1,
|
1038
|
+
0, {
|
1039
|
+
isNull: true
|
1040
|
+
}
|
1041
|
+
);
|
1042
|
+
}
|
1043
|
+
}
|
1044
|
+
}
|
1045
|
+
|
1046
|
+
// Call base method
|
1047
|
+
return this.getGraphPath(points);
|
1048
|
+
};
|
1049
|
+
|
1056
1050
|
wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);
|
1057
1051
|
wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);
|
1058
1052
|
|
@@ -1173,9 +1167,10 @@
|
|
1173
1167
|
|
1174
1168
|
|
1175
1169
|
/**
|
1176
|
-
* Define the available approximation types. The data grouping
|
1177
|
-
* or numbers as the first parameter. In case
|
1178
|
-
*
|
1170
|
+
* Define the available approximation types. The data grouping
|
1171
|
+
* approximations takes an array or numbers as the first parameter. In case
|
1172
|
+
* of ohlc, four arrays are sent in as four parameters. Each array consists
|
1173
|
+
* only of numbers. In case null values belong to the group, the property
|
1179
1174
|
* .hasNulls will be set to true on the array.
|
1180
1175
|
*/
|
1181
1176
|
approximations = {
|
@@ -1202,14 +1197,25 @@
|
|
1202
1197
|
var len = arr.length,
|
1203
1198
|
ret = approximations.sum(arr);
|
1204
1199
|
|
1205
|
-
// If we have a number, return it divided by the length. If not,
|
1206
|
-
// null or undefined based on what the sum method finds.
|
1200
|
+
// If we have a number, return it divided by the length. If not,
|
1201
|
+
// return null or undefined based on what the sum method finds.
|
1207
1202
|
if (isNumber(ret) && len) {
|
1208
1203
|
ret = ret / len;
|
1209
1204
|
}
|
1210
1205
|
|
1211
1206
|
return ret;
|
1212
1207
|
},
|
1208
|
+
// The same as average, but for series with multiple values, like area
|
1209
|
+
// ranges.
|
1210
|
+
averages: function() { // #5479
|
1211
|
+
var ret = [];
|
1212
|
+
|
1213
|
+
each(arguments, function(arr) {
|
1214
|
+
ret.push(approximations.average(arr));
|
1215
|
+
});
|
1216
|
+
|
1217
|
+
return ret;
|
1218
|
+
},
|
1213
1219
|
open: function(arr) {
|
1214
1220
|
return arr.length ? arr[0] : (arr.hasNulls ? null : undefined);
|
1215
1221
|
},
|
@@ -1247,8 +1253,8 @@
|
|
1247
1253
|
|
1248
1254
|
|
1249
1255
|
/**
|
1250
|
-
* Takes parallel arrays of x and y data and groups the data into intervals
|
1251
|
-
* of starting x values for each group.
|
1256
|
+
* Takes parallel arrays of x and y data and groups the data into intervals
|
1257
|
+
* defined by groupPositions, a collection of starting x values for each group.
|
1252
1258
|
*/
|
1253
1259
|
seriesProto.groupData = function(xData, yData, groupPositions, approximation) {
|
1254
1260
|
var series = this,
|
@@ -1261,19 +1267,35 @@
|
|
1261
1267
|
pointX,
|
1262
1268
|
pointY,
|
1263
1269
|
groupedY,
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
]
|
1271
|
-
|
1270
|
+
// when grouping the fake extended axis for panning,
|
1271
|
+
// we don't need to consider y
|
1272
|
+
handleYData = !!yData,
|
1273
|
+
values = [],
|
1274
|
+
approximationFn = typeof approximation === 'function' ?
|
1275
|
+
approximation :
|
1276
|
+
approximations[approximation] ||
|
1277
|
+
// if the approximation is not found use default series type
|
1278
|
+
// approximation (#2914)
|
1279
|
+
(
|
1280
|
+
specificOptions[series.type] &&
|
1281
|
+
approximations[specificOptions[series.type].approximation]
|
1282
|
+
) || approximations[commonOptions.approximation],
|
1272
1283
|
pointArrayMap = series.pointArrayMap,
|
1273
1284
|
pointArrayMapLength = pointArrayMap && pointArrayMap.length,
|
1274
|
-
i,
|
1275
1285
|
pos = 0,
|
1276
|
-
start = 0
|
1286
|
+
start = 0,
|
1287
|
+
valuesLen,
|
1288
|
+
i, j;
|
1289
|
+
|
1290
|
+
// Calculate values array size from pointArrayMap length
|
1291
|
+
if (pointArrayMapLength) {
|
1292
|
+
each(pointArrayMap, function() {
|
1293
|
+
values.push([]);
|
1294
|
+
});
|
1295
|
+
} else {
|
1296
|
+
values.push([]);
|
1297
|
+
}
|
1298
|
+
valuesLen = pointArrayMapLength || 1;
|
1277
1299
|
|
1278
1300
|
// Start with the first point within the X axis range (#2696)
|
1279
1301
|
for (i = 0; i <= dataLength; i++) {
|
@@ -1284,9 +1306,12 @@
|
|
1284
1306
|
|
1285
1307
|
for (i; i <= dataLength; i++) {
|
1286
1308
|
|
1287
|
-
// when a new group is entered, summarize and initiate
|
1288
|
-
|
1289
|
-
|
1309
|
+
// when a new group is entered, summarize and initiate
|
1310
|
+
// the previous group
|
1311
|
+
while ((
|
1312
|
+
groupPositions[pos + 1] !== undefined &&
|
1313
|
+
xData[i] >= groupPositions[pos + 1]
|
1314
|
+
) || i === dataLength) { // get the last group
|
1290
1315
|
|
1291
1316
|
// get group x and y
|
1292
1317
|
pointX = groupPositions[pos];
|
@@ -1305,10 +1330,10 @@
|
|
1305
1330
|
|
1306
1331
|
// reset the aggregate arrays
|
1307
1332
|
start = i;
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1333
|
+
for (j = 0; j < valuesLen; j++) {
|
1334
|
+
values[j].length = 0; // faster than values[j] = []
|
1335
|
+
values[j].hasNulls = false;
|
1336
|
+
}
|
1312
1337
|
|
1313
1338
|
// Advance on the group positions
|
1314
1339
|
pos += 1;
|
@@ -1324,14 +1349,15 @@
|
|
1324
1349
|
break;
|
1325
1350
|
}
|
1326
1351
|
|
1327
|
-
// for each raw data point, push it to an array that contains all values
|
1352
|
+
// for each raw data point, push it to an array that contains all values
|
1353
|
+
// for this specific group
|
1328
1354
|
if (pointArrayMap) {
|
1329
1355
|
|
1330
1356
|
var index = series.cropStart + i,
|
1331
|
-
point = (data && data[index]) ||
|
1357
|
+
point = (data && data[index]) ||
|
1358
|
+
series.pointClass.prototype.applyOptions.apply({
|
1332
1359
|
series: series
|
1333
1360
|
}, [dataOptions[index]]),
|
1334
|
-
j,
|
1335
1361
|
val;
|
1336
1362
|
|
1337
1363
|
for (j = 0; j < pointArrayMapLength; j++) {
|
@@ -1738,7 +1764,7 @@
|
|
1738
1764
|
toYData: function(point) { // return a plain array for speedy calculation
|
1739
1765
|
return [point.open, point.high, point.low, point.close];
|
1740
1766
|
},
|
1741
|
-
pointValKey: '
|
1767
|
+
pointValKey: 'close',
|
1742
1768
|
|
1743
1769
|
|
1744
1770
|
pointAttrToOptions: {
|
@@ -1791,6 +1817,10 @@
|
|
1791
1817
|
point[translated[i]] = yAxis.toPixels(value, true);
|
1792
1818
|
}
|
1793
1819
|
});
|
1820
|
+
|
1821
|
+
// Align the tooltip to the high value to avoid covering the point
|
1822
|
+
point.tooltipPos[1] =
|
1823
|
+
point.plotHigh + yAxis.pos - series.chart.plotTop;
|
1794
1824
|
});
|
1795
1825
|
},
|
1796
1826
|
|
@@ -1835,7 +1865,7 @@
|
|
1835
1865
|
'M',
|
1836
1866
|
crispX, Math.round(point.yBottom),
|
1837
1867
|
'L',
|
1838
|
-
crispX, Math.round(point.
|
1868
|
+
crispX, Math.round(point.plotHigh)
|
1839
1869
|
];
|
1840
1870
|
|
1841
1871
|
// open
|
@@ -2005,7 +2035,7 @@
|
|
2005
2035
|
topBox = Math.min(plotOpen, plotClose);
|
2006
2036
|
bottomBox = Math.max(plotOpen, plotClose);
|
2007
2037
|
halfWidth = Math.round(point.shapeArgs.width / 2);
|
2008
|
-
hasTopWhisker = Math.round(topBox) !== Math.round(point.
|
2038
|
+
hasTopWhisker = Math.round(topBox) !== Math.round(point.plotHigh);
|
2009
2039
|
hasBottomWhisker = bottomBox !== point.yBottom;
|
2010
2040
|
topBox = Math.round(topBox) + crispCorr;
|
2011
2041
|
bottomBox = Math.round(bottomBox) + crispCorr;
|
@@ -2028,7 +2058,7 @@
|
|
2028
2058
|
'M',
|
2029
2059
|
crispX, topBox,
|
2030
2060
|
'L',
|
2031
|
-
crispX, hasTopWhisker ? Math.round(point.
|
2061
|
+
crispX, hasTopWhisker ? Math.round(point.plotHigh) : topBox, // #460, #2094
|
2032
2062
|
'M',
|
2033
2063
|
crispX, bottomBox,
|
2034
2064
|
'L',
|
@@ -3052,7 +3082,7 @@
|
|
3052
3082
|
each(this._events, function(args) {
|
3053
3083
|
removeEvent.apply(null, args);
|
3054
3084
|
});
|
3055
|
-
this._events =
|
3085
|
+
this._events.length = 0;
|
3056
3086
|
},
|
3057
3087
|
|
3058
3088
|
/**
|
@@ -3124,6 +3154,7 @@
|
|
3124
3154
|
scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),
|
3125
3155
|
scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),
|
3126
3156
|
scrollbar = axis.scrollbar,
|
3157
|
+
titleOffset = axis.titleOffset || 0,
|
3127
3158
|
offsetsIndex,
|
3128
3159
|
from,
|
3129
3160
|
to;
|
@@ -3136,7 +3167,10 @@
|
|
3136
3167
|
scrollbar.position(
|
3137
3168
|
axis.left,
|
3138
3169
|
axis.top + axis.height + 2 + axis.chart.scrollbarsOffsets[1] +
|
3139
|
-
(axis.opposite ?
|
3170
|
+
(axis.opposite ?
|
3171
|
+
0 :
|
3172
|
+
titleOffset + axis.axisTitleMargin + axis.offset
|
3173
|
+
),
|
3140
3174
|
axis.width,
|
3141
3175
|
axis.height
|
3142
3176
|
);
|
@@ -3144,7 +3178,10 @@
|
|
3144
3178
|
} else {
|
3145
3179
|
scrollbar.position(
|
3146
3180
|
axis.left + axis.width + 2 + axis.chart.scrollbarsOffsets[0] +
|
3147
|
-
(axis.opposite ?
|
3181
|
+
(axis.opposite ?
|
3182
|
+
titleOffset + axis.axisTitleMargin + axis.offset :
|
3183
|
+
0
|
3184
|
+
),
|
3148
3185
|
axis.top,
|
3149
3186
|
axis.width,
|
3150
3187
|
axis.height
|
@@ -3645,6 +3682,7 @@
|
|
3645
3682
|
scrollbarHeight = navigator.scrollbarHeight,
|
3646
3683
|
navigatorSize,
|
3647
3684
|
xAxis = navigator.xAxis,
|
3685
|
+
scrollbarXAxis = xAxis.fake ? chart.xAxis[0] : xAxis,
|
3648
3686
|
navigatorEnabled = navigator.navigatorEnabled,
|
3649
3687
|
zoomedMin,
|
3650
3688
|
zoomedMax,
|
@@ -3745,7 +3783,9 @@
|
|
3745
3783
|
if (inverted) {
|
3746
3784
|
scrollbarTop = navigator.top - scrollbarHeight;
|
3747
3785
|
scrollbarLeft = navigator.left - scrollbarHeight +
|
3748
|
-
(navigatorEnabled ? 0 :
|
3786
|
+
(navigatorEnabled ? 0 : (scrollbarXAxis.titleOffset || 0) +
|
3787
|
+
scrollbarXAxis.axisTitleMargin
|
3788
|
+
);
|
3749
3789
|
scrollbarHeight = navigatorSize + 2 * scrollbarHeight;
|
3750
3790
|
} else {
|
3751
3791
|
scrollbarTop = navigator.top +
|
@@ -5522,15 +5562,15 @@
|
|
5522
5562
|
* Destroys allocated elements.
|
5523
5563
|
*/
|
5524
5564
|
destroy: function() {
|
5525
|
-
var
|
5526
|
-
|
5527
|
-
|
5565
|
+
var rSelector = this,
|
5566
|
+
minInput = rSelector.minInput,
|
5567
|
+
maxInput = rSelector.maxInput;
|
5528
5568
|
|
5529
|
-
|
5530
|
-
|
5569
|
+
rSelector.unMouseDown();
|
5570
|
+
rSelector.unResize();
|
5531
5571
|
|
5532
5572
|
// Destroy elements in collections
|
5533
|
-
destroyObjectProperties(
|
5573
|
+
destroyObjectProperties(rSelector.buttons);
|
5534
5574
|
|
5535
5575
|
// Clear input element events
|
5536
5576
|
if (minInput) {
|
@@ -5541,18 +5581,18 @@
|
|
5541
5581
|
}
|
5542
5582
|
|
5543
5583
|
// Destroy HTML and SVG elements
|
5544
|
-
|
5545
|
-
if (
|
5546
|
-
if (
|
5547
|
-
|
5548
|
-
} else if (
|
5584
|
+
H.objectEach(rSelector, function(val, key) {
|
5585
|
+
if (val && key !== 'chart') {
|
5586
|
+
if (val.destroy) { // SVGElement
|
5587
|
+
val.destroy();
|
5588
|
+
} else if (val.nodeType) { // HTML element
|
5549
5589
|
discardElement(this[key]);
|
5550
5590
|
}
|
5551
5591
|
}
|
5552
|
-
if (
|
5553
|
-
|
5592
|
+
if (val !== RangeSelector.prototype[key]) {
|
5593
|
+
rSelector[key] = null;
|
5554
5594
|
}
|
5555
|
-
}
|
5595
|
+
}, this);
|
5556
5596
|
}
|
5557
5597
|
};
|
5558
5598
|
|
@@ -5606,8 +5646,15 @@
|
|
5606
5646
|
range,
|
5607
5647
|
// Get the true range from a start date
|
5608
5648
|
getTrueRange = function(base, count) {
|
5609
|
-
var date = new Date(base)
|
5610
|
-
|
5649
|
+
var date = new Date(base),
|
5650
|
+
basePeriod = date['get' + timeName]();
|
5651
|
+
|
5652
|
+
date['set' + timeName](basePeriod + count);
|
5653
|
+
|
5654
|
+
if (basePeriod === date['get' + timeName]()) {
|
5655
|
+
date.setDate(0); // #6537
|
5656
|
+
}
|
5657
|
+
|
5611
5658
|
return date.getTime() - base;
|
5612
5659
|
};
|
5613
5660
|
|
@@ -5715,6 +5762,7 @@
|
|
5715
5762
|
each = H.each,
|
5716
5763
|
extend = H.extend,
|
5717
5764
|
format = H.format,
|
5765
|
+
grep = H.grep,
|
5718
5766
|
inArray = H.inArray,
|
5719
5767
|
isNumber = H.isNumber,
|
5720
5768
|
isString = H.isString,
|
@@ -5973,7 +6021,13 @@
|
|
5973
6021
|
// lines (#2796).
|
5974
6022
|
uniqueAxes = axes.length ? [] : [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; //#3742
|
5975
6023
|
each(axes, function(axis2) {
|
5976
|
-
if (
|
6024
|
+
if (
|
6025
|
+
inArray(axis2, uniqueAxes) === -1 &&
|
6026
|
+
// Do not draw on axis which overlap completely. #5424
|
6027
|
+
!H.find(uniqueAxes, function(unique) {
|
6028
|
+
return unique.pos === axis2.pos && unique.len && axis2.len;
|
6029
|
+
})
|
6030
|
+
) {
|
5977
6031
|
uniqueAxes.push(axis2);
|
5978
6032
|
}
|
5979
6033
|
});
|
@@ -6320,7 +6374,7 @@
|
|
6320
6374
|
|
6321
6375
|
// find the first value for comparison
|
6322
6376
|
for (i = 0; i < length - 1; i++) {
|
6323
|
-
compareValue = keyIndex > -1 ?
|
6377
|
+
compareValue = processedYData[i] && keyIndex > -1 ?
|
6324
6378
|
processedYData[i][keyIndex] :
|
6325
6379
|
processedYData[i];
|
6326
6380
|
if (isNumber(compareValue) && processedXData[i + 1] >= series.xAxis.min && compareValue !== 0) {
|
@@ -6416,5 +6470,32 @@
|
|
6416
6470
|
proceed.call(this);
|
6417
6471
|
});
|
6418
6472
|
|
6473
|
+
wrap(Chart.prototype, 'getSelectedPoints', function(proceed) {
|
6474
|
+
var points = proceed.call(this);
|
6475
|
+
|
6476
|
+
each(this.series, function(serie) {
|
6477
|
+
// series.points - for grouped points (#6445)
|
6478
|
+
if (serie.hasGroupedData) {
|
6479
|
+
points = points.concat(grep(serie.points || [], function(point) {
|
6480
|
+
return point.selected;
|
6481
|
+
}));
|
6482
|
+
}
|
6483
|
+
});
|
6484
|
+
return points;
|
6485
|
+
});
|
6486
|
+
|
6487
|
+
wrap(Chart.prototype, 'update', function(proceed, options) {
|
6488
|
+
// Use case: enabling scrollbar from a disabled state.
|
6489
|
+
// Scrollbar needs to be initialized from a controller, Navigator in this
|
6490
|
+
// case (#6615)
|
6491
|
+
if ('scrollbar' in options && this.navigator) {
|
6492
|
+
merge(true, this.options.scrollbar, options.scrollbar);
|
6493
|
+
this.navigator.update({}, false);
|
6494
|
+
delete options.scrollbar;
|
6495
|
+
}
|
6496
|
+
|
6497
|
+
return proceed.apply(this, Array.prototype.slice.call(arguments, 1));
|
6498
|
+
});
|
6499
|
+
|
6419
6500
|
}(Highcharts));
|
6420
6501
|
}));
|