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
|
@@ -1,1173 +0,0 @@
|
|
|
1
|
-
/* *
|
|
2
|
-
*
|
|
3
|
-
* (c) 2010-2021 Torstein Honsi
|
|
4
|
-
*
|
|
5
|
-
* License: www.highcharts.com/license
|
|
6
|
-
*
|
|
7
|
-
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
8
|
-
*
|
|
9
|
-
* */
|
|
10
|
-
'use strict';
|
|
11
|
-
import A from '../Animation/AnimationUtilities.js';
|
|
12
|
-
var getDeferredAnimation = A.getDeferredAnimation;
|
|
13
|
-
import F from '../FormatUtilities.js';
|
|
14
|
-
var format = F.format;
|
|
15
|
-
import H from '../Globals.js';
|
|
16
|
-
var noop = H.noop;
|
|
17
|
-
import palette from '../Color/Palette.js';
|
|
18
|
-
import Series from '../Series/Series.js';
|
|
19
|
-
import SeriesRegistry from './SeriesRegistry.js';
|
|
20
|
-
var seriesTypes = SeriesRegistry.seriesTypes;
|
|
21
|
-
import U from '../Utilities.js';
|
|
22
|
-
var arrayMax = U.arrayMax, clamp = U.clamp, defined = U.defined, extend = U.extend, fireEvent = U.fireEvent, isArray = U.isArray, merge = U.merge, objectEach = U.objectEach, pick = U.pick, relativeLength = U.relativeLength, splat = U.splat, stableSort = U.stableSort;
|
|
23
|
-
/**
|
|
24
|
-
* Callback JavaScript function to format the data label as a string. Note that
|
|
25
|
-
* if a `format` is defined, the format takes precedence and the formatter is
|
|
26
|
-
* ignored.
|
|
27
|
-
*
|
|
28
|
-
* @callback Highcharts.DataLabelsFormatterCallbackFunction
|
|
29
|
-
*
|
|
30
|
-
* @param {Highcharts.PointLabelObject} this
|
|
31
|
-
* Data label context to format
|
|
32
|
-
*
|
|
33
|
-
* @param {Highcharts.DataLabelsOptions} options
|
|
34
|
-
* [API options](/highcharts/plotOptions.series.dataLabels) of the data label
|
|
35
|
-
*
|
|
36
|
-
* @return {number|string|null|undefined}
|
|
37
|
-
* Formatted data label text
|
|
38
|
-
*/
|
|
39
|
-
/**
|
|
40
|
-
* Values for handling data labels that flow outside the plot area.
|
|
41
|
-
*
|
|
42
|
-
* @typedef {"allow"|"justify"} Highcharts.DataLabelsOverflowValue
|
|
43
|
-
*/
|
|
44
|
-
''; // detach doclets above
|
|
45
|
-
/* eslint-disable valid-jsdoc */
|
|
46
|
-
/**
|
|
47
|
-
* General distribution algorithm for distributing labels of differing size
|
|
48
|
-
* along a confined length in two dimensions. The algorithm takes an array of
|
|
49
|
-
* objects containing a size, a target and a rank. It will place the labels as
|
|
50
|
-
* close as possible to their targets, skipping the lowest ranked labels if
|
|
51
|
-
* necessary.
|
|
52
|
-
*
|
|
53
|
-
* @private
|
|
54
|
-
* @function Highcharts.distribute
|
|
55
|
-
* @param {Highcharts.DataLabelsBoxArray} boxes
|
|
56
|
-
* @param {number} len
|
|
57
|
-
* @param {number} [maxDistance]
|
|
58
|
-
* @return {void}
|
|
59
|
-
*/
|
|
60
|
-
H.distribute = function (boxes, len, maxDistance) {
|
|
61
|
-
var i, overlapping = true, origBoxes = boxes, // Original array will be altered with added .pos
|
|
62
|
-
restBoxes = [], // The outranked overshoot
|
|
63
|
-
box, target, total = 0, reducedLen = origBoxes.reducedLen || len;
|
|
64
|
-
/**
|
|
65
|
-
* @private
|
|
66
|
-
*/
|
|
67
|
-
function sortByTarget(a, b) {
|
|
68
|
-
return a.target - b.target;
|
|
69
|
-
}
|
|
70
|
-
// If the total size exceeds the len, remove those boxes with the lowest
|
|
71
|
-
// rank
|
|
72
|
-
i = boxes.length;
|
|
73
|
-
while (i--) {
|
|
74
|
-
total += boxes[i].size;
|
|
75
|
-
}
|
|
76
|
-
// Sort by rank, then slice away overshoot
|
|
77
|
-
if (total > reducedLen) {
|
|
78
|
-
stableSort(boxes, function (a, b) {
|
|
79
|
-
return (b.rank || 0) - (a.rank || 0);
|
|
80
|
-
});
|
|
81
|
-
i = 0;
|
|
82
|
-
total = 0;
|
|
83
|
-
while (total <= reducedLen) {
|
|
84
|
-
total += boxes[i].size;
|
|
85
|
-
i++;
|
|
86
|
-
}
|
|
87
|
-
restBoxes = boxes.splice(i - 1, boxes.length);
|
|
88
|
-
}
|
|
89
|
-
// Order by target
|
|
90
|
-
stableSort(boxes, sortByTarget);
|
|
91
|
-
// So far we have been mutating the original array. Now
|
|
92
|
-
// create a copy with target arrays
|
|
93
|
-
boxes = boxes.map(function (box) {
|
|
94
|
-
return {
|
|
95
|
-
size: box.size,
|
|
96
|
-
targets: [box.target],
|
|
97
|
-
align: pick(box.align, 0.5)
|
|
98
|
-
};
|
|
99
|
-
});
|
|
100
|
-
while (overlapping) {
|
|
101
|
-
// Initial positions: target centered in box
|
|
102
|
-
i = boxes.length;
|
|
103
|
-
while (i--) {
|
|
104
|
-
box = boxes[i];
|
|
105
|
-
// Composite box, average of targets
|
|
106
|
-
target = (Math.min.apply(0, box.targets) +
|
|
107
|
-
Math.max.apply(0, box.targets)) / 2;
|
|
108
|
-
box.pos = clamp(target - box.size * box.align, 0, len - box.size);
|
|
109
|
-
}
|
|
110
|
-
// Detect overlap and join boxes
|
|
111
|
-
i = boxes.length;
|
|
112
|
-
overlapping = false;
|
|
113
|
-
while (i--) {
|
|
114
|
-
// Overlap
|
|
115
|
-
if (i > 0 &&
|
|
116
|
-
boxes[i - 1].pos + boxes[i - 1].size >
|
|
117
|
-
boxes[i].pos) {
|
|
118
|
-
// Add this size to the previous box
|
|
119
|
-
boxes[i - 1].size += boxes[i].size;
|
|
120
|
-
boxes[i - 1].targets = boxes[i - 1]
|
|
121
|
-
.targets
|
|
122
|
-
.concat(boxes[i].targets);
|
|
123
|
-
boxes[i - 1].align = 0.5;
|
|
124
|
-
// Overlapping right, push left
|
|
125
|
-
if (boxes[i - 1].pos + boxes[i - 1].size > len) {
|
|
126
|
-
boxes[i - 1].pos = len - boxes[i - 1].size;
|
|
127
|
-
}
|
|
128
|
-
boxes.splice(i, 1); // Remove this item
|
|
129
|
-
overlapping = true;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Add the rest (hidden boxes)
|
|
134
|
-
origBoxes.push.apply(origBoxes, restBoxes);
|
|
135
|
-
// Now the composite boxes are placed, we need to put the original boxes
|
|
136
|
-
// within them
|
|
137
|
-
i = 0;
|
|
138
|
-
boxes.some(function (box) {
|
|
139
|
-
var posInCompositeBox = 0;
|
|
140
|
-
if (box.targets.some(function () {
|
|
141
|
-
origBoxes[i].pos = box.pos + posInCompositeBox;
|
|
142
|
-
// If the distance between the position and the target exceeds
|
|
143
|
-
// maxDistance, abort the loop and decrease the length in increments
|
|
144
|
-
// of 10% to recursively reduce the number of visible boxes by
|
|
145
|
-
// rank. Once all boxes are within the maxDistance, we're good.
|
|
146
|
-
if (typeof maxDistance !== 'undefined' &&
|
|
147
|
-
Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {
|
|
148
|
-
// Reset the positions that are already set
|
|
149
|
-
origBoxes.slice(0, i + 1).forEach(function (box) {
|
|
150
|
-
delete box.pos;
|
|
151
|
-
});
|
|
152
|
-
// Try with a smaller length
|
|
153
|
-
origBoxes.reducedLen =
|
|
154
|
-
(origBoxes.reducedLen || len) - (len * 0.1);
|
|
155
|
-
// Recurse
|
|
156
|
-
if (origBoxes.reducedLen > len * 0.1) {
|
|
157
|
-
H.distribute(origBoxes, len, maxDistance);
|
|
158
|
-
}
|
|
159
|
-
// Exceeded maxDistance => abort
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
posInCompositeBox += origBoxes[i].size;
|
|
163
|
-
i++;
|
|
164
|
-
})) {
|
|
165
|
-
// Exceeded maxDistance => abort
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
// Add the rest (hidden) boxes and sort by target
|
|
170
|
-
stableSort(origBoxes, sortByTarget);
|
|
171
|
-
};
|
|
172
|
-
/**
|
|
173
|
-
* Draw the data labels
|
|
174
|
-
*
|
|
175
|
-
* @private
|
|
176
|
-
* @function Highcharts.Series#drawDataLabels
|
|
177
|
-
* @return {void}
|
|
178
|
-
* @fires Highcharts.Series#event:afterDrawDataLabels
|
|
179
|
-
*/
|
|
180
|
-
Series.prototype.drawDataLabels = function () {
|
|
181
|
-
var series = this, chart = series.chart, seriesOptions = series.options, seriesDlOptions = seriesOptions.dataLabels, points = series.points, pointOptions, hasRendered = series.hasRendered || 0, dataLabelsGroup, dataLabelAnim = seriesDlOptions.animation, animationConfig = seriesDlOptions.defer ?
|
|
182
|
-
getDeferredAnimation(chart, dataLabelAnim, series) :
|
|
183
|
-
{ defer: 0, duration: 0 }, renderer = chart.renderer;
|
|
184
|
-
/**
|
|
185
|
-
* Handle the dataLabels.filter option.
|
|
186
|
-
* @private
|
|
187
|
-
*/
|
|
188
|
-
function applyFilter(point, options) {
|
|
189
|
-
var filter = options.filter, op, prop, val;
|
|
190
|
-
if (filter) {
|
|
191
|
-
op = filter.operator;
|
|
192
|
-
prop = point[filter.property];
|
|
193
|
-
val = filter.value;
|
|
194
|
-
if ((op === '>' && prop > val) ||
|
|
195
|
-
(op === '<' && prop < val) ||
|
|
196
|
-
(op === '>=' && prop >= val) ||
|
|
197
|
-
(op === '<=' && prop <= val) ||
|
|
198
|
-
(op === '==' && prop == val) || // eslint-disable-line eqeqeq
|
|
199
|
-
(op === '===' && prop === val)) {
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Merge two objects that can be arrays. If one of them is an array, the
|
|
208
|
-
* other is merged into each element. If both are arrays, each element is
|
|
209
|
-
* merged by index. If neither are arrays, we use normal merge.
|
|
210
|
-
* @private
|
|
211
|
-
*/
|
|
212
|
-
function mergeArrays(one, two) {
|
|
213
|
-
var res = [], i;
|
|
214
|
-
if (isArray(one) && !isArray(two)) {
|
|
215
|
-
res = one.map(function (el) {
|
|
216
|
-
return merge(el, two);
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
else if (isArray(two) && !isArray(one)) {
|
|
220
|
-
res = two.map(function (el) {
|
|
221
|
-
return merge(one, el);
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else if (!isArray(one) && !isArray(two)) {
|
|
225
|
-
res = merge(one, two);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
i = Math.max(one.length, two.length);
|
|
229
|
-
while (i--) {
|
|
230
|
-
res[i] = merge(one[i], two[i]);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return res;
|
|
234
|
-
}
|
|
235
|
-
// Merge in plotOptions.dataLabels for series
|
|
236
|
-
seriesDlOptions = mergeArrays(mergeArrays(chart.options.plotOptions &&
|
|
237
|
-
chart.options.plotOptions.series &&
|
|
238
|
-
chart.options.plotOptions.series.dataLabels, chart.options.plotOptions &&
|
|
239
|
-
chart.options.plotOptions[series.type] &&
|
|
240
|
-
chart.options.plotOptions[series.type].dataLabels), seriesDlOptions);
|
|
241
|
-
fireEvent(this, 'drawDataLabels');
|
|
242
|
-
if (isArray(seriesDlOptions) ||
|
|
243
|
-
seriesDlOptions.enabled ||
|
|
244
|
-
series._hasPointLabels) {
|
|
245
|
-
// Create a separate group for the data labels to avoid rotation
|
|
246
|
-
dataLabelsGroup = series.plotGroup('dataLabelsGroup', 'data-labels', !hasRendered ? 'hidden' : 'inherit', // #5133, #10220
|
|
247
|
-
seriesDlOptions.zIndex || 6);
|
|
248
|
-
dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300
|
|
249
|
-
if (!hasRendered) {
|
|
250
|
-
var group = series.dataLabelsGroup;
|
|
251
|
-
if (group) {
|
|
252
|
-
if (series.visible) { // #2597, #3023, #3024
|
|
253
|
-
dataLabelsGroup.show(true);
|
|
254
|
-
}
|
|
255
|
-
group[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, animationConfig);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Make the labels for each point
|
|
259
|
-
points.forEach(function (point) {
|
|
260
|
-
// Merge in series options for the point.
|
|
261
|
-
// @note dataLabelAttribs (like pointAttribs) would eradicate
|
|
262
|
-
// the need for dlOptions, and simplify the section below.
|
|
263
|
-
pointOptions = splat(mergeArrays(seriesDlOptions, point.dlOptions || // dlOptions is used in treemaps
|
|
264
|
-
(point.options && point.options.dataLabels)));
|
|
265
|
-
// Handle each individual data label for this point
|
|
266
|
-
pointOptions.forEach(function (labelOptions, i) {
|
|
267
|
-
// Options for one datalabel
|
|
268
|
-
var labelEnabled = (labelOptions.enabled &&
|
|
269
|
-
// #2282, #4641, #7112, #10049
|
|
270
|
-
(!point.isNull || point.dataLabelOnNull) &&
|
|
271
|
-
applyFilter(point, labelOptions)), labelConfig, formatString, labelText, style, rotation, attr, dataLabel = point.dataLabels ? point.dataLabels[i] :
|
|
272
|
-
point.dataLabel, connector = point.connectors ? point.connectors[i] :
|
|
273
|
-
point.connector, labelDistance = pick(labelOptions.distance, point.labelDistance), isNew = !dataLabel;
|
|
274
|
-
if (labelEnabled) {
|
|
275
|
-
// Create individual options structure that can be extended
|
|
276
|
-
// without affecting others
|
|
277
|
-
labelConfig = point.getLabelConfig();
|
|
278
|
-
formatString = pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);
|
|
279
|
-
labelText = defined(formatString) ?
|
|
280
|
-
format(formatString, labelConfig, chart) :
|
|
281
|
-
(labelOptions[point.formatPrefix + 'Formatter'] ||
|
|
282
|
-
labelOptions.formatter).call(labelConfig, labelOptions);
|
|
283
|
-
style = labelOptions.style;
|
|
284
|
-
rotation = labelOptions.rotation;
|
|
285
|
-
if (!chart.styledMode) {
|
|
286
|
-
// Determine the color
|
|
287
|
-
style.color = pick(labelOptions.color, style.color, series.color, palette.neutralColor100);
|
|
288
|
-
// Get automated contrast color
|
|
289
|
-
if (style.color === 'contrast') {
|
|
290
|
-
point.contrastColor = renderer.getContrast((point.color || series.color));
|
|
291
|
-
style.color = (!defined(labelDistance) &&
|
|
292
|
-
labelOptions.inside) ||
|
|
293
|
-
labelDistance < 0 ||
|
|
294
|
-
!!seriesOptions.stacking ?
|
|
295
|
-
point.contrastColor :
|
|
296
|
-
palette.neutralColor100;
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
delete point.contrastColor;
|
|
300
|
-
}
|
|
301
|
-
if (seriesOptions.cursor) {
|
|
302
|
-
style.cursor = seriesOptions.cursor;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
attr = {
|
|
306
|
-
r: labelOptions.borderRadius || 0,
|
|
307
|
-
rotation: rotation,
|
|
308
|
-
padding: labelOptions.padding,
|
|
309
|
-
zIndex: 1
|
|
310
|
-
};
|
|
311
|
-
if (!chart.styledMode) {
|
|
312
|
-
attr.fill = labelOptions.backgroundColor;
|
|
313
|
-
attr.stroke = labelOptions.borderColor;
|
|
314
|
-
attr['stroke-width'] = labelOptions.borderWidth;
|
|
315
|
-
}
|
|
316
|
-
// Remove unused attributes (#947)
|
|
317
|
-
objectEach(attr, function (val, name) {
|
|
318
|
-
if (typeof val === 'undefined') {
|
|
319
|
-
delete attr[name];
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
// If the point is outside the plot area, destroy it. #678, #820
|
|
324
|
-
if (dataLabel && (!labelEnabled || !defined(labelText))) {
|
|
325
|
-
point.dataLabel =
|
|
326
|
-
point.dataLabel && point.dataLabel.destroy();
|
|
327
|
-
if (point.dataLabels) {
|
|
328
|
-
// Remove point.dataLabels if this was the last one
|
|
329
|
-
if (point.dataLabels.length === 1) {
|
|
330
|
-
delete point.dataLabels;
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
delete point.dataLabels[i];
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (!i) {
|
|
337
|
-
delete point.dataLabel;
|
|
338
|
-
}
|
|
339
|
-
if (connector) {
|
|
340
|
-
point.connector = point.connector.destroy();
|
|
341
|
-
if (point.connectors) {
|
|
342
|
-
// Remove point.connectors if this was the last one
|
|
343
|
-
if (point.connectors.length === 1) {
|
|
344
|
-
delete point.connectors;
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
delete point.connectors[i];
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// Individual labels are disabled if the are explicitly disabled
|
|
352
|
-
// in the point options, or if they fall outside the plot area.
|
|
353
|
-
}
|
|
354
|
-
else if (labelEnabled && defined(labelText)) {
|
|
355
|
-
if (!dataLabel) {
|
|
356
|
-
// Create new label element
|
|
357
|
-
point.dataLabels = point.dataLabels || [];
|
|
358
|
-
dataLabel = point.dataLabels[i] = rotation ?
|
|
359
|
-
// Labels don't rotate, use text element
|
|
360
|
-
renderer.text(labelText, 0, -9999, labelOptions.useHTML)
|
|
361
|
-
.addClass('highcharts-data-label') :
|
|
362
|
-
// We can use label
|
|
363
|
-
renderer.label(labelText, 0, -9999, labelOptions.shape, null, null, labelOptions.useHTML, null, 'data-label');
|
|
364
|
-
// Store for backwards compatibility
|
|
365
|
-
if (!i) {
|
|
366
|
-
point.dataLabel = dataLabel;
|
|
367
|
-
}
|
|
368
|
-
dataLabel.addClass(' highcharts-data-label-color-' + point.colorIndex +
|
|
369
|
-
' ' + (labelOptions.className || '') +
|
|
370
|
-
( // #3398
|
|
371
|
-
labelOptions.useHTML ?
|
|
372
|
-
' highcharts-tracker' :
|
|
373
|
-
''));
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
// Use old element and just update text
|
|
377
|
-
attr.text = labelText;
|
|
378
|
-
}
|
|
379
|
-
// Store data label options for later access
|
|
380
|
-
dataLabel.options = labelOptions;
|
|
381
|
-
dataLabel.attr(attr);
|
|
382
|
-
if (!chart.styledMode) {
|
|
383
|
-
// Styles must be applied before add in order to read
|
|
384
|
-
// text bounding box
|
|
385
|
-
dataLabel.css(style).shadow(labelOptions.shadow);
|
|
386
|
-
}
|
|
387
|
-
if (!dataLabel.added) {
|
|
388
|
-
dataLabel.add(dataLabelsGroup);
|
|
389
|
-
}
|
|
390
|
-
if (labelOptions.textPath && !labelOptions.useHTML) {
|
|
391
|
-
dataLabel.setTextPath((point.getDataLabelPath &&
|
|
392
|
-
point.getDataLabelPath(dataLabel)) || point.graphic, labelOptions.textPath);
|
|
393
|
-
if (point.dataLabelPath &&
|
|
394
|
-
!labelOptions.textPath.enabled) {
|
|
395
|
-
// clean the DOM
|
|
396
|
-
point.dataLabelPath = point.dataLabelPath.destroy();
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
// Now the data label is created and placed at 0,0, so we
|
|
400
|
-
// need to align it
|
|
401
|
-
series.alignDataLabel(point, dataLabel, labelOptions, null, isNew);
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
fireEvent(this, 'afterDrawDataLabels');
|
|
407
|
-
};
|
|
408
|
-
/**
|
|
409
|
-
* Align each individual data label.
|
|
410
|
-
*
|
|
411
|
-
* @private
|
|
412
|
-
* @function Highcharts.Series#alignDataLabel
|
|
413
|
-
* @param {Highcharts.Point} point
|
|
414
|
-
* @param {Highcharts.SVGElement} dataLabel
|
|
415
|
-
* @param {Highcharts.DataLabelsOptions} options
|
|
416
|
-
* @param {Highcharts.BBoxObject} alignTo
|
|
417
|
-
* @param {boolean} [isNew]
|
|
418
|
-
* @return {void}
|
|
419
|
-
*/
|
|
420
|
-
Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
|
|
421
|
-
var series = this, chart = this.chart, inverted = this.isCartesian && chart.inverted, enabledDataSorting = this.enabledDataSorting, plotX = pick(point.dlBox && point.dlBox.centerX, point.plotX, -9999), plotY = pick(point.plotY, -9999), bBox = dataLabel.getBBox(), baseline, rotation = options.rotation, normRotation, negRotation, align = options.align, rotCorr, // rotation correction
|
|
422
|
-
isInsidePlot = chart.isInsidePlot(plotX, Math.round(plotY), {
|
|
423
|
-
inverted: inverted,
|
|
424
|
-
paneCoordinates: true,
|
|
425
|
-
series: series
|
|
426
|
-
}),
|
|
427
|
-
// Math.round for rounding errors (#2683), alignTo to allow column
|
|
428
|
-
// labels (#2700)
|
|
429
|
-
alignAttr, // the final position;
|
|
430
|
-
justify = pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify', visible = this.visible &&
|
|
431
|
-
point.visible !== false &&
|
|
432
|
-
(point.series.forceDL ||
|
|
433
|
-
(enabledDataSorting && !justify) ||
|
|
434
|
-
isInsidePlot ||
|
|
435
|
-
(
|
|
436
|
-
// If the data label is inside the align box, it is enough
|
|
437
|
-
// that parts of the align box is inside the plot area
|
|
438
|
-
// (#12370). When stacking, it is always inside regardless
|
|
439
|
-
// of the option (#15148).
|
|
440
|
-
pick(options.inside, !!this.options.stacking) &&
|
|
441
|
-
alignTo &&
|
|
442
|
-
chart.isInsidePlot(plotX, inverted ?
|
|
443
|
-
alignTo.x + 1 :
|
|
444
|
-
alignTo.y + alignTo.height - 1, {
|
|
445
|
-
inverted: inverted,
|
|
446
|
-
paneCoordinates: true,
|
|
447
|
-
series: series
|
|
448
|
-
}))), setStartPos = function (alignOptions) {
|
|
449
|
-
if (enabledDataSorting && series.xAxis && !justify) {
|
|
450
|
-
series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);
|
|
451
|
-
}
|
|
452
|
-
};
|
|
453
|
-
if (visible) {
|
|
454
|
-
baseline = chart.renderer.fontMetrics(chart.styledMode ? void 0 : options.style.fontSize, dataLabel).b;
|
|
455
|
-
// The alignment box is a singular point
|
|
456
|
-
alignTo = extend({
|
|
457
|
-
x: inverted ? this.yAxis.len - plotY : plotX,
|
|
458
|
-
y: Math.round(inverted ? this.xAxis.len - plotX : plotY),
|
|
459
|
-
width: 0,
|
|
460
|
-
height: 0
|
|
461
|
-
}, alignTo);
|
|
462
|
-
// Add the text size for alignment calculation
|
|
463
|
-
extend(options, {
|
|
464
|
-
width: bBox.width,
|
|
465
|
-
height: bBox.height
|
|
466
|
-
});
|
|
467
|
-
// Allow a hook for changing alignment in the last moment, then do the
|
|
468
|
-
// alignment
|
|
469
|
-
if (rotation) {
|
|
470
|
-
justify = false; // Not supported for rotated text
|
|
471
|
-
rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723
|
|
472
|
-
alignAttr = {
|
|
473
|
-
x: (alignTo.x +
|
|
474
|
-
(options.x || 0) +
|
|
475
|
-
alignTo.width / 2 +
|
|
476
|
-
rotCorr.x),
|
|
477
|
-
y: (alignTo.y +
|
|
478
|
-
(options.y || 0) +
|
|
479
|
-
{ top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] *
|
|
480
|
-
alignTo.height)
|
|
481
|
-
};
|
|
482
|
-
setStartPos(alignAttr); // data sorting
|
|
483
|
-
dataLabel[isNew ? 'attr' : 'animate'](alignAttr)
|
|
484
|
-
.attr({
|
|
485
|
-
align: align
|
|
486
|
-
});
|
|
487
|
-
// Compensate for the rotated label sticking out on the sides
|
|
488
|
-
normRotation = (rotation + 720) % 360;
|
|
489
|
-
negRotation = normRotation > 180 && normRotation < 360;
|
|
490
|
-
if (align === 'left') {
|
|
491
|
-
alignAttr.y -= negRotation ? bBox.height : 0;
|
|
492
|
-
}
|
|
493
|
-
else if (align === 'center') {
|
|
494
|
-
alignAttr.x -= bBox.width / 2;
|
|
495
|
-
alignAttr.y -= bBox.height / 2;
|
|
496
|
-
}
|
|
497
|
-
else if (align === 'right') {
|
|
498
|
-
alignAttr.x -= bBox.width;
|
|
499
|
-
alignAttr.y -= negRotation ? 0 : bBox.height;
|
|
500
|
-
}
|
|
501
|
-
dataLabel.placed = true;
|
|
502
|
-
dataLabel.alignAttr = alignAttr;
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
setStartPos(alignTo); // data sorting
|
|
506
|
-
dataLabel.align(options, void 0, alignTo);
|
|
507
|
-
alignAttr = dataLabel.alignAttr;
|
|
508
|
-
}
|
|
509
|
-
// Handle justify or crop
|
|
510
|
-
if (justify && alignTo.height >= 0) { // #8830
|
|
511
|
-
this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
|
|
512
|
-
// Now check that the data label is within the plot area
|
|
513
|
-
}
|
|
514
|
-
else if (pick(options.crop, true)) {
|
|
515
|
-
visible =
|
|
516
|
-
chart.isInsidePlot(alignAttr.x, alignAttr.y, {
|
|
517
|
-
paneCoordinates: true,
|
|
518
|
-
series: series
|
|
519
|
-
}) &&
|
|
520
|
-
chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height, {
|
|
521
|
-
paneCoordinates: true,
|
|
522
|
-
series: series
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
// When we're using a shape, make it possible with a connector or an
|
|
526
|
-
// arrow pointing to thie point
|
|
527
|
-
if (options.shape && !rotation) {
|
|
528
|
-
dataLabel[isNew ? 'attr' : 'animate']({
|
|
529
|
-
anchorX: inverted ?
|
|
530
|
-
chart.plotWidth - point.plotY :
|
|
531
|
-
point.plotX,
|
|
532
|
-
anchorY: inverted ?
|
|
533
|
-
chart.plotHeight - point.plotX :
|
|
534
|
-
point.plotY
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
// To use alignAttr property in hideOverlappingLabels
|
|
539
|
-
if (isNew && enabledDataSorting) {
|
|
540
|
-
dataLabel.placed = false;
|
|
541
|
-
}
|
|
542
|
-
// Show or hide based on the final aligned position
|
|
543
|
-
if (!visible && (!enabledDataSorting || justify)) {
|
|
544
|
-
dataLabel.hide(true);
|
|
545
|
-
dataLabel.placed = false; // don't animate back in
|
|
546
|
-
}
|
|
547
|
-
};
|
|
548
|
-
/**
|
|
549
|
-
* Set starting position for data label sorting animation.
|
|
550
|
-
*
|
|
551
|
-
* @private
|
|
552
|
-
* @function Highcharts.Series#setDataLabelStartPos
|
|
553
|
-
* @param {Highcharts.SVGElement} dataLabel
|
|
554
|
-
* @param {Highcharts.ColumnPoint} point
|
|
555
|
-
* @param {boolean | undefined} [isNew]
|
|
556
|
-
* @param {boolean} [isInside]
|
|
557
|
-
* @param {Highcharts.AlignObject} [alignOptions]
|
|
558
|
-
*
|
|
559
|
-
* @return {void}
|
|
560
|
-
*/
|
|
561
|
-
Series.prototype.setDataLabelStartPos = function (point, dataLabel, isNew, isInside, alignOptions) {
|
|
562
|
-
var chart = this.chart, inverted = chart.inverted, xAxis = this.xAxis, reversed = xAxis.reversed, labelCenter = inverted ? dataLabel.height / 2 : dataLabel.width / 2, pointWidth = point.pointWidth, halfWidth = pointWidth ? pointWidth / 2 : 0, startXPos, startYPos;
|
|
563
|
-
startXPos = inverted ?
|
|
564
|
-
alignOptions.x :
|
|
565
|
-
(reversed ?
|
|
566
|
-
-labelCenter - halfWidth :
|
|
567
|
-
xAxis.width - labelCenter + halfWidth);
|
|
568
|
-
startYPos = inverted ?
|
|
569
|
-
(reversed ?
|
|
570
|
-
this.yAxis.height - labelCenter + halfWidth :
|
|
571
|
-
-labelCenter - halfWidth) : alignOptions.y;
|
|
572
|
-
dataLabel.startXPos = startXPos;
|
|
573
|
-
dataLabel.startYPos = startYPos;
|
|
574
|
-
// We need to handle visibility in case of sorting point outside plot area
|
|
575
|
-
if (!isInside) {
|
|
576
|
-
dataLabel
|
|
577
|
-
.attr({ opacity: 1 })
|
|
578
|
-
.animate({ opacity: 0 }, void 0, dataLabel.hide);
|
|
579
|
-
}
|
|
580
|
-
else if (dataLabel.visibility === 'hidden') {
|
|
581
|
-
dataLabel.show();
|
|
582
|
-
dataLabel
|
|
583
|
-
.attr({ opacity: 0 })
|
|
584
|
-
.animate({ opacity: 1 });
|
|
585
|
-
}
|
|
586
|
-
// Save start position on first render, but do not change position
|
|
587
|
-
if (!chart.hasRendered) {
|
|
588
|
-
return;
|
|
589
|
-
}
|
|
590
|
-
// Set start position
|
|
591
|
-
if (isNew) {
|
|
592
|
-
dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });
|
|
593
|
-
}
|
|
594
|
-
dataLabel.placed = true;
|
|
595
|
-
};
|
|
596
|
-
/**
|
|
597
|
-
* If data labels fall partly outside the plot area, align them back in, in a
|
|
598
|
-
* way that doesn't hide the point.
|
|
599
|
-
*
|
|
600
|
-
* @private
|
|
601
|
-
* @function Highcharts.Series#justifyDataLabel
|
|
602
|
-
* @param {Highcharts.SVGElement} dataLabel
|
|
603
|
-
* @param {Highcharts.DataLabelsOptions} options
|
|
604
|
-
* @param {Highcharts.SVGAttributes} alignAttr
|
|
605
|
-
* @param {Highcharts.BBoxObject} bBox
|
|
606
|
-
* @param {Highcharts.BBoxObject} [alignTo]
|
|
607
|
-
* @param {boolean} [isNew]
|
|
608
|
-
* @return {boolean|undefined}
|
|
609
|
-
*/
|
|
610
|
-
Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
|
|
611
|
-
var chart = this.chart, align = options.align, verticalAlign = options.verticalAlign, off, justified, padding = dataLabel.box ? 0 : (dataLabel.padding || 0);
|
|
612
|
-
var _a = options.x, x = _a === void 0 ? 0 : _a, _b = options.y, y = _b === void 0 ? 0 : _b;
|
|
613
|
-
// Off left
|
|
614
|
-
off = (alignAttr.x || 0) + padding;
|
|
615
|
-
if (off < 0) {
|
|
616
|
-
if (align === 'right' && x >= 0) {
|
|
617
|
-
options.align = 'left';
|
|
618
|
-
options.inside = true;
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
x -= off;
|
|
622
|
-
}
|
|
623
|
-
justified = true;
|
|
624
|
-
}
|
|
625
|
-
// Off right
|
|
626
|
-
off = (alignAttr.x || 0) + bBox.width - padding;
|
|
627
|
-
if (off > chart.plotWidth) {
|
|
628
|
-
if (align === 'left' && x <= 0) {
|
|
629
|
-
options.align = 'right';
|
|
630
|
-
options.inside = true;
|
|
631
|
-
}
|
|
632
|
-
else {
|
|
633
|
-
x += chart.plotWidth - off;
|
|
634
|
-
}
|
|
635
|
-
justified = true;
|
|
636
|
-
}
|
|
637
|
-
// Off top
|
|
638
|
-
off = alignAttr.y + padding;
|
|
639
|
-
if (off < 0) {
|
|
640
|
-
if (verticalAlign === 'bottom' && y >= 0) {
|
|
641
|
-
options.verticalAlign = 'top';
|
|
642
|
-
options.inside = true;
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
y -= off;
|
|
646
|
-
}
|
|
647
|
-
justified = true;
|
|
648
|
-
}
|
|
649
|
-
// Off bottom
|
|
650
|
-
off = (alignAttr.y || 0) + bBox.height - padding;
|
|
651
|
-
if (off > chart.plotHeight) {
|
|
652
|
-
if (verticalAlign === 'top' && y <= 0) {
|
|
653
|
-
options.verticalAlign = 'bottom';
|
|
654
|
-
options.inside = true;
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
y += chart.plotHeight - off;
|
|
658
|
-
}
|
|
659
|
-
justified = true;
|
|
660
|
-
}
|
|
661
|
-
if (justified) {
|
|
662
|
-
options.x = x;
|
|
663
|
-
options.y = y;
|
|
664
|
-
dataLabel.placed = !isNew;
|
|
665
|
-
dataLabel.align(options, void 0, alignTo);
|
|
666
|
-
}
|
|
667
|
-
return justified;
|
|
668
|
-
};
|
|
669
|
-
if (seriesTypes.pie) {
|
|
670
|
-
seriesTypes.pie.prototype.dataLabelPositioners = {
|
|
671
|
-
// Based on the value computed in Highcharts' distribute algorithm.
|
|
672
|
-
radialDistributionY: function (point) {
|
|
673
|
-
return point.top + point.distributeBox.pos;
|
|
674
|
-
},
|
|
675
|
-
// get the x - use the natural x position for labels near the
|
|
676
|
-
// top and bottom, to prevent the top and botton slice
|
|
677
|
-
// connectors from touching each other on either side
|
|
678
|
-
// Based on the value computed in Highcharts' distribute algorithm.
|
|
679
|
-
radialDistributionX: function (series, point, y, naturalY) {
|
|
680
|
-
return series.getX(y < point.top + 2 || y > point.bottom - 2 ?
|
|
681
|
-
naturalY :
|
|
682
|
-
y, point.half, point);
|
|
683
|
-
},
|
|
684
|
-
// dataLabels.distance determines the x position of the label
|
|
685
|
-
justify: function (point, radius, seriesCenter) {
|
|
686
|
-
return seriesCenter[0] + (point.half ? -1 : 1) *
|
|
687
|
-
(radius + point.labelDistance);
|
|
688
|
-
},
|
|
689
|
-
// Left edges of the left-half labels touch the left edge of the plot
|
|
690
|
-
// area. Right edges of the right-half labels touch the right edge of
|
|
691
|
-
// the plot area.
|
|
692
|
-
alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {
|
|
693
|
-
var dataLabelWidth = dataLabel.getBBox().width;
|
|
694
|
-
return half ? dataLabelWidth + plotLeft :
|
|
695
|
-
plotWidth - dataLabelWidth - plotLeft;
|
|
696
|
-
},
|
|
697
|
-
// Connectors of each side end in the same x position. Labels are
|
|
698
|
-
// aligned to them. Left edge of the widest left-half label touches the
|
|
699
|
-
// left edge of the plot area. Right edge of the widest right-half label
|
|
700
|
-
// touches the right edge of the plot area.
|
|
701
|
-
alignToConnectors: function (points, half, plotWidth, plotLeft) {
|
|
702
|
-
var maxDataLabelWidth = 0, dataLabelWidth;
|
|
703
|
-
// find widest data label
|
|
704
|
-
points.forEach(function (point) {
|
|
705
|
-
dataLabelWidth = point.dataLabel.getBBox().width;
|
|
706
|
-
if (dataLabelWidth > maxDataLabelWidth) {
|
|
707
|
-
maxDataLabelWidth = dataLabelWidth;
|
|
708
|
-
}
|
|
709
|
-
});
|
|
710
|
-
return half ? maxDataLabelWidth + plotLeft :
|
|
711
|
-
plotWidth - maxDataLabelWidth - plotLeft;
|
|
712
|
-
}
|
|
713
|
-
};
|
|
714
|
-
/**
|
|
715
|
-
* Override the base drawDataLabels method by pie specific functionality
|
|
716
|
-
*
|
|
717
|
-
* @private
|
|
718
|
-
* @function Highcharts.seriesTypes.pie#drawDataLabels
|
|
719
|
-
* @return {void}
|
|
720
|
-
*/
|
|
721
|
-
seriesTypes.pie.prototype.drawDataLabels = function () {
|
|
722
|
-
var series = this, data = series.data, point, chart = series.chart, options = series.options.dataLabels || {}, connectorPadding = options.connectorPadding, connectorWidth, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotLeft = chart.plotLeft, maxWidth = Math.round(chart.chartWidth / 3), connector, seriesCenter = series.center, radius = seriesCenter[2] / 2, centerY = seriesCenter[1], dataLabel, dataLabelWidth,
|
|
723
|
-
// labelPos,
|
|
724
|
-
labelPosition, labelHeight,
|
|
725
|
-
// divide the points into right and left halves for anti collision
|
|
726
|
-
halves = [
|
|
727
|
-
[],
|
|
728
|
-
[] // left
|
|
729
|
-
], x, y, visibility, j, overflow = [0, 0, 0, 0], // top, right, bottom, left
|
|
730
|
-
dataLabelPositioners = series.dataLabelPositioners, pointDataLabelsOptions;
|
|
731
|
-
// get out if not enabled
|
|
732
|
-
if (!series.visible ||
|
|
733
|
-
(!options.enabled &&
|
|
734
|
-
!series._hasPointLabels)) {
|
|
735
|
-
return;
|
|
736
|
-
}
|
|
737
|
-
// Reset all labels that have been shortened
|
|
738
|
-
data.forEach(function (point) {
|
|
739
|
-
if (point.dataLabel && point.visible && point.dataLabel.shortened) {
|
|
740
|
-
point.dataLabel
|
|
741
|
-
.attr({
|
|
742
|
-
width: 'auto'
|
|
743
|
-
}).css({
|
|
744
|
-
width: 'auto',
|
|
745
|
-
textOverflow: 'clip'
|
|
746
|
-
});
|
|
747
|
-
point.dataLabel.shortened = false;
|
|
748
|
-
}
|
|
749
|
-
});
|
|
750
|
-
// run parent method
|
|
751
|
-
Series.prototype.drawDataLabels.apply(series);
|
|
752
|
-
data.forEach(function (point) {
|
|
753
|
-
if (point.dataLabel) {
|
|
754
|
-
if (point.visible) { // #407, #2510
|
|
755
|
-
// Arrange points for detection collision
|
|
756
|
-
halves[point.half].push(point);
|
|
757
|
-
// Reset positions (#4905)
|
|
758
|
-
point.dataLabel._pos = null;
|
|
759
|
-
// Avoid long labels squeezing the pie size too far down
|
|
760
|
-
if (!defined(options.style.width) &&
|
|
761
|
-
!defined(point.options.dataLabels &&
|
|
762
|
-
point.options.dataLabels.style &&
|
|
763
|
-
point.options.dataLabels.style.width)) {
|
|
764
|
-
if (point.dataLabel.getBBox().width > maxWidth) {
|
|
765
|
-
point.dataLabel.css({
|
|
766
|
-
// Use a fraction of the maxWidth to avoid
|
|
767
|
-
// wrapping close to the end of the string.
|
|
768
|
-
width: Math.round(maxWidth * 0.7) + 'px'
|
|
769
|
-
});
|
|
770
|
-
point.dataLabel.shortened = true;
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
else {
|
|
775
|
-
point.dataLabel = point.dataLabel.destroy();
|
|
776
|
-
// Workaround to make pies destroy multiple datalabels
|
|
777
|
-
// correctly. This logic needs rewriting to support multiple
|
|
778
|
-
// datalabels fully.
|
|
779
|
-
if (point.dataLabels && point.dataLabels.length === 1) {
|
|
780
|
-
delete point.dataLabels;
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
});
|
|
785
|
-
/* Loop over the points in each half, starting from the top and bottom
|
|
786
|
-
* of the pie to detect overlapping labels.
|
|
787
|
-
*/
|
|
788
|
-
halves.forEach(function (points, i) {
|
|
789
|
-
var top, bottom, length = points.length, positions = [], naturalY, sideOverflow, size, distributionLength;
|
|
790
|
-
if (!length) {
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
// Sort by angle
|
|
794
|
-
series.sortByAngle(points, i - 0.5);
|
|
795
|
-
// Only do anti-collision when we have dataLabels outside the pie
|
|
796
|
-
// and have connectors. (#856)
|
|
797
|
-
if (series.maxLabelDistance > 0) {
|
|
798
|
-
top = Math.max(0, centerY - radius - series.maxLabelDistance);
|
|
799
|
-
bottom = Math.min(centerY + radius + series.maxLabelDistance, chart.plotHeight);
|
|
800
|
-
points.forEach(function (point) {
|
|
801
|
-
// check if specific points' label is outside the pie
|
|
802
|
-
if (point.labelDistance > 0 && point.dataLabel) {
|
|
803
|
-
// point.top depends on point.labelDistance value
|
|
804
|
-
// Used for calculation of y value in getX method
|
|
805
|
-
point.top = Math.max(0, centerY - radius - point.labelDistance);
|
|
806
|
-
point.bottom = Math.min(centerY + radius + point.labelDistance, chart.plotHeight);
|
|
807
|
-
size = point.dataLabel.getBBox().height || 21;
|
|
808
|
-
// point.positionsIndex is needed for getting index of
|
|
809
|
-
// parameter related to specific point inside positions
|
|
810
|
-
// array - not every point is in positions array.
|
|
811
|
-
point.distributeBox = {
|
|
812
|
-
target: point.labelPosition.natural.y -
|
|
813
|
-
point.top + size / 2,
|
|
814
|
-
size: size,
|
|
815
|
-
rank: point.y
|
|
816
|
-
};
|
|
817
|
-
positions.push(point.distributeBox);
|
|
818
|
-
}
|
|
819
|
-
});
|
|
820
|
-
distributionLength = bottom + size - top;
|
|
821
|
-
H.distribute(positions, distributionLength, distributionLength / 5);
|
|
822
|
-
}
|
|
823
|
-
// Now the used slots are sorted, fill them up sequentially
|
|
824
|
-
for (j = 0; j < length; j++) {
|
|
825
|
-
point = points[j];
|
|
826
|
-
// labelPos = point.labelPos;
|
|
827
|
-
labelPosition = point.labelPosition;
|
|
828
|
-
dataLabel = point.dataLabel;
|
|
829
|
-
visibility = point.visible === false ? 'hidden' : 'inherit';
|
|
830
|
-
naturalY = labelPosition.natural.y;
|
|
831
|
-
y = naturalY;
|
|
832
|
-
if (positions && defined(point.distributeBox)) {
|
|
833
|
-
if (typeof point.distributeBox.pos === 'undefined') {
|
|
834
|
-
visibility = 'hidden';
|
|
835
|
-
}
|
|
836
|
-
else {
|
|
837
|
-
labelHeight = point.distributeBox.size;
|
|
838
|
-
// Find label's y position
|
|
839
|
-
y = dataLabelPositioners
|
|
840
|
-
.radialDistributionY(point);
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
// It is needed to delete point.positionIndex for
|
|
844
|
-
// dynamically added points etc.
|
|
845
|
-
delete point.positionIndex; // @todo unused
|
|
846
|
-
// Find label's x position
|
|
847
|
-
// justify is undocumented in the API - preserve support for it
|
|
848
|
-
if (options.justify) {
|
|
849
|
-
x = dataLabelPositioners.justify(point, radius, seriesCenter);
|
|
850
|
-
}
|
|
851
|
-
else {
|
|
852
|
-
switch (options.alignTo) {
|
|
853
|
-
case 'connectors':
|
|
854
|
-
x = dataLabelPositioners.alignToConnectors(points, i, plotWidth, plotLeft);
|
|
855
|
-
break;
|
|
856
|
-
case 'plotEdges':
|
|
857
|
-
x = dataLabelPositioners.alignToPlotEdges(dataLabel, i, plotWidth, plotLeft);
|
|
858
|
-
break;
|
|
859
|
-
default:
|
|
860
|
-
x = dataLabelPositioners.radialDistributionX(series, point, y, naturalY);
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
// Record the placement and visibility
|
|
864
|
-
dataLabel._attr = {
|
|
865
|
-
visibility: visibility,
|
|
866
|
-
align: labelPosition.alignment
|
|
867
|
-
};
|
|
868
|
-
pointDataLabelsOptions = point.options.dataLabels || {};
|
|
869
|
-
dataLabel._pos = {
|
|
870
|
-
x: (x +
|
|
871
|
-
pick(pointDataLabelsOptions.x, options.x) + // (#12985)
|
|
872
|
-
({
|
|
873
|
-
left: connectorPadding,
|
|
874
|
-
right: -connectorPadding
|
|
875
|
-
}[labelPosition.alignment] || 0)),
|
|
876
|
-
// 10 is for the baseline (label vs text)
|
|
877
|
-
y: (y +
|
|
878
|
-
pick(pointDataLabelsOptions.y, options.y) - // (#12985)
|
|
879
|
-
10)
|
|
880
|
-
};
|
|
881
|
-
// labelPos.x = x;
|
|
882
|
-
// labelPos.y = y;
|
|
883
|
-
labelPosition.final.x = x;
|
|
884
|
-
labelPosition.final.y = y;
|
|
885
|
-
// Detect overflowing data labels
|
|
886
|
-
if (pick(options.crop, true)) {
|
|
887
|
-
dataLabelWidth = dataLabel.getBBox().width;
|
|
888
|
-
sideOverflow = null;
|
|
889
|
-
// Overflow left
|
|
890
|
-
if (x - dataLabelWidth < connectorPadding &&
|
|
891
|
-
i === 1 // left half
|
|
892
|
-
) {
|
|
893
|
-
sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);
|
|
894
|
-
overflow[3] = Math.max(sideOverflow, overflow[3]);
|
|
895
|
-
// Overflow right
|
|
896
|
-
}
|
|
897
|
-
else if (x + dataLabelWidth > plotWidth - connectorPadding &&
|
|
898
|
-
i === 0 // right half
|
|
899
|
-
) {
|
|
900
|
-
sideOverflow = Math.round(x + dataLabelWidth - plotWidth + connectorPadding);
|
|
901
|
-
overflow[1] = Math.max(sideOverflow, overflow[1]);
|
|
902
|
-
}
|
|
903
|
-
// Overflow top
|
|
904
|
-
if (y - labelHeight / 2 < 0) {
|
|
905
|
-
overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);
|
|
906
|
-
// Overflow left
|
|
907
|
-
}
|
|
908
|
-
else if (y + labelHeight / 2 > plotHeight) {
|
|
909
|
-
overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);
|
|
910
|
-
}
|
|
911
|
-
dataLabel.sideOverflow = sideOverflow;
|
|
912
|
-
}
|
|
913
|
-
} // for each point
|
|
914
|
-
}); // for each half
|
|
915
|
-
// Do not apply the final placement and draw the connectors until we
|
|
916
|
-
// have verified that labels are not spilling over.
|
|
917
|
-
if (arrayMax(overflow) === 0 ||
|
|
918
|
-
this.verifyDataLabelOverflow(overflow)) {
|
|
919
|
-
// Place the labels in the final position
|
|
920
|
-
this.placeDataLabels();
|
|
921
|
-
this.points.forEach(function (point) {
|
|
922
|
-
// #8864: every connector can have individual options
|
|
923
|
-
pointDataLabelsOptions =
|
|
924
|
-
merge(options, point.options.dataLabels);
|
|
925
|
-
connectorWidth =
|
|
926
|
-
pick(pointDataLabelsOptions.connectorWidth, 1);
|
|
927
|
-
// Draw the connector
|
|
928
|
-
if (connectorWidth) {
|
|
929
|
-
var isNew = void 0;
|
|
930
|
-
connector = point.connector;
|
|
931
|
-
dataLabel = point.dataLabel;
|
|
932
|
-
if (dataLabel &&
|
|
933
|
-
dataLabel._pos &&
|
|
934
|
-
point.visible &&
|
|
935
|
-
point.labelDistance > 0) {
|
|
936
|
-
visibility = dataLabel._attr.visibility;
|
|
937
|
-
isNew = !connector;
|
|
938
|
-
if (isNew) {
|
|
939
|
-
point.connector = connector = chart.renderer
|
|
940
|
-
.path()
|
|
941
|
-
.addClass('highcharts-data-label-connector ' +
|
|
942
|
-
' highcharts-color-' + point.colorIndex +
|
|
943
|
-
(point.className ?
|
|
944
|
-
' ' + point.className :
|
|
945
|
-
''))
|
|
946
|
-
.add(series.dataLabelsGroup);
|
|
947
|
-
if (!chart.styledMode) {
|
|
948
|
-
connector.attr({
|
|
949
|
-
'stroke-width': connectorWidth,
|
|
950
|
-
'stroke': (pointDataLabelsOptions.connectorColor ||
|
|
951
|
-
point.color ||
|
|
952
|
-
palette.neutralColor60)
|
|
953
|
-
});
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
connector[isNew ? 'attr' : 'animate']({
|
|
957
|
-
d: point.getConnectorPath()
|
|
958
|
-
});
|
|
959
|
-
connector.attr('visibility', visibility);
|
|
960
|
-
}
|
|
961
|
-
else if (connector) {
|
|
962
|
-
point.connector = connector.destroy();
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
});
|
|
966
|
-
}
|
|
967
|
-
};
|
|
968
|
-
/**
|
|
969
|
-
* Extendable method for getting the path of the connector between the data
|
|
970
|
-
* label and the pie slice.
|
|
971
|
-
*
|
|
972
|
-
* @private
|
|
973
|
-
* @function Highcharts.seriesTypes.pie#connectorPath
|
|
974
|
-
*
|
|
975
|
-
* @param {*} labelPos
|
|
976
|
-
*
|
|
977
|
-
* @return {Highcharts.SVGPathArray}
|
|
978
|
-
*/
|
|
979
|
-
// TODO: depracated - remove it
|
|
980
|
-
/*
|
|
981
|
-
seriesTypes.pie.prototype.connectorPath = function (labelPos) {
|
|
982
|
-
let x = labelPos.x,
|
|
983
|
-
y = labelPos.y;
|
|
984
|
-
return pick(this.options.dataLabels.softConnector, true) ? [
|
|
985
|
-
'M',
|
|
986
|
-
// end of the string at the label
|
|
987
|
-
x + (labelPos[6] === 'left' ? 5 : -5), y,
|
|
988
|
-
'C',
|
|
989
|
-
x, y, // first break, next to the label
|
|
990
|
-
2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
|
|
991
|
-
labelPos[2], labelPos[3], // second break
|
|
992
|
-
'L',
|
|
993
|
-
labelPos[4], labelPos[5] // base
|
|
994
|
-
] : [
|
|
995
|
-
'M',
|
|
996
|
-
// end of the string at the label
|
|
997
|
-
x + (labelPos[6] === 'left' ? 5 : -5), y,
|
|
998
|
-
'L',
|
|
999
|
-
labelPos[2], labelPos[3], // second break
|
|
1000
|
-
'L',
|
|
1001
|
-
labelPos[4], labelPos[5] // base
|
|
1002
|
-
];
|
|
1003
|
-
};
|
|
1004
|
-
*/
|
|
1005
|
-
/**
|
|
1006
|
-
* Perform the final placement of the data labels after we have verified
|
|
1007
|
-
* that they fall within the plot area.
|
|
1008
|
-
*
|
|
1009
|
-
* @private
|
|
1010
|
-
* @function Highcharts.seriesTypes.pie#placeDataLabels
|
|
1011
|
-
* @return {void}
|
|
1012
|
-
*/
|
|
1013
|
-
seriesTypes.pie.prototype.placeDataLabels = function () {
|
|
1014
|
-
this.points.forEach(function (point) {
|
|
1015
|
-
var dataLabel = point.dataLabel, _pos;
|
|
1016
|
-
if (dataLabel && point.visible) {
|
|
1017
|
-
_pos = dataLabel._pos;
|
|
1018
|
-
if (_pos) {
|
|
1019
|
-
// Shorten data labels with ellipsis if they still overflow
|
|
1020
|
-
// after the pie has reached minSize (#223).
|
|
1021
|
-
if (dataLabel.sideOverflow) {
|
|
1022
|
-
dataLabel._attr.width =
|
|
1023
|
-
Math.max(dataLabel.getBBox().width -
|
|
1024
|
-
dataLabel.sideOverflow, 0);
|
|
1025
|
-
dataLabel.css({
|
|
1026
|
-
width: dataLabel._attr.width + 'px',
|
|
1027
|
-
textOverflow: ((this.options.dataLabels.style || {})
|
|
1028
|
-
.textOverflow ||
|
|
1029
|
-
'ellipsis')
|
|
1030
|
-
});
|
|
1031
|
-
dataLabel.shortened = true;
|
|
1032
|
-
}
|
|
1033
|
-
dataLabel.attr(dataLabel._attr);
|
|
1034
|
-
dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
|
|
1035
|
-
dataLabel.moved = true;
|
|
1036
|
-
}
|
|
1037
|
-
else if (dataLabel) {
|
|
1038
|
-
dataLabel.attr({ y: -9999 });
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
// Clear for update
|
|
1042
|
-
delete point.distributeBox;
|
|
1043
|
-
}, this);
|
|
1044
|
-
};
|
|
1045
|
-
seriesTypes.pie.prototype.alignDataLabel = noop;
|
|
1046
|
-
/**
|
|
1047
|
-
* Verify whether the data labels are allowed to draw, or we should run more
|
|
1048
|
-
* translation and data label positioning to keep them inside the plot area.
|
|
1049
|
-
* Returns true when data labels are ready to draw.
|
|
1050
|
-
*
|
|
1051
|
-
* @private
|
|
1052
|
-
* @function Highcharts.seriesTypes.pie#verifyDataLabelOverflow
|
|
1053
|
-
* @param {Array<number>} overflow
|
|
1054
|
-
* @return {boolean}
|
|
1055
|
-
*/
|
|
1056
|
-
seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {
|
|
1057
|
-
var center = this.center, options = this.options, centerOption = options.center, minSize = options.minSize || 80, newSize = minSize,
|
|
1058
|
-
// If a size is set, return true and don't try to shrink the pie
|
|
1059
|
-
// to fit the labels.
|
|
1060
|
-
ret = options.size !== null;
|
|
1061
|
-
if (!ret) {
|
|
1062
|
-
// Handle horizontal size and center
|
|
1063
|
-
if (centerOption[0] !== null) { // Fixed center
|
|
1064
|
-
newSize = Math.max(center[2] -
|
|
1065
|
-
Math.max(overflow[1], overflow[3]), minSize);
|
|
1066
|
-
}
|
|
1067
|
-
else { // Auto center
|
|
1068
|
-
newSize = Math.max(
|
|
1069
|
-
// horizontal overflow
|
|
1070
|
-
center[2] - overflow[1] - overflow[3], minSize);
|
|
1071
|
-
// horizontal center
|
|
1072
|
-
center[0] += (overflow[3] - overflow[1]) / 2;
|
|
1073
|
-
}
|
|
1074
|
-
// Handle vertical size and center
|
|
1075
|
-
if (centerOption[1] !== null) { // Fixed center
|
|
1076
|
-
newSize = clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));
|
|
1077
|
-
}
|
|
1078
|
-
else { // Auto center
|
|
1079
|
-
newSize = clamp(newSize, minSize,
|
|
1080
|
-
// vertical overflow
|
|
1081
|
-
center[2] - overflow[0] - overflow[2]);
|
|
1082
|
-
// vertical center
|
|
1083
|
-
center[1] += (overflow[0] - overflow[2]) / 2;
|
|
1084
|
-
}
|
|
1085
|
-
// If the size must be decreased, we need to run translate and
|
|
1086
|
-
// drawDataLabels again
|
|
1087
|
-
if (newSize < center[2]) {
|
|
1088
|
-
center[2] = newSize;
|
|
1089
|
-
center[3] = Math.min(// #3632
|
|
1090
|
-
relativeLength(options.innerSize || 0, newSize), newSize);
|
|
1091
|
-
this.translate(center);
|
|
1092
|
-
if (this.drawDataLabels) {
|
|
1093
|
-
this.drawDataLabels();
|
|
1094
|
-
}
|
|
1095
|
-
// Else, return true to indicate that the pie and its labels is
|
|
1096
|
-
// within the plot area
|
|
1097
|
-
}
|
|
1098
|
-
else {
|
|
1099
|
-
ret = true;
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
return ret;
|
|
1103
|
-
};
|
|
1104
|
-
}
|
|
1105
|
-
if (seriesTypes.column) {
|
|
1106
|
-
/**
|
|
1107
|
-
* Override the basic data label alignment by adjusting for the position of
|
|
1108
|
-
* the column.
|
|
1109
|
-
*
|
|
1110
|
-
* @private
|
|
1111
|
-
* @function Highcharts.seriesTypes.column#alignDataLabel
|
|
1112
|
-
* @param {Highcharts.Point} point
|
|
1113
|
-
* @param {Highcharts.SVGElement} dataLabel
|
|
1114
|
-
* @param {Highcharts.DataLabelsOptions} options
|
|
1115
|
-
* @param {Highcharts.BBoxObject} alignTo
|
|
1116
|
-
* @param {boolean} [isNew]
|
|
1117
|
-
* @return {void}
|
|
1118
|
-
*/
|
|
1119
|
-
seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
|
|
1120
|
-
var inverted = this.chart.inverted, series = point.series,
|
|
1121
|
-
// data label box for alignment
|
|
1122
|
-
dlBox = point.dlBox || point.shapeArgs, below = pick(point.below, // range series
|
|
1123
|
-
point.plotY >
|
|
1124
|
-
pick(this.translatedThreshold, series.yAxis.len)),
|
|
1125
|
-
// draw it inside the box?
|
|
1126
|
-
inside = pick(options.inside, !!this.options.stacking), overshoot;
|
|
1127
|
-
// Align to the column itself, or the top of it
|
|
1128
|
-
if (dlBox) { // Area range uses this method but not alignTo
|
|
1129
|
-
alignTo = merge(dlBox);
|
|
1130
|
-
if (alignTo.y < 0) {
|
|
1131
|
-
alignTo.height += alignTo.y;
|
|
1132
|
-
alignTo.y = 0;
|
|
1133
|
-
}
|
|
1134
|
-
// If parts of the box overshoots outside the plot area, modify the
|
|
1135
|
-
// box to center the label inside
|
|
1136
|
-
overshoot = alignTo.y + alignTo.height - series.yAxis.len;
|
|
1137
|
-
if (overshoot > 0 && overshoot < alignTo.height) {
|
|
1138
|
-
alignTo.height -= overshoot;
|
|
1139
|
-
}
|
|
1140
|
-
if (inverted) {
|
|
1141
|
-
alignTo = {
|
|
1142
|
-
x: series.yAxis.len - alignTo.y - alignTo.height,
|
|
1143
|
-
y: series.xAxis.len - alignTo.x - alignTo.width,
|
|
1144
|
-
width: alignTo.height,
|
|
1145
|
-
height: alignTo.width
|
|
1146
|
-
};
|
|
1147
|
-
}
|
|
1148
|
-
// Compute the alignment box
|
|
1149
|
-
if (!inside) {
|
|
1150
|
-
if (inverted) {
|
|
1151
|
-
alignTo.x += below ? 0 : alignTo.width;
|
|
1152
|
-
alignTo.width = 0;
|
|
1153
|
-
}
|
|
1154
|
-
else {
|
|
1155
|
-
alignTo.y += below ? alignTo.height : 0;
|
|
1156
|
-
alignTo.height = 0;
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
// When alignment is undefined (typically columns and bars), display the
|
|
1161
|
-
// individual point below or above the point depending on the threshold
|
|
1162
|
-
options.align = pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');
|
|
1163
|
-
options.verticalAlign = pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');
|
|
1164
|
-
// Call the parent method
|
|
1165
|
-
Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
|
|
1166
|
-
// If label was justified and we have contrast, set it:
|
|
1167
|
-
if (options.inside && point.contrastColor) {
|
|
1168
|
-
dataLabel.css({
|
|
1169
|
-
color: point.contrastColor
|
|
1170
|
-
});
|
|
1171
|
-
}
|
|
1172
|
-
};
|
|
1173
|
-
}
|