@devexperts/dxcharts-lite 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +2 -2
  2. package/dist/chart/animation/canvas-animation.js +134 -1
  3. package/dist/chart/animation/types/animation.js +43 -1
  4. package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
  5. package/dist/chart/animation/types/color-alpha-animation.js +60 -1
  6. package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
  7. package/dist/chart/animation/types/color-transition-animation.js +86 -1
  8. package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
  9. package/dist/chart/animation/viewport-model-animation.js +20 -1
  10. package/dist/chart/bootstrap.d.ts +51 -48
  11. package/dist/chart/bootstrap.js +449 -1
  12. package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
  13. package/dist/chart/canvas/canvas-bounds-container.js +815 -1
  14. package/dist/chart/canvas/canvas-chart-html.js +16 -18
  15. package/dist/chart/canvas/chart-elements.d.ts +1 -4
  16. package/dist/chart/canvas/chart-elements.js +22 -1
  17. package/dist/chart/canvas/cursor.handler.js +122 -1
  18. package/dist/chart/canvas/layout-creator.js +34 -1
  19. package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
  20. package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
  21. package/dist/chart/chart-container.js +1 -1
  22. package/dist/chart/chart.config.d.ts +4 -5
  23. package/dist/chart/chart.config.js +645 -1
  24. package/dist/chart/chart.d.ts +62 -0
  25. package/dist/chart/chart.js +106 -0
  26. package/dist/chart/components/chart/basic-scale.d.ts +2 -2
  27. package/dist/chart/components/chart/basic-scale.js +31 -1
  28. package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
  29. package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
  30. package/dist/chart/components/chart/candle.functions.js +44 -1
  31. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
  32. package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
  33. package/dist/chart/components/chart/chart-base.model.js +66 -1
  34. package/dist/chart/components/chart/chart.component.d.ts +7 -3
  35. package/dist/chart/components/chart/chart.component.js +408 -1
  36. package/dist/chart/components/chart/chart.model.d.ts +4 -11
  37. package/dist/chart/components/chart/chart.model.js +954 -1
  38. package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
  39. package/dist/chart/components/chart/fake-candles.js +97 -1
  40. package/dist/chart/components/chart/price.formatter.js +35 -1
  41. package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
  42. package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
  43. package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
  44. package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
  45. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
  46. package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
  47. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
  48. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
  49. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
  50. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  51. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  52. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  53. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  54. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  55. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  56. package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
  57. package/dist/chart/components/events/events.component.js +61 -1
  58. package/dist/chart/components/events/events.drawer.js +195 -1
  59. package/dist/chart/components/events/events.model.js +69 -1
  60. package/dist/chart/components/grid/grid.component.d.ts +2 -2
  61. package/dist/chart/components/grid/grid.component.js +31 -1
  62. package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
  63. package/dist/chart/components/grid/grid.drawer.js +106 -1
  64. package/dist/chart/components/high_low/high-low.component.js +12 -1
  65. package/dist/chart/components/high_low/high-low.drawer.js +126 -1
  66. package/dist/chart/components/highlights/highlights.component.js +46 -1
  67. package/dist/chart/components/highlights/highlights.drawer.js +154 -1
  68. package/dist/chart/components/highlights/highlights.model.js +75 -1
  69. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
  70. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
  71. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
  72. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
  73. package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
  74. package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
  75. package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
  76. package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
  77. package/dist/chart/components/pan/chart-pan.component.js +51 -1
  78. package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
  79. package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
  80. package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
  81. package/dist/chart/components/pane/pane-manager.component.d.ts +10 -5
  82. package/dist/chart/components/pane/pane-manager.component.js +148 -1
  83. package/dist/chart/components/pane/pane.component.d.ts +16 -32
  84. package/dist/chart/components/pane/pane.component.js +278 -1
  85. package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
  86. package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
  87. package/dist/chart/components/snapshot/snapshot.component.js +48 -1
  88. package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
  89. package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
  90. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
  91. package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
  92. package/dist/chart/components/volumes/volumes.component.js +94 -1
  93. package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
  94. package/dist/chart/components/volumes/volumes.drawer.js +140 -1
  95. package/dist/chart/components/volumes/volumes.formatter.js +31 -1
  96. package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
  97. package/dist/chart/components/volumes/volumes.model.js +43 -1
  98. package/dist/chart/components/watermark/water-mark.component.js +103 -1
  99. package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
  100. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
  101. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
  102. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
  103. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
  104. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
  105. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
  106. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
  107. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
  108. package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
  109. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
  110. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
  111. package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
  112. package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
  113. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
  114. package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
  115. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
  116. package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
  117. package/dist/chart/components/x_axis/x-axis.component.js +119 -1
  118. package/dist/chart/components/y_axis/label-color.functions.js +53 -1
  119. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
  120. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
  121. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
  122. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
  123. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
  124. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +95 -1
  125. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
  126. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
  127. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
  128. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
  129. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
  130. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
  131. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
  132. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
  133. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
  134. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
  135. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
  136. package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
  137. package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
  138. package/dist/chart/components/y_axis/y-axis.component.js +220 -1
  139. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
  140. package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
  141. package/dist/chart/components/y_axis/y-axis.model.d.ts +9 -17
  142. package/dist/chart/components/y_axis/y-axis.model.js +33 -1
  143. package/dist/chart/drawers/chart-background.drawer.js +69 -1
  144. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
  145. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
  146. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
  147. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
  148. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
  149. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
  150. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
  151. package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
  152. package/dist/chart/drawers/composite.drawer.js +67 -1
  153. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
  154. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
  155. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
  156. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
  157. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
  158. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
  159. package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
  160. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
  161. package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
  162. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
  163. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
  164. package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
  165. package/dist/chart/drawers/data-series.drawer.js +56 -1
  166. package/dist/chart/drawers/drawing-manager.d.ts +1 -1
  167. package/dist/chart/drawers/drawing-manager.js +177 -1
  168. package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
  169. package/dist/chart/events/event-bus.js +73 -1
  170. package/dist/chart/events/events.js +3 -1
  171. package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
  172. package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
  173. package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
  174. package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
  175. package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
  176. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
  177. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
  178. package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
  179. package/dist/chart/model/baseline.model.js +88 -1
  180. package/dist/chart/model/bounds.model.js +1 -1
  181. package/dist/chart/model/candle-hover.js +70 -1
  182. package/dist/chart/model/candle-series-high-low.provider.js +45 -1
  183. package/dist/chart/model/candle-series.model.d.ts +3 -3
  184. package/dist/chart/model/candle-series.model.js +245 -1
  185. package/dist/chart/model/candle.model.js +69 -1
  186. package/dist/chart/model/canvas.model.js +228 -1
  187. package/dist/chart/model/chart-base-element.js +129 -1
  188. package/dist/chart/model/compare-series-hover.js +25 -1
  189. package/dist/chart/model/data-series-view.d.ts +5 -5
  190. package/dist/chart/model/data-series-view.js +111 -1
  191. package/dist/chart/model/data-series.config.js +14 -1
  192. package/dist/chart/model/data-series.model.d.ts +4 -4
  193. package/dist/chart/model/data-series.model.js +281 -1
  194. package/dist/chart/model/date-time.formatter.js +151 -1
  195. package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
  196. package/dist/chart/model/hit-test-canvas.model.js +256 -1
  197. package/dist/chart/model/main-candle-series.model.d.ts +1 -1
  198. package/dist/chart/model/main-candle-series.model.js +29 -1
  199. package/dist/chart/model/scale.model.d.ts +2 -1
  200. package/dist/chart/model/scale.model.js +316 -1
  201. package/dist/chart/model/scaling/auto-scale.model.js +97 -1
  202. package/dist/chart/model/scaling/constrait.functions.js +61 -1
  203. package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
  204. package/dist/chart/model/scaling/move-chart.functions.js +22 -1
  205. package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
  206. package/dist/chart/model/scaling/viewport.model.js +279 -1
  207. package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
  208. package/dist/chart/model/time-zone.model.js +109 -1
  209. package/dist/chart/model/visual-candle.js +134 -1
  210. package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
  211. package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
  212. package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
  213. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
  214. package/dist/chart/utils/array.utils.d.ts +1 -1
  215. package/dist/chart/utils/array.utils.js +269 -1
  216. package/dist/chart/utils/auto-period-detector.utils.js +39 -1
  217. package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
  218. package/dist/chart/utils/candles-generator.utils.js +161 -1
  219. package/dist/chart/utils/candles.utils.js +42 -1
  220. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
  221. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
  222. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
  223. package/dist/chart/utils/color.utils.js +31 -1
  224. package/dist/chart/utils/device/browser.utils.js +10 -1
  225. package/dist/chart/utils/device/device-detector.utils.js +24 -1
  226. package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
  227. package/dist/chart/utils/device/touchpad.utils.js +91 -1
  228. package/dist/chart/utils/dom.utils.js +15 -1
  229. package/dist/chart/utils/function.utils.js +16 -1
  230. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  231. package/dist/chart/utils/linkedList.utils.js +138 -0
  232. package/dist/chart/utils/math.utils.js +115 -1
  233. package/dist/chart/utils/merge.utils.js +56 -1
  234. package/dist/chart/utils/object.utils.js +43 -1
  235. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  236. package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
  237. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  238. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  239. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  240. package/dist/chart/utils/price-increments.utils.d.ts +1 -0
  241. package/dist/chart/utils/price-increments.utils.js +127 -1
  242. package/dist/chart/utils/uuid.utils.js +4 -1
  243. package/dist/dxchart.min.js +9 -12
  244. package/dist/index.d.ts +3 -3
  245. package/dist/index.js +20 -1
  246. package/package.json +4 -4
  247. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  248. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  249. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  250. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
  251. /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
  252. /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
  253. /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
  254. /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
  255. /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
