highcharts 9.1.1 → 9.2.2
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.
- package/bower.json +1 -1
- package/css/annotations/popup.css +29 -28
- package/css/annotations/popup.scss +29 -27
- package/css/highcharts.css +15 -0
- package/css/highcharts.scss +12 -0
- package/css/stocktools/gui.css +1 -0
- package/css/stocktools/gui.scss +1 -0
- package/css/themes/dark-unica.css +15 -0
- package/css/themes/grid-light.css +15 -0
- package/css/themes/sand-signika.css +15 -0
- package/es-modules/Accessibility/Components/InfoRegionsComponent.js +8 -2
- package/es-modules/Accessibility/Components/LegendComponent.js +19 -8
- package/es-modules/Accessibility/Components/MenuComponent.js +19 -13
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +4 -8
- package/es-modules/Accessibility/FocusBorder.js +1 -3
- package/es-modules/Accessibility/Options/LangOptions.js +3 -3
- package/es-modules/Accessibility/Utils/Announcer.js +22 -5
- package/es-modules/Accessibility/Utils/ChartUtilities.js +6 -1
- package/es-modules/Core/Animation/AnimationUtilities.js +12 -4
- package/es-modules/Core/Animation/Fx.js +15 -12
- package/es-modules/Core/Axis/Axis.js +25 -13
- package/es-modules/Core/Axis/AxisDefaults.js +0 -1
- package/es-modules/Core/Axis/BrokenAxis.js +32 -15
- package/es-modules/Core/Axis/Color/ColorAxis.js +665 -0
- package/es-modules/Core/Axis/Color/ColorAxisComposition.js +237 -0
- package/es-modules/Core/Axis/Color/ColorAxisDefaults.js +434 -0
- package/es-modules/Core/Axis/DateTimeAxis.js +163 -133
- package/es-modules/Core/Axis/GridAxis.js +8 -3
- package/es-modules/Core/Axis/LogarithmicAxis.js +159 -117
- package/es-modules/Core/Axis/OrdinalAxis.js +666 -460
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +874 -0
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js +292 -0
- package/es-modules/Core/Axis/RadialAxis.js +858 -745
- package/es-modules/Core/Axis/ScrollbarAxis.js +7 -0
- package/es-modules/Core/Axis/StackingAxis.js +159 -140
- package/es-modules/Core/Axis/Tick.js +17 -27
- package/es-modules/Core/Chart/Chart.js +24 -38
- package/es-modules/Core/Chart/ChartDefaults.js +1 -1
- package/es-modules/Core/Chart/StockChart.js +12 -0
- package/es-modules/Core/Color/Color.js +96 -104
- package/es-modules/Core/DefaultOptions.js +269 -248
- package/es-modules/Core/Foundation.js +9 -8
- package/es-modules/Core/Geometry/CircleUtilities.js +385 -0
- package/es-modules/Core/Geometry/GeometryUtilities.js +83 -0
- package/es-modules/Core/Globals.js +23 -1
- package/es-modules/{Extensions/Ajax.js → Core/HttpUtilities.js} +86 -42
- package/es-modules/Core/{Legend.js → Legend/Legend.js} +142 -116
- package/es-modules/{Mixins → Core/Legend}/LegendSymbol.js +54 -38
- package/es-modules/Core/Navigator.js +3 -0
- package/es-modules/Core/Pointer.js +9 -0
- package/es-modules/Core/Renderer/HTML/AST.js +100 -82
- package/es-modules/Core/Renderer/HTML/HTMLElement.js +17 -7
- package/es-modules/Core/Renderer/HTML/HTMLRenderer.js +26 -9
- package/es-modules/Core/Renderer/RendererRegistry.js +9 -4
- package/es-modules/Core/Renderer/RendererUtilities.js +159 -0
- package/es-modules/Core/Renderer/SVG/SVGElement.js +13 -7
- package/es-modules/Core/Renderer/SVG/SVGLabel.js +9 -29
- package/es-modules/Core/Renderer/SVG/SVGRenderer.js +2 -2
- package/es-modules/Core/Renderer/SVG/TextBuilder.js +18 -16
- package/es-modules/Core/Responsive.js +166 -148
- package/es-modules/Core/Series/DataLabel.js +564 -0
- package/es-modules/Core/Series/Point.js +233 -209
- package/es-modules/Core/Series/Series.js +174 -2339
- package/es-modules/Core/Series/SeriesDefaults.js +2293 -0
- package/es-modules/Core/Series/SeriesRegistry.js +3 -9
- package/es-modules/Core/Time.js +78 -2
- package/es-modules/Core/Tooltip.js +178 -236
- package/es-modules/Core/Utilities.js +409 -394
- package/es-modules/Extensions/Annotations/Annotations.js +102 -49
- package/es-modules/Extensions/Annotations/Mixins/EventEmitterMixin.js +9 -1
- package/es-modules/Extensions/Annotations/NavigationBindings.js +30 -25
- package/es-modules/Extensions/Annotations/Popup.js +16 -7
- package/es-modules/Extensions/Boost/BoostOverrides.js +5 -1
- package/es-modules/Extensions/Boost/WGLRenderer.js +5 -4
- package/es-modules/Extensions/Boost/WGLVBuffer.js +3 -0
- package/es-modules/Extensions/BoostCanvas.js +1 -1
- package/es-modules/Extensions/CurrentDateIndication.js +1 -1
- package/es-modules/Extensions/Data.js +82 -76
- package/es-modules/Extensions/DataGrouping.js +225 -184
- package/es-modules/Extensions/Debugger/ErrorMessages.js +2 -2
- package/es-modules/Extensions/DraggablePoints.js +13 -5
- package/es-modules/Extensions/Drilldown.js +41 -14
- package/es-modules/Extensions/ExportData.js +7 -4
- package/es-modules/Extensions/Exporting/Exporting.js +1273 -0
- package/es-modules/Extensions/Exporting/ExportingDefaults.js +803 -0
- package/es-modules/Extensions/Exporting/ExportingSymbols.js +73 -0
- package/es-modules/Extensions/FullScreen.js +7 -5
- package/es-modules/Extensions/NoDataToDisplay.js +1 -1
- package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +617 -0
- package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +58 -0
- package/es-modules/Extensions/Oldie/Oldie.js +1 -1
- package/es-modules/Extensions/Pane.js +0 -1
- package/es-modules/Extensions/PatternFill.js +23 -10
- package/es-modules/Extensions/Polar.js +2 -1
- package/es-modules/Extensions/RangeSelector.js +1 -1
- package/es-modules/Extensions/Themes/Avocado.js +49 -20
- package/es-modules/Extensions/Themes/DarkBlue.js +226 -203
- package/es-modules/Extensions/Themes/DarkGreen.js +231 -203
- package/es-modules/Extensions/Themes/DarkUnica.js +201 -172
- package/es-modules/Extensions/Themes/Gray.js +228 -205
- package/es-modules/Extensions/Themes/Grid.js +109 -81
- package/es-modules/Extensions/Themes/GridLight.js +83 -55
- package/es-modules/Extensions/Themes/HighContrastDark.js +192 -164
- package/es-modules/Extensions/Themes/HighContrastLight.js +49 -21
- package/es-modules/Extensions/Themes/SandSignika.js +115 -86
- package/es-modules/Extensions/Themes/Skies.js +102 -74
- package/es-modules/Extensions/Themes/Sunset.js +47 -19
- package/es-modules/Mixins/ColorSeries.js +0 -1
- package/es-modules/Mixins/MultipleLines.js +6 -0
- package/es-modules/Mixins/TreeSeries.js +1 -1
- package/es-modules/Series/Area/AreaSeries.js +2 -2
- package/es-modules/Series/AreaSpline/AreaSplineSeries.js +2 -2
- package/es-modules/Series/Bubble/BubbleLegendComposition.js +279 -0
- package/es-modules/Series/Bubble/BubbleLegendDefaults.js +267 -0
- package/es-modules/Series/Bubble/BubbleLegendItem.js +472 -0
- package/es-modules/Series/Bubble/BubbleSeries.js +6 -2
- package/es-modules/Series/Column/ColumnDataLabel.js +109 -0
- package/es-modules/Series/Column/ColumnSeries.js +39 -26
- package/es-modules/Series/Column3D/Column3DComposition.js +5 -2
- package/es-modules/Series/Flags/FlagsSeries.js +8 -1
- package/es-modules/Series/Gantt/GanttSeries.js +3 -3
- package/es-modules/Series/Heatmap/HeatmapSeries.js +9 -5
- package/es-modules/Series/HeikinAshi/HeikinAshiPoint.js +60 -0
- package/es-modules/Series/HeikinAshi/HeikinAshiSeries.js +277 -0
- package/es-modules/Series/HollowCandlestick/HollowCandlestickPoint.js +83 -0
- package/es-modules/Series/HollowCandlestick/HollowCandlestickSeries.js +370 -0
- package/es-modules/Series/Line/LineSeries.js +12 -8
- package/es-modules/Series/Map/MapSeries.js +5 -3
- package/es-modules/Series/MapBubble/MapBubbleSeries.js +6 -5
- package/es-modules/Series/OHLC/OHLCPoint.js +11 -0
- package/es-modules/Series/PackedBubble/PackedBubbleSeries.js +3 -1
- package/es-modules/Series/Pie/PieDataLabel.js +448 -0
- package/es-modules/Series/Pie/PiePoint.js +35 -34
- package/es-modules/Series/Pie/PieSeries.js +19 -16
- package/es-modules/Series/Polygon/PolygonSeries.js +3 -3
- package/es-modules/Series/Sankey/SankeySeries.js +9 -7
- package/es-modules/Series/SolidGauge/SolidGaugeSeries.js +2 -2
- package/es-modules/Series/Sunburst/SunburstSeries.js +1 -14
- package/es-modules/Series/Timeline/TimelinePoint.js +6 -0
- package/es-modules/Series/Timeline/TimelineSeries.js +14 -17
- package/es-modules/Series/Treemap/TreemapSeries.js +3 -3
- package/es-modules/Series/Venn/VennSeries.js +4 -4
- package/es-modules/Series/Venn/VennUtils.js +10 -16
- package/es-modules/Series/Waterfall/WaterfallSeries.js +40 -35
- package/es-modules/Series/Wordcloud/WordcloudSeries.js +1 -0
- package/es-modules/Series/XRange/XRangeSeries.js +4 -2
- package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +92 -75
- package/es-modules/Stock/Indicators/Supertrend/SupertrendIndicator.js +20 -8
- package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +17 -4
- package/es-modules/Stock/StockToolsBindings.js +77 -38
- package/es-modules/Stock/StockToolsGui.js +28 -3
- package/es-modules/masters/highcharts-3d.src.js +1 -1
- package/es-modules/masters/highcharts-gantt.src.js +1 -1
- package/es-modules/masters/highcharts-more.src.js +11 -7
- package/es-modules/masters/highcharts.src.js +25 -9
- package/es-modules/masters/highmaps.src.js +1 -1
- package/es-modules/masters/highstock.src.js +1 -1
- package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
- package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
- package/es-modules/masters/indicators/ao.src.js +1 -1
- package/es-modules/masters/indicators/apo.src.js +1 -1
- package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
- package/es-modules/masters/indicators/aroon.src.js +1 -1
- package/es-modules/masters/indicators/atr.src.js +1 -1
- package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
- package/es-modules/masters/indicators/cci.src.js +1 -1
- package/es-modules/masters/indicators/chaikin.src.js +1 -1
- package/es-modules/masters/indicators/cmf.src.js +1 -1
- package/es-modules/masters/indicators/cmo.src.js +1 -1
- package/es-modules/masters/indicators/dema.src.js +1 -1
- package/es-modules/masters/indicators/disparity-index.src.js +1 -1
- package/es-modules/masters/indicators/dmi.src.js +1 -1
- package/es-modules/masters/indicators/dpo.src.js +1 -1
- package/es-modules/masters/indicators/ema.src.js +1 -1
- package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/es-modules/masters/indicators/indicators-all.src.js +1 -1
- package/es-modules/masters/indicators/indicators.src.js +1 -1
- package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
- package/es-modules/masters/indicators/klinger.src.js +1 -1
- package/es-modules/masters/indicators/macd.src.js +1 -1
- package/es-modules/masters/indicators/mfi.src.js +1 -1
- package/es-modules/masters/indicators/momentum.src.js +1 -1
- package/es-modules/masters/indicators/natr.src.js +1 -1
- package/es-modules/masters/indicators/obv.src.js +1 -1
- package/es-modules/masters/indicators/pivot-points.src.js +1 -1
- package/es-modules/masters/indicators/ppo.src.js +1 -1
- package/es-modules/masters/indicators/price-channel.src.js +1 -1
- package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
- package/es-modules/masters/indicators/psar.src.js +1 -1
- package/es-modules/masters/indicators/regressions.src.js +1 -1
- package/es-modules/masters/indicators/roc.src.js +1 -1
- package/es-modules/masters/indicators/rsi.src.js +1 -1
- package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
- package/es-modules/masters/indicators/stochastic.src.js +1 -1
- package/es-modules/masters/indicators/supertrend.src.js +1 -1
- package/es-modules/masters/indicators/tema.src.js +1 -1
- package/es-modules/masters/indicators/trendline.src.js +1 -1
- package/es-modules/masters/indicators/trix.src.js +1 -1
- package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
- package/es-modules/masters/indicators/vwap.src.js +1 -1
- package/es-modules/masters/indicators/williams-r.src.js +1 -1
- package/es-modules/masters/indicators/wma.src.js +1 -1
- package/es-modules/masters/indicators/zigzag.src.js +1 -1
- package/es-modules/masters/modules/accessibility.src.js +1 -1
- package/es-modules/masters/modules/annotations-advanced.src.js +1 -1
- package/es-modules/masters/modules/annotations.src.js +1 -1
- package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
- package/es-modules/masters/modules/boost-canvas.src.js +1 -1
- package/es-modules/masters/modules/boost.src.js +1 -1
- package/es-modules/masters/modules/broken-axis.src.js +1 -1
- package/es-modules/masters/modules/bullet.src.js +1 -1
- package/es-modules/masters/modules/coloraxis.src.js +6 -2
- package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
- package/es-modules/masters/modules/cylinder.src.js +1 -1
- package/es-modules/masters/modules/data.src.js +8 -1
- package/es-modules/masters/modules/datagrouping.src.js +1 -1
- package/es-modules/masters/modules/debugger.src.js +1 -1
- package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
- package/es-modules/masters/modules/dotplot.src.js +1 -1
- package/es-modules/masters/modules/drag-panes.src.js +1 -1
- package/es-modules/masters/modules/draggable-points.src.js +1 -1
- package/es-modules/masters/modules/drilldown.src.js +1 -1
- package/es-modules/masters/modules/dumbbell.src.js +1 -1
- package/es-modules/masters/modules/export-data.src.js +1 -1
- package/es-modules/masters/modules/exporting.src.js +10 -2
- package/es-modules/masters/modules/full-screen.src.js +1 -1
- package/es-modules/masters/modules/funnel.src.js +1 -1
- package/es-modules/masters/modules/funnel3d.src.js +1 -1
- package/es-modules/masters/modules/gantt.src.js +9 -4
- package/es-modules/masters/modules/grid-axis.src.js +1 -1
- package/es-modules/masters/modules/heatmap.src.js +6 -2
- package/es-modules/masters/modules/heikinashi.src.js +14 -0
- package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
- package/es-modules/masters/modules/hollowcandlestick.src.js +14 -0
- package/es-modules/masters/modules/item-series.src.js +1 -1
- package/es-modules/masters/modules/lollipop.src.js +1 -1
- package/es-modules/masters/modules/map.src.js +10 -6
- package/es-modules/masters/modules/marker-clusters.src.js +1 -1
- package/es-modules/masters/modules/networkgraph.src.js +1 -1
- package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
- package/es-modules/masters/modules/offline-exporting.src.js +8 -2
- package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
- package/es-modules/masters/modules/oldie.src.js +1 -1
- package/es-modules/masters/modules/organization.src.js +1 -1
- package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
- package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
- package/es-modules/masters/modules/pareto.src.js +1 -1
- package/es-modules/masters/modules/pathfinder.src.js +1 -1
- package/es-modules/masters/modules/pattern-fill.src.js +1 -1
- package/es-modules/masters/modules/price-indicator.src.js +1 -1
- package/es-modules/masters/modules/pyramid3d.src.js +1 -1
- package/es-modules/masters/modules/sankey.src.js +1 -1
- package/es-modules/masters/modules/series-label.src.js +1 -1
- package/es-modules/masters/modules/solid-gauge.src.js +1 -1
- package/es-modules/masters/modules/sonification.src.js +1 -1
- package/es-modules/masters/modules/static-scale.src.js +1 -1
- package/es-modules/masters/modules/stock-tools.src.js +1 -1
- package/es-modules/masters/modules/stock.src.js +3 -2
- package/es-modules/masters/modules/streamgraph.src.js +1 -1
- package/es-modules/masters/modules/sunburst.src.js +1 -1
- package/es-modules/masters/modules/tilemap.src.js +1 -1
- package/es-modules/masters/modules/timeline.src.js +1 -1
- package/es-modules/masters/modules/treegrid.src.js +1 -1
- package/es-modules/masters/modules/treemap.src.js +1 -1
- package/es-modules/masters/modules/variable-pie.src.js +1 -1
- package/es-modules/masters/modules/variwide.src.js +1 -1
- package/es-modules/masters/modules/vector.src.js +1 -1
- package/es-modules/masters/modules/venn.src.js +1 -1
- package/es-modules/masters/modules/windbarb.src.js +1 -1
- package/es-modules/masters/modules/wordcloud.src.js +1 -1
- package/es-modules/masters/modules/xrange.src.js +1 -1
- package/es-modules/masters/themes/avocado.src.js +5 -2
- package/es-modules/masters/themes/dark-blue.src.js +5 -2
- package/es-modules/masters/themes/dark-green.src.js +5 -2
- package/es-modules/masters/themes/dark-unica.src.js +5 -2
- package/es-modules/masters/themes/gray.src.js +5 -2
- package/es-modules/masters/themes/grid-light.src.js +5 -2
- package/es-modules/masters/themes/grid.src.js +5 -2
- package/es-modules/masters/themes/high-contrast-dark.src.js +5 -2
- package/es-modules/masters/themes/high-contrast-light.src.js +5 -2
- package/es-modules/masters/themes/sand-signika.src.js +5 -2
- package/es-modules/masters/themes/skies.src.js +5 -2
- package/es-modules/masters/themes/sunset.src.js +5 -2
- package/gfx/stock-icons/annotations-hidden.svg +1 -1
- package/gfx/stock-icons/annotations-visible.svg +2 -2
- package/gfx/stock-icons/arrow-bottom.svg +1 -1
- package/gfx/stock-icons/arrow-left.svg +1 -1
- package/gfx/stock-icons/arrow-line.svg +1 -1
- package/gfx/stock-icons/arrow-ray.svg +1 -1
- package/gfx/stock-icons/arrow-right.svg +1 -1
- package/gfx/stock-icons/arrow-segment.svg +1 -2
- package/gfx/stock-icons/circle.svg +1 -1
- package/gfx/stock-icons/close.svg +2 -2
- package/gfx/stock-icons/crooked-3.svg +1 -1
- package/gfx/stock-icons/crooked-5.svg +1 -1
- package/gfx/stock-icons/current-price-hide.svg +3 -3
- package/gfx/stock-icons/current-price-show.svg +2 -2
- package/gfx/stock-icons/destroy.svg +1 -1
- package/gfx/stock-icons/drawing.svg +18 -0
- package/gfx/stock-icons/edit.svg +1 -1
- package/gfx/stock-icons/elliott-3.svg +1 -1
- package/gfx/stock-icons/elliott-5.svg +1 -1
- package/gfx/stock-icons/ellipse.svg +11 -0
- package/gfx/stock-icons/fibonacci-timezone.svg +16 -0
- package/gfx/stock-icons/fibonacci.svg +1 -1
- package/gfx/stock-icons/flag-basic.svg +1 -1
- package/gfx/stock-icons/flag-diamond.svg +2 -2
- package/gfx/stock-icons/flag-elipse.svg +1 -1
- package/gfx/stock-icons/flag-trapeze.svg +2 -2
- package/gfx/stock-icons/fullscreen.svg +4 -4
- package/gfx/stock-icons/horizontal-line.svg +1 -1
- package/gfx/stock-icons/indicators.svg +3 -3
- package/gfx/stock-icons/label.svg +4 -4
- package/gfx/stock-icons/line.svg +1 -1
- package/gfx/stock-icons/linear.svg +11 -0
- package/gfx/stock-icons/logarithmic.svg +1 -0
- package/gfx/stock-icons/measure-x.svg +2 -2
- package/gfx/stock-icons/measure-xy.svg +1 -1
- package/gfx/stock-icons/measure-y.svg +1 -1
- package/gfx/stock-icons/panning.svg +17 -0
- package/gfx/stock-icons/parallel-channel.svg +1 -1
- package/gfx/stock-icons/pitchfork.svg +1 -1
- package/gfx/stock-icons/ray.svg +1 -1
- package/gfx/stock-icons/rectangle.svg +1 -1
- package/gfx/stock-icons/remove-annotations.svg +2 -2
- package/gfx/stock-icons/save-chart.svg +3 -3
- package/gfx/stock-icons/segment.svg +1 -1
- package/gfx/stock-icons/separator.svg +1 -1
- package/gfx/stock-icons/series-candlestick.svg +1 -1
- package/gfx/stock-icons/series-heikin-ashi.svg +1 -0
- package/gfx/stock-icons/series-hlc.svg +1 -0
- package/gfx/stock-icons/series-hollow-candlestick.svg +1 -0
- package/gfx/stock-icons/series-line.svg +1 -1
- package/gfx/stock-icons/series-ohlc.svg +4 -4
- package/gfx/stock-icons/time-cycles.svg +35 -0
- package/gfx/stock-icons/vertical-arrow.svg +1 -1
- package/gfx/stock-icons/vertical-counter.svg +1 -1
- package/gfx/stock-icons/vertical-double-arrow.svg +1 -1
- package/gfx/stock-icons/vertical-label.svg +3 -3
- package/gfx/stock-icons/vertical-line.svg +1 -1
- package/gfx/stock-icons/zoom-x.svg +2 -2
- package/gfx/stock-icons/zoom-xy.svg +2 -2
- package/gfx/stock-icons/zoom-y.svg +2 -2
- package/highcharts-3d.js +24 -24
- package/highcharts-3d.js.map +1 -1
- package/highcharts-3d.src.js +6 -3
- package/highcharts-gantt.js +800 -792
- package/highcharts-gantt.js.map +1 -1
- package/highcharts-gantt.src.js +16535 -15918
- package/highcharts-more.d.ts +73 -1
- package/highcharts-more.js +193 -192
- package/highcharts-more.js.map +1 -1
- package/highcharts-more.src.d.ts +73 -1
- package/highcharts-more.src.js +8044 -7839
- package/highcharts.d.ts +3850 -177
- package/highcharts.js +589 -581
- package/highcharts.js.map +1 -1
- package/highcharts.src.d.ts +3850 -177
- package/highcharts.src.js +16635 -16060
- package/highmaps.js +708 -698
- package/highmaps.js.map +1 -1
- package/highmaps.src.js +17419 -16521
- package/highstock.js +782 -769
- package/highstock.js.map +1 -1
- package/highstock.src.js +28867 -27975
- package/indicators/acceleration-bands.js +9 -9
- package/indicators/acceleration-bands.js.map +1 -1
- package/indicators/acceleration-bands.src.js +7 -1
- package/indicators/accumulation-distribution.js +1 -1
- package/indicators/accumulation-distribution.src.js +1 -1
- package/indicators/ao.js +1 -1
- package/indicators/ao.src.js +1 -1
- package/indicators/apo.js +1 -1
- package/indicators/apo.src.js +1 -1
- package/indicators/aroon-oscillator.js +9 -9
- package/indicators/aroon-oscillator.js.map +1 -1
- package/indicators/aroon-oscillator.src.js +7 -1
- package/indicators/aroon.js +9 -9
- package/indicators/aroon.js.map +1 -1
- package/indicators/aroon.src.js +7 -1
- package/indicators/atr.js +1 -1
- package/indicators/atr.src.js +1 -1
- package/indicators/bollinger-bands.js +9 -9
- package/indicators/bollinger-bands.js.map +1 -1
- package/indicators/bollinger-bands.src.js +7 -1
- package/indicators/cci.js +1 -1
- package/indicators/cci.src.js +1 -1
- package/indicators/chaikin.js +1 -1
- package/indicators/chaikin.src.js +1 -1
- package/indicators/cmf.js +1 -1
- package/indicators/cmf.src.js +1 -1
- package/indicators/cmo.js +1 -1
- package/indicators/cmo.src.js +1 -1
- package/indicators/dema.js +1 -1
- package/indicators/dema.src.js +1 -1
- package/indicators/disparity-index.js +1 -1
- package/indicators/disparity-index.src.js +1 -1
- package/indicators/dmi.js +11 -11
- package/indicators/dmi.js.map +1 -1
- package/indicators/dmi.src.js +7 -1
- package/indicators/dpo.js +1 -1
- package/indicators/dpo.src.js +1 -1
- package/indicators/ema.js +1 -1
- package/indicators/ema.src.js +1 -1
- package/indicators/ichimoku-kinko-hyo.js +1 -1
- package/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/indicators/indicators-all.js +203 -200
- package/indicators/indicators-all.js.map +1 -1
- package/indicators/indicators-all.src.js +206 -104
- package/indicators/indicators.js +12 -11
- package/indicators/indicators.js.map +1 -1
- package/indicators/indicators.src.js +108 -90
- package/indicators/keltner-channels.js +9 -9
- package/indicators/keltner-channels.js.map +1 -1
- package/indicators/keltner-channels.src.js +7 -1
- package/indicators/klinger.js +13 -13
- package/indicators/klinger.js.map +1 -1
- package/indicators/klinger.src.js +7 -1
- package/indicators/macd.js +1 -1
- package/indicators/macd.src.js +1 -1
- package/indicators/mfi.js +1 -1
- package/indicators/mfi.src.js +1 -1
- package/indicators/momentum.js +1 -1
- package/indicators/momentum.src.js +1 -1
- package/indicators/natr.js +1 -1
- package/indicators/natr.src.js +1 -1
- package/indicators/obv.js +1 -1
- package/indicators/obv.src.js +1 -1
- package/indicators/pivot-points.js +1 -1
- package/indicators/pivot-points.src.js +1 -1
- package/indicators/ppo.js +1 -1
- package/indicators/ppo.src.js +1 -1
- package/indicators/price-channel.js +9 -9
- package/indicators/price-channel.js.map +1 -1
- package/indicators/price-channel.src.js +7 -1
- package/indicators/price-envelopes.js +1 -1
- package/indicators/price-envelopes.src.js +1 -1
- package/indicators/psar.js +1 -1
- package/indicators/psar.src.js +1 -1
- package/indicators/regressions.js +1 -1
- package/indicators/regressions.src.js +1 -1
- package/indicators/roc.js +1 -1
- package/indicators/roc.src.js +1 -1
- package/indicators/rsi.js +1 -1
- package/indicators/rsi.src.js +1 -1
- package/indicators/slow-stochastic.js +1 -1
- package/indicators/slow-stochastic.src.js +1 -1
- package/indicators/stochastic.js +10 -10
- package/indicators/stochastic.js.map +1 -1
- package/indicators/stochastic.src.js +7 -1
- package/indicators/supertrend.js +10 -10
- package/indicators/supertrend.js.map +1 -1
- package/indicators/supertrend.src.js +23 -10
- package/indicators/tema.js +1 -1
- package/indicators/tema.src.js +1 -1
- package/indicators/trendline.js +1 -1
- package/indicators/trendline.src.js +1 -1
- package/indicators/trix.js +1 -1
- package/indicators/trix.src.js +1 -1
- package/indicators/volume-by-price.js +17 -15
- package/indicators/volume-by-price.js.map +1 -1
- package/indicators/volume-by-price.src.js +71 -6
- package/indicators/vwap.js +1 -1
- package/indicators/vwap.src.js +1 -1
- package/indicators/williams-r.js +1 -1
- package/indicators/williams-r.src.js +1 -1
- package/indicators/wma.js +1 -1
- package/indicators/wma.src.js +1 -1
- package/indicators/zigzag.js +1 -1
- package/indicators/zigzag.src.js +1 -1
- package/modules/accessibility.js +203 -202
- package/modules/accessibility.js.map +1 -1
- package/modules/accessibility.src.js +89 -49
- package/modules/annotations-advanced.js +164 -163
- package/modules/annotations-advanced.js.map +1 -1
- package/modules/annotations-advanced.src.js +162 -87
- package/modules/annotations.js +111 -111
- package/modules/annotations.js.map +1 -1
- package/modules/annotations.src.js +162 -87
- package/modules/arrow-symbols.js +1 -1
- package/modules/arrow-symbols.src.js +1 -1
- package/modules/boost-canvas.js +2 -2
- package/modules/boost-canvas.js.map +1 -1
- package/modules/boost-canvas.src.js +2 -2
- package/modules/boost.js +52 -52
- package/modules/boost.js.map +1 -1
- package/modules/boost.src.js +15 -7
- package/modules/broken-axis.js +13 -13
- package/modules/broken-axis.js.map +1 -1
- package/modules/broken-axis.src.js +34 -15
- package/modules/bullet.js +1 -1
- package/modules/bullet.src.js +1 -1
- package/modules/coloraxis.js +24 -22
- package/modules/coloraxis.js.map +1 -1
- package/modules/coloraxis.src.js +954 -774
- package/modules/current-date-indicator.js +2 -2
- package/modules/current-date-indicator.js.map +1 -1
- package/modules/current-date-indicator.src.js +2 -2
- package/modules/cylinder.js +1 -1
- package/modules/cylinder.src.js +1 -1
- package/modules/data.js +33 -32
- package/modules/data.js.map +1 -1
- package/modules/data.src.js +182 -134
- package/modules/datagrouping.d.ts +5 -0
- package/modules/datagrouping.js +20 -20
- package/modules/datagrouping.js.map +1 -1
- package/modules/datagrouping.src.d.ts +5 -0
- package/modules/datagrouping.src.js +270 -228
- package/modules/debugger.js +3 -3
- package/modules/debugger.js.map +1 -1
- package/modules/debugger.src.js +3 -3
- package/modules/dependency-wheel.js +1 -1
- package/modules/dependency-wheel.src.js +1 -1
- package/modules/dotplot.js +1 -1
- package/modules/dotplot.src.js +1 -1
- package/modules/drag-panes.js +1 -1
- package/modules/drag-panes.src.js +1 -1
- package/modules/draggable-points.js +34 -34
- package/modules/draggable-points.js.map +1 -1
- package/modules/draggable-points.src.js +14 -5
- package/modules/drilldown.d.ts +27 -0
- package/modules/drilldown.js +18 -18
- package/modules/drilldown.js.map +1 -1
- package/modules/drilldown.src.d.ts +27 -0
- package/modules/drilldown.src.js +42 -16
- package/modules/dumbbell.js +1 -1
- package/modules/dumbbell.src.js +1 -1
- package/modules/export-data.js +20 -20
- package/modules/export-data.js.map +1 -1
- package/modules/export-data.src.js +8 -5
- package/modules/exporting.d.ts +29 -0
- package/modules/exporting.js +38 -35
- package/modules/exporting.js.map +1 -1
- package/modules/exporting.src.d.ts +29 -0
- package/modules/exporting.src.js +1937 -1614
- package/modules/full-screen.js +2 -2
- package/modules/full-screen.js.map +1 -1
- package/modules/full-screen.src.js +8 -6
- package/modules/funnel.js +1 -1
- package/modules/funnel.src.js +1 -1
- package/modules/funnel3d.js +1 -1
- package/modules/funnel3d.src.js +1 -1
- package/modules/gantt.js +218 -217
- package/modules/gantt.js.map +1 -1
- package/modules/gantt.src.js +74 -32
- package/modules/grid-axis.js +23 -22
- package/modules/grid-axis.js.map +1 -1
- package/modules/grid-axis.src.js +9 -4
- package/modules/heatmap.js +39 -37
- package/modules/heatmap.js.map +1 -1
- package/modules/heatmap.src.js +963 -779
- package/modules/heikinashi.js +17 -0
- package/modules/heikinashi.js.map +1 -0
- package/modules/heikinashi.src.js +394 -0
- package/modules/histogram-bellcurve.js +1 -1
- package/modules/histogram-bellcurve.src.js +1 -1
- package/modules/hollowcandlestick.js +18 -0
- package/modules/hollowcandlestick.js.map +1 -0
- package/modules/hollowcandlestick.src.js +504 -0
- package/modules/item-series.js +1 -1
- package/modules/item-series.src.js +1 -1
- package/modules/lollipop.js +1 -1
- package/modules/lollipop.src.js +1 -1
- package/modules/map.d.ts +9 -0
- package/modules/map.js +122 -119
- package/modules/map.js.map +1 -1
- package/modules/map.src.d.ts +9 -0
- package/modules/map.src.js +1655 -1332
- package/modules/marker-clusters.js +1 -1
- package/modules/marker-clusters.src.js +1 -1
- package/modules/networkgraph.js +1 -1
- package/modules/networkgraph.src.js +1 -1
- package/modules/no-data-to-display.js +3 -3
- package/modules/no-data-to-display.js.map +1 -1
- package/modules/no-data-to-display.src.js +2 -2
- package/modules/offline-exporting.js +18 -16
- package/modules/offline-exporting.js.map +1 -1
- package/modules/offline-exporting.src.js +623 -562
- package/modules/oldie-polyfills.js +1 -1
- package/modules/oldie-polyfills.src.js +1 -1
- package/modules/oldie.js +2 -2
- package/modules/oldie.src.js +2 -2
- package/modules/organization.js +1 -1
- package/modules/organization.src.js +1 -1
- package/modules/overlapping-datalabels.js +1 -1
- package/modules/overlapping-datalabels.src.js +1 -1
- package/modules/parallel-coordinates.js +1 -1
- package/modules/parallel-coordinates.src.js +1 -1
- package/modules/pareto.js +1 -1
- package/modules/pareto.src.js +1 -1
- package/modules/pathfinder.js +1 -1
- package/modules/pathfinder.src.js +1 -1
- package/modules/pattern-fill.js +14 -14
- package/modules/pattern-fill.js.map +1 -1
- package/modules/pattern-fill.src.js +24 -12
- package/modules/price-indicator.js +1 -1
- package/modules/price-indicator.src.js +1 -1
- package/modules/pyramid3d.js +1 -1
- package/modules/pyramid3d.src.js +1 -1
- package/modules/sankey.js +28 -28
- package/modules/sankey.js.map +1 -1
- package/modules/sankey.src.js +11 -11
- package/modules/series-label.js +1 -1
- package/modules/series-label.src.js +1 -1
- package/modules/solid-gauge.js +2 -2
- package/modules/solid-gauge.js.map +1 -1
- package/modules/solid-gauge.src.js +3 -3
- package/modules/sonification.js +1 -1
- package/modules/sonification.src.js +1 -1
- package/modules/static-scale.js +1 -1
- package/modules/static-scale.src.js +1 -1
- package/modules/stock-tools.js +159 -157
- package/modules/stock-tools.js.map +1 -1
- package/modules/stock-tools.src.js +253 -123
- package/modules/stock.d.ts +5 -0
- package/modules/stock.js +196 -191
- package/modules/stock.js.map +1 -1
- package/modules/stock.src.d.ts +5 -0
- package/modules/stock.src.js +7749 -7432
- package/modules/streamgraph.js +1 -1
- package/modules/streamgraph.src.js +1 -1
- package/modules/sunburst.js +5 -5
- package/modules/sunburst.js.map +1 -1
- package/modules/sunburst.src.js +6 -19
- package/modules/tilemap.js +1 -1
- package/modules/tilemap.src.js +1 -1
- package/modules/timeline.js +18 -17
- package/modules/timeline.js.map +1 -1
- package/modules/timeline.src.js +21 -24
- package/modules/treegrid.js +57 -57
- package/modules/treegrid.js.map +1 -1
- package/modules/treegrid.src.js +43 -19
- package/modules/treemap.js +5 -5
- package/modules/treemap.js.map +1 -1
- package/modules/treemap.src.js +5 -5
- package/modules/variable-pie.js +1 -1
- package/modules/variable-pie.src.js +1 -1
- package/modules/variwide.js +1 -1
- package/modules/variwide.src.js +1 -1
- package/modules/vector.js +1 -1
- package/modules/vector.src.js +1 -1
- package/modules/venn.js +31 -30
- package/modules/venn.js.map +1 -1
- package/modules/venn.src.js +508 -424
- package/modules/windbarb.js +1 -1
- package/modules/windbarb.src.js +1 -1
- package/modules/wordcloud.js +4 -4
- package/modules/wordcloud.js.map +1 -1
- package/modules/wordcloud.src.js +2 -1
- package/modules/xrange.js +17 -17
- package/modules/xrange.js.map +1 -1
- package/modules/xrange.src.js +7 -4
- package/package.json +1 -1
- package/themes/avocado.d.ts +6 -1
- package/themes/avocado.js +3 -3
- package/themes/avocado.js.map +1 -1
- package/themes/avocado.src.d.ts +6 -1
- package/themes/avocado.src.js +53 -22
- package/themes/dark-blue.d.ts +6 -1
- package/themes/dark-blue.js +3 -3
- package/themes/dark-blue.js.map +1 -1
- package/themes/dark-blue.src.d.ts +6 -1
- package/themes/dark-blue.src.js +231 -205
- package/themes/dark-green.d.ts +6 -1
- package/themes/dark-green.js +4 -4
- package/themes/dark-green.js.map +1 -1
- package/themes/dark-green.src.d.ts +6 -1
- package/themes/dark-green.src.js +236 -205
- package/themes/dark-unica.d.ts +6 -1
- package/themes/dark-unica.js +7 -7
- package/themes/dark-unica.js.map +1 -1
- package/themes/dark-unica.src.d.ts +6 -1
- package/themes/dark-unica.src.js +206 -174
- package/themes/gray.d.ts +6 -1
- package/themes/gray.js +3 -3
- package/themes/gray.js.map +1 -1
- package/themes/gray.src.d.ts +6 -1
- package/themes/gray.src.js +233 -207
- package/themes/grid-light.d.ts +6 -1
- package/themes/grid-light.js +4 -4
- package/themes/grid-light.js.map +1 -1
- package/themes/grid-light.src.d.ts +6 -1
- package/themes/grid-light.src.js +88 -57
- package/themes/grid.d.ts +6 -1
- package/themes/grid.js +3 -3
- package/themes/grid.js.map +1 -1
- package/themes/grid.src.d.ts +6 -1
- package/themes/grid.src.js +114 -83
- package/themes/high-contrast-dark.js +5 -4
- package/themes/high-contrast-dark.js.map +1 -1
- package/themes/high-contrast-dark.src.js +197 -166
- package/themes/high-contrast-light.js +3 -3
- package/themes/high-contrast-light.js.map +1 -1
- package/themes/high-contrast-light.src.js +54 -23
- package/themes/sand-signika.d.ts +6 -1
- package/themes/sand-signika.js +5 -5
- package/themes/sand-signika.js.map +1 -1
- package/themes/sand-signika.src.d.ts +6 -1
- package/themes/sand-signika.src.js +119 -88
- package/themes/skies.d.ts +6 -1
- package/themes/skies.js +5 -5
- package/themes/skies.js.map +1 -1
- package/themes/skies.src.d.ts +6 -1
- package/themes/skies.src.js +107 -76
- package/themes/sunset.d.ts +6 -1
- package/themes/sunset.js +3 -3
- package/themes/sunset.js.map +1 -1
- package/themes/sunset.src.d.ts +6 -1
- package/themes/sunset.src.js +52 -21
- package/es-modules/Core/Axis/ColorAxis.js +0 -1164
- package/es-modules/Core/Axis/HiddenAxis.js +0 -46
- package/es-modules/Core/Axis/PlotLineOrBand.js +0 -1051
- package/es-modules/Core/Series/DataLabels.js +0 -1173
- package/es-modules/Extensions/Exporting.js +0 -2024
- package/es-modules/Extensions/OfflineExporting.js +0 -621
- package/es-modules/Mixins/Geometry.js +0 -56
- package/es-modules/Mixins/GeometryCircles.js +0 -320
- package/es-modules/Series/Bubble/BubbleLegend.js +0 -893
|
@@ -0,0 +1,1273 @@
|
|
|
1
|
+
/* *
|
|
2
|
+
*
|
|
3
|
+
* Exporting module
|
|
4
|
+
*
|
|
5
|
+
* (c) 2010-2021 Torstein Honsi
|
|
6
|
+
*
|
|
7
|
+
* License: www.highcharts.com/license
|
|
8
|
+
*
|
|
9
|
+
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
10
|
+
*
|
|
11
|
+
* */
|
|
12
|
+
'use strict';
|
|
13
|
+
import AST from '../../Core/Renderer/HTML/AST.js';
|
|
14
|
+
import Chart from '../../Core/Chart/Chart.js';
|
|
15
|
+
import chartNavigationMixin from '../../Mixins/Navigation.js';
|
|
16
|
+
import D from '../../Core/DefaultOptions.js';
|
|
17
|
+
var defaultOptions = D.defaultOptions;
|
|
18
|
+
import ExportingDefaults from './ExportingDefaults.js';
|
|
19
|
+
import ExportingSymbols from './ExportingSymbols.js';
|
|
20
|
+
import G from '../../Core/Globals.js';
|
|
21
|
+
var doc = G.doc, win = G.win;
|
|
22
|
+
import HU from '../../Core/HttpUtilities.js';
|
|
23
|
+
import Palette from '../../Core/Color/Palette.js';
|
|
24
|
+
import U from '../../Core/Utilities.js';
|
|
25
|
+
var addEvent = U.addEvent, css = U.css, createElement = U.createElement, discardElement = U.discardElement, extend = U.extend, find = U.find, fireEvent = U.fireEvent, isObject = U.isObject, merge = U.merge, objectEach = U.objectEach, pick = U.pick, removeEvent = U.removeEvent, uniqueKey = U.uniqueKey;
|
|
26
|
+
/* *
|
|
27
|
+
*
|
|
28
|
+
* Composition
|
|
29
|
+
*
|
|
30
|
+
* */
|
|
31
|
+
var Exporting;
|
|
32
|
+
(function (Exporting) {
|
|
33
|
+
/* *
|
|
34
|
+
*
|
|
35
|
+
* Declarations
|
|
36
|
+
*
|
|
37
|
+
* */
|
|
38
|
+
/* *
|
|
39
|
+
*
|
|
40
|
+
* Constants
|
|
41
|
+
*
|
|
42
|
+
* */
|
|
43
|
+
var composedClasses = [];
|
|
44
|
+
// These CSS properties are not inlined. Remember camelCase.
|
|
45
|
+
var inlineBlacklist = [
|
|
46
|
+
/-/,
|
|
47
|
+
/^(clipPath|cssText|d|height|width)$/,
|
|
48
|
+
/^font$/,
|
|
49
|
+
/[lL]ogical(Width|Height)$/,
|
|
50
|
+
/perspective/,
|
|
51
|
+
/TapHighlightColor/,
|
|
52
|
+
/^transition/,
|
|
53
|
+
/^length$/ // #7700
|
|
54
|
+
// /^text (border|color|cursor|height|webkitBorder)/
|
|
55
|
+
];
|
|
56
|
+
// These ones are translated to attributes rather than styles
|
|
57
|
+
var inlineToAttributes = [
|
|
58
|
+
'fill',
|
|
59
|
+
'stroke',
|
|
60
|
+
'strokeLinecap',
|
|
61
|
+
'strokeLinejoin',
|
|
62
|
+
'strokeWidth',
|
|
63
|
+
'textAnchor',
|
|
64
|
+
'x',
|
|
65
|
+
'y'
|
|
66
|
+
];
|
|
67
|
+
Exporting.inlineWhitelist = [];
|
|
68
|
+
var unstyledElements = [
|
|
69
|
+
'clipPath',
|
|
70
|
+
'defs',
|
|
71
|
+
'desc'
|
|
72
|
+
];
|
|
73
|
+
/* *
|
|
74
|
+
*
|
|
75
|
+
* Variables
|
|
76
|
+
*
|
|
77
|
+
* */
|
|
78
|
+
var printingChart;
|
|
79
|
+
/* *
|
|
80
|
+
*
|
|
81
|
+
* Functions
|
|
82
|
+
*
|
|
83
|
+
* */
|
|
84
|
+
/* eslint-disable valid-jsdoc */
|
|
85
|
+
/**
|
|
86
|
+
* Add the export button to the chart, with options.
|
|
87
|
+
*
|
|
88
|
+
* @private
|
|
89
|
+
* @function Highcharts.Chart#addButton
|
|
90
|
+
* @param {Highcharts.NavigationButtonOptions} options
|
|
91
|
+
* @return {void}
|
|
92
|
+
* @requires modules/exporting
|
|
93
|
+
*/
|
|
94
|
+
function addButton(options) {
|
|
95
|
+
var chart = this, renderer = chart.renderer, btnOptions = merge(chart.options.navigation.buttonOptions, options), onclick = btnOptions.onclick, menuItems = btnOptions.menuItems, symbolSize = btnOptions.symbolSize || 12;
|
|
96
|
+
var symbol;
|
|
97
|
+
if (!chart.btnCount) {
|
|
98
|
+
chart.btnCount = 0;
|
|
99
|
+
}
|
|
100
|
+
// Keeps references to the button elements
|
|
101
|
+
if (!chart.exportDivElements) {
|
|
102
|
+
chart.exportDivElements = [];
|
|
103
|
+
chart.exportSVGElements = [];
|
|
104
|
+
}
|
|
105
|
+
if (btnOptions.enabled === false || !btnOptions.theme) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
var attr = btnOptions.theme, states = attr.states, hover = states && states.hover, select = states && states.select;
|
|
109
|
+
var callback;
|
|
110
|
+
if (!chart.styledMode) {
|
|
111
|
+
attr.fill = pick(attr.fill, Palette.backgroundColor);
|
|
112
|
+
attr.stroke = pick(attr.stroke, 'none');
|
|
113
|
+
}
|
|
114
|
+
delete attr.states;
|
|
115
|
+
if (onclick) {
|
|
116
|
+
callback = function (e) {
|
|
117
|
+
if (e) {
|
|
118
|
+
e.stopPropagation();
|
|
119
|
+
}
|
|
120
|
+
onclick.call(chart, e);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else if (menuItems) {
|
|
124
|
+
callback = function (e) {
|
|
125
|
+
// consistent with onclick call (#3495)
|
|
126
|
+
if (e) {
|
|
127
|
+
e.stopPropagation();
|
|
128
|
+
}
|
|
129
|
+
chart.contextMenu(button.menuClassName, menuItems, button.translateX, button.translateY, button.width, button.height, button);
|
|
130
|
+
button.setState(2);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (btnOptions.text && btnOptions.symbol) {
|
|
134
|
+
attr.paddingLeft = pick(attr.paddingLeft, 30);
|
|
135
|
+
}
|
|
136
|
+
else if (!btnOptions.text) {
|
|
137
|
+
extend(attr, {
|
|
138
|
+
width: btnOptions.width,
|
|
139
|
+
height: btnOptions.height,
|
|
140
|
+
padding: 0
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (!chart.styledMode) {
|
|
144
|
+
attr['stroke-linecap'] = 'round';
|
|
145
|
+
attr.fill = pick(attr.fill, Palette.backgroundColor);
|
|
146
|
+
attr.stroke = pick(attr.stroke, 'none');
|
|
147
|
+
}
|
|
148
|
+
var button = renderer
|
|
149
|
+
.button(btnOptions.text, 0, 0, callback, attr, hover, select)
|
|
150
|
+
.addClass(options.className)
|
|
151
|
+
.attr({
|
|
152
|
+
title: pick(chart.options.lang[btnOptions._titleKey || btnOptions.titleKey], '')
|
|
153
|
+
});
|
|
154
|
+
button.menuClassName = (options.menuClassName ||
|
|
155
|
+
'highcharts-menu-' + chart.btnCount++);
|
|
156
|
+
if (btnOptions.symbol) {
|
|
157
|
+
symbol = renderer
|
|
158
|
+
.symbol(btnOptions.symbol, btnOptions.symbolX - (symbolSize / 2), btnOptions.symbolY - (symbolSize / 2), symbolSize, symbolSize
|
|
159
|
+
// If symbol is an image, scale it (#7957)
|
|
160
|
+
, {
|
|
161
|
+
width: symbolSize,
|
|
162
|
+
height: symbolSize
|
|
163
|
+
})
|
|
164
|
+
.addClass('highcharts-button-symbol')
|
|
165
|
+
.attr({
|
|
166
|
+
zIndex: 1
|
|
167
|
+
})
|
|
168
|
+
.add(button);
|
|
169
|
+
if (!chart.styledMode) {
|
|
170
|
+
symbol.attr({
|
|
171
|
+
stroke: btnOptions.symbolStroke,
|
|
172
|
+
fill: btnOptions.symbolFill,
|
|
173
|
+
'stroke-width': btnOptions.symbolStrokeWidth || 1
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
button
|
|
178
|
+
.add(chart.exportingGroup)
|
|
179
|
+
.align(extend(btnOptions, {
|
|
180
|
+
width: button.width,
|
|
181
|
+
x: pick(btnOptions.x, chart.buttonOffset) // #1654
|
|
182
|
+
}), true, 'spacingBox');
|
|
183
|
+
chart.buttonOffset += ((button.width + btnOptions.buttonSpacing) *
|
|
184
|
+
(btnOptions.align === 'right' ? -1 : 1));
|
|
185
|
+
chart.exportSVGElements.push(button, symbol);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Clena up after printing a chart.
|
|
189
|
+
*
|
|
190
|
+
* @function Highcharts#afterPrint
|
|
191
|
+
*
|
|
192
|
+
* @private
|
|
193
|
+
*
|
|
194
|
+
* @param {Highcharts.Chart} chart
|
|
195
|
+
* Chart that was (or suppose to be) printed
|
|
196
|
+
* @return {void}
|
|
197
|
+
*
|
|
198
|
+
* @fires Highcharts.Chart#event:afterPrint
|
|
199
|
+
*/
|
|
200
|
+
function afterPrint() {
|
|
201
|
+
var chart = this;
|
|
202
|
+
if (!chart.printReverseInfo) {
|
|
203
|
+
return void 0;
|
|
204
|
+
}
|
|
205
|
+
var _a = chart.printReverseInfo, childNodes = _a.childNodes, origDisplay = _a.origDisplay, resetParams = _a.resetParams;
|
|
206
|
+
// put the chart back in
|
|
207
|
+
chart.moveContainers(chart.renderTo);
|
|
208
|
+
// restore all body content
|
|
209
|
+
[].forEach.call(childNodes, function (node, i) {
|
|
210
|
+
if (node.nodeType === 1) {
|
|
211
|
+
node.style.display = (origDisplay[i] || '');
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
chart.isPrinting = false;
|
|
215
|
+
// Reset printMaxWidth
|
|
216
|
+
if (resetParams) {
|
|
217
|
+
chart.setSize.apply(chart, resetParams);
|
|
218
|
+
}
|
|
219
|
+
delete chart.printReverseInfo;
|
|
220
|
+
printingChart = void 0;
|
|
221
|
+
fireEvent(chart, 'afterPrint');
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Prepare chart and document before printing a chart.
|
|
225
|
+
*
|
|
226
|
+
* @function Highcharts#beforePrint
|
|
227
|
+
*
|
|
228
|
+
* @private
|
|
229
|
+
*
|
|
230
|
+
* @return {void}
|
|
231
|
+
*
|
|
232
|
+
* @fires Highcharts.Chart#event:beforePrint
|
|
233
|
+
*/
|
|
234
|
+
function beforePrint() {
|
|
235
|
+
var chart = this, body = doc.body, printMaxWidth = chart.options.exporting.printMaxWidth, printReverseInfo = {
|
|
236
|
+
childNodes: body.childNodes,
|
|
237
|
+
origDisplay: [],
|
|
238
|
+
resetParams: void 0
|
|
239
|
+
};
|
|
240
|
+
chart.isPrinting = true;
|
|
241
|
+
chart.pointer.reset(null, 0);
|
|
242
|
+
fireEvent(chart, 'beforePrint');
|
|
243
|
+
// Handle printMaxWidth
|
|
244
|
+
var handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;
|
|
245
|
+
if (handleMaxWidth) {
|
|
246
|
+
printReverseInfo.resetParams = [
|
|
247
|
+
chart.options.chart.width,
|
|
248
|
+
void 0,
|
|
249
|
+
false
|
|
250
|
+
];
|
|
251
|
+
chart.setSize(printMaxWidth, void 0, false);
|
|
252
|
+
}
|
|
253
|
+
// hide all body content
|
|
254
|
+
[].forEach.call(printReverseInfo.childNodes, function (node, i) {
|
|
255
|
+
if (node.nodeType === 1) {
|
|
256
|
+
printReverseInfo.origDisplay[i] = node.style.display;
|
|
257
|
+
node.style.display = 'none';
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
// pull out the chart
|
|
261
|
+
chart.moveContainers(body);
|
|
262
|
+
// Storage details for undo action after printing
|
|
263
|
+
chart.printReverseInfo = printReverseInfo;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* @private
|
|
267
|
+
*/
|
|
268
|
+
function chartCallback(chart) {
|
|
269
|
+
var composition = chart;
|
|
270
|
+
composition.renderExporting();
|
|
271
|
+
addEvent(chart, 'redraw', composition.renderExporting);
|
|
272
|
+
// Destroy the export elements at chart destroy
|
|
273
|
+
addEvent(chart, 'destroy', composition.destroyExport);
|
|
274
|
+
// Uncomment this to see a button directly below the chart, for quick
|
|
275
|
+
// testing of export
|
|
276
|
+
/*
|
|
277
|
+
let button, viewImage, viewSource;
|
|
278
|
+
if (!chart.renderer.forExport) {
|
|
279
|
+
viewImage = function () {
|
|
280
|
+
let div = doc.createElement('div');
|
|
281
|
+
div.innerHTML = chart.getSVGForExport();
|
|
282
|
+
chart.renderTo.parentNode.appendChild(div);
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
viewSource = function () {
|
|
286
|
+
let pre = doc.createElement('pre');
|
|
287
|
+
pre.innerHTML = chart.getSVGForExport()
|
|
288
|
+
.replace(/</g, '\n<')
|
|
289
|
+
.replace(/>/g, '>');
|
|
290
|
+
chart.renderTo.parentNode.appendChild(pre);
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
viewImage();
|
|
294
|
+
|
|
295
|
+
// View SVG Image
|
|
296
|
+
button = doc.createElement('button');
|
|
297
|
+
button.innerHTML = 'View SVG Image';
|
|
298
|
+
chart.renderTo.parentNode.appendChild(button);
|
|
299
|
+
button.onclick = viewImage;
|
|
300
|
+
|
|
301
|
+
// View SVG Source
|
|
302
|
+
button = doc.createElement('button');
|
|
303
|
+
button.innerHTML = 'View SVG Source';
|
|
304
|
+
chart.renderTo.parentNode.appendChild(button);
|
|
305
|
+
button.onclick = viewSource;
|
|
306
|
+
}
|
|
307
|
+
//*/
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* @private
|
|
311
|
+
*/
|
|
312
|
+
function compose(ChartClass, SVGRendererClass) {
|
|
313
|
+
ExportingSymbols.compose(SVGRendererClass);
|
|
314
|
+
if (composedClasses.indexOf(ChartClass) === -1) {
|
|
315
|
+
composedClasses.push(ChartClass);
|
|
316
|
+
var chartProto = ChartClass.prototype;
|
|
317
|
+
chartProto.afterPrint = afterPrint;
|
|
318
|
+
chartProto.exportChart = exportChart;
|
|
319
|
+
chartProto.inlineStyles = inlineStyles;
|
|
320
|
+
chartProto.print = print;
|
|
321
|
+
chartProto.sanitizeSVG = sanitizeSVG;
|
|
322
|
+
chartProto.getChartHTML = getChartHTML;
|
|
323
|
+
chartProto.getSVG = getSVG;
|
|
324
|
+
chartProto.getSVGForExport = getSVGForExport;
|
|
325
|
+
chartProto.getFilename = getFilename;
|
|
326
|
+
chartProto.moveContainers = moveContainers;
|
|
327
|
+
chartProto.beforePrint = beforePrint;
|
|
328
|
+
chartProto.contextMenu = contextMenu;
|
|
329
|
+
chartProto.addButton = addButton;
|
|
330
|
+
chartProto.destroyExport = destroyExport;
|
|
331
|
+
chartProto.renderExporting = renderExporting;
|
|
332
|
+
chartProto.callbacks.push(chartCallback);
|
|
333
|
+
addEvent(ChartClass, 'init', onChartInit);
|
|
334
|
+
if (G.isSafari) {
|
|
335
|
+
G.win.matchMedia('print').addListener(function (mqlEvent) {
|
|
336
|
+
if (!printingChart) {
|
|
337
|
+
return void 0;
|
|
338
|
+
}
|
|
339
|
+
if (mqlEvent.matches) {
|
|
340
|
+
printingChart.beforePrint();
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
printingChart.afterPrint();
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
Exporting.compose = compose;
|
|
350
|
+
/**
|
|
351
|
+
* Display a popup menu for choosing the export type.
|
|
352
|
+
*
|
|
353
|
+
* @private
|
|
354
|
+
* @function Highcharts.Chart#contextMenu
|
|
355
|
+
* @param {string} className
|
|
356
|
+
* An identifier for the menu.
|
|
357
|
+
* @param {Array<string|Highcharts.ExportingMenuObject>} items
|
|
358
|
+
* A collection with text and onclicks for the items.
|
|
359
|
+
* @param {number} x
|
|
360
|
+
* The x position of the opener button
|
|
361
|
+
* @param {number} y
|
|
362
|
+
* The y position of the opener button
|
|
363
|
+
* @param {number} width
|
|
364
|
+
* The width of the opener button
|
|
365
|
+
* @param {number} height
|
|
366
|
+
* The height of the opener button
|
|
367
|
+
* @return {void}
|
|
368
|
+
* @requires modules/exporting
|
|
369
|
+
*/
|
|
370
|
+
function contextMenu(className, items, x, y, width, height, button) {
|
|
371
|
+
var chart = this, navOptions = chart.options.navigation, chartWidth = chart.chartWidth, chartHeight = chart.chartHeight, cacheName = 'cache-' + className, menuPadding = Math.max(width, height); // for mouse leave detection
|
|
372
|
+
var innerMenu, menu = chart[cacheName];
|
|
373
|
+
// create the menu only the first time
|
|
374
|
+
if (!menu) {
|
|
375
|
+
// create a HTML element above the SVG
|
|
376
|
+
chart.exportContextMenu = chart[cacheName] = menu =
|
|
377
|
+
createElement('div', {
|
|
378
|
+
className: className
|
|
379
|
+
}, {
|
|
380
|
+
position: 'absolute',
|
|
381
|
+
zIndex: 1000,
|
|
382
|
+
padding: menuPadding + 'px',
|
|
383
|
+
pointerEvents: 'auto'
|
|
384
|
+
}, chart.fixedDiv || chart.container);
|
|
385
|
+
innerMenu = createElement('ul', { className: 'highcharts-menu' }, {
|
|
386
|
+
listStyle: 'none',
|
|
387
|
+
margin: 0,
|
|
388
|
+
padding: 0
|
|
389
|
+
}, menu);
|
|
390
|
+
// Presentational CSS
|
|
391
|
+
if (!chart.styledMode) {
|
|
392
|
+
css(innerMenu, extend({
|
|
393
|
+
MozBoxShadow: '3px 3px 10px #888',
|
|
394
|
+
WebkitBoxShadow: '3px 3px 10px #888',
|
|
395
|
+
boxShadow: '3px 3px 10px #888'
|
|
396
|
+
}, navOptions.menuStyle));
|
|
397
|
+
}
|
|
398
|
+
// hide on mouse out
|
|
399
|
+
menu.hideMenu = function () {
|
|
400
|
+
css(menu, { display: 'none' });
|
|
401
|
+
if (button) {
|
|
402
|
+
button.setState(0);
|
|
403
|
+
}
|
|
404
|
+
chart.openMenu = false;
|
|
405
|
+
// #10361, #9998
|
|
406
|
+
css(chart.renderTo, { overflow: 'hidden' });
|
|
407
|
+
css(chart.container, { overflow: 'hidden' });
|
|
408
|
+
U.clearTimeout(menu.hideTimer);
|
|
409
|
+
fireEvent(chart, 'exportMenuHidden');
|
|
410
|
+
};
|
|
411
|
+
// Hide the menu some time after mouse leave (#1357)
|
|
412
|
+
chart.exportEvents.push(addEvent(menu, 'mouseleave', function () {
|
|
413
|
+
menu.hideTimer = win.setTimeout(menu.hideMenu, 500);
|
|
414
|
+
}), addEvent(menu, 'mouseenter', function () {
|
|
415
|
+
U.clearTimeout(menu.hideTimer);
|
|
416
|
+
}),
|
|
417
|
+
// Hide it on clicking or touching outside the menu (#2258,
|
|
418
|
+
// #2335, #2407)
|
|
419
|
+
addEvent(doc, 'mouseup', function (e) {
|
|
420
|
+
if (!chart.pointer.inClass(e.target, className)) {
|
|
421
|
+
menu.hideMenu();
|
|
422
|
+
}
|
|
423
|
+
}), addEvent(menu, 'click', function () {
|
|
424
|
+
if (chart.openMenu) {
|
|
425
|
+
menu.hideMenu();
|
|
426
|
+
}
|
|
427
|
+
}));
|
|
428
|
+
// create the items
|
|
429
|
+
items.forEach(function (item) {
|
|
430
|
+
if (typeof item === 'string') {
|
|
431
|
+
item = chart.options.exporting
|
|
432
|
+
.menuItemDefinitions[item];
|
|
433
|
+
}
|
|
434
|
+
if (isObject(item, true)) {
|
|
435
|
+
var element = void 0;
|
|
436
|
+
if (item.separator) {
|
|
437
|
+
element = createElement('hr', void 0, void 0, innerMenu);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// When chart initialized with the table,
|
|
441
|
+
// wrong button text displayed, #14352.
|
|
442
|
+
if (item.textKey === 'viewData' && chart.isDataTableVisible) {
|
|
443
|
+
item.textKey = 'hideData';
|
|
444
|
+
}
|
|
445
|
+
element = createElement('li', {
|
|
446
|
+
className: 'highcharts-menu-item',
|
|
447
|
+
onclick: function (e) {
|
|
448
|
+
if (e) { // IE7
|
|
449
|
+
e.stopPropagation();
|
|
450
|
+
}
|
|
451
|
+
menu.hideMenu();
|
|
452
|
+
if (item.onclick) {
|
|
453
|
+
item.onclick
|
|
454
|
+
.apply(chart, arguments);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}, void 0, innerMenu);
|
|
458
|
+
AST.setElementHTML(element, item.text ||
|
|
459
|
+
chart.options.lang[item.textKey]);
|
|
460
|
+
if (!chart.styledMode) {
|
|
461
|
+
element.onmouseover = function () {
|
|
462
|
+
css(this, navOptions.menuItemHoverStyle);
|
|
463
|
+
};
|
|
464
|
+
element.onmouseout = function () {
|
|
465
|
+
css(this, navOptions.menuItemStyle);
|
|
466
|
+
};
|
|
467
|
+
css(element, extend({
|
|
468
|
+
cursor: 'pointer'
|
|
469
|
+
}, navOptions.menuItemStyle));
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// Keep references to menu divs to be able to destroy them
|
|
473
|
+
chart.exportDivElements.push(element);
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
// Keep references to menu and innerMenu div to be able to destroy
|
|
477
|
+
// them
|
|
478
|
+
chart.exportDivElements.push(innerMenu, menu);
|
|
479
|
+
chart.exportMenuWidth = menu.offsetWidth;
|
|
480
|
+
chart.exportMenuHeight = menu.offsetHeight;
|
|
481
|
+
}
|
|
482
|
+
var menuStyle = { display: 'block' };
|
|
483
|
+
// if outside right, right align it
|
|
484
|
+
if (x + chart.exportMenuWidth > chartWidth) {
|
|
485
|
+
menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
menuStyle.left = (x - menuPadding) + 'px';
|
|
489
|
+
}
|
|
490
|
+
// if outside bottom, bottom align it
|
|
491
|
+
if (y + height + chart.exportMenuHeight > chartHeight &&
|
|
492
|
+
button.alignOptions.verticalAlign !== 'top') {
|
|
493
|
+
menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
menuStyle.top = (y + height - menuPadding) + 'px';
|
|
497
|
+
}
|
|
498
|
+
css(menu, menuStyle);
|
|
499
|
+
// #10361, #9998
|
|
500
|
+
css(chart.renderTo, { overflow: '' });
|
|
501
|
+
css(chart.container, { overflow: '' });
|
|
502
|
+
chart.openMenu = true;
|
|
503
|
+
fireEvent(chart, 'exportMenuShown');
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Destroy the export buttons.
|
|
507
|
+
* @private
|
|
508
|
+
* @function Highcharts.Chart#destroyExport
|
|
509
|
+
* @param {global.Event} [e]
|
|
510
|
+
* @return {void}
|
|
511
|
+
* @requires modules/exporting
|
|
512
|
+
*/
|
|
513
|
+
function destroyExport(e) {
|
|
514
|
+
var chart = e ? e.target : this, exportSVGElements = chart.exportSVGElements, exportDivElements = chart.exportDivElements, exportEvents = chart.exportEvents;
|
|
515
|
+
var cacheName;
|
|
516
|
+
// Destroy the extra buttons added
|
|
517
|
+
if (exportSVGElements) {
|
|
518
|
+
exportSVGElements.forEach(function (elem, i) {
|
|
519
|
+
// Destroy and null the svg elements
|
|
520
|
+
if (elem) { // #1822
|
|
521
|
+
elem.onclick = elem.ontouchstart = null;
|
|
522
|
+
cacheName = 'cache-' + elem.menuClassName;
|
|
523
|
+
if (chart[cacheName]) {
|
|
524
|
+
delete chart[cacheName];
|
|
525
|
+
}
|
|
526
|
+
exportSVGElements[i] = elem.destroy();
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
exportSVGElements.length = 0;
|
|
530
|
+
}
|
|
531
|
+
// Destroy the exporting group
|
|
532
|
+
if (chart.exportingGroup) {
|
|
533
|
+
chart.exportingGroup.destroy();
|
|
534
|
+
delete chart.exportingGroup;
|
|
535
|
+
}
|
|
536
|
+
// Destroy the divs for the menu
|
|
537
|
+
if (exportDivElements) {
|
|
538
|
+
exportDivElements.forEach(function (elem, i) {
|
|
539
|
+
if (elem) {
|
|
540
|
+
// Remove the event handler
|
|
541
|
+
U.clearTimeout(elem.hideTimer); // #5427
|
|
542
|
+
removeEvent(elem, 'mouseleave');
|
|
543
|
+
// Remove inline events
|
|
544
|
+
// (chart.exportDivElements as any)[i] =
|
|
545
|
+
exportDivElements[i] =
|
|
546
|
+
elem.onmouseout =
|
|
547
|
+
elem.onmouseover =
|
|
548
|
+
elem.ontouchstart =
|
|
549
|
+
elem.onclick = null;
|
|
550
|
+
// Destroy the div by moving to garbage bin
|
|
551
|
+
discardElement(elem);
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
exportDivElements.length = 0;
|
|
555
|
+
}
|
|
556
|
+
if (exportEvents) {
|
|
557
|
+
exportEvents.forEach(function (unbind) {
|
|
558
|
+
unbind();
|
|
559
|
+
});
|
|
560
|
+
exportEvents.length = 0;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Exporting module required. Submit an SVG version of the chart to a server
|
|
565
|
+
* along with some parameters for conversion.
|
|
566
|
+
*
|
|
567
|
+
* @sample highcharts/members/chart-exportchart/
|
|
568
|
+
* Export with no options
|
|
569
|
+
* @sample highcharts/members/chart-exportchart-filename/
|
|
570
|
+
* PDF type and custom filename
|
|
571
|
+
* @sample highcharts/members/chart-exportchart-custom-background/
|
|
572
|
+
* Different chart background in export
|
|
573
|
+
* @sample stock/members/chart-exportchart/
|
|
574
|
+
* Export with Highcharts Stock
|
|
575
|
+
*
|
|
576
|
+
* @function Highcharts.Chart#exportChart
|
|
577
|
+
*
|
|
578
|
+
* @param {Highcharts.ExportingOptions} exportingOptions
|
|
579
|
+
* Exporting options in addition to those defined in
|
|
580
|
+
* [exporting](https://api.highcharts.com/highcharts/exporting).
|
|
581
|
+
*
|
|
582
|
+
* @param {Highcharts.Options} chartOptions
|
|
583
|
+
* Additional chart options for the exported chart. For example a
|
|
584
|
+
* different background color can be added here, or `dataLabels` for
|
|
585
|
+
* export only.
|
|
586
|
+
*
|
|
587
|
+
* @requires modules/exporting
|
|
588
|
+
*/
|
|
589
|
+
function exportChart(exportingOptions, chartOptions) {
|
|
590
|
+
var svg = this.getSVGForExport(exportingOptions, chartOptions);
|
|
591
|
+
// merge the options
|
|
592
|
+
exportingOptions = merge(this.options.exporting, exportingOptions);
|
|
593
|
+
// do the post
|
|
594
|
+
HU.post(exportingOptions.url, {
|
|
595
|
+
filename: exportingOptions.filename ?
|
|
596
|
+
exportingOptions.filename.replace(/\//g, '-') :
|
|
597
|
+
this.getFilename(),
|
|
598
|
+
type: exportingOptions.type,
|
|
599
|
+
// IE8 fails to post undefined correctly, so use 0
|
|
600
|
+
width: exportingOptions.width || 0,
|
|
601
|
+
scale: exportingOptions.scale,
|
|
602
|
+
svg: svg
|
|
603
|
+
}, exportingOptions.formAttributes);
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Return the unfiltered innerHTML of the chart container. Used as hook for
|
|
607
|
+
* plugins. In styled mode, it also takes care of inlining CSS style rules.
|
|
608
|
+
*
|
|
609
|
+
* @see Chart#getSVG
|
|
610
|
+
*
|
|
611
|
+
* @function Highcharts.Chart#getChartHTML
|
|
612
|
+
*
|
|
613
|
+
* @returns {string}
|
|
614
|
+
* The unfiltered SVG of the chart.
|
|
615
|
+
*
|
|
616
|
+
* @requires modules/exporting
|
|
617
|
+
*/
|
|
618
|
+
function getChartHTML() {
|
|
619
|
+
if (this.styledMode) {
|
|
620
|
+
this.inlineStyles();
|
|
621
|
+
}
|
|
622
|
+
return this.container.innerHTML;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Get the default file name used for exported charts. By default it creates
|
|
626
|
+
* a file name based on the chart title.
|
|
627
|
+
*
|
|
628
|
+
* @function Highcharts.Chart#getFilename
|
|
629
|
+
*
|
|
630
|
+
* @return {string} A file name without extension.
|
|
631
|
+
*
|
|
632
|
+
* @requires modules/exporting
|
|
633
|
+
*/
|
|
634
|
+
function getFilename() {
|
|
635
|
+
var s = this.userOptions.title && this.userOptions.title.text;
|
|
636
|
+
var filename = this.options.exporting.filename;
|
|
637
|
+
if (filename) {
|
|
638
|
+
return filename.replace(/\//g, '-');
|
|
639
|
+
}
|
|
640
|
+
if (typeof s === 'string') {
|
|
641
|
+
filename = s
|
|
642
|
+
.toLowerCase()
|
|
643
|
+
.replace(/<\/?[^>]+(>|$)/g, '') // strip HTML tags
|
|
644
|
+
.replace(/[\s_]+/g, '-')
|
|
645
|
+
.replace(/[^a-z0-9\-]/g, '') // preserve only latin
|
|
646
|
+
.replace(/^[\-]+/g, '') // dashes in the start
|
|
647
|
+
.replace(/[\-]+/g, '-') // dashes in a row
|
|
648
|
+
.substr(0, 24)
|
|
649
|
+
.replace(/[\-]+$/g, ''); // dashes in the end;
|
|
650
|
+
}
|
|
651
|
+
if (!filename || filename.length < 5) {
|
|
652
|
+
filename = 'chart';
|
|
653
|
+
}
|
|
654
|
+
return filename;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Return an SVG representation of the chart.
|
|
658
|
+
*
|
|
659
|
+
* @sample highcharts/members/chart-getsvg/
|
|
660
|
+
* View the SVG from a button
|
|
661
|
+
*
|
|
662
|
+
* @function Highcharts.Chart#getSVG
|
|
663
|
+
*
|
|
664
|
+
* @param {Highcharts.Options} [chartOptions]
|
|
665
|
+
* Additional chart options for the generated SVG representation. For
|
|
666
|
+
* collections like `xAxis`, `yAxis` or `series`, the additional
|
|
667
|
+
* options is either merged in to the original item of the same
|
|
668
|
+
* `id`, or to the first item if a common id is not found.
|
|
669
|
+
*
|
|
670
|
+
* @return {string}
|
|
671
|
+
* The SVG representation of the rendered chart.
|
|
672
|
+
*
|
|
673
|
+
* @fires Highcharts.Chart#event:getSVG
|
|
674
|
+
*
|
|
675
|
+
* @requires modules/exporting
|
|
676
|
+
*/
|
|
677
|
+
function getSVG(chartOptions) {
|
|
678
|
+
var chart = this;
|
|
679
|
+
var svg, seriesOptions,
|
|
680
|
+
// Copy the options and add extra options
|
|
681
|
+
options = merge(chart.options, chartOptions);
|
|
682
|
+
// Use userOptions to make the options chain in series right (#3881)
|
|
683
|
+
options.plotOptions = merge(chart.userOptions.plotOptions, chartOptions && chartOptions.plotOptions);
|
|
684
|
+
// ... and likewise with time, avoid that undefined time properties are
|
|
685
|
+
// merged over legacy global time options
|
|
686
|
+
options.time = merge(chart.userOptions.time, chartOptions && chartOptions.time);
|
|
687
|
+
// create a sandbox where a new chart will be generated
|
|
688
|
+
var sandbox = createElement('div', null, {
|
|
689
|
+
position: 'absolute',
|
|
690
|
+
top: '-9999em',
|
|
691
|
+
width: chart.chartWidth + 'px',
|
|
692
|
+
height: chart.chartHeight + 'px'
|
|
693
|
+
}, doc.body);
|
|
694
|
+
// get the source size
|
|
695
|
+
var cssWidth = chart.renderTo.style.width, cssHeight = chart.renderTo.style.height, sourceWidth = options.exporting.sourceWidth ||
|
|
696
|
+
options.chart.width ||
|
|
697
|
+
(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
|
|
698
|
+
(options.isGantt ? 800 : 600), sourceHeight = options.exporting.sourceHeight ||
|
|
699
|
+
options.chart.height ||
|
|
700
|
+
(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
|
|
701
|
+
400;
|
|
702
|
+
// override some options
|
|
703
|
+
extend(options.chart, {
|
|
704
|
+
animation: false,
|
|
705
|
+
renderTo: sandbox,
|
|
706
|
+
forExport: true,
|
|
707
|
+
renderer: 'SVGRenderer',
|
|
708
|
+
width: sourceWidth,
|
|
709
|
+
height: sourceHeight
|
|
710
|
+
});
|
|
711
|
+
options.exporting.enabled = false; // hide buttons in print
|
|
712
|
+
delete options.data; // #3004
|
|
713
|
+
// prepare for replicating the chart
|
|
714
|
+
options.series = [];
|
|
715
|
+
chart.series.forEach(function (serie) {
|
|
716
|
+
seriesOptions = merge(serie.userOptions, {
|
|
717
|
+
animation: false,
|
|
718
|
+
enableMouseTracking: false,
|
|
719
|
+
showCheckbox: false,
|
|
720
|
+
visible: serie.visible
|
|
721
|
+
});
|
|
722
|
+
// Used for the navigator series that has its own option set
|
|
723
|
+
if (!seriesOptions.isInternal) {
|
|
724
|
+
options.series.push(seriesOptions);
|
|
725
|
+
}
|
|
726
|
+
});
|
|
727
|
+
var colls = {};
|
|
728
|
+
chart.axes.forEach(function (axis) {
|
|
729
|
+
// Assign an internal key to ensure a one-to-one mapping (#5924)
|
|
730
|
+
if (!axis.userOptions.internalKey) { // #6444
|
|
731
|
+
axis.userOptions.internalKey = uniqueKey();
|
|
732
|
+
}
|
|
733
|
+
if (!axis.options.isInternal) {
|
|
734
|
+
if (!colls[axis.coll]) {
|
|
735
|
+
colls[axis.coll] = true;
|
|
736
|
+
options[axis.coll] = [];
|
|
737
|
+
}
|
|
738
|
+
options[axis.coll].push(merge(axis.userOptions, {
|
|
739
|
+
visible: axis.visible
|
|
740
|
+
}));
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
// generate the chart copy
|
|
744
|
+
var chartCopy = new Chart(options, chart.callback);
|
|
745
|
+
// Axis options and series options (#2022, #3900, #5982)
|
|
746
|
+
if (chartOptions) {
|
|
747
|
+
['xAxis', 'yAxis', 'series'].forEach(function (coll) {
|
|
748
|
+
var collOptions = {};
|
|
749
|
+
if (chartOptions[coll]) {
|
|
750
|
+
collOptions[coll] = chartOptions[coll];
|
|
751
|
+
chartCopy.update(collOptions);
|
|
752
|
+
}
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
// Reflect axis extremes in the export (#5924)
|
|
756
|
+
chart.axes.forEach(function (axis) {
|
|
757
|
+
var axisCopy = find(chartCopy.axes, function (copy) {
|
|
758
|
+
return copy.options.internalKey ===
|
|
759
|
+
axis.userOptions.internalKey;
|
|
760
|
+
}), extremes = axis.getExtremes(), userMin = extremes.userMin, userMax = extremes.userMax;
|
|
761
|
+
if (axisCopy &&
|
|
762
|
+
((typeof userMin !== 'undefined' &&
|
|
763
|
+
userMin !== axisCopy.min) || (typeof userMax !== 'undefined' &&
|
|
764
|
+
userMax !== axisCopy.max))) {
|
|
765
|
+
axisCopy.setExtremes(userMin, userMax, true, false);
|
|
766
|
+
}
|
|
767
|
+
});
|
|
768
|
+
// Get the SVG from the container's innerHTML
|
|
769
|
+
svg = chartCopy.getChartHTML();
|
|
770
|
+
fireEvent(this, 'getSVG', { chartCopy: chartCopy });
|
|
771
|
+
svg = chart.sanitizeSVG(svg, options);
|
|
772
|
+
// free up memory
|
|
773
|
+
options = null;
|
|
774
|
+
chartCopy.destroy();
|
|
775
|
+
discardElement(sandbox);
|
|
776
|
+
return svg;
|
|
777
|
+
}
|
|
778
|
+
/**
|
|
779
|
+
* @private
|
|
780
|
+
* @function Highcharts.Chart#getSVGForExport
|
|
781
|
+
* @param {Highcharts.ExportingOptions} options
|
|
782
|
+
* @param {Highcharts.Options} chartOptions
|
|
783
|
+
* @return {string}
|
|
784
|
+
* @requires modules/exporting
|
|
785
|
+
*/
|
|
786
|
+
function getSVGForExport(options, chartOptions) {
|
|
787
|
+
var chartExportingOptions = this.options.exporting;
|
|
788
|
+
return this.getSVG(merge({ chart: { borderRadius: 0 } }, chartExportingOptions.chartOptions, chartOptions, {
|
|
789
|
+
exporting: {
|
|
790
|
+
sourceWidth: ((options && options.sourceWidth) ||
|
|
791
|
+
chartExportingOptions.sourceWidth),
|
|
792
|
+
sourceHeight: ((options && options.sourceHeight) ||
|
|
793
|
+
chartExportingOptions.sourceHeight)
|
|
794
|
+
}
|
|
795
|
+
}));
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Make hyphenated property names out of camelCase
|
|
799
|
+
* @private
|
|
800
|
+
* @param {string} prop
|
|
801
|
+
* Property name in camelCase
|
|
802
|
+
* @return {string}
|
|
803
|
+
* Hyphenated property name
|
|
804
|
+
*/
|
|
805
|
+
function hyphenate(prop) {
|
|
806
|
+
return prop.replace(/([A-Z])/g, function (a, b) {
|
|
807
|
+
return '-' + b.toLowerCase();
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* Analyze inherited styles from stylesheets and add them inline
|
|
812
|
+
*
|
|
813
|
+
* @private
|
|
814
|
+
* @function Highcharts.Chart#inlineStyles
|
|
815
|
+
* @return {void}
|
|
816
|
+
*
|
|
817
|
+
* @todo: What are the border styles for text about? In general, text has a
|
|
818
|
+
* lot of properties.
|
|
819
|
+
* @todo: Make it work with IE9 and IE10.
|
|
820
|
+
*
|
|
821
|
+
* @requires modules/exporting
|
|
822
|
+
*/
|
|
823
|
+
function inlineStyles() {
|
|
824
|
+
var blacklist = inlineBlacklist, whitelist = Exporting.inlineWhitelist, // For IE
|
|
825
|
+
defaultStyles = {};
|
|
826
|
+
var dummySVG;
|
|
827
|
+
// Create an iframe where we read default styles without pollution from
|
|
828
|
+
// this body
|
|
829
|
+
var iframe = doc.createElement('iframe');
|
|
830
|
+
css(iframe, {
|
|
831
|
+
width: '1px',
|
|
832
|
+
height: '1px',
|
|
833
|
+
visibility: 'hidden'
|
|
834
|
+
});
|
|
835
|
+
doc.body.appendChild(iframe);
|
|
836
|
+
var iframeDoc = iframe.contentWindow.document;
|
|
837
|
+
iframeDoc.open();
|
|
838
|
+
iframeDoc.write('<svg xmlns="http://www.w3.org/2000/svg"></svg>');
|
|
839
|
+
iframeDoc.close();
|
|
840
|
+
/**
|
|
841
|
+
* Call this on all elements and recurse to children
|
|
842
|
+
* @private
|
|
843
|
+
* @param {Highcharts.HTMLDOMElement} node
|
|
844
|
+
* Element child
|
|
845
|
+
* @return {void}
|
|
846
|
+
*/
|
|
847
|
+
function recurse(node) {
|
|
848
|
+
var styles, parentStyles, cssText = '', dummy, styleAttr, blacklisted, whitelisted, i;
|
|
849
|
+
/**
|
|
850
|
+
* Check computed styles and whether they are in the white/blacklist
|
|
851
|
+
* for styles or atttributes.
|
|
852
|
+
* @private
|
|
853
|
+
* @param {string} val
|
|
854
|
+
* Style value
|
|
855
|
+
* @param {string} prop
|
|
856
|
+
* Style property name
|
|
857
|
+
* @return {void}
|
|
858
|
+
*/
|
|
859
|
+
function filterStyles(val, prop) {
|
|
860
|
+
// Check against whitelist & blacklist
|
|
861
|
+
blacklisted = whitelisted = false;
|
|
862
|
+
if (whitelist.length) {
|
|
863
|
+
// Styled mode in IE has a whitelist instead.
|
|
864
|
+
// Exclude all props not in this list.
|
|
865
|
+
i = whitelist.length;
|
|
866
|
+
while (i-- && !whitelisted) {
|
|
867
|
+
whitelisted = whitelist[i].test(prop);
|
|
868
|
+
}
|
|
869
|
+
blacklisted = !whitelisted;
|
|
870
|
+
}
|
|
871
|
+
// Explicitly remove empty transforms
|
|
872
|
+
if (prop === 'transform' && val === 'none') {
|
|
873
|
+
blacklisted = true;
|
|
874
|
+
}
|
|
875
|
+
i = blacklist.length;
|
|
876
|
+
while (i-- && !blacklisted) {
|
|
877
|
+
blacklisted = (blacklist[i].test(prop) ||
|
|
878
|
+
typeof val === 'function');
|
|
879
|
+
}
|
|
880
|
+
if (!blacklisted) {
|
|
881
|
+
// If parent node has the same style, it gets inherited, no
|
|
882
|
+
// need to inline it. Top-level props should be diffed
|
|
883
|
+
// against parent (#7687).
|
|
884
|
+
if ((parentStyles[prop] !== val ||
|
|
885
|
+
node.nodeName === 'svg') &&
|
|
886
|
+
defaultStyles[node.nodeName][prop] !== val) {
|
|
887
|
+
// Attributes
|
|
888
|
+
if (!inlineToAttributes ||
|
|
889
|
+
inlineToAttributes.indexOf(prop) !== -1) {
|
|
890
|
+
if (val) {
|
|
891
|
+
node.setAttribute(hyphenate(prop), val);
|
|
892
|
+
}
|
|
893
|
+
// Styles
|
|
894
|
+
}
|
|
895
|
+
else {
|
|
896
|
+
cssText += hyphenate(prop) + ':' + val + ';';
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
if (node.nodeType === 1 &&
|
|
902
|
+
unstyledElements.indexOf(node.nodeName) === -1) {
|
|
903
|
+
styles = win.getComputedStyle(node, null);
|
|
904
|
+
parentStyles = node.nodeName === 'svg' ?
|
|
905
|
+
{} :
|
|
906
|
+
win.getComputedStyle(node.parentNode, null);
|
|
907
|
+
// Get default styles from the browser so that we don't have to
|
|
908
|
+
// add these
|
|
909
|
+
if (!defaultStyles[node.nodeName]) {
|
|
910
|
+
/*
|
|
911
|
+
if (!dummySVG) {
|
|
912
|
+
dummySVG = doc.createElementNS(H.SVG_NS, 'svg');
|
|
913
|
+
dummySVG.setAttribute('version', '1.1');
|
|
914
|
+
doc.body.appendChild(dummySVG);
|
|
915
|
+
}
|
|
916
|
+
*/
|
|
917
|
+
dummySVG = iframeDoc.getElementsByTagName('svg')[0];
|
|
918
|
+
dummy = iframeDoc.createElementNS(node.namespaceURI, node.nodeName);
|
|
919
|
+
dummySVG.appendChild(dummy);
|
|
920
|
+
// Copy, so we can remove the node
|
|
921
|
+
defaultStyles[node.nodeName] = merge(win.getComputedStyle(dummy, null));
|
|
922
|
+
// Remove default fill, otherwise text disappears when
|
|
923
|
+
// exported
|
|
924
|
+
if (node.nodeName === 'text') {
|
|
925
|
+
delete defaultStyles.text.fill;
|
|
926
|
+
}
|
|
927
|
+
dummySVG.removeChild(dummy);
|
|
928
|
+
}
|
|
929
|
+
// Loop through all styles and add them inline if they are ok
|
|
930
|
+
if (G.isFirefox || G.isMS) {
|
|
931
|
+
// Some browsers put lots of styles on the prototype
|
|
932
|
+
for (var p in styles) { // eslint-disable-line guard-for-in
|
|
933
|
+
filterStyles(styles[p], p);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
else {
|
|
937
|
+
objectEach(styles, filterStyles);
|
|
938
|
+
}
|
|
939
|
+
// Apply styles
|
|
940
|
+
if (cssText) {
|
|
941
|
+
styleAttr = node.getAttribute('style');
|
|
942
|
+
node.setAttribute('style', (styleAttr ? styleAttr + ';' : '') + cssText);
|
|
943
|
+
}
|
|
944
|
+
// Set default stroke width (needed at least for IE)
|
|
945
|
+
if (node.nodeName === 'svg') {
|
|
946
|
+
node.setAttribute('stroke-width', '1px');
|
|
947
|
+
}
|
|
948
|
+
if (node.nodeName === 'text') {
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
951
|
+
// Recurse
|
|
952
|
+
[].forEach.call(node.children || node.childNodes, recurse);
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* Remove the dummy objects used to get defaults
|
|
957
|
+
* @private
|
|
958
|
+
* @return {void}
|
|
959
|
+
*/
|
|
960
|
+
function tearDown() {
|
|
961
|
+
dummySVG.parentNode.removeChild(dummySVG);
|
|
962
|
+
// Remove trash from DOM that stayed after each exporting
|
|
963
|
+
iframe.parentNode.removeChild(iframe);
|
|
964
|
+
}
|
|
965
|
+
recurse(this.container.querySelector('svg'));
|
|
966
|
+
tearDown();
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* Move the chart container(s) to another div.
|
|
970
|
+
*
|
|
971
|
+
* @function Highcharts#moveContainers
|
|
972
|
+
*
|
|
973
|
+
* @private
|
|
974
|
+
*
|
|
975
|
+
* @param {Highcharts.HTMLDOMElement} moveTo
|
|
976
|
+
* Move target
|
|
977
|
+
* @return {void}
|
|
978
|
+
*/
|
|
979
|
+
function moveContainers(moveTo) {
|
|
980
|
+
var chart = this;
|
|
981
|
+
(chart.fixedDiv ? // When scrollablePlotArea is active (#9533)
|
|
982
|
+
[chart.fixedDiv, chart.scrollingContainer] :
|
|
983
|
+
[chart.container]).forEach(function (div) {
|
|
984
|
+
moveTo.appendChild(div);
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
/**
|
|
988
|
+
* Add update methods to handle chart.update and chart.exporting.update and
|
|
989
|
+
* chart.navigation.update. These must be added to the chart instance rather
|
|
990
|
+
* than the Chart prototype in order to use the chart instance inside the
|
|
991
|
+
* update function.
|
|
992
|
+
* @private
|
|
993
|
+
*/
|
|
994
|
+
function onChartInit() {
|
|
995
|
+
var chart = this,
|
|
996
|
+
/**
|
|
997
|
+
* @private
|
|
998
|
+
* @param {"exporting"|"navigation"} prop
|
|
999
|
+
* Property name in option root
|
|
1000
|
+
* @param {Highcharts.ExportingOptions|Highcharts.NavigationOptions} options
|
|
1001
|
+
* Options to update
|
|
1002
|
+
* @param {boolean} [redraw=true]
|
|
1003
|
+
* Whether to redraw
|
|
1004
|
+
* @return {void}
|
|
1005
|
+
*/
|
|
1006
|
+
update = function (prop, options, redraw) {
|
|
1007
|
+
chart.isDirtyExporting = true;
|
|
1008
|
+
merge(true, chart.options[prop], options);
|
|
1009
|
+
if (pick(redraw, true)) {
|
|
1010
|
+
chart.redraw();
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
chart.exporting = {
|
|
1014
|
+
update: function (options, redraw) {
|
|
1015
|
+
update('exporting', options, redraw);
|
|
1016
|
+
}
|
|
1017
|
+
};
|
|
1018
|
+
// Register update() method for navigation. Can not be set the same way
|
|
1019
|
+
// as for exporting, because navigation options are shared with bindings
|
|
1020
|
+
// which has separate update() logic.
|
|
1021
|
+
chartNavigationMixin.addUpdate(function (options, redraw) {
|
|
1022
|
+
update('navigation', options, redraw);
|
|
1023
|
+
}, chart);
|
|
1024
|
+
}
|
|
1025
|
+
/**
|
|
1026
|
+
* Exporting module required. Clears away other elements in the page and
|
|
1027
|
+
* prints the chart as it is displayed. By default, when the exporting
|
|
1028
|
+
* module is enabled, a context button with a drop down menu in the upper
|
|
1029
|
+
* right corner accesses this function.
|
|
1030
|
+
*
|
|
1031
|
+
* @sample highcharts/members/chart-print/
|
|
1032
|
+
* Print from a HTML button
|
|
1033
|
+
*
|
|
1034
|
+
* @function Highcharts.Chart#print
|
|
1035
|
+
*
|
|
1036
|
+
* @return {void}
|
|
1037
|
+
*
|
|
1038
|
+
* @fires Highcharts.Chart#event:beforePrint
|
|
1039
|
+
* @fires Highcharts.Chart#event:afterPrint
|
|
1040
|
+
*
|
|
1041
|
+
* @requires modules/exporting
|
|
1042
|
+
*/
|
|
1043
|
+
function print() {
|
|
1044
|
+
var chart = this;
|
|
1045
|
+
if (chart.isPrinting) { // block the button while in printing mode
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
printingChart = chart;
|
|
1049
|
+
if (!G.isSafari) {
|
|
1050
|
+
chart.beforePrint();
|
|
1051
|
+
}
|
|
1052
|
+
// Give the browser time to draw WebGL content, an issue that randomly
|
|
1053
|
+
// appears (at least) in Chrome ~67 on the Mac (#8708).
|
|
1054
|
+
setTimeout(function () {
|
|
1055
|
+
win.focus(); // #1510
|
|
1056
|
+
win.print();
|
|
1057
|
+
// allow the browser to prepare before reverting
|
|
1058
|
+
if (!G.isSafari) {
|
|
1059
|
+
setTimeout(function () {
|
|
1060
|
+
chart.afterPrint();
|
|
1061
|
+
}, 1000);
|
|
1062
|
+
}
|
|
1063
|
+
}, 1);
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Add the buttons on chart load
|
|
1067
|
+
* @private
|
|
1068
|
+
* @function Highcharts.Chart#renderExporting
|
|
1069
|
+
* @return {void}
|
|
1070
|
+
* @requires modules/exporting
|
|
1071
|
+
*/
|
|
1072
|
+
function renderExporting() {
|
|
1073
|
+
var chart = this, exportingOptions = chart.options.exporting, buttons = exportingOptions.buttons, isDirty = chart.isDirtyExporting || !chart.exportSVGElements;
|
|
1074
|
+
chart.buttonOffset = 0;
|
|
1075
|
+
if (chart.isDirtyExporting) {
|
|
1076
|
+
chart.destroyExport();
|
|
1077
|
+
}
|
|
1078
|
+
if (isDirty && exportingOptions.enabled !== false) {
|
|
1079
|
+
chart.exportEvents = [];
|
|
1080
|
+
chart.exportingGroup = chart.exportingGroup ||
|
|
1081
|
+
chart.renderer.g('exporting-group').attr({
|
|
1082
|
+
zIndex: 3 // #4955, // #8392
|
|
1083
|
+
}).add();
|
|
1084
|
+
objectEach(buttons, function (button) {
|
|
1085
|
+
chart.addButton(button);
|
|
1086
|
+
});
|
|
1087
|
+
chart.isDirtyExporting = false;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Exporting module only. A collection of fixes on the produced SVG to
|
|
1092
|
+
* account for expando properties, browser bugs, VML problems and other.
|
|
1093
|
+
* Returns a cleaned SVG.
|
|
1094
|
+
*
|
|
1095
|
+
* @private
|
|
1096
|
+
* @function Highcharts.Chart#sanitizeSVG
|
|
1097
|
+
* @param {string} svg
|
|
1098
|
+
* SVG code to sanitize
|
|
1099
|
+
* @param {Highcharts.Options} options
|
|
1100
|
+
* Chart options to apply
|
|
1101
|
+
* @return {string}
|
|
1102
|
+
* Sanitized SVG code
|
|
1103
|
+
* @requires modules/exporting
|
|
1104
|
+
*/
|
|
1105
|
+
function sanitizeSVG(svg, options) {
|
|
1106
|
+
var split = svg.indexOf('</svg>') + 6;
|
|
1107
|
+
var html = svg.substr(split);
|
|
1108
|
+
// Remove any HTML added to the container after the SVG (#894, #9087)
|
|
1109
|
+
svg = svg.substr(0, split);
|
|
1110
|
+
// Move HTML into a foreignObject
|
|
1111
|
+
if (options && options.exporting && options.exporting.allowHTML) {
|
|
1112
|
+
if (html) {
|
|
1113
|
+
html = '<foreignObject x="0" y="0" ' +
|
|
1114
|
+
'width="' + options.chart.width + '" ' +
|
|
1115
|
+
'height="' + options.chart.height + '">' +
|
|
1116
|
+
'<body xmlns="http://www.w3.org/1999/xhtml">' +
|
|
1117
|
+
// Some tags needs to be closed in xhtml (#13726)
|
|
1118
|
+
html.replace(/(<(?:img|br).*?(?=\>))>/g, '$1 />') +
|
|
1119
|
+
'</body>' +
|
|
1120
|
+
'</foreignObject>';
|
|
1121
|
+
svg = svg.replace('</svg>', html + '</svg>');
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
svg = svg
|
|
1125
|
+
.replace(/zIndex="[^"]+"/g, '')
|
|
1126
|
+
.replace(/symbolName="[^"]+"/g, '')
|
|
1127
|
+
.replace(/jQuery[0-9]+="[^"]+"/g, '')
|
|
1128
|
+
.replace(/url\(("|")(.*?)("|")\;?\)/g, 'url($2)')
|
|
1129
|
+
.replace(/url\([^#]+#/g, 'url(#')
|
|
1130
|
+
.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
|
|
1131
|
+
.replace(/ (|NS[0-9]+\:)href=/g, ' xlink:href=') // #3567
|
|
1132
|
+
.replace(/\n/, ' ')
|
|
1133
|
+
// Batik doesn't support rgba fills and strokes (#3095)
|
|
1134
|
+
.replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g, // eslint-disable-line max-len
|
|
1135
|
+
'$1="rgb($2)" $1-opacity="$3"')
|
|
1136
|
+
// Replace HTML entities, issue #347
|
|
1137
|
+
.replace(/ /g, '\u00A0') // no-break space
|
|
1138
|
+
.replace(/­/g, '\u00AD'); // soft hyphen
|
|
1139
|
+
// Further sanitize for oldIE
|
|
1140
|
+
if (this.ieSanitizeSVG) {
|
|
1141
|
+
svg = this.ieSanitizeSVG(svg);
|
|
1142
|
+
}
|
|
1143
|
+
return svg;
|
|
1144
|
+
}
|
|
1145
|
+
})(Exporting || (Exporting = {}));
|
|
1146
|
+
/* *
|
|
1147
|
+
*
|
|
1148
|
+
* Registry
|
|
1149
|
+
*
|
|
1150
|
+
* */
|
|
1151
|
+
defaultOptions.exporting = merge(ExportingDefaults.exporting, defaultOptions.exporting);
|
|
1152
|
+
defaultOptions.lang = merge(ExportingDefaults.lang, defaultOptions.lang);
|
|
1153
|
+
// Buttons and menus are collected in a separate config option set called
|
|
1154
|
+
// 'navigation'. This can be extended later to add control buttons like
|
|
1155
|
+
// zoom and pan right click menus.
|
|
1156
|
+
/**
|
|
1157
|
+
* A collection of options for buttons and menus appearing in the exporting
|
|
1158
|
+
* module.
|
|
1159
|
+
*
|
|
1160
|
+
* @requires modules/exporting
|
|
1161
|
+
* @optionparent navigation
|
|
1162
|
+
*/
|
|
1163
|
+
defaultOptions.navigation = merge(ExportingDefaults.navigation, defaultOptions.navigation);
|
|
1164
|
+
/* *
|
|
1165
|
+
*
|
|
1166
|
+
* Default Export
|
|
1167
|
+
*
|
|
1168
|
+
* */
|
|
1169
|
+
export default Exporting;
|
|
1170
|
+
/* *
|
|
1171
|
+
*
|
|
1172
|
+
* API Declarations
|
|
1173
|
+
*
|
|
1174
|
+
* */
|
|
1175
|
+
/**
|
|
1176
|
+
* Gets fired after a chart is printed through the context menu item or the
|
|
1177
|
+
* Chart.print method.
|
|
1178
|
+
*
|
|
1179
|
+
* @callback Highcharts.ExportingAfterPrintCallbackFunction
|
|
1180
|
+
*
|
|
1181
|
+
* @param {Highcharts.Chart} chart
|
|
1182
|
+
* The chart on which the event occured.
|
|
1183
|
+
*
|
|
1184
|
+
* @param {global.Event} event
|
|
1185
|
+
* The event that occured.
|
|
1186
|
+
*/
|
|
1187
|
+
/**
|
|
1188
|
+
* Gets fired before a chart is printed through the context menu item or the
|
|
1189
|
+
* Chart.print method.
|
|
1190
|
+
*
|
|
1191
|
+
* @callback Highcharts.ExportingBeforePrintCallbackFunction
|
|
1192
|
+
*
|
|
1193
|
+
* @param {Highcharts.Chart} chart
|
|
1194
|
+
* The chart on which the event occured.
|
|
1195
|
+
*
|
|
1196
|
+
* @param {global.Event} event
|
|
1197
|
+
* The event that occured.
|
|
1198
|
+
*/
|
|
1199
|
+
/**
|
|
1200
|
+
* Function to call if the offline-exporting module fails to export a chart on
|
|
1201
|
+
* the client side.
|
|
1202
|
+
*
|
|
1203
|
+
* @callback Highcharts.ExportingErrorCallbackFunction
|
|
1204
|
+
*
|
|
1205
|
+
* @param {Highcharts.ExportingOptions} options
|
|
1206
|
+
* The exporting options.
|
|
1207
|
+
*
|
|
1208
|
+
* @param {global.Error} err
|
|
1209
|
+
* The error from the module.
|
|
1210
|
+
*/
|
|
1211
|
+
/**
|
|
1212
|
+
* Definition for a menu item in the context menu.
|
|
1213
|
+
*
|
|
1214
|
+
* @interface Highcharts.ExportingMenuObject
|
|
1215
|
+
*/ /**
|
|
1216
|
+
* The text for the menu item.
|
|
1217
|
+
*
|
|
1218
|
+
* @name Highcharts.ExportingMenuObject#text
|
|
1219
|
+
* @type {string|undefined}
|
|
1220
|
+
*/ /**
|
|
1221
|
+
* If internationalization is required, the key to a language string.
|
|
1222
|
+
*
|
|
1223
|
+
* @name Highcharts.ExportingMenuObject#textKey
|
|
1224
|
+
* @type {string|undefined}
|
|
1225
|
+
*/ /**
|
|
1226
|
+
* The click handler for the menu item.
|
|
1227
|
+
*
|
|
1228
|
+
* @name Highcharts.ExportingMenuObject#onclick
|
|
1229
|
+
* @type {Highcharts.EventCallbackFunction<Highcharts.Chart>|undefined}
|
|
1230
|
+
*/ /**
|
|
1231
|
+
* Indicates a separator line instead of an item.
|
|
1232
|
+
*
|
|
1233
|
+
* @name Highcharts.ExportingMenuObject#separator
|
|
1234
|
+
* @type {boolean|undefined}
|
|
1235
|
+
*/
|
|
1236
|
+
/**
|
|
1237
|
+
* Possible MIME types for exporting.
|
|
1238
|
+
*
|
|
1239
|
+
* @typedef {"image/png"|"image/jpeg"|"application/pdf"|"image/svg+xml"} Highcharts.ExportingMimeTypeValue
|
|
1240
|
+
*/
|
|
1241
|
+
(''); // keeps doclets above in transpiled file
|
|
1242
|
+
/* *
|
|
1243
|
+
*
|
|
1244
|
+
* API Options
|
|
1245
|
+
*
|
|
1246
|
+
* */
|
|
1247
|
+
/**
|
|
1248
|
+
* Fires after a chart is printed through the context menu item or the
|
|
1249
|
+
* `Chart.print` method.
|
|
1250
|
+
*
|
|
1251
|
+
* @sample highcharts/chart/events-beforeprint-afterprint/
|
|
1252
|
+
* Rescale the chart to print
|
|
1253
|
+
*
|
|
1254
|
+
* @type {Highcharts.ExportingAfterPrintCallbackFunction}
|
|
1255
|
+
* @since 4.1.0
|
|
1256
|
+
* @context Highcharts.Chart
|
|
1257
|
+
* @requires modules/exporting
|
|
1258
|
+
* @apioption chart.events.afterPrint
|
|
1259
|
+
*/
|
|
1260
|
+
/**
|
|
1261
|
+
* Fires before a chart is printed through the context menu item or
|
|
1262
|
+
* the `Chart.print` method.
|
|
1263
|
+
*
|
|
1264
|
+
* @sample highcharts/chart/events-beforeprint-afterprint/
|
|
1265
|
+
* Rescale the chart to print
|
|
1266
|
+
*
|
|
1267
|
+
* @type {Highcharts.ExportingBeforePrintCallbackFunction}
|
|
1268
|
+
* @since 4.1.0
|
|
1269
|
+
* @context Highcharts.Chart
|
|
1270
|
+
* @requires modules/exporting
|
|
1271
|
+
* @apioption chart.events.beforePrint
|
|
1272
|
+
*/
|
|
1273
|
+
(''); // keeps doclets above in transpiled file
|