@devexperts/dxcharts-lite 1.0.2 → 2.0.1

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 (258) 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.d.ts +2 -2
  81. package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
  82. package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
  83. package/dist/chart/components/pane/pane-manager.component.js +149 -1
  84. package/dist/chart/components/pane/pane.component.d.ts +16 -32
  85. package/dist/chart/components/pane/pane.component.js +278 -1
  86. package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
  87. package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
  88. package/dist/chart/components/snapshot/snapshot.component.js +48 -1
  89. package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
  90. package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
  91. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
  92. package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
  93. package/dist/chart/components/volumes/volumes.component.js +94 -1
  94. package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
  95. package/dist/chart/components/volumes/volumes.drawer.js +140 -1
  96. package/dist/chart/components/volumes/volumes.formatter.js +31 -1
  97. package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
  98. package/dist/chart/components/volumes/volumes.model.js +43 -1
  99. package/dist/chart/components/watermark/water-mark.component.js +103 -1
  100. package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
  101. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
  102. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
  103. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
  104. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
  105. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
  106. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
  107. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
  108. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
  109. package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
  110. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
  111. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
  112. package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
  113. package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
  114. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
  115. package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
  116. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
  117. package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
  118. package/dist/chart/components/x_axis/x-axis.component.js +119 -1
  119. package/dist/chart/components/y_axis/label-color.functions.js +53 -1
  120. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
  121. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
  122. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
  123. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
  124. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
  125. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
  126. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
  127. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
  128. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
  129. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
  130. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
  131. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
  132. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
  133. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
  134. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
  135. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
  136. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
  137. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
  138. package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
  139. package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
  140. package/dist/chart/components/y_axis/y-axis.component.js +220 -1
  141. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
  142. package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
  143. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
  144. package/dist/chart/components/y_axis/y-axis.model.js +34 -1
  145. package/dist/chart/drawers/chart-background.drawer.js +69 -1
  146. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
  147. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
  148. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
  149. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
  150. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
  151. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
  152. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
  153. package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
  154. package/dist/chart/drawers/composite.drawer.js +67 -1
  155. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
  156. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
  157. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
  158. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
  159. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
  160. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
  161. package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
  162. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
  163. package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
  164. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
  165. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
  166. package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
  167. package/dist/chart/drawers/data-series.drawer.js +56 -1
  168. package/dist/chart/drawers/drawing-manager.d.ts +1 -1
  169. package/dist/chart/drawers/drawing-manager.js +177 -1
  170. package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
  171. package/dist/chart/events/event-bus.js +73 -1
  172. package/dist/chart/events/events.js +3 -1
  173. package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
  174. package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
  175. package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
  176. package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
  177. package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
  178. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
  179. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
  180. package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
  181. package/dist/chart/model/baseline.model.js +88 -1
  182. package/dist/chart/model/bounds.model.js +1 -1
  183. package/dist/chart/model/candle-hover.js +70 -1
  184. package/dist/chart/model/candle-series-high-low.provider.js +45 -1
  185. package/dist/chart/model/candle-series.model.d.ts +3 -3
  186. package/dist/chart/model/candle-series.model.js +245 -1
  187. package/dist/chart/model/candle.model.js +69 -1
  188. package/dist/chart/model/canvas.model.js +228 -1
  189. package/dist/chart/model/chart-base-element.js +129 -1
  190. package/dist/chart/model/compare-series-hover.js +25 -1
  191. package/dist/chart/model/data-series-view.d.ts +5 -5
  192. package/dist/chart/model/data-series-view.js +111 -1
  193. package/dist/chart/model/data-series.config.js +14 -1
  194. package/dist/chart/model/data-series.model.d.ts +4 -4
  195. package/dist/chart/model/data-series.model.js +281 -1
  196. package/dist/chart/model/date-time.formatter.js +151 -1
  197. package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
  198. package/dist/chart/model/hit-test-canvas.model.js +256 -1
  199. package/dist/chart/model/main-candle-series.model.d.ts +1 -1
  200. package/dist/chart/model/main-candle-series.model.js +29 -1
  201. package/dist/chart/model/scale.model.d.ts +3 -2
  202. package/dist/chart/model/scale.model.js +316 -1
  203. package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
  204. package/dist/chart/model/scaling/auto-scale.model.js +91 -1
  205. package/dist/chart/model/scaling/constrait.functions.js +61 -1
  206. package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
  207. package/dist/chart/model/scaling/move-chart.functions.js +22 -1
  208. package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
  209. package/dist/chart/model/scaling/viewport.model.js +279 -1
  210. package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
  211. package/dist/chart/model/time-zone.model.js +109 -1
  212. package/dist/chart/model/visual-candle.js +134 -1
  213. package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
  214. package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
  215. package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
  216. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
  217. package/dist/chart/utils/array.utils.d.ts +1 -1
  218. package/dist/chart/utils/array.utils.js +269 -1
  219. package/dist/chart/utils/auto-period-detector.utils.js +39 -1
  220. package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
  221. package/dist/chart/utils/candles-generator.utils.js +161 -1
  222. package/dist/chart/utils/candles.utils.js +42 -1
  223. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
  224. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
  225. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
  226. package/dist/chart/utils/color.utils.js +31 -1
  227. package/dist/chart/utils/device/browser.utils.js +10 -1
  228. package/dist/chart/utils/device/device-detector.utils.js +24 -1
  229. package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
  230. package/dist/chart/utils/device/touchpad.utils.js +91 -1
  231. package/dist/chart/utils/dom.utils.js +15 -1
  232. package/dist/chart/utils/function.utils.js +16 -1
  233. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  234. package/dist/chart/utils/linkedList.utils.js +138 -0
  235. package/dist/chart/utils/math.utils.js +115 -1
  236. package/dist/chart/utils/merge.utils.js +56 -1
  237. package/dist/chart/utils/object.utils.js +43 -1
  238. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  239. package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
  240. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  241. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  242. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  243. package/dist/chart/utils/price-increments.utils.d.ts +1 -0
  244. package/dist/chart/utils/price-increments.utils.js +127 -1
  245. package/dist/chart/utils/uuid.utils.js +4 -1
  246. package/dist/dxchart.min.js +9 -12
  247. package/dist/index.d.ts +3 -3
  248. package/dist/index.js +20 -1
  249. package/package.json +4 -4
  250. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  251. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  252. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  253. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
  254. /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
  255. /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
  256. /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
  257. /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
  258. /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
