highcharts-rails 3.0.9 → 3.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.asc +13 -13
- data.tar.gz.asc +13 -13
- data/CHANGELOG.markdown +66 -0
- data/app/assets/javascripts/highcharts.js +2404 -2172
- data/app/assets/javascripts/highcharts/adapters/mootools-adapter.js +1 -1
- data/app/assets/javascripts/highcharts/adapters/prototype-adapter.js +1 -1
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +13 -15
- data/app/assets/javascripts/highcharts/highcharts-more.js +37 -17
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +1 -1
- data/app/assets/javascripts/highcharts/modules/data.js +71 -66
- data/app/assets/javascripts/highcharts/modules/drilldown.js +198 -99
- data/app/assets/javascripts/highcharts/modules/exporting.js +1 -1
- data/app/assets/javascripts/highcharts/modules/funnel.js +28 -8
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +4 -2
- data/app/assets/javascripts/highcharts/themes/gray.js +2 -2
- data/lib/highcharts/version.rb +1 -1
- metadata +2 -2
- metadata.gz.asc +13 -13
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v3.0.
|
2
|
+
* @license Highcharts JS v3.0.10 (2014-03-10)
|
3
3
|
*
|
4
4
|
* Standalone Highcharts Framework
|
5
5
|
*
|
@@ -304,7 +304,7 @@ return {
|
|
304
304
|
// HTML styles
|
305
305
|
} else {
|
306
306
|
styles = {};
|
307
|
-
styles[
|
307
|
+
styles[this.prop] = this.now + this.unit;
|
308
308
|
Highcharts.css(elem, styles);
|
309
309
|
}
|
310
310
|
|
@@ -350,9 +350,10 @@ return {
|
|
350
350
|
ret,
|
351
351
|
done,
|
352
352
|
options = this.options,
|
353
|
+
elem = this.elem,
|
353
354
|
i;
|
354
|
-
|
355
|
-
if (
|
355
|
+
|
356
|
+
if (elem.stopAnimation || (elem.attr && !elem.element)) { // #2616, element including flag is destroyed
|
356
357
|
ret = false;
|
357
358
|
|
358
359
|
} else if (gotoEnd || t >= options.duration + this.startTime) {
|
@@ -371,7 +372,7 @@ return {
|
|
371
372
|
|
372
373
|
if (done) {
|
373
374
|
if (options.complete) {
|
374
|
-
options.complete.call(
|
375
|
+
options.complete.call(elem);
|
375
376
|
}
|
376
377
|
}
|
377
378
|
ret = false;
|
@@ -504,19 +505,16 @@ return {
|
|
504
505
|
return results;
|
505
506
|
},
|
506
507
|
|
508
|
+
/**
|
509
|
+
* Get the element's offset position, corrected by overflow:auto. Loosely based on jQuery's offset method.
|
510
|
+
*/
|
507
511
|
offset: function (el) {
|
508
|
-
var
|
509
|
-
|
510
|
-
|
511
|
-
while (el) {
|
512
|
-
left += el.offsetLeft;
|
513
|
-
top += el.offsetTop;
|
514
|
-
el = el.offsetParent;
|
515
|
-
}
|
512
|
+
var docElem = document.documentElement,
|
513
|
+
box = el.getBoundingClientRect();
|
516
514
|
|
517
515
|
return {
|
518
|
-
|
519
|
-
|
516
|
+
top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
|
517
|
+
left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
|
520
518
|
};
|
521
519
|
},
|
522
520
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v3.0.
|
5
|
+
* @license Highcharts JS v3.0.10 (2014-03-10)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -155,7 +155,6 @@ var radialAxisMixin = {
|
|
155
155
|
minorTickLength: 10,
|
156
156
|
minorTickPosition: 'inside',
|
157
157
|
minorTickWidth: 1,
|
158
|
-
plotBands: [],
|
159
158
|
tickLength: 10,
|
160
159
|
tickPosition: 'inside',
|
161
160
|
tickWidth: 2,
|
@@ -176,7 +175,6 @@ var radialAxisMixin = {
|
|
176
175
|
},
|
177
176
|
maxPadding: 0,
|
178
177
|
minPadding: 0,
|
179
|
-
plotBands: [],
|
180
178
|
showLastLabel: false,
|
181
179
|
tickLength: 0
|
182
180
|
},
|
@@ -189,7 +187,6 @@ var radialAxisMixin = {
|
|
189
187
|
x: -3,
|
190
188
|
y: -2
|
191
189
|
},
|
192
|
-
plotBands: [],
|
193
190
|
showLastLabel: false,
|
194
191
|
title: {
|
195
192
|
x: 4,
|
@@ -203,11 +200,16 @@ var radialAxisMixin = {
|
|
203
200
|
*/
|
204
201
|
setOptions: function (userOptions) {
|
205
202
|
|
206
|
-
this.options = merge(
|
203
|
+
var options = this.options = merge(
|
207
204
|
this.defaultOptions,
|
208
205
|
this.defaultRadialOptions,
|
209
206
|
userOptions
|
210
207
|
);
|
208
|
+
|
209
|
+
// Make sure the plotBands array is instanciated for each Axis (#2649)
|
210
|
+
if (!options.plotBands) {
|
211
|
+
options.plotBands = [];
|
212
|
+
}
|
211
213
|
|
212
214
|
},
|
213
215
|
|
@@ -272,8 +274,7 @@ var radialAxisMixin = {
|
|
272
274
|
}
|
273
275
|
|
274
276
|
if (this.isXAxis) {
|
275
|
-
this.minPixelPadding = this.transA * this.minPointOffset
|
276
|
-
(this.reversed ? (this.endAngleRad - this.startAngleRad) / 4 : 0); // ???
|
277
|
+
this.minPixelPadding = this.transA * this.minPointOffset;
|
277
278
|
} else {
|
278
279
|
// This is a workaround for regression #2593, but categories still don't position correctly.
|
279
280
|
// TODO: Implement true handling of Y axis categories on gauges.
|
@@ -304,10 +305,16 @@ var radialAxisMixin = {
|
|
304
305
|
|
305
306
|
// Set the center array
|
306
307
|
this.center = this.pane.center = Highcharts.CenteredSeriesMixin.getCenter.call(this.pane);
|
308
|
+
|
309
|
+
// The sector is used in Axis.translate to compute the translation of reversed axis points (#2570)
|
310
|
+
if (this.isCircular) {
|
311
|
+
this.sector = this.endAngleRad - this.startAngleRad;
|
312
|
+
}
|
307
313
|
|
308
|
-
|
309
|
-
|
310
|
-
|
314
|
+
// Axis len is used to lay out the ticks
|
315
|
+
this.len = this.width = this.height = this.center[2] * pick(this.sector, 1) / 2;
|
316
|
+
|
317
|
+
|
311
318
|
}
|
312
319
|
},
|
313
320
|
|
@@ -795,6 +802,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
795
802
|
|
796
803
|
// Set preliminary values
|
797
804
|
point.y = point.high;
|
805
|
+
point._plotY = point.plotY;
|
798
806
|
point.plotY = point.plotHigh;
|
799
807
|
|
800
808
|
// Store original data labels and set preliminary label objects to be picked up
|
@@ -827,7 +835,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
827
835
|
|
828
836
|
// Reset values
|
829
837
|
point.y = point.low;
|
830
|
-
point.plotY = point.
|
838
|
+
point.plotY = point._plotY;
|
831
839
|
|
832
840
|
// Set the default offset
|
833
841
|
point.below = true;
|
@@ -1020,12 +1028,18 @@ var GaugeSeries = {
|
|
1020
1028
|
rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,
|
1021
1029
|
baseWidth = dialOptions.baseWidth || 3,
|
1022
1030
|
topWidth = dialOptions.topWidth || 1,
|
1031
|
+
overshoot = options.overshoot,
|
1023
1032
|
rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);
|
1024
1033
|
|
1025
|
-
// Handle the wrap
|
1026
|
-
if (
|
1034
|
+
// Handle the wrap and overshoot options
|
1035
|
+
if (overshoot && typeof overshoot === 'number') {
|
1036
|
+
overshoot = overshoot / 180 * Math.PI;
|
1037
|
+
rotation = Math.max(yAxis.startAngleRad - overshoot, Math.min(yAxis.endAngleRad + overshoot, rotation));
|
1038
|
+
|
1039
|
+
} else if (options.wrap === false) {
|
1027
1040
|
rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));
|
1028
1041
|
}
|
1042
|
+
|
1029
1043
|
rotation = rotation * 180 / Math.PI;
|
1030
1044
|
|
1031
1045
|
point.shapeType = 'path';
|
@@ -1457,6 +1471,7 @@ seriesTypes.errorbar = extendClass(seriesTypes.boxplot, {
|
|
1457
1471
|
},
|
1458
1472
|
pointValKey: 'high', // defines the top of the tracker
|
1459
1473
|
doQuartiles: false,
|
1474
|
+
drawDataLabels: seriesTypes.arearange ? seriesTypes.arearange.prototype.drawDataLabels : noop,
|
1460
1475
|
|
1461
1476
|
/**
|
1462
1477
|
* Get the width and X offset, either on top of the linked series column
|
@@ -1947,7 +1962,7 @@ Axis.prototype.beforePadding = function () {
|
|
1947
1962
|
var seriesOptions = series.options,
|
1948
1963
|
zData;
|
1949
1964
|
|
1950
|
-
if (series.bubblePadding && series.visible) {
|
1965
|
+
if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
|
1951
1966
|
|
1952
1967
|
// Correction for #1673
|
1953
1968
|
axis.allowZoomOutside = true;
|
@@ -2040,14 +2055,20 @@ Axis.prototype.beforePadding = function () {
|
|
2040
2055
|
var xy,
|
2041
2056
|
chart = this.chart,
|
2042
2057
|
plotX = point.plotX,
|
2043
|
-
plotY = point.plotY
|
2058
|
+
plotY = point.plotY,
|
2059
|
+
clientX;
|
2044
2060
|
|
2045
2061
|
// Save rectangular plotX, plotY for later computation
|
2046
2062
|
point.rectPlotX = plotX;
|
2047
2063
|
point.rectPlotY = plotY;
|
2048
2064
|
|
2049
2065
|
// Record the angle in degrees for use in tooltip
|
2050
|
-
|
2066
|
+
clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
|
2067
|
+
if (clientX < 0) { // #2665
|
2068
|
+
clientX += 360;
|
2069
|
+
}
|
2070
|
+
point.clientX = clientX;
|
2071
|
+
|
2051
2072
|
|
2052
2073
|
// Find the polar plotX and plotY
|
2053
2074
|
xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
|
@@ -2330,7 +2351,6 @@ Axis.prototype.beforePadding = function () {
|
|
2330
2351
|
tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
|
2331
2352
|
});
|
2332
2353
|
}
|
2333
|
-
|
2334
2354
|
// Run uber method
|
2335
2355
|
return proceed.call(this, renew);
|
2336
2356
|
});
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v3.0.
|
2911
|
+
* @license Highcharts JS v3.0.10 (2014-03-10)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2012 Torstein Honsi, Erik Olsson
|
@@ -232,9 +232,8 @@
|
|
232
232
|
startRow = options.startRow || 0,
|
233
233
|
endRow = options.endRow || Number.MAX_VALUE,
|
234
234
|
startColumn = options.startColumn || 0,
|
235
|
-
endColumn = options.endColumn || Number.MAX_VALUE
|
236
|
-
|
237
|
-
|
235
|
+
endColumn = options.endColumn || Number.MAX_VALUE;
|
236
|
+
|
238
237
|
if (table) {
|
239
238
|
|
240
239
|
if (typeof table === 'string') {
|
@@ -242,16 +241,14 @@
|
|
242
241
|
}
|
243
242
|
|
244
243
|
each(table.getElementsByTagName('tr'), function (tr, rowNo) {
|
245
|
-
colNo = 0;
|
246
244
|
if (rowNo >= startRow && rowNo <= endRow) {
|
247
|
-
each(tr.
|
245
|
+
each(tr.children, function (item, colNo) {
|
248
246
|
if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {
|
249
|
-
if (!columns[colNo]) {
|
250
|
-
columns[colNo] = [];
|
247
|
+
if (!columns[colNo - startColumn]) {
|
248
|
+
columns[colNo - startColumn] = [];
|
251
249
|
}
|
252
|
-
columns[colNo][rowNo - startRow] = item.innerHTML;
|
253
250
|
|
254
|
-
colNo
|
251
|
+
columns[colNo - startColumn][rowNo - startRow] = item.innerHTML;
|
255
252
|
}
|
256
253
|
});
|
257
254
|
}
|
@@ -276,53 +273,56 @@
|
|
276
273
|
gc; // google column
|
277
274
|
|
278
275
|
if (googleSpreadsheetKey) {
|
279
|
-
jQuery.
|
276
|
+
jQuery.ajax({
|
277
|
+
dataType: 'json',
|
278
|
+
url: 'https://spreadsheets.google.com/feeds/cells/' +
|
280
279
|
googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +
|
281
280
|
'/public/values?alt=json-in-script&callback=?',
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
}
|
299
|
-
|
300
|
-
// Set up arrays containing the column data
|
301
|
-
for (i = 0; i < colCount; i++) {
|
302
|
-
if (i >= startColumn && i <= endColumn) {
|
303
|
-
// Create new columns with the length of either end-start or rowCount
|
304
|
-
columns[i - startColumn] = [];
|
305
|
-
|
306
|
-
// Setting the length to avoid jslint warning
|
307
|
-
columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
|
281
|
+
error: options.error,
|
282
|
+
success: function (json) {
|
283
|
+
// Prepare the data from the spreadsheat
|
284
|
+
var cells = json.feed.entry,
|
285
|
+
cell,
|
286
|
+
cellCount = cells.length,
|
287
|
+
colCount = 0,
|
288
|
+
rowCount = 0,
|
289
|
+
i;
|
290
|
+
|
291
|
+
// First, find the total number of columns and rows that
|
292
|
+
// are actually filled with data
|
293
|
+
for (i = 0; i < cellCount; i++) {
|
294
|
+
cell = cells[i];
|
295
|
+
colCount = Math.max(colCount, cell.gs$cell.col);
|
296
|
+
rowCount = Math.max(rowCount, cell.gs$cell.row);
|
308
297
|
}
|
309
|
-
}
|
310
298
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
if (gc >= startColumn && gc <= endColumn &&
|
321
|
-
gr >= startRow && gr <= endRow) {
|
322
|
-
columns[gc - startColumn][gr - startRow] = cell.content.$t;
|
299
|
+
// Set up arrays containing the column data
|
300
|
+
for (i = 0; i < colCount; i++) {
|
301
|
+
if (i >= startColumn && i <= endColumn) {
|
302
|
+
// Create new columns with the length of either end-start or rowCount
|
303
|
+
columns[i - startColumn] = [];
|
304
|
+
|
305
|
+
// Setting the length to avoid jslint warning
|
306
|
+
columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
|
307
|
+
}
|
323
308
|
}
|
309
|
+
|
310
|
+
// Loop over the cells and assign the value to the right
|
311
|
+
// place in the column arrays
|
312
|
+
for (i = 0; i < cellCount; i++) {
|
313
|
+
cell = cells[i];
|
314
|
+
gr = cell.gs$cell.row - 1; // rows start at 1
|
315
|
+
gc = cell.gs$cell.col - 1; // columns start at 1
|
316
|
+
|
317
|
+
// If both row and col falls inside start and end
|
318
|
+
// set the transposed cell value in the newly created columns
|
319
|
+
if (gc >= startColumn && gc <= endColumn &&
|
320
|
+
gr >= startRow && gr <= endRow) {
|
321
|
+
columns[gc - startColumn][gr - startRow] = cell.content.$t;
|
322
|
+
}
|
323
|
+
}
|
324
|
+
self.dataFound();
|
324
325
|
}
|
325
|
-
self.dataFound();
|
326
326
|
});
|
327
327
|
}
|
328
328
|
},
|
@@ -523,22 +523,27 @@
|
|
523
523
|
|
524
524
|
// Iterate down the cells of each column and add data to the series
|
525
525
|
data = [];
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
];
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
526
|
+
|
527
|
+
// Only loop and fill the data series if there are columns available.
|
528
|
+
// We need this check to avoid reading outside the array bounds.
|
529
|
+
if (i + valueCount <= columns.length) {
|
530
|
+
for (j = 0; j < columns[i].length; j++) {
|
531
|
+
data[j] = [
|
532
|
+
firstCol[j],
|
533
|
+
columns[i][j] !== undefined ? columns[i][j] : null
|
534
|
+
];
|
535
|
+
if (valueCount > 1) {
|
536
|
+
data[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);
|
537
|
+
}
|
538
|
+
if (valueCount > 2) {
|
539
|
+
data[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);
|
540
|
+
}
|
541
|
+
if (valueCount > 3) {
|
542
|
+
data[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);
|
543
|
+
}
|
544
|
+
if (valueCount > 4) {
|
545
|
+
data[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);
|
546
|
+
}
|
542
547
|
}
|
543
548
|
}
|
544
549
|
|
@@ -16,6 +16,7 @@
|
|
16
16
|
defaultOptions = H.getOptions(),
|
17
17
|
each = H.each,
|
18
18
|
extend = H.extend,
|
19
|
+
format = H.format,
|
19
20
|
wrap = H.wrap,
|
20
21
|
Chart = H.Chart,
|
21
22
|
seriesTypes = H.seriesTypes,
|
@@ -73,7 +74,7 @@
|
|
73
74
|
this
|
74
75
|
.attr({
|
75
76
|
opacity: 0.1,
|
76
|
-
visibility: '
|
77
|
+
visibility: 'inherit'
|
77
78
|
})
|
78
79
|
.animate({
|
79
80
|
opacity: 1
|
@@ -82,29 +83,48 @@
|
|
82
83
|
});
|
83
84
|
};
|
84
85
|
|
85
|
-
// Extend the Chart prototype
|
86
|
-
Chart.prototype.drilldownLevels = [];
|
87
|
-
|
88
86
|
Chart.prototype.addSeriesAsDrilldown = function (point, ddOptions) {
|
87
|
+
this.addSingleSeriesAsDrilldown(point, ddOptions);
|
88
|
+
this.applyDrilldown();
|
89
|
+
};
|
90
|
+
Chart.prototype.addSingleSeriesAsDrilldown = function (point, ddOptions) {
|
89
91
|
var oldSeries = point.series,
|
90
92
|
xAxis = oldSeries.xAxis,
|
91
93
|
yAxis = oldSeries.yAxis,
|
92
94
|
newSeries,
|
93
95
|
color = point.color || oldSeries.color,
|
94
96
|
pointIndex,
|
95
|
-
|
97
|
+
levelSeries = [],
|
98
|
+
levelSeriesOptions = [],
|
99
|
+
level,
|
100
|
+
levelNumber;
|
101
|
+
|
102
|
+
levelNumber = oldSeries.levelNumber || 0;
|
96
103
|
|
97
104
|
ddOptions = extend({
|
98
105
|
color: color
|
99
106
|
}, ddOptions);
|
100
107
|
pointIndex = inArray(point, oldSeries.points);
|
108
|
+
|
109
|
+
// Record options for all current series
|
110
|
+
each(oldSeries.chart.series, function (series) {
|
111
|
+
if (series.xAxis === xAxis && series.yAxis === yAxis) {
|
112
|
+
levelSeries.push(series);
|
113
|
+
levelSeriesOptions.push(series.userOptions);
|
114
|
+
series.levelNumber = series.levelNumber || 0;
|
115
|
+
}
|
116
|
+
});
|
101
117
|
|
118
|
+
// Add a record of properties for each drilldown level
|
102
119
|
level = {
|
120
|
+
levelNumber: levelNumber,
|
103
121
|
seriesOptions: oldSeries.userOptions,
|
122
|
+
levelSeriesOptions: levelSeriesOptions,
|
123
|
+
levelSeries: levelSeries,
|
104
124
|
shapeArgs: point.shapeArgs,
|
105
125
|
bBox: point.graphic.getBBox(),
|
106
126
|
color: color,
|
107
|
-
|
127
|
+
lowerSeriesOptions: ddOptions,
|
108
128
|
pointOptions: oldSeries.options.data[pointIndex],
|
109
129
|
pointIndex: pointIndex,
|
110
130
|
oldExtremes: {
|
@@ -115,9 +135,14 @@
|
|
115
135
|
}
|
116
136
|
};
|
117
137
|
|
138
|
+
// Generate and push it to a lookup array
|
139
|
+
if (!this.drilldownLevels) {
|
140
|
+
this.drilldownLevels = [];
|
141
|
+
}
|
118
142
|
this.drilldownLevels.push(level);
|
119
143
|
|
120
|
-
newSeries = this.addSeries(ddOptions, false);
|
144
|
+
newSeries = level.lowerSeries = this.addSeries(ddOptions, false);
|
145
|
+
newSeries.levelNumber = levelNumber + 1;
|
121
146
|
if (xAxis) {
|
122
147
|
xAxis.oldPos = xAxis.pos;
|
123
148
|
xAxis.userMin = xAxis.userMax = null;
|
@@ -129,8 +154,21 @@
|
|
129
154
|
newSeries.animate = newSeries.animateDrilldown || noop;
|
130
155
|
newSeries.options.animation = true;
|
131
156
|
}
|
157
|
+
};
|
158
|
+
|
159
|
+
Chart.prototype.applyDrilldown = function () {
|
160
|
+
var drilldownLevels = this.drilldownLevels,
|
161
|
+
levelToRemove = drilldownLevels[drilldownLevels.length - 1].levelNumber;
|
132
162
|
|
133
|
-
|
163
|
+
each(this.drilldownLevels, function (level) {
|
164
|
+
if (level.levelNumber === levelToRemove) {
|
165
|
+
each(level.levelSeries, function (series) {
|
166
|
+
if (series.levelNumber === levelToRemove) { // Not removed, not added as part of a multi-series drilldown
|
167
|
+
series.remove(false);
|
168
|
+
}
|
169
|
+
});
|
170
|
+
}
|
171
|
+
});
|
134
172
|
|
135
173
|
this.redraw();
|
136
174
|
this.showDrillUpButton();
|
@@ -138,8 +176,8 @@
|
|
138
176
|
|
139
177
|
Chart.prototype.getDrilldownBackText = function () {
|
140
178
|
var lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1];
|
141
|
-
|
142
|
-
return this.options.lang.drillUpText
|
179
|
+
lastLevel.series = lastLevel.seriesOptions;
|
180
|
+
return format(this.options.lang.drillUpText, lastLevel);
|
143
181
|
|
144
182
|
};
|
145
183
|
|
@@ -182,32 +220,62 @@
|
|
182
220
|
|
183
221
|
Chart.prototype.drillUp = function () {
|
184
222
|
var chart = this,
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
223
|
+
drilldownLevels = chart.drilldownLevels,
|
224
|
+
levelNumber = drilldownLevels[drilldownLevels.length - 1].levelNumber,
|
225
|
+
i = drilldownLevels.length,
|
226
|
+
level,
|
227
|
+
oldSeries,
|
228
|
+
newSeries,
|
229
|
+
oldExtremes,
|
230
|
+
addSeries = function (seriesOptions) {
|
231
|
+
var addedSeries;
|
232
|
+
each(chart.series, function (series) {
|
233
|
+
if (series.userOptions === seriesOptions) {
|
234
|
+
addedSeries = series;
|
235
|
+
}
|
236
|
+
});
|
237
|
+
|
238
|
+
addedSeries = addedSeries || chart.addSeries(seriesOptions, false);
|
239
|
+
if (addedSeries.type === oldSeries.type && addedSeries.animateDrillupTo) {
|
240
|
+
addedSeries.animate = addedSeries.animateDrillupTo;
|
241
|
+
}
|
242
|
+
if (seriesOptions === level.seriesOptions) {
|
243
|
+
newSeries = addedSeries;
|
244
|
+
}
|
245
|
+
};
|
189
246
|
|
190
|
-
|
247
|
+
while (i--) {
|
191
248
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
249
|
+
level = drilldownLevels[i];
|
250
|
+
if (level.levelNumber === levelNumber) {
|
251
|
+
drilldownLevels.pop();
|
252
|
+
|
253
|
+
oldSeries = level.lowerSeries;
|
196
254
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
}
|
255
|
+
each(level.levelSeriesOptions, addSeries);
|
256
|
+
|
257
|
+
fireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions });
|
201
258
|
|
202
|
-
|
259
|
+
if (newSeries.type === oldSeries.type) {
|
260
|
+
newSeries.drilldownLevel = level;
|
261
|
+
newSeries.options.animation = true;
|
203
262
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
263
|
+
if (oldSeries.animateDrillupFrom) {
|
264
|
+
oldSeries.animateDrillupFrom(level);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
oldSeries.remove(false);
|
269
|
+
|
270
|
+
// Reset the zoom level of the upper series
|
271
|
+
if (newSeries.xAxis) {
|
272
|
+
oldExtremes = level.oldExtremes;
|
273
|
+
newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);
|
274
|
+
newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);
|
275
|
+
}
|
276
|
+
}
|
208
277
|
}
|
209
278
|
|
210
|
-
|
211
279
|
this.redraw();
|
212
280
|
|
213
281
|
if (this.drilldownLevels.length === 0) {
|
@@ -220,46 +288,14 @@
|
|
220
288
|
}
|
221
289
|
};
|
222
290
|
|
223
|
-
PieSeries.prototype.animateDrilldown = function (init) {
|
224
|
-
var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
|
225
|
-
animationOptions = this.chart.options.drilldown.animation,
|
226
|
-
animateFrom = level.shapeArgs,
|
227
|
-
start = animateFrom.start,
|
228
|
-
angle = animateFrom.end - start,
|
229
|
-
startAngle = angle / this.points.length,
|
230
|
-
startColor = H.Color(level.color).rgba;
|
231
|
-
|
232
|
-
if (!init) {
|
233
|
-
each(this.points, function (point, i) {
|
234
|
-
var endColor = H.Color(point.color).rgba;
|
235
|
-
|
236
|
-
/*jslint unparam: true*/
|
237
|
-
point.graphic
|
238
|
-
.attr(H.merge(animateFrom, {
|
239
|
-
start: start + i * startAngle,
|
240
|
-
end: start + (i + 1) * startAngle
|
241
|
-
}))
|
242
|
-
.animate(point.shapeArgs, H.merge(animationOptions, {
|
243
|
-
step: function (val, fx) {
|
244
|
-
if (fx.prop === 'start') {
|
245
|
-
this.attr({
|
246
|
-
fill: tweenColors(startColor, endColor, fx.pos)
|
247
|
-
});
|
248
|
-
}
|
249
|
-
}
|
250
|
-
}));
|
251
|
-
/*jslint unparam: false*/
|
252
|
-
});
|
253
|
-
}
|
254
|
-
};
|
255
|
-
|
256
291
|
|
292
|
+
ColumnSeries.prototype.supportsDrilldown = true;
|
293
|
+
|
257
294
|
/**
|
258
295
|
* When drilling up, keep the upper series invisible until the lower series has
|
259
296
|
* moved into place
|
260
297
|
*/
|
261
|
-
|
262
|
-
ColumnSeries.prototype.animateDrillupTo = function (init) {
|
298
|
+
ColumnSeries.prototype.animateDrillupTo = function (init) {
|
263
299
|
if (!init) {
|
264
300
|
var newSeries = this,
|
265
301
|
level = newSeries.drilldownLevel;
|
@@ -279,13 +315,14 @@
|
|
279
315
|
setTimeout(function () {
|
280
316
|
each(newSeries.points, function (point, i) {
|
281
317
|
// Fade in other points
|
282
|
-
var verb = i === level.pointIndex ? 'show' : 'fadeIn'
|
283
|
-
|
318
|
+
var verb = i === (level && level.pointIndex) ? 'show' : 'fadeIn',
|
319
|
+
inherit = verb === 'show' ? true : undefined;
|
320
|
+
point.graphic[verb](inherit);
|
284
321
|
if (point.dataLabel) {
|
285
|
-
point.dataLabel[verb]();
|
322
|
+
point.dataLabel[verb](inherit);
|
286
323
|
}
|
287
324
|
if (point.connector) {
|
288
|
-
point.connector[verb]();
|
325
|
+
point.connector[verb](inherit);
|
289
326
|
}
|
290
327
|
});
|
291
328
|
}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));
|
@@ -297,21 +334,31 @@
|
|
297
334
|
};
|
298
335
|
|
299
336
|
ColumnSeries.prototype.animateDrilldown = function (init) {
|
300
|
-
var
|
337
|
+
var series = this,
|
338
|
+
drilldownLevels = this.chart.drilldownLevels,
|
339
|
+
animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,
|
301
340
|
animationOptions = this.chart.options.drilldown.animation;
|
302
341
|
|
303
342
|
if (!init) {
|
343
|
+
each(drilldownLevels, function (level) {
|
344
|
+
if (series.userOptions === level.lowerSeriesOptions) {
|
345
|
+
animateFrom = level.shapeArgs;
|
346
|
+
}
|
347
|
+
});
|
304
348
|
|
305
349
|
animateFrom.x += (this.xAxis.oldPos - this.xAxis.pos);
|
306
350
|
|
307
351
|
each(this.points, function (point) {
|
308
|
-
point.graphic
|
309
|
-
.
|
310
|
-
|
352
|
+
if (point.graphic) {
|
353
|
+
point.graphic
|
354
|
+
.attr(animateFrom)
|
355
|
+
.animate(point.shapeArgs, animationOptions);
|
356
|
+
}
|
311
357
|
if (point.dataLabel) {
|
312
358
|
point.dataLabel.fadeIn(animationOptions);
|
313
359
|
}
|
314
360
|
});
|
361
|
+
this.animate = null;
|
315
362
|
}
|
316
363
|
|
317
364
|
};
|
@@ -320,9 +367,7 @@
|
|
320
367
|
* When drilling up, pull out the individual point graphics from the lower series
|
321
368
|
* and animate them into the origin point in the upper series.
|
322
369
|
*/
|
323
|
-
ColumnSeries.prototype.animateDrillupFrom =
|
324
|
-
PieSeries.prototype.animateDrillupFrom =
|
325
|
-
function (level) {
|
370
|
+
ColumnSeries.prototype.animateDrillupFrom = function (level) {
|
326
371
|
var animationOptions = this.chart.options.drilldown.animation,
|
327
372
|
group = this.group;
|
328
373
|
|
@@ -331,30 +376,75 @@
|
|
331
376
|
var graphic = point.graphic,
|
332
377
|
startColor = H.Color(point.color).rgba;
|
333
378
|
|
334
|
-
|
379
|
+
if (graphic) {
|
380
|
+
|
381
|
+
delete point.graphic;
|
335
382
|
|
336
|
-
|
337
|
-
|
383
|
+
/*jslint unparam: true*/
|
384
|
+
graphic.animate(level.shapeArgs, H.merge(animationOptions, {
|
338
385
|
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
386
|
+
step: function (val, fx) {
|
387
|
+
if (fx.prop === 'start') {
|
388
|
+
this.attr({
|
389
|
+
fill: tweenColors(startColor, H.Color(level.color).rgba, fx.pos)
|
390
|
+
});
|
391
|
+
}
|
392
|
+
},
|
393
|
+
complete: function () {
|
394
|
+
graphic.destroy();
|
395
|
+
if (group) {
|
396
|
+
group = group.destroy();
|
397
|
+
}
|
350
398
|
}
|
351
|
-
}
|
352
|
-
|
353
|
-
|
399
|
+
}));
|
400
|
+
/*jslint unparam: false*/
|
401
|
+
}
|
354
402
|
});
|
355
403
|
};
|
404
|
+
|
405
|
+
if (PieSeries) {
|
406
|
+
extend(PieSeries.prototype, {
|
407
|
+
supportsDrilldown: true,
|
408
|
+
animateDrillupTo: ColumnSeries.prototype.animateDrillupTo,
|
409
|
+
animateDrillupFrom: ColumnSeries.prototype.animateDrillupFrom,
|
410
|
+
|
411
|
+
animateDrilldown: function (init) {
|
412
|
+
var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
|
413
|
+
animationOptions = this.chart.options.drilldown.animation,
|
414
|
+
animateFrom = level.shapeArgs,
|
415
|
+
start = animateFrom.start,
|
416
|
+
angle = animateFrom.end - start,
|
417
|
+
startAngle = angle / this.points.length,
|
418
|
+
startColor = H.Color(level.color).rgba;
|
419
|
+
|
420
|
+
if (!init) {
|
421
|
+
each(this.points, function (point, i) {
|
422
|
+
var endColor = H.Color(point.color).rgba;
|
423
|
+
|
424
|
+
/*jslint unparam: true*/
|
425
|
+
point.graphic
|
426
|
+
.attr(H.merge(animateFrom, {
|
427
|
+
start: start + i * startAngle,
|
428
|
+
end: start + (i + 1) * startAngle
|
429
|
+
}))
|
430
|
+
.animate(point.shapeArgs, H.merge(animationOptions, {
|
431
|
+
step: function (val, fx) {
|
432
|
+
if (fx.prop === 'start') {
|
433
|
+
this.attr({
|
434
|
+
fill: tweenColors(startColor, endColor, fx.pos)
|
435
|
+
});
|
436
|
+
}
|
437
|
+
}
|
438
|
+
}));
|
439
|
+
/*jslint unparam: false*/
|
440
|
+
});
|
441
|
+
this.animate = null;
|
442
|
+
}
|
443
|
+
}
|
444
|
+
});
|
445
|
+
}
|
356
446
|
|
357
|
-
H.Point.prototype.doDrilldown = function () {
|
447
|
+
H.Point.prototype.doDrilldown = function (_holdRedraw) {
|
358
448
|
var series = this.series,
|
359
449
|
chart = series.chart,
|
360
450
|
drilldown = chart.options.drilldown,
|
@@ -375,7 +465,11 @@
|
|
375
465
|
});
|
376
466
|
|
377
467
|
if (seriesOptions) {
|
378
|
-
|
468
|
+
if (_holdRedraw) {
|
469
|
+
chart.addSingleSeriesAsDrilldown(this, seriesOptions);
|
470
|
+
} else {
|
471
|
+
chart.addSeriesAsDrilldown(this, seriesOptions);
|
472
|
+
}
|
379
473
|
}
|
380
474
|
|
381
475
|
};
|
@@ -402,10 +496,17 @@
|
|
402
496
|
.addClass('highcharts-drilldown-axis-label')
|
403
497
|
.css(chart.options.drilldown.activeAxisLabelStyle)
|
404
498
|
.on('click', function () {
|
405
|
-
|
406
|
-
point.doDrilldown
|
407
|
-
|
499
|
+
each(tickLabel.ddPoints, function (point) {
|
500
|
+
if (point.doDrilldown) {
|
501
|
+
point.doDrilldown(true);
|
502
|
+
}
|
503
|
+
});
|
504
|
+
chart.applyDrilldown();
|
408
505
|
});
|
506
|
+
if (!tickLabel.ddPoints) {
|
507
|
+
tickLabel.ddPoints = [];
|
508
|
+
}
|
509
|
+
tickLabel.ddPoints.push(point);
|
409
510
|
|
410
511
|
}
|
411
512
|
} else if (tickLabel && tickLabel._basicStyle) {
|
@@ -435,8 +536,6 @@
|
|
435
536
|
});
|
436
537
|
|
437
538
|
// Mark the trackers with a pointer
|
438
|
-
ColumnSeries.prototype.supportsDrilldown = true;
|
439
|
-
PieSeries.prototype.supportsDrilldown = true;
|
440
539
|
var type,
|
441
540
|
drawTrackerWrapper = function (proceed) {
|
442
541
|
proceed.call(this);
|