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
|
*
|
4
4
|
* 3D features for Highcharts JS
|
5
5
|
*
|
@@ -181,15 +181,6 @@
|
|
181
181
|
return area / 2;
|
182
182
|
}
|
183
183
|
|
184
|
-
function averageZ(vertexes) {
|
185
|
-
var z = 0,
|
186
|
-
i;
|
187
|
-
for (i = 0; i < vertexes.length; i++) {
|
188
|
-
z += vertexes[i].z;
|
189
|
-
}
|
190
|
-
return vertexes.length ? z / vertexes.length : 0;
|
191
|
-
}
|
192
|
-
|
193
184
|
/** Method to construct a curved path
|
194
185
|
* Can 'wrap' around more then 180 degrees
|
195
186
|
*/
|
@@ -256,16 +247,13 @@
|
|
256
247
|
|
257
248
|
// create the 3 sides
|
258
249
|
result.front = this.path(paths[0]).attr({
|
259
|
-
'class': 'highcharts-3d-front'
|
260
|
-
|
261
|
-
}).add(result);
|
250
|
+
'class': 'highcharts-3d-front'
|
251
|
+
}).add(result); // Front, top and side are never overlapping in our case so it is redundant to set zIndex of every element.
|
262
252
|
result.top = this.path(paths[1]).attr({
|
263
|
-
'class': 'highcharts-3d-top'
|
264
|
-
zIndex: paths[4]
|
253
|
+
'class': 'highcharts-3d-top'
|
265
254
|
}).add(result);
|
266
255
|
result.side = this.path(paths[2]).attr({
|
267
|
-
'class': 'highcharts-3d-side'
|
268
|
-
zIndex: paths[5]
|
256
|
+
'class': 'highcharts-3d-side'
|
269
257
|
}).add(result);
|
270
258
|
|
271
259
|
// apply the fill everywhere, the top a bit brighter, the side a bit darker
|
@@ -311,16 +299,13 @@
|
|
311
299
|
var shapeArgs = args.shapeArgs || args;
|
312
300
|
var paths = this.renderer.cuboidPath(shapeArgs);
|
313
301
|
this.front.attr({
|
314
|
-
d: paths[0]
|
315
|
-
zIndex: paths[3]
|
302
|
+
d: paths[0]
|
316
303
|
});
|
317
304
|
this.top.attr({
|
318
|
-
d: paths[1]
|
319
|
-
zIndex: paths[4]
|
305
|
+
d: paths[1]
|
320
306
|
});
|
321
307
|
this.side.attr({
|
322
|
-
d: paths[2]
|
323
|
-
zIndex: paths[5]
|
308
|
+
d: paths[2]
|
324
309
|
});
|
325
310
|
} else {
|
326
311
|
return H.SVGElement.prototype.attr.call(this, args); // getter returns value
|
@@ -332,23 +317,17 @@
|
|
332
317
|
result.animate = function(args, duration, complete) {
|
333
318
|
if (defined(args.x) && defined(args.y)) {
|
334
319
|
var paths = this.renderer.cuboidPath(args);
|
335
|
-
this.front.
|
336
|
-
zIndex: paths[3]
|
337
|
-
}).animate({
|
320
|
+
this.front.animate({
|
338
321
|
d: paths[0]
|
339
322
|
}, duration, complete);
|
340
|
-
this.top.
|
341
|
-
zIndex: paths[4]
|
342
|
-
}).animate({
|
323
|
+
this.top.animate({
|
343
324
|
d: paths[1]
|
344
325
|
}, duration, complete);
|
345
|
-
this.side.
|
346
|
-
zIndex: paths[5]
|
347
|
-
}).animate({
|
326
|
+
this.side.animate({
|
348
327
|
d: paths[2]
|
349
328
|
}, duration, complete);
|
350
329
|
this.attr({
|
351
|
-
zIndex: -paths[
|
330
|
+
zIndex: -paths[3] // #4774
|
352
331
|
});
|
353
332
|
} else if (args.opacity) {
|
354
333
|
this.front.animate(args, duration, complete);
|
@@ -371,7 +350,7 @@
|
|
371
350
|
|
372
351
|
// Apply the Z index to the cuboid group
|
373
352
|
result.attr({
|
374
|
-
zIndex: -paths[
|
353
|
+
zIndex: -paths[3]
|
375
354
|
});
|
376
355
|
|
377
356
|
return result;
|
@@ -380,57 +359,72 @@
|
|
380
359
|
/**
|
381
360
|
* Generates a cuboid
|
382
361
|
*/
|
383
|
-
SVGRenderer.prototype.cuboidPath = function(shapeArgs) {
|
362
|
+
H.SVGRenderer.prototype.cuboidPath = function(shapeArgs) {
|
384
363
|
var x = shapeArgs.x,
|
385
364
|
y = shapeArgs.y,
|
386
365
|
z = shapeArgs.z,
|
387
366
|
h = shapeArgs.height,
|
388
367
|
w = shapeArgs.width,
|
389
368
|
d = shapeArgs.depth,
|
390
|
-
chart = charts[this.chartIndex]
|
369
|
+
chart = charts[this.chartIndex],
|
370
|
+
front,
|
371
|
+
back,
|
372
|
+
top,
|
373
|
+
bottom,
|
374
|
+
left,
|
375
|
+
right,
|
376
|
+
shape,
|
377
|
+
path1,
|
378
|
+
path2,
|
379
|
+
path3,
|
380
|
+
isFront,
|
381
|
+
isTop,
|
382
|
+
isRight,
|
383
|
+
options3d = chart.options.chart.options3d,
|
384
|
+
alpha = options3d.alpha,
|
385
|
+
// Priority for x axis is the biggest,
|
386
|
+
// because of x direction has biggest influence on zIndex
|
387
|
+
incrementX = 10000,
|
388
|
+
// y axis has the smallest priority in case of our charts
|
389
|
+
// (needs to be set because of stacking)
|
390
|
+
incrementY = 10,
|
391
|
+
incrementZ = 100,
|
392
|
+
zIndex = 0;
|
391
393
|
|
392
394
|
// The 8 corners of the cube
|
393
395
|
var pArr = [{
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
z: z + d
|
427
|
-
},
|
428
|
-
{
|
429
|
-
x: x,
|
430
|
-
y: y,
|
431
|
-
z: z + d
|
432
|
-
}
|
433
|
-
];
|
396
|
+
x: x,
|
397
|
+
y: y,
|
398
|
+
z: z
|
399
|
+
}, {
|
400
|
+
x: x + w,
|
401
|
+
y: y,
|
402
|
+
z: z
|
403
|
+
}, {
|
404
|
+
x: x + w,
|
405
|
+
y: y + h,
|
406
|
+
z: z
|
407
|
+
}, {
|
408
|
+
x: x,
|
409
|
+
y: y + h,
|
410
|
+
z: z
|
411
|
+
}, {
|
412
|
+
x: x,
|
413
|
+
y: y + h,
|
414
|
+
z: z + d
|
415
|
+
}, {
|
416
|
+
x: x + w,
|
417
|
+
y: y + h,
|
418
|
+
z: z + d
|
419
|
+
}, {
|
420
|
+
x: x + w,
|
421
|
+
y: y,
|
422
|
+
z: z + d
|
423
|
+
}, {
|
424
|
+
x: x,
|
425
|
+
y: y,
|
426
|
+
z: z + d
|
427
|
+
}];
|
434
428
|
|
435
429
|
// apply perspective
|
436
430
|
pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);
|
@@ -439,34 +433,81 @@
|
|
439
433
|
function mapPath(i) {
|
440
434
|
return pArr[i];
|
441
435
|
}
|
436
|
+
|
437
|
+
/*
|
438
|
+
* First value - path with specific side
|
439
|
+
* Second value - added information about side for later calculations.
|
440
|
+
* Possible second values are 0 for path1, 1 for path2 and -1 for no path choosed.
|
441
|
+
*/
|
442
442
|
var pickShape = function(path1, path2) {
|
443
|
-
var ret = [
|
443
|
+
var ret = [
|
444
|
+
[], -1
|
445
|
+
];
|
444
446
|
path1 = map(path1, mapPath);
|
445
447
|
path2 = map(path2, mapPath);
|
446
448
|
if (shapeArea(path1) < 0) {
|
447
|
-
ret = path1;
|
449
|
+
ret = [path1, 0];
|
448
450
|
} else if (shapeArea(path2) < 0) {
|
449
|
-
ret = path2;
|
451
|
+
ret = [path2, 1];
|
450
452
|
}
|
451
453
|
return ret;
|
452
454
|
};
|
453
455
|
|
454
456
|
// front or back
|
455
|
-
|
456
|
-
|
457
|
-
|
457
|
+
front = [3, 2, 1, 0];
|
458
|
+
back = [7, 6, 5, 4];
|
459
|
+
shape = pickShape(front, back);
|
460
|
+
path1 = shape[0];
|
461
|
+
isFront = shape[1];
|
462
|
+
|
458
463
|
|
459
464
|
// top or bottom
|
460
|
-
|
461
|
-
|
462
|
-
|
465
|
+
top = [1, 6, 7, 0];
|
466
|
+
bottom = [4, 5, 2, 3];
|
467
|
+
shape = pickShape(top, bottom);
|
468
|
+
path2 = shape[0];
|
469
|
+
isTop = shape[1];
|
463
470
|
|
464
471
|
// side
|
465
|
-
|
466
|
-
|
467
|
-
|
472
|
+
right = [1, 2, 5, 6];
|
473
|
+
left = [0, 7, 4, 3];
|
474
|
+
shape = pickShape(right, left);
|
475
|
+
path3 = shape[0];
|
476
|
+
isRight = shape[1];
|
477
|
+
|
478
|
+
/*
|
479
|
+
* New block used for calculating zIndex. It is basing on X, Y and Z position of specific columns.
|
480
|
+
* All zIndexes (for X, Y and Z values) are added to the final zIndex, where every value has different priority.
|
481
|
+
* The biggest priority is in X and Z directions, the lowest index is for stacked columns (Y direction and the same X and Z positions).
|
482
|
+
* Big differents between priorities is made because we need to ensure that even for big changes in Y and Z parameters
|
483
|
+
* all columns will be drawn correctly.
|
484
|
+
*/
|
485
|
+
|
486
|
+
if (isRight === 1) {
|
487
|
+
zIndex += incrementX * (1000 - x);
|
488
|
+
} else if (!isRight) {
|
489
|
+
zIndex += incrementX * x;
|
490
|
+
}
|
491
|
+
|
492
|
+
zIndex += incrementY * (!isTop ||
|
493
|
+
(alpha >= 0 && alpha <= 180 || alpha < 360 && alpha > 357.5) ? // Numbers checked empirically
|
494
|
+
chart.plotHeight - y : 10 + y
|
495
|
+
);
|
496
|
+
|
497
|
+
if (isFront === 1) {
|
498
|
+
zIndex += incrementZ * (z);
|
499
|
+
} else if (!isFront) {
|
500
|
+
zIndex += incrementZ * (1000 - z);
|
501
|
+
}
|
468
502
|
|
469
|
-
|
503
|
+
zIndex = -Math.round(zIndex);
|
504
|
+
|
505
|
+
return [
|
506
|
+
this.toLinePath(path1, true),
|
507
|
+
this.toLinePath(path2, true),
|
508
|
+
this.toLinePath(path3, true),
|
509
|
+
zIndex
|
510
|
+
]; // #4774
|
470
511
|
};
|
471
512
|
|
472
513
|
////// SECTORS //////
|
@@ -1338,7 +1379,7 @@
|
|
1338
1379
|
var path = proceed.apply(this, [].slice.call(arguments, 1));
|
1339
1380
|
|
1340
1381
|
// Do not do this if the chart is not 3D
|
1341
|
-
if (!this.axis.chart.is3d() || this.coll === 'colorAxis') {
|
1382
|
+
if (!this.axis.chart.is3d() || this.axis.coll === 'colorAxis') {
|
1342
1383
|
return path;
|
1343
1384
|
}
|
1344
1385
|
|
@@ -1367,7 +1408,7 @@
|
|
1367
1408
|
var pos = proceed.apply(this, [].slice.call(arguments, 1));
|
1368
1409
|
|
1369
1410
|
// Do not do this if the chart is not 3D
|
1370
|
-
if (this.axis.chart.is3d() && this.coll !== 'colorAxis') {
|
1411
|
+
if (this.axis.chart.is3d() && this.axis.coll !== 'colorAxis') {
|
1371
1412
|
pos = perspective([this.axis.swapZ({
|
1372
1413
|
x: pos.x,
|
1373
1414
|
y: pos.y,
|
@@ -1538,8 +1579,10 @@
|
|
1538
1579
|
pick = H.pick,
|
1539
1580
|
Series = H.Series,
|
1540
1581
|
seriesTypes = H.seriesTypes,
|
1582
|
+
inArray = H.inArray,
|
1541
1583
|
svg = H.svg,
|
1542
1584
|
wrap = H.wrap;
|
1585
|
+
|
1543
1586
|
/***
|
1544
1587
|
EXTENSION FOR 3D COLUMNS
|
1545
1588
|
***/
|
@@ -1554,9 +1597,17 @@
|
|
1554
1597
|
var series = this,
|
1555
1598
|
chart = series.chart,
|
1556
1599
|
seriesOptions = series.options,
|
1557
|
-
depth = seriesOptions.depth || 25
|
1600
|
+
depth = seriesOptions.depth || 25,
|
1601
|
+
borderCrisp = series.borderWidth % 2 ? 0.5 : 0;
|
1602
|
+
|
1603
|
+
if (
|
1604
|
+
(chart.inverted && !series.yAxis.reversed) ||
|
1605
|
+
(!chart.inverted && series.yAxis.reversed)
|
1606
|
+
) {
|
1607
|
+
borderCrisp *= -1;
|
1608
|
+
}
|
1558
1609
|
|
1559
|
-
var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series.
|
1610
|
+
var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series.index; // #4743
|
1560
1611
|
var z = stack * (depth + (seriesOptions.groupZPadding || 1));
|
1561
1612
|
|
1562
1613
|
if (seriesOptions.grouping !== false) {
|
@@ -1564,11 +1615,37 @@
|
|
1564
1615
|
}
|
1565
1616
|
|
1566
1617
|
z += (seriesOptions.groupZPadding || 1);
|
1567
|
-
|
1568
1618
|
each(series.data, function(point) {
|
1569
1619
|
if (point.y !== null) {
|
1570
1620
|
var shapeArgs = point.shapeArgs,
|
1571
|
-
tooltipPos = point.tooltipPos
|
1621
|
+
tooltipPos = point.tooltipPos,
|
1622
|
+
// Array for final shapeArgs calculation.
|
1623
|
+
// We are checking two dimensions (x and y).
|
1624
|
+
dimensions = [
|
1625
|
+
['x', 'width'],
|
1626
|
+
['y', 'height']
|
1627
|
+
],
|
1628
|
+
borderlessBase; // crisped rects can have +/- 0.5 pixels offset
|
1629
|
+
|
1630
|
+
// #3131 We need to check if column shape arguments are inside plotArea.
|
1631
|
+
each(dimensions, function(d) {
|
1632
|
+
borderlessBase = shapeArgs[d[0]] - borderCrisp;
|
1633
|
+
if (
|
1634
|
+
borderlessBase + shapeArgs[d[1]] < 0 || // End column position is smaller than axis start.
|
1635
|
+
borderlessBase > series[d[0] + 'Axis'].len // Start column position is bigger than axis end.
|
1636
|
+
) {
|
1637
|
+
for (var key in shapeArgs) { // Set args to 0 if column is outside the chart.
|
1638
|
+
shapeArgs[key] = 0;
|
1639
|
+
}
|
1640
|
+
}
|
1641
|
+
if (borderlessBase < 0) {
|
1642
|
+
shapeArgs[d[1]] += shapeArgs[d[0]];
|
1643
|
+
shapeArgs[d[0]] = 0;
|
1644
|
+
}
|
1645
|
+
if (borderlessBase + shapeArgs[d[1]] > series[d[0] + 'Axis'].len) {
|
1646
|
+
shapeArgs[d[1]] = series[d[0] + 'Axis'].len - shapeArgs[d[0]];
|
1647
|
+
}
|
1648
|
+
});
|
1572
1649
|
|
1573
1650
|
point.shapeType = 'cuboid';
|
1574
1651
|
shapeArgs.z = z;
|
@@ -1637,6 +1714,44 @@
|
|
1637
1714
|
}
|
1638
1715
|
});
|
1639
1716
|
|
1717
|
+
/*
|
1718
|
+
* In case of 3d columns there is no sense to add this columns
|
1719
|
+
* to a specific series group - if series is added to a group
|
1720
|
+
* all columns will have the same zIndex in comparison with different series
|
1721
|
+
*/
|
1722
|
+
|
1723
|
+
wrap(seriesTypes.column.prototype, 'plotGroup', function(proceed, prop, name, visibility, zIndex, parent) {
|
1724
|
+
if (this.chart.is3d() && parent && !this[prop]) {
|
1725
|
+
this[prop] = parent;
|
1726
|
+
parent.attr(this.getPlotBox());
|
1727
|
+
this[prop].survive = true;
|
1728
|
+
}
|
1729
|
+
return proceed.apply(this, Array.prototype.slice.call(arguments, 1));
|
1730
|
+
});
|
1731
|
+
|
1732
|
+
/*
|
1733
|
+
* When series is not added to group it is needed to change
|
1734
|
+
* setVisible method to allow correct Legend funcionality
|
1735
|
+
* This wrap is basing on pie chart series
|
1736
|
+
*/
|
1737
|
+
wrap(seriesTypes.column.prototype, 'setVisible', function(proceed, vis) {
|
1738
|
+
var series = this,
|
1739
|
+
pointVis;
|
1740
|
+
if (series.chart.is3d()) {
|
1741
|
+
each(series.data, function(point) {
|
1742
|
+
point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;
|
1743
|
+
pointVis = vis ? 'visible' : 'hidden';
|
1744
|
+
series.options.data[inArray(point, series.data)] = point.options;
|
1745
|
+
if (point.graphic) {
|
1746
|
+
point.graphic.attr({
|
1747
|
+
visibility: pointVis
|
1748
|
+
});
|
1749
|
+
}
|
1750
|
+
});
|
1751
|
+
}
|
1752
|
+
proceed.apply(this, Array.prototype.slice.call(arguments, 1));
|
1753
|
+
});
|
1754
|
+
|
1640
1755
|
wrap(seriesTypes.column.prototype, 'init', function(proceed) {
|
1641
1756
|
proceed.apply(this, [].slice.call(arguments, 1));
|
1642
1757
|
|
@@ -1684,24 +1799,11 @@
|
|
1684
1799
|
wrap(seriesTypes.column.prototype, 'pointAttribs', pointAttribs);
|
1685
1800
|
if (seriesTypes.columnrange) {
|
1686
1801
|
wrap(seriesTypes.columnrange.prototype, 'pointAttribs', pointAttribs);
|
1802
|
+
seriesTypes.columnrange.prototype.plotGroup = seriesTypes.column.prototype.plotGroup;
|
1803
|
+
seriesTypes.columnrange.prototype.setVisible = seriesTypes.column.prototype.setVisible;
|
1687
1804
|
}
|
1688
1805
|
|
1689
1806
|
|
1690
|
-
function draw3DPoints(proceed) {
|
1691
|
-
// Do not do this if the chart is not 3D
|
1692
|
-
if (this.chart.is3d()) {
|
1693
|
-
var grouping = this.chart.options.plotOptions.column.grouping;
|
1694
|
-
if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) {
|
1695
|
-
this.group.attr({
|
1696
|
-
zIndex: this.group.zIndex * 10
|
1697
|
-
});
|
1698
|
-
this.zIndexSet = true; // #4062 set zindex only once
|
1699
|
-
}
|
1700
|
-
}
|
1701
|
-
|
1702
|
-
proceed.apply(this, [].slice.call(arguments, 1));
|
1703
|
-
}
|
1704
|
-
|
1705
1807
|
wrap(Series.prototype, 'alignDataLabel', function(proceed) {
|
1706
1808
|
|
1707
1809
|
// Only do this for 3D columns and columnranges
|
@@ -1725,12 +1827,6 @@
|
|
1725
1827
|
proceed.apply(this, [].slice.call(arguments, 1));
|
1726
1828
|
});
|
1727
1829
|
|
1728
|
-
if (seriesTypes.columnrange) {
|
1729
|
-
wrap(seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints);
|
1730
|
-
}
|
1731
|
-
|
1732
|
-
wrap(seriesTypes.column.prototype, 'drawPoints', draw3DPoints);
|
1733
|
-
|
1734
1830
|
/***
|
1735
1831
|
EXTENSION FOR 3D CYLINDRICAL COLUMNS
|
1736
1832
|
Not supported
|