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
|
@@ -9,19 +9,572 @@
|
|
|
9
9
|
* */
|
|
10
10
|
'use strict';
|
|
11
11
|
import Axis from './Axis.js';
|
|
12
|
-
import Chart from '../Chart/Chart.js';
|
|
13
12
|
import H from '../Globals.js';
|
|
14
13
|
import Series from '../Series/Series.js';
|
|
15
14
|
import U from '../Utilities.js';
|
|
16
|
-
var addEvent = U.addEvent, css = U.css, defined = U.defined, error = U.error, pick = U.pick, timeUnits = U.timeUnits;
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
var addEvent = U.addEvent, correctFloat = U.correctFloat, css = U.css, defined = U.defined, error = U.error, pick = U.pick, timeUnits = U.timeUnits;
|
|
16
|
+
/* *
|
|
17
|
+
*
|
|
18
|
+
* Constants
|
|
19
|
+
*
|
|
20
|
+
* */
|
|
21
|
+
var composedClasses = [];
|
|
22
|
+
/* eslint-disable valid-jsdoc */
|
|
23
|
+
/* *
|
|
24
|
+
*
|
|
25
|
+
* Composition
|
|
26
|
+
*
|
|
27
|
+
* */
|
|
19
28
|
/**
|
|
20
29
|
* Extends the axis with ordinal support.
|
|
21
30
|
* @private
|
|
22
31
|
*/
|
|
23
32
|
var OrdinalAxis;
|
|
24
33
|
(function (OrdinalAxis) {
|
|
34
|
+
/* *
|
|
35
|
+
*
|
|
36
|
+
* Declarations
|
|
37
|
+
*
|
|
38
|
+
* */
|
|
39
|
+
/* *
|
|
40
|
+
*
|
|
41
|
+
* Functions
|
|
42
|
+
*
|
|
43
|
+
* */
|
|
44
|
+
/**
|
|
45
|
+
* Extends the axis with ordinal support.
|
|
46
|
+
*
|
|
47
|
+
* @private
|
|
48
|
+
*
|
|
49
|
+
* @param AxisClass
|
|
50
|
+
* Axis class to extend.
|
|
51
|
+
*
|
|
52
|
+
* @param ChartClass
|
|
53
|
+
* Chart class to use.
|
|
54
|
+
*
|
|
55
|
+
* @param SeriesClass
|
|
56
|
+
* Series class to use.
|
|
57
|
+
*/
|
|
58
|
+
function compose(AxisClass, SeriesClass, ChartClass) {
|
|
59
|
+
if (composedClasses.indexOf(AxisClass) === -1) {
|
|
60
|
+
composedClasses.push(AxisClass);
|
|
61
|
+
var axisProto = AxisClass.prototype;
|
|
62
|
+
axisProto.getTimeTicks = getTimeTicks;
|
|
63
|
+
axisProto.index2val = index2val;
|
|
64
|
+
axisProto.lin2val = lin2val;
|
|
65
|
+
axisProto.val2lin = val2lin;
|
|
66
|
+
// Record this to prevent overwriting by broken-axis module (#5979)
|
|
67
|
+
axisProto.ordinal2lin = axisProto.val2lin;
|
|
68
|
+
addEvent(AxisClass, 'afterInit', onAxisAfterInit);
|
|
69
|
+
addEvent(AxisClass, 'foundExtremes', onAxisFoundExtremes);
|
|
70
|
+
addEvent(AxisClass, 'afterSetScale', onAxisAfterSetScale);
|
|
71
|
+
addEvent(AxisClass, 'initialAxisTranslation', onAxisInitialAxisTranslation);
|
|
72
|
+
}
|
|
73
|
+
if (composedClasses.indexOf(ChartClass) === -1) {
|
|
74
|
+
composedClasses.push(ChartClass);
|
|
75
|
+
addEvent(ChartClass, 'pan', onChartPan);
|
|
76
|
+
}
|
|
77
|
+
if (composedClasses.indexOf(SeriesClass) === -1) {
|
|
78
|
+
composedClasses.push(SeriesClass);
|
|
79
|
+
addEvent(SeriesClass, 'updatedData', onSeriesUpdatedData);
|
|
80
|
+
}
|
|
81
|
+
/* eslint-enable no-invalid-this */
|
|
82
|
+
return AxisClass;
|
|
83
|
+
}
|
|
84
|
+
OrdinalAxis.compose = compose;
|
|
85
|
+
/**
|
|
86
|
+
* In an ordinal axis, there might be areas with dense consentrations of
|
|
87
|
+
* points, then large gaps between some. Creating equally distributed
|
|
88
|
+
* ticks over this entire range may lead to a huge number of ticks that
|
|
89
|
+
* will later be removed. So instead, break the positions up in
|
|
90
|
+
* segments, find the tick positions for each segment then concatenize
|
|
91
|
+
* them. This method is used from both data grouping logic and X axis
|
|
92
|
+
* tick position logic.
|
|
93
|
+
* @private
|
|
94
|
+
*/
|
|
95
|
+
function getTimeTicks(normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {
|
|
96
|
+
if (positions === void 0) { positions = []; }
|
|
97
|
+
if (closestDistance === void 0) { closestDistance = 0; }
|
|
98
|
+
var higherRanks = {}, tickPixelIntervalOption = this.options.tickPixelInterval, time = this.chart.time,
|
|
99
|
+
// Record all the start positions of a segment, to use when
|
|
100
|
+
// deciding what's a gap in the data.
|
|
101
|
+
segmentStarts = [];
|
|
102
|
+
var end, segmentPositions, hasCrossedHigherRank, info, outsideMax, start = 0, groupPositions = [], lastGroupPosition = -Number.MAX_VALUE;
|
|
103
|
+
// The positions are not always defined, for example for ordinal
|
|
104
|
+
// positions when data has regular interval (#1557, #2090)
|
|
105
|
+
if ((!this.options.ordinal && !this.options.breaks) ||
|
|
106
|
+
!positions ||
|
|
107
|
+
positions.length < 3 ||
|
|
108
|
+
typeof min === 'undefined') {
|
|
109
|
+
return time.getTimeTicks.apply(time, arguments);
|
|
110
|
+
}
|
|
111
|
+
// Analyze the positions array to split it into segments on gaps
|
|
112
|
+
// larger than 5 times the closest distance. The closest distance is
|
|
113
|
+
// already found at this point, so we reuse that instead of
|
|
114
|
+
// computing it again.
|
|
115
|
+
var posLength = positions.length;
|
|
116
|
+
for (end = 0; end < posLength; end++) {
|
|
117
|
+
outsideMax = end && positions[end - 1] > max;
|
|
118
|
+
if (positions[end] < min) { // Set the last position before min
|
|
119
|
+
start = end;
|
|
120
|
+
}
|
|
121
|
+
if (end === posLength - 1 ||
|
|
122
|
+
positions[end + 1] - positions[end] > closestDistance * 5 ||
|
|
123
|
+
outsideMax) {
|
|
124
|
+
// For each segment, calculate the tick positions from the
|
|
125
|
+
// getTimeTicks utility function. The interval will be the
|
|
126
|
+
// same regardless of how long the segment is.
|
|
127
|
+
if (positions[end] > lastGroupPosition) { // #1475
|
|
128
|
+
segmentPositions = time.getTimeTicks(normalizedInterval, positions[start], positions[end], startOfWeek);
|
|
129
|
+
// Prevent duplicate groups, for example for multiple
|
|
130
|
+
// segments within one larger time frame (#1475)
|
|
131
|
+
while (segmentPositions.length &&
|
|
132
|
+
segmentPositions[0] <= lastGroupPosition) {
|
|
133
|
+
segmentPositions.shift();
|
|
134
|
+
}
|
|
135
|
+
if (segmentPositions.length) {
|
|
136
|
+
lastGroupPosition =
|
|
137
|
+
segmentPositions[segmentPositions.length - 1];
|
|
138
|
+
}
|
|
139
|
+
segmentStarts.push(groupPositions.length);
|
|
140
|
+
groupPositions = groupPositions.concat(segmentPositions);
|
|
141
|
+
}
|
|
142
|
+
// Set start of next segment
|
|
143
|
+
start = end + 1;
|
|
144
|
+
}
|
|
145
|
+
if (outsideMax) {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Get the grouping info from the last of the segments. The info is
|
|
150
|
+
// the same for all segments.
|
|
151
|
+
if (segmentPositions) {
|
|
152
|
+
info = segmentPositions.info;
|
|
153
|
+
// Optionally identify ticks with higher rank, for example
|
|
154
|
+
// when the ticks have crossed midnight.
|
|
155
|
+
if (findHigherRanks && info.unitRange <= timeUnits.hour) {
|
|
156
|
+
end = groupPositions.length - 1;
|
|
157
|
+
// Compare points two by two
|
|
158
|
+
for (start = 1; start < end; start++) {
|
|
159
|
+
if (time.dateFormat('%d', groupPositions[start]) !==
|
|
160
|
+
time.dateFormat('%d', groupPositions[start - 1])) {
|
|
161
|
+
higherRanks[groupPositions[start]] = 'day';
|
|
162
|
+
hasCrossedHigherRank = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// If the complete array has crossed midnight, we want
|
|
166
|
+
// to mark the first positions also as higher rank
|
|
167
|
+
if (hasCrossedHigherRank) {
|
|
168
|
+
higherRanks[groupPositions[0]] = 'day';
|
|
169
|
+
}
|
|
170
|
+
info.higherRanks = higherRanks;
|
|
171
|
+
}
|
|
172
|
+
// Save the info
|
|
173
|
+
info.segmentStarts = segmentStarts;
|
|
174
|
+
groupPositions.info = info;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
error(12, false, this.chart);
|
|
178
|
+
}
|
|
179
|
+
// Don't show ticks within a gap in the ordinal axis, where the
|
|
180
|
+
// space between two points is greater than a portion of the tick
|
|
181
|
+
// pixel interval
|
|
182
|
+
if (findHigherRanks && defined(tickPixelIntervalOption)) {
|
|
183
|
+
var length_1 = groupPositions.length, translatedArr = [], distances = [];
|
|
184
|
+
var itemToRemove = void 0, translated = void 0, lastTranslated = void 0, medianDistance = void 0, distance = void 0, i = length_1;
|
|
185
|
+
// Find median pixel distance in order to keep a reasonably even
|
|
186
|
+
// distance between ticks (#748)
|
|
187
|
+
while (i--) {
|
|
188
|
+
translated = this.translate(groupPositions[i]);
|
|
189
|
+
if (lastTranslated) {
|
|
190
|
+
distances[i] = lastTranslated - translated;
|
|
191
|
+
}
|
|
192
|
+
translatedArr[i] = lastTranslated = translated;
|
|
193
|
+
}
|
|
194
|
+
distances.sort();
|
|
195
|
+
medianDistance = distances[Math.floor(distances.length / 2)];
|
|
196
|
+
if (medianDistance < tickPixelIntervalOption * 0.6) {
|
|
197
|
+
medianDistance = null;
|
|
198
|
+
}
|
|
199
|
+
// Now loop over again and remove ticks where needed
|
|
200
|
+
i = groupPositions[length_1 - 1] > max ? length_1 - 1 : length_1; // #817
|
|
201
|
+
lastTranslated = void 0;
|
|
202
|
+
while (i--) {
|
|
203
|
+
translated = translatedArr[i];
|
|
204
|
+
distance = Math.abs(lastTranslated - translated);
|
|
205
|
+
// #4175 - when axis is reversed, the distance, is negative
|
|
206
|
+
// but tickPixelIntervalOption positive, so we need to
|
|
207
|
+
// compare the same values
|
|
208
|
+
// Remove ticks that are closer than 0.6 times the pixel
|
|
209
|
+
// interval from the one to the right, but not if it is
|
|
210
|
+
// close to the median distance (#748).
|
|
211
|
+
if (lastTranslated &&
|
|
212
|
+
distance < tickPixelIntervalOption * 0.8 &&
|
|
213
|
+
(medianDistance === null || distance < medianDistance * 0.8)) {
|
|
214
|
+
// Is this a higher ranked position with a normal
|
|
215
|
+
// position to the right?
|
|
216
|
+
if (higherRanks[groupPositions[i]] &&
|
|
217
|
+
!higherRanks[groupPositions[i + 1]]) {
|
|
218
|
+
// Yes: remove the lower ranked neighbour to the
|
|
219
|
+
// right
|
|
220
|
+
itemToRemove = i + 1;
|
|
221
|
+
lastTranslated = translated; // #709
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// No: remove this one
|
|
225
|
+
itemToRemove = i;
|
|
226
|
+
}
|
|
227
|
+
groupPositions.splice(itemToRemove, 1);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
lastTranslated = translated;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return groupPositions;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get axis position of given index of the extended ordinal positions.
|
|
238
|
+
* Used only when panning an ordinal axis.
|
|
239
|
+
*
|
|
240
|
+
* @private
|
|
241
|
+
* @function Highcharts.Axis#index2val
|
|
242
|
+
*
|
|
243
|
+
* @param {number} index
|
|
244
|
+
* The index value of searched point
|
|
245
|
+
*
|
|
246
|
+
* @return {number}
|
|
247
|
+
*/
|
|
248
|
+
function index2val(index) {
|
|
249
|
+
var axis = this, ordinal = axis.ordinal,
|
|
250
|
+
// Context could be changed to extendedOrdinalPositions.
|
|
251
|
+
ordinalPositions = ordinal.positions;
|
|
252
|
+
// The visible range contains only equally spaced values.
|
|
253
|
+
if (!ordinalPositions) {
|
|
254
|
+
return index;
|
|
255
|
+
}
|
|
256
|
+
var i = ordinalPositions.length - 1, distance;
|
|
257
|
+
if (index < 0) { // out of range, in effect panning to the left
|
|
258
|
+
index = ordinalPositions[0];
|
|
259
|
+
}
|
|
260
|
+
else if (index > i) { // out of range, panning to the right
|
|
261
|
+
index = ordinalPositions[i];
|
|
262
|
+
}
|
|
263
|
+
else { // split it up
|
|
264
|
+
i = Math.floor(index);
|
|
265
|
+
distance = index - i; // the decimal
|
|
266
|
+
}
|
|
267
|
+
if (typeof distance !== 'undefined' &&
|
|
268
|
+
typeof ordinalPositions[i] !== 'undefined') {
|
|
269
|
+
return ordinalPositions[i] + (distance ?
|
|
270
|
+
distance *
|
|
271
|
+
(ordinalPositions[i + 1] - ordinalPositions[i]) :
|
|
272
|
+
0);
|
|
273
|
+
}
|
|
274
|
+
return index;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Translate from linear (internal) to axis value.
|
|
278
|
+
*
|
|
279
|
+
* @private
|
|
280
|
+
* @function Highcharts.Axis#lin2val
|
|
281
|
+
*
|
|
282
|
+
* @param {number} val
|
|
283
|
+
* The linear abstracted value.
|
|
284
|
+
*
|
|
285
|
+
* @return {number}
|
|
286
|
+
*/
|
|
287
|
+
function lin2val(val) {
|
|
288
|
+
var axis = this, ordinal = axis.ordinal, localMin = axis.old ? axis.old.min : axis.min, localA = axis.old ? axis.old.transA : axis.transA;
|
|
289
|
+
var positions = ordinal.positions; // for the current visible range
|
|
290
|
+
// The visible range contains only equally spaced values.
|
|
291
|
+
if (!positions) {
|
|
292
|
+
return val;
|
|
293
|
+
}
|
|
294
|
+
// Convert back from modivied value to pixels. // #15970
|
|
295
|
+
var pixelVal = (val - localMin) * localA + axis.minPixelPadding, isInside = pixelVal > 0 && pixelVal < axis.left + axis.len;
|
|
296
|
+
// If the value is not inside the plot area,
|
|
297
|
+
// use the extended positions.
|
|
298
|
+
// (array contains also points that are outside of the plotArea).
|
|
299
|
+
if (!isInside) {
|
|
300
|
+
// When iterating for the first time,
|
|
301
|
+
// get the extended ordinal positional and assign them.
|
|
302
|
+
if (!ordinal.extendedOrdinalPositions) {
|
|
303
|
+
ordinal.extendedOrdinalPositions = ordinal.getExtendedPositions();
|
|
304
|
+
}
|
|
305
|
+
positions = ordinal.extendedOrdinalPositions;
|
|
306
|
+
}
|
|
307
|
+
// In some cases (especially in early stages of the chart creation)
|
|
308
|
+
// the getExtendedPositions might return undefined.
|
|
309
|
+
if (positions && positions.length) {
|
|
310
|
+
var index = ordinal.getIndexOfPoint(pixelVal, positions), mantissa = correctFloat(index % 1);
|
|
311
|
+
// Check if the index is inside position array.
|
|
312
|
+
// If true, read/approximate value for that exact index.
|
|
313
|
+
if (index >= 0 && index < positions.length) {
|
|
314
|
+
var leftNeighbour = positions[Math.floor(index)], rightNeighbour = positions[Math.ceil(index)], distance = rightNeighbour - leftNeighbour;
|
|
315
|
+
return positions[Math.floor(index)] + mantissa * distance;
|
|
316
|
+
}
|
|
317
|
+
// For cases when the index is not in the extended ordinal
|
|
318
|
+
// position array, like when the value we are looking
|
|
319
|
+
// for exceed the available data,
|
|
320
|
+
// approximate that value based on the calculated slope.
|
|
321
|
+
var positionsLength = positions.length, firstPositionsValue = positions[0], lastPositionsValue = positions[positionsLength - 1], slope = (lastPositionsValue - firstPositionsValue) / (positionsLength - 1);
|
|
322
|
+
if (index < 0) {
|
|
323
|
+
return firstPositionsValue + slope * index;
|
|
324
|
+
}
|
|
325
|
+
return lastPositionsValue + slope * (index - positionsLength);
|
|
326
|
+
}
|
|
327
|
+
return val;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Internal function to calculate the precise index
|
|
331
|
+
* in ordinalPositions array.
|
|
332
|
+
* @private
|
|
333
|
+
*/
|
|
334
|
+
function getIndexInArray(ordinalPositions, val) {
|
|
335
|
+
var index = OrdinalAxis.Additions.findIndexOf(ordinalPositions, val, true);
|
|
336
|
+
if (ordinalPositions[index] === val) {
|
|
337
|
+
return index;
|
|
338
|
+
}
|
|
339
|
+
var percent = (val - ordinalPositions[index]) /
|
|
340
|
+
(ordinalPositions[index + 1] - ordinalPositions[index]);
|
|
341
|
+
return index + percent;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* @private
|
|
345
|
+
*/
|
|
346
|
+
function onAxisAfterInit() {
|
|
347
|
+
var axis = this;
|
|
348
|
+
if (!axis.ordinal) {
|
|
349
|
+
axis.ordinal = new OrdinalAxis.Additions(axis);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* @private
|
|
354
|
+
*/
|
|
355
|
+
function onAxisFoundExtremes() {
|
|
356
|
+
var axis = this;
|
|
357
|
+
if (axis.isXAxis &&
|
|
358
|
+
defined(axis.options.overscroll) &&
|
|
359
|
+
axis.max === axis.dataMax &&
|
|
360
|
+
(
|
|
361
|
+
// Panning is an execption. We don't want to apply
|
|
362
|
+
// overscroll when panning over the dataMax
|
|
363
|
+
!axis.chart.mouseIsDown ||
|
|
364
|
+
axis.isInternal) && (
|
|
365
|
+
// Scrollbar buttons are the other execption:
|
|
366
|
+
!axis.eventArgs ||
|
|
367
|
+
axis.eventArgs && axis.eventArgs.trigger !== 'navigator')) {
|
|
368
|
+
axis.max += axis.options.overscroll;
|
|
369
|
+
// Live data and buttons require translation for the min:
|
|
370
|
+
if (!axis.isInternal && defined(axis.userMin)) {
|
|
371
|
+
axis.min += axis.options.overscroll;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* For ordinal axis, that loads data async, redraw axis after data is
|
|
377
|
+
* loaded. If we don't do that, axis will have the same extremes as
|
|
378
|
+
* previously, but ordinal positions won't be calculated. See #10290
|
|
379
|
+
* @private
|
|
380
|
+
*/
|
|
381
|
+
function onAxisAfterSetScale() {
|
|
382
|
+
var axis = this;
|
|
383
|
+
if (axis.horiz && !axis.isDirty) {
|
|
384
|
+
axis.isDirty = axis.isOrdinal &&
|
|
385
|
+
axis.chart.navigator &&
|
|
386
|
+
!axis.chart.navigator.adaptToUpdatedData;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* @private
|
|
391
|
+
*/
|
|
392
|
+
function onAxisInitialAxisTranslation() {
|
|
393
|
+
var axis = this;
|
|
394
|
+
if (axis.ordinal) {
|
|
395
|
+
axis.ordinal.beforeSetTickPositions();
|
|
396
|
+
axis.tickInterval = axis.ordinal.postProcessTickInterval(axis.tickInterval);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* @private
|
|
401
|
+
*
|
|
402
|
+
* Extending the Chart.pan method for ordinal axes
|
|
403
|
+
*/
|
|
404
|
+
function onChartPan(e) {
|
|
405
|
+
var chart = this, xAxis = chart.xAxis[0], overscroll = xAxis.options.overscroll, chartX = e.originalEvent.chartX, panning = chart.options.chart.panning;
|
|
406
|
+
var runBase = false;
|
|
407
|
+
if (panning &&
|
|
408
|
+
panning.type !== 'y' &&
|
|
409
|
+
xAxis.options.ordinal &&
|
|
410
|
+
xAxis.series.length) {
|
|
411
|
+
var mouseDownX = chart.mouseDownX, extremes = xAxis.getExtremes(), dataMax = extremes.dataMax, min = extremes.min, max = extremes.max, hoverPoints = chart.hoverPoints, closestPointRange = (xAxis.closestPointRange ||
|
|
412
|
+
(xAxis.ordinal && xAxis.ordinal.overscrollPointsRange)), pointPixelWidth = (xAxis.translationSlope *
|
|
413
|
+
(xAxis.ordinal.slope || closestPointRange)),
|
|
414
|
+
// how many ordinal units did we move?
|
|
415
|
+
movedUnits = (mouseDownX - chartX) / pointPixelWidth,
|
|
416
|
+
// get index of all the chart's points
|
|
417
|
+
extendedAxis = { ordinal: { positions: xAxis.ordinal.getExtendedPositions() } }, index2val_1 = xAxis.index2val, val2lin_1 = xAxis.val2lin;
|
|
418
|
+
var trimmedRange = void 0, ordinalPositions = void 0, searchAxisLeft = void 0, searchAxisRight = void 0;
|
|
419
|
+
// we have an ordinal axis, but the data is equally spaced
|
|
420
|
+
if (!extendedAxis.ordinal.positions) {
|
|
421
|
+
runBase = true;
|
|
422
|
+
}
|
|
423
|
+
else if (Math.abs(movedUnits) > 1) {
|
|
424
|
+
// Remove active points for shared tooltip
|
|
425
|
+
if (hoverPoints) {
|
|
426
|
+
hoverPoints.forEach(function (point) {
|
|
427
|
+
point.setState();
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
if (movedUnits < 0) {
|
|
431
|
+
searchAxisLeft = extendedAxis;
|
|
432
|
+
searchAxisRight = xAxis.ordinal.positions ? xAxis : extendedAxis;
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
searchAxisLeft = xAxis.ordinal.positions ? xAxis : extendedAxis;
|
|
436
|
+
searchAxisRight = extendedAxis;
|
|
437
|
+
}
|
|
438
|
+
// In grouped data series, the last ordinal position
|
|
439
|
+
// represents the grouped data, which is to the left of the
|
|
440
|
+
// real data max. If we don't compensate for this, we will
|
|
441
|
+
// be allowed to pan grouped data series passed the right of
|
|
442
|
+
// the plot area.
|
|
443
|
+
ordinalPositions = searchAxisRight.ordinal.positions;
|
|
444
|
+
if (dataMax >
|
|
445
|
+
ordinalPositions[ordinalPositions.length - 1]) {
|
|
446
|
+
ordinalPositions.push(dataMax);
|
|
447
|
+
}
|
|
448
|
+
// Get the new min and max values by getting the ordinal
|
|
449
|
+
// index for the current extreme, then add the moved units
|
|
450
|
+
// and translate back to values. This happens on the
|
|
451
|
+
// extended ordinal positions if the new position is out of
|
|
452
|
+
// range, else it happens on the current x axis which is
|
|
453
|
+
// smaller and faster.
|
|
454
|
+
chart.fixedRange = max - min;
|
|
455
|
+
trimmedRange = xAxis.navigatorAxis.toFixedRange(null, null, index2val_1.apply(searchAxisLeft, [
|
|
456
|
+
val2lin_1.apply(searchAxisLeft, [min, true]) + movedUnits
|
|
457
|
+
]), index2val_1.apply(searchAxisRight, [
|
|
458
|
+
val2lin_1.apply(searchAxisRight, [max, true]) + movedUnits
|
|
459
|
+
]));
|
|
460
|
+
// Apply it if it is within the available data range
|
|
461
|
+
if (trimmedRange.min >= Math.min(extremes.dataMin, min) &&
|
|
462
|
+
trimmedRange.max <= Math.max(dataMax, max) + overscroll) {
|
|
463
|
+
xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });
|
|
464
|
+
}
|
|
465
|
+
chart.mouseDownX = chartX; // set new reference for next run
|
|
466
|
+
css(chart.container, { cursor: 'move' });
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
runBase = true;
|
|
471
|
+
}
|
|
472
|
+
// revert to the linear chart.pan version
|
|
473
|
+
if (runBase || (panning && /y/.test(panning.type))) {
|
|
474
|
+
if (overscroll) {
|
|
475
|
+
xAxis.max = xAxis.dataMax + overscroll;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
e.preventDefault();
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* @private
|
|
484
|
+
*/
|
|
485
|
+
function onSeriesUpdatedData() {
|
|
486
|
+
var xAxis = this.xAxis;
|
|
487
|
+
// Destroy the extended ordinal index on updated data
|
|
488
|
+
// and destroy extendedOrdinalPositions, #16055.
|
|
489
|
+
if (xAxis && xAxis.options.ordinal) {
|
|
490
|
+
delete xAxis.ordinal.index;
|
|
491
|
+
delete xAxis.ordinal.extendedOrdinalPositions;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Translate from a linear axis value to the corresponding ordinal axis
|
|
496
|
+
* position. If there are no gaps in the ordinal axis this will be the
|
|
497
|
+
* same. The translated value is the value that the point would have if
|
|
498
|
+
* the axis was linear, using the same min and max.
|
|
499
|
+
*
|
|
500
|
+
* @private
|
|
501
|
+
* @function Highcharts.Axis#val2lin
|
|
502
|
+
*
|
|
503
|
+
* @param {number} val
|
|
504
|
+
* The axis value.
|
|
505
|
+
*
|
|
506
|
+
* @param {boolean} [toIndex]
|
|
507
|
+
* Whether to return the index in the ordinalPositions or the new value.
|
|
508
|
+
*
|
|
509
|
+
* @return {number}
|
|
510
|
+
*/
|
|
511
|
+
function val2lin(val, toIndex) {
|
|
512
|
+
var axis = this, ordinal = axis.ordinal, ordinalPositions = ordinal.positions;
|
|
513
|
+
var slope = ordinal.slope, extendedOrdinalPositions = ordinal.extendedOrdinalPositions;
|
|
514
|
+
if (!ordinalPositions) {
|
|
515
|
+
return val;
|
|
516
|
+
}
|
|
517
|
+
var ordinalLength = ordinalPositions.length;
|
|
518
|
+
var ordinalIndex;
|
|
519
|
+
// If the searched value is inside visible plotArea, ivastigate the
|
|
520
|
+
// value basing on ordinalPositions.
|
|
521
|
+
if (ordinalPositions[0] <= val &&
|
|
522
|
+
ordinalPositions[ordinalLength - 1] >= val) {
|
|
523
|
+
ordinalIndex = getIndexInArray(ordinalPositions, val);
|
|
524
|
+
// final return value is based on ordinalIndex
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
if (!extendedOrdinalPositions) {
|
|
528
|
+
extendedOrdinalPositions =
|
|
529
|
+
ordinal.getExtendedPositions &&
|
|
530
|
+
ordinal.getExtendedPositions();
|
|
531
|
+
ordinal.extendedOrdinalPositions = extendedOrdinalPositions;
|
|
532
|
+
}
|
|
533
|
+
if (!(extendedOrdinalPositions && extendedOrdinalPositions.length)) {
|
|
534
|
+
return val;
|
|
535
|
+
}
|
|
536
|
+
var length_2 = extendedOrdinalPositions.length;
|
|
537
|
+
if (!slope) {
|
|
538
|
+
slope =
|
|
539
|
+
(extendedOrdinalPositions[length_2 - 1] -
|
|
540
|
+
extendedOrdinalPositions[0]) /
|
|
541
|
+
length_2;
|
|
542
|
+
}
|
|
543
|
+
// OriginalPointReference is equal to the index of
|
|
544
|
+
// first point of ordinalPositions in extendedOrdinalPositions.
|
|
545
|
+
var originalPositionsReference = getIndexInArray(extendedOrdinalPositions, ordinalPositions[0]);
|
|
546
|
+
// If the searched value is outside the visiblePlotArea,
|
|
547
|
+
// check if it is inside extendedOrdinalPositions.
|
|
548
|
+
if (val >= extendedOrdinalPositions[0] &&
|
|
549
|
+
val <=
|
|
550
|
+
extendedOrdinalPositions[length_2 - 1]) {
|
|
551
|
+
// Return Value
|
|
552
|
+
ordinalIndex = getIndexInArray(extendedOrdinalPositions, val) - originalPositionsReference;
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
// Since ordinal.slope is the average distance between 2
|
|
556
|
+
// points on visible plotArea, this can be used to calculete
|
|
557
|
+
// the approximate position of the point, which is outside
|
|
558
|
+
// the extededOrdinalPositions.
|
|
559
|
+
if (val < extendedOrdinalPositions[0]) {
|
|
560
|
+
var diff = extendedOrdinalPositions[0] - val, approximateIndexOffset = diff / slope;
|
|
561
|
+
ordinalIndex =
|
|
562
|
+
-originalPositionsReference -
|
|
563
|
+
approximateIndexOffset;
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
var diff = val -
|
|
567
|
+
extendedOrdinalPositions[length_2 - 1], approximateIndexOffset = diff / slope;
|
|
568
|
+
ordinalIndex =
|
|
569
|
+
approximateIndexOffset +
|
|
570
|
+
length_2 -
|
|
571
|
+
originalPositionsReference;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return toIndex ? ordinalIndex : slope * (ordinalIndex || 0) +
|
|
576
|
+
ordinal.offset;
|
|
577
|
+
}
|
|
25
578
|
/* *
|
|
26
579
|
*
|
|
27
580
|
* Classes
|
|
@@ -30,7 +583,7 @@ var OrdinalAxis;
|
|
|
30
583
|
/**
|
|
31
584
|
* @private
|
|
32
585
|
*/
|
|
33
|
-
var
|
|
586
|
+
var Additions = /** @class */ (function () {
|
|
34
587
|
/* *
|
|
35
588
|
*
|
|
36
589
|
* Constructors
|
|
@@ -39,7 +592,7 @@ var OrdinalAxis;
|
|
|
39
592
|
/**
|
|
40
593
|
* @private
|
|
41
594
|
*/
|
|
42
|
-
function
|
|
595
|
+
function Additions(axis) {
|
|
43
596
|
this.index = {};
|
|
44
597
|
this.axis = axis;
|
|
45
598
|
}
|
|
@@ -50,11 +603,11 @@ var OrdinalAxis;
|
|
|
50
603
|
* */
|
|
51
604
|
/**
|
|
52
605
|
* Calculate the ordinal positions before tick positions are calculated.
|
|
53
|
-
*
|
|
54
606
|
* @private
|
|
55
607
|
*/
|
|
56
|
-
|
|
57
|
-
var axis = this.axis, ordinal = axis.ordinal,
|
|
608
|
+
Additions.prototype.beforeSetTickPositions = function () {
|
|
609
|
+
var axis = this.axis, ordinal = axis.ordinal, extremes = axis.getExtremes(), min = extremes.min, max = extremes.max, hasBreaks = axis.isXAxis && !!axis.options.breaks, isOrdinal = axis.options.ordinal, ignoreHiddenSeries = axis.chart.options.chart.ignoreHiddenSeries;
|
|
610
|
+
var len, uniqueOrdinalPositions, dist, minIndex, maxIndex, slope, i, hasBoostedSeries, ordinalPositions = [], overscrollPointsRange = Number.MAX_VALUE, useOrdinal = false;
|
|
58
611
|
// Apply the ordinal logic
|
|
59
612
|
if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?
|
|
60
613
|
axis.series.forEach(function (series, i) {
|
|
@@ -170,6 +723,39 @@ var OrdinalAxis;
|
|
|
170
723
|
axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926
|
|
171
724
|
ordinal.groupIntervalFactor = null; // reset for next run
|
|
172
725
|
};
|
|
726
|
+
/**
|
|
727
|
+
* Faster way of using the Array.indexOf method.
|
|
728
|
+
* Works for sorted arrays only with unique values.
|
|
729
|
+
*
|
|
730
|
+
* @param {Array} sortedArray
|
|
731
|
+
* The sorted array inside which we are looking for.
|
|
732
|
+
* @param {number} key
|
|
733
|
+
* The key to being found.
|
|
734
|
+
* @param {boolean} indirectSearch
|
|
735
|
+
* In case of lack of the point in the array, should return
|
|
736
|
+
* value be equal to -1 or the closest smaller index.
|
|
737
|
+
* @private
|
|
738
|
+
*/
|
|
739
|
+
Additions.findIndexOf = function (sortedArray, key, indirectSearch) {
|
|
740
|
+
var start = 0, end = sortedArray.length - 1, middle;
|
|
741
|
+
while (start < end) {
|
|
742
|
+
middle = Math.ceil((start + end) / 2);
|
|
743
|
+
// Key found as the middle element.
|
|
744
|
+
if (sortedArray[middle] <= key) {
|
|
745
|
+
// Continue searching to the right.
|
|
746
|
+
start = middle;
|
|
747
|
+
}
|
|
748
|
+
else {
|
|
749
|
+
// Continue searching to the left.
|
|
750
|
+
end = middle - 1;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
if (sortedArray[start] === key) {
|
|
754
|
+
return start;
|
|
755
|
+
}
|
|
756
|
+
// Key could not be found.
|
|
757
|
+
return !indirectSearch ? -1 : start;
|
|
758
|
+
};
|
|
173
759
|
/**
|
|
174
760
|
* Get the ordinal positions for the entire data set. This is necessary
|
|
175
761
|
* in chart panning because we need to find out what points or data
|
|
@@ -177,13 +763,13 @@ var OrdinalAxis;
|
|
|
177
763
|
* operation starts, if an index for the given grouping does not exists,
|
|
178
764
|
* it is created and cached. This index is deleted on updated data, so
|
|
179
765
|
* it will be regenerated the next time a panning operation starts.
|
|
180
|
-
*
|
|
181
766
|
* @private
|
|
182
767
|
*/
|
|
183
|
-
|
|
184
|
-
var ordinal = this, axis = ordinal.axis, axisProto = axis.constructor.prototype, chart = axis.chart, grouping = axis.series[0].currentDataGrouping,
|
|
768
|
+
Additions.prototype.getExtendedPositions = function () {
|
|
769
|
+
var ordinal = this, axis = ordinal.axis, axisProto = axis.constructor.prototype, chart = axis.chart, grouping = axis.series[0].currentDataGrouping, key = grouping ?
|
|
185
770
|
grouping.count + grouping.unitName :
|
|
186
|
-
'raw', overscroll = axis.options.overscroll, extremes = axis.getExtremes()
|
|
771
|
+
'raw', overscroll = axis.options.overscroll, extremes = axis.getExtremes();
|
|
772
|
+
var fakeAxis, fakeSeries = void 0, ordinalIndex = ordinal.index;
|
|
187
773
|
// If this is the first time, or the ordinal index is deleted by
|
|
188
774
|
// updatedData,
|
|
189
775
|
// create it.
|
|
@@ -212,6 +798,7 @@ var OrdinalAxis;
|
|
|
212
798
|
getGroupIntervalFactor: this.getGroupIntervalFactor
|
|
213
799
|
},
|
|
214
800
|
ordinal2lin: axisProto.ordinal2lin,
|
|
801
|
+
getIndexOfPoint: axisProto.getIndexOfPoint,
|
|
215
802
|
val2lin: axisProto.val2lin // #2590
|
|
216
803
|
};
|
|
217
804
|
fakeAxis.ordinal.axis = fakeAxis;
|
|
@@ -223,11 +810,15 @@ var OrdinalAxis;
|
|
|
223
810
|
xData: series.xData.slice(),
|
|
224
811
|
chart: chart,
|
|
225
812
|
destroyGroupedData: H.noop,
|
|
226
|
-
getProcessedData: Series.prototype.getProcessedData
|
|
813
|
+
getProcessedData: Series.prototype.getProcessedData,
|
|
814
|
+
applyGrouping: Series.prototype.applyGrouping
|
|
227
815
|
};
|
|
228
816
|
fakeSeries.xData = fakeSeries.xData.concat(ordinal.getOverscrollPositions());
|
|
229
817
|
fakeSeries.options = {
|
|
230
818
|
dataGrouping: grouping ? {
|
|
819
|
+
firstAnchor: 'firstPoint',
|
|
820
|
+
anchor: 'middle',
|
|
821
|
+
lastAnchor: 'lastPoint',
|
|
231
822
|
enabled: true,
|
|
232
823
|
forced: true,
|
|
233
824
|
// doesn't matter which, use the fastest
|
|
@@ -242,12 +833,15 @@ var OrdinalAxis;
|
|
|
242
833
|
};
|
|
243
834
|
fakeAxis.series.push(fakeSeries);
|
|
244
835
|
series.processData.apply(fakeSeries);
|
|
245
|
-
// Force to use the ordinal when points are evenly spaced
|
|
246
|
-
// (e.g. weeks), #3825.
|
|
247
|
-
if (fakeSeries.closestPointRange !== fakeSeries.basePointRange && fakeSeries.currentDataGrouping) {
|
|
248
|
-
fakeAxis.forceOrdinal = true;
|
|
249
|
-
}
|
|
250
836
|
});
|
|
837
|
+
// Apply grouping if needed.
|
|
838
|
+
axis.applyGrouping.call(fakeAxis);
|
|
839
|
+
// Force to use the ordinal when points are evenly spaced
|
|
840
|
+
// (e.g. weeks), #3825.
|
|
841
|
+
if (fakeSeries.closestPointRange !== fakeSeries.basePointRange &&
|
|
842
|
+
fakeSeries.currentDataGrouping) {
|
|
843
|
+
fakeAxis.forceOrdinal = true;
|
|
844
|
+
}
|
|
251
845
|
// Run beforeSetTickPositions to compute the ordinalPositions
|
|
252
846
|
axis.ordinal.beforeSetTickPositions.apply({ axis: fakeAxis });
|
|
253
847
|
// Cache it
|
|
@@ -276,11 +870,11 @@ var OrdinalAxis;
|
|
|
276
870
|
* logic, where we do another run with a greater interval if the number
|
|
277
871
|
* of data groups is more than a certain fraction of the desired group
|
|
278
872
|
* count.
|
|
279
|
-
*
|
|
280
873
|
* @private
|
|
281
874
|
*/
|
|
282
|
-
|
|
283
|
-
var ordinal = this, axis = ordinal.axis,
|
|
875
|
+
Additions.prototype.getGroupIntervalFactor = function (xMin, xMax, series) {
|
|
876
|
+
var ordinal = this, axis = ordinal.axis, processedXData = series.processedXData, len = processedXData.length, distances = [];
|
|
877
|
+
var median, i, groupIntervalFactor = ordinal.groupIntervalFactor;
|
|
284
878
|
// Only do this computation for the first series, let the other
|
|
285
879
|
// inherit it (#2416)
|
|
286
880
|
if (!groupIntervalFactor) {
|
|
@@ -304,6 +898,45 @@ var OrdinalAxis;
|
|
|
304
898
|
// Return the factor needed for data grouping
|
|
305
899
|
return groupIntervalFactor;
|
|
306
900
|
};
|
|
901
|
+
/**
|
|
902
|
+
* Get index of point inside the ordinal positions array.
|
|
903
|
+
*
|
|
904
|
+
* @private
|
|
905
|
+
* @param {number} val
|
|
906
|
+
* The pixel value of a point.
|
|
907
|
+
*
|
|
908
|
+
* @param {Array<number>} [ordinallArray]
|
|
909
|
+
* An array of all points available on the axis
|
|
910
|
+
* for the given data set.
|
|
911
|
+
* Either ordinalPositions if the value is inside the plotArea
|
|
912
|
+
* or extendedOrdinalPositions if not.
|
|
913
|
+
*
|
|
914
|
+
* @return {number}
|
|
915
|
+
*/
|
|
916
|
+
Additions.prototype.getIndexOfPoint = function (val, ordinalArray) {
|
|
917
|
+
var ordinal = this, axis = ordinal.axis, firstPointVal = ordinal.positions ? ordinal.positions[0] : 0;
|
|
918
|
+
var firstPointX = axis.series[0].points &&
|
|
919
|
+
axis.series[0].points[0] &&
|
|
920
|
+
axis.series[0].points[0].plotX ||
|
|
921
|
+
axis.minPixelPadding; // #15987
|
|
922
|
+
// When more series assign to axis, find the smallest one, #15987.
|
|
923
|
+
if (axis.series.length > 1) {
|
|
924
|
+
axis.series.forEach(function (series) {
|
|
925
|
+
if (defined(series.points[0]) &&
|
|
926
|
+
defined(series.points[0].plotX) &&
|
|
927
|
+
series.points[0].plotX < firstPointX) {
|
|
928
|
+
firstPointX = series.points[0].plotX;
|
|
929
|
+
}
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
// Distance in pixels between two points
|
|
933
|
+
// on the ordinal axis in the current zoom.
|
|
934
|
+
var ordinalPointPixelInterval = axis.translationSlope *
|
|
935
|
+
(ordinal.slope || axis.closestPointRange || ordinal.overscrollPointsRange),
|
|
936
|
+
// toValue for the first point.
|
|
937
|
+
shiftIndex = (val - firstPointX) / ordinalPointPixelInterval;
|
|
938
|
+
return Additions.findIndexOf(ordinalArray, firstPointVal) + shiftIndex;
|
|
939
|
+
};
|
|
307
940
|
/**
|
|
308
941
|
* Get ticks for an ordinal axis within a range where points don't
|
|
309
942
|
* exist. It is required when overscroll is enabled. We can't base on
|
|
@@ -311,14 +944,12 @@ var OrdinalAxis;
|
|
|
311
944
|
* pointRange and generate these ticks between Axis.dataMax,
|
|
312
945
|
* Axis.dataMax + Axis.overscroll evenly spaced. Used in panning and
|
|
313
946
|
* navigator scrolling.
|
|
314
|
-
*
|
|
315
947
|
* @private
|
|
316
948
|
*/
|
|
317
|
-
|
|
949
|
+
Additions.prototype.getOverscrollPositions = function () {
|
|
318
950
|
var ordinal = this, axis = ordinal.axis, extraRange = axis.options.overscroll, distance = ordinal.overscrollPointsRange, positions = [], max = axis.dataMax;
|
|
319
951
|
if (defined(distance)) {
|
|
320
952
|
// Max + pointRange because we need to scroll to the last
|
|
321
|
-
positions.push(max);
|
|
322
953
|
while (max <= axis.dataMax + extraRange) {
|
|
323
954
|
max += distance;
|
|
324
955
|
positions.push(max);
|
|
@@ -329,17 +960,17 @@ var OrdinalAxis;
|
|
|
329
960
|
/**
|
|
330
961
|
* Make the tick intervals closer because the ordinal gaps make the
|
|
331
962
|
* ticks spread out or cluster.
|
|
332
|
-
*
|
|
333
963
|
* @private
|
|
334
964
|
*/
|
|
335
|
-
|
|
965
|
+
Additions.prototype.postProcessTickInterval = function (tickInterval) {
|
|
336
966
|
// Problem: https://jsfiddle.net/highcharts/FQm4E/1/
|
|
337
967
|
// This is a case where this algorithm doesn't work optimally. In
|
|
338
968
|
// this case, the tick labels are spread out per week, but all the
|
|
339
969
|
// gaps reside within weeks. So we have a situation where the labels
|
|
340
970
|
// are courser than the ordinal gaps, and thus the tick interval
|
|
341
971
|
// should not be altered.
|
|
342
|
-
var ordinal = this, axis = ordinal.axis, ordinalSlope = ordinal.slope
|
|
972
|
+
var ordinal = this, axis = ordinal.axis, ordinalSlope = ordinal.slope;
|
|
973
|
+
var ret;
|
|
343
974
|
if (ordinalSlope) {
|
|
344
975
|
if (!axis.options.breaks) {
|
|
345
976
|
ret = tickInterval / (ordinalSlope / axis.closestPointRange);
|
|
@@ -353,438 +984,13 @@ var OrdinalAxis;
|
|
|
353
984
|
}
|
|
354
985
|
return ret;
|
|
355
986
|
};
|
|
356
|
-
return
|
|
987
|
+
return Additions;
|
|
357
988
|
}());
|
|
358
|
-
OrdinalAxis.
|
|
359
|
-
/* *
|
|
360
|
-
*
|
|
361
|
-
* Functions
|
|
362
|
-
*
|
|
363
|
-
* */
|
|
364
|
-
/**
|
|
365
|
-
* Extends the axis with ordinal support.
|
|
366
|
-
*
|
|
367
|
-
* @private
|
|
368
|
-
*
|
|
369
|
-
* @param AxisClass
|
|
370
|
-
* Axis class to extend.
|
|
371
|
-
*
|
|
372
|
-
* @param ChartClass
|
|
373
|
-
* Chart class to use.
|
|
374
|
-
*
|
|
375
|
-
* @param SeriesClass
|
|
376
|
-
* Series class to use.
|
|
377
|
-
*/
|
|
378
|
-
function compose(AxisClass, ChartClass, SeriesClass) {
|
|
379
|
-
AxisClass.keepProps.push('ordinal');
|
|
380
|
-
var axisProto = AxisClass.prototype;
|
|
381
|
-
/**
|
|
382
|
-
* In an ordinal axis, there might be areas with dense consentrations of
|
|
383
|
-
* points, then large gaps between some. Creating equally distributed
|
|
384
|
-
* ticks over this entire range may lead to a huge number of ticks that
|
|
385
|
-
* will later be removed. So instead, break the positions up in
|
|
386
|
-
* segments, find the tick positions for each segment then concatenize
|
|
387
|
-
* them. This method is used from both data grouping logic and X axis
|
|
388
|
-
* tick position logic.
|
|
389
|
-
*
|
|
390
|
-
* @private
|
|
391
|
-
*/
|
|
392
|
-
AxisClass.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {
|
|
393
|
-
if (positions === void 0) { positions = []; }
|
|
394
|
-
if (closestDistance === void 0) { closestDistance = 0; }
|
|
395
|
-
var start = 0, end, segmentPositions, higherRanks = {}, hasCrossedHigherRank, info, posLength, outsideMax, groupPositions = [], lastGroupPosition = -Number.MAX_VALUE, tickPixelIntervalOption = this.options.tickPixelInterval, time = this.chart.time,
|
|
396
|
-
// Record all the start positions of a segment, to use when
|
|
397
|
-
// deciding what's a gap in the data.
|
|
398
|
-
segmentStarts = [];
|
|
399
|
-
// The positions are not always defined, for example for ordinal
|
|
400
|
-
// positions when data has regular interval (#1557, #2090)
|
|
401
|
-
if ((!this.options.ordinal && !this.options.breaks) ||
|
|
402
|
-
!positions ||
|
|
403
|
-
positions.length < 3 ||
|
|
404
|
-
typeof min === 'undefined') {
|
|
405
|
-
return time.getTimeTicks.apply(time, arguments);
|
|
406
|
-
}
|
|
407
|
-
// Analyze the positions array to split it into segments on gaps
|
|
408
|
-
// larger than 5 times the closest distance. The closest distance is
|
|
409
|
-
// already found at this point, so we reuse that instead of
|
|
410
|
-
// computing it again.
|
|
411
|
-
posLength = positions.length;
|
|
412
|
-
for (end = 0; end < posLength; end++) {
|
|
413
|
-
outsideMax = end && positions[end - 1] > max;
|
|
414
|
-
if (positions[end] < min) { // Set the last position before min
|
|
415
|
-
start = end;
|
|
416
|
-
}
|
|
417
|
-
if (end === posLength - 1 ||
|
|
418
|
-
positions[end + 1] - positions[end] > closestDistance * 5 ||
|
|
419
|
-
outsideMax) {
|
|
420
|
-
// For each segment, calculate the tick positions from the
|
|
421
|
-
// getTimeTicks utility function. The interval will be the
|
|
422
|
-
// same regardless of how long the segment is.
|
|
423
|
-
if (positions[end] > lastGroupPosition) { // #1475
|
|
424
|
-
segmentPositions = time.getTimeTicks(normalizedInterval, positions[start], positions[end], startOfWeek);
|
|
425
|
-
// Prevent duplicate groups, for example for multiple
|
|
426
|
-
// segments within one larger time frame (#1475)
|
|
427
|
-
while (segmentPositions.length &&
|
|
428
|
-
segmentPositions[0] <= lastGroupPosition) {
|
|
429
|
-
segmentPositions.shift();
|
|
430
|
-
}
|
|
431
|
-
if (segmentPositions.length) {
|
|
432
|
-
lastGroupPosition =
|
|
433
|
-
segmentPositions[segmentPositions.length - 1];
|
|
434
|
-
}
|
|
435
|
-
segmentStarts.push(groupPositions.length);
|
|
436
|
-
groupPositions = groupPositions.concat(segmentPositions);
|
|
437
|
-
}
|
|
438
|
-
// Set start of next segment
|
|
439
|
-
start = end + 1;
|
|
440
|
-
}
|
|
441
|
-
if (outsideMax) {
|
|
442
|
-
break;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
// Get the grouping info from the last of the segments. The info is
|
|
446
|
-
// the same for all segments.
|
|
447
|
-
if (segmentPositions) {
|
|
448
|
-
info = segmentPositions.info;
|
|
449
|
-
// Optionally identify ticks with higher rank, for example
|
|
450
|
-
// when the ticks have crossed midnight.
|
|
451
|
-
if (findHigherRanks && info.unitRange <= timeUnits.hour) {
|
|
452
|
-
end = groupPositions.length - 1;
|
|
453
|
-
// Compare points two by two
|
|
454
|
-
for (start = 1; start < end; start++) {
|
|
455
|
-
if (time.dateFormat('%d', groupPositions[start]) !==
|
|
456
|
-
time.dateFormat('%d', groupPositions[start - 1])) {
|
|
457
|
-
higherRanks[groupPositions[start]] = 'day';
|
|
458
|
-
hasCrossedHigherRank = true;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
// If the complete array has crossed midnight, we want
|
|
462
|
-
// to mark the first positions also as higher rank
|
|
463
|
-
if (hasCrossedHigherRank) {
|
|
464
|
-
higherRanks[groupPositions[0]] = 'day';
|
|
465
|
-
}
|
|
466
|
-
info.higherRanks = higherRanks;
|
|
467
|
-
}
|
|
468
|
-
// Save the info
|
|
469
|
-
info.segmentStarts = segmentStarts;
|
|
470
|
-
groupPositions.info = info;
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
error(12, false, this.chart);
|
|
474
|
-
}
|
|
475
|
-
// Don't show ticks within a gap in the ordinal axis, where the
|
|
476
|
-
// space between two points is greater than a portion of the tick
|
|
477
|
-
// pixel interval
|
|
478
|
-
if (findHigherRanks && defined(tickPixelIntervalOption)) {
|
|
479
|
-
var length_1 = groupPositions.length, i = length_1, itemToRemove = void 0, translated = void 0, translatedArr = [], lastTranslated = void 0, medianDistance = void 0, distance = void 0, distances = [];
|
|
480
|
-
// Find median pixel distance in order to keep a reasonably even
|
|
481
|
-
// distance between ticks (#748)
|
|
482
|
-
while (i--) {
|
|
483
|
-
translated = this.translate(groupPositions[i]);
|
|
484
|
-
if (lastTranslated) {
|
|
485
|
-
distances[i] = lastTranslated - translated;
|
|
486
|
-
}
|
|
487
|
-
translatedArr[i] = lastTranslated = translated;
|
|
488
|
-
}
|
|
489
|
-
distances.sort();
|
|
490
|
-
medianDistance = distances[Math.floor(distances.length / 2)];
|
|
491
|
-
if (medianDistance < tickPixelIntervalOption * 0.6) {
|
|
492
|
-
medianDistance = null;
|
|
493
|
-
}
|
|
494
|
-
// Now loop over again and remove ticks where needed
|
|
495
|
-
i = groupPositions[length_1 - 1] > max ? length_1 - 1 : length_1; // #817
|
|
496
|
-
lastTranslated = void 0;
|
|
497
|
-
while (i--) {
|
|
498
|
-
translated = translatedArr[i];
|
|
499
|
-
distance = Math.abs(lastTranslated - translated);
|
|
500
|
-
// #4175 - when axis is reversed, the distance, is negative
|
|
501
|
-
// but tickPixelIntervalOption positive, so we need to
|
|
502
|
-
// compare the same values
|
|
503
|
-
// Remove ticks that are closer than 0.6 times the pixel
|
|
504
|
-
// interval from the one to the right, but not if it is
|
|
505
|
-
// close to the median distance (#748).
|
|
506
|
-
if (lastTranslated &&
|
|
507
|
-
distance < tickPixelIntervalOption * 0.8 &&
|
|
508
|
-
(medianDistance === null || distance < medianDistance * 0.8)) {
|
|
509
|
-
// Is this a higher ranked position with a normal
|
|
510
|
-
// position to the right?
|
|
511
|
-
if (higherRanks[groupPositions[i]] &&
|
|
512
|
-
!higherRanks[groupPositions[i + 1]]) {
|
|
513
|
-
// Yes: remove the lower ranked neighbour to the
|
|
514
|
-
// right
|
|
515
|
-
itemToRemove = i + 1;
|
|
516
|
-
lastTranslated = translated; // #709
|
|
517
|
-
}
|
|
518
|
-
else {
|
|
519
|
-
// No: remove this one
|
|
520
|
-
itemToRemove = i;
|
|
521
|
-
}
|
|
522
|
-
groupPositions.splice(itemToRemove, 1);
|
|
523
|
-
}
|
|
524
|
-
else {
|
|
525
|
-
lastTranslated = translated;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
return groupPositions;
|
|
530
|
-
};
|
|
531
|
-
/**
|
|
532
|
-
* Translate from linear (internal) to axis value.
|
|
533
|
-
*
|
|
534
|
-
* @private
|
|
535
|
-
* @function Highcharts.Axis#lin2val
|
|
536
|
-
*
|
|
537
|
-
* @param {number} val
|
|
538
|
-
* The linear abstracted value.
|
|
539
|
-
*
|
|
540
|
-
* @param {boolean} [fromIndex]
|
|
541
|
-
* Translate from an index in the ordinal positions rather than a
|
|
542
|
-
* value.
|
|
543
|
-
*
|
|
544
|
-
* @return {number}
|
|
545
|
-
*/
|
|
546
|
-
axisProto.lin2val = function (val, fromIndex) {
|
|
547
|
-
var axis = this, ordinal = axis.ordinal, ordinalPositions = ordinal.positions, ret;
|
|
548
|
-
// the visible range contains only equally spaced values
|
|
549
|
-
if (!ordinalPositions) {
|
|
550
|
-
ret = val;
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
var ordinalSlope = ordinal.slope, ordinalOffset = ordinal.offset, i = ordinalPositions.length - 1, linearEquivalentLeft = void 0, linearEquivalentRight = void 0, distance = void 0;
|
|
554
|
-
// Handle the case where we translate from the index directly,
|
|
555
|
-
// used only when panning an ordinal axis
|
|
556
|
-
if (fromIndex) {
|
|
557
|
-
if (val < 0) { // out of range, in effect panning to the left
|
|
558
|
-
val = ordinalPositions[0];
|
|
559
|
-
}
|
|
560
|
-
else if (val > i) { // out of range, panning to the right
|
|
561
|
-
val = ordinalPositions[i];
|
|
562
|
-
}
|
|
563
|
-
else { // split it up
|
|
564
|
-
i = Math.floor(val);
|
|
565
|
-
distance = val - i; // the decimal
|
|
566
|
-
}
|
|
567
|
-
// Loop down along the ordinal positions. When the linear
|
|
568
|
-
// equivalent of i matches an ordinal position, interpolate
|
|
569
|
-
// between the left and right values.
|
|
570
|
-
}
|
|
571
|
-
else {
|
|
572
|
-
while (i--) {
|
|
573
|
-
linearEquivalentLeft =
|
|
574
|
-
(ordinalSlope * i) + ordinalOffset;
|
|
575
|
-
if (val >= linearEquivalentLeft) {
|
|
576
|
-
linearEquivalentRight =
|
|
577
|
-
(ordinalSlope *
|
|
578
|
-
(i + 1)) +
|
|
579
|
-
ordinalOffset;
|
|
580
|
-
// something between 0 and 1
|
|
581
|
-
distance = (val - linearEquivalentLeft) /
|
|
582
|
-
(linearEquivalentRight - linearEquivalentLeft);
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
// If the index is within the range of the ordinal positions,
|
|
588
|
-
// return the associated or interpolated value. If not, just
|
|
589
|
-
// return the value.
|
|
590
|
-
return (typeof distance !== 'undefined' &&
|
|
591
|
-
typeof ordinalPositions[i] !== 'undefined' ?
|
|
592
|
-
ordinalPositions[i] + (distance ?
|
|
593
|
-
distance *
|
|
594
|
-
(ordinalPositions[i + 1] - ordinalPositions[i]) :
|
|
595
|
-
0) :
|
|
596
|
-
val);
|
|
597
|
-
}
|
|
598
|
-
return ret;
|
|
599
|
-
};
|
|
600
|
-
/**
|
|
601
|
-
* Translate from a linear axis value to the corresponding ordinal axis
|
|
602
|
-
* position. If there are no gaps in the ordinal axis this will be the
|
|
603
|
-
* same. The translated value is the value that the point would have if
|
|
604
|
-
* the axis were linear, using the same min and max.
|
|
605
|
-
*
|
|
606
|
-
* @private
|
|
607
|
-
* @function Highcharts.Axis#val2lin
|
|
608
|
-
*
|
|
609
|
-
* @param {number} val
|
|
610
|
-
* The axis value.
|
|
611
|
-
*
|
|
612
|
-
* @param {boolean} [toIndex]
|
|
613
|
-
* Whether to return the index in the ordinalPositions or the new value.
|
|
614
|
-
*
|
|
615
|
-
* @return {number}
|
|
616
|
-
*/
|
|
617
|
-
axisProto.val2lin = function (val, toIndex) {
|
|
618
|
-
var axis = this, ordinal = axis.ordinal, ordinalPositions = ordinal.positions, ret;
|
|
619
|
-
if (!ordinalPositions) {
|
|
620
|
-
ret = val;
|
|
621
|
-
}
|
|
622
|
-
else {
|
|
623
|
-
var ordinalLength = ordinalPositions.length, i = void 0, distance = void 0, ordinalIndex = void 0;
|
|
624
|
-
// first look for an exact match in the ordinalpositions array
|
|
625
|
-
i = ordinalLength;
|
|
626
|
-
while (i--) {
|
|
627
|
-
if (ordinalPositions[i] === val) {
|
|
628
|
-
ordinalIndex = i;
|
|
629
|
-
break;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
// if that failed, find the intermediate position between the
|
|
633
|
-
// two nearest values
|
|
634
|
-
i = ordinalLength - 1;
|
|
635
|
-
while (i--) {
|
|
636
|
-
if (val > ordinalPositions[i] || i === 0) { // interpolate
|
|
637
|
-
// something between 0 and 1
|
|
638
|
-
distance = (val - ordinalPositions[i]) /
|
|
639
|
-
(ordinalPositions[i + 1] - ordinalPositions[i]);
|
|
640
|
-
ordinalIndex = i + distance;
|
|
641
|
-
break;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
ret = toIndex ?
|
|
645
|
-
ordinalIndex :
|
|
646
|
-
ordinal.slope *
|
|
647
|
-
(ordinalIndex || 0) +
|
|
648
|
-
ordinal.offset;
|
|
649
|
-
}
|
|
650
|
-
return ret;
|
|
651
|
-
};
|
|
652
|
-
// Record this to prevent overwriting by broken-axis module (#5979)
|
|
653
|
-
axisProto.ordinal2lin = axisProto.val2lin;
|
|
654
|
-
/* eslint-disable no-invalid-this */
|
|
655
|
-
addEvent(AxisClass, 'afterInit', function () {
|
|
656
|
-
var axis = this;
|
|
657
|
-
if (!axis.ordinal) {
|
|
658
|
-
axis.ordinal = new OrdinalAxis.Composition(axis);
|
|
659
|
-
}
|
|
660
|
-
});
|
|
661
|
-
addEvent(AxisClass, 'foundExtremes', function () {
|
|
662
|
-
var axis = this;
|
|
663
|
-
if (axis.isXAxis &&
|
|
664
|
-
defined(axis.options.overscroll) &&
|
|
665
|
-
axis.max === axis.dataMax &&
|
|
666
|
-
(
|
|
667
|
-
// Panning is an execption. We don't want to apply
|
|
668
|
-
// overscroll when panning over the dataMax
|
|
669
|
-
!axis.chart.mouseIsDown ||
|
|
670
|
-
axis.isInternal) && (
|
|
671
|
-
// Scrollbar buttons are the other execption:
|
|
672
|
-
!axis.eventArgs ||
|
|
673
|
-
axis.eventArgs && axis.eventArgs.trigger !== 'navigator')) {
|
|
674
|
-
axis.max += axis.options.overscroll;
|
|
675
|
-
// Live data and buttons require translation for the min:
|
|
676
|
-
if (!axis.isInternal && defined(axis.userMin)) {
|
|
677
|
-
axis.min += axis.options.overscroll;
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
});
|
|
681
|
-
// For ordinal axis, that loads data async, redraw axis after data is
|
|
682
|
-
// loaded. If we don't do that, axis will have the same extremes as
|
|
683
|
-
// previously, but ordinal positions won't be calculated. See #10290
|
|
684
|
-
addEvent(AxisClass, 'afterSetScale', function () {
|
|
685
|
-
var axis = this;
|
|
686
|
-
if (axis.horiz && !axis.isDirty) {
|
|
687
|
-
axis.isDirty = axis.isOrdinal &&
|
|
688
|
-
axis.chart.navigator &&
|
|
689
|
-
!axis.chart.navigator.adaptToUpdatedData;
|
|
690
|
-
}
|
|
691
|
-
});
|
|
692
|
-
addEvent(AxisClass, 'initialAxisTranslation', function () {
|
|
693
|
-
var axis = this;
|
|
694
|
-
if (axis.ordinal) {
|
|
695
|
-
axis.ordinal.beforeSetTickPositions();
|
|
696
|
-
axis.tickInterval = axis.ordinal.postProcessTickInterval(axis.tickInterval);
|
|
697
|
-
}
|
|
698
|
-
});
|
|
699
|
-
// Extending the Chart.pan method for ordinal axes
|
|
700
|
-
addEvent(ChartClass, 'pan', function (e) {
|
|
701
|
-
var chart = this, xAxis = chart.xAxis[0], overscroll = xAxis.options.overscroll, chartX = e.originalEvent.chartX, panning = chart.options.chart.panning, runBase = false;
|
|
702
|
-
if (panning &&
|
|
703
|
-
panning.type !== 'y' &&
|
|
704
|
-
xAxis.options.ordinal &&
|
|
705
|
-
xAxis.series.length) {
|
|
706
|
-
var mouseDownX = chart.mouseDownX, extremes = xAxis.getExtremes(), dataMax = extremes.dataMax, min = extremes.min, max = extremes.max, trimmedRange = void 0, hoverPoints = chart.hoverPoints, closestPointRange = (xAxis.closestPointRange ||
|
|
707
|
-
(xAxis.ordinal && xAxis.ordinal.overscrollPointsRange)), pointPixelWidth = (xAxis.translationSlope *
|
|
708
|
-
(xAxis.ordinal.slope || closestPointRange)),
|
|
709
|
-
// how many ordinal units did we move?
|
|
710
|
-
movedUnits = (mouseDownX - chartX) / pointPixelWidth,
|
|
711
|
-
// get index of all the chart's points
|
|
712
|
-
extendedAxis = { ordinal: { positions: xAxis.ordinal.getExtendedPositions() } }, ordinalPositions = void 0, searchAxisLeft = void 0, lin2val = xAxis.lin2val, val2lin = xAxis.val2lin, searchAxisRight = void 0;
|
|
713
|
-
// we have an ordinal axis, but the data is equally spaced
|
|
714
|
-
if (!extendedAxis.ordinal.positions) {
|
|
715
|
-
runBase = true;
|
|
716
|
-
}
|
|
717
|
-
else if (Math.abs(movedUnits) > 1) {
|
|
718
|
-
// Remove active points for shared tooltip
|
|
719
|
-
if (hoverPoints) {
|
|
720
|
-
hoverPoints.forEach(function (point) {
|
|
721
|
-
point.setState();
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
if (movedUnits < 0) {
|
|
725
|
-
searchAxisLeft = extendedAxis;
|
|
726
|
-
searchAxisRight = xAxis.ordinal.positions ? xAxis : extendedAxis;
|
|
727
|
-
}
|
|
728
|
-
else {
|
|
729
|
-
searchAxisLeft = xAxis.ordinal.positions ? xAxis : extendedAxis;
|
|
730
|
-
searchAxisRight = extendedAxis;
|
|
731
|
-
}
|
|
732
|
-
// In grouped data series, the last ordinal position
|
|
733
|
-
// represents the grouped data, which is to the left of the
|
|
734
|
-
// real data max. If we don't compensate for this, we will
|
|
735
|
-
// be allowed to pan grouped data series passed the right of
|
|
736
|
-
// the plot area.
|
|
737
|
-
ordinalPositions = searchAxisRight.ordinal.positions;
|
|
738
|
-
if (dataMax >
|
|
739
|
-
ordinalPositions[ordinalPositions.length - 1]) {
|
|
740
|
-
ordinalPositions.push(dataMax);
|
|
741
|
-
}
|
|
742
|
-
// Get the new min and max values by getting the ordinal
|
|
743
|
-
// index for the current extreme, then add the moved units
|
|
744
|
-
// and translate back to values. This happens on the
|
|
745
|
-
// extended ordinal positions if the new position is out of
|
|
746
|
-
// range, else it happens on the current x axis which is
|
|
747
|
-
// smaller and faster.
|
|
748
|
-
chart.fixedRange = max - min;
|
|
749
|
-
trimmedRange = xAxis.navigatorAxis.toFixedRange(null, null, lin2val.apply(searchAxisLeft, [
|
|
750
|
-
val2lin.apply(searchAxisLeft, [min, true]) + movedUnits,
|
|
751
|
-
true // translate from index
|
|
752
|
-
]), lin2val.apply(searchAxisRight, [
|
|
753
|
-
val2lin.apply(searchAxisRight, [max, true]) + movedUnits,
|
|
754
|
-
true // translate from index
|
|
755
|
-
]));
|
|
756
|
-
// Apply it if it is within the available data range
|
|
757
|
-
if (trimmedRange.min >= Math.min(extremes.dataMin, min) &&
|
|
758
|
-
trimmedRange.max <= Math.max(dataMax, max) + overscroll) {
|
|
759
|
-
xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });
|
|
760
|
-
}
|
|
761
|
-
chart.mouseDownX = chartX; // set new reference for next run
|
|
762
|
-
css(chart.container, { cursor: 'move' });
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
else {
|
|
766
|
-
runBase = true;
|
|
767
|
-
}
|
|
768
|
-
// revert to the linear chart.pan version
|
|
769
|
-
if (runBase || (panning && /y/.test(panning.type))) {
|
|
770
|
-
if (overscroll) {
|
|
771
|
-
xAxis.max = xAxis.dataMax + overscroll;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
else {
|
|
775
|
-
e.preventDefault();
|
|
776
|
-
}
|
|
777
|
-
});
|
|
778
|
-
addEvent(SeriesClass, 'updatedData', function () {
|
|
779
|
-
var xAxis = this.xAxis;
|
|
780
|
-
// Destroy the extended ordinal index on updated data
|
|
781
|
-
if (xAxis && xAxis.options.ordinal) {
|
|
782
|
-
delete xAxis.ordinal.index;
|
|
783
|
-
}
|
|
784
|
-
});
|
|
785
|
-
/* eslint-enable no-invalid-this */
|
|
786
|
-
}
|
|
787
|
-
OrdinalAxis.compose = compose;
|
|
989
|
+
OrdinalAxis.Additions = Additions;
|
|
788
990
|
})(OrdinalAxis || (OrdinalAxis = {}));
|
|
789
|
-
|
|
991
|
+
/* *
|
|
992
|
+
*
|
|
993
|
+
* Default Export
|
|
994
|
+
*
|
|
995
|
+
* */
|
|
790
996
|
export default OrdinalAxis;
|