highcharts-rails 5.0.14 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.markdown +60 -0
  3. data/Rakefile +54 -5
  4. data/app/assets/images/highcharts/earth.svg +432 -0
  5. data/app/assets/javascripts/highcharts.js +5103 -3147
  6. data/app/assets/javascripts/highcharts/highcharts-3d.js +930 -277
  7. data/app/assets/javascripts/highcharts/highcharts-more.js +1374 -249
  8. data/app/assets/javascripts/highcharts/lib/canvg.js +3073 -0
  9. data/app/assets/javascripts/highcharts/lib/jspdf.js +16624 -0
  10. data/app/assets/javascripts/highcharts/lib/rgbcolor.js +299 -0
  11. data/app/assets/javascripts/highcharts/lib/svg2pdf.js +3488 -0
  12. data/app/assets/javascripts/highcharts/modules/accessibility.js +654 -212
  13. data/app/assets/javascripts/highcharts/modules/annotations.js +1552 -274
  14. data/app/assets/javascripts/highcharts/modules/boost-canvas.js +773 -0
  15. data/app/assets/javascripts/highcharts/modules/boost.js +636 -210
  16. data/app/assets/javascripts/highcharts/modules/broken-axis.js +2 -2
  17. data/app/assets/javascripts/highcharts/modules/bullet.js +364 -0
  18. data/app/assets/javascripts/highcharts/modules/data.js +766 -38
  19. data/app/assets/javascripts/highcharts/modules/drag-panes.js +588 -0
  20. data/app/assets/javascripts/highcharts/modules/drilldown.js +106 -36
  21. data/app/assets/javascripts/highcharts/modules/export-data.js +597 -0
  22. data/app/assets/javascripts/highcharts/modules/exporting.js +424 -162
  23. data/app/assets/javascripts/highcharts/modules/funnel.js +144 -22
  24. data/app/assets/javascripts/highcharts/modules/gantt.js +1154 -0
  25. data/app/assets/javascripts/highcharts/modules/grid-axis.js +1 -1
  26. data/app/assets/javascripts/highcharts/modules/heatmap.js +406 -80
  27. data/app/assets/javascripts/highcharts/modules/histogram-bellcurve.js +513 -0
  28. data/app/assets/javascripts/highcharts/modules/item-series.js +126 -0
  29. data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +31 -13
  30. data/app/assets/javascripts/highcharts/modules/offline-exporting.js +179 -57
  31. data/app/assets/javascripts/highcharts/modules/oldie.js +1378 -0
  32. data/app/assets/javascripts/highcharts/modules/overlapping-datalabels.js +8 -6
  33. data/app/assets/javascripts/highcharts/modules/parallel-coordinates.js +494 -0
  34. data/app/assets/javascripts/highcharts/modules/pareto.js +275 -0
  35. data/app/assets/javascripts/highcharts/modules/sankey.js +641 -0
  36. data/app/assets/javascripts/highcharts/modules/series-label.js +355 -145
  37. data/app/assets/javascripts/highcharts/modules/solid-gauge.js +122 -1
  38. data/app/assets/javascripts/highcharts/modules/static-scale.js +64 -0
  39. data/app/assets/javascripts/highcharts/modules/stock.js +1944 -676
  40. data/app/assets/javascripts/highcharts/modules/streamgraph.js +139 -0
  41. data/app/assets/javascripts/highcharts/modules/sunburst.js +2403 -0
  42. data/app/assets/javascripts/highcharts/modules/tilemap.js +1199 -0
  43. data/app/assets/javascripts/highcharts/modules/treemap.js +538 -134
  44. data/app/assets/javascripts/highcharts/modules/variable-pie.js +490 -0
  45. data/app/assets/javascripts/highcharts/modules/variwide.js +283 -0
  46. data/app/assets/javascripts/highcharts/modules/vector.js +294 -0
  47. data/app/assets/javascripts/highcharts/modules/windbarb.js +490 -0
  48. data/app/assets/javascripts/highcharts/modules/wordcloud.js +681 -0
  49. data/app/assets/javascripts/highcharts/modules/xrange.js +615 -0
  50. data/app/assets/javascripts/highcharts/themes/avocado.js +54 -0
  51. data/app/assets/javascripts/highcharts/themes/dark-blue.js +6 -6
  52. data/app/assets/javascripts/highcharts/themes/dark-green.js +6 -6
  53. data/app/assets/javascripts/highcharts/themes/dark-unica.js +6 -6
  54. data/app/assets/javascripts/highcharts/themes/gray.js +14 -10
  55. data/app/assets/javascripts/highcharts/themes/grid-light.js +6 -6
  56. data/app/assets/javascripts/highcharts/themes/grid.js +7 -5
  57. data/app/assets/javascripts/highcharts/themes/sand-signika.js +8 -7
  58. data/app/assets/javascripts/highcharts/themes/skies.js +15 -9
  59. data/app/assets/javascripts/highcharts/themes/sunset.js +53 -0
  60. data/app/assets/stylesheets/highcharts/highcharts.css +802 -0
  61. data/app/assets/stylesheets/highcharts/highcharts.scss +665 -0
  62. data/lib/highcharts/version.rb +1 -1
  63. metadata +31 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v5.0.14 (2017-07-28)
