aw-highstock_rails 7.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/Rakefile +10 -0
- data/aw-highstock_rails.gemspec +28 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/aw/highstock_rails.rb +9 -0
- data/lib/aw/highstock_rails/version.rb +5 -0
- data/vendor/assets/javascripts/highstock/css/annotations/popup.css +229 -0
- data/vendor/assets/javascripts/highstock/css/annotations/popup.scss +235 -0
- data/vendor/assets/javascripts/highstock/css/highcharts.css +890 -0
- data/vendor/assets/javascripts/highstock/css/highcharts.scss +788 -0
- data/vendor/assets/javascripts/highstock/css/stocktools/gui.css +268 -0
- data/vendor/assets/javascripts/highstock/css/stocktools/gui.scss +270 -0
- data/vendor/assets/javascripts/highstock/css/themes/dark-unica.css +951 -0
- data/vendor/assets/javascripts/highstock/css/themes/dark-unica.scss +122 -0
- data/vendor/assets/javascripts/highstock/css/themes/grid-light.css +904 -0
- data/vendor/assets/javascripts/highstock/css/themes/grid-light.scss +33 -0
- data/vendor/assets/javascripts/highstock/css/themes/sand-signika.css +920 -0
- data/vendor/assets/javascripts/highstock/css/themes/sand-signika.scss +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/ControlPoint.js +130 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/MockPoint.js +415 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/annotations.src.js +1231 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableCircle.js +92 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableImage.js +101 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableLabel.js +452 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllablePath.js +175 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableRect.js +93 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/controllableMixin.js +411 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/markerMixin.js +214 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/eventEmitterMixin.js +271 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/navigationBindings.js +1283 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/popup.js +1069 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/CrookedLine.js +191 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/ElliottWave.js +76 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Fibonacci.js +247 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/InfinityLine.js +185 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Measure.js +928 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Pitchfork.js +203 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Tunnel.js +242 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/VerticalLine.js +157 -0
- data/vendor/assets/javascripts/highstock/es-modules/error-messages.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/error.js +1 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/acceleration-bands.src.js +199 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/accumulation-distribution.src.js +129 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ao.src.js +206 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/apo.src.js +148 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/aroon-oscillator.src.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/aroon.src.js +173 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/atr.src.js +151 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/bollinger-bands.src.js +209 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/cci.src.js +131 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/chaikin.src.js +167 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/cmf.src.js +246 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/dema.src.js +191 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/dpo.src.js +138 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ema.src.js +166 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ichimoku-kinko-hyo.src.js +850 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/indicators.src.js +425 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/keltner-channels.src.js +193 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/macd.src.js +417 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/mfi.src.js +198 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/momentum.src.js +119 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/natr.src.js +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/pivot-points.src.js +360 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ppo.src.js +152 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/price-channel.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/price-envelopes.src.js +251 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/psar.src.js +307 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/regressions.src.js +427 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/roc.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/rsi.src.js +163 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/stochastic.src.js +193 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/supertrend.src.js +544 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/tema.src.js +247 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/trix.src.js +96 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/volume-by-price.src.js +671 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/vwap.src.js +189 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/williams-r.src.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/wma.src.js +146 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/zigzag.src.js +221 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highcharts-3d.src.js +17 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highcharts-more.src.js +22 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highstock.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/acceleration-bands.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/accumulation-distribution.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ao.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/apo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/aroon-oscillator.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/aroon.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/atr.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/bollinger-bands.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/cci.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/chaikin.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/cmf.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/dema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/dpo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/indicators-all.src.js +49 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/indicators.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/keltner-channels.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/macd.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/mfi.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/momentum.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/natr.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/pivot-points.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ppo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/price-channel.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/price-envelopes.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/psar.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/regressions.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/roc.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/rsi.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/stochastic.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/supertrend.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/tema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/trix.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/volume-by-price.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/vwap.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/williams-r.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/wma.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/zigzag.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/accessibility.src.js +13 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/annotations-advanced.src.js +20 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/annotations.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/arrow-symbols.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/boost-canvas.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/boost.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/bullet.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/current-date-indicator.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/cylinder.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/data.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/datagrouping.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/debugger.src.js +13 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/dependency-wheel.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/drag-panes.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/draggable-points.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/drilldown.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/export-data.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/exporting.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/full-screen.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/funnel.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/grid-axis.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/heatmap.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/histogram-bellcurve.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/item-series.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/networkgraph.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/no-data-to-display.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/offline-exporting.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/oldie-polyfills.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/oldie.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/overlapping-datalabels.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/parallel-coordinates.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pareto.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pathfinder.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pattern-fill.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/price-indicator.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sankey.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/series-label.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/solid-gauge.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sonification.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/static-scale.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/stock-tools.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/stock.src.js +19 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/streamgraph.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sunburst.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/tilemap.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/timeline.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/treegrid.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/treemap.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/variable-pie.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/variwide.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/vector.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/venn.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/windbarb.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/wordcloud.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/xrange.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/avocado.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/avocado.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-blue.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-green.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-unica.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/gray.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/grid-light.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/grid.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sand-signika.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/skies.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sunset.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sunset.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/ajax.js +123 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/centered-series.js +116 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/derived-series.js +150 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/download-url.js +103 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/draw-point.js +51 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/geometry-circles.js +300 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/geometry.js +50 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/indicator-required.js +49 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/multipe-lines.js +223 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/navigation.js +59 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/nodes.js +76 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/on-series.js +167 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/polygon.js +293 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/reduce-array.js +53 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/tree-series.js +256 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/a11y-i18n.src.js +524 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/annotations-legacy.src.js +1951 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/bellcurve.src.js +173 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/boost-canvas.src.js +732 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/boost.src.js +3730 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/bullet.src.js +361 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/cylinder.src.js +389 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/data.src.js +2417 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/debugger.src.js +109 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/dependency-wheel.src.js +199 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/drag-panes.src.js +624 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/draggable-points.src.js +2625 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/drilldown.src.js +1300 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/export-data.src.js +983 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/exporting.src.js +2149 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/full-screen.src.js +40 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/funnel.src.js +552 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/histogram.src.js +229 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/item-series.src.js +150 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/keyboard-navigation.src.js +1606 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/QuadTree.js +175 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/layouts.js +506 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/networkgraph.src.js +740 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/no-data-to-display.src.js +260 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/offline-exporting.src.js +710 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/oldie-polyfills.src.js +121 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/oldie.src.js +1556 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/overlapping-datalabels.src.js +250 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/parallel-coordinates.src.js +492 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/pareto.src.js +152 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/pattern-fill.src.js +607 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/price-indicator.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sankey.src.js +809 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/screen-reader.src.js +954 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/series-label.src.js +1042 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/solid-gauge.src.js +486 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Earcon.js +184 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Instrument.js +582 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Timeline.js +702 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/chartSonify.js +1026 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/instrumentDefinitions.js +37 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/musicalFrequencies.js +113 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/pointSonify.js +385 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/sonification.js +107 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/utilities.js +178 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/static-scale.src.js +88 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/stock-tools-bindings.js +1950 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/stock-tools-gui.js +1458 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/streamgraph.src.js +132 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sunburst.src.js +1041 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/tilemap.src.js +769 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/timeline.src.js +750 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/treemap.src.js +1803 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/variable-pie.src.js +459 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/variwide.src.js +350 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/vector.src.js +354 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/venn.src.js +1192 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/windbarb.src.js +380 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/wordcloud.src.js +1103 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/xrange.src.js +761 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Axis.js +669 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Chart.js +1753 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Column.js +437 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Math.js +206 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Pie.js +207 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/SVGRenderer.js +1002 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Scatter.js +154 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Series.js +73 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/VMLRenderer.js +62 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/ArrowSymbols.js +198 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/CurrentDateIndicator.js +100 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GanttChart.js +140 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GanttSeries.js +415 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GridAxis.js +961 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/Pathfinder.js +1298 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/PathfinderAlgorithms.js +816 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/Tree.js +158 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/TreeGrid.js +1003 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/ColorAxis.js +1103 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/ColorSeriesMixin.js +138 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/GeoJSON.js +435 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/HeatmapSeries.js +474 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/Map.js +477 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapAxis.js +124 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapBubbleSeries.js +274 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapLineSeries.js +143 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapNavigation.js +357 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapPointSeries.js +187 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapPointer.js +132 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapSeries.js +1294 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/AreaRangeSeries.js +725 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/AreaSplineRangeSeries.js +98 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BoxPlotSeries.js +617 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BubbleLegend.js +1167 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BubbleSeries.js +661 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ColumnPyramidSeries.js +288 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ColumnRangeSeries.js +278 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ErrorBarSeries.js +172 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/GaugeSeries.js +618 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/PackedBubbleSeries.js +567 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/Pane.js +399 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/Polar.js +634 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/PolygonSeries.js +151 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/RadialAxis.js +685 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/WaterfallSeries.js +765 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts.js +684 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/AreaSeries.js +578 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/AreaSplineSeries.js +122 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Axis.js +6453 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/BarSeries.js +153 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/CandlestickSeries.js +358 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Chart.js +2307 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Color.js +301 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ColumnSeries.js +1125 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DataGrouping.js +1115 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DataLabels.js +1431 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DateTimeAxis.js +134 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Dynamics.js +1301 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/FlagsSeries.js +739 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Globals.js +75 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Html.js +539 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Interaction.js +1299 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Legend.js +1411 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/LogarithmicAxis.js +168 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/MSPointer.js +176 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Navigator.js +2486 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/OHLCSeries.js +412 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Options.js +3732 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/OrdinalAxis.js +962 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PieSeries.js +1328 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PlotBandSeries.experimental.js +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PlotLineOrBand.js +1061 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Point.js +681 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Pointer.js +1332 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/RangeSelector.js +2063 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Responsive.js +295 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ScatterSeries.js +278 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ScrollablePlotArea.js +266 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Scrollbar.js +1134 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Series.js +5864 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/SplineSeries.js +267 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Stacking.js +604 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/StockChart.js +951 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/SvgRenderer.js +5109 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Tick.js +746 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Time.js +881 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Tooltip.js +1318 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/TouchPointer.js +404 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Utilities.js +2751 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/avocado.js +37 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-blue.js +259 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-green.js +261 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-unica.js +220 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/gray.js +267 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/grid-light.js +81 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/grid.js +110 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/sand-signika.js +111 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/skies.js +100 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/sunset.js +36 -0
- data/vendor/assets/javascripts/highstock/highcharts-3d.js +85 -0
- data/vendor/assets/javascripts/highstock/highcharts-3d.js.map +1 -0
- data/vendor/assets/javascripts/highstock/highcharts-more.js +101 -0
- data/vendor/assets/javascripts/highstock/highcharts-more.js.map +1 -0
- data/vendor/assets/javascripts/highstock/highstock.js +583 -0
- data/vendor/assets/javascripts/highstock/highstock.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.src.js +448 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.src.js +156 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.src.js +233 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.src.js +223 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.src.js +426 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.src.js +423 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.src.js +178 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.src.js +458 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.src.js +158 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.src.js +370 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.src.js +273 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.src.js +266 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.src.js +166 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.src.js +193 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.js +22 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.src.js +877 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.js +117 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.src.js +9389 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.src.js +500 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.src.js +442 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.js +18 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.src.js +444 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.src.js +225 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.src.js +146 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.src.js +101 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.src.js +387 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.src.js +227 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.src.js +450 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.src.js +278 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.src.js +334 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.js +14 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.src.js +454 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.src.js +176 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.src.js +190 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.src.js +494 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.src.js +571 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.js +14 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.src.js +322 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.src.js +171 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.js +21 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.src.js +698 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.src.js +216 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.src.js +207 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.src.js +173 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.src.js +248 -0
- data/vendor/assets/javascripts/highstock/lib/canvg.js +130 -0
- data/vendor/assets/javascripts/highstock/lib/canvg.src.js +3073 -0
- data/vendor/assets/javascripts/highstock/lib/jspdf.js +283 -0
- data/vendor/assets/javascripts/highstock/lib/jspdf.src.js +21627 -0
- data/vendor/assets/javascripts/highstock/lib/rgbcolor.js +17 -0
- data/vendor/assets/javascripts/highstock/lib/rgbcolor.src.js +299 -0
- data/vendor/assets/javascripts/highstock/lib/svg2pdf.js +38 -0
- data/vendor/assets/javascripts/highstock/lib/svg2pdf.src.js +4390 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.js +73 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.src.js +3103 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.js +132 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.src.js +8230 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.js +94 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.src.js +6001 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.src.js +225 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.src.js +756 -0
- data/vendor/assets/javascripts/highstock/modules/boost.js +65 -0
- data/vendor/assets/javascripts/highstock/modules/boost.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/boost.src.js +3752 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.src.js +388 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.src.js +127 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.src.js +413 -0
- data/vendor/assets/javascripts/highstock/modules/data.js +37 -0
- data/vendor/assets/javascripts/highstock/modules/data.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/data.src.js +2565 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.js +25 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.src.js +1140 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.js +28 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.src.js +267 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.src.js +301 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.js +18 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.src.js +649 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.js +40 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.src.js +2650 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.js +29 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.src.js +1321 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.js +27 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.src.js +1234 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.js +35 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.src.js +2233 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.src.js +68 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.src.js +576 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.src.js +988 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.js +28 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.src.js +1731 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.js +16 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.src.js +570 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.src.js +176 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.js +31 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.src.js +1348 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.src.js +285 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.src.js +838 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.src.js +150 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.js +35 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.src.js +1582 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.js +9 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.src.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.js +18 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.src.js +517 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.src.js +327 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.js +34 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.src.js +2336 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.js +21 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.src.js +634 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.src.js +176 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.src.js +911 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.src.js +1065 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.src.js +510 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.js +53 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.src.js +3341 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.js +12 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.src.js +114 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.js +65 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.src.js +3437 -0
- data/vendor/assets/javascripts/highstock/modules/stock.js +151 -0
- data/vendor/assets/javascripts/highstock/modules/stock.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/stock.src.js +10907 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.js +10 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.src.js +158 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.js +52 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.src.js +3174 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.js +26 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.src.js +1402 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.src.js +778 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.js +50 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.src.js +2917 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.js +39 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.src.js +2083 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.js +16 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.src.js +485 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.src.js +376 -0
- data/vendor/assets/javascripts/highstock/modules/vector.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/vector.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/vector.src.js +381 -0
- data/vendor/assets/javascripts/highstock/modules/venn.js +30 -0
- data/vendor/assets/javascripts/highstock/modules/venn.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/venn.src.js +1624 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.js +17 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.src.js +574 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.js +25 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.src.js +1475 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.js +20 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.src.js +788 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.js +9 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.src.js +63 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.src.js +285 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.src.js +287 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.js +14 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.src.js +246 -0
- data/vendor/assets/javascripts/highstock/themes/gray.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/gray.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/gray.src.js +293 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.src.js +107 -0
- data/vendor/assets/javascripts/highstock/themes/grid.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/grid.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/grid.src.js +136 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.src.js +137 -0
- data/vendor/assets/javascripts/highstock/themes/skies.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/skies.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/skies.src.js +126 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.js +9 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.src.js +62 -0
- metadata +781 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
/*
|
2
|
+
Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
|
4
|
+
Pareto series type for Highcharts
|
5
|
+
|
6
|
+
(c) 2010-2019 Sebastian Bochan
|
7
|
+
|
8
|
+
License: www.highcharts.com/license
|
9
|
+
*/
|
10
|
+
(function(a){"object"===typeof module&&module.exports?(a["default"]=a,module.exports=a):"function"===typeof define&&define.amd?define(function(){return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){var e=function(f){var a=f.Series,d=f.addEvent;return{init:function(){a.prototype.init.apply(this,arguments);this.initialised=!1;this.baseSeries=null;this.eventRemovers=[];this.addEvents()},setDerivedData:f.noop,setBaseSeries:function(){var b=this.chart,c=this.options.baseSeries;
|
11
|
+
this.baseSeries=c&&(b.series[c]||b.get(c))||null},addEvents:function(){var b=this,c;c=d(this.chart,"afterLinkSeries",function(){b.setBaseSeries();b.baseSeries&&!b.initialised&&(b.setDerivedData(),b.addBaseSeriesEvents(),b.initialised=!0)});this.eventRemovers.push(c)},addBaseSeriesEvents:function(){var b=this,c,a;c=d(b.baseSeries,"updatedData",function(){b.setDerivedData()});a=d(b.baseSeries,"destroy",function(){b.baseSeries=null;b.initialised=!1});b.eventRemovers.push(c,a)},destroy:function(){this.eventRemovers.forEach(function(b){b()});
|
12
|
+
a.prototype.destroy.apply(this,arguments)}}}(a);(function(a,e){var d=a.correctFloat,b=a.seriesType;a=a.merge;b("pareto","line",{zIndex:3},a(e,{setDerivedData:function(){if(1<this.baseSeries.yData.length){var a=this.baseSeries.xData,b=this.baseSeries.yData,d=this.sumPointsPercents(b,a,null,!0);this.setData(this.sumPointsPercents(b,a,d,!1),!1)}},sumPointsPercents:function(a,b,f,e){var c=0,h=0,k=[],g;a.forEach(function(a,l){null!==a&&(e?c+=a:(g=a/f*100,k.push([b[l],d(h+g)]),h+=g))});return e?c:k}}))})(a,
|
13
|
+
e)});
|
14
|
+
//# sourceMappingURL=pareto.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"pareto.js.map","lineCount":13,"mappings":"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","sources":["pareto.src.js"],"names":["factory","module","exports","define","amd","Highcharts","undefined","derivedSeriesMixin","H","Series","addEvent","init","prototype","apply","arguments","initialised","baseSeries","eventRemovers","addEvents","setDerivedData","noop","setBaseSeries","chart","baseSeriesOptions","options","series","get","derivedSeries","chartSeriesLinked","addBaseSeriesEvents","push","updatedDataRemover","destroyRemover","destroy","forEach","remover","correctFloat","seriesType","merge","zIndex","yData","length","xValues","xData","yValues","sum","sumPointsPercents","setData","isSum","sumY","sumPercent","percentPoints","percentPoint","point","i"]}
|
@@ -0,0 +1,327 @@
|
|
1
|
+
/**
|
2
|
+
* @license Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
*
|
4
|
+
* Pareto series type for Highcharts
|
5
|
+
*
|
6
|
+
* (c) 2010-2019 Sebastian Bochan
|
7
|
+
*
|
8
|
+
* License: www.highcharts.com/license
|
9
|
+
*/
|
10
|
+
'use strict';
|
11
|
+
(function (factory) {
|
12
|
+
if (typeof module === 'object' && module.exports) {
|
13
|
+
factory['default'] = factory;
|
14
|
+
module.exports = factory;
|
15
|
+
} else if (typeof define === 'function' && define.amd) {
|
16
|
+
define(function () {
|
17
|
+
return factory;
|
18
|
+
});
|
19
|
+
} else {
|
20
|
+
factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
|
21
|
+
}
|
22
|
+
}(function (Highcharts) {
|
23
|
+
var derivedSeriesMixin = (function (H) {
|
24
|
+
|
25
|
+
|
26
|
+
var Series = H.Series,
|
27
|
+
addEvent = H.addEvent,
|
28
|
+
noop = H.noop;
|
29
|
+
|
30
|
+
|
31
|
+
/* ************************************************************************** *
|
32
|
+
*
|
33
|
+
* DERIVED SERIES MIXIN
|
34
|
+
*
|
35
|
+
* ************************************************************************** */
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Provides methods for auto setting/updating series data based on the based
|
39
|
+
* series data.
|
40
|
+
*
|
41
|
+
* @private
|
42
|
+
* @mixin derivedSeriesMixin
|
43
|
+
*/
|
44
|
+
var derivedSeriesMixin = {
|
45
|
+
/**
|
46
|
+
* Initialise series
|
47
|
+
*
|
48
|
+
* @private
|
49
|
+
* @function derivedSeriesMixin.init
|
50
|
+
*/
|
51
|
+
init: function () {
|
52
|
+
Series.prototype.init.apply(this, arguments);
|
53
|
+
|
54
|
+
this.initialised = false;
|
55
|
+
this.baseSeries = null;
|
56
|
+
this.eventRemovers = [];
|
57
|
+
|
58
|
+
this.addEvents();
|
59
|
+
},
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Method to be implemented - inside the method the series has already
|
63
|
+
* access to the base series via m `this.baseSeries` and the bases data is
|
64
|
+
* initialised. It should return data in the format accepted by
|
65
|
+
* `Series.setData()` method
|
66
|
+
*
|
67
|
+
* @private
|
68
|
+
* @function derivedSeriesMixin.setDerivedData
|
69
|
+
*
|
70
|
+
* @return {Array<*>}
|
71
|
+
* An array of data
|
72
|
+
*/
|
73
|
+
setDerivedData: noop,
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Sets base series for the series
|
77
|
+
*
|
78
|
+
* @private
|
79
|
+
* @function derivedSeriesMixin.setBaseSeries
|
80
|
+
*/
|
81
|
+
setBaseSeries: function () {
|
82
|
+
var chart = this.chart,
|
83
|
+
baseSeriesOptions = this.options.baseSeries,
|
84
|
+
baseSeries =
|
85
|
+
baseSeriesOptions &&
|
86
|
+
(chart.series[baseSeriesOptions] || chart.get(baseSeriesOptions));
|
87
|
+
|
88
|
+
this.baseSeries = baseSeries || null;
|
89
|
+
},
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Adds events for the series
|
93
|
+
*
|
94
|
+
* @private
|
95
|
+
* @function derivedSeriesMixin.addEvents
|
96
|
+
*/
|
97
|
+
addEvents: function () {
|
98
|
+
var derivedSeries = this,
|
99
|
+
chartSeriesLinked;
|
100
|
+
|
101
|
+
chartSeriesLinked = addEvent(
|
102
|
+
this.chart,
|
103
|
+
'afterLinkSeries',
|
104
|
+
function () {
|
105
|
+
derivedSeries.setBaseSeries();
|
106
|
+
|
107
|
+
if (derivedSeries.baseSeries && !derivedSeries.initialised) {
|
108
|
+
derivedSeries.setDerivedData();
|
109
|
+
derivedSeries.addBaseSeriesEvents();
|
110
|
+
derivedSeries.initialised = true;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
);
|
114
|
+
|
115
|
+
this.eventRemovers.push(
|
116
|
+
chartSeriesLinked
|
117
|
+
);
|
118
|
+
},
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Adds events to the base series - it required for recalculating the data
|
122
|
+
* in the series if the base series is updated / removed / etc.
|
123
|
+
*
|
124
|
+
* @private
|
125
|
+
* @function derivedSeriesMixin.addBaseSeriesEvents
|
126
|
+
*/
|
127
|
+
addBaseSeriesEvents: function () {
|
128
|
+
var derivedSeries = this,
|
129
|
+
updatedDataRemover,
|
130
|
+
destroyRemover;
|
131
|
+
|
132
|
+
updatedDataRemover = addEvent(
|
133
|
+
derivedSeries.baseSeries,
|
134
|
+
'updatedData',
|
135
|
+
function () {
|
136
|
+
derivedSeries.setDerivedData();
|
137
|
+
}
|
138
|
+
);
|
139
|
+
|
140
|
+
destroyRemover = addEvent(
|
141
|
+
derivedSeries.baseSeries,
|
142
|
+
'destroy',
|
143
|
+
function () {
|
144
|
+
derivedSeries.baseSeries = null;
|
145
|
+
derivedSeries.initialised = false;
|
146
|
+
}
|
147
|
+
);
|
148
|
+
|
149
|
+
derivedSeries.eventRemovers.push(
|
150
|
+
updatedDataRemover,
|
151
|
+
destroyRemover
|
152
|
+
);
|
153
|
+
},
|
154
|
+
|
155
|
+
/**
|
156
|
+
* Destroys the series
|
157
|
+
*
|
158
|
+
* @private
|
159
|
+
* @function derivedSeriesMixin.destroy
|
160
|
+
*/
|
161
|
+
destroy: function () {
|
162
|
+
this.eventRemovers.forEach(function (remover) {
|
163
|
+
remover();
|
164
|
+
});
|
165
|
+
|
166
|
+
Series.prototype.destroy.apply(this, arguments);
|
167
|
+
}
|
168
|
+
};
|
169
|
+
|
170
|
+
|
171
|
+
return derivedSeriesMixin;
|
172
|
+
}(Highcharts));
|
173
|
+
(function (H, derivedSeriesMixin) {
|
174
|
+
/* *
|
175
|
+
* (c) 2010-2017 Sebastian Bochan
|
176
|
+
*
|
177
|
+
* License: www.highcharts.com/license
|
178
|
+
*/
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
var correctFloat = H.correctFloat,
|
183
|
+
seriesType = H.seriesType,
|
184
|
+
merge = H.merge;
|
185
|
+
|
186
|
+
|
187
|
+
/**
|
188
|
+
* The pareto series type.
|
189
|
+
*
|
190
|
+
* @private
|
191
|
+
* @class
|
192
|
+
* @name Highcharts.seriesTypes.pareto
|
193
|
+
*
|
194
|
+
* @augments Highcharts.Series
|
195
|
+
*/
|
196
|
+
seriesType('pareto', 'line'
|
197
|
+
|
198
|
+
/**
|
199
|
+
* A pareto diagram is a type of chart that contains both bars and a line graph,
|
200
|
+
* where individual values are represented in descending order by bars, and the
|
201
|
+
* cumulative total is represented by the line.
|
202
|
+
*
|
203
|
+
* @sample {highcharts} highcharts/demo/pareto/
|
204
|
+
* Pareto diagram
|
205
|
+
*
|
206
|
+
* @extends plotOptions.line
|
207
|
+
* @since 6.0.0
|
208
|
+
* @product highcharts
|
209
|
+
* @excluding allAreas, boostThreshold, borderColor, borderRadius,
|
210
|
+
* borderWidth, crisp, colorAxis, depth, data, edgeColor,
|
211
|
+
* edgeWidth, findNearestPointBy, gapSize, gapUnit, grouping,
|
212
|
+
* groupPadding, groupZPadding, maxPointWidth, keys,
|
213
|
+
* negativeColor, pointInterval, pointIntervalUnit, pointPadding,
|
214
|
+
* pointPlacement, pointRange, pointStart, pointWidth, shadow,
|
215
|
+
* step, softThreshold, stacking, threshold, zoneAxis, zones
|
216
|
+
* @optionparent plotOptions.pareto
|
217
|
+
*/
|
218
|
+
, {
|
219
|
+
/**
|
220
|
+
* Higher zIndex than column series to draw line above shapes.
|
221
|
+
*/
|
222
|
+
zIndex: 3
|
223
|
+
}, merge(derivedSeriesMixin, {
|
224
|
+
/**
|
225
|
+
* Calculate sum and return percent points.
|
226
|
+
*
|
227
|
+
* @private
|
228
|
+
* @function Highcharts.Series#setDerivedData
|
229
|
+
*
|
230
|
+
* @return {Array<Array<number,number>>}
|
231
|
+
* Returns array of points [x,y]
|
232
|
+
*/
|
233
|
+
setDerivedData: function () {
|
234
|
+
if (this.baseSeries.yData.length > 1) {
|
235
|
+
var xValues = this.baseSeries.xData,
|
236
|
+
yValues = this.baseSeries.yData,
|
237
|
+
sum = this.sumPointsPercents(yValues, xValues, null, true);
|
238
|
+
|
239
|
+
this.setData(
|
240
|
+
this.sumPointsPercents(yValues, xValues, sum, false),
|
241
|
+
false
|
242
|
+
);
|
243
|
+
}
|
244
|
+
},
|
245
|
+
/**
|
246
|
+
* Calculate y sum and each percent point.
|
247
|
+
*
|
248
|
+
* @private
|
249
|
+
* @function Highcharts.Series#sumPointsPercents
|
250
|
+
*
|
251
|
+
* @param {Array<number>} yValues
|
252
|
+
* Y values
|
253
|
+
*
|
254
|
+
* @param {Array<number>} xValues
|
255
|
+
* X values
|
256
|
+
*
|
257
|
+
* @param {number} sum
|
258
|
+
* Sum of all y values
|
259
|
+
*
|
260
|
+
* @param {boolean} [isSum]
|
261
|
+
* Declares if calculate sum of all points
|
262
|
+
*
|
263
|
+
* @return {number|Array<number,number>}
|
264
|
+
* Returns sum of points or array of points [x,sum]
|
265
|
+
*/
|
266
|
+
sumPointsPercents: function (yValues, xValues, sum, isSum) {
|
267
|
+
var sumY = 0,
|
268
|
+
sumPercent = 0,
|
269
|
+
percentPoints = [],
|
270
|
+
percentPoint;
|
271
|
+
|
272
|
+
yValues.forEach(function (point, i) {
|
273
|
+
if (point !== null) {
|
274
|
+
if (isSum) {
|
275
|
+
sumY += point;
|
276
|
+
} else {
|
277
|
+
percentPoint = (point / sum) * 100;
|
278
|
+
percentPoints.push([
|
279
|
+
xValues[i],
|
280
|
+
correctFloat(sumPercent + percentPoint)
|
281
|
+
]);
|
282
|
+
sumPercent += percentPoint;
|
283
|
+
}
|
284
|
+
}
|
285
|
+
});
|
286
|
+
|
287
|
+
return isSum ? sumY : percentPoints;
|
288
|
+
}
|
289
|
+
}));
|
290
|
+
|
291
|
+
/**
|
292
|
+
* A `pareto` series. If the [type](#series.pareto.type) option is not
|
293
|
+
* specified, it is inherited from [chart.type](#chart.type).
|
294
|
+
*
|
295
|
+
* @extends series,plotOptions.pareto
|
296
|
+
* @since 6.0.0
|
297
|
+
* @product highcharts
|
298
|
+
* @excluding data, dataParser, dataURL
|
299
|
+
* @apioption series.pareto
|
300
|
+
*/
|
301
|
+
|
302
|
+
/**
|
303
|
+
* An integer identifying the index to use for the base series, or a string
|
304
|
+
* representing the id of the series.
|
305
|
+
*
|
306
|
+
* @type {number|string}
|
307
|
+
* @default undefined
|
308
|
+
* @apioption series.pareto.baseSeries
|
309
|
+
*/
|
310
|
+
|
311
|
+
/**
|
312
|
+
* An array of data points for the series. For the `pareto` series type,
|
313
|
+
* points are calculated dynamically.
|
314
|
+
*
|
315
|
+
* @type {Array<Array<number|string>|*>}
|
316
|
+
* @extends series.column.data
|
317
|
+
* @since 6.0.0
|
318
|
+
* @product highcharts
|
319
|
+
* @apioption series.pareto.data
|
320
|
+
*/
|
321
|
+
|
322
|
+
}(Highcharts, derivedSeriesMixin));
|
323
|
+
return (function () {
|
324
|
+
|
325
|
+
|
326
|
+
}());
|
327
|
+
}));
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
Pathfinder
|
4
|
+
|
5
|
+
(c) 2016-2019 ystein Moseng
|
6
|
+
|
7
|
+
License: www.highcharts.com/license
|
8
|
+
*/
|
9
|
+
(function(m){"object"===typeof module&&module.exports?(m["default"]=m,module.exports=m):"function"===typeof define&&define.amd?define(function(){return m}):m("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(m){var H=function(h){function w(e,c,g){g=g||0;var h=e.length-1;c-=1e-7;for(var l,p;g<=h;)if(l=h+g>>1,p=c-e[l].xMin,0<p)g=l+1;else if(0>p)h=l-1;else return l;return 0<g?g-1:0}function l(e,c){for(var g=w(e,c.x+1)+1;g--;){var h;if(h=e[g].xMax>=c.x)h=e[g],h=c.x<=h.xMax&&c.x>=h.xMin&&c.y<=
|
10
|
+
h.yMax&&c.y>=h.yMin;if(h)return g}return-1}function x(e){var c=[];if(e.length){c.push("M",e[0].start.x,e[0].start.y);for(var g=0;g<e.length;++g)c.push("L",e[g].end.x,e[g].end.y)}return c}function q(e,c){e.yMin=m(e.yMin,c.yMin);e.yMax=u(e.yMax,c.yMax);e.xMin=m(e.xMin,c.xMin);e.xMax=u(e.xMax,c.xMax)}var u=Math.min,m=Math.max,r=Math.abs,z=h.pick;return{straight:function(e,c){return{path:["M",e.x,e.y,"L",c.x,c.y],obstacles:[{start:e,end:c}]}},simpleConnect:h.extend(function(e,c,g){function h(b,a,d,f,
|
11
|
+
k){b={x:b.x,y:b.y};b[a]=d[f||a]+(k||0);return b}function w(b,a,d){var f=r(a[d]-b[d+"Min"])>r(a[d]-b[d+"Max"]);return h(a,d,b,d+(f?"Max":"Min"),f?1:-1)}var p=[],a,b=z(g.startDirectionX,r(c.x-e.x)>r(c.y-e.y))?"x":"y",d=g.chartObstacles,k=l(d,e);g=l(d,c);var f;-1<g?(a=d[g],g=w(a,c,b),a={start:g,end:c},f=g):f=c;-1<k&&(d=d[k],g=w(d,e,b),p.push({start:e,end:g}),g[b]>e[b]===g[b]>f[b]&&(b="y"===b?"x":"y",c=e[b]<c[b],p.push({start:g,end:h(g,b,d,b+(c?"Max":"Min"),c?1:-1)}),b="y"===b?"x":"y"));e=p.length?p[p.length-
|
12
|
+
1].end:e;g=h(e,b,f);p.push({start:e,end:g});b=h(g,"y"===b?"x":"y",f);p.push({start:g,end:b});p.push(a);return{path:x(p),obstacles:p}},{requiresObstacles:!0}),fastAvoid:h.extend(function(e,c,g){function h(b,a,d){var f,k,e,g,c,h=b.x<a.x?1:-1;b.x<a.x?(f=b,k=a):(f=a,k=b);b.y<a.y?(g=b,e=a):(g=a,e=b);for(c=0>h?u(w(n,k.x),n.length-1):0;n[c]&&(0<h&&n[c].xMin<=k.x||0>h&&n[c].xMax>=f.x);){if(n[c].xMin<=k.x&&n[c].xMax>=f.x&&n[c].yMin<=e.y&&n[c].yMax>=g.y)return d?{y:b.y,x:b.x<a.x?n[c].xMin-1:n[c].xMax+1,obstacle:n[c]}:
|
13
|
+
{x:b.x,y:b.y<a.y?n[c].yMin-1:n[c].yMax+1,obstacle:n[c]};c+=h}return a}function y(b,a,d,f,k){var c=k.soft,e=k.hard,g=f?"x":"y",v={x:a.x,y:a.y},t={x:a.x,y:a.y};k=b[g+"Max"]>=c[g+"Max"];var c=b[g+"Min"]<=c[g+"Min"],E=b[g+"Max"]>=e[g+"Max"],e=b[g+"Min"]<=e[g+"Min"],n=r(b[g+"Min"]-a[g]),l=r(b[g+"Max"]-a[g]);d=10>r(n-l)?a[g]<d[g]:l<n;t[g]=b[g+"Min"];v[g]=b[g+"Max"];b=h(a,t,f)[g]!==t[g];a=h(a,v,f)[g]!==v[g];d=b?a?d:!0:a?!1:d;d=c?k?d:!0:k?!1:d;return e?E?d:!0:E?!1:d}function p(b,a,d){if(b.x===a.x&&b.y===
|
14
|
+
a.y)return[];var f=d?"x":"y",k,c,e,v,t=g.obstacleOptions.margin;k={soft:{xMin:C,xMax:D,yMin:F,yMax:G},hard:g.hardBounds};c=l(n,b);-1<c?(c=n[c],k=y(c,b,a,d,k),q(c,g.hardBounds),v=d?{y:b.y,x:c[k?"xMax":"xMin"]+(k?1:-1)}:{x:b.x,y:c[k?"yMax":"yMin"]+(k?1:-1)},e=l(n,v),-1<e&&(e=n[e],q(e,g.hardBounds),v[f]=k?m(c[f+"Max"]-t+1,(e[f+"Min"]+c[f+"Max"])/2):u(c[f+"Min"]+t-1,(e[f+"Max"]+c[f+"Min"])/2),b.x===v.x&&b.y===v.y?(A&&(v[f]=k?m(c[f+"Max"],e[f+"Max"])+1:u(c[f+"Min"],e[f+"Min"])-1),A=!A):A=!1),b=[{start:b,
|
15
|
+
end:v}]):(f=h(b,{x:d?a.x:b.x,y:d?b.y:a.y},d),b=[{start:b,end:{x:f.x,y:f.y}}],f[d?"x":"y"]!==a[d?"x":"y"]&&(k=y(f.obstacle,f,a,!d,k),q(f.obstacle,g.hardBounds),k={x:d?f.x:f.obstacle[k?"xMax":"xMin"]+(k?1:-1),y:d?f.obstacle[k?"yMax":"yMin"]+(k?1:-1):f.y},d=!d,b=b.concat(p({x:f.x,y:f.y},k,d))));return b=b.concat(p(b[b.length-1].end,a,!d))}function a(b,a,d){var f=u(b.xMax-a.x,a.x-b.xMin)<u(b.yMax-a.y,a.y-b.yMin);d=y(b,a,d,f,{soft:g.hardBounds,hard:g.hardBounds});return f?{y:a.y,x:b[d?"xMax":"xMin"]+(d?
|
16
|
+
1:-1)}:{x:a.x,y:b[d?"yMax":"yMin"]+(d?1:-1)}}var b=z(g.startDirectionX,r(c.x-e.x)>r(c.y-e.y)),d=b?"x":"y",k,f,v=[],A=!1,t=g.obstacleMetrics,C=u(e.x,c.x)-t.maxWidth-10,D=m(e.x,c.x)+t.maxWidth+10,F=u(e.y,c.y)-t.maxHeight-10,G=m(e.y,c.y)+t.maxHeight+10,n=g.chartObstacles;k=w(n,C);t=w(n,D);n=n.slice(k,t+1);-1<(t=l(n,c))&&(f=a(n[t],c,e),v.push({end:c,start:f}),c=f);for(;-1<(t=l(n,c));)k=0>c[d]-e[d],f={x:c.x,y:c.y},f[d]=n[t][k?d+"Max":d+"Min"]+(k?1:-1),v.push({end:c,start:f}),c=f;e=p(e,c,b);e=e.concat(v.reverse());
|
17
|
+
return{path:x(e),obstacles:e}},{requiresObstacles:!0})}}(m);(function(h){h.SVGRenderer.prototype.symbols.arrow=function(h,l,m,q){return["M",h,l+q/2,"L",h+m,l,"L",h,l+q/2,"L",h+m,l+q]};h.SVGRenderer.prototype.symbols["arrow-half"]=function(m,l,x,q){return h.SVGRenderer.prototype.symbols.arrow(m,l,x/2,q)};h.SVGRenderer.prototype.symbols["triangle-left"]=function(h,l,m,q){return["M",h+m,l,"L",h,l+q/2,"L",h+m,l+q,"Z"]};h.SVGRenderer.prototype.symbols["arrow-filled"]=h.SVGRenderer.prototype.symbols["triangle-left"];
|
18
|
+
h.SVGRenderer.prototype.symbols["triangle-left-half"]=function(m,l,x,q){return h.SVGRenderer.prototype.symbols["triangle-left"](m,l,x/2,q)};h.SVGRenderer.prototype.symbols["arrow-filled-half"]=h.SVGRenderer.prototype.symbols["triangle-left-half"]})(m);(function(h,m){function l(a){var b=a.shapeArgs;return b?{xMin:b.x,xMax:b.x+b.width,yMin:b.y,yMax:b.y+b.height}:(b=a.graphic&&a.graphic.getBBox())?{xMin:a.plotX-b.width/2,xMax:a.plotX+b.width/2,yMin:a.plotY-b.height/2,yMax:a.plotY+b.height/2}:null}function x(a){for(var b=
|
19
|
+
a.length,d=0,k,f,c=[],g=function(b,a,d){d=B(d,10);var f=b.yMax+d>a.yMin-d&&b.yMin-d<a.yMax+d,k=b.xMax+d>a.xMin-d&&b.xMin-d<a.xMax+d,c=f?b.xMin>a.xMax?b.xMin-a.xMax:a.xMin-b.xMax:Infinity,e=k?b.yMin>a.yMax?b.yMin-a.yMax:a.yMin-b.yMax:Infinity;return k&&f?d?g(b,a,Math.floor(d/2)):Infinity:p(c,e)};d<b;++d)for(k=d+1;k<b;++k)f=g(a[d],a[k]),80>f&&c.push(f);c.push(80);return y(Math.floor(c.sort(function(b,a){return b-a})[Math.floor(c.length/10)]/2-1),1)}function q(a,b,d){this.init(a,b,d)}function u(a){this.init(a)}
|
20
|
+
function w(a){if(a.options.pathfinder||a.series.reduce(function(b,a){a.options&&g(!0,a.options.connectors=a.options.connectors||{},a.options.pathfinder);return b||a.options&&a.options.pathfinder},!1))g(!0,a.options.connectors=a.options.connectors||{},a.options.pathfinder),h.error('WARNING: Pathfinder options have been renamed. Use "chart.connectors" or "series.connectors" instead.')}var r=h.defined,z=h.deg2rad,e=h.extend,c=h.addEvent,g=h.merge,B=h.pick,y=Math.max,p=Math.min;e(h.defaultOptions,{connectors:{type:"straight",
|
21
|
+
lineWidth:1,marker:{enabled:!1,align:"center",verticalAlign:"middle",inside:!1,lineWidth:1},startMarker:{symbol:"diamond"},endMarker:{symbol:"arrow-filled"}}});q.prototype={init:function(a,b,d){this.fromPoint=a;this.toPoint=b;this.options=d;this.chart=a.series.chart;this.pathfinder=this.chart.pathfinder},renderPath:function(a,b,d){var k=this.chart,f=k.styledMode,c=k.pathfinder,g=!k.options.chart.forExport&&!1!==d,e=this.graphics&&this.graphics.path;c.group||(c.group=k.renderer.g().addClass("highcharts-pathfinder-group").attr({zIndex:-1}).add(k.seriesGroup));
|
22
|
+
c.group.translate(k.plotLeft,k.plotTop);e&&e.renderer||(e=k.renderer.path().add(c.group),f||e.attr({opacity:0}));e.attr(b);a={d:a};f||(a.opacity=1);e[g?"animate":"attr"](a,d);this.graphics=this.graphics||{};this.graphics.path=e},addMarker:function(a,b,d){var c=this.fromPoint.series.chart,f=c.pathfinder,c=c.renderer,g="start"===a?this.fromPoint:this.toPoint,e=g.getPathfinderAnchorPoint(b),h,l;b.enabled&&(d="start"===a?{x:d[4],y:d[5]}:{x:d[d.length-5],y:d[d.length-4]},d=g.getRadiansToVector(d,e),e=
|
23
|
+
g.getMarkerVector(d,b.radius,e),d=-d/z,b.width&&b.height?(h=b.width,l=b.height):h=l=2*b.radius,this.graphics=this.graphics||{},e={x:e.x-h/2,y:e.y-l/2,width:h,height:l,rotation:d,rotationOriginX:e.x,rotationOriginY:e.y},this.graphics[a]?this.graphics[a].animate(e):(this.graphics[a]=c.symbol(b.symbol).addClass("highcharts-point-connecting-path-"+a+"-marker").attr(e).add(f.group),c.styledMode||this.graphics[a].attr({fill:b.color||this.fromPoint.color,stroke:b.lineColor,"stroke-width":b.lineWidth,opacity:0}).animate({opacity:1},
|
24
|
+
g.series.options.animation)))},getPath:function(a){var b=this.pathfinder,d=this.chart,c=b.algorithms[a.type],f=b.chartObstacles;if("function"!==typeof c)h.error('"'+a.type+'" is not a Pathfinder algorithm.');else return c.requiresObstacles&&!f&&(f=b.chartObstacles=b.getChartObstacles(a),d.options.connectors.algorithmMargin=a.algorithmMargin,b.chartObstacleMetrics=b.getObstacleMetrics(f)),c(this.fromPoint.getPathfinderAnchorPoint(a.startMarker),this.toPoint.getPathfinderAnchorPoint(a.endMarker),g({chartObstacles:f,
|
25
|
+
lineObstacles:b.lineObstacles||[],obstacleMetrics:b.chartObstacleMetrics,hardBounds:{xMin:0,xMax:d.plotWidth,yMin:0,yMax:d.plotHeight},obstacleOptions:{margin:a.algorithmMargin},startDirectionX:b.getAlgorithmStartDirection(a.startMarker)},a))},render:function(){var a=this.fromPoint,b=a.series,d=b.chart,c=d.pathfinder,f=g(d.options.connectors,b.options.connectors,a.options.connectors,this.options),e={};d.styledMode||(e.stroke=f.lineColor||a.color,e["stroke-width"]=f.lineWidth,f.dashStyle&&(e.dashstyle=
|
26
|
+
f.dashStyle));e.class="highcharts-point-connecting-path highcharts-color-"+a.colorIndex;f=g(e,f);r(f.marker.radius)||(f.marker.radius=p(y(Math.ceil((f.algorithmMargin||8)/2)-1,1),5));a=this.getPath(f);d=a.path;a.obstacles&&(c.lineObstacles=c.lineObstacles||[],c.lineObstacles=c.lineObstacles.concat(a.obstacles));this.renderPath(d,e,b.options.animation);this.addMarker("start",g(f.marker,f.startMarker),d);this.addMarker("end",g(f.marker,f.endMarker),d)},destroy:function(){this.graphics&&(h.objectEach(this.graphics,
|
27
|
+
function(a){a.destroy()}),delete this.graphics)}};u.prototype={algorithms:m,init:function(a){this.chart=a;this.connections=[];c(a,"redraw",function(){this.pathfinder.update()})},update:function(a){var b=this.chart,d=this,c=d.connections;d.connections=[];b.series.forEach(function(a){a.visible&&a.points.forEach(function(a){var c,f=a.options&&a.options.connect&&h.splat(a.options.connect);a.visible&&!1!==a.isInside&&f&&f.forEach(function(f){c=b.get("string"===typeof f?f:f.to);c instanceof h.Point&&c.series.visible&&
|
28
|
+
c.visible&&!1!==c.isInside&&d.connections.push(new q(a,c,"string"===typeof f?{}:f))})})});for(var f=0,e,g,l=c.length,m=d.connections.length;f<l;++f){g=!1;for(e=0;e<m;++e)if(c[f].fromPoint===d.connections[e].fromPoint&&c[f].toPoint===d.connections[e].toPoint){d.connections[e].graphics=c[f].graphics;g=!0;break}g||c[f].destroy()}delete this.chartObstacles;delete this.lineObstacles;d.renderConnections(a)},renderConnections:function(a){a?this.chart.series.forEach(function(b){var a=function(){var a=b.chart.pathfinder;
|
29
|
+
(a&&a.connections||[]).forEach(function(a){a.fromPoint&&a.fromPoint.series===b&&a.render()});b.pathfinderRemoveRenderEvent&&(b.pathfinderRemoveRenderEvent(),delete b.pathfinderRemoveRenderEvent)};!1===b.options.animation?a():b.pathfinderRemoveRenderEvent=c(b,"afterAnimate",a)}):this.connections.forEach(function(a){a.render()})},getChartObstacles:function(a){for(var b=[],d=this.chart.series,c=B(a.algorithmMargin,0),f,e=0,g=d.length;e<g;++e)if(d[e].visible)for(var h=0,m=d[e].points.length,p;h<m;++h)p=
|
30
|
+
d[e].points[h],p.visible&&(p=l(p))&&b.push({xMin:p.xMin-c,xMax:p.xMax+c,yMin:p.yMin-c,yMax:p.yMax+c});b=b.sort(function(a,b){return a.xMin-b.xMin});r(a.algorithmMargin)||(f=a.algorithmMargin=x(b),b.forEach(function(a){a.xMin-=f;a.xMax+=f;a.yMin-=f;a.yMax+=f}));return b},getObstacleMetrics:function(a){for(var b=0,d=0,c,f,e=a.length;e--;)c=a[e].xMax-a[e].xMin,f=a[e].yMax-a[e].yMin,b<c&&(b=c),d<f&&(d=f);return{maxHeight:d,maxWidth:b}},getAlgorithmStartDirection:function(a){var b="top"!==a.verticalAlign&&
|
31
|
+
"bottom"!==a.verticalAlign;return"left"!==a.align&&"right"!==a.align?b?void 0:!1:b?!0:void 0}};h.Connection=q;h.Pathfinder=u;e(h.Point.prototype,{getPathfinderAnchorPoint:function(a){var b=l(this),c,e;switch(a.align){case "right":c="xMax";break;case "left":c="xMin"}switch(a.verticalAlign){case "top":e="yMin";break;case "bottom":e="yMax"}return{x:c?b[c]:(b.xMin+b.xMax)/2,y:e?b[e]:(b.yMin+b.yMax)/2}},getRadiansToVector:function(a,b){r(b)||(b=l(this),b={x:(b.xMin+b.xMax)/2,y:(b.yMin+b.yMax)/2});return Math.atan2(b.y-
|
32
|
+
a.y,a.x-b.x)},getMarkerVector:function(a,b,c){for(var e=2*Math.PI,d=l(this),g=d.xMax-d.xMin,h=d.yMax-d.yMin,m=Math.atan2(h,g),p=!1,g=g/2,q=h/2,u=d.xMin+g,d=d.yMin+q,r=u,n=d,w={},x=1,y=1;a<-Math.PI;)a+=e;for(;a>Math.PI;)a-=e;e=Math.tan(a);a>-m&&a<=m?(y=-1,p=!0):a>m&&a<=Math.PI-m?y=-1:a>Math.PI-m||a<=-(Math.PI-m)?(x=-1,p=!0):x=-1;p?(r+=x*g,n+=y*g*e):(r+=h/(2*e)*x,n+=y*q);c.x!==u&&(r=c.x);c.y!==d&&(n=c.y);w.x=r+b*Math.cos(a);w.y=n-b*Math.sin(a);return w}});h.Chart.prototype.callbacks.push(function(a){!1!==
|
33
|
+
a.options.connectors.enabled&&(w(a),this.pathfinder=new u(this),this.pathfinder.update(!0))})})(m,H)});
|
34
|
+
//# sourceMappingURL=pathfinder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"pathfinder.js.map","lineCount":33,"mappings":"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","sources":["pathfinder.src.js"],"names":["factory","module","exports","define","amd","Highcharts","undefined","algorithms","H","findLastObstacleBefore","obstacles","xMin","startIx","left","right","length","min","cursor","cmp","findObstacleFromPoint","point","i","x","obstacle","xMax","y","yMax","yMin","pathFromSegments","segments","path","push","start","end","limitObstacleToBounds","bounds","max","Math","abs","pick","straight","simpleConnect","extend","options","copyFromPoint","from","fromKey","to","toKey","offset","getMeOut","direction","useMax","endSegment","dir","startDirectionX","chartObstacles","startObstacleIx","endObstacleIx","endPoint","endObstacle","waypoint","startObstacle","prevWaypoint","waypoint2","requiresObstacles","fastAvoid","pivotPoint","fromPoint","toPoint","directionIsX","firstPoint","lastPoint","highestPoint","lowestPoint","searchDirection","getDodgeDirection","dirIsX","softBounds","soft","hardBounds","hard","toPointMax","toPointMin","maxOutOfSoftBounds","minOutOfSoftBounds","maxOutOfHardBounds","minOutOfHardBounds","minDistance","maxDistance","minPivot","maxPivot","clearPathTo","envelopingObstacle","secondEnvelopingObstacle","envelopWaypoint","obstacleMargin","obstacleOptions","margin","softMinX","softMaxX","softMinY","softMaxY","waypointUseMax","forceObstacleBreak","pivot","concat","extractFromObstacle","goalPoint","extractedEndPoint","endSegments","metrics","obstacleMetrics","maxWidth","maxHeight","slice","reverse","SVGRenderer","prototype","symbols","arrow","H.SVGRenderer.prototype.symbols.arrow","w","h","pathfinderAlgorithms","getPointBB","shapeArgs","width","height","bb","graphic","getBBox","plotX","plotY","calculateObstacleMargin","len","j","obstacleDistance","distances","distance","a","b","bbMargin","yOverlap","xOverlap","xDistance","Infinity","yDistance","floor","sort","Connection","init","Pathfinder","chart","warnLegacy","pathfinder","series","reduce","acc","merge","connectors","error","defined","deg2rad","addEvent","defaultOptions","type","lineWidth","marker","enabled","align","verticalAlign","inside","startMarker","symbol","endMarker","renderPath","attribs","animation","styledMode","animate","forExport","pathGraphic","connection","graphics","group","renderer","g","addClass","attr","zIndex","add","seriesGroup","translate","plotLeft","plotTop","opacity","anim","d","addMarker","anchor","getPathfinderAnchorPoint","pathVector","radians","getRadiansToVector","markerVector","getMarkerVector","radius","rotation","box","rotationOriginX","rotationOriginY","fill","color","stroke","lineColor","getPath","algorithm","getChartObstacles","algorithmMargin","chartObstacleMetrics","getObstacleMetrics","lineObstacles","plotWidth","plotHeight","getAlgorithmStartDirection","render","dashStyle","dashstyle","class","colorIndex","ceil","pathResult","destroy","objectEach","val","connections","update","deferRender","oldConnections","forEach","visible","points","connects","connect","splat","isInside","get","Point","k","found","lenOld","lenNew","renderConnections","pathfinderRemoveRenderEvent","calculatedMargin","sLen","pLen","markerOptions","yCenter","undef","v1","v2","atan2","markerRadius","twoPI","PI","rectWidth","rectHeight","rAtan","leftOrRightRegion","rectHalfWidth","rectHalfHeight","rectHorizontalCenter","rectVerticalCenter","markerPoint","xFactor","yFactor","theta","tanTheta","tan","cos","sin","Chart","callbacks"]}
|
@@ -0,0 +1,2336 @@
|
|
1
|
+
/**
|
2
|
+
* @license Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
* Pathfinder
|
4
|
+
*
|
5
|
+
* (c) 2016-2019 Øystein Moseng
|
6
|
+
*
|
7
|
+
* License: www.highcharts.com/license
|
8
|
+
*/
|
9
|
+
'use strict';
|
10
|
+
(function (factory) {
|
11
|
+
if (typeof module === 'object' && module.exports) {
|
12
|
+
factory['default'] = factory;
|
13
|
+
module.exports = factory;
|
14
|
+
} else if (typeof define === 'function' && define.amd) {
|
15
|
+
define(function () {
|
16
|
+
return factory;
|
17
|
+
});
|
18
|
+
} else {
|
19
|
+
factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
|
20
|
+
}
|
21
|
+
}(function (Highcharts) {
|
22
|
+
var algorithms = (function (H) {
|
23
|
+
/* *
|
24
|
+
* (c) 2016 Highsoft AS
|
25
|
+
* Author: Øystein Moseng
|
26
|
+
*
|
27
|
+
* License: www.highcharts.com/license
|
28
|
+
*/
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
var min = Math.min,
|
33
|
+
max = Math.max,
|
34
|
+
abs = Math.abs,
|
35
|
+
pick = H.pick;
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Get index of last obstacle before xMin. Employs a type of binary search, and
|
39
|
+
* thus requires that obstacles are sorted by xMin value.
|
40
|
+
*
|
41
|
+
* @private
|
42
|
+
* @function findLastObstacleBefore
|
43
|
+
*
|
44
|
+
* @param {Array<object>} obstacles
|
45
|
+
* Array of obstacles to search in.
|
46
|
+
*
|
47
|
+
* @param {number} xMin
|
48
|
+
* The xMin threshold.
|
49
|
+
*
|
50
|
+
* @param {number} startIx
|
51
|
+
* Starting index to search from. Must be within array range.
|
52
|
+
*
|
53
|
+
* @return {number}
|
54
|
+
* The index of the last obstacle element before xMin.
|
55
|
+
*/
|
56
|
+
function findLastObstacleBefore(obstacles, xMin, startIx) {
|
57
|
+
var left = startIx || 0, // left limit
|
58
|
+
right = obstacles.length - 1, // right limit
|
59
|
+
min = xMin - 0.0000001, // Make sure we include all obstacles at xMin
|
60
|
+
cursor,
|
61
|
+
cmp;
|
62
|
+
|
63
|
+
while (left <= right) {
|
64
|
+
cursor = (right + left) >> 1;
|
65
|
+
cmp = min - obstacles[cursor].xMin;
|
66
|
+
if (cmp > 0) {
|
67
|
+
left = cursor + 1;
|
68
|
+
} else if (cmp < 0) {
|
69
|
+
right = cursor - 1;
|
70
|
+
} else {
|
71
|
+
return cursor;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
return left > 0 ? left - 1 : 0;
|
75
|
+
}
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Test if a point lays within an obstacle.
|
79
|
+
*
|
80
|
+
* @private
|
81
|
+
* @function pointWithinObstacle
|
82
|
+
*
|
83
|
+
* @param {object} obstacle
|
84
|
+
* Obstacle to test.
|
85
|
+
*
|
86
|
+
* @param {Highcharts.Point} point
|
87
|
+
* Point with x/y props.
|
88
|
+
*
|
89
|
+
* @return {boolean}
|
90
|
+
* Whether point is within the obstacle or not.
|
91
|
+
*/
|
92
|
+
function pointWithinObstacle(obstacle, point) {
|
93
|
+
return (
|
94
|
+
point.x <= obstacle.xMax &&
|
95
|
+
point.x >= obstacle.xMin &&
|
96
|
+
point.y <= obstacle.yMax &&
|
97
|
+
point.y >= obstacle.yMin
|
98
|
+
);
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Find the index of an obstacle that wraps around a point.
|
103
|
+
* Returns -1 if not found.
|
104
|
+
*
|
105
|
+
* @private
|
106
|
+
* @function findObstacleFromPoint
|
107
|
+
*
|
108
|
+
* @param {Array<object>} obstacles
|
109
|
+
* Obstacles to test.
|
110
|
+
*
|
111
|
+
* @param {Highcharts.Point} point
|
112
|
+
* Point with x/y props.
|
113
|
+
*
|
114
|
+
* @return {number}
|
115
|
+
* Ix of the obstacle in the array, or -1 if not found.
|
116
|
+
*/
|
117
|
+
function findObstacleFromPoint(obstacles, point) {
|
118
|
+
var i = findLastObstacleBefore(obstacles, point.x + 1) + 1;
|
119
|
+
|
120
|
+
while (i--) {
|
121
|
+
if (obstacles[i].xMax >= point.x &&
|
122
|
+
// optimization using lazy evaluation
|
123
|
+
pointWithinObstacle(obstacles[i], point)) {
|
124
|
+
return i;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return -1;
|
128
|
+
}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Get SVG path array from array of line segments.
|
132
|
+
*
|
133
|
+
* @private
|
134
|
+
* @function pathFromSegments
|
135
|
+
*
|
136
|
+
* @param {Array<object>} segments
|
137
|
+
* The segments to build the path from.
|
138
|
+
*
|
139
|
+
* @return {Highcharts.SVGPathArray}
|
140
|
+
* SVG path array as accepted by the SVG Renderer.
|
141
|
+
*/
|
142
|
+
function pathFromSegments(segments) {
|
143
|
+
var path = [];
|
144
|
+
|
145
|
+
if (segments.length) {
|
146
|
+
path.push('M', segments[0].start.x, segments[0].start.y);
|
147
|
+
for (var i = 0; i < segments.length; ++i) {
|
148
|
+
path.push('L', segments[i].end.x, segments[i].end.y);
|
149
|
+
}
|
150
|
+
}
|
151
|
+
return path;
|
152
|
+
}
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Limits obstacle max/mins in all directions to bounds. Modifies input
|
156
|
+
* obstacle.
|
157
|
+
*
|
158
|
+
* @private
|
159
|
+
* @function limitObstacleToBounds
|
160
|
+
*
|
161
|
+
* @param {object} obstacle
|
162
|
+
* Obstacle to limit.
|
163
|
+
*
|
164
|
+
* @param {object} bounds
|
165
|
+
* Bounds to use as limit.
|
166
|
+
*/
|
167
|
+
function limitObstacleToBounds(obstacle, bounds) {
|
168
|
+
obstacle.yMin = max(obstacle.yMin, bounds.yMin);
|
169
|
+
obstacle.yMax = min(obstacle.yMax, bounds.yMax);
|
170
|
+
obstacle.xMin = max(obstacle.xMin, bounds.xMin);
|
171
|
+
obstacle.xMax = min(obstacle.xMax, bounds.xMax);
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
// Define the available pathfinding algorithms.
|
176
|
+
// Algorithms take up to 3 arguments: starting point, ending point, and an
|
177
|
+
// options object.
|
178
|
+
var algorithms = {
|
179
|
+
|
180
|
+
/**
|
181
|
+
* Get an SVG path from a starting coordinate to an ending coordinate.
|
182
|
+
* Draws a straight line.
|
183
|
+
*
|
184
|
+
* @function Highcharts.Pathfinder.algorithms.straight
|
185
|
+
*
|
186
|
+
* @param {object} start
|
187
|
+
* Starting coordinate, object with x/y props.
|
188
|
+
*
|
189
|
+
* @param {object} end
|
190
|
+
* Ending coordinate, object with x/y props.
|
191
|
+
*
|
192
|
+
* @return {object}
|
193
|
+
* An object with the SVG path in Array form as accepted by the SVG
|
194
|
+
* renderer, as well as an array of new obstacles making up this
|
195
|
+
* path.
|
196
|
+
*/
|
197
|
+
straight: function (start, end) {
|
198
|
+
return {
|
199
|
+
path: ['M', start.x, start.y, 'L', end.x, end.y],
|
200
|
+
obstacles: [{ start: start, end: end }]
|
201
|
+
};
|
202
|
+
},
|
203
|
+
|
204
|
+
/**
|
205
|
+
* Find a path from a starting coordinate to an ending coordinate, using
|
206
|
+
* right angles only, and taking only starting/ending obstacle into
|
207
|
+
* consideration.
|
208
|
+
*
|
209
|
+
* @function Highcharts.Pathfinder.algorithms.simpleConnect
|
210
|
+
*
|
211
|
+
* @param {object} start
|
212
|
+
* Starting coordinate, object with x/y props.
|
213
|
+
*
|
214
|
+
* @param {object} end
|
215
|
+
* Ending coordinate, object with x/y props.
|
216
|
+
*
|
217
|
+
* @param {object} options
|
218
|
+
* Options for the algorithm:
|
219
|
+
* - chartObstacles: Array of chart obstacles to avoid
|
220
|
+
* - startDirectionX: Optional. True if starting in the X direction.
|
221
|
+
* If not provided, the algorithm starts in the direction that is
|
222
|
+
* the furthest between start/end.
|
223
|
+
*
|
224
|
+
* @return {object}
|
225
|
+
* An object with the SVG path in Array form as accepted by the SVG
|
226
|
+
* renderer, as well as an array of new obstacles making up this
|
227
|
+
* path.
|
228
|
+
*/
|
229
|
+
simpleConnect: H.extend(function (start, end, options) {
|
230
|
+
var segments = [],
|
231
|
+
endSegment,
|
232
|
+
dir = pick(
|
233
|
+
options.startDirectionX,
|
234
|
+
abs(end.x - start.x) > abs(end.y - start.y)
|
235
|
+
) ? 'x' : 'y',
|
236
|
+
chartObstacles = options.chartObstacles,
|
237
|
+
startObstacleIx = findObstacleFromPoint(chartObstacles, start),
|
238
|
+
endObstacleIx = findObstacleFromPoint(chartObstacles, end),
|
239
|
+
startObstacle,
|
240
|
+
endObstacle,
|
241
|
+
prevWaypoint,
|
242
|
+
waypoint,
|
243
|
+
waypoint2,
|
244
|
+
useMax,
|
245
|
+
endPoint;
|
246
|
+
|
247
|
+
// Return a clone of a point with a property set from a target object,
|
248
|
+
// optionally with an offset
|
249
|
+
function copyFromPoint(from, fromKey, to, toKey, offset) {
|
250
|
+
var point = {
|
251
|
+
x: from.x,
|
252
|
+
y: from.y
|
253
|
+
};
|
254
|
+
|
255
|
+
point[fromKey] = to[toKey || fromKey] + (offset || 0);
|
256
|
+
return point;
|
257
|
+
}
|
258
|
+
|
259
|
+
// Return waypoint outside obstacle
|
260
|
+
function getMeOut(obstacle, point, direction) {
|
261
|
+
var useMax = abs(point[direction] - obstacle[direction + 'Min']) >
|
262
|
+
abs(point[direction] - obstacle[direction + 'Max']);
|
263
|
+
|
264
|
+
return copyFromPoint(
|
265
|
+
point,
|
266
|
+
direction,
|
267
|
+
obstacle,
|
268
|
+
direction + (useMax ? 'Max' : 'Min'),
|
269
|
+
useMax ? 1 : -1
|
270
|
+
);
|
271
|
+
}
|
272
|
+
|
273
|
+
// Pull out end point
|
274
|
+
if (endObstacleIx > -1) {
|
275
|
+
endObstacle = chartObstacles[endObstacleIx];
|
276
|
+
waypoint = getMeOut(endObstacle, end, dir);
|
277
|
+
endSegment = {
|
278
|
+
start: waypoint,
|
279
|
+
end: end
|
280
|
+
};
|
281
|
+
endPoint = waypoint;
|
282
|
+
} else {
|
283
|
+
endPoint = end;
|
284
|
+
}
|
285
|
+
|
286
|
+
// If an obstacle envelops the start point, add a segment to get out,
|
287
|
+
// and around it.
|
288
|
+
if (startObstacleIx > -1) {
|
289
|
+
startObstacle = chartObstacles[startObstacleIx];
|
290
|
+
waypoint = getMeOut(startObstacle, start, dir);
|
291
|
+
segments.push({
|
292
|
+
start: start,
|
293
|
+
end: waypoint
|
294
|
+
});
|
295
|
+
|
296
|
+
// If we are going back again, switch direction to get around start
|
297
|
+
// obstacle.
|
298
|
+
if (
|
299
|
+
waypoint[dir] > start[dir] === // Going towards max from start
|
300
|
+
waypoint[dir] > endPoint[dir] // Going towards min to end
|
301
|
+
) {
|
302
|
+
dir = dir === 'y' ? 'x' : 'y';
|
303
|
+
useMax = start[dir] < end[dir];
|
304
|
+
segments.push({
|
305
|
+
start: waypoint,
|
306
|
+
end: copyFromPoint(
|
307
|
+
waypoint,
|
308
|
+
dir,
|
309
|
+
startObstacle,
|
310
|
+
dir + (useMax ? 'Max' : 'Min'),
|
311
|
+
useMax ? 1 : -1
|
312
|
+
)
|
313
|
+
});
|
314
|
+
|
315
|
+
// Switch direction again
|
316
|
+
dir = dir === 'y' ? 'x' : 'y';
|
317
|
+
}
|
318
|
+
}
|
319
|
+
|
320
|
+
// We are around the start obstacle. Go towards the end in one
|
321
|
+
// direction.
|
322
|
+
prevWaypoint = segments.length ?
|
323
|
+
segments[segments.length - 1].end :
|
324
|
+
start;
|
325
|
+
waypoint = copyFromPoint(prevWaypoint, dir, endPoint);
|
326
|
+
segments.push({
|
327
|
+
start: prevWaypoint,
|
328
|
+
end: waypoint
|
329
|
+
});
|
330
|
+
|
331
|
+
// Final run to end point in the other direction
|
332
|
+
dir = dir === 'y' ? 'x' : 'y';
|
333
|
+
waypoint2 = copyFromPoint(waypoint, dir, endPoint);
|
334
|
+
segments.push({
|
335
|
+
start: waypoint,
|
336
|
+
end: waypoint2
|
337
|
+
});
|
338
|
+
|
339
|
+
// Finally add the endSegment
|
340
|
+
segments.push(endSegment);
|
341
|
+
|
342
|
+
return {
|
343
|
+
path: pathFromSegments(segments),
|
344
|
+
obstacles: segments
|
345
|
+
};
|
346
|
+
}, {
|
347
|
+
requiresObstacles: true
|
348
|
+
}),
|
349
|
+
|
350
|
+
/**
|
351
|
+
* Find a path from a starting coordinate to an ending coordinate, taking
|
352
|
+
* obstacles into consideration. Might not always find the optimal path,
|
353
|
+
* but is fast, and usually good enough.
|
354
|
+
*
|
355
|
+
* @function Highcharts.Pathfinder.algorithms.fastAvoid
|
356
|
+
*
|
357
|
+
* @param {object} start
|
358
|
+
* Starting coordinate, object with x/y props.
|
359
|
+
*
|
360
|
+
* @param {object} end
|
361
|
+
* Ending coordinate, object with x/y props.
|
362
|
+
*
|
363
|
+
* @param {object} options
|
364
|
+
* Options for the algorithm.
|
365
|
+
* - chartObstacles: Array of chart obstacles to avoid
|
366
|
+
* - lineObstacles: Array of line obstacles to jump over
|
367
|
+
* - obstacleMetrics: Object with metrics of chartObstacles cached
|
368
|
+
* - hardBounds: Hard boundaries to not cross
|
369
|
+
* - obstacleOptions: Options for the obstacles, including margin
|
370
|
+
* - startDirectionX: Optional. True if starting in the X direction.
|
371
|
+
* If not provided, the algorithm starts in the
|
372
|
+
* direction that is the furthest between
|
373
|
+
* start/end.
|
374
|
+
*
|
375
|
+
* @return {object}
|
376
|
+
* An object with the SVG path in Array form as accepted by the SVG
|
377
|
+
* renderer, as well as an array of new obstacles making up this
|
378
|
+
* path.
|
379
|
+
*/
|
380
|
+
fastAvoid: H.extend(function (start, end, options) {
|
381
|
+
/*
|
382
|
+
Algorithm rules/description
|
383
|
+
- Find initial direction
|
384
|
+
- Determine soft/hard max for each direction.
|
385
|
+
- Move along initial direction until obstacle.
|
386
|
+
- Change direction.
|
387
|
+
- If hitting obstacle, first try to change length of previous line
|
388
|
+
before changing direction again.
|
389
|
+
|
390
|
+
Soft min/max x = start/destination x +/- widest obstacle + margin
|
391
|
+
Soft min/max y = start/destination y +/- tallest obstacle + margin
|
392
|
+
|
393
|
+
@todo:
|
394
|
+
- Make retrospective, try changing prev segment to reduce
|
395
|
+
corners
|
396
|
+
- Fix logic for breaking out of end-points - not always picking
|
397
|
+
the best direction currently
|
398
|
+
- When going around the end obstacle we should not always go the
|
399
|
+
shortest route, rather pick the one closer to the end point
|
400
|
+
*/
|
401
|
+
var dirIsX = pick(
|
402
|
+
options.startDirectionX,
|
403
|
+
abs(end.x - start.x) > abs(end.y - start.y)
|
404
|
+
),
|
405
|
+
dir = dirIsX ? 'x' : 'y',
|
406
|
+
segments,
|
407
|
+
useMax,
|
408
|
+
extractedEndPoint,
|
409
|
+
endSegments = [],
|
410
|
+
forceObstacleBreak = false, // Used in clearPathTo to keep track of
|
411
|
+
// when to force break through an obstacle.
|
412
|
+
|
413
|
+
// Boundaries to stay within. If beyond soft boundary, prefer to
|
414
|
+
// change direction ASAP. If at hard max, always change immediately.
|
415
|
+
metrics = options.obstacleMetrics,
|
416
|
+
softMinX = min(start.x, end.x) - metrics.maxWidth - 10,
|
417
|
+
softMaxX = max(start.x, end.x) + metrics.maxWidth + 10,
|
418
|
+
softMinY = min(start.y, end.y) - metrics.maxHeight - 10,
|
419
|
+
softMaxY = max(start.y, end.y) + metrics.maxHeight + 10,
|
420
|
+
|
421
|
+
// Obstacles
|
422
|
+
chartObstacles = options.chartObstacles,
|
423
|
+
startObstacleIx = findLastObstacleBefore(chartObstacles, softMinX),
|
424
|
+
endObstacleIx = findLastObstacleBefore(chartObstacles, softMaxX);
|
425
|
+
|
426
|
+
// How far can you go between two points before hitting an obstacle?
|
427
|
+
// Does not work for diagonal lines (because it doesn't have to).
|
428
|
+
function pivotPoint(fromPoint, toPoint, directionIsX) {
|
429
|
+
var firstPoint,
|
430
|
+
lastPoint,
|
431
|
+
highestPoint,
|
432
|
+
lowestPoint,
|
433
|
+
i,
|
434
|
+
searchDirection = fromPoint.x < toPoint.x ? 1 : -1;
|
435
|
+
|
436
|
+
if (fromPoint.x < toPoint.x) {
|
437
|
+
firstPoint = fromPoint;
|
438
|
+
lastPoint = toPoint;
|
439
|
+
} else {
|
440
|
+
firstPoint = toPoint;
|
441
|
+
lastPoint = fromPoint;
|
442
|
+
}
|
443
|
+
|
444
|
+
if (fromPoint.y < toPoint.y) {
|
445
|
+
lowestPoint = fromPoint;
|
446
|
+
highestPoint = toPoint;
|
447
|
+
} else {
|
448
|
+
lowestPoint = toPoint;
|
449
|
+
highestPoint = fromPoint;
|
450
|
+
}
|
451
|
+
|
452
|
+
// Go through obstacle range in reverse if toPoint is before
|
453
|
+
// fromPoint in the X-dimension.
|
454
|
+
i = searchDirection < 0 ?
|
455
|
+
// Searching backwards, start at last obstacle before last point
|
456
|
+
min(findLastObstacleBefore(chartObstacles, lastPoint.x),
|
457
|
+
chartObstacles.length - 1) :
|
458
|
+
// Forwards. Since we're not sorted by xMax, we have to look
|
459
|
+
// at all obstacles.
|
460
|
+
0;
|
461
|
+
|
462
|
+
// Go through obstacles in this X range
|
463
|
+
while (chartObstacles[i] && (
|
464
|
+
searchDirection > 0 && chartObstacles[i].xMin <= lastPoint.x ||
|
465
|
+
searchDirection < 0 && chartObstacles[i].xMax >= firstPoint.x
|
466
|
+
)) {
|
467
|
+
// If this obstacle is between from and to points in a straight
|
468
|
+
// line, pivot at the intersection.
|
469
|
+
if (
|
470
|
+
chartObstacles[i].xMin <= lastPoint.x &&
|
471
|
+
chartObstacles[i].xMax >= firstPoint.x &&
|
472
|
+
chartObstacles[i].yMin <= highestPoint.y &&
|
473
|
+
chartObstacles[i].yMax >= lowestPoint.y
|
474
|
+
) {
|
475
|
+
if (directionIsX) {
|
476
|
+
return {
|
477
|
+
y: fromPoint.y,
|
478
|
+
x: fromPoint.x < toPoint.x ?
|
479
|
+
chartObstacles[i].xMin - 1 :
|
480
|
+
chartObstacles[i].xMax + 1,
|
481
|
+
obstacle: chartObstacles[i]
|
482
|
+
};
|
483
|
+
}
|
484
|
+
// else ...
|
485
|
+
return {
|
486
|
+
x: fromPoint.x,
|
487
|
+
y: fromPoint.y < toPoint.y ?
|
488
|
+
chartObstacles[i].yMin - 1 :
|
489
|
+
chartObstacles[i].yMax + 1,
|
490
|
+
obstacle: chartObstacles[i]
|
491
|
+
};
|
492
|
+
}
|
493
|
+
|
494
|
+
i += searchDirection;
|
495
|
+
}
|
496
|
+
|
497
|
+
return toPoint;
|
498
|
+
}
|
499
|
+
|
500
|
+
/**
|
501
|
+
* Decide in which direction to dodge or get out of an obstacle.
|
502
|
+
* Considers desired direction, which way is shortest, soft and hard
|
503
|
+
* bounds.
|
504
|
+
*
|
505
|
+
* (? Returns a string, either xMin, xMax, yMin or yMax.)
|
506
|
+
*
|
507
|
+
* @private
|
508
|
+
* @function
|
509
|
+
*
|
510
|
+
* @param {object} obstacle
|
511
|
+
* Obstacle to dodge/escape.
|
512
|
+
*
|
513
|
+
* @param {object} fromPoint
|
514
|
+
* Point with x/y props that's dodging/escaping.
|
515
|
+
*
|
516
|
+
* @param {object} toPoint
|
517
|
+
* Goal point.
|
518
|
+
*
|
519
|
+
* @param {boolean} dirIsX
|
520
|
+
* Dodge in X dimension.
|
521
|
+
*
|
522
|
+
* @param {object} bounds
|
523
|
+
* Hard and soft boundaries.
|
524
|
+
*
|
525
|
+
* @return {boolean}
|
526
|
+
* Use max or not.
|
527
|
+
*/
|
528
|
+
function getDodgeDirection(
|
529
|
+
obstacle,
|
530
|
+
fromPoint,
|
531
|
+
toPoint,
|
532
|
+
dirIsX,
|
533
|
+
bounds
|
534
|
+
) {
|
535
|
+
var softBounds = bounds.soft,
|
536
|
+
hardBounds = bounds.hard,
|
537
|
+
dir = dirIsX ? 'x' : 'y',
|
538
|
+
toPointMax = { x: fromPoint.x, y: fromPoint.y },
|
539
|
+
toPointMin = { x: fromPoint.x, y: fromPoint.y },
|
540
|
+
minPivot,
|
541
|
+
maxPivot,
|
542
|
+
maxOutOfSoftBounds = obstacle[dir + 'Max'] >=
|
543
|
+
softBounds[dir + 'Max'],
|
544
|
+
minOutOfSoftBounds = obstacle[dir + 'Min'] <=
|
545
|
+
softBounds[dir + 'Min'],
|
546
|
+
maxOutOfHardBounds = obstacle[dir + 'Max'] >=
|
547
|
+
hardBounds[dir + 'Max'],
|
548
|
+
minOutOfHardBounds = obstacle[dir + 'Min'] <=
|
549
|
+
hardBounds[dir + 'Min'],
|
550
|
+
// Find out if we should prefer one direction over the other if
|
551
|
+
// we can choose freely
|
552
|
+
minDistance = abs(obstacle[dir + 'Min'] - fromPoint[dir]),
|
553
|
+
maxDistance = abs(obstacle[dir + 'Max'] - fromPoint[dir]),
|
554
|
+
// If it's a small difference, pick the one leading towards dest
|
555
|
+
// point. Otherwise pick the shortest distance
|
556
|
+
useMax = abs(minDistance - maxDistance) < 10 ?
|
557
|
+
fromPoint[dir] < toPoint[dir] :
|
558
|
+
maxDistance < minDistance;
|
559
|
+
|
560
|
+
// Check if we hit any obstacles trying to go around in either
|
561
|
+
// direction.
|
562
|
+
toPointMin[dir] = obstacle[dir + 'Min'];
|
563
|
+
toPointMax[dir] = obstacle[dir + 'Max'];
|
564
|
+
minPivot = pivotPoint(fromPoint, toPointMin, dirIsX)[dir] !==
|
565
|
+
toPointMin[dir];
|
566
|
+
maxPivot = pivotPoint(fromPoint, toPointMax, dirIsX)[dir] !==
|
567
|
+
toPointMax[dir];
|
568
|
+
useMax = minPivot ?
|
569
|
+
(maxPivot ? useMax : true) :
|
570
|
+
(maxPivot ? false : useMax);
|
571
|
+
|
572
|
+
// useMax now contains our preferred choice, bounds not taken into
|
573
|
+
// account. If both or neither direction is out of bounds we want to
|
574
|
+
// use this.
|
575
|
+
|
576
|
+
// Deal with soft bounds
|
577
|
+
useMax = minOutOfSoftBounds ?
|
578
|
+
(maxOutOfSoftBounds ? useMax : true) : // Out on min
|
579
|
+
(maxOutOfSoftBounds ? false : useMax); // Not out on min
|
580
|
+
|
581
|
+
// Deal with hard bounds
|
582
|
+
useMax = minOutOfHardBounds ?
|
583
|
+
(maxOutOfHardBounds ? useMax : true) : // Out on min
|
584
|
+
(maxOutOfHardBounds ? false : useMax); // Not out on min
|
585
|
+
|
586
|
+
return useMax;
|
587
|
+
}
|
588
|
+
|
589
|
+
// Find a clear path between point
|
590
|
+
function clearPathTo(fromPoint, toPoint, dirIsX) {
|
591
|
+
// Don't waste time if we've hit goal
|
592
|
+
if (fromPoint.x === toPoint.x && fromPoint.y === toPoint.y) {
|
593
|
+
return [];
|
594
|
+
}
|
595
|
+
|
596
|
+
var dir = dirIsX ? 'x' : 'y',
|
597
|
+
pivot,
|
598
|
+
segments,
|
599
|
+
waypoint,
|
600
|
+
waypointUseMax,
|
601
|
+
envelopingObstacle,
|
602
|
+
secondEnvelopingObstacle,
|
603
|
+
envelopWaypoint,
|
604
|
+
obstacleMargin = options.obstacleOptions.margin,
|
605
|
+
bounds = {
|
606
|
+
soft: {
|
607
|
+
xMin: softMinX,
|
608
|
+
xMax: softMaxX,
|
609
|
+
yMin: softMinY,
|
610
|
+
yMax: softMaxY
|
611
|
+
},
|
612
|
+
hard: options.hardBounds
|
613
|
+
};
|
614
|
+
|
615
|
+
// If fromPoint is inside an obstacle we have a problem. Break out
|
616
|
+
// by just going to the outside of this obstacle. We prefer to go to
|
617
|
+
// the nearest edge in the chosen direction.
|
618
|
+
envelopingObstacle =
|
619
|
+
findObstacleFromPoint(chartObstacles, fromPoint);
|
620
|
+
if (envelopingObstacle > -1) {
|
621
|
+
envelopingObstacle = chartObstacles[envelopingObstacle];
|
622
|
+
waypointUseMax = getDodgeDirection(
|
623
|
+
envelopingObstacle, fromPoint, toPoint, dirIsX, bounds
|
624
|
+
);
|
625
|
+
|
626
|
+
// Cut obstacle to hard bounds to make sure we stay within
|
627
|
+
limitObstacleToBounds(envelopingObstacle, options.hardBounds);
|
628
|
+
|
629
|
+
envelopWaypoint = dirIsX ? {
|
630
|
+
y: fromPoint.y,
|
631
|
+
x: envelopingObstacle[waypointUseMax ? 'xMax' : 'xMin'] +
|
632
|
+
(waypointUseMax ? 1 : -1)
|
633
|
+
} : {
|
634
|
+
x: fromPoint.x,
|
635
|
+
y: envelopingObstacle[waypointUseMax ? 'yMax' : 'yMin'] +
|
636
|
+
(waypointUseMax ? 1 : -1)
|
637
|
+
};
|
638
|
+
|
639
|
+
// If we crashed into another obstacle doing this, we put the
|
640
|
+
// waypoint between them instead
|
641
|
+
secondEnvelopingObstacle = findObstacleFromPoint(
|
642
|
+
chartObstacles, envelopWaypoint
|
643
|
+
);
|
644
|
+
if (secondEnvelopingObstacle > -1) {
|
645
|
+
secondEnvelopingObstacle = chartObstacles[
|
646
|
+
secondEnvelopingObstacle
|
647
|
+
];
|
648
|
+
|
649
|
+
// Cut obstacle to hard bounds
|
650
|
+
limitObstacleToBounds(
|
651
|
+
secondEnvelopingObstacle,
|
652
|
+
options.hardBounds
|
653
|
+
);
|
654
|
+
|
655
|
+
// Modify waypoint to lay between obstacles
|
656
|
+
envelopWaypoint[dir] = waypointUseMax ? max(
|
657
|
+
envelopingObstacle[dir + 'Max'] - obstacleMargin + 1,
|
658
|
+
(
|
659
|
+
secondEnvelopingObstacle[dir + 'Min'] +
|
660
|
+
envelopingObstacle[dir + 'Max']
|
661
|
+
) / 2
|
662
|
+
) :
|
663
|
+
min((
|
664
|
+
envelopingObstacle[dir + 'Min'] + obstacleMargin - 1
|
665
|
+
), (
|
666
|
+
(
|
667
|
+
secondEnvelopingObstacle[dir + 'Max'] +
|
668
|
+
envelopingObstacle[dir + 'Min']
|
669
|
+
) / 2
|
670
|
+
));
|
671
|
+
|
672
|
+
// We are not going anywhere. If this happens for the first
|
673
|
+
// time, do nothing. Otherwise, try to go to the extreme of
|
674
|
+
// the obstacle pair in the current direction.
|
675
|
+
if (fromPoint.x === envelopWaypoint.x &&
|
676
|
+
fromPoint.y === envelopWaypoint.y) {
|
677
|
+
if (forceObstacleBreak) {
|
678
|
+
envelopWaypoint[dir] = waypointUseMax ?
|
679
|
+
max(
|
680
|
+
envelopingObstacle[dir + 'Max'],
|
681
|
+
secondEnvelopingObstacle[dir + 'Max']
|
682
|
+
) + 1 :
|
683
|
+
min(
|
684
|
+
envelopingObstacle[dir + 'Min'],
|
685
|
+
secondEnvelopingObstacle[dir + 'Min']
|
686
|
+
) - 1;
|
687
|
+
}
|
688
|
+
// Toggle on if off, and the opposite
|
689
|
+
forceObstacleBreak = !forceObstacleBreak;
|
690
|
+
} else {
|
691
|
+
// This point is not identical to previous.
|
692
|
+
// Clear break trigger.
|
693
|
+
forceObstacleBreak = false;
|
694
|
+
}
|
695
|
+
}
|
696
|
+
|
697
|
+
segments = [{
|
698
|
+
start: fromPoint,
|
699
|
+
end: envelopWaypoint
|
700
|
+
}];
|
701
|
+
|
702
|
+
} else { // If not enveloping, use standard pivot calculation
|
703
|
+
|
704
|
+
pivot = pivotPoint(fromPoint, {
|
705
|
+
x: dirIsX ? toPoint.x : fromPoint.x,
|
706
|
+
y: dirIsX ? fromPoint.y : toPoint.y
|
707
|
+
}, dirIsX);
|
708
|
+
|
709
|
+
segments = [{
|
710
|
+
start: fromPoint,
|
711
|
+
end: {
|
712
|
+
x: pivot.x,
|
713
|
+
y: pivot.y
|
714
|
+
}
|
715
|
+
}];
|
716
|
+
|
717
|
+
// Pivot before goal, use a waypoint to dodge obstacle
|
718
|
+
if (pivot[dirIsX ? 'x' : 'y'] !== toPoint[dirIsX ? 'x' : 'y']) {
|
719
|
+
// Find direction of waypoint
|
720
|
+
waypointUseMax = getDodgeDirection(
|
721
|
+
pivot.obstacle, pivot, toPoint, !dirIsX, bounds
|
722
|
+
);
|
723
|
+
|
724
|
+
// Cut waypoint to hard bounds
|
725
|
+
limitObstacleToBounds(pivot.obstacle, options.hardBounds);
|
726
|
+
|
727
|
+
waypoint = {
|
728
|
+
x: dirIsX ?
|
729
|
+
pivot.x :
|
730
|
+
pivot.obstacle[waypointUseMax ? 'xMax' : 'xMin'] +
|
731
|
+
(waypointUseMax ? 1 : -1),
|
732
|
+
y: dirIsX ?
|
733
|
+
pivot.obstacle[waypointUseMax ? 'yMax' : 'yMin'] +
|
734
|
+
(waypointUseMax ? 1 : -1) :
|
735
|
+
pivot.y
|
736
|
+
};
|
737
|
+
|
738
|
+
// We're changing direction here, store that to make sure we
|
739
|
+
// also change direction when adding the last segment array
|
740
|
+
// after handling waypoint.
|
741
|
+
dirIsX = !dirIsX;
|
742
|
+
|
743
|
+
segments = segments.concat(clearPathTo({
|
744
|
+
x: pivot.x,
|
745
|
+
y: pivot.y
|
746
|
+
}, waypoint, dirIsX));
|
747
|
+
}
|
748
|
+
}
|
749
|
+
|
750
|
+
// Get segments for the other direction too
|
751
|
+
// Recursion is our friend
|
752
|
+
segments = segments.concat(clearPathTo(
|
753
|
+
segments[segments.length - 1].end, toPoint, !dirIsX
|
754
|
+
));
|
755
|
+
|
756
|
+
return segments;
|
757
|
+
}
|
758
|
+
|
759
|
+
// Extract point to outside of obstacle in whichever direction is
|
760
|
+
// closest. Returns new point outside obstacle.
|
761
|
+
function extractFromObstacle(obstacle, point, goalPoint) {
|
762
|
+
var dirIsX = min(obstacle.xMax - point.x, point.x - obstacle.xMin) <
|
763
|
+
min(obstacle.yMax - point.y, point.y - obstacle.yMin),
|
764
|
+
bounds = {
|
765
|
+
soft: options.hardBounds,
|
766
|
+
hard: options.hardBounds
|
767
|
+
},
|
768
|
+
useMax = getDodgeDirection(
|
769
|
+
obstacle, point, goalPoint, dirIsX, bounds
|
770
|
+
);
|
771
|
+
|
772
|
+
return dirIsX ? {
|
773
|
+
y: point.y,
|
774
|
+
x: obstacle[useMax ? 'xMax' : 'xMin'] + (useMax ? 1 : -1)
|
775
|
+
} : {
|
776
|
+
x: point.x,
|
777
|
+
y: obstacle[useMax ? 'yMax' : 'yMin'] + (useMax ? 1 : -1)
|
778
|
+
};
|
779
|
+
}
|
780
|
+
|
781
|
+
// Cut the obstacle array to soft bounds for optimization in large
|
782
|
+
// datasets.
|
783
|
+
chartObstacles =
|
784
|
+
chartObstacles.slice(startObstacleIx, endObstacleIx + 1);
|
785
|
+
|
786
|
+
// If an obstacle envelops the end point, move it out of there and add
|
787
|
+
// a little segment to where it was.
|
788
|
+
if ((endObstacleIx = findObstacleFromPoint(chartObstacles, end)) > -1) {
|
789
|
+
extractedEndPoint = extractFromObstacle(
|
790
|
+
chartObstacles[endObstacleIx],
|
791
|
+
end,
|
792
|
+
start
|
793
|
+
);
|
794
|
+
endSegments.push({
|
795
|
+
end: end,
|
796
|
+
start: extractedEndPoint
|
797
|
+
});
|
798
|
+
end = extractedEndPoint;
|
799
|
+
}
|
800
|
+
// If it's still inside one or more obstacles, get out of there by
|
801
|
+
// force-moving towards the start point.
|
802
|
+
while (
|
803
|
+
(endObstacleIx = findObstacleFromPoint(chartObstacles, end)) > -1
|
804
|
+
) {
|
805
|
+
useMax = end[dir] - start[dir] < 0;
|
806
|
+
extractedEndPoint = {
|
807
|
+
x: end.x,
|
808
|
+
y: end.y
|
809
|
+
};
|
810
|
+
extractedEndPoint[dir] = chartObstacles[endObstacleIx][
|
811
|
+
useMax ? dir + 'Max' : dir + 'Min'
|
812
|
+
] + (useMax ? 1 : -1);
|
813
|
+
endSegments.push({
|
814
|
+
end: end,
|
815
|
+
start: extractedEndPoint
|
816
|
+
});
|
817
|
+
end = extractedEndPoint;
|
818
|
+
}
|
819
|
+
|
820
|
+
// Find the path
|
821
|
+
segments = clearPathTo(start, end, dirIsX);
|
822
|
+
|
823
|
+
// Add the end-point segments
|
824
|
+
segments = segments.concat(endSegments.reverse());
|
825
|
+
|
826
|
+
return {
|
827
|
+
path: pathFromSegments(segments),
|
828
|
+
obstacles: segments
|
829
|
+
};
|
830
|
+
}, {
|
831
|
+
requiresObstacles: true
|
832
|
+
})
|
833
|
+
};
|
834
|
+
|
835
|
+
|
836
|
+
return algorithms;
|
837
|
+
}(Highcharts));
|
838
|
+
(function (H) {
|
839
|
+
/* *
|
840
|
+
* (c) 2017 Highsoft AS
|
841
|
+
* Authors: Lars A. V. Cabrera
|
842
|
+
*
|
843
|
+
* License: www.highcharts.com/license
|
844
|
+
*/
|
845
|
+
|
846
|
+
|
847
|
+
|
848
|
+
/**
|
849
|
+
* Creates an arrow symbol. Like a triangle, except not filled.
|
850
|
+
* ```
|
851
|
+
* o
|
852
|
+
* o
|
853
|
+
* o
|
854
|
+
* o
|
855
|
+
* o
|
856
|
+
* o
|
857
|
+
* o
|
858
|
+
* ```
|
859
|
+
*
|
860
|
+
* @private
|
861
|
+
* @function
|
862
|
+
*
|
863
|
+
* @param {number} x
|
864
|
+
* x position of the arrow
|
865
|
+
*
|
866
|
+
* @param {number} y
|
867
|
+
* y position of the arrow
|
868
|
+
*
|
869
|
+
* @param {number} w
|
870
|
+
* width of the arrow
|
871
|
+
*
|
872
|
+
* @param {number} h
|
873
|
+
* height of the arrow
|
874
|
+
*
|
875
|
+
* @return {Highcharts.SVGPathArray}
|
876
|
+
* Path array
|
877
|
+
*/
|
878
|
+
H.SVGRenderer.prototype.symbols.arrow = function (x, y, w, h) {
|
879
|
+
return [
|
880
|
+
'M', x, y + h / 2,
|
881
|
+
'L', x + w, y,
|
882
|
+
'L', x, y + h / 2,
|
883
|
+
'L', x + w, y + h
|
884
|
+
];
|
885
|
+
};
|
886
|
+
|
887
|
+
/**
|
888
|
+
* Creates a half-width arrow symbol. Like a triangle, except not filled.
|
889
|
+
* ```
|
890
|
+
* o
|
891
|
+
* o
|
892
|
+
* o
|
893
|
+
* o
|
894
|
+
* o
|
895
|
+
* ```
|
896
|
+
*
|
897
|
+
* @private
|
898
|
+
* @function
|
899
|
+
*
|
900
|
+
* @param {number} x
|
901
|
+
* x position of the arrow
|
902
|
+
*
|
903
|
+
* @param {number} y
|
904
|
+
* y position of the arrow
|
905
|
+
*
|
906
|
+
* @param {number} w
|
907
|
+
* width of the arrow
|
908
|
+
*
|
909
|
+
* @param {number} h
|
910
|
+
* height of the arrow
|
911
|
+
*
|
912
|
+
* @return {Highcharts.SVGPathArray}
|
913
|
+
* Path array
|
914
|
+
*/
|
915
|
+
H.SVGRenderer.prototype.symbols['arrow-half'] = function (x, y, w, h) {
|
916
|
+
return H.SVGRenderer.prototype.symbols.arrow(x, y, w / 2, h);
|
917
|
+
};
|
918
|
+
|
919
|
+
/**
|
920
|
+
* Creates a left-oriented triangle.
|
921
|
+
* ```
|
922
|
+
* o
|
923
|
+
* ooooooo
|
924
|
+
* ooooooooooooo
|
925
|
+
* ooooooo
|
926
|
+
* o
|
927
|
+
* ```
|
928
|
+
*
|
929
|
+
* @private
|
930
|
+
* @function
|
931
|
+
*
|
932
|
+
* @param {number} x
|
933
|
+
* x position of the triangle
|
934
|
+
*
|
935
|
+
* @param {number} y
|
936
|
+
* y position of the triangle
|
937
|
+
*
|
938
|
+
* @param {number} w
|
939
|
+
* width of the triangle
|
940
|
+
*
|
941
|
+
* @param {number} h
|
942
|
+
* height of the triangle
|
943
|
+
*
|
944
|
+
* @return {Highcharts.SVGPathArray}
|
945
|
+
* Path array
|
946
|
+
*/
|
947
|
+
H.SVGRenderer.prototype.symbols['triangle-left'] = function (x, y, w, h) {
|
948
|
+
return [
|
949
|
+
'M', x + w, y,
|
950
|
+
'L', x, y + h / 2,
|
951
|
+
'L', x + w, y + h,
|
952
|
+
'Z'
|
953
|
+
];
|
954
|
+
};
|
955
|
+
|
956
|
+
/**
|
957
|
+
* Alias function for triangle-left.
|
958
|
+
*
|
959
|
+
* @private
|
960
|
+
* @function
|
961
|
+
*
|
962
|
+
* @param {number} x
|
963
|
+
* x position of the arrow
|
964
|
+
*
|
965
|
+
* @param {number} y
|
966
|
+
* y position of the arrow
|
967
|
+
*
|
968
|
+
* @param {number} w
|
969
|
+
* width of the arrow
|
970
|
+
*
|
971
|
+
* @param {number} h
|
972
|
+
* height of the arrow
|
973
|
+
*
|
974
|
+
* @return {Highcharts.SVGPathArray}
|
975
|
+
* Path array
|
976
|
+
*/
|
977
|
+
H.SVGRenderer.prototype.symbols['arrow-filled'] =
|
978
|
+
H.SVGRenderer.prototype.symbols['triangle-left'];
|
979
|
+
|
980
|
+
/**
|
981
|
+
* Creates a half-width, left-oriented triangle.
|
982
|
+
* ```
|
983
|
+
* o
|
984
|
+
* oooo
|
985
|
+
* ooooooo
|
986
|
+
* oooo
|
987
|
+
* o
|
988
|
+
* ```
|
989
|
+
*
|
990
|
+
* @private
|
991
|
+
* @function
|
992
|
+
*
|
993
|
+
* @param {number} x
|
994
|
+
* x position of the triangle
|
995
|
+
*
|
996
|
+
* @param {number} y
|
997
|
+
* y position of the triangle
|
998
|
+
*
|
999
|
+
* @param {number} w
|
1000
|
+
* width of the triangle
|
1001
|
+
*
|
1002
|
+
* @param {number} h
|
1003
|
+
* height of the triangle
|
1004
|
+
*
|
1005
|
+
* @return {Highcharts.SVGPathArray}
|
1006
|
+
* Path array
|
1007
|
+
*/
|
1008
|
+
H.SVGRenderer.prototype.symbols['triangle-left-half'] = function (x, y, w, h) {
|
1009
|
+
return H.SVGRenderer.prototype.symbols['triangle-left'](x, y, w / 2, h);
|
1010
|
+
};
|
1011
|
+
|
1012
|
+
/**
|
1013
|
+
* Alias function for triangle-left-half.
|
1014
|
+
*
|
1015
|
+
* @private
|
1016
|
+
* @function
|
1017
|
+
*
|
1018
|
+
* @param {number} x
|
1019
|
+
* x position of the arrow
|
1020
|
+
*
|
1021
|
+
* @param {number} y
|
1022
|
+
* y position of the arrow
|
1023
|
+
*
|
1024
|
+
* @param {number} w
|
1025
|
+
* width of the arrow
|
1026
|
+
*
|
1027
|
+
* @param {number} h
|
1028
|
+
* height of the arrow
|
1029
|
+
*
|
1030
|
+
* @return {Highcharts.SVGPathArray}
|
1031
|
+
* Path array
|
1032
|
+
*/
|
1033
|
+
H.SVGRenderer.prototype.symbols['arrow-filled-half'] =
|
1034
|
+
H.SVGRenderer.prototype.symbols['triangle-left-half'];
|
1035
|
+
|
1036
|
+
}(Highcharts));
|
1037
|
+
(function (H, pathfinderAlgorithms) {
|
1038
|
+
/* *
|
1039
|
+
* (c) 2016 Highsoft AS
|
1040
|
+
* Authors: Øystein Moseng, Lars A. V. Cabrera
|
1041
|
+
*
|
1042
|
+
* License: www.highcharts.com/license
|
1043
|
+
*/
|
1044
|
+
|
1045
|
+
|
1046
|
+
|
1047
|
+
var defined = H.defined,
|
1048
|
+
deg2rad = H.deg2rad,
|
1049
|
+
extend = H.extend,
|
1050
|
+
addEvent = H.addEvent,
|
1051
|
+
merge = H.merge,
|
1052
|
+
pick = H.pick,
|
1053
|
+
max = Math.max,
|
1054
|
+
min = Math.min;
|
1055
|
+
|
1056
|
+
/*
|
1057
|
+
@todo:
|
1058
|
+
- Document how to write your own algorithms
|
1059
|
+
- Consider adding a Point.pathTo method that wraps creating a connection
|
1060
|
+
and rendering it
|
1061
|
+
*/
|
1062
|
+
|
1063
|
+
|
1064
|
+
// Set default Pathfinder options
|
1065
|
+
extend(H.defaultOptions, {
|
1066
|
+
/**
|
1067
|
+
* The Pathfinder module allows you to define connections between any two
|
1068
|
+
* points, represented as lines - optionally with markers for the start
|
1069
|
+
* and/or end points. Multiple algorithms are available for calculating how
|
1070
|
+
* the connecting lines are drawn.
|
1071
|
+
*
|
1072
|
+
* Connector functionality requires Highcharts Gantt to be loaded. In Gantt
|
1073
|
+
* charts, the connectors are used to draw dependencies between tasks.
|
1074
|
+
*
|
1075
|
+
* @see [dependency](series.gantt.data.dependency)
|
1076
|
+
*
|
1077
|
+
* @sample gantt/pathfinder/demo
|
1078
|
+
* Pathfinder connections
|
1079
|
+
*
|
1080
|
+
* @product gantt
|
1081
|
+
* @optionparent connectors
|
1082
|
+
*/
|
1083
|
+
connectors: {
|
1084
|
+
|
1085
|
+
/**
|
1086
|
+
* Enable connectors for this chart. Requires Highcharts Gantt.
|
1087
|
+
*
|
1088
|
+
* @type {boolean}
|
1089
|
+
* @default true
|
1090
|
+
* @since 6.2.0
|
1091
|
+
* @apioption connectors.enabled
|
1092
|
+
*/
|
1093
|
+
|
1094
|
+
/**
|
1095
|
+
* Set the default dash style for this chart's connecting lines.
|
1096
|
+
*
|
1097
|
+
* @type {string}
|
1098
|
+
* @default solid
|
1099
|
+
* @since 6.2.0
|
1100
|
+
* @apioption connectors.dashStyle
|
1101
|
+
*/
|
1102
|
+
|
1103
|
+
/**
|
1104
|
+
* Set the default color for this chart's Pathfinder connecting lines.
|
1105
|
+
* Defaults to the color of the point being connected.
|
1106
|
+
*
|
1107
|
+
* @type {Highcharts.ColorString}
|
1108
|
+
* @since 6.2.0
|
1109
|
+
* @apioption connectors.lineColor
|
1110
|
+
*/
|
1111
|
+
|
1112
|
+
/**
|
1113
|
+
* Set the default pathfinder margin to use, in pixels. Some Pathfinder
|
1114
|
+
* algorithms attempt to avoid obstacles, such as other points in the
|
1115
|
+
* chart. These algorithms use this margin to determine how close lines
|
1116
|
+
* can be to an obstacle. The default is to compute this automatically
|
1117
|
+
* from the size of the obstacles in the chart.
|
1118
|
+
*
|
1119
|
+
* To draw connecting lines close to existing points, set this to a low
|
1120
|
+
* number. For more space around existing points, set this number
|
1121
|
+
* higher.
|
1122
|
+
*
|
1123
|
+
* @sample gantt/pathfinder/algorithm-margin
|
1124
|
+
* Small algorithmMargin
|
1125
|
+
*
|
1126
|
+
* @type {number}
|
1127
|
+
* @since 6.2.0
|
1128
|
+
* @apioption connectors.algorithmMargin
|
1129
|
+
*/
|
1130
|
+
|
1131
|
+
/**
|
1132
|
+
* Set the default pathfinder algorithm to use for this chart. It is
|
1133
|
+
* possible to define your own algorithms by adding them to the
|
1134
|
+
* Highcharts.Pathfinder.prototype.algorithms object before the chart
|
1135
|
+
* has been created.
|
1136
|
+
*
|
1137
|
+
* The default algorithms are as follows:
|
1138
|
+
*
|
1139
|
+
* `straight`: Draws a straight line between the connecting
|
1140
|
+
* points. Does not avoid other points when drawing.
|
1141
|
+
*
|
1142
|
+
* `simpleConnect`: Finds a path between the points using right angles
|
1143
|
+
* only. Takes only starting/ending points into
|
1144
|
+
* account, and will not avoid other points.
|
1145
|
+
*
|
1146
|
+
* `fastAvoid`: Finds a path between the points using right angles
|
1147
|
+
* only. Will attempt to avoid other points, but its
|
1148
|
+
* focus is performance over accuracy. Works well with
|
1149
|
+
* less dense datasets.
|
1150
|
+
*
|
1151
|
+
* Default value: `straight` is used as default for most series types,
|
1152
|
+
* while `simpleConnect` is used as default for Gantt series, to show
|
1153
|
+
* dependencies between points.
|
1154
|
+
*
|
1155
|
+
* @sample gantt/pathfinder/demo
|
1156
|
+
* Different types used
|
1157
|
+
*
|
1158
|
+
* @default undefined
|
1159
|
+
* @since 6.2.0
|
1160
|
+
* @validvalue ["straight", "simpleConnect", "fastAvoid"]
|
1161
|
+
*/
|
1162
|
+
type: 'straight',
|
1163
|
+
|
1164
|
+
/**
|
1165
|
+
* Set the default pixel width for this chart's Pathfinder connecting
|
1166
|
+
* lines.
|
1167
|
+
*
|
1168
|
+
* @since 6.2.0
|
1169
|
+
*/
|
1170
|
+
lineWidth: 1,
|
1171
|
+
|
1172
|
+
/**
|
1173
|
+
* Marker options for this chart's Pathfinder connectors. Note that
|
1174
|
+
* this option is overridden by the `startMarker` and `endMarker`
|
1175
|
+
* options.
|
1176
|
+
*
|
1177
|
+
* @since 6.2.0
|
1178
|
+
*/
|
1179
|
+
marker: {
|
1180
|
+
/**
|
1181
|
+
* Set the radius of the connector markers. The default is
|
1182
|
+
* automatically computed based on the algorithmMargin setting.
|
1183
|
+
*
|
1184
|
+
* Setting marker.width and marker.height will override this
|
1185
|
+
* setting.
|
1186
|
+
*
|
1187
|
+
* @type {number}
|
1188
|
+
* @since 6.2.0
|
1189
|
+
* @apioption connectors.marker.radius
|
1190
|
+
*/
|
1191
|
+
|
1192
|
+
/**
|
1193
|
+
* Set the width of the connector markers. If not supplied, this
|
1194
|
+
* is inferred from the marker radius.
|
1195
|
+
*
|
1196
|
+
* @type {number}
|
1197
|
+
* @since 6.2.0
|
1198
|
+
* @apioption connectors.marker.width
|
1199
|
+
*/
|
1200
|
+
|
1201
|
+
/**
|
1202
|
+
* Set the height of the connector markers. If not supplied, this
|
1203
|
+
* is inferred from the marker radius.
|
1204
|
+
*
|
1205
|
+
* @type {number}
|
1206
|
+
* @since 6.2.0
|
1207
|
+
* @apioption connectors.marker.height
|
1208
|
+
*/
|
1209
|
+
|
1210
|
+
/**
|
1211
|
+
* Set the color of the connector markers. By default this is the
|
1212
|
+
* same as the connector color.
|
1213
|
+
*
|
1214
|
+
* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
|
1215
|
+
* @since 6.2.0
|
1216
|
+
* @apioption connectors.marker.color
|
1217
|
+
*/
|
1218
|
+
|
1219
|
+
/**
|
1220
|
+
* Set the line/border color of the connector markers. By default
|
1221
|
+
* this is the same as the marker color.
|
1222
|
+
*
|
1223
|
+
* @type {Highcharts.ColorString}
|
1224
|
+
* @since 6.2.0
|
1225
|
+
* @apioption connectors.marker.lineColor
|
1226
|
+
*/
|
1227
|
+
|
1228
|
+
/**
|
1229
|
+
* Enable markers for the connectors.
|
1230
|
+
*/
|
1231
|
+
enabled: false,
|
1232
|
+
|
1233
|
+
/**
|
1234
|
+
* Horizontal alignment of the markers relative to the points.
|
1235
|
+
*
|
1236
|
+
* @type {Highcharts.AlignType}
|
1237
|
+
*/
|
1238
|
+
align: 'center',
|
1239
|
+
|
1240
|
+
/**
|
1241
|
+
* Vertical alignment of the markers relative to the points.
|
1242
|
+
*
|
1243
|
+
* @type {Highcharts.VerticalAlignType}
|
1244
|
+
*/
|
1245
|
+
verticalAlign: 'middle',
|
1246
|
+
|
1247
|
+
/**
|
1248
|
+
* Whether or not to draw the markers inside the points.
|
1249
|
+
*/
|
1250
|
+
inside: false,
|
1251
|
+
|
1252
|
+
/**
|
1253
|
+
* Set the line/border width of the pathfinder markers.
|
1254
|
+
*/
|
1255
|
+
lineWidth: 1
|
1256
|
+
},
|
1257
|
+
|
1258
|
+
/**
|
1259
|
+
* Marker options specific to the start markers for this chart's
|
1260
|
+
* Pathfinder connectors. Overrides the generic marker options.
|
1261
|
+
*
|
1262
|
+
* @extends connectors.marker
|
1263
|
+
* @since 6.2.0
|
1264
|
+
*/
|
1265
|
+
startMarker: {
|
1266
|
+
/**
|
1267
|
+
* Set the symbol of the connector start markers.
|
1268
|
+
*/
|
1269
|
+
symbol: 'diamond'
|
1270
|
+
},
|
1271
|
+
|
1272
|
+
/**
|
1273
|
+
* Marker options specific to the end markers for this chart's
|
1274
|
+
* Pathfinder connectors. Overrides the generic marker options.
|
1275
|
+
*
|
1276
|
+
* @extends connectors.marker
|
1277
|
+
* @since 6.2.0
|
1278
|
+
*/
|
1279
|
+
endMarker: {
|
1280
|
+
/**
|
1281
|
+
* Set the symbol of the connector end markers.
|
1282
|
+
*/
|
1283
|
+
symbol: 'arrow-filled'
|
1284
|
+
}
|
1285
|
+
}
|
1286
|
+
});
|
1287
|
+
|
1288
|
+
/**
|
1289
|
+
* Override Pathfinder connector options for a series. Requires Highcharts Gantt
|
1290
|
+
* to be loaded.
|
1291
|
+
*
|
1292
|
+
* @extends connectors
|
1293
|
+
* @since 6.2.0
|
1294
|
+
* @excluding enabled, algorithmMargin
|
1295
|
+
* @product gantt
|
1296
|
+
* @apioption plotOptions.series.connectors
|
1297
|
+
*/
|
1298
|
+
|
1299
|
+
/**
|
1300
|
+
* Connect to a point. Requires Highcharts Gantt to be loaded. This option can
|
1301
|
+
* be either a string, referring to the ID of another point, or an object, or an
|
1302
|
+
* array of either. If the option is an array, each element defines a
|
1303
|
+
* connection.
|
1304
|
+
*
|
1305
|
+
* @sample gantt/pathfinder/demo
|
1306
|
+
* Different connection types
|
1307
|
+
*
|
1308
|
+
* @type {string|Array<string|*>|*}
|
1309
|
+
* @extends plotOptions.series.connectors
|
1310
|
+
* @since 6.2.0
|
1311
|
+
* @excluding enabled
|
1312
|
+
* @product gantt
|
1313
|
+
* @apioption series.xrange.data.connect
|
1314
|
+
*/
|
1315
|
+
|
1316
|
+
/**
|
1317
|
+
* The ID of the point to connect to.
|
1318
|
+
*
|
1319
|
+
* @type {string}
|
1320
|
+
* @since 6.2.0
|
1321
|
+
* @product gantt
|
1322
|
+
* @apioption series.xrange.data.connect.to
|
1323
|
+
*/
|
1324
|
+
|
1325
|
+
|
1326
|
+
/**
|
1327
|
+
* Get point bounding box using plotX/plotY and shapeArgs. If using
|
1328
|
+
* graphic.getBBox() directly, the bbox will be affected by animation.
|
1329
|
+
*
|
1330
|
+
* @private
|
1331
|
+
* @function
|
1332
|
+
*
|
1333
|
+
* @param {Highcharts.Point} point
|
1334
|
+
* The point to get BB of.
|
1335
|
+
*
|
1336
|
+
* @return {object}
|
1337
|
+
* Result xMax, xMin, yMax, yMin.
|
1338
|
+
*/
|
1339
|
+
function getPointBB(point) {
|
1340
|
+
var shapeArgs = point.shapeArgs,
|
1341
|
+
bb;
|
1342
|
+
|
1343
|
+
// Prefer using shapeArgs (columns)
|
1344
|
+
if (shapeArgs) {
|
1345
|
+
return {
|
1346
|
+
xMin: shapeArgs.x,
|
1347
|
+
xMax: shapeArgs.x + shapeArgs.width,
|
1348
|
+
yMin: shapeArgs.y,
|
1349
|
+
yMax: shapeArgs.y + shapeArgs.height
|
1350
|
+
};
|
1351
|
+
}
|
1352
|
+
|
1353
|
+
// Otherwise use plotX/plotY and bb
|
1354
|
+
bb = point.graphic && point.graphic.getBBox();
|
1355
|
+
return bb ? {
|
1356
|
+
xMin: point.plotX - bb.width / 2,
|
1357
|
+
xMax: point.plotX + bb.width / 2,
|
1358
|
+
yMin: point.plotY - bb.height / 2,
|
1359
|
+
yMax: point.plotY + bb.height / 2
|
1360
|
+
} : null;
|
1361
|
+
}
|
1362
|
+
|
1363
|
+
|
1364
|
+
/**
|
1365
|
+
* Calculate margin to place around obstacles for the pathfinder in pixels.
|
1366
|
+
* Returns a minimum of 1 pixel margin.
|
1367
|
+
*
|
1368
|
+
* @private
|
1369
|
+
* @function
|
1370
|
+
*
|
1371
|
+
* @param {Array<object>} obstacles
|
1372
|
+
* Obstacles to calculate margin from.
|
1373
|
+
*
|
1374
|
+
* @return {number}
|
1375
|
+
* The calculated margin in pixels. At least 1.
|
1376
|
+
*/
|
1377
|
+
function calculateObstacleMargin(obstacles) {
|
1378
|
+
var len = obstacles.length,
|
1379
|
+
i = 0,
|
1380
|
+
j,
|
1381
|
+
obstacleDistance,
|
1382
|
+
distances = [],
|
1383
|
+
// Compute smallest distance between two rectangles
|
1384
|
+
distance = function (a, b, bbMargin) {
|
1385
|
+
// Count the distance even if we are slightly off
|
1386
|
+
var margin = pick(bbMargin, 10),
|
1387
|
+
yOverlap = a.yMax + margin > b.yMin - margin &&
|
1388
|
+
a.yMin - margin < b.yMax + margin,
|
1389
|
+
xOverlap = a.xMax + margin > b.xMin - margin &&
|
1390
|
+
a.xMin - margin < b.xMax + margin,
|
1391
|
+
xDistance = yOverlap ? (
|
1392
|
+
a.xMin > b.xMax ? a.xMin - b.xMax : b.xMin - a.xMax
|
1393
|
+
) : Infinity,
|
1394
|
+
yDistance = xOverlap ? (
|
1395
|
+
a.yMin > b.yMax ? a.yMin - b.yMax : b.yMin - a.yMax
|
1396
|
+
) : Infinity;
|
1397
|
+
|
1398
|
+
// If the rectangles collide, try recomputing with smaller margin.
|
1399
|
+
// If they collide anyway, discard the obstacle.
|
1400
|
+
if (xOverlap && yOverlap) {
|
1401
|
+
return (
|
1402
|
+
margin ?
|
1403
|
+
distance(a, b, Math.floor(margin / 2)) :
|
1404
|
+
Infinity
|
1405
|
+
);
|
1406
|
+
}
|
1407
|
+
|
1408
|
+
return min(xDistance, yDistance);
|
1409
|
+
};
|
1410
|
+
|
1411
|
+
// Go over all obstacles and compare them to the others.
|
1412
|
+
for (; i < len; ++i) {
|
1413
|
+
// Compare to all obstacles ahead. We will already have compared this
|
1414
|
+
// obstacle to the ones before.
|
1415
|
+
for (j = i + 1; j < len; ++j) {
|
1416
|
+
obstacleDistance = distance(obstacles[i], obstacles[j]);
|
1417
|
+
// TODO: Magic number 80
|
1418
|
+
if (obstacleDistance < 80) { // Ignore large distances
|
1419
|
+
distances.push(obstacleDistance);
|
1420
|
+
}
|
1421
|
+
}
|
1422
|
+
}
|
1423
|
+
// Ensure we always have at least one value, even in very spaceous charts
|
1424
|
+
distances.push(80);
|
1425
|
+
|
1426
|
+
return max(
|
1427
|
+
Math.floor(
|
1428
|
+
distances.sort(function (a, b) {
|
1429
|
+
return a - b;
|
1430
|
+
})[
|
1431
|
+
// Discard first 10% of the relevant distances, and then grab
|
1432
|
+
// the smallest one.
|
1433
|
+
Math.floor(distances.length / 10)
|
1434
|
+
] / 2 - 1 // Divide the distance by 2 and subtract 1.
|
1435
|
+
),
|
1436
|
+
1 // 1 is the minimum margin
|
1437
|
+
);
|
1438
|
+
}
|
1439
|
+
|
1440
|
+
|
1441
|
+
/**
|
1442
|
+
* The Connection class. Used internally to represent a connection between two
|
1443
|
+
* points.
|
1444
|
+
*
|
1445
|
+
* @private
|
1446
|
+
* @class
|
1447
|
+
* @name Highcharts.Connection
|
1448
|
+
*
|
1449
|
+
* @param {Highcharts.Point} from
|
1450
|
+
* Connection runs from this Point.
|
1451
|
+
*
|
1452
|
+
* @param {Highcharts.Point} to
|
1453
|
+
* Connection runs to this Point.
|
1454
|
+
*
|
1455
|
+
* @param {Highcharts.ConnectorsOptions} [options]
|
1456
|
+
* Connection options.
|
1457
|
+
*/
|
1458
|
+
function Connection(from, to, options) {
|
1459
|
+
this.init(from, to, options);
|
1460
|
+
}
|
1461
|
+
Connection.prototype = {
|
1462
|
+
|
1463
|
+
/**
|
1464
|
+
* Initialize the Connection object. Used as constructor only.
|
1465
|
+
*
|
1466
|
+
* @function Highcharts.Connection#init
|
1467
|
+
*
|
1468
|
+
* @param {Highcharts.Point} from
|
1469
|
+
* Connection runs from this Point.
|
1470
|
+
*
|
1471
|
+
* @param {Highcharts.Point} to
|
1472
|
+
* Connection runs to this Point.
|
1473
|
+
*
|
1474
|
+
* @param {Highcharts.ConnectorsOptions} [options]
|
1475
|
+
* Connection options.
|
1476
|
+
*/
|
1477
|
+
init: function (from, to, options) {
|
1478
|
+
this.fromPoint = from;
|
1479
|
+
this.toPoint = to;
|
1480
|
+
this.options = options;
|
1481
|
+
this.chart = from.series.chart;
|
1482
|
+
this.pathfinder = this.chart.pathfinder;
|
1483
|
+
},
|
1484
|
+
|
1485
|
+
/**
|
1486
|
+
* Add (or update) this connection's path on chart. Stores reference to the
|
1487
|
+
* created element on this.graphics.path.
|
1488
|
+
*
|
1489
|
+
* @function Highcharts.Connection#renderPath
|
1490
|
+
*
|
1491
|
+
* @param {Highcharts.SVGPathArray} path
|
1492
|
+
* Path to render, in array format. E.g. ['M', 0, 0, 'L', 10, 10]
|
1493
|
+
*
|
1494
|
+
* @param {Highcharts.SVGAttributes} [attribs]
|
1495
|
+
* SVG attributes for the path.
|
1496
|
+
*
|
1497
|
+
* @param {Highcharts.AnimationOptionsObject} [animation]
|
1498
|
+
* Animation options for the rendering.
|
1499
|
+
*
|
1500
|
+
* @param {Function} [complete]
|
1501
|
+
* Callback function when the path has been rendered and animation is
|
1502
|
+
* complete.
|
1503
|
+
*/
|
1504
|
+
renderPath: function (path, attribs, animation) {
|
1505
|
+
var connection = this,
|
1506
|
+
chart = this.chart,
|
1507
|
+
styledMode = chart.styledMode,
|
1508
|
+
pathfinder = chart.pathfinder,
|
1509
|
+
animate = !chart.options.chart.forExport && animation !== false,
|
1510
|
+
pathGraphic = connection.graphics && connection.graphics.path,
|
1511
|
+
anim;
|
1512
|
+
|
1513
|
+
// Add the SVG element of the pathfinder group if it doesn't exist
|
1514
|
+
if (!pathfinder.group) {
|
1515
|
+
pathfinder.group = chart.renderer.g()
|
1516
|
+
.addClass('highcharts-pathfinder-group')
|
1517
|
+
.attr({ zIndex: -1 })
|
1518
|
+
.add(chart.seriesGroup);
|
1519
|
+
}
|
1520
|
+
|
1521
|
+
// Shift the group to compensate for plot area.
|
1522
|
+
// Note: Do this always (even when redrawing a path) to avoid issues
|
1523
|
+
// when updating chart in a way that changes plot metrics.
|
1524
|
+
pathfinder.group.translate(chart.plotLeft, chart.plotTop);
|
1525
|
+
|
1526
|
+
// Create path if does not exist
|
1527
|
+
if (!(pathGraphic && pathGraphic.renderer)) {
|
1528
|
+
pathGraphic = chart.renderer.path()
|
1529
|
+
.add(pathfinder.group);
|
1530
|
+
if (!styledMode) {
|
1531
|
+
pathGraphic.attr({
|
1532
|
+
opacity: 0
|
1533
|
+
});
|
1534
|
+
}
|
1535
|
+
}
|
1536
|
+
|
1537
|
+
// Set path attribs and animate to the new path
|
1538
|
+
pathGraphic.attr(attribs);
|
1539
|
+
anim = { d: path };
|
1540
|
+
if (!styledMode) {
|
1541
|
+
anim.opacity = 1;
|
1542
|
+
}
|
1543
|
+
pathGraphic[animate ? 'animate' : 'attr'](anim, animation);
|
1544
|
+
|
1545
|
+
// Store reference on connection
|
1546
|
+
this.graphics = this.graphics || {};
|
1547
|
+
this.graphics.path = pathGraphic;
|
1548
|
+
},
|
1549
|
+
|
1550
|
+
/**
|
1551
|
+
* Calculate and add marker graphics for connection to the chart. The
|
1552
|
+
* created/updated elements are stored on this.graphics.start and
|
1553
|
+
* this.graphics.end.
|
1554
|
+
*
|
1555
|
+
* @function Highcharts.Connection#addMarker
|
1556
|
+
*
|
1557
|
+
* @param {string} type
|
1558
|
+
* Marker type, either 'start' or 'end'.
|
1559
|
+
*
|
1560
|
+
* @param {Highcharts.ConnectorsMarkerOptions} options
|
1561
|
+
* All options for this marker. Not calculated or merged with other
|
1562
|
+
* options.
|
1563
|
+
*
|
1564
|
+
* @param {Highcharts.SVGPathArray} path
|
1565
|
+
* Connection path in array format. This is used to calculate the
|
1566
|
+
* rotation angle of the markers.
|
1567
|
+
*/
|
1568
|
+
addMarker: function (type, options, path) {
|
1569
|
+
var connection = this,
|
1570
|
+
chart = connection.fromPoint.series.chart,
|
1571
|
+
pathfinder = chart.pathfinder,
|
1572
|
+
renderer = chart.renderer,
|
1573
|
+
point = (
|
1574
|
+
type === 'start' ?
|
1575
|
+
connection.fromPoint :
|
1576
|
+
connection.toPoint
|
1577
|
+
),
|
1578
|
+
anchor = point.getPathfinderAnchorPoint(options),
|
1579
|
+
markerVector,
|
1580
|
+
radians,
|
1581
|
+
rotation,
|
1582
|
+
box,
|
1583
|
+
width,
|
1584
|
+
height,
|
1585
|
+
pathVector;
|
1586
|
+
|
1587
|
+
|
1588
|
+
if (!options.enabled) {
|
1589
|
+
return;
|
1590
|
+
}
|
1591
|
+
|
1592
|
+
// Last vector before start/end of path, used to get angle
|
1593
|
+
if (type === 'start') {
|
1594
|
+
pathVector = {
|
1595
|
+
x: path[4],
|
1596
|
+
y: path[5]
|
1597
|
+
};
|
1598
|
+
} else { // 'end'
|
1599
|
+
pathVector = {
|
1600
|
+
x: path[path.length - 5],
|
1601
|
+
y: path[path.length - 4]
|
1602
|
+
};
|
1603
|
+
}
|
1604
|
+
|
1605
|
+
// Get angle between pathVector and anchor point and use it to create
|
1606
|
+
// marker position.
|
1607
|
+
radians = point.getRadiansToVector(pathVector, anchor);
|
1608
|
+
markerVector = point.getMarkerVector(
|
1609
|
+
radians,
|
1610
|
+
options.radius,
|
1611
|
+
anchor
|
1612
|
+
);
|
1613
|
+
|
1614
|
+
// Rotation of marker is calculated from angle between pathVector and
|
1615
|
+
// markerVector.
|
1616
|
+
// (Note:
|
1617
|
+
// Used to recalculate radians between markerVector and pathVector,
|
1618
|
+
// but this should be the same as between pathVector and anchor.)
|
1619
|
+
rotation = -radians / deg2rad;
|
1620
|
+
|
1621
|
+
if (options.width && options.height) {
|
1622
|
+
width = options.width;
|
1623
|
+
height = options.height;
|
1624
|
+
} else {
|
1625
|
+
width = height = options.radius * 2;
|
1626
|
+
}
|
1627
|
+
|
1628
|
+
// Add graphics object if it does not exist
|
1629
|
+
connection.graphics = connection.graphics || {};
|
1630
|
+
box = {
|
1631
|
+
x: markerVector.x - (width / 2),
|
1632
|
+
y: markerVector.y - (height / 2),
|
1633
|
+
width: width,
|
1634
|
+
height: height,
|
1635
|
+
rotation: rotation,
|
1636
|
+
rotationOriginX: markerVector.x,
|
1637
|
+
rotationOriginY: markerVector.y
|
1638
|
+
};
|
1639
|
+
|
1640
|
+
if (!connection.graphics[type]) {
|
1641
|
+
|
1642
|
+
// Create new marker element
|
1643
|
+
connection.graphics[type] = renderer.symbol(
|
1644
|
+
options.symbol
|
1645
|
+
)
|
1646
|
+
.addClass(
|
1647
|
+
'highcharts-point-connecting-path-' + type + '-marker'
|
1648
|
+
)
|
1649
|
+
.attr(box)
|
1650
|
+
.add(pathfinder.group);
|
1651
|
+
|
1652
|
+
if (!renderer.styledMode) {
|
1653
|
+
connection.graphics[type].attr({
|
1654
|
+
fill: options.color || connection.fromPoint.color,
|
1655
|
+
stroke: options.lineColor,
|
1656
|
+
'stroke-width': options.lineWidth,
|
1657
|
+
opacity: 0
|
1658
|
+
})
|
1659
|
+
.animate({
|
1660
|
+
opacity: 1
|
1661
|
+
}, point.series.options.animation);
|
1662
|
+
}
|
1663
|
+
|
1664
|
+
} else {
|
1665
|
+
connection.graphics[type].animate(box);
|
1666
|
+
}
|
1667
|
+
},
|
1668
|
+
|
1669
|
+
/**
|
1670
|
+
* Calculate and return connection path.
|
1671
|
+
* Note: Recalculates chart obstacles on demand if they aren't calculated.
|
1672
|
+
*
|
1673
|
+
* @function Highcharts.Connection#getPath
|
1674
|
+
*
|
1675
|
+
* @param {Highcharts.ConnectorsOptions} options
|
1676
|
+
* Connector options. Not calculated or merged with other options.
|
1677
|
+
*
|
1678
|
+
* @return {Highcharts.SVHPathArray}
|
1679
|
+
* Calculated SVG path data in array format.
|
1680
|
+
*/
|
1681
|
+
getPath: function (options) {
|
1682
|
+
var pathfinder = this.pathfinder,
|
1683
|
+
chart = this.chart,
|
1684
|
+
algorithm = pathfinder.algorithms[options.type],
|
1685
|
+
chartObstacles = pathfinder.chartObstacles;
|
1686
|
+
|
1687
|
+
if (typeof algorithm !== 'function') {
|
1688
|
+
H.error(
|
1689
|
+
'"' + options.type + '" is not a Pathfinder algorithm.'
|
1690
|
+
);
|
1691
|
+
return;
|
1692
|
+
}
|
1693
|
+
|
1694
|
+
// This function calculates obstacles on demand if they don't exist
|
1695
|
+
if (algorithm.requiresObstacles && !chartObstacles) {
|
1696
|
+
chartObstacles =
|
1697
|
+
pathfinder.chartObstacles =
|
1698
|
+
pathfinder.getChartObstacles(options);
|
1699
|
+
|
1700
|
+
// If the algorithmMargin was computed, store the result in default
|
1701
|
+
// options.
|
1702
|
+
chart.options.connectors.algorithmMargin = options.algorithmMargin;
|
1703
|
+
|
1704
|
+
// Cache some metrics too
|
1705
|
+
pathfinder.chartObstacleMetrics =
|
1706
|
+
pathfinder.getObstacleMetrics(chartObstacles);
|
1707
|
+
}
|
1708
|
+
|
1709
|
+
// Get the SVG path
|
1710
|
+
return algorithm(
|
1711
|
+
// From
|
1712
|
+
this.fromPoint.getPathfinderAnchorPoint(options.startMarker),
|
1713
|
+
// To
|
1714
|
+
this.toPoint.getPathfinderAnchorPoint(options.endMarker),
|
1715
|
+
merge({
|
1716
|
+
chartObstacles: chartObstacles,
|
1717
|
+
lineObstacles: pathfinder.lineObstacles || [],
|
1718
|
+
obstacleMetrics: pathfinder.chartObstacleMetrics,
|
1719
|
+
hardBounds: {
|
1720
|
+
xMin: 0,
|
1721
|
+
xMax: chart.plotWidth,
|
1722
|
+
yMin: 0,
|
1723
|
+
yMax: chart.plotHeight
|
1724
|
+
},
|
1725
|
+
obstacleOptions: {
|
1726
|
+
margin: options.algorithmMargin
|
1727
|
+
},
|
1728
|
+
startDirectionX: pathfinder.getAlgorithmStartDirection(
|
1729
|
+
options.startMarker
|
1730
|
+
)
|
1731
|
+
}, options)
|
1732
|
+
);
|
1733
|
+
},
|
1734
|
+
|
1735
|
+
/**
|
1736
|
+
* (re)Calculate and (re)draw the connection.
|
1737
|
+
*
|
1738
|
+
* @function Highcharts.Connection#render
|
1739
|
+
*/
|
1740
|
+
render: function () {
|
1741
|
+
var connection = this,
|
1742
|
+
fromPoint = connection.fromPoint,
|
1743
|
+
series = fromPoint.series,
|
1744
|
+
chart = series.chart,
|
1745
|
+
pathfinder = chart.pathfinder,
|
1746
|
+
pathResult,
|
1747
|
+
path,
|
1748
|
+
options = merge(
|
1749
|
+
chart.options.connectors, series.options.connectors,
|
1750
|
+
fromPoint.options.connectors, connection.options
|
1751
|
+
),
|
1752
|
+
attribs = {};
|
1753
|
+
|
1754
|
+
// Set path attribs
|
1755
|
+
if (!chart.styledMode) {
|
1756
|
+
attribs.stroke = options.lineColor || fromPoint.color;
|
1757
|
+
attribs['stroke-width'] = options.lineWidth;
|
1758
|
+
if (options.dashStyle) {
|
1759
|
+
attribs.dashstyle = options.dashStyle;
|
1760
|
+
}
|
1761
|
+
}
|
1762
|
+
|
1763
|
+
attribs.class = 'highcharts-point-connecting-path ' +
|
1764
|
+
'highcharts-color-' + fromPoint.colorIndex;
|
1765
|
+
options = merge(attribs, options);
|
1766
|
+
|
1767
|
+
// Set common marker options
|
1768
|
+
if (!defined(options.marker.radius)) {
|
1769
|
+
options.marker.radius = min(max(
|
1770
|
+
Math.ceil((options.algorithmMargin || 8) / 2) - 1, 1
|
1771
|
+
), 5);
|
1772
|
+
}
|
1773
|
+
// Get the path
|
1774
|
+
pathResult = connection.getPath(options);
|
1775
|
+
path = pathResult.path;
|
1776
|
+
|
1777
|
+
// Always update obstacle storage with obstacles from this path.
|
1778
|
+
// We don't know if future calls will need this for their algorithm.
|
1779
|
+
if (pathResult.obstacles) {
|
1780
|
+
pathfinder.lineObstacles = pathfinder.lineObstacles || [];
|
1781
|
+
pathfinder.lineObstacles =
|
1782
|
+
pathfinder.lineObstacles.concat(pathResult.obstacles);
|
1783
|
+
}
|
1784
|
+
|
1785
|
+
// Add the calculated path to the pathfinder group
|
1786
|
+
connection.renderPath(path, attribs, series.options.animation);
|
1787
|
+
|
1788
|
+
// Render the markers
|
1789
|
+
connection.addMarker(
|
1790
|
+
'start',
|
1791
|
+
merge(options.marker, options.startMarker),
|
1792
|
+
path
|
1793
|
+
);
|
1794
|
+
connection.addMarker(
|
1795
|
+
'end',
|
1796
|
+
merge(options.marker, options.endMarker),
|
1797
|
+
path
|
1798
|
+
);
|
1799
|
+
},
|
1800
|
+
|
1801
|
+
/**
|
1802
|
+
* Destroy connection by destroying the added graphics elements.
|
1803
|
+
*
|
1804
|
+
* @function Highcharts.Connection#destroy
|
1805
|
+
*/
|
1806
|
+
destroy: function () {
|
1807
|
+
if (this.graphics) {
|
1808
|
+
H.objectEach(this.graphics, function (val) {
|
1809
|
+
val.destroy();
|
1810
|
+
});
|
1811
|
+
delete this.graphics;
|
1812
|
+
}
|
1813
|
+
}
|
1814
|
+
};
|
1815
|
+
|
1816
|
+
|
1817
|
+
/**
|
1818
|
+
* The Pathfinder class.
|
1819
|
+
*
|
1820
|
+
* @private
|
1821
|
+
* @class
|
1822
|
+
* @name Highcharts.Pathfinder
|
1823
|
+
*
|
1824
|
+
* @param {Highcharts.Chart} chart
|
1825
|
+
* The chart to operate on.
|
1826
|
+
*/
|
1827
|
+
function Pathfinder(chart) {
|
1828
|
+
this.init(chart);
|
1829
|
+
}
|
1830
|
+
Pathfinder.prototype = {
|
1831
|
+
|
1832
|
+
/**
|
1833
|
+
* @name Highcharts.Pathfinder#algorithms
|
1834
|
+
* @type {Highcharts.Dictionary<Function>}
|
1835
|
+
*/
|
1836
|
+
algorithms: pathfinderAlgorithms,
|
1837
|
+
|
1838
|
+
/**
|
1839
|
+
* Initialize the Pathfinder object.
|
1840
|
+
*
|
1841
|
+
* @function Highcharts.Pathfinder#init
|
1842
|
+
*
|
1843
|
+
* @param {Highcharts.Chart} chart
|
1844
|
+
* The chart context.
|
1845
|
+
*/
|
1846
|
+
init: function (chart) {
|
1847
|
+
// Initialize pathfinder with chart context
|
1848
|
+
this.chart = chart;
|
1849
|
+
|
1850
|
+
// Init connection reference list
|
1851
|
+
this.connections = [];
|
1852
|
+
|
1853
|
+
// Recalculate paths/obstacles on chart redraw
|
1854
|
+
addEvent(chart, 'redraw', function () {
|
1855
|
+
this.pathfinder.update();
|
1856
|
+
});
|
1857
|
+
},
|
1858
|
+
|
1859
|
+
/**
|
1860
|
+
* Update Pathfinder connections from scratch.
|
1861
|
+
*
|
1862
|
+
* @function Highcharts.Pathfinder#update
|
1863
|
+
*
|
1864
|
+
* @param {boolean} deferRender
|
1865
|
+
* Whether or not to defer rendering of connections until
|
1866
|
+
* series.afterAnimate event has fired. Used on first render.
|
1867
|
+
*/
|
1868
|
+
update: function (deferRender) {
|
1869
|
+
var chart = this.chart,
|
1870
|
+
pathfinder = this,
|
1871
|
+
oldConnections = pathfinder.connections;
|
1872
|
+
|
1873
|
+
// Rebuild pathfinder connections from options
|
1874
|
+
pathfinder.connections = [];
|
1875
|
+
chart.series.forEach(function (series) {
|
1876
|
+
if (series.visible) {
|
1877
|
+
series.points.forEach(function (point) {
|
1878
|
+
var to,
|
1879
|
+
connects = (
|
1880
|
+
point.options &&
|
1881
|
+
point.options.connect &&
|
1882
|
+
H.splat(point.options.connect)
|
1883
|
+
);
|
1884
|
+
|
1885
|
+
if (point.visible && point.isInside !== false && connects) {
|
1886
|
+
connects.forEach(function (connect) {
|
1887
|
+
to = chart.get(
|
1888
|
+
typeof connect === 'string' ?
|
1889
|
+
connect : connect.to
|
1890
|
+
);
|
1891
|
+
if (
|
1892
|
+
to instanceof H.Point &&
|
1893
|
+
to.series.visible &&
|
1894
|
+
to.visible &&
|
1895
|
+
to.isInside !== false
|
1896
|
+
) {
|
1897
|
+
// Add new connection
|
1898
|
+
pathfinder.connections.push(new Connection(
|
1899
|
+
point, // from
|
1900
|
+
to,
|
1901
|
+
typeof connect === 'string' ? {} : connect
|
1902
|
+
));
|
1903
|
+
}
|
1904
|
+
});
|
1905
|
+
}
|
1906
|
+
});
|
1907
|
+
}
|
1908
|
+
});
|
1909
|
+
|
1910
|
+
// Clear connections that should not be updated, and move old info over
|
1911
|
+
// to new connections.
|
1912
|
+
for (
|
1913
|
+
var j = 0, k, found, lenOld = oldConnections.length,
|
1914
|
+
lenNew = pathfinder.connections.length;
|
1915
|
+
j < lenOld;
|
1916
|
+
++j
|
1917
|
+
) {
|
1918
|
+
found = false;
|
1919
|
+
for (k = 0; k < lenNew; ++k) {
|
1920
|
+
if (
|
1921
|
+
oldConnections[j].fromPoint ===
|
1922
|
+
pathfinder.connections[k].fromPoint &&
|
1923
|
+
oldConnections[j].toPoint ===
|
1924
|
+
pathfinder.connections[k].toPoint
|
1925
|
+
) {
|
1926
|
+
pathfinder.connections[k].graphics =
|
1927
|
+
oldConnections[j].graphics;
|
1928
|
+
found = true;
|
1929
|
+
break;
|
1930
|
+
}
|
1931
|
+
}
|
1932
|
+
if (!found) {
|
1933
|
+
oldConnections[j].destroy();
|
1934
|
+
}
|
1935
|
+
}
|
1936
|
+
|
1937
|
+
// Clear obstacles to force recalculation. This must be done on every
|
1938
|
+
// redraw in case positions have changed. Recalculation is handled in
|
1939
|
+
// Connection.getPath on demand.
|
1940
|
+
delete this.chartObstacles;
|
1941
|
+
delete this.lineObstacles;
|
1942
|
+
|
1943
|
+
// Draw the pending connections
|
1944
|
+
pathfinder.renderConnections(deferRender);
|
1945
|
+
},
|
1946
|
+
|
1947
|
+
/**
|
1948
|
+
* Draw the chart's connecting paths.
|
1949
|
+
*
|
1950
|
+
* @function Highcharts.Pathfinder#renderConnections
|
1951
|
+
*
|
1952
|
+
* @param {boolean} deferRender
|
1953
|
+
* Whether or not to defer render until series animation is finished.
|
1954
|
+
* Used on first render.
|
1955
|
+
*/
|
1956
|
+
renderConnections: function (deferRender) {
|
1957
|
+
if (deferRender) {
|
1958
|
+
// Render after series are done animating
|
1959
|
+
this.chart.series.forEach(function (series) {
|
1960
|
+
var render = function () {
|
1961
|
+
// Find pathfinder connections belonging to this series
|
1962
|
+
// that haven't rendered, and render them now.
|
1963
|
+
var pathfinder = series.chart.pathfinder,
|
1964
|
+
conns = pathfinder && pathfinder.connections || [];
|
1965
|
+
|
1966
|
+
conns.forEach(function (connection) {
|
1967
|
+
if (
|
1968
|
+
connection.fromPoint &&
|
1969
|
+
connection.fromPoint.series === series
|
1970
|
+
) {
|
1971
|
+
connection.render();
|
1972
|
+
}
|
1973
|
+
});
|
1974
|
+
if (series.pathfinderRemoveRenderEvent) {
|
1975
|
+
series.pathfinderRemoveRenderEvent();
|
1976
|
+
delete series.pathfinderRemoveRenderEvent;
|
1977
|
+
}
|
1978
|
+
};
|
1979
|
+
|
1980
|
+
if (series.options.animation === false) {
|
1981
|
+
render();
|
1982
|
+
} else {
|
1983
|
+
series.pathfinderRemoveRenderEvent = addEvent(
|
1984
|
+
series, 'afterAnimate', render
|
1985
|
+
);
|
1986
|
+
}
|
1987
|
+
});
|
1988
|
+
} else {
|
1989
|
+
// Go through connections and render them
|
1990
|
+
this.connections.forEach(function (connection) {
|
1991
|
+
connection.render();
|
1992
|
+
});
|
1993
|
+
}
|
1994
|
+
},
|
1995
|
+
|
1996
|
+
/**
|
1997
|
+
* Get obstacles for the points in the chart. Does not include connecting
|
1998
|
+
* lines from Pathfinder. Applies algorithmMargin to the obstacles.
|
1999
|
+
*
|
2000
|
+
* @function Highcharts.Pathfinder#getChartObstacles
|
2001
|
+
*
|
2002
|
+
* @param {object} options
|
2003
|
+
* Options for the calculation. Currenlty only
|
2004
|
+
* options.algorithmMargin.
|
2005
|
+
*
|
2006
|
+
* @return {Array<object>}
|
2007
|
+
* An array of calculated obstacles. Each obstacle is defined as an
|
2008
|
+
* object with xMin, xMax, yMin and yMax properties.
|
2009
|
+
*/
|
2010
|
+
getChartObstacles: function (options) {
|
2011
|
+
var obstacles = [],
|
2012
|
+
series = this.chart.series,
|
2013
|
+
margin = pick(options.algorithmMargin, 0),
|
2014
|
+
calculatedMargin;
|
2015
|
+
|
2016
|
+
for (var i = 0, sLen = series.length; i < sLen; ++i) {
|
2017
|
+
if (series[i].visible) {
|
2018
|
+
for (
|
2019
|
+
var j = 0, pLen = series[i].points.length, bb, point;
|
2020
|
+
j < pLen;
|
2021
|
+
++j
|
2022
|
+
) {
|
2023
|
+
point = series[i].points[j];
|
2024
|
+
if (point.visible) {
|
2025
|
+
bb = getPointBB(point);
|
2026
|
+
if (bb) {
|
2027
|
+
obstacles.push({
|
2028
|
+
xMin: bb.xMin - margin,
|
2029
|
+
xMax: bb.xMax + margin,
|
2030
|
+
yMin: bb.yMin - margin,
|
2031
|
+
yMax: bb.yMax + margin
|
2032
|
+
});
|
2033
|
+
}
|
2034
|
+
}
|
2035
|
+
}
|
2036
|
+
}
|
2037
|
+
}
|
2038
|
+
|
2039
|
+
// Sort obstacles by xMin for optimization
|
2040
|
+
obstacles = obstacles.sort(function (a, b) {
|
2041
|
+
return a.xMin - b.xMin;
|
2042
|
+
});
|
2043
|
+
|
2044
|
+
// Add auto-calculated margin if the option is not defined
|
2045
|
+
if (!defined(options.algorithmMargin)) {
|
2046
|
+
calculatedMargin =
|
2047
|
+
options.algorithmMargin =
|
2048
|
+
calculateObstacleMargin(obstacles);
|
2049
|
+
obstacles.forEach(function (obstacle) {
|
2050
|
+
obstacle.xMin -= calculatedMargin;
|
2051
|
+
obstacle.xMax += calculatedMargin;
|
2052
|
+
obstacle.yMin -= calculatedMargin;
|
2053
|
+
obstacle.yMax += calculatedMargin;
|
2054
|
+
});
|
2055
|
+
}
|
2056
|
+
|
2057
|
+
return obstacles;
|
2058
|
+
},
|
2059
|
+
|
2060
|
+
/**
|
2061
|
+
* Utility function to get metrics for obstacles:
|
2062
|
+
* - Widest obstacle width
|
2063
|
+
* - Tallest obstacle height
|
2064
|
+
*
|
2065
|
+
* @function Highcharts.Pathfinder#getObstacleMetrics
|
2066
|
+
*
|
2067
|
+
* @param {Array<object>} obstacles
|
2068
|
+
* An array of obstacles to inspect.
|
2069
|
+
*
|
2070
|
+
* @return {object}
|
2071
|
+
* The calculated metrics, as an object with maxHeight and maxWidth
|
2072
|
+
* properties.
|
2073
|
+
*/
|
2074
|
+
getObstacleMetrics: function (obstacles) {
|
2075
|
+
var maxWidth = 0,
|
2076
|
+
maxHeight = 0,
|
2077
|
+
width,
|
2078
|
+
height,
|
2079
|
+
i = obstacles.length;
|
2080
|
+
|
2081
|
+
while (i--) {
|
2082
|
+
width = obstacles[i].xMax - obstacles[i].xMin;
|
2083
|
+
height = obstacles[i].yMax - obstacles[i].yMin;
|
2084
|
+
if (maxWidth < width) {
|
2085
|
+
maxWidth = width;
|
2086
|
+
}
|
2087
|
+
if (maxHeight < height) {
|
2088
|
+
maxHeight = height;
|
2089
|
+
}
|
2090
|
+
}
|
2091
|
+
|
2092
|
+
return {
|
2093
|
+
maxHeight: maxHeight,
|
2094
|
+
maxWidth: maxWidth
|
2095
|
+
};
|
2096
|
+
},
|
2097
|
+
|
2098
|
+
/**
|
2099
|
+
* Utility to get which direction to start the pathfinding algorithm
|
2100
|
+
* (X vs Y), calculated from a set of marker options.
|
2101
|
+
*
|
2102
|
+
* @function Highcharts.Pathfinder#getAlgorithmStartDirection
|
2103
|
+
*
|
2104
|
+
* @param {Highcharts.ConnectorsMarkerOptions} markerOptions
|
2105
|
+
* Marker options to calculate from.
|
2106
|
+
*
|
2107
|
+
* @return {boolean}
|
2108
|
+
* Returns true for X, false for Y, and undefined for autocalculate.
|
2109
|
+
*/
|
2110
|
+
getAlgorithmStartDirection: function (markerOptions) {
|
2111
|
+
var xCenter = markerOptions.align !== 'left' &&
|
2112
|
+
markerOptions.align !== 'right',
|
2113
|
+
yCenter = markerOptions.verticalAlign !== 'top' &&
|
2114
|
+
markerOptions.verticalAlign !== 'bottom',
|
2115
|
+
undef;
|
2116
|
+
|
2117
|
+
return xCenter ?
|
2118
|
+
(yCenter ? undef : false) : // x is centered
|
2119
|
+
(yCenter ? true : undef); // x is off-center
|
2120
|
+
}
|
2121
|
+
};
|
2122
|
+
|
2123
|
+
// Add to Highcharts namespace
|
2124
|
+
H.Connection = Connection;
|
2125
|
+
H.Pathfinder = Pathfinder;
|
2126
|
+
|
2127
|
+
|
2128
|
+
// Add pathfinding capabilities to Points
|
2129
|
+
extend(H.Point.prototype, /** @lends Point.prototype */ {
|
2130
|
+
|
2131
|
+
/**
|
2132
|
+
* Get coordinates of anchor point for pathfinder connection.
|
2133
|
+
*
|
2134
|
+
* @private
|
2135
|
+
* @function Highcharts.Point#getPathfinderAnchorPoint
|
2136
|
+
*
|
2137
|
+
* @param {Highcharts.ConnectorsMarkerOptions} markerOptions
|
2138
|
+
* Connection options for position on point.
|
2139
|
+
*
|
2140
|
+
* @return {object}
|
2141
|
+
* An object with x/y properties for the position. Coordinates are
|
2142
|
+
* in plot values, not relative to point.
|
2143
|
+
*/
|
2144
|
+
getPathfinderAnchorPoint: function (markerOptions) {
|
2145
|
+
var bb = getPointBB(this),
|
2146
|
+
x,
|
2147
|
+
y;
|
2148
|
+
|
2149
|
+
switch (markerOptions.align) { // eslint-disable-line default-case
|
2150
|
+
case 'right':
|
2151
|
+
x = 'xMax';
|
2152
|
+
break;
|
2153
|
+
case 'left':
|
2154
|
+
x = 'xMin';
|
2155
|
+
}
|
2156
|
+
|
2157
|
+
switch (markerOptions.verticalAlign) { // eslint-disable-line default-case
|
2158
|
+
case 'top':
|
2159
|
+
y = 'yMin';
|
2160
|
+
break;
|
2161
|
+
case 'bottom':
|
2162
|
+
y = 'yMax';
|
2163
|
+
}
|
2164
|
+
|
2165
|
+
return {
|
2166
|
+
x: x ? bb[x] : (bb.xMin + bb.xMax) / 2,
|
2167
|
+
y: y ? bb[y] : (bb.yMin + bb.yMax) / 2
|
2168
|
+
};
|
2169
|
+
},
|
2170
|
+
|
2171
|
+
/**
|
2172
|
+
* Utility to get the angle from one point to another.
|
2173
|
+
*
|
2174
|
+
* @private
|
2175
|
+
* @function Highcharts.Point#getRadiansToVector
|
2176
|
+
*
|
2177
|
+
* @param {object} v1
|
2178
|
+
* The first vector, as an object with x/y properties.
|
2179
|
+
*
|
2180
|
+
* @param {object} v2
|
2181
|
+
* The second vector, as an object with x/y properties.
|
2182
|
+
*
|
2183
|
+
* @return {number}
|
2184
|
+
* The angle in degrees
|
2185
|
+
*/
|
2186
|
+
getRadiansToVector: function (v1, v2) {
|
2187
|
+
var box;
|
2188
|
+
|
2189
|
+
if (!defined(v2)) {
|
2190
|
+
box = getPointBB(this);
|
2191
|
+
v2 = {
|
2192
|
+
x: (box.xMin + box.xMax) / 2,
|
2193
|
+
y: (box.yMin + box.yMax) / 2
|
2194
|
+
};
|
2195
|
+
}
|
2196
|
+
return Math.atan2(v2.y - v1.y, v1.x - v2.x);
|
2197
|
+
},
|
2198
|
+
|
2199
|
+
/**
|
2200
|
+
* Utility to get the position of the marker, based on the path angle and
|
2201
|
+
* the marker's radius.
|
2202
|
+
*
|
2203
|
+
* @private
|
2204
|
+
* @function Highcharts.Point#getMarkerVector
|
2205
|
+
*
|
2206
|
+
* @param {number} radians
|
2207
|
+
* The angle in radians from the point center to another vector.
|
2208
|
+
*
|
2209
|
+
* @param {number} markerRadius
|
2210
|
+
* The radius of the marker, to calculate the additional distance to
|
2211
|
+
* the center of the marker.
|
2212
|
+
*
|
2213
|
+
* @param {object} anchor
|
2214
|
+
* The anchor point of the path and marker as an object with x/y
|
2215
|
+
* properties.
|
2216
|
+
*
|
2217
|
+
* @return {object}
|
2218
|
+
* The marker vector as an object with x/y properties.
|
2219
|
+
*/
|
2220
|
+
getMarkerVector: function (radians, markerRadius, anchor) {
|
2221
|
+
var twoPI = Math.PI * 2.0,
|
2222
|
+
theta = radians,
|
2223
|
+
bb = getPointBB(this),
|
2224
|
+
rectWidth = bb.xMax - bb.xMin,
|
2225
|
+
rectHeight = bb.yMax - bb.yMin,
|
2226
|
+
rAtan = Math.atan2(rectHeight, rectWidth),
|
2227
|
+
tanTheta = 1,
|
2228
|
+
leftOrRightRegion = false,
|
2229
|
+
rectHalfWidth = rectWidth / 2.0,
|
2230
|
+
rectHalfHeight = rectHeight / 2.0,
|
2231
|
+
rectHorizontalCenter = bb.xMin + rectHalfWidth,
|
2232
|
+
rectVerticalCenter = bb.yMin + rectHalfHeight,
|
2233
|
+
edgePoint = {
|
2234
|
+
x: rectHorizontalCenter,
|
2235
|
+
y: rectVerticalCenter
|
2236
|
+
},
|
2237
|
+
markerPoint = {},
|
2238
|
+
xFactor = 1,
|
2239
|
+
yFactor = 1;
|
2240
|
+
|
2241
|
+
while (theta < -Math.PI) {
|
2242
|
+
theta += twoPI;
|
2243
|
+
}
|
2244
|
+
|
2245
|
+
while (theta > Math.PI) {
|
2246
|
+
theta -= twoPI;
|
2247
|
+
}
|
2248
|
+
|
2249
|
+
tanTheta = Math.tan(theta);
|
2250
|
+
|
2251
|
+
if ((theta > -rAtan) && (theta <= rAtan)) {
|
2252
|
+
// Right side
|
2253
|
+
yFactor = -1;
|
2254
|
+
leftOrRightRegion = true;
|
2255
|
+
} else if (theta > rAtan && theta <= (Math.PI - rAtan)) {
|
2256
|
+
// Top side
|
2257
|
+
yFactor = -1;
|
2258
|
+
} else if (theta > (Math.PI - rAtan) || theta <= -(Math.PI - rAtan)) {
|
2259
|
+
// Left side
|
2260
|
+
xFactor = -1;
|
2261
|
+
leftOrRightRegion = true;
|
2262
|
+
} else {
|
2263
|
+
// Bottom side
|
2264
|
+
xFactor = -1;
|
2265
|
+
}
|
2266
|
+
|
2267
|
+
// Correct the edgePoint according to the placement of the marker
|
2268
|
+
if (leftOrRightRegion) {
|
2269
|
+
edgePoint.x += xFactor * (rectHalfWidth);
|
2270
|
+
edgePoint.y += yFactor * (rectHalfWidth) * tanTheta;
|
2271
|
+
} else {
|
2272
|
+
edgePoint.x += xFactor * (rectHeight / (2.0 * tanTheta));
|
2273
|
+
edgePoint.y += yFactor * (rectHalfHeight);
|
2274
|
+
}
|
2275
|
+
|
2276
|
+
if (anchor.x !== rectHorizontalCenter) {
|
2277
|
+
edgePoint.x = anchor.x;
|
2278
|
+
}
|
2279
|
+
if (anchor.y !== rectVerticalCenter) {
|
2280
|
+
edgePoint.y = anchor.y;
|
2281
|
+
}
|
2282
|
+
|
2283
|
+
markerPoint.x = edgePoint.x + (markerRadius * Math.cos(theta));
|
2284
|
+
markerPoint.y = edgePoint.y - (markerRadius * Math.sin(theta));
|
2285
|
+
|
2286
|
+
return markerPoint;
|
2287
|
+
}
|
2288
|
+
});
|
2289
|
+
|
2290
|
+
|
2291
|
+
// Warn if using legacy options. Copy the options over. Note that this will
|
2292
|
+
// still break if using the legacy options in chart.update, addSeries etc.
|
2293
|
+
function warnLegacy(chart) {
|
2294
|
+
if (
|
2295
|
+
chart.options.pathfinder ||
|
2296
|
+
chart.series.reduce(function (acc, series) {
|
2297
|
+
if (series.options) {
|
2298
|
+
merge(
|
2299
|
+
true,
|
2300
|
+
(
|
2301
|
+
series.options.connectors = series.options.connectors ||
|
2302
|
+
{}
|
2303
|
+
), series.options.pathfinder
|
2304
|
+
);
|
2305
|
+
}
|
2306
|
+
return acc || series.options && series.options.pathfinder;
|
2307
|
+
}, false)
|
2308
|
+
) {
|
2309
|
+
merge(
|
2310
|
+
true,
|
2311
|
+
(chart.options.connectors = chart.options.connectors || {}),
|
2312
|
+
chart.options.pathfinder
|
2313
|
+
);
|
2314
|
+
H.error('WARNING: Pathfinder options have been renamed. ' +
|
2315
|
+
'Use "chart.connectors" or "series.connectors" instead.');
|
2316
|
+
}
|
2317
|
+
}
|
2318
|
+
|
2319
|
+
|
2320
|
+
// Initialize Pathfinder for charts
|
2321
|
+
H.Chart.prototype.callbacks.push(function (chart) {
|
2322
|
+
var options = chart.options;
|
2323
|
+
|
2324
|
+
if (options.connectors.enabled !== false) {
|
2325
|
+
warnLegacy(chart);
|
2326
|
+
this.pathfinder = new Pathfinder(this);
|
2327
|
+
this.pathfinder.update(true); // First draw, defer render
|
2328
|
+
}
|
2329
|
+
});
|
2330
|
+
|
2331
|
+
}(Highcharts, algorithms));
|
2332
|
+
return (function () {
|
2333
|
+
|
2334
|
+
|
2335
|
+
}());
|
2336
|
+
}));
|