highcharts-rails 5.0.14 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +60 -0
- data/Rakefile +54 -5
- data/app/assets/images/highcharts/earth.svg +432 -0
- data/app/assets/javascripts/highcharts.js +5103 -3147
- data/app/assets/javascripts/highcharts/highcharts-3d.js +930 -277
- data/app/assets/javascripts/highcharts/highcharts-more.js +1374 -249
- data/app/assets/javascripts/highcharts/lib/canvg.js +3073 -0
- data/app/assets/javascripts/highcharts/lib/jspdf.js +16624 -0
- data/app/assets/javascripts/highcharts/lib/rgbcolor.js +299 -0
- data/app/assets/javascripts/highcharts/lib/svg2pdf.js +3488 -0
- data/app/assets/javascripts/highcharts/modules/accessibility.js +654 -212
- data/app/assets/javascripts/highcharts/modules/annotations.js +1552 -274
- data/app/assets/javascripts/highcharts/modules/boost-canvas.js +773 -0
- data/app/assets/javascripts/highcharts/modules/boost.js +636 -210
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +2 -2
- data/app/assets/javascripts/highcharts/modules/bullet.js +364 -0
- data/app/assets/javascripts/highcharts/modules/data.js +766 -38
- data/app/assets/javascripts/highcharts/modules/drag-panes.js +588 -0
- data/app/assets/javascripts/highcharts/modules/drilldown.js +106 -36
- data/app/assets/javascripts/highcharts/modules/export-data.js +597 -0
- data/app/assets/javascripts/highcharts/modules/exporting.js +424 -162
- data/app/assets/javascripts/highcharts/modules/funnel.js +144 -22
- data/app/assets/javascripts/highcharts/modules/gantt.js +1154 -0
- data/app/assets/javascripts/highcharts/modules/grid-axis.js +1 -1
- data/app/assets/javascripts/highcharts/modules/heatmap.js +406 -80
- data/app/assets/javascripts/highcharts/modules/histogram-bellcurve.js +513 -0
- data/app/assets/javascripts/highcharts/modules/item-series.js +126 -0
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +31 -13
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +179 -57
- data/app/assets/javascripts/highcharts/modules/oldie.js +1378 -0
- data/app/assets/javascripts/highcharts/modules/overlapping-datalabels.js +8 -6
- data/app/assets/javascripts/highcharts/modules/parallel-coordinates.js +494 -0
- data/app/assets/javascripts/highcharts/modules/pareto.js +275 -0
- data/app/assets/javascripts/highcharts/modules/sankey.js +641 -0
- data/app/assets/javascripts/highcharts/modules/series-label.js +355 -145
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +122 -1
- data/app/assets/javascripts/highcharts/modules/static-scale.js +64 -0
- data/app/assets/javascripts/highcharts/modules/stock.js +1944 -676
- data/app/assets/javascripts/highcharts/modules/streamgraph.js +139 -0
- data/app/assets/javascripts/highcharts/modules/sunburst.js +2403 -0
- data/app/assets/javascripts/highcharts/modules/tilemap.js +1199 -0
- data/app/assets/javascripts/highcharts/modules/treemap.js +538 -134
- data/app/assets/javascripts/highcharts/modules/variable-pie.js +490 -0
- data/app/assets/javascripts/highcharts/modules/variwide.js +283 -0
- data/app/assets/javascripts/highcharts/modules/vector.js +294 -0
- data/app/assets/javascripts/highcharts/modules/windbarb.js +490 -0
- data/app/assets/javascripts/highcharts/modules/wordcloud.js +681 -0
- data/app/assets/javascripts/highcharts/modules/xrange.js +615 -0
- data/app/assets/javascripts/highcharts/themes/avocado.js +54 -0
- data/app/assets/javascripts/highcharts/themes/dark-blue.js +6 -6
- data/app/assets/javascripts/highcharts/themes/dark-green.js +6 -6
- data/app/assets/javascripts/highcharts/themes/dark-unica.js +6 -6
- data/app/assets/javascripts/highcharts/themes/gray.js +14 -10
- data/app/assets/javascripts/highcharts/themes/grid-light.js +6 -6
- data/app/assets/javascripts/highcharts/themes/grid.js +7 -5
- data/app/assets/javascripts/highcharts/themes/sand-signika.js +8 -7
- data/app/assets/javascripts/highcharts/themes/skies.js +15 -9
- data/app/assets/javascripts/highcharts/themes/sunset.js +53 -0
- data/app/assets/stylesheets/highcharts/highcharts.css +802 -0
- data/app/assets/stylesheets/highcharts/highcharts.scss +665 -0
- data/lib/highcharts/version.rb +1 -1
- metadata +31 -1
@@ -0,0 +1,126 @@
|
|
1
|
+
/**
|
2
|
+
* @license Highcharts JS v6.0.0 (2017-10-04)
|
3
|
+
*
|
4
|
+
* Item series type for Highcharts
|
5
|
+
*
|
6
|
+
* (c) 2010-2017 Torstein Honsi
|
7
|
+
*
|
8
|
+
* License: www.highcharts.com/license
|
9
|
+
*/
|
10
|
+
'use strict';
|
11
|
+
(function(factory) {
|
12
|
+
if (typeof module === 'object' && module.exports) {
|
13
|
+
module.exports = factory;
|
14
|
+
} else {
|
15
|
+
factory(Highcharts);
|
16
|
+
}
|
17
|
+
}(function(Highcharts) {
|
18
|
+
(function(H) {
|
19
|
+
/**
|
20
|
+
* (c) 2009-2017 Torstein Honsi
|
21
|
+
*
|
22
|
+
* Item series type for Highcharts
|
23
|
+
*
|
24
|
+
* License: www.highcharts.com/license
|
25
|
+
*/
|
26
|
+
|
27
|
+
/**
|
28
|
+
* @todo
|
29
|
+
* - Check update, remove etc.
|
30
|
+
* - Custom icons like persons, carts etc. Either as images, font icons or
|
31
|
+
* Highcharts symbols.
|
32
|
+
*/
|
33
|
+
var each = H.each,
|
34
|
+
extend = H.extend,
|
35
|
+
pick = H.pick,
|
36
|
+
seriesType = H.seriesType;
|
37
|
+
|
38
|
+
seriesType('item', 'column', {
|
39
|
+
itemPadding: 0.2,
|
40
|
+
marker: {
|
41
|
+
symbol: 'circle',
|
42
|
+
states: {
|
43
|
+
hover: {},
|
44
|
+
select: {}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}, {
|
48
|
+
drawPoints: function() {
|
49
|
+
var series = this,
|
50
|
+
renderer = series.chart.renderer,
|
51
|
+
seriesMarkerOptions = this.options.marker;
|
52
|
+
|
53
|
+
each(this.points, function(point) {
|
54
|
+
var yPos,
|
55
|
+
attr,
|
56
|
+
graphics,
|
57
|
+
itemY,
|
58
|
+
pointAttr,
|
59
|
+
pointMarkerOptions = point.marker || {},
|
60
|
+
symbol = (
|
61
|
+
pointMarkerOptions.symbol ||
|
62
|
+
seriesMarkerOptions.symbol
|
63
|
+
),
|
64
|
+
size,
|
65
|
+
yTop;
|
66
|
+
|
67
|
+
point.graphics = graphics = point.graphics || {};
|
68
|
+
pointAttr = point.pointAttr ?
|
69
|
+
(
|
70
|
+
point.pointAttr[point.selected ? 'selected' : ''] ||
|
71
|
+
series.pointAttr['']
|
72
|
+
) :
|
73
|
+
series.pointAttribs(point, point.selected && 'select');
|
74
|
+
delete pointAttr.r;
|
75
|
+
|
76
|
+
if (point.y !== null) {
|
77
|
+
|
78
|
+
if (!point.graphic) {
|
79
|
+
point.graphic = renderer.g('point').add(series.group);
|
80
|
+
}
|
81
|
+
|
82
|
+
itemY = point.y;
|
83
|
+
yTop = pick(point.stackY, point.y);
|
84
|
+
size = Math.min(
|
85
|
+
point.pointWidth,
|
86
|
+
(
|
87
|
+
series.yAxis.transA *
|
88
|
+
(1 - series.options.itemPadding)
|
89
|
+
)
|
90
|
+
);
|
91
|
+
for (yPos = yTop; yPos > yTop - point.y; yPos--) {
|
92
|
+
|
93
|
+
attr = {
|
94
|
+
x: point.barX + point.pointWidth / 2 - size / 2,
|
95
|
+
y: series.yAxis.toPixels(yPos, true) - size / 2,
|
96
|
+
width: size,
|
97
|
+
height: size
|
98
|
+
};
|
99
|
+
|
100
|
+
if (graphics[itemY]) {
|
101
|
+
graphics[itemY].animate(attr);
|
102
|
+
} else {
|
103
|
+
graphics[itemY] = renderer.symbol(symbol)
|
104
|
+
.attr(extend(attr, pointAttr))
|
105
|
+
.add(point.graphic);
|
106
|
+
}
|
107
|
+
graphics[itemY].isActive = true;
|
108
|
+
itemY--;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
H.objectEach(graphics, function(graphic, key) {
|
112
|
+
if (!graphic.isActive) {
|
113
|
+
graphic.destroy();
|
114
|
+
delete graphic[key];
|
115
|
+
} else {
|
116
|
+
graphic.isActive = false;
|
117
|
+
}
|
118
|
+
});
|
119
|
+
});
|
120
|
+
|
121
|
+
}
|
122
|
+
});
|
123
|
+
|
124
|
+
|
125
|
+
}(Highcharts));
|
126
|
+
}));
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS
|
2
|
+
* @license Highcharts JS v6.0.0 (2017-10-04)
|
3
3
|
* Plugin for displaying a message when there is no data visible in chart.
|
4
4
|
*
|
5
5
|
* (c) 2010-2017 Highsoft AS
|
@@ -33,6 +33,16 @@
|
|
33
33
|
|
34
34
|
// Add language option
|
35
35
|
extend(defaultOptions.lang, {
|
36
|
+
/**
|
37
|
+
* The text to display when the chart contains no data. Requires the
|
38
|
+
* no-data module, see [noData](#noData).
|
39
|
+
*
|
40
|
+
* @type {String}
|
41
|
+
* @default No data to display
|
42
|
+
* @since 3.0.8
|
43
|
+
* @product highcharts
|
44
|
+
* @apioption lang.noData
|
45
|
+
*/
|
36
46
|
noData: 'No data to display'
|
37
47
|
});
|
38
48
|
|
@@ -46,13 +56,21 @@
|
|
46
56
|
*/
|
47
57
|
defaultOptions.noData = {
|
48
58
|
|
59
|
+
/**
|
60
|
+
* An object of additional SVG attributes for the no-data label.
|
61
|
+
*
|
62
|
+
* @type {Object}
|
63
|
+
* @since 3.0.8
|
64
|
+
* @product highcharts highstock
|
65
|
+
* @apioption noData.attr
|
66
|
+
*/
|
67
|
+
|
49
68
|
/**
|
50
69
|
* The position of the no-data label, relative to the plot area.
|
51
70
|
*
|
52
71
|
* @type {Object}
|
53
72
|
* @default { "x": 0, "y": 0, "align": "center", "verticalAlign": "middle" }
|
54
73
|
* @since 3.0.8
|
55
|
-
* @product highcharts highstock highmaps
|
56
74
|
*/
|
57
75
|
position: {
|
58
76
|
|
@@ -80,7 +98,6 @@
|
|
80
98
|
* @validvalue ["left", "center", "right"]
|
81
99
|
* @type {String}
|
82
100
|
* @default center
|
83
|
-
* @product highcharts highstock highmaps
|
84
101
|
*/
|
85
102
|
align: 'center',
|
86
103
|
|
@@ -94,7 +111,17 @@
|
|
94
111
|
*/
|
95
112
|
verticalAlign: 'middle'
|
96
113
|
}
|
97
|
-
|
114
|
+
|
115
|
+
/**
|
116
|
+
* Whether to insert the label as HTML, or as pseudo-HTML rendered with
|
117
|
+
* SVG.
|
118
|
+
*
|
119
|
+
* @type {Boolean}
|
120
|
+
* @default false
|
121
|
+
* @since 4.1.10
|
122
|
+
* @product highcharts highstock
|
123
|
+
* @apioption noData.useHTML
|
124
|
+
*/
|
98
125
|
};
|
99
126
|
|
100
127
|
|
@@ -104,17 +131,8 @@
|
|
104
131
|
* @optionparent noData.style
|
105
132
|
*/
|
106
133
|
defaultOptions.noData.style = {
|
107
|
-
|
108
|
-
/**
|
109
|
-
*/
|
110
134
|
fontWeight: 'bold',
|
111
|
-
|
112
|
-
/**
|
113
|
-
*/
|
114
135
|
fontSize: '12px',
|
115
|
-
|
116
|
-
/**
|
117
|
-
*/
|
118
136
|
color: '#666666'
|
119
137
|
};
|
120
138
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS
|
2
|
+
* @license Highcharts JS v6.0.0 (2017-10-04)
|
3
3
|
* Client side exporting module
|
4
4
|
*
|
5
5
|
* (c) 2015 Torstein Honsi / Oystein Moseng
|
@@ -23,7 +23,7 @@
|
|
23
23
|
* License: www.highcharts.com/license
|
24
24
|
*/
|
25
25
|
|
26
|
-
/*global MSBlobBuilder */
|
26
|
+
/* global MSBlobBuilder */
|
27
27
|
|
28
28
|
var merge = Highcharts.merge,
|
29
29
|
win = Highcharts.win,
|
@@ -33,7 +33,8 @@
|
|
33
33
|
domurl = win.URL || win.webkitURL || win,
|
34
34
|
isMSBrowser = /Edge\/|Trident\/|MSIE /.test(nav.userAgent),
|
35
35
|
isEdgeBrowser = /Edge\/\d+/.test(nav.userAgent),
|
36
|
-
|
36
|
+
// Milliseconds to defer image load event handlers to offset IE bug
|
37
|
+
loadEventDeferDelay = isMSBrowser ? 150 : 0;
|
37
38
|
|
38
39
|
// Dummy object so we can reuse our canvas-tools.js without errors
|
39
40
|
Highcharts.CanVGRenderer = {};
|
@@ -52,7 +53,7 @@
|
|
52
53
|
script.src = scriptLocation;
|
53
54
|
script.onload = callback;
|
54
55
|
script.onerror = function() {
|
55
|
-
|
56
|
+
Highcharts.error('Error loading script ' + scriptLocation);
|
56
57
|
};
|
57
58
|
|
58
59
|
head.appendChild(script);
|
@@ -133,10 +134,15 @@
|
|
133
134
|
|
134
135
|
// Get blob URL from SVG code. Falls back to normal data URI.
|
135
136
|
Highcharts.svgToDataUrl = function(svg) {
|
136
|
-
|
137
|
+
// Webkit and not chrome
|
138
|
+
var webKit = (
|
139
|
+
nav.userAgent.indexOf('WebKit') > -1 &&
|
140
|
+
nav.userAgent.indexOf('Chrome') < 0
|
141
|
+
);
|
137
142
|
try {
|
138
|
-
// Safari requires data URI since it doesn't allow navigation to blob
|
139
|
-
// Firefox has an issue with Blobs and internal references,
|
143
|
+
// Safari requires data URI since it doesn't allow navigation to blob
|
144
|
+
// URLs. Firefox has an issue with Blobs and internal references,
|
145
|
+
// leading to gradients not working using Blobs (#4550)
|
140
146
|
if (!webKit && nav.userAgent.toLowerCase().indexOf('firefox') < 0) {
|
141
147
|
return domurl.createObjectURL(new win.Blob([svg], {
|
142
148
|
type: 'image/svg+xml;charset-utf-16'
|
@@ -149,9 +155,21 @@
|
|
149
155
|
};
|
150
156
|
|
151
157
|
// Get data:URL from image URL
|
152
|
-
// Pass in callbacks to handle results. finallyCallback is always called at the
|
153
|
-
//
|
154
|
-
|
158
|
+
// Pass in callbacks to handle results. finallyCallback is always called at the
|
159
|
+
// end of the process. Supplying this callback is optional. All callbacks
|
160
|
+
// receive four arguments: imageURL, imageType, callbackArgs and scale.
|
161
|
+
// callbackArgs is used only by callbacks and can contain whatever.
|
162
|
+
Highcharts.imageToDataUrl = function(
|
163
|
+
imageURL,
|
164
|
+
imageType,
|
165
|
+
callbackArgs,
|
166
|
+
scale,
|
167
|
+
successCallback,
|
168
|
+
taintedCallback,
|
169
|
+
noCanvasSupportCallback,
|
170
|
+
failedLoadCallback,
|
171
|
+
finallyCallback
|
172
|
+
) {
|
155
173
|
var img = new win.Image(),
|
156
174
|
taintedHandler,
|
157
175
|
loadHandler = function() {
|
@@ -161,7 +179,12 @@
|
|
161
179
|
dataURL;
|
162
180
|
try {
|
163
181
|
if (!ctx) {
|
164
|
-
noCanvasSupportCallback(
|
182
|
+
noCanvasSupportCallback(
|
183
|
+
imageURL,
|
184
|
+
imageType,
|
185
|
+
callbackArgs,
|
186
|
+
scale
|
187
|
+
);
|
165
188
|
} else {
|
166
189
|
canvas.height = img.height * scale;
|
167
190
|
canvas.width = img.width * scale;
|
@@ -170,17 +193,34 @@
|
|
170
193
|
// Now we try to get the contents of the canvas.
|
171
194
|
try {
|
172
195
|
dataURL = canvas.toDataURL(imageType);
|
173
|
-
successCallback(
|
196
|
+
successCallback(
|
197
|
+
dataURL,
|
198
|
+
imageType,
|
199
|
+
callbackArgs,
|
200
|
+
scale
|
201
|
+
);
|
174
202
|
} catch (e) {
|
175
|
-
taintedHandler(
|
203
|
+
taintedHandler(
|
204
|
+
imageURL,
|
205
|
+
imageType,
|
206
|
+
callbackArgs,
|
207
|
+
scale
|
208
|
+
);
|
176
209
|
}
|
177
210
|
}
|
178
211
|
} finally {
|
179
212
|
if (finallyCallback) {
|
180
|
-
finallyCallback(
|
213
|
+
finallyCallback(
|
214
|
+
imageURL,
|
215
|
+
imageType,
|
216
|
+
callbackArgs,
|
217
|
+
scale
|
218
|
+
);
|
181
219
|
}
|
182
220
|
}
|
183
|
-
|
221
|
+
// IE bug where image is not always ready despite calling load
|
222
|
+
// event.
|
223
|
+
}, loadEventDeferDelay);
|
184
224
|
},
|
185
225
|
// Image load failed (e.g. invalid URL)
|
186
226
|
errorHandler = function() {
|
@@ -190,12 +230,13 @@
|
|
190
230
|
}
|
191
231
|
};
|
192
232
|
|
193
|
-
// This is called on load if the image drawing to canvas failed with a
|
194
|
-
// We retry the drawing with crossOrigin set to Anonymous.
|
233
|
+
// This is called on load if the image drawing to canvas failed with a
|
234
|
+
// security error. We retry the drawing with crossOrigin set to Anonymous.
|
195
235
|
taintedHandler = function() {
|
196
236
|
img = new win.Image();
|
197
237
|
taintedHandler = taintedCallback;
|
198
|
-
|
238
|
+
// Must be set prior to loading image source
|
239
|
+
img.crossOrigin = 'Anonymous';
|
199
240
|
img.onload = loadHandler;
|
200
241
|
img.onerror = errorHandler;
|
201
242
|
img.src = imageURL;
|
@@ -210,12 +251,18 @@
|
|
210
251
|
* Get data URL to an image of an SVG and call download on it
|
211
252
|
*
|
212
253
|
* options object:
|
213
|
-
*
|
214
|
-
*
|
215
|
-
*
|
216
|
-
*
|
254
|
+
* - filename: Name of resulting downloaded file without extension
|
255
|
+
* - type: File type of resulting download
|
256
|
+
* - scale: Scaling factor of downloaded image compared to source
|
257
|
+
* - libURL: URL pointing to location of dependency scripts to download on
|
258
|
+
* demand
|
217
259
|
*/
|
218
|
-
Highcharts.downloadSVGLocal = function(
|
260
|
+
Highcharts.downloadSVGLocal = function(
|
261
|
+
svg,
|
262
|
+
options,
|
263
|
+
failCallback,
|
264
|
+
successCallback
|
265
|
+
) {
|
219
266
|
var svgurl,
|
220
267
|
blob,
|
221
268
|
objectURLRevoke = true,
|
@@ -223,15 +270,33 @@
|
|
223
270
|
libURL = options.libURL || Highcharts.getOptions().exporting.libURL,
|
224
271
|
dummySVGContainer = doc.createElement('div'),
|
225
272
|
imageType = options.type || 'image/png',
|
226
|
-
filename = (
|
273
|
+
filename = (
|
274
|
+
(options.filename || 'chart') +
|
275
|
+
'.' +
|
276
|
+
(imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1])
|
277
|
+
),
|
227
278
|
scale = options.scale || 1;
|
228
279
|
|
229
|
-
|
280
|
+
// Allow libURL to end with or without fordward slash
|
281
|
+
libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL;
|
230
282
|
|
231
283
|
function svgToPdf(svgElement, margin) {
|
232
284
|
var width = svgElement.width.baseVal.value + 2 * margin,
|
233
285
|
height = svgElement.height.baseVal.value + 2 * margin,
|
234
|
-
pdf = new win.jsPDF(
|
286
|
+
pdf = new win.jsPDF( // eslint-disable-line new-cap
|
287
|
+
'l',
|
288
|
+
'pt', [width, height]
|
289
|
+
);
|
290
|
+
|
291
|
+
// Workaround for #7090, hidden elements were drawn anyway. It comes
|
292
|
+
// down to https://github.com/yWorks/svg2pdf.js/issues/28. Check this
|
293
|
+
// later.
|
294
|
+
each(
|
295
|
+
svgElement.querySelectorAll('*[visibility="hidden"]'),
|
296
|
+
function(node) {
|
297
|
+
node.parentNode.removeChild(node);
|
298
|
+
}
|
299
|
+
);
|
235
300
|
|
236
301
|
win.svg2pdf(svgElement, pdf, {
|
237
302
|
removeInvalid: true
|
@@ -244,17 +309,26 @@
|
|
244
309
|
var textElements = dummySVGContainer.getElementsByTagName('text'),
|
245
310
|
titleElements,
|
246
311
|
svgData,
|
247
|
-
svgElementStyle = dummySVGContainer
|
248
|
-
|
312
|
+
svgElementStyle = dummySVGContainer
|
313
|
+
.getElementsByTagName('svg')[0].style;
|
314
|
+
|
315
|
+
// Workaround for the text styling. Making sure it does pick up the root
|
316
|
+
// element
|
249
317
|
each(textElements, function(el) {
|
250
|
-
// Workaround for the text styling. making sure it does pick up the
|
318
|
+
// Workaround for the text styling. making sure it does pick up the
|
319
|
+
// root element
|
251
320
|
each(['font-family', 'font-size'], function(property) {
|
252
321
|
if (!el.style[property] && svgElementStyle[property]) {
|
253
322
|
el.style[property] = svgElementStyle[property];
|
254
323
|
}
|
255
324
|
});
|
256
|
-
el.style['font-family'] =
|
257
|
-
|
325
|
+
el.style['font-family'] = (
|
326
|
+
el.style['font-family'] &&
|
327
|
+
el.style['font-family'].split(' ').splice(-1)
|
328
|
+
);
|
329
|
+
|
330
|
+
// Workaround for plotband with width, removing title from text
|
331
|
+
// nodes
|
258
332
|
titleElements = el.getElementsByTagName('title');
|
259
333
|
each(titleElements, function(titleElement) {
|
260
334
|
el.removeChild(titleElement);
|
@@ -273,7 +347,8 @@
|
|
273
347
|
|
274
348
|
// Initiate download depending on file type
|
275
349
|
if (imageType === 'image/svg+xml') {
|
276
|
-
// SVG download. In this case, we want to use Microsoft specific Blob if
|
350
|
+
// SVG download. In this case, we want to use Microsoft specific Blob if
|
351
|
+
// available
|
277
352
|
try {
|
278
353
|
if (nav.msSaveOrOpenBlob) {
|
279
354
|
blob = new MSBlobBuilder();
|
@@ -293,8 +368,10 @@
|
|
293
368
|
if (win.jsPDF && win.svg2pdf) {
|
294
369
|
downloadPDF();
|
295
370
|
} else {
|
296
|
-
// Must load pdf libraries first
|
297
|
-
|
371
|
+
// Must load pdf libraries first. // Don't destroy the object URL
|
372
|
+
// yet since we are doing things asynchronously. A cleaner solution
|
373
|
+
// would be nice, but this will do for now.
|
374
|
+
objectURLRevoke = true;
|
298
375
|
getScript(libURL + 'jspdf.js', function() {
|
299
376
|
getScript(libURL + 'svg2pdf.js', function() {
|
300
377
|
downloadPDF();
|
@@ -313,7 +390,11 @@
|
|
313
390
|
}
|
314
391
|
};
|
315
392
|
// First, try to get PNG by rendering on canvas
|
316
|
-
Highcharts.imageToDataUrl(
|
393
|
+
Highcharts.imageToDataUrl(
|
394
|
+
svgurl,
|
395
|
+
imageType, { /* args */ },
|
396
|
+
scale,
|
397
|
+
function(imageURL) {
|
317
398
|
// Success
|
318
399
|
try {
|
319
400
|
Highcharts.downloadURL(imageURL, filename);
|
@@ -323,17 +404,27 @@
|
|
323
404
|
} catch (e) {
|
324
405
|
failCallback();
|
325
406
|
}
|
326
|
-
},
|
407
|
+
},
|
408
|
+
function() {
|
327
409
|
// Failed due to tainted canvas
|
328
410
|
// Create new and untainted canvas
|
329
411
|
var canvas = doc.createElement('canvas'),
|
330
412
|
ctx = canvas.getContext('2d'),
|
331
|
-
imageWidth = svg.match(
|
332
|
-
|
413
|
+
imageWidth = svg.match(
|
414
|
+
/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/
|
415
|
+
)[1] * scale,
|
416
|
+
imageHeight = svg.match(
|
417
|
+
/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/
|
418
|
+
)[1] * scale,
|
333
419
|
downloadWithCanVG = function() {
|
334
420
|
ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight);
|
335
421
|
try {
|
336
|
-
Highcharts.downloadURL(
|
422
|
+
Highcharts.downloadURL(
|
423
|
+
nav.msSaveOrOpenBlob ?
|
424
|
+
canvas.msToBlob() :
|
425
|
+
canvas.toDataURL(imageType),
|
426
|
+
filename
|
427
|
+
);
|
337
428
|
if (successCallback) {
|
338
429
|
successCallback();
|
339
430
|
}
|
@@ -350,9 +441,12 @@
|
|
350
441
|
// Use preloaded canvg
|
351
442
|
downloadWithCanVG();
|
352
443
|
} else {
|
353
|
-
// Must load canVG first
|
354
|
-
|
355
|
-
|
444
|
+
// Must load canVG first. // Don't destroy the object URL
|
445
|
+
// yet since we are doing things asynchronously. A cleaner
|
446
|
+
// solution would be nice, but this will do for now.
|
447
|
+
objectURLRevoke = true;
|
448
|
+
// Get RGBColor.js first, then canvg
|
449
|
+
getScript(libURL + 'rgbcolor.js', function() {
|
356
450
|
getScript(libURL + 'canvg.js', function() {
|
357
451
|
downloadWithCanVG();
|
358
452
|
});
|
@@ -368,13 +462,20 @@
|
|
368
462
|
if (objectURLRevoke) {
|
369
463
|
finallyHandler();
|
370
464
|
}
|
371
|
-
}
|
465
|
+
}
|
466
|
+
);
|
372
467
|
}
|
373
468
|
};
|
374
469
|
|
375
|
-
// Get SVG of chart prepared for client side export. This converts embedded
|
376
|
-
// The options and chartOptions arguments are
|
377
|
-
|
470
|
+
// Get SVG of chart prepared for client side export. This converts embedded
|
471
|
+
// images in the SVG to data URIs. The options and chartOptions arguments are
|
472
|
+
// passed to the getSVGForExport function.
|
473
|
+
Highcharts.Chart.prototype.getSVGForLocalExport = function(
|
474
|
+
options,
|
475
|
+
chartOptions,
|
476
|
+
failCallback,
|
477
|
+
successCallback
|
478
|
+
) {
|
378
479
|
var chart = this,
|
379
480
|
images,
|
380
481
|
imagesEmbedded = 0,
|
@@ -383,7 +484,8 @@
|
|
383
484
|
el,
|
384
485
|
i,
|
385
486
|
l,
|
386
|
-
// After grabbing the SVG of the chart's copy container we need to do
|
487
|
+
// After grabbing the SVG of the chart's copy container we need to do
|
488
|
+
// sanitation on the SVG
|
387
489
|
sanitize = function(svg) {
|
388
490
|
return chart.sanitizeSVG(svg, chartCopyOptions);
|
389
491
|
},
|
@@ -392,7 +494,11 @@
|
|
392
494
|
++imagesEmbedded;
|
393
495
|
|
394
496
|
// Change image href in chart copy
|
395
|
-
callbackArgs.imageElement.setAttributeNS(
|
497
|
+
callbackArgs.imageElement.setAttributeNS(
|
498
|
+
'http://www.w3.org/1999/xlink',
|
499
|
+
'href',
|
500
|
+
imageURL
|
501
|
+
);
|
396
502
|
|
397
503
|
// When done with last image we have our SVG
|
398
504
|
if (imagesEmbedded === images.length) {
|
@@ -422,14 +528,18 @@
|
|
422
528
|
try {
|
423
529
|
// If there are no images to embed, the SVG is okay now.
|
424
530
|
if (!images.length) {
|
425
|
-
|
531
|
+
// Use SVG of chart copy
|
532
|
+
successCallback(sanitize(chartCopyContainer.innerHTML));
|
426
533
|
return;
|
427
534
|
}
|
428
535
|
|
429
536
|
// Go through the images we want to embed
|
430
537
|
for (i = 0, l = images.length; i < l; ++i) {
|
431
538
|
el = images[i];
|
432
|
-
Highcharts.imageToDataUrl(el.getAttributeNS(
|
539
|
+
Highcharts.imageToDataUrl(el.getAttributeNS(
|
540
|
+
'http://www.w3.org/1999/xlink',
|
541
|
+
'href'
|
542
|
+
), 'image/png', {
|
433
543
|
imageElement: el
|
434
544
|
}, options.scale,
|
435
545
|
embeddedSuccess,
|
@@ -458,7 +568,10 @@
|
|
458
568
|
* different background color can be added here, or `dataLabels`
|
459
569
|
* for export only.
|
460
570
|
*/
|
461
|
-
Highcharts.Chart.prototype.exportChartLocal = function(
|
571
|
+
Highcharts.Chart.prototype.exportChartLocal = function(
|
572
|
+
exportingOptions,
|
573
|
+
chartOptions
|
574
|
+
) {
|
462
575
|
var chart = this,
|
463
576
|
options = Highcharts.merge(chart.options.exporting, exportingOptions),
|
464
577
|
fallbackToExportServer = function() {
|
@@ -481,13 +594,17 @@
|
|
481
594
|
) {
|
482
595
|
fallbackToExportServer();
|
483
596
|
} else {
|
484
|
-
Highcharts.downloadSVGLocal(
|
597
|
+
Highcharts.downloadSVGLocal(
|
598
|
+
svg,
|
599
|
+
options,
|
600
|
+
fallbackToExportServer
|
601
|
+
);
|
485
602
|
}
|
486
603
|
};
|
487
604
|
|
488
|
-
// If we are on IE and in styled mode, add a whitelist to the renderer
|
489
|
-
//
|
490
|
-
//
|
605
|
+
// If we are on IE and in styled mode, add a whitelist to the renderer for
|
606
|
+
// inline styles that we want to pass through. There are so many styles by
|
607
|
+
// default in IE that we don't want to blacklist them all.
|
491
608
|
|
492
609
|
|
493
610
|
// Always fall back on:
|
@@ -510,12 +627,17 @@
|
|
510
627
|
return;
|
511
628
|
}
|
512
629
|
|
513
|
-
chart.getSVGForLocalExport(
|
630
|
+
chart.getSVGForLocalExport(
|
631
|
+
options,
|
632
|
+
chartOptions,
|
633
|
+
fallbackToExportServer,
|
634
|
+
svgSuccess
|
635
|
+
);
|
514
636
|
};
|
515
637
|
|
516
638
|
// Extend the default options to use the local exporter logic
|
517
639
|
merge(true, Highcharts.getOptions().exporting, {
|
518
|
-
libURL: 'https://code.highcharts.com/
|
640
|
+
libURL: 'https://code.highcharts.com/6.0.0/lib/',
|
519
641
|
|
520
642
|
// When offline-exporting is loaded, redefine the menu item definitions
|
521
643
|
// related to download.
|