2
+ * @license Highcharts JS v6.0.0 (2017-10-04)
3
3
  * Highcharts Drilldown module
4
4
  *
5
5
  * Author: Torstein Honsi
@@ -44,6 +44,17 @@
44
44
 
45
45
  // Add language
46
46
  extend(defaultOptions.lang, {
47
+ /**
48
+ * The text for the button that appears when drilling down, linking
49
+ * back to the parent series. The parent series' name is inserted for
50
+ * `{series.name}`.
51
+ *
52
+ * @type {String}
53
+ * @default Back to {series.name}
54
+ * @since 3.0.8
55
+ * @product highcharts highmaps
56
+ * @apioption lang.drillUpText
57
+ */
47
58
  drillUpText: '◁ Back to {series.name}'
48
59
  });
49
60
 
@@ -60,6 +71,21 @@
60
71
  */
61
72
  defaultOptions.drilldown = {
62
73
 
74
+ /**
75
+ * When this option is false, clicking a single point will drill down
76
+ * all points in the same category, equivalent to clicking the X axis
77
+ * label.
78
+ *
79
+ * @type {Boolean}
80
+ * @sample {highcharts} highcharts/drilldown/allowpointdrilldown-false/
81
+ * Don't allow point drilldown
82
+ * @default true
83
+ * @since 4.1.7
84
+ * @product highcharts
85
+ * @apioption drilldown.allowPointDrilldown
86
+ */
87
+
88
+
63
89
 
64
90
  /**
65
91
  * Additional styles to apply to the X axis label for a point that
@@ -67,30 +93,16 @@
67
93
  * to interaction.
68
94
  *
69
95
  * @type {CSSObject}
70
- * @see In [styled mode](http://www.highcharts.com/docs/chart-design-and-
71
- * style/style-by-css), active label styles can be set with the `.highcharts-
72
- * drilldown-axis-label` class.
96
+ * @see In styled mode, active label styles can be set with the `.highcharts-drilldown-axis-label` class.
73
97
  * @sample {highcharts} highcharts/drilldown/labels/ Label styles
74
98
  * @default { "cursor": "pointer", "color": "#003399", "fontWeight": "bold", "textDecoration": "underline" }
75
99
  * @since 3.0.8
76
100
  * @product highcharts highmaps
77
101
  */
78
102
  activeAxisLabelStyle: {
79
-
80
- /**
81
- */
82
103
  cursor: 'pointer',
83
-
84
- /**
85
- */
86
104
  color: '#003399',
87
-
88
- /**
89
- */
90
105
  fontWeight: 'bold',
91
-
92
- /**
93
- */
94
106
  textDecoration: 'underline'
95
107
  },
96
108
 
@@ -100,8 +112,7 @@
100
112
  * interaction.
101
113
  *
102
114
  * @type {CSSObject}
103
- * @see In [styled mode](http://www.highcharts.com/docs/chart-design-and-
104
- * style/style-by-css), active data label styles can be applied with
115
+ * @see In styled mode, active data label styles can be applied with
105
116
  * the `.highcharts-drilldown-data-label` class.
106
117
  * @sample {highcharts} highcharts/drilldown/labels/ Label styles
107
118
  * @default { "cursor": "pointer", "color": "#003399", "fontWeight": "bold", "textDecoration": "underline" }
@@ -109,21 +120,9 @@
109
120
  * @product highcharts highmaps
110
121
  */
111
122
  activeDataLabelStyle: {
112
-
113
- /**
114
- */
115
123
  cursor: 'pointer',
116
-
117
- /**
118
- */
119
124
  color: '#003399',
120
-
121
- /**
122
- */
123
125
  fontWeight: 'bold',
124
-
125
- /**
126
- */
127
126
  textDecoration: 'underline'
128
127
  },
129
128
 
@@ -161,6 +160,8 @@
161
160
  animation: {
162
161
 
163
162
  /**
163
+ * Duration for the drilldown animation.
164
+ * @default 500
164
165
  */
165
166
  duration: 500
166
167
  },
@@ -189,20 +190,76 @@
189
190
  position: {
190
191
 
191
192
  /**
193
+ * Horizontal alignment.
194
+ * @type {String}
192
195
  */
193
196
  align: 'right',
194
197
 
195
198
  /**
199
+ * The X offset of the button.
200
+ * @type {Number}
196
201
  */
197
202
  x: -10,
198
203
 
199
204
  /**
205
+ * The Y offset of the button.
206
+ * @type {Number}
200
207
  */
201
208
  y: 10
209
+
210
+ /**
211
+ * Vertical alignment of the button.
212
+ *
213
+ * @type {String}
214
+ * @default top
215
+ * @validvalue ["top", "middle", "bottom"]
216
+ * @product highcharts highmaps
217
+ * @apioption drilldown.drillUpButton.position.verticalAlign
218
+ */
202
219
  }
203
- // relativeTo: 'plotBox'
204
- // theme
220
+ /**
221
+ * What box to align the button to. Can be either `plotBox` or
222
+ * `spacingBox.
223
+ *
224
+ * @type {String}
225
+ * @default plotBox
226
+ * @validvalue ["plotBox", "spacingBox"]
227
+ * @since 3.0.8
228
+ * @product highcharts highmaps
229
+ * @apioption drilldown.drillUpButton.relativeTo
230
+ */
231
+
232
+ /**
233
+ * A collection of attributes for the button. The object takes SVG attributes
234
+ * like `fill`, `stroke`, `stroke-width` or `r`, the border radius.
235
+ * The theme also supports `style`, a collection of CSS properties for
236
+ * the text. Equivalent attributes for the hover state are given in
237
+ * `theme.states.hover`.
238
+ *
239
+ * @type {Object}
240
+ * @see In styled mode, drill-up button styles can be applied with the
241
+ * `.highcharts-drillup-button` class.
242
+ * @sample {highcharts} highcharts/drilldown/drillupbutton/
243
+ * Button theming
244
+ * @sample {highmaps} highcharts/drilldown/drillupbutton/
245
+ * Button theming
246
+ * @since 3.0.8
247
+ * @product highcharts highmaps
248
+ * @apioption drilldown.drillUpButton.theme
249
+ */
205
250
  }