@@ -3,4 +3,100 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export class AutoScaleViewportSubModel{constructor(o,e){this.delegate=o,this.auto=!0,this.highLowPostPorcessor={},this.highLowProviders=e!=null?e:{}}setHighLowProvider(o,e){this.highLowProviders[o]=e}deleteHighLowProvider(o){delete this.highLowProviders[o]}setHighLowPostProcessor(o,e){this.highLowPostPorcessor[o]=e}setAutoAndRecalculateState(o,e){this.auto=e,e&&autoScaleYViewportTransformer(this.delegate,o,Object.values(this.highLowProviders),Object.values(this.highLowPostPorcessor))}}export const autoScaleYViewportTransformer=(i,o,e,t)=>{const h=e.filter(r=>r.isHighLowActive()).map(r=>r.calculateHighLow(o)),l=mergeHighLow(h),s=t.reduce((r,c)=>c(r),l);o.yStart=s.low,o.yEnd=s.high,o.zoomY=i.calculateZoomY(o.yStart,o.yEnd)};export function mergeHighLow(i){if(i.length===0)return getDefaultHighLow();let o=i[0].high,e=i[0].low;return i.forEach(t=>{isFinite(t.high)&&t.high>=o&&(o=t.high),isFinite(t.low)&&t.low<=e&&(e=t.low)}),{low:e,high:o}}export const getDefaultHighLow=()=>({high:Number.MIN_SAFE_INTEGER,low:Number.MAX_SAFE_INTEGER});
6
+ /**
7
+ * Auxiliary sub-model to apply X,Y auto-scaling feature.
8
+ * Transforms the original ViewportModel.
9
+ * @doc-tags auto-scale,viewport,scaling
10
+ */
11
+ export class AutoScaleViewportSubModel {
12
+ constructor(delegate, highLowProviders) {
13
+ this.delegate = delegate;
14
+ // local state, used for pane X dragging
15
+ this.auto = true;
16
+ // post processors can apply some changes to high low before applying it
17
+ this.highLowPostPorcessor = {};
18
+ this.highLowProviders = highLowProviders !== null && highLowProviders !== void 0 ? highLowProviders : {};
19
+ }
20
+ /**
21
+ * Sets a HighLowProvider for a given name.
22
+ * @param {string} name - The name of the HighLowProvider.
23
+ * @param {HighLowProvider} provider - The HighLowProvider to be set.
24
+ */
25
+ setHighLowProvider(name, provider) {
26
+ this.highLowProviders[name] = provider;
27
+ }
28
+ /**
29
+ * Deletes a high-low provider from the list of high-low providers.
30
+ * @param {string} name - The name of the high-low provider to be deleted.
31
+ */
32
+ deleteHighLowProvider(name) {
33
+ delete this.highLowProviders[name];
34
+ }
35
+ /**
36
+ * Sets a HighLowPostProcessor for a given name.
37
+ *
38
+ * @param {string} name - The name of the HighLowPostProcessor.
39
+ * @param {HighLowPostProcessor} processor - The HighLowPostProcessor to be set.
40
+ * @returns {void}
41
+ */
42
+ setHighLowPostProcessor(name, processor) {
43
+ this.highLowPostPorcessor[name] = processor;
44
+ }
45
+ /**
46
+ * Sets the auto and recalculates the state of the viewport model.
47
+ * @param {ViewportModelState} state - The state of the viewport model.
48
+ * @param {boolean} auto - The auto value to set.
49
+ * @returns {void}
50
+ */
51
+ setAutoAndRecalculateState(state, auto) {
52
+ this.auto = auto;
53
+ if (auto) {
54
+ autoScaleYViewportTransformer(this.delegate, state, Object.values(this.highLowProviders), Object.values(this.highLowPostPorcessor));
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Y auto-scale viewport transformer. Calculates highLow for all chart visuals and recalculates the Y scale.
60
+ * @param vm
61
+ * @param state
62
+ * @param highLowProviders
63
+ * @param highLowPostProcessors
64
+ */
65
+ export const autoScaleYViewportTransformer = (vm, state, highLowProviders, highLowPostProcessors) => {
66
+ const highLowList = highLowProviders
67
+ .filter(provider => provider.isHighLowActive())
68
+ .map(provider => provider.calculateHighLow(state));
69
+ const highLow = mergeHighLow(highLowList);
70
+ const postProcessedHighLow = highLowPostProcessors.reduce((prevResult, postProcessor) => postProcessor(prevResult), highLow);
71
+ state.yStart = postProcessedHighLow.low;
72
+ state.yEnd = postProcessedHighLow.high;
73
+ state.zoomY = vm.calculateZoomY(state.yStart, state.yEnd);
74
+ };
75
+ /**
76
+ * Merges an array of HighLow objects into a single HighLow object.
77
+ * @param {HighLow[]} input - The array of HighLow objects to be merged.
78
+ * @returns {HighLow} - The merged HighLow object.
79
+
80
+ */
81
+ export function mergeHighLow(input) {
82
+ if (input.length === 0) {
83
+ return getDefaultHighLow();
84
+ }
85
+ let max = input[0].high;
86
+ let min = input[0].low;
87
+ input.forEach(highLow => {
88
+ if (isFinite(highLow.high) && highLow.high >= max) {
89
+ max = highLow.high;
90
+ }
91
+ if (isFinite(highLow.low) && highLow.low <= min) {
92
+ min = highLow.low;
93
+ }
94
+ });
95
+ return { low: min, high: max };
96
+ }
97
+ export const getDefaultHighLow = () => {
98
+ return {
99
+ high: Number.MIN_SAFE_INTEGER,
100
+ low: Number.MAX_SAFE_INTEGER,
101
+ };
102
+ };
@@ -3,4 +3,64 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{at as S}from"../../utils/array.utils";import{calculateZoom as E,pixelsToUnits as w}from"./viewport.model";export const candleEdgesConstrait=(d,s,r,l)=>{var t,o,i,a;const n=Object.assign({},d),e=(o=(t=s[r])===null||t===void 0?void 0:t.startUnit)!==null&&o!==void 0?o:0,c=(a=(i=S(-r,s))===null||i===void 0?void 0:i.startUnit)!==null&&a!==void 0?a:0;let m=d.xStart,x=d.xEnd;return n.xStart>=c&&(m=c,x=x-(n.xStart-c)),n.xEnd<e&&(m=e-w(l.width,n.zoomX),x=e),n.xStart=m,n.xEnd=x,n},zoomConstraint=(d,s,r,l)=>{const t=Object.assign({},s),o=l(),i=t.xEnd-t.xStart,a=i<r.minCandles,n=o.width/r.minWidth,e=i>n;if(o.width>0){if(e)return t.xStart=t.xEnd-n,t.zoomX=E(t.xEnd-t.xStart,o.width),t;if(a)return t.xEnd=d.xEnd,t.xStart=t.xEnd-r.minCandles,t.zoomX=E(t.xEnd-t.xStart,o.width),t}return t};
6
+ import { at } from '../../utils/array.utils';
7
+ import { calculateZoom, pixelsToUnits } from './viewport.model';
8
+ /**
9
+ * Return constraited state that handled zooming and moving chart near first/last candles
10
+ * this and other constraits that works with state should mutate and return state
11
+ * @param initialState
12
+ * @param state
13
+ * @param visualCandlesCoordinates
14
+ * @param candleLimit
15
+ * @param bounds
16
+ * @returns
17
+ * @doc-tags viewport,zoom,scaling
18
+ */
19
+ export const candleEdgesConstrait = (state, visualCandlesCoordinates, candleLimit, bounds) => {
20
+ var _a, _b, _c, _d;
21
+ const newState = Object.assign({}, state);
22
+ const leftConstraitCoordinate = (_b = (_a = visualCandlesCoordinates[candleLimit]) === null || _a === void 0 ? void 0 : _a.startUnit) !== null && _b !== void 0 ? _b : 0;
23
+ const rightConstraintCoordinate = (_d = (_c = at(-candleLimit, visualCandlesCoordinates)) === null || _c === void 0 ? void 0 : _c.startUnit) !== null && _d !== void 0 ? _d : 0;
24
+ let normalizedXStart = state.xStart;
25
+ let normalizedXEnd = state.xEnd;
26
+ if (newState.xStart >= rightConstraintCoordinate) {
27
+ normalizedXStart = rightConstraintCoordinate;
28
+ normalizedXEnd = normalizedXEnd - (newState.xStart - rightConstraintCoordinate);
29
+ }
30
+ if (newState.xEnd < leftConstraitCoordinate) {
31
+ normalizedXStart = leftConstraitCoordinate - pixelsToUnits(bounds.width, newState.zoomX);
32
+ normalizedXEnd = leftConstraitCoordinate;
33
+ }
34
+ newState.xStart = normalizedXStart;
35
+ newState.xEnd = normalizedXEnd;
36
+ return newState;
37
+ };
38
+ /**
39
+ * This function limits minimum and maximum chart viewport dependening on visible x-units
40
+ * @returns
41
+ * @doc-tags viewport,zoom,scaling
42
+ */
43
+ export const zoomConstraint = (initialState, state, chartConfig, boundsProvider) => {
44
+ const newState = Object.assign({}, state);
45
+ const bounds = boundsProvider();
46
+ // 1 - is an average candle width: newXEnd - newXStart = avg candles amount in the viewport
47
+ const avgCandlesInViewport = newState.xEnd - newState.xStart;
48
+ const minViewportReached = avgCandlesInViewport < chartConfig.minCandles;
49
+ const maxCandlesInViewport = bounds.width / chartConfig.minWidth;
50
+ const maxViewportReached = avgCandlesInViewport > maxCandlesInViewport;
51
+ // rules work only if chart is shown
52
+ if (bounds.width > 0) {
53
+ if (maxViewportReached) {
54
+ newState.xStart = newState.xEnd - maxCandlesInViewport;
55
+ newState.zoomX = calculateZoom(newState.xEnd - newState.xStart, bounds.width);
56
+ return newState;
57
+ }
58
+ if (minViewportReached) {
59
+ newState.xEnd = initialState.xEnd;
60
+ newState.xStart = newState.xEnd - chartConfig.minCandles;
61
+ newState.zoomX = calculateZoom(newState.xEnd - newState.xStart, bounds.width);
62
+ return newState;
63
+ }
64
+ }
65
+ return newState;
66
+ };
@@ -3,4 +3,20 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export const ratioFromZoomXY=(o,n)=>o/n,zoomXToZoomY=(o,n)=>o/n,zoomYToZoomX=(o,n)=>o*n,lockedYEndViewportCalculator=(o,n)=>{const Y=o.zoomY;o.zoomY=zoomXToZoomY(o.zoomX,n);const c=o.zoomY/Y,m=o.yEnd-o.yStart,r=m*c-m;o.yEnd=o.yEnd+r};
6
+ export const ratioFromZoomXY = (zoomX, zoomY) => zoomX / zoomY;
7
+ export const zoomXToZoomY = (zoomX, ratio) => zoomX / ratio;
8
+ export const zoomYToZoomX = (zoomY, ratio) => zoomY * ratio;
9
+ /**
10
+ * Locks the zoomY with zoomX and moves yEnd according to ratio changes.
11
+ * @param state
12
+ * @param zoomXYRatio
13
+ */
14
+ export const lockedYEndViewportCalculator = (state, zoomXYRatio) => {
15
+ const prevZoomY = state.zoomY;
16
+ state.zoomY = zoomXToZoomY(state.zoomX, zoomXYRatio);
17
+ const zoomYMult = state.zoomY / prevZoomY;
18
+ const lastYHeight = state.yEnd - state.yStart;
19
+ const newYHeight = lastYHeight * zoomYMult;
20
+ const delta = newYHeight - lastYHeight;
21
+ state.yEnd = state.yEnd + delta;
22
+ };
@@ -3,4 +3,25 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export const moveXStart=(n,o)=>{const r=n.xStart;n.xStart=o,n.xEnd=n.xEnd+(o-r)},moveYStart=(n,o)=>{const r=n.yStart;n.yStart=o,n.yEnd=n.yEnd+(o-r)};
6
+ /**
7
+ * Moves both xStart and xEnd without changing the viewport width (zoomX).
8
+ * @param state
9
+ * @param xStart - left starting point in units
10
+ * @doc-tags scaling,viewport
11
+ */
12
+ export const moveXStart = (state, xStart) => {
13
+ const prev = state.xStart;
14
+ state.xStart = xStart;
15
+ state.xEnd = state.xEnd + (xStart - prev);
16
+ };
17
+ /**
18
+ * Moves both yStart and yEnd without changing the viewport height (zoomY).
19
+ * @param state
20
+ * @param yStart - starting point in units
21
+ * @doc-tags scaling,viewport
22
+ */
23
+ export const moveYStart = (state, yStart) => {
24
+ const prev = state.yStart;
25
+ state.yStart = yStart;
26
+ state.yEnd = state.yEnd + (yStart - prev);
27
+ };
@@ -19,8 +19,8 @@ export type Timestamp = Unit;
19
19
  export type Percent = Unit;
20
20
  export type LogValue = Unit;
21
21
  export type YUnit = Price | Percent | LogValue;
22
- export declare const unitToPercent: (value: Unit, baseLine: Unit) => Percent;
23
- export declare const percentToUnit: (percent: Percent, baseLine: Unit) => Unit;
22
+ export declare const unitToPercent: (value: Unit, baseline: Unit) => Percent;
23
+ export declare const percentToUnit: (percent: Percent, baseline: Unit) => Unit;
24
24
  export declare const calcLogValue: (value: Price) => LogValue;
25
25
  export declare const logValueToUnit: (logValue: LogValue) => number;
26
26
  /**
@@ -3,4 +3,282 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{Subject as n}from"rxjs";import{distinctUntilChanged as o,map as r,share as h}from"rxjs/operators";import{ChartBaseElement as a}from"../chart-base-element";import{keys as d}from"../../utils/object.utils";export const calculateZoom=(e,t)=>e/t,unitToPixels=(e,t)=>e/t,pixelsToUnits=(e,t)=>e*t,unitToPercent=(e,t)=>(e-t)*100/t,percentToUnit=(e,t)=>e*t/100+t,calcLogValue=e=>Math.log2(e),logValueToUnit=e=>Math.pow(2,e);export class ViewportModel extends a{constructor(){super(...arguments),this._xStart=0,this._xEnd=0,this._yStart=0,this._yEnd=0,this._zoomX=1,this._zoomY=1,this._inverseY=!1,this.changed=new n,this.xChanged=this.changed.pipe(r(()=>({start:this.xStart,end:this.xEnd})),o((t,s)=>t.start===s.start&&t.end===s.end),h()),this.yChanged=this.changed.pipe(r(()=>({start:this.yStart,end:this.yEnd})),o((t,s)=>t.start===s.start&&t.end===s.end),h())}toX(t){return this.getBounds().x+unitToPixels(t-this.xStart,this.zoomX)}xPixels(t){return unitToPixels(t,this.zoomX)}toY(t){return this.inverseY?this.getBounds().y+unitToPixels(t-this.yStart,this.zoomY):this.getBounds().y+this.getBounds().height-unitToPixels(t-this.yStart,this.zoomY)}yPixels(t){return unitToPixels(t,this.zoomY)}fromX(t){const s=t-this.getBounds().x;return pixelsToUnits(s+unitToPixels(this.xStart,this.zoomX),this.zoomX)}fromY(t){const s=t-this.getBounds().y;return this.inverseY?pixelsToUnits(s+unitToPixels(this.yStart,this.zoomY),this.zoomY):pixelsToUnits(this.getBounds().height-s+unitToPixels(this.yStart,this.zoomY),this.zoomY)}recalculateZoomX(){this.zoomX=this.calculateZoomX(this.xStart,this.xEnd)}recalculateZoomY(){this.zoomY=this.calculateZoomY(this.yStart,this.yEnd)}calculateZoomX(t,s){return calculateZoom(s-t,this.getBounds().width)}calculateZoomY(t,s){return calculateZoom(s-t,this.getBounds().height)}recalculateZoom(t=!0){this.recalculateZoomX(),this.recalculateZoomY(),t&&this.fireChanged()}setXScale(t,s,i=!0){this.xStart=t,this.xEnd=s,this.recalculateZoomX(),i&&this.fireChanged()}setYScale(t,s,i=!0){this.yStart=t,this.yEnd=s,this.recalculateZoomY(),i&&this.fireChanged()}export(){return{xStart:this.xStart,xEnd:this.xEnd,yStart:this.yStart,yEnd:this.yEnd,zoomX:this.zoomX,zoomY:this.zoomY,inverseY:this.inverseY}}apply(t){this.xStart=t.xStart,this.xEnd=t.xEnd,this.yStart=t.yStart,this.yEnd=t.yEnd,this.zoomX=t.zoomX,this.zoomY=t.zoomY,this.inverseY=t.inverseY,this.fireChanged()}fireChanged(){this.changed.next()}get xStart(){return this._xStart}set xStart(t){this._xStart=t}get xEnd(){return this._xEnd}set xEnd(t){this._xEnd=t}get yStart(){return this._yStart}set yStart(t){this._yStart=t}get yEnd(){return this._yEnd}set yEnd(t){this._yEnd=t}get zoomX(){return this._zoomX}set zoomX(t){this._zoomX=t}get zoomY(){return this._zoomY}set zoomY(t){this._zoomY=t}get inverseY(){return this._inverseY}set inverseY(t){this._inverseY=t}isViewportValid(){return this.xStart!==this.xEnd&&this.yStart!==this.yEnd&&isFinite(this.yStart)&&isFinite(this.yEnd)}}export const compareStates=(e,t)=>!d(e).some(s=>e[s]!==t[s]);
6
+ import { Subject } from 'rxjs';
7
+ import { distinctUntilChanged, map, share } from 'rxjs/operators';
8
+ import { ChartBaseElement } from '../chart-base-element';
9
+ import { keys } from '../../utils/object.utils';
10
+ export const calculateZoom = (viewportUnits, viewportPixels) => viewportUnits / viewportPixels;
11
+ export const unitToPixels = (units, zoom) => units / zoom;
12
+ export const pixelsToUnits = (px, zoom) => px * zoom;
13
+ export const unitToPercent = (value, baseline) => ((value - baseline) * 100) / baseline;
14
+ export const percentToUnit = (percent, baseline) => (percent * baseline) / 100 + baseline;
15
+ // log calculations
16
+ export const calcLogValue = (value) => Math.log2(value);
17
+ export const logValueToUnit = (logValue) => Math.pow(2, logValue);
18
+ /**
19
+ * Abstract viewport model.
20
+ * Viewport has 4 coordinates: xStart, xEnd, yStart and yEnd - all stored in {@link Unit}.
21
+ * Main methods:
22
+ * - {@link toX} - converts xUnits to xPixels
23
+ * - {@link toY} - converts yUnits to yPixels
24
+ * - {@link fromX} - converts xPixels to xUnits
25
+ * - {@link fromY} - converts yPixels to yUnits
26
+ *
27
+ * To convert unit-pixels and vice versa uses {@link getBounds} method.
28
+ * zoomX and zoomY are proportions between units and pixels.
29
+ */
30
+ export class ViewportModel extends ChartBaseElement {
31
+ constructor() {
32
+ super(...arguments);
33
+ //region base viewport model props
34
+ this._xStart = 0;
35
+ this._xEnd = 0;
36
+ this._yStart = 0;
37
+ this._yEnd = 0;
38
+ this._zoomX = 1;
39
+ this._zoomY = 1;
40
+ //endregion
41
+ // toggle Y inverse mode
42
+ this._inverseY = false;
43
+ //region subjects
44
+ this.changed = new Subject();
45
+ this.xChanged = this.changed.pipe(map(() => ({
46
+ start: this.xStart,
47
+ end: this.xEnd,
48
+ })), distinctUntilChanged((p, c) => p.start === c.start && p.end === c.end), share());
49
+ this.yChanged = this.changed.pipe(map(() => ({
50
+ start: this.yStart,
51
+ end: this.yEnd,
52
+ })), distinctUntilChanged((p, c) => p.start === c.start && p.end === c.end), share());
53
+ }
54
+ //endregion
55
+ //region conversion methods
56
+ /**
57
+ * Converts a unit value to pixels based on the current zoom level and xStart value.
58
+ * @param {Unit} unit - The unit value to be converted to pixels.
59
+ * @returns {Pixel} - The converted pixel value.
60
+ */
61
+ toX(unit) {
62
+ return this.getBounds().x + unitToPixels(unit - this.xStart, this.zoomX);
63
+ }
64
+ /**
65
+ * Converts a unit value to pixels based on the current zoom level in the x-axis.
66
+ * @param {Unit} unit - The unit value to be converted to pixels.
67
+ * @returns {Pixel} - The converted value in pixels.
68
+ */
69
+ xPixels(unit) {
70
+ return unitToPixels(unit, this.zoomX);
71
+ }
72
+ /**
73
+ * Converts a given unit value to pixel value in the Y-axis.
74
+ * @param {Unit} unit - The unit value to be converted to pixel value.
75
+ * @returns {Pixel} - The pixel value of the given unit value in the Y-axis.
76
+ */
77
+ toY(unit) {
78
+ if (this.inverseY) {
79
+ return this.getBounds().y + unitToPixels(unit - this.yStart, this.zoomY);
80
+ }
81
+ else {
82
+ // inverse by default because canvas calculation [0,0] point starts from top-left corner
83
+ return this.getBounds().y + this.getBounds().height - unitToPixels(unit - this.yStart, this.zoomY);
84
+ }
85
+ }
86
+ /**
87
+ * Converts a unit value to pixels based on the current zoom level in the Y axis.
88
+ * @param {Unit} unit - The unit value to be converted to pixels.
89
+ * @returns {Pixel} - The converted value in pixels.
90
+ */
91
+ yPixels(unit) {
92
+ return unitToPixels(unit, this.zoomY);
93
+ }
94
+ /**
95
+ * Converts a pixel value to a unit value based on the current zoom level and xStart value.
96
+ * @param {Pixel} px - The pixel value to convert to unit value.
97
+ * @returns {Unit} - The converted unit value.
98
+ */
99
+ fromX(px) {
100
+ const normalizedPx = px - this.getBounds().x;
101
+ return pixelsToUnits(normalizedPx + unitToPixels(this.xStart, this.zoomX), this.zoomX);
102
+ }
103
+ /**
104
+ * Converts a pixel value to a unit value along the y-axis.
105
+ * @param {Pixel} px - The pixel value to be converted.
106
+ * @returns {void}
107
+ */
108
+ fromY(px) {
109
+ const normalizedPx = px - this.getBounds().y;
110
+ if (this.inverseY) {
111
+ return pixelsToUnits(normalizedPx + unitToPixels(this.yStart, this.zoomY), this.zoomY);
112
+ }
113
+ else {
114
+ // inverse by default because canvas calculation [0,0] point starts from top-left corner
115
+ return pixelsToUnits(this.getBounds().height - normalizedPx + unitToPixels(this.yStart, this.zoomY), this.zoomY);
116
+ }
117
+ }
118
+ //endregion
119
+ /**
120
+ * Recalculates the zoom factor for the x-axis based on the start and end values of the x-axis.
121
+ * @function
122
+ * @name recalculateZoomX
123
+ * @memberof ClassName
124
+ * @instance
125
+ * @returns {void}
126
+ */
127
+ recalculateZoomX() {
128
+ this.zoomX = this.calculateZoomX(this.xStart, this.xEnd);
129
+ }
130
+ /**
131
+ * Recalculates the zoomY property of the object.
132
+ * The zoomY property is calculated using the yStart and yEnd properties of the object.
133
+ * @function
134
+ * @name recalculateZoomY
135
+ * @memberof Object
136
+ * @instance
137
+ * @returns {void}
138
+ */
139
+ recalculateZoomY() {
140
+ this.zoomY = this.calculateZoomY(this.yStart, this.yEnd);
141
+ }
142
+ /**
143
+ * Calculates the zoom factor for the x-axis based on the start and end units.
144
+ * @param {Unit} start - The start unit.
145
+ * @param {Unit} end - The end unit.
146
+ * @returns {Zoom} The zoom factor for the x-axis.
147
+ */
148
+ calculateZoomX(start, end) {
149
+ return calculateZoom(end - start, this.getBounds().width);
150
+ }
151
+ /**
152
+ * Calculates the zoom factor for the Y axis based on the start and end units.
153
+ * @param {Unit} start - The start unit.
154
+ * @param {Unit} end - The end unit.
155
+ * @returns {Zoom} The zoom factor for the Y axis.
156
+ */
157
+ calculateZoomY(start, end) {
158
+ return calculateZoom(end - start, this.getBounds().height);
159
+ }
160
+ /**
161
+ * Should be called when x/y start/end changes.
162
+ */
163
+ recalculateZoom(fireChanged = true) {
164
+ this.recalculateZoomX();
165
+ this.recalculateZoomY();
166
+ fireChanged && this.fireChanged();
167
+ }
168
+ /**
169
+ * Moves the viewport to exactly xStart..xEnd place.
170
+ * (you need to fire DRAW event after this)
171
+ * @param xStart - viewport start in units
172
+ * @param xEnd - viewport end in units
173
+ * @param fireChanged - fire changed event
174
+ */
175
+ setXScale(xStart, xEnd, fireChanged = true) {
176
+ this.xStart = xStart;
177
+ this.xEnd = xEnd;
178
+ this.recalculateZoomX();
179
+ fireChanged && this.fireChanged();
180
+ }
181
+ /**
182
+ * Moves the viewport to exactly yStart..yEnd place.
183
+ * (you need to fire DRAW event after this)
184
+ * @param yStart - viewport start in units
185
+ * @param yEnd - viewport end in units
186
+ * @param fireChanged - fire changed event
187
+ */
188
+ setYScale(yStart, yEnd, fireChanged = true) {
189
+ this.yStart = yStart;
190
+ this.yEnd = yEnd;
191
+ this.recalculateZoomY();
192
+ fireChanged && this.fireChanged();
193
+ }
194
+ /**
195
+ * Exports current state of VM.
196
+ */
197
+ export() {
198
+ return {
199
+ xStart: this.xStart,
200
+ xEnd: this.xEnd,
201
+ yStart: this.yStart,
202
+ yEnd: this.yEnd,
203
+ zoomX: this.zoomX,
204
+ zoomY: this.zoomY,
205
+ inverseY: this.inverseY,
206
+ };
207
+ }
208
+ /**
209
+ * Applies the state to current VM.
210
+ * @param state
211
+ */
212
+ apply(state) {
213
+ this.xStart = state.xStart;
214
+ this.xEnd = state.xEnd;
215
+ this.yStart = state.yStart;
216
+ this.yEnd = state.yEnd;
217
+ this.zoomX = state.zoomX;
218
+ this.zoomY = state.zoomY;
219
+ this.inverseY = state.inverseY;
220
+ this.fireChanged();
221
+ }
222
+ /**
223
+ * Emits a notification that the object has changed.
224
+ * @function
225
+ * @name fireChanged
226
+ * @memberof ClassName
227
+ * @instance
228
+ * @returns {void}
229
+ */
230
+ fireChanged() {
231
+ this.changed.next();
232
+ }
233
+ get xStart() {
234
+ return this._xStart;
235
+ }
236
+ set xStart(value) {
237
+ this._xStart = value;
238
+ }
239
+ get xEnd() {
240
+ return this._xEnd;
241
+ }
242
+ set xEnd(value) {
243
+ this._xEnd = value;
244
+ }
245
+ get yStart() {
246
+ return this._yStart;
247
+ }
248
+ set yStart(value) {
249
+ this._yStart = value;
250
+ }
251
+ get yEnd() {
252
+ return this._yEnd;
253
+ }
254
+ set yEnd(value) {
255
+ this._yEnd = value;
256
+ }
257
+ get zoomX() {
258
+ return this._zoomX;
259
+ }
260
+ set zoomX(value) {
261
+ this._zoomX = value;
262
+ }
263
+ get zoomY() {
264
+ return this._zoomY;
265
+ }
266
+ set zoomY(value) {
267
+ this._zoomY = value;
268
+ }
269
+ get inverseY() {
270
+ return this._inverseY;
271
+ }
272
+ set inverseY(value) {
273
+ this._inverseY = value;
274
+ }
275
+ /**
276
+ * Checks if the viewport is valid.
277
+ *
278
+ * @returns {boolean} - Returns true if the viewport is valid, false otherwise.
279
+ */
280
+ isViewportValid() {
281
+ return this.xStart !== this.xEnd && this.yStart !== this.yEnd && isFinite(this.yStart) && isFinite(this.yEnd);
282
+ }
283
+ }
284
+ export const compareStates = (a, b) => !keys(a).some(k => a[k] !== b[k]);
@@ -3,4 +3,38 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export const zoomXToPercentViewportCalculator=(n,o,r,x,E)=>{const d=(o.xEnd-o.xStart)*x,l=d*r,c=d*(1-r);return E?(o.xStart=o.xStart+l,o.xEnd=o.xEnd-c):(o.xStart=o.xStart-l,o.xEnd=o.xEnd+c),o.zoomX=n.calculateZoomX(o.xStart,o.xEnd),o},zoomXToEndViewportCalculator=(n,o,r,x)=>zoomXToPercentViewportCalculator(n,o,1,r,x);
6
+ /**
7
+ * Zooms to percentage of viewport proportionally.
8
+ * @param vm
9
+ * @param state
10
+ * @param viewportPercent
11
+ * @param zoomStrength - 0..1 number, 1=max strength
12
+ * @param zoomIn
13
+ * @doc-tags viewport,zoom,scaling
14
+ */
15
+ export const zoomXToPercentViewportCalculator = (vm, state, viewportPercent, zoomStrength, zoomIn) => {
16
+ const deltaWidth = (state.xEnd - state.xStart) * zoomStrength;
17
+ const deltaStart = deltaWidth * viewportPercent;
18
+ const deltaEnd = deltaWidth * (1 - viewportPercent);
19
+ if (zoomIn) {
20
+ state.xStart = state.xStart + deltaStart;
21
+ state.xEnd = state.xEnd - deltaEnd;
22
+ }
23
+ else {
24
+ state.xStart = state.xStart - deltaStart;
25
+ state.xEnd = state.xEnd + deltaEnd;
26
+ }
27
+ state.zoomX = vm.calculateZoomX(state.xStart, state.xEnd);
28
+ return state;
29
+ };
30
+ /**
31
+ * Zooms to viewports end.
32
+ * @param vm
33
+ * @param state
34
+ * @param zoomStrength - 0..1 number, 1=max strength
35
+ * @param zoomIn
36
+ * @doc-tags viewport,zoom,scaling
37
+ */
38
+ export const zoomXToEndViewportCalculator = (vm, state, zoomStrength, zoomIn) => {
39
+ return zoomXToPercentViewportCalculator(vm, state, 1, zoomStrength, zoomIn);
40
+ };
@@ -3,4 +3,112 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{getTimezoneOffset as n}from"date-fns-tz";import{ReplaySubject as s}from"rxjs";import{memoize as f}from"../utils/perfomance/memoize.utils";import{dateTimeFormatterFactory as c}from"./date-time.formatter";export const memoizedTZOffset=f(n),getTimezoneOffset=(r,e)=>new Date(e).getTimezoneOffset()*60*1e3+memoizedTZOffset(r,e);export class TimeZoneModel{constructor(e){this.config=e,this.timeZoneChangedSubject=new s,this.currentTzOffset=t=>this.getOffset(this.config.timezone,t),this.formatterCache={},this.getOffset=(t,i)=>getTimezoneOffset(t,i),this.dateTimeFormatterFactory=this.initFormatterFactory(this.config.dateFormatter)}setTimeZone(e){this.config.timezone=e,this.formatterCache={},this.timeZoneChangedSubject.next(e)}observeTimeZoneChanged(){return this.timeZoneChangedSubject.asObservable()}initFormatterFactory(e){let t;if(e&&typeof e=="function")t=e;else if(e&&e.createFormatterFunction&&typeof e.createFormatterFunction=="function"){const i=e.createFormatterFunction;t=o=>i(o).bind(e)}else t=c(this.config,this.tzOffset);return t}getFormatterFactory(){return this.dateTimeFormatterFactory}getDateTimeFormatter(e){return this.formatterCache[e]===void 0&&(this.formatterCache[e]=this.dateTimeFormatterFactory(e)),this.formatterCache[e]}tzOffset(e){const t=o=>-new Date(o).getTimezoneOffset()*a;let i;return e?i=o=>memoizedTZOffset(e,o):i=t,o=>new Date(+o+i(o)-t(o))}}const a=60*1e3;
6
+ import { getTimezoneOffset as getTimezoneOffsetDateFnsTz } from 'date-fns-tz';
7
+ import { ReplaySubject } from 'rxjs';
8
+ import { memoize } from '../utils/performance/memoize.utils';
9
+ import { dateTimeFormatterFactory } from './date-time.formatter';
10
+ export const memoizedTZOffset = memoize(getTimezoneOffsetDateFnsTz);
11
+ export const getTimezoneOffset = (timezone, time) => {
12
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
13
+ const localOffset = new Date(time).getTimezoneOffset() * 60 * 1000;
14
+ return localOffset + memoizedTZOffset(timezone, time);
15
+ };
16
+ export class TimeZoneModel {
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.timeZoneChangedSubject = new ReplaySubject();
20
+ this.currentTzOffset = (time) => this.getOffset(this.config.timezone, time);
21
+ this.formatterCache = {};
22
+ /**
23
+ * Calculates the offset of a given timezone from the local timezone.
24
+ * @private
25
+ * @param {string} timezone - The timezone to calculate the offset for.
26
+ */
27
+ this.getOffset = (timezone, time) => getTimezoneOffset(timezone, time);
28
+ this.dateTimeFormatterFactory = this.initFormatterFactory(this.config.dateFormatter);
29
+ }
30
+ /**
31
+ * Sets the timezone for the configuration and updates the current timezone offset.
32
+ * @param {string} timeZone - The timezone to set.
33
+ * @returns {void}
34
+ */
35
+ setTimeZone(timeZone) {
36
+ this.config.timezone = timeZone;
37
+ this.formatterCache = {};
38
+ this.timeZoneChangedSubject.next(timeZone);
39
+ }
40
+ /**
41
+ * Returns an Observable that emits a string value when the time zone is changed.
42
+ * The Observable is created from the timeZoneChangedSubject Subject.
43
+ * @returns {Observable<string>} An Observable that emits a string value when the time zone is changed.
44
+ */
45
+ observeTimeZoneChanged() {
46
+ return this.timeZoneChangedSubject.asObservable();
47
+ }
48
+ /**
49
+ * Initializes a DateTimeFormatterFactory object.
50
+ * @param {DateFormatter} [dateFormatter] - Optional DateFormatter object.
51
+ * @returns {DateTimeFormatterFactory} - Returns a DateTimeFormatterFactory object.
52
+ * If a plain function is provided as the dateFormatter parameter, it will be used as a date formatter without applying UTC datetime override for candles more than 1d period.
53
+ * If a custom date formatter exists, it will be used for datetime formatting applying optionally UTC datetime override for candles more than 1d period.
54
+ * If no dateFormatter is provided, a default DateTimeFormatterFactory object will be returned.
55
+ */
56
+ initFormatterFactory(dateFormatter) {
57
+ let result;
58
+ if (dateFormatter && typeof dateFormatter === 'function') {
59
+ // backward compatibility - if date formatter is a plain function then there is no need to use UTC datetime
60
+ // override for candles more than 1d period
61
+ result = dateFormatter;
62
+ }
63
+ else if (dateFormatter &&
64
+ dateFormatter.createFormatterFunction &&
65
+ typeof dateFormatter.createFormatterFunction === 'function') {
66
+ // if custom date formatter exists we use it for datetime formatting applying optionally
67
+ // UTC datetime override for candles more than 1d period
68
+ const createFormatter = dateFormatter.createFormatterFunction;
69
+ result = (pattern) => createFormatter(pattern).bind(dateFormatter);
70
+ }
71
+ else {
72
+ result = dateTimeFormatterFactory(this.config, this.tzOffset);
73
+ }
74
+ return result;
75
+ }
76
+ /**
77
+ * Returns the DateTimeFormatterFactory instance used by this class.
78
+ *
79
+ * @returns {DateTimeFormatterFactory} The DateTimeFormatterFactory instance used by this class.
80
+ */
81
+ getFormatterFactory() {
82
+ return this.dateTimeFormatterFactory;
83
+ }
84
+ getDateTimeFormatter(format) {
85
+ if (this.formatterCache[format] === undefined) {
86
+ this.formatterCache[format] = this.dateTimeFormatterFactory(format);
87
+ }
88
+ return this.formatterCache[format];
89
+ }
90
+ /**
91
+ * Gets the timezone offset value in milliseconds
92
+ * @param {string} timezone name
93
+ * @returns {function(time:Number):Date}
94
+ */
95
+ tzOffset(timezone) {
96
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
97
+ const localOffset = (time) => -new Date(time).getTimezoneOffset() * timeMultiplier;
98
+ let offset;
99
+ if (!timezone) {
100
+ offset = localOffset;
101
+ }
102
+ else {
103
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
104
+ offset = (time) => memoizedTZOffset(timezone, time);
105
+ }
106
+ // In JS Date object is created with local tz offset,
107
+ // so we have to subtract localOffset from current time
108
+ return time => {
109
+ return new Date(+time + offset(time) - localOffset(time));
110
+ };
111
+ }
112
+ }
113
+ // 1 hour in milliseconds
114
+ const timeMultiplier = 60 * 1000;