@@ -3,4 +3,37 @@
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 createHighLowOffsetCalculator=e=>t=>{const{top:c,bottom:s}=e(),o=t.high-t.low,n=o===0?1:o,r=n*c/100,l=n*s/100,a=t.low-l,f=t.high+r;return{low:a,high:f}},createCandlesOffsetProvider=(e,t)=>{const c=createHighLowOffsetCalculator(e);return{isHighLowActive:()=>!0,calculateHighLow:s=>{const o=t.calculateHighLow(s);return c(o)}}};
6
+ /**
7
+ * Constraint on top of high low provider - makes additional offset bounds.
8
+ * @doc-tags viewport,scaling
9
+ * @param offsetsProvider
10
+ * @doc-tags viewport,scaling,offsets
11
+ */
12
+ export const createHighLowOffsetCalculator = (offsetsProvider) => (highLow) => {
13
+ const { top, bottom } = offsetsProvider();
14
+ const _height = highLow.high - highLow.low;
15
+ // TODO what should we do if height is 0?
16
+ const height = _height === 0 ? 1 : _height;
17
+ const offsetTop = (height * top) / 100;
18
+ const offsetBottom = (height * bottom) / 100;
19
+ const low = highLow.low - offsetBottom;
20
+ const high = highLow.high + offsetTop;
21
+ return { low, high };
22
+ };
23
+ /**
24
+ * Constraint on top of high low provider - makes additional offset bounds.
25
+ * @doc-tags viewport,scaling
26
+ * @param offsetsProvider
27
+ * @param highLowProvider
28
+ * @doc-tags viewport,scaling,offsets
29
+ */
30
+ export const createCandlesOffsetProvider = (offsetsProvider, highLowProvider) => {
31
+ const offsetsCalculator = createHighLowOffsetCalculator(offsetsProvider);
32
+ return {
33
+ isHighLowActive: () => true,
34
+ calculateHighLow: (state) => {
35
+ const highLow = highLowProvider.calculateHighLow(state);
36
+ return offsetsCalculator(highLow);
37
+ },
38
+ };
39
+ };
@@ -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
- import{nameDirection as u}from"../../model/candle.model";import{VisualSeriesPoint as g}from"../../model/data-series.model";import C from"../../model/visual-candle";import{firstOf as N,lastOf as w}from"../../utils/array.utils";import{round as h}from"../../utils/math.utils";const m=60;export const fakeVisualCandle=(n,t,o,e,l=m)=>{const r=fakeCandle(n,e,l);r.volume=o;let s;if(t.length===0)s=0;else if(e>=t.length){const c=t[t.length-1],f=(e-(t.length-1))*o;s=c.centerUnit+f}else{const c=t[0],f=-e*o;s=c.centerUnit-f}return new C(s,o,r.open,r.close,r.lo,r.hi,u(r.open,r.close),r)},fakeVisualPoint=(n,t,o,e,l=m)=>{const r=fakeDataPoint(n,e,l);let s;if(t.length===0)s=0;else if(e>=t.length){const c=t[t.length-1],f=(e-(t.length-1))*o;s=c.centerUnit+f}else{const c=t[0],f=-e*o;s=c.centerUnit-f}return new g(s,r.close)},fakeCandle=(n,t,o=m)=>({hi:NaN,lo:NaN,open:NaN,close:NaN,timestamp:i(n,t,o),volume:NaN,expansion:!0,idx:t}),fakeDataPoint=(n,t,o=m)=>({close:NaN,timestamp:i(n,t,o)});function i(n,t,o=m){var e,l;const r=h(t);if(n.length===0)return 0;const s=w(n);if(r>=n.length&&s)return p(s,n.length-1,r,o);const c=N(n);return r<0&&c?p(c,0,r,o):(l=(e=n[r])===null||e===void 0?void 0:e.timestamp)!==null&&l!==void 0?l:0}const p=(n,t,o,e=m)=>n.timestamp+(o-(t!=null?t:0))*e;
6
+ import { nameDirection } from '../../model/candle.model';
7
+ import { VisualSeriesPoint } from '../../model/data-series.model';
8
+ import VisualCandle from '../../model/visual-candle';
9
+ import { firstOf, lastOf } from '../../utils/array.utils';
10
+ import { round } from '../../utils/math.utils';
11
+ const DEFAULT_PERIOD = 60; // 1 minute
12
+ /**
13
+ * Generates fake candle for left and right "out of data range" zones.
14
+ * Requires period to calculate the fake timestamp.
15
+ * The timestamp won't take session breaks or holidays into account.
16
+ */
17
+ export const fakeVisualCandle = (dataPoints, visualCandles, candleWidth, index, period = DEFAULT_PERIOD) => {
18
+ const candle = fakeCandle(dataPoints, index, period);
19
+ // in case we have equivolume
20
+ candle.volume = candleWidth;
21
+ let x;
22
+ if (visualCandles.length === 0) {
23
+ x = 0;
24
+ }
25
+ else if (index >= visualCandles.length) {
26
+ const lastCandle = visualCandles[visualCandles.length - 1];
27
+ const candlesCountInBetween = index - (visualCandles.length - 1);
28
+ const offsetFromLast = candlesCountInBetween * candleWidth;
29
+ x = lastCandle.centerUnit + offsetFromLast;
30
+ }
31
+ else {
32
+ const firstCandle = visualCandles[0];
33
+ const candlesCountInBetween = -index;
34
+ const offsetFromFirst = candlesCountInBetween * candleWidth;
35
+ x = firstCandle.centerUnit - offsetFromFirst;
36
+ }
37
+ return new VisualCandle(x, candleWidth, candle.open, candle.close, candle.lo, candle.hi, nameDirection(candle.open, candle.close), candle);
38
+ };
39
+ export const fakeVisualPoint = (dataPoints, visualPoints, meanDataWidth, index, period = DEFAULT_PERIOD) => {
40
+ const candle = fakeDataPoint(dataPoints, index, period);
41
+ let x;
42
+ if (visualPoints.length === 0) {
43
+ x = 0;
44
+ }
45
+ else if (index >= visualPoints.length) {
46
+ const lastCandle = visualPoints[visualPoints.length - 1];
47
+ const candlesCountInBetween = index - (visualPoints.length - 1);
48
+ const offsetFromLast = candlesCountInBetween * meanDataWidth;
49
+ x = lastCandle.centerUnit + offsetFromLast;
50
+ }
51
+ else {
52
+ const firstCandle = visualPoints[0];
53
+ const candlesCountInBetween = -index;
54
+ const offsetFromFirst = candlesCountInBetween * meanDataWidth;
55
+ x = firstCandle.centerUnit - offsetFromFirst;
56
+ }
57
+ return new VisualSeriesPoint(x, candle.close);
58
+ };
59
+ export const fakeCandle = (candles, index, period = DEFAULT_PERIOD) => {
60
+ const t = getTimestampOfIndex(candles, index, period);
61
+ return {
62
+ hi: NaN,
63
+ lo: NaN,
64
+ open: NaN,
65
+ close: NaN,
66
+ timestamp: t,
67
+ volume: NaN,
68
+ expansion: true,
69
+ idx: index,
70
+ };
71
+ };
72
+ export const fakeDataPoint = (candles, index, period = DEFAULT_PERIOD) => {
73
+ const t = getTimestampOfIndex(candles, index, period);
74
+ return {
75
+ close: NaN,
76
+ timestamp: t,
77
+ };
78
+ };
79
+ /**
80
+ * Returns the timestamp of a given index in an array of candles.
81
+ * @param {Candle[]} candles - An array of candles.
82
+ * @param {Index} index - The index of the candle to get the timestamp from.
83
+ * @param {number} [period=DEFAULT_PERIOD] - The period of the candles in milliseconds.
84
+ * @returns {Timestamp} The timestamp of the candle at the given index or 0 if the array is empty or the index is out of bounds.
85
+ */
86
+ function getTimestampOfIndex(candles, index, period = DEFAULT_PERIOD) {
87
+ var _a, _b;
88
+ const _index = round(index);
89
+ if (candles.length === 0) {
90
+ return 0;
91
+ }
92
+ const lastCandle = lastOf(candles);
93
+ if (_index >= candles.length && lastCandle) {
94
+ return fakeTimestamp(lastCandle, candles.length - 1, _index, period);
95
+ }
96
+ const firstCandle = firstOf(candles);
97
+ if (_index < 0 && firstCandle) {
98
+ return fakeTimestamp(firstCandle, 0, _index, period);
99
+ }
100
+ return (_b = (_a = candles[_index]) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : 0;
101
+ }
102
+ const fakeTimestamp = (candle, candleIdx, index, period = DEFAULT_PERIOD) => candle.timestamp + (index - (candleIdx !== null && candleIdx !== void 0 ? candleIdx : 0)) * period;
@@ -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
- import{unitToPercent as a}from"../../model/scaling/viewport.model";import{PriceIncrementsUtils as s}from"../../utils/price-increments.utils";export const createRegularPriceFormatter=t=>r=>{let e;if(typeof r=="number")e=r;else if(typeof r=="string")e=Number(r);else return"\u2014";const[n]=t.dataSeries;if(n!==void 0){const i=s.getPricePrecision(e,n.pricePrecisions);return e.toFixed(i)}return`${e}`},createPercentFormatter=t=>(r,e)=>{const[n]=t.dataSeries;let i=r;const o=e!=null?e:n;o!==void 0&&(i=a(r,o.getBaseLine()));const c=i.toFixed(s.DEFAULT_PRECISION).replace("-","\u2212")+" %";return c==="\u22120.00 %"?"0.00 %":c},createYExtentFormatters=t=>({percent:createPercentFormatter(t),regular:createRegularPriceFormatter(t)});
6
+ import { unitToPercent } from '../../model/scaling/viewport.model';
7
+ import { PriceIncrementsUtils } from '../../utils/price-increments.utils';
8
+ export const createRegularPriceFormatter = (extent) => (value) => {
9
+ let checkedValue;
10
+ if (typeof value === 'number') {
11
+ checkedValue = value;
12
+ }
13
+ else if (typeof value === 'string') {
14
+ checkedValue = Number(value);
15
+ }
16
+ else {
17
+ return '—';
18
+ }
19
+ const [mainDataSeries] = extent.dataSeries;
20
+ if (mainDataSeries !== undefined) {
21
+ const precision = PriceIncrementsUtils.getPricePrecision(checkedValue, mainDataSeries.pricePrecisions);
22
+ return checkedValue.toFixed(precision);
23
+ }
24
+ return `${checkedValue}`;
25
+ };
26
+ export const createPercentFormatter = (extent) => (value, dataSeries) => {
27
+ const [mainDataSeries] = extent.dataSeries;
28
+ let valueUnit = value;
29
+ const series = dataSeries !== null && dataSeries !== void 0 ? dataSeries : mainDataSeries;
30
+ if (series !== undefined) {
31
+ valueUnit = unitToPercent(value, series.getBaseline());
32
+ }
33
+ // always apply default precision for percent
34
+ const formatted = valueUnit.toFixed(PriceIncrementsUtils.DEFAULT_PRECISION).replace('-', '−') + ' %';
35
+ return formatted === '−0.00 %' ? '0.00 %' : formatted;
36
+ };
37
+ export const createYExtentFormatters = (extent) => ({
38
+ percent: createPercentFormatter(extent),
39
+ regular: createRegularPriceFormatter(extent),
40
+ });
@@ -3,4 +3,71 @@
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{cloneUnsafe as a}from"../../utils/object.utils";export class SecondaryChartColorsPool{constructor(e){this.config=e,this.usedChartColors={},this.symbolsToColorKeys={},this.secondaryChartColorsPool=this.createColorPool(this.config.colors.secondaryChartTheme),this.usedChartColors=Object.keys(this.secondaryChartColorsPool).reduce((o,s)=>Object.assign(Object.assign({},o),{[s]:0}),{})}createColorPool(e){return e.reduce((o,s,r)=>(o[`color${r}`]=Object.assign(Object.assign({},a(this.config.colors)),{lineTheme:Object.assign({},s.lineTheme),areaTheme:Object.assign({},s.areaTheme)}),o),{})}takeColorFromPool(e){let o=Number.MAX_SAFE_INTEGER,s="";for(const[r,t]of Object.entries(this.usedChartColors))t<o&&(o=t,s=r);return this.usedChartColors[s]=this.usedChartColors[s]+1,this.symbolsToColorKeys[e]=s,this.secondaryChartColorsPool[s]}addColorToPool(e){const o=this.symbolsToColorKeys[e];this.usedChartColors[o]&&(this.usedChartColors[o]=this.usedChartColors[o]-1)}updateColorConfig(e,o){var s,r;const t=this.secondaryChartColorsPool[this.usedChartColors[e]];if(t){const l=o;this.secondaryChartColorsPool[this.usedChartColors[e]]=Object.assign(Object.assign({},o),{lineTheme:Object.assign(t.lineTheme,(s=l.lineTheme)!==null&&s!==void 0?s:{}),areaTheme:Object.assign(t.areaTheme,(r=l.areaTheme)!==null&&r!==void 0?r:{})})}}}
6
+ import { cloneUnsafe } from '../../utils/object.utils';
7
+ export class SecondaryChartColorsPool {
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.usedChartColors = {};
11
+ this.symbolsToColorKeys = {};
12
+ this.secondaryChartColorsPool = this.createColorPool(this.config.colors.secondaryChartTheme);
13
+ this.usedChartColors = Object.keys(this.secondaryChartColorsPool).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: 0 })), {});
14
+ }
15
+ /**
16
+ * Creates a color pool object based on the provided color array
17
+ * @param {SecondaryChartTheme[]} colorArray - An array of SecondaryChartTheme objects
18
+ * @returns {Object} - An object containing a key-value pair for each color in the colorArray
19
+ * The key is a string in the format "colorX" where X is the index of the color in the array
20
+ * The value is an object containing the FullChartColors for the color, with lineTheme and areaTheme properties
21
+ */
22
+ createColorPool(colorArray) {
23
+ return colorArray.reduce((acc, item, index) => {
24
+ acc[`color${index}`] = Object.assign(Object.assign({}, cloneUnsafe(this.config.colors)), { lineTheme: Object.assign({}, item.lineTheme), areaTheme: Object.assign({}, item.areaTheme) });
25
+ return acc;
26
+ }, {});
27
+ }
28
+ /**
29
+ * Takes a color from the secondaryChartColorsPool and assigns it to a symbol.
30
+ * @param {string} symbol - The symbol to assign the color to.
31
+ * @returns {string} The color assigned to the symbol.
32
+ */
33
+ takeColorFromPool(symbol) {
34
+ let minColors = Number.MAX_SAFE_INTEGER;
35
+ let minColorKey = '';
36
+ for (const [key, value] of Object.entries(this.usedChartColors)) {
37
+ if (value < minColors) {
38
+ minColors = value;
39
+ minColorKey = key;
40
+ }
41
+ }
42
+ this.usedChartColors[minColorKey] = this.usedChartColors[minColorKey] + 1;
43
+ this.symbolsToColorKeys[symbol] = minColorKey;
44
+ return this.secondaryChartColorsPool[minColorKey];
45
+ }
46
+ /**
47
+ * Adds a color to the chart color pool.
48
+ *
49
+ * @param {string} symbol - The symbol of the color to be added.
50
+ *
51
+ * @returns {void}
52
+ */
53
+ addColorToPool(symbol) {
54
+ const key = this.symbolsToColorKeys[symbol];
55
+ if (this.usedChartColors[key]) {
56
+ this.usedChartColors[key] = this.usedChartColors[key] - 1;
57
+ }
58
+ }
59
+ /**
60
+ * Updates the color configuration for a given symbol in the chart.
61
+ * @param {string} symbol - The symbol for which the color configuration needs to be updated.
62
+ * @param {CandleSeriesColors} config - The new color configuration for the symbol.
63
+ * @returns {void}
64
+ */
65
+ updateColorConfig(symbol, config) {
66
+ var _a, _b;
67
+ const existColorConfig = this.secondaryChartColorsPool[this.usedChartColors[symbol]];
68
+ if (existColorConfig) {
69
+ const colors = config;
70
+ this.secondaryChartColorsPool[this.usedChartColors[symbol]] = Object.assign(Object.assign({}, config), { lineTheme: Object.assign(existColorConfig.lineTheme, (_a = colors.lineTheme) !== null && _a !== void 0 ? _a : {}), areaTheme: Object.assign(existColorConfig.areaTheme, (_b = colors.areaTheme) !== null && _b !== void 0 ? _b : {}) });
71
+ }
72
+ }
73
+ }
@@ -3,4 +3,88 @@
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{ClearCanvasDrawer as p}from"../../drawers/clear-canvas.drawer";import{CompositeDrawer as c}from"../../drawers/composite.drawer";import{ChartBaseElement as d}from"../../model/chart-base-element";import{CrossToolDrawer as w}from"./cross-tool.drawer";import{CrossToolModel as C}from"./cross-tool.model";import{CrossAndLabelsDrawerType as o}from"./types/cross-and-labels.drawer";import{NoneDrawerType as m}from"./types/none.drawer";export class CrossToolComponent extends d{constructor(s,e,t,a,n,i,l){super(),this.config=s,this.crossToolCanvasModel=e,this.canvasBoundsContainer=t,this.drawingManager=a,this.paneManager=n,this.crossToolTypeDrawers={},this.model=new C(s.components.crossTool,this.crossToolCanvasModel,i,l),this.addChildEntity(this.model);const T=new p(this.crossToolCanvasModel);this.registerDefaultDrawerTypes();const h=new w(this.model,this.crossToolCanvasModel,this.crossToolTypeDrawers),r=new c;r.addDrawer(T,"CLEAR_CANVAS"),r.addDrawer(h,"CROSS_TOOL_DRAWER"),this.drawingManager.addDrawer(r,"CROSS_TOOL")}registerDefaultDrawerTypes(){this.registerCrossToolTypeDrawer("cross-and-labels",new o(this.config,this.canvasBoundsContainer,this.paneManager,()=>!0)),this.registerCrossToolTypeDrawer("just-labels",new o(this.config,this.canvasBoundsContainer,this.paneManager,()=>!0,!0)),this.registerCrossToolTypeDrawer("none",new m)}setVisible(s){this.model.setType(s?"cross-and-labels":"none")}setType(s){this.model.setType(s)}observeCrossToolChanged(){return this.model.currentHoverSubject}setMagnetTarget(s){this.config.components.crossTool.magnetTarget=s}registerCrossToolTypeDrawer(s,e){this.crossToolTypeDrawers[s]=e}}
6
+ import { ClearCanvasDrawer } from '../../drawers/clear-canvas.drawer';
7
+ import { CompositeDrawer } from '../../drawers/composite.drawer';
8
+ import { ChartBaseElement } from '../../model/chart-base-element';
9
+ import { CrossToolDrawer } from './cross-tool.drawer';
10
+ import { CrossToolModel } from './cross-tool.model';
11
+ import { CrossAndLabelsDrawerType } from './types/cross-and-labels.drawer';
12
+ import { NoneDrawerType } from './types/none.drawer';
13
+ /**
14
+ * Default bundled chart cross tool.
15
+ */
16
+ export class CrossToolComponent extends ChartBaseElement {
17
+ constructor(config, crossToolCanvasModel, canvasBoundsContainer, drawingManager, paneManager, crossEventProducer, hoverProducer) {
18
+ super();
19
+ this.config = config;
20
+ this.crossToolCanvasModel = crossToolCanvasModel;
21
+ this.canvasBoundsContainer = canvasBoundsContainer;
22
+ this.drawingManager = drawingManager;
23
+ this.paneManager = paneManager;
24
+ this.crossToolTypeDrawers = {};
25
+ this.model = new CrossToolModel(config.components.crossTool, this.crossToolCanvasModel, crossEventProducer, hoverProducer);
26
+ this.addChildEntity(this.model);
27
+ const clearCanvasDrawer = new ClearCanvasDrawer(this.crossToolCanvasModel);
28
+ this.registerDefaultDrawerTypes();
29
+ const crossToolDrawer = new CrossToolDrawer(this.model, this.crossToolCanvasModel, this.crossToolTypeDrawers);
30
+ const compositeDrawer = new CompositeDrawer();
31
+ compositeDrawer.addDrawer(clearCanvasDrawer, 'CLEAR_CANVAS');
32
+ compositeDrawer.addDrawer(crossToolDrawer, 'CROSS_TOOL_DRAWER');
33
+ this.drawingManager.addDrawer(compositeDrawer, 'CROSS_TOOL');
34
+ }
35
+ /**
36
+ * Registers default drawer types for the chart.
37
+ * @private
38
+ * @function
39
+ * @name registerDefaultDrawerTypes
40
+ *
41
+ * @returns {void}
42
+ */
43
+ registerDefaultDrawerTypes() {
44
+ this.registerCrossToolTypeDrawer('cross-and-labels', new CrossAndLabelsDrawerType(this.config, this.canvasBoundsContainer, this.paneManager, () => true));
45
+ this.registerCrossToolTypeDrawer('just-labels', new CrossAndLabelsDrawerType(this.config, this.canvasBoundsContainer, this.paneManager, () => true, true));
46
+ this.registerCrossToolTypeDrawer('none', new NoneDrawerType());
47
+ }
48
+ //#region public methods
49
+ /**
50
+ * Sets the cross tool visibility.
51
+ * @param visible
52
+ */
53
+ setVisible(visible) {
54
+ this.model.setType(visible ? 'cross-and-labels' : 'none');
55
+ }
56
+ /**
57
+ * Sets the crosstool type.
58
+ * - cross-and-labels - both the crosshair and X/Y labels
59
+ * - only-labels - only the X/Y label
60
+ * - none
61
+ * @param type
62
+ */
63
+ setType(type) {
64
+ this.model.setType(type);
65
+ }
66
+ /**
67
+ * Returns an Observable that emits the current hover subject.
68
+ */
69
+ observeCrossToolChanged() {
70
+ return this.model.currentHoverSubject;
71
+ }
72
+ /**
73
+ * Sets magnet target for cross tool.
74
+ * Supported only for 'cross-and-labels' type.
75
+ * Default magnet target is none.
76
+ * @param target
77
+ */
78
+ setMagnetTarget(target) {
79
+ this.config.components.crossTool.magnetTarget = target;
80
+ }
81
+ /**
82
+ * Adds a new drawer type for cross tool, so you can add your own implementation of cross tool
83
+ * (or override existing)
84
+ * @param drawerName - an unique drawer type name
85
+ * @param drawerImpl - CrossToolTypeDrawer object
86
+ */
87
+ registerCrossToolTypeDrawer(drawerName, drawerImpl) {
88
+ this.crossToolTypeDrawers[drawerName] = drawerImpl;
89
+ }
90
+ }
@@ -3,4 +3,35 @@
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 CrossToolDrawer{constructor(o,s,r){this.model=o,this.crossToolCanvasModel=s,this.crossToolTypeDrawers=r}draw(){const o=this.crossToolTypeDrawers[this.model.type];o?this.model.currentHover&&o.draw(this.crossToolCanvasModel.ctx,this.model.currentHover):console.error(`No cross tool drawer type registered for drawer type ${this.model.type}`)}getCanvasIds(){return[this.crossToolCanvasModel.canvasId]}}
6
+ export class CrossToolDrawer {
7
+ constructor(model, crossToolCanvasModel, crossToolTypeDrawers) {
8
+ this.model = model;
9
+ this.crossToolCanvasModel = crossToolCanvasModel;
10
+ this.crossToolTypeDrawers = crossToolTypeDrawers;
11
+ }
12
+ /**
13
+ * Draws the cross tool on the canvas.
14
+ * @function
15
+ * @name draw
16
+ * @memberof CrossToolCanvasView
17
+ * @instance
18
+ * @returns {void}
19
+ */
20
+ draw() {
21
+ const drawer = this.crossToolTypeDrawers[this.model.type];
22
+ if (drawer) {
23
+ this.model.currentHover && drawer.draw(this.crossToolCanvasModel.ctx, this.model.currentHover);
24
+ }
25
+ else {
26
+ console.error(`No cross tool drawer type registered for drawer type ${this.model.type}`);
27
+ }
28
+ }
29
+ /**
30
+ * Returns an array of string containing the canvas ID of the crossToolCanvasModel.
31
+ *
32
+ * @returns {Array<string>} An array of string containing the canvas ID of the crossToolCanvasModel.
33
+ */
34
+ getCanvasIds() {
35
+ return [this.crossToolCanvasModel.canvasId];
36
+ }
37
+ }
@@ -3,4 +3,110 @@
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{BehaviorSubject as c}from"rxjs";import{ChartBaseElement as o}from"../../model/chart-base-element";import{CHART_UUID as i}from"../../canvas/canvas-bounds-container";export class CrossToolModel extends o{get currentHover(){return this.currentHoverSubject.getValue()}set currentHover(e){this.currentHoverSubject.next(e)}constructor(e,r,t,s){super(),this.config=e,this.crossToolCanvasModel=r,this.crossEventProducer=t,this.hoverProducer=s,this.currentHoverSubject=new c(null),this.type="cross-and-labels",this.type=e.type}setType(e){this.type=e}doActivate(){super.doActivate(),this.addRxSubscription(this.hoverProducer.hoverSubject.subscribe(e=>{this.crossEventProducer.crossSubject.getValue()!==null&&e!==null?this.updateHover(e):this.currentHover=null,this.fireDraw()}))}fireDraw(){this.type!=="none"&&this.crossToolCanvasModel.fireDraw()}updateHover(e,r=this.config.magnetTarget){if(this.currentHover===null?this.currentHover={x:e.x,y:0,time:e.timeFormatted,paneId:e.paneId}:(this.currentHover.x=e.x,this.currentHover.time=e.timeFormatted),e.candleHover&&e.paneId===i)switch(r){case"O":this.currentHover.y=e.candleHover.openY;break;case"C":this.currentHover.y=e.candleHover.closeY;break;case"H":this.currentHover.y=e.candleHover.highY;break;case"L":this.currentHover.y=e.candleHover.lowY;break;case"OHLC":this.currentHover.y=e.candleHover.closestOHLCY;break;case"none":this.currentHover.y=e.y;break}else this.currentHover.y=e.y;this.currentHoverSubject.next(this.currentHover)}}
6
+ import { BehaviorSubject } from 'rxjs';
7
+ import { ChartBaseElement } from '../../model/chart-base-element';
8
+ import { CHART_UUID } from '../../canvas/canvas-bounds-container';
9
+ export class CrossToolModel extends ChartBaseElement {
10
+ get currentHover() {
11
+ return this.currentHoverSubject.getValue();
12
+ }
13
+ set currentHover(value) {
14
+ this.currentHoverSubject.next(value);
15
+ }
16
+ constructor(config, crossToolCanvasModel, crossEventProducer, hoverProducer) {
17
+ super();
18
+ this.config = config;
19
+ this.crossToolCanvasModel = crossToolCanvasModel;
20
+ this.crossEventProducer = crossEventProducer;
21
+ this.hoverProducer = hoverProducer;
22
+ // the main hover object which will be presented on UI
23
+ this.currentHoverSubject = new BehaviorSubject(null);
24
+ this.type = 'cross-and-labels';
25
+ this.type = config.type;
26
+ }
27
+ /**
28
+ * Sets the type of the CrossTool object.
29
+ *
30
+ * @param {CrossToolType} type - The type of the CrossTool object.
31
+ * @returns {void}
32
+ */
33
+ setType(type) {
34
+ this.type = type;
35
+ }
36
+ /**
37
+ * Method to activate the cross tool.
38
+ * It subscribes to the canvasInputListener's mouse move event and fires the draw event.
39
+ * It also subscribes to the eventBus's hover and close hover events and updates the hover and fires the draw event accordingly.
40
+ * It also subscribes to the chartModel's candlesSetSubject and timeZoneModel's observeTimeZoneChanged events and recalculates the cross tool X formatter.
41
+ */
42
+ doActivate() {
43
+ super.doActivate();
44
+ this.addRxSubscription(this.hoverProducer.hoverSubject.subscribe(hover => {
45
+ if (this.crossEventProducer.crossSubject.getValue() !== null && hover !== null) {
46
+ this.updateHover(hover);
47
+ }
48
+ else {
49
+ this.currentHover = null;
50
+ }
51
+ this.fireDraw();
52
+ }));
53
+ }
54
+ /**
55
+ * This method is used to fire the draw event of the crossToolCanvasModel if the type is not 'none'.
56
+ * @private
57
+ */
58
+ fireDraw() {
59
+ if (this.type !== 'none') {
60
+ this.crossToolCanvasModel.fireDraw();
61
+ }
62
+ }
63
+ /**
64
+ * Updates the current hover position with the provided hover object.
65
+ * @param {Object} hover - The hover object containing the x and y coordinates and time formatted.
66
+ * @param {number} hover.x - The x coordinate of the hover.
67
+ * @param {number} hover.y - The y coordinate of the hover.
68
+ * @param {string} hover.timeFormatted - The formatted time of the hover.
69
+ * @param {Object} hover.candleHover - The candle hover object containing the open, close, high, low and closestOHLCY coordinates.
70
+ * @param {number} hover.candleHover.openY - The y coordinate of the open price of the candle.
71
+ * @param {number} hover.candleHover.closeY - The y coordinate of the close price of the candle.
72
+ * @param {number} hover.candleHover.highY - The y coordinate of the high price of the candle.
73
+ * @param {number} hover.candleHover.lowY - The y coordinate of the low price of the candle.
74
+ * @param {number} hover.candleHover.closestOHLCY - The y coordinate of the closest OHLC price of the candle.
75
+ * @returns {void}
76
+ */
77
+ updateHover(hover, magnetTarget = this.config.magnetTarget) {
78
+ if (this.currentHover === null) {
79
+ this.currentHover = { x: hover.x, y: 0, time: hover.timeFormatted, paneId: hover.paneId };
80
+ }
81
+ else {
82
+ this.currentHover.x = hover.x;
83
+ this.currentHover.time = hover.timeFormatted;
84
+ }
85
+ if (hover.candleHover && hover.paneId === CHART_UUID) {
86
+ switch (magnetTarget) {
87
+ case 'O':
88
+ this.currentHover.y = hover.candleHover.openY;
89
+ break;
90
+ case 'C':
91
+ this.currentHover.y = hover.candleHover.closeY;
92
+ break;
93
+ case 'H':
94
+ this.currentHover.y = hover.candleHover.highY;
95
+ break;
96
+ case 'L':
97
+ this.currentHover.y = hover.candleHover.lowY;
98
+ break;
99
+ case 'OHLC':
100
+ this.currentHover.y = hover.candleHover.closestOHLCY;
101
+ break;
102
+ case 'none':
103
+ this.currentHover.y = hover.y;
104
+ break;
105
+ }
106
+ }
107
+ else {
108
+ this.currentHover.y = hover.y;
109
+ }
110
+ this.currentHoverSubject.next(this.currentHover);
111
+ }
112
+ }
@@ -3,4 +3,140 @@
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{CanvasElement as v}from"../../../canvas/canvas-bounds-container";import{avoidAntialiasing as w,drawRoundedRect as B}from"../../../utils/canvas/canvas-drawing-functions.utils";import{priceLabelDrawersMap as S}from"../../y_axis/price_labels/price-label.drawer";export class CrossAndLabelsDrawerType{constructor(o,s,t,e=()=>!0,i){this.config=o,this.canvasBoundsContainer=s,this.paneManager=t,this.crossDrawPredicate=e,this.noLines=i}draw(o,s){this.crossDrawPredicate()&&w(o,()=>this.drawCrossTool(o,s))}drawCrossTool(o,s){var t,e,i,a,l;const n=this.canvasBoundsContainer.getBounds(v.ALL_PANES),d=this.canvasBoundsContainer.getBoundsHitTest(v.ALL_PANES,{extensionY:1e-4}),g=(t=this.config.components.xAxis.padding.top)!==null&&t!==void 0?t:0,r=(i=this.config.components.yAxis.typeConfig[(e=this.config.components.crossTool.yLabel.type)!==null&&e!==void 0?e:"badge"])===null||i===void 0?void 0:i.paddings,p=(a=r==null?void 0:r.start)!==null&&a!==void 0?a:0,c=(l=this.paneManager.paneComponents[s.paneId])===null||l===void 0?void 0:l.ht;if(d(s.x,n.y)){const x={start:[n.x,s.y],end:[n.x+n.width+p,s.y]},f={start:[s.x,n.y],end:[s.x,n.y+n.height+g]},u=c==null?void 0:c(s.x,s.y);this.noLines||(o.strokeStyle=this.config.colors.crossTool.lineColor,o.setLineDash(this.config.components.crossTool.lineDash),o.beginPath(),u&&(o.moveTo(...x.start),o.lineTo(...x.end)),o.moveTo(...f.start),o.lineTo(...f.end),o.stroke()),u&&this.drawYLabel(o,s),this.drawXLabel(o,s)}}drawXLabel(o,s){var t,e,i,a,l;const n=this.config.components.crossTool.xLabel.padding,d=this.config.components.crossTool.xLabel.margin,g=this.config.colors.crossTool;if(this.config.components.xAxis.visible){o.font=this.config.components.xAxis.fontSize+"px "+this.config.components.xAxis.fontFamily;const r=s.x,p=s.time,c=o.measureText(p).width,x=this.config.components.xAxis.fontSize,f=this.canvasBoundsContainer.getBounds(v.X_AXIS);o.save(),o.fillStyle=g.labelBoxColor;const u=(t=n==null?void 0:n.left)!==null&&t!==void 0?t:0,T=(e=n==null?void 0:n.right)!==null&&e!==void 0?e:0,h=(i=n==null?void 0:n.top)!==null&&i!==void 0?i:0,y=(a=n==null?void 0:n.bottom)!==null&&a!==void 0?a:0,b=(l=d==null?void 0:d.top)!==null&&l!==void 0?l:0,m=c+u+T,L=x+h+y,C=Math.max(r-m/2,0),A=f.y+b;B(o,C,A,m,L),o.fillStyle=g.labelTextColor;const P=Math.max(r-c/2,u),_=f.y+b+x+h-1;o.fillText(p,P,_),o.restore()}}drawYLabel(o,s){var t,e;const i=this.config.components.crossTool.yLabel.padding,a=this.config.colors.crossTool;if(this.config.components.yAxis.visible){const l=this.paneManager.paneComponents[s.paneId],n=s.y;if(!l)return;for(const d of l.yExtentComponents){const g=d.regularValueFromY(n),r=d.valueFormatter(g),p=this.canvasBoundsContainer.getBounds(v.PANE_UUID_Y_AXIS(l.uuid,d.idx)),c=S[this.config.components.crossTool.yLabel.type];c(o,p,r,n,{textColor:a.labelTextColor,bgColor:a.labelBoxColor,paddingBottom:i==null?void 0:i.bottom,paddingEnd:i==null?void 0:i.end,paddingTop:i==null?void 0:i.top},(e=(t=d.yAxisComponent)===null||t===void 0?void 0:t.state)!==null&&e!==void 0?e:this.config.components.yAxis,this.config.colors.yAxis,!0)}}}}
6
+ import { CanvasElement } from '../../../canvas/canvas-bounds-container';
7
+ import { avoidAntialiasing, drawRoundedRect } from '../../../utils/canvas/canvas-drawing-functions.utils';
8
+ import { priceLabelDrawersMap } from '../../y_axis/price_labels/price-label.drawer';
9
+ export class CrossAndLabelsDrawerType {
10
+ constructor(config, canvasBoundsContainer, paneManager, crossDrawPredicate = () => true, noLines) {
11
+ this.config = config;
12
+ this.canvasBoundsContainer = canvasBoundsContainer;
13
+ this.paneManager = paneManager;
14
+ this.crossDrawPredicate = crossDrawPredicate;
15
+ this.noLines = noLines;
16
+ }
17
+ /**
18
+ * Draws a cross tool on a canvas context and its labels if the crossDrawPredicate is true.
19
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
20
+ * @param {CrossToolHover} hover - The hover object containing information about the cross tool's position.
21
+ */
22
+ draw(ctx, hover) {
23
+ if (this.crossDrawPredicate()) {
24
+ avoidAntialiasing(ctx, () => this.drawCrossTool(ctx, hover));
25
+ }
26
+ }
27
+ /**
28
+ * This is a protected method called `drawCrossTool` that takes two parameters: `ctx` of type `CanvasRenderingContext2D` and `hover` of type `CrossToolHover`.
29
+ * The method draws a cross tool on the canvas using the provided context. It first gets the bounds of all panes and the hit test bounds of all panes. It then gets the top padding of the x-axis from the configuration and the left padding of the y-axis from the configuration based on the type of y-label.
30
+ * If the hit test bounds of all panes contain the hover coordinates, it draws a horizontal line and a vertical line using the provided coordinates and the bounds of all panes. It sets the stroke style to the line color from the configuration and sets the line dash to the line dash from the configuration. It then begins a new path, moves to the start of the horizontal line, draws a line to the end of the horizontal line, moves to the start of the vertical line, and draws a line to the end of the vertical line. Finally, it strokes the path.
31
+ */
32
+ drawCrossTool(ctx, hover) {
33
+ var _a, _b, _c, _d, _e;
34
+ const allPanes = this.canvasBoundsContainer.getBounds(CanvasElement.ALL_PANES);
35
+ // extension is need for allPanes.y to fit into hit test
36
+ const allPanesHT = this.canvasBoundsContainer.getBoundsHitTest(CanvasElement.ALL_PANES, { extensionY: 0.0001 });
37
+ const xAxisTopPadding = (_a = this.config.components.xAxis.padding.top) !== null && _a !== void 0 ? _a : 0;
38
+ const padding = (_c = this.config.components.yAxis.typeConfig[(_b = this.config.components.crossTool.yLabel.type) !== null && _b !== void 0 ? _b : 'badge']) === null || _c === void 0 ? void 0 : _c.paddings;
39
+ const yAxisLeftPadding = (_d = padding === null || padding === void 0 ? void 0 : padding.start) !== null && _d !== void 0 ? _d : 0;
40
+ // we want to draw hover even if y coordinate is beyond chart
41
+ // Example: snap option is turned on, and chart is scrolled down, so it's not visible
42
+ const paneHT = (_e = this.paneManager.panes[hover.paneId]) === null || _e === void 0 ? void 0 : _e.ht;
43
+ if (allPanesHT(hover.x, allPanes.y)) {
44
+ const horizontalLineCoords = {
45
+ start: [allPanes.x, hover.y],
46
+ end: [allPanes.x + allPanes.width + yAxisLeftPadding, hover.y],
47
+ };
48
+ const verticalLineCoords = {
49
+ start: [hover.x, allPanes.y],
50
+ end: [hover.x, allPanes.y + allPanes.height + xAxisTopPadding],
51
+ };
52
+ const allowHorizontal = paneHT === null || paneHT === void 0 ? void 0 : paneHT(hover.x, hover.y);
53
+ if (!this.noLines) {
54
+ ctx.strokeStyle = this.config.colors.crossTool.lineColor;
55
+ ctx.setLineDash(this.config.components.crossTool.lineDash);
56
+ ctx.beginPath();
57
+ // don't draw horizontal line if it's not in hit test
58
+ if (allowHorizontal) {
59
+ ctx.moveTo(...horizontalLineCoords.start);
60
+ ctx.lineTo(...horizontalLineCoords.end);
61
+ }
62
+ ctx.moveTo(...verticalLineCoords.start);
63
+ ctx.lineTo(...verticalLineCoords.end);
64
+ ctx.stroke();
65
+ }
66
+ allowHorizontal && this.drawYLabel(ctx, hover);
67
+ this.drawXLabel(ctx, hover);
68
+ }
69
+ }
70
+ /**
71
+ * Draws the X axis label for the cross tool on the canvas.
72
+ * @param {CanvasRenderingContext2D} ctx - The 2D rendering context for the canvas.
73
+ * @param {CrossToolHover} hover - The hover object containing the x and y coordinates of the cross tool.
74
+ * @returns {void}
75
+ */
76
+ drawXLabel(ctx, hover) {
77
+ var _a, _b, _c, _d, _e;
78
+ const xLabelPadding = this.config.components.crossTool.xLabel.padding;
79
+ const xLabelMargin = this.config.components.crossTool.xLabel.margin;
80
+ const crossToolColors = this.config.colors.crossTool;
81
+ // X axis label same for all
82
+ if (this.config.components.xAxis.visible) {
83
+ ctx.font = this.config.components.xAxis.fontSize + 'px ' + this.config.components.xAxis.fontFamily;
84
+ // X hover
85
+ const x = hover.x;
86
+ const labelText = hover.time;
87
+ const width = ctx.measureText(labelText).width;
88
+ const fontHeight = this.config.components.xAxis.fontSize;
89
+ // box
90
+ const xAxis = this.canvasBoundsContainer.getBounds(CanvasElement.X_AXIS);
91
+ ctx.save();
92
+ ctx.fillStyle = crossToolColors.labelBoxColor;
93
+ const xLabelPaddingLeft = (_a = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.left) !== null && _a !== void 0 ? _a : 0;
94
+ const xLabelPaddingRight = (_b = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.right) !== null && _b !== void 0 ? _b : 0;
95
+ const xLabelPaddingTop = (_c = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.top) !== null && _c !== void 0 ? _c : 0;
96
+ const xLabelPaddingBottom = (_d = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.bottom) !== null && _d !== void 0 ? _d : 0;
97
+ const xLabelMarginTop = (_e = xLabelMargin === null || xLabelMargin === void 0 ? void 0 : xLabelMargin.top) !== null && _e !== void 0 ? _e : 0;
98
+ const boxWidth = width + xLabelPaddingLeft + xLabelPaddingRight;
99
+ const boxHeight = fontHeight + xLabelPaddingTop + xLabelPaddingBottom;
100
+ const xBoxPos = Math.max(x - boxWidth / 2, 0);
101
+ const yBoxPos = xAxis.y + xLabelMarginTop;
102
+ drawRoundedRect(ctx, xBoxPos, yBoxPos, boxWidth, boxHeight);
103
+ // label
104
+ ctx.fillStyle = crossToolColors.labelTextColor;
105
+ const xTextPos = Math.max(x - width / 2, xLabelPaddingLeft);
106
+ const yTextPos = xAxis.y + xLabelMarginTop + fontHeight + xLabelPaddingTop - 1; // -1 for vertical adjustment
107
+ ctx.fillText(labelText, xTextPos, yTextPos);
108
+ ctx.restore();
109
+ }
110
+ }
111
+ /**
112
+ * Draws the Y-axis label on the canvas context at the given point.
113
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
114
+ * @param {Point} point - The point where the label should be drawn.
115
+ * @returns {void}
116
+ */
117
+ drawYLabel(ctx, point) {
118
+ const yLabelPadding = this.config.components.crossTool.yLabel.padding;
119
+ const crossToolColors = this.config.colors.crossTool;
120
+ // Y axis label different for main chart pane and the rest panes
121
+ if (this.config.components.yAxis.visible) {
122
+ const pane = this.paneManager.panes[point.paneId];
123
+ const y = point.y;
124
+ if (!pane) {
125
+ return;
126
+ }
127
+ for (const extent of pane.yExtentComponents) {
128
+ const price = extent.regularValueFromY(y);
129
+ const label = extent.valueFormatter(price);
130
+ const bounds = this.canvasBoundsContainer.getBounds(CanvasElement.PANE_UUID_Y_AXIS(pane.uuid, extent.idx));
131
+ const drawYLabel = priceLabelDrawersMap[this.config.components.crossTool.yLabel.type];
132
+ drawYLabel(ctx, bounds, label, y, {
133
+ textColor: crossToolColors.labelTextColor,
134
+ bgColor: crossToolColors.labelBoxColor,
135
+ paddingBottom: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.bottom,
136
+ paddingEnd: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.end,
137
+ paddingTop: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.top,
138
+ }, extent.yAxis.state, this.config.colors.yAxis, true);
139
+ }
140
+ }
141
+ }
142
+ }
@@ -3,4 +3,6 @@
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 NoneDrawerType{draw(){}}
6
+ export class NoneDrawerType {
7
+ draw() { }
8
+ }