251
+
252
+ /**
253
+ * An array of series configurations for the drill down. Each series
254
+ * configuration uses the same syntax as the [series](#series) option
255
+ * set. These drilldown series are hidden by default. The drilldown
256
+ * series is linked to the parent series' point by its `id`.
257
+ *
258
+ * @type {Array<Object>}
259
+ * @since 3.0.8
260
+ * @product highcharts highmaps
261
+ * @apioption drilldown.series
262
+ */
206
263
  };
207
264
 
208
265
 
@@ -271,6 +328,17 @@
271
328
  * @apioption chart.events.drillupall
272
329
  */
273
330
 
331
+ /**
332
+ * The `id` of a series in the [drilldown.series](#drilldown.series)
333
+ * array to use for a drilldown for this point.
334
+ *
335
+ * @type {String}
336
+ * @sample {highcharts} highcharts/drilldown/basic/ Basic drilldown
337
+ * @since 3.0.8
338
+ * @product highcharts
339
+ * @apioption series.line.data.drilldown
340
+ */
341
+
274
342
  /**
275
343
  * A general fadeIn method
276
344
  */
@@ -422,7 +490,7 @@
422
490
  }
423
491
  });
424
492
  }
425
-
493
+ this.pointer.reset();
426
494
  this.redraw();
427
495
  this.showDrillUpButton();
428
496
  };
@@ -695,7 +763,7 @@
695
763
  group = this.group,
696
764
  // For 3d column series all columns are added to one group
697
765
  // so we should not delete the whole group. #5297
698
- removeGroup = group !== this.chart.seriesGroup,
766
+ removeGroup = group !== this.chart.columnGroup,
699
767
  series = this;
700
768
 
701
769
  // Cancel mouse events on the series group (#2787)
@@ -925,14 +993,16 @@
925
993
  point.doDrilldown(undefined, undefined, e);
926
994
  }
927
995
  });
928
- /*wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work
996
+ /*
997
+ wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work
929
998
  if (!this.hasImportedEvents) {
930
999
  proceed.call(this);
931
1000
  H.addEvent(this, 'click', function () {
932
1001
  this.doDrilldown();
933
1002
  });
934
1003
  }
935
- });*/
1004
+ });
1005
+ */
936
1006
 
937
1007
  }
938
1008
 
@@ -0,0 +1,597 @@
1
+ /**
2
+ * @license Highcharts JS v6.0.0 (2017-10-04)
3
+ * Exporting module
4
+ *
5
+ * (c) 2010-2017 Torstein Honsi
6
+ *
7
+ * License: www.highcharts.com/license
8
+ */
9
+ 'use strict';
10
+ (function(factory) {
11
+ if (typeof module === 'object' && module.exports) {
12
+ module.exports = factory;
13
+ } else {
14
+ factory(Highcharts);
15
+ }
16
+ }(function(Highcharts) {
17
+ (function(Highcharts) {
18
+ /**
19
+ * Experimental data export module for Highcharts
20
+ *
21
+ * (c) 2010-2017 Torstein Honsi
22
+ *
23
+ * License: www.highcharts.com/license
24
+ */
25
+
26
+ // @todo
27
+ // - Deprecate repo and plugins page
28
+ // - Before official release, set up systematic tests for all series types
29
+
30
+ /* eslint max-len: ["warn", 80, 4] */
31
+
32
+ var each = Highcharts.each,
33
+ pick = Highcharts.pick,
34
+ win = Highcharts.win,
35
+ doc = win.document,
36
+ seriesTypes = Highcharts.seriesTypes,
37
+ downloadAttrSupported = doc.createElement('a').download !== undefined;
38
+
39
+ Highcharts.setOptions({
40
+ /**
41
+ * @optionparent exporting
42
+ */
43
+ exporting: {
44
+ /**
45
+ * Options for exporting data to CSV or ExCel, or displaying the data
46
+ * in a HTML table or a JavaScript structure. Requires the
47
+ * `export-data.js` module. This module adds data export options to the
48
+ * export menu and provides functions like `Chart.getCSV`,
49
+ * `Chart.getTable`, `Chart.getDataRows` and `Chart.viewData`.
50
+ *
51
+ * @sample highcharts/export-data/categorized/ Categorized data
52
+ * @sample highcharts/export-data/stock-timeaxis/ Highstock time axis
53
+ *
54
+ * @since 6.0.0
55
+ */
56
+ csv: {
57
+ /**
58
+ * Formatter callback for the column headers. Parameters are:
59
+ * - `item` - The series or axis object)
60
+ * - `key` - The point key, for example y or z
61
+ * - `keyLength` - The amount of value keys for this item, for
62
+ * example a range series has the keys `low` and `high` so the
63
+ * key length is 2.
64
+ *
65
+ * By default it returns the series name, followed by the key if
66
+ * there is more than one key. For the axis it returns the axis
67
+ * title or "Category" or "DateTime" by default.
68
+ *
69
+ * Return `false` to use Highcharts' proposed header.
70
+ *
71
+ * @type {Function|null}
72
+ */
73
+ columnHeaderFormatter: null,
74
+ /**
75
+ * Which date format to use for exported dates on a datetime X axis.
76
+ * See `Highcharts.dateFormat`.
77
+ */
78
+ dateFormat: '%Y-%m-%d %H:%M:%S',
79
+ /**
80
+ * The item delimiter in the exported data. Use `;` for direct
81
+ * exporting to Excel.
82
+ */
83
+ itemDelimiter: ',',
84
+ /**
85
+ * The line delimiter in the exported data, defaults to a newline.
86
+ */
87
+ lineDelimiter: '\n'
88
+ },
89
+ /**
90
+ * Export-data module required. Show a HTML table below the chart with
91
+ * the chart's current data.
92
+ *
93
+ * @sample highcharts/export-data/showtable/ Show the table
94
+ * @since 6.0.0
95
+ */
96
+ showTable: false
97
+ },
98
+ /**
99
+ * @optionparent lang
100
+ */
101
+ lang: {
102
+ /**
103
+ * Export-data module only. The text for the menu item.
104
+ * @since 6.0.0
105
+ */
106
+ downloadCSV: 'Download CSV',
107
+ /**
108
+ * Export-data module only. The text for the menu item.
109
+ * @since 6.0.0
110
+ */
111
+ downloadXLS: 'Download XLS',
112
+ /**
113
+ * Export-data module only. The text for the menu item.
114
+ * @since 6.0.0
115
+ */
116
+ viewData: 'View data table'
117
+ }
118
+ });
119
+
120
+ // Add an event listener to handle the showTable option
121
+ Highcharts.Chart.prototype.callbacks.push(function(chart) {
122
+ Highcharts.addEvent(chart, 'render', function() {
123
+ if (chart.options.exporting.showTable) {
124
+ chart.viewData();
125
+ }
126
+ });
127
+ });
128
+
129
+ // Set up key-to-axis bindings. This is used when the Y axis is datetime or
130
+ // categorized. For example in an arearange series, the low and high values
131
+ // sholud be formatted according to the Y axis type, and in order to link them
132
+ // we need this map.
133
+ Highcharts.Chart.prototype.setUpKeyToAxis = function() {
134
+ if (seriesTypes.arearange) {
135
+ seriesTypes.arearange.prototype.keyToAxis = {
136
+ low: 'y',
137
+ high: 'y'
138
+ };
139
+ }
140
+ };
141
+
142
+ /**
143
+ * Export-data module required. Returns a two-dimensional array containing the
144
+ * current chart data.
145
+ *
146
+ * @returns {Array.<Array>}
147
+ * The current chart data
148
+ */
149
+ Highcharts.Chart.prototype.getDataRows = function() {
150
+ var csvOptions = (this.options.exporting && this.options.exporting.csv) || {},
151
+ xAxis,
152
+ xAxes = this.xAxis,
153
+ rows = {},
154
+ rowArr = [],
155
+ dataRows,
156
+ names = [],
157
+ i,
158
+ x,
159
+ xTitle,
160
+ // Options
161
+ columnHeaderFormatter = function(item, key, keyLength) {
162
+
163
+ if (csvOptions.columnHeaderFormatter) {
164
+ var s = csvOptions.columnHeaderFormatter(item, key, keyLength);
165
+ if (s !== false) {
166
+ return s;
167
+ }
168
+ }
169
+
170
+
171
+ if (item instanceof Highcharts.Axis) {
172
+ return (item.options.title && item.options.title.text) ||
173
+ (item.isDatetimeAxis ? 'DateTime' : 'Category');
174
+ }
175
+ return item ?
176
+ item.name + (keyLength > 1 ? ' (' + key + ')' : '') :
177
+ 'Category';
178
+ },
179
+ xAxisIndices = [];
180
+
181
+ // Loop the series and index values
182
+ i = 0;
183
+
184
+ this.setUpKeyToAxis();
185
+
186
+ each(this.series, function(series) {
187
+ var keys = series.options.keys,
188
+ pointArrayMap = keys || series.pointArrayMap || ['y'],
189
+ valueCount = pointArrayMap.length,
190
+ xTaken = !series.requireSorting && {},
191
+ categoryMap = {},
192
+ datetimeValueAxisMap = {},
193
+ xAxisIndex = Highcharts.inArray(series.xAxis, xAxes),
194
+ j;
195
+
196
+ // Map the categories for value axes
197
+ each(pointArrayMap, function(prop) {
198
+
199
+ var axisName = (
200
+ (series.keyToAxis && series.keyToAxis[prop]) ||
201
+ prop
202
+ ) + 'Axis';
203
+
204
+ categoryMap[prop] = (
205
+ series[axisName] &&
206
+ series[axisName].categories
207
+ ) || [];
208
+ datetimeValueAxisMap[prop] = (
209
+ series[axisName] &&
210
+ series[axisName].isDatetimeAxis
211
+ );
212
+ });
213
+
214
+ if (
215
+ series.options.includeInCSVExport !== false &&
216
+ series.visible !== false // #55
217
+ ) {
218
+
219
+ // Build a lookup for X axis index and the position of the first
220
+ // series that belongs to that X axis. Includes -1 for non-axis
221
+ // series types like pies.
222
+ if (!Highcharts.find(xAxisIndices, function(index) {
223
+ return index[0] === xAxisIndex;
224
+ })) {
225
+ xAxisIndices.push([xAxisIndex, i]);
226
+ }
227
+
228
+ // Add the column headers, usually the same as series names
229
+ j = 0;
230
+ while (j < valueCount) {
231
+ names.push(columnHeaderFormatter(
232
+ series,
233
+ pointArrayMap[j],
234
+ pointArrayMap.length
235
+ ));
236
+ j++;
237
+ }
238
+
239
+ each(series.points, function(point, pIdx) {
240
+ var key = point.x,
241
+ prop,
242
+ val;
243
+
244
+ if (xTaken) {
245
+ if (xTaken[key]) {
246
+ key += '|' + pIdx;
247
+ }
248
+ xTaken[key] = true;
249
+ }
250
+
251
+ j = 0;
252
+
253
+ if (!rows[key]) {
254
+ // Generate the row
255
+ rows[key] = [];
256
+ // Contain the X values from one or more X axes
257
+ rows[key].xValues = [];
258
+ }
259
+ rows[key].x = point.x;
260
+ rows[key].xValues[xAxisIndex] = point.x;
261
+
262
+ // Pies, funnels, geo maps etc. use point name in X row
263
+ if (!series.xAxis || series.exportKey === 'name') {
264
+ rows[key].name = point.name;
265
+ }
266
+
267
+ while (j < valueCount) {
268
+ prop = pointArrayMap[j]; // y, z etc
269
+ val = point[prop];
270
+ rows[key][i + j] = pick(
271
+ categoryMap[prop][val], // Y axis category if present
272
+ datetimeValueAxisMap[prop] ?
273
+ Highcharts.dateFormat(csvOptions.dateFormat, val) :
274
+ null,
275
+ val
276
+ );
277
+ j++;
278
+ }
279
+
280
+ });
281
+ i = i + j;
282
+ }
283
+ });
284
+
285
+ // Make a sortable array
286
+ for (x in rows) {
287
+ if (rows.hasOwnProperty(x)) {
288
+ rowArr.push(rows[x]);
289
+ }
290
+ }
291
+
292
+ var xAxisIndex, column;
293
+ dataRows = [names];
294
+
295
+ i = xAxisIndices.length;
296
+ while (i--) { // Start from end to splice in
297
+ xAxisIndex = xAxisIndices[i][0];
298
+ column = xAxisIndices[i][1];
299
+ xAxis = xAxes[xAxisIndex];
300
+
301
+ // Sort it by X values
302
+ rowArr.sort(function(a, b) { // eslint-disable-line no-loop-func
303
+ return a.xValues[xAxisIndex] - b.xValues[xAxisIndex];
304
+ });
305
+
306
+ // Add header row
307
+ xTitle = columnHeaderFormatter(xAxis);
308
+ dataRows[0].splice(column, 0, xTitle);
309
+
310
+ // Add the category column
311
+ each(rowArr, function(row) { // eslint-disable-line no-loop-func
312
+ var category = row.name;
313
+ if (!category) {
314
+ if (xAxis.isDatetimeAxis) {
315
+ if (row.x instanceof Date) {
316
+ row.x = row.x.getTime();
317
+ }
318
+ category = Highcharts.dateFormat(
319
+ csvOptions.dateFormat,
320
+ row.x
321
+ );
322
+ } else if (xAxis.categories) {
323
+ category = pick(
324
+ xAxis.names[row.x],
325
+ xAxis.categories[row.x],
326
+ row.x
327
+ );
328
+ } else {
329
+ category = row.x;
330
+ }
331
+ }
332
+
333
+ // Add the X/date/category
334
+ row.splice(column, 0, category);
335
+ });
336
+ }
337
+ dataRows = dataRows.concat(rowArr);
338
+
339
+ return dataRows;
340
+ };
341
+
342
+ /**
343
+ * Export-data module required. Returns the current chart data as a CSV string.
344
+ *
345
+ * @param {Boolean} useLocalDecimalPoint
346
+ * Whether to use the local decimal point as detected from the browser.
347
+ * This makes it easier to export data to Excel in the same locale as
348
+ * the user is.
349
+ *
350
+ * @returns {String}
351
+ * CSV representation of the data
352
+ */
353
+ Highcharts.Chart.prototype.getCSV = function(useLocalDecimalPoint) {
354
+ var csv = '',
355
+ rows = this.getDataRows(),
356
+ csvOptions = this.options.exporting.csv,
357
+ // use ';' for direct to Excel
358
+ itemDelimiter = csvOptions.itemDelimiter,
359
+ // '\n' isn't working with the js csv data extraction
360
+ lineDelimiter = csvOptions.lineDelimiter;
361
+
362
+ // Transform the rows to CSV
363
+ each(rows, function(row, i) {
364
+ var val = '',
365
+ j = row.length,
366
+ n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';
367
+ while (j--) {
368
+ val = row[j];
369
+ if (typeof val === 'string') {
370
+ val = '"' + val + '"';
371
+ }
372
+ if (typeof val === 'number') {
373
+ if (n === ',') {
374
+ val = val.toString().replace('.', ',');
375
+ }
376
+ }
377
+ row[j] = val;
378
+ }
379
+ // Add the values
380
+ csv += row.join(itemDelimiter);
381
+
382
+ // Add the line delimiter
383
+ if (i < rows.length - 1) {
384
+ csv += lineDelimiter;
385
+ }
386
+ });
387
+ return csv;
388
+ };
389
+
390
+ /**
391
+ * Export-data module required. Build a HTML table with the chart's current
392
+ * data.
393
+ *
394
+ * @sample highcharts/export-data/viewdata/
395
+ * View the data from the export menu
396
+ * @returns {String}
397
+ * HTML representation of the data.
398
+ */
399
+ Highcharts.Chart.prototype.getTable = function(useLocalDecimalPoint) {
400
+ var html = '<table><thead>',
401
+ rows = this.getDataRows();
402
+
403
+ // Transform the rows to HTML
404
+ each(rows, function(row, i) {
405
+ var tag = i ? 'td' : 'th',
406
+ val,
407
+ j,
408
+ n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';
409
+
410
+ html += '<tr>';
411
+ for (j = 0; j < row.length; j = j + 1) {
412
+ val = row[j];
413
+ // Add the cell
414
+ if (typeof val === 'number') {
415
+ val = val.toString();
416
+ if (n === ',') {
417
+ val = val.replace('.', n);
418
+ }
419
+ html += '<' + tag + ' class="number">' + val + '</' + tag + '>';
420
+
421
+ } else {
422
+ html += '<' + tag + ' class="text">' +
423
+ (val === undefined ? '' : val) + '</' + tag + '>';
424
+ }
425
+ }
426
+
427
+ html += '</tr>';
428
+
429
+ // After the first row, end head and start body
430
+ if (!i) {
431
+ html += '</thead><tbody>';
432
+ }
433
+
434
+ });
435
+ html += '</tbody></table>';
436
+
437
+ return html;
438
+ };
439
+
440
+ /**
441
+ * File download using download attribute if supported.
442
+ *
443
+ * @private
444
+ */
445
+ Highcharts.Chart.prototype.fileDownload = function(href, extension, content) {
446
+ var a,
447
+ blobObject,
448
+ name;
449
+
450
+ if (this.options.exporting.filename) {
451
+ name = this.options.exporting.filename;
452
+ } else if (this.title) {
453
+ name = this.title.textStr.replace(/ /g, '-').toLowerCase();
454
+ } else {
455
+ name = 'chart';
456
+ }
457
+
458
+ // MS specific. Check this first because of bug with Edge (#76)
459
+ if (win.Blob && win.navigator.msSaveOrOpenBlob) {
460
+ // Falls to msSaveOrOpenBlob if download attribute is not supported
461
+ blobObject = new win.Blob(
462
+ ['\uFEFF' + content], // #7084
463
+ {
464
+ type: 'text/csv'
465
+ }
466
+ );
467
+ win.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extension);
468
+
469
+ // Download attribute supported
470
+ } else if (downloadAttrSupported) {
471
+ a = doc.createElement('a');
472
+ a.href = href;
473
+ a.download = name + '.' + extension;
474
+ this.container.appendChild(a); // #111
475
+ a.click();
476
+ a.remove();
477
+
478
+ } else {
479
+ Highcharts.error('The browser doesn\'t support downloading files');
480
+ }
481
+ };
482
+
483
+ /**
484
+ * Call this on click of 'Download CSV' button
485
+ *
486
+ * @private
487
+ */
488
+ Highcharts.Chart.prototype.downloadCSV = function() {
489
+ var csv = this.getCSV(true);
490
+ this.fileDownload(
491
+ 'data:text/csv,\uFEFF' + encodeURIComponent(csv),
492
+ 'csv',
493
+ csv,
494
+ 'text/csv'
495
+ );
496
+ };
497
+
498
+ /**
499
+ * Call this on click of 'Download XLS' button
500
+ *
501
+ * @private
502
+ */
503
+ Highcharts.Chart.prototype.downloadXLS = function() {
504
+ var uri = 'data:application/vnd.ms-excel;base64,',
505
+ template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" ' +
506
+ 'xmlns:x="urn:schemas-microsoft-com:office:excel" ' +
507
+ 'xmlns="http://www.w3.org/TR/REC-html40">' +
508
+ '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook>' +
509
+ '<x:ExcelWorksheets><x:ExcelWorksheet>' +
510
+ '<x:Name>Ark1</x:Name>' +
511
+ '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions>' +
512
+ '</x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook>' +
513
+ '</xml><![endif]-->' +
514
+ '<style>td{border:none;font-family: Calibri, sans-serif;} ' +
515
+ '.number{mso-number-format:"0.00";} ' +
516
+ '.text{ mso-number-format:"\@";}</style>' +
517
+ '<meta name=ProgId content=Excel.Sheet>' +
518
+ '<meta charset=UTF-8>' +
519
+ '</head><body>' +
520
+ this.getTable(true) +
521
+ '</body></html>',
522
+ base64 = function(s) {
523
+ return win.btoa(unescape(encodeURIComponent(s))); // #50
524
+ };
525
+ this.fileDownload(
526
+ uri + base64(template),
527
+ 'xls',
528
+ template,
529
+ 'application/vnd.ms-excel'
530
+ );
531
+ };
532
+
533
+ /**
534
+ * Export-data module required. View the data in a table below the chart.
535
+ */
536
+ Highcharts.Chart.prototype.viewData = function() {
537
+ if (!this.dataTableDiv) {
538
+ this.dataTableDiv = doc.createElement('div');
539
+ this.dataTableDiv.className = 'highcharts-data-table';
540
+
541
+ // Insert after the chart container
542
+ this.renderTo.parentNode.insertBefore(
543
+ this.dataTableDiv,
544
+ this.renderTo.nextSibling
545
+ );
546
+ }
547
+
548
+ this.dataTableDiv.innerHTML = this.getTable();
549
+ };
550
+
551
+
552
+ // Add "Download CSV" to the exporting menu.
553
+ var exportingOptions = Highcharts.getOptions().exporting;
554
+ if (exportingOptions) {
555
+
556
+ Highcharts.extend(exportingOptions.menuItemDefinitions, {
557
+ downloadCSV: {
558
+ textKey: 'downloadCSV',
559
+ onclick: function() {
560
+ this.downloadCSV();
561
+ }
562
+ },
563
+ downloadXLS: {
564
+ textKey: 'downloadXLS',
565
+ onclick: function() {
566
+ this.downloadXLS();
567
+ }
568
+ },
569
+ viewData: {
570
+ textKey: 'viewData',
571
+ onclick: function() {
572
+ this.viewData();
573
+ }
574
+ }
575
+ });
576
+
577
+ exportingOptions.buttons.contextButton.menuItems.push(
578
+ 'separator',
579
+ 'downloadCSV',
580
+ 'downloadXLS',
581
+ 'viewData'
582
+ );
583
+ }
584
+
585
+ // Series specific
586
+ if (seriesTypes.map) {
587
+ seriesTypes.map.prototype.exportKey = 'name';
588
+ }
589
+ if (seriesTypes.mapbubble) {
590
+ seriesTypes.mapbubble.prototype.exportKey = 'name';
591
+ }
592
+ if (seriesTypes.treemap) {
593
+ seriesTypes.treemap.prototype.exportKey = 'name';
594
+ }
595
+
596
+ }(Highcharts));
597
+ }));