@devexperts/dxcharts-lite 1.0.1 → 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 (379) hide show
  1. package/README.md +4 -4
  2. package/dist/chart/animation/canvas-animation.d.ts +1 -1
  3. package/dist/chart/animation/canvas-animation.js +135 -2
  4. package/dist/chart/animation/types/animation.d.ts +1 -1
  5. package/dist/chart/animation/types/animation.js +44 -2
  6. package/dist/chart/animation/types/color-alpha-animation.d.ts +2 -2
  7. package/dist/chart/animation/types/color-alpha-animation.js +61 -2
  8. package/dist/chart/animation/types/color-transition-animation.d.ts +2 -2
  9. package/dist/chart/animation/types/color-transition-animation.js +87 -2
  10. package/dist/chart/animation/types/viewport-movement-animation.d.ts +1 -1
  11. package/dist/chart/animation/types/viewport-movement-animation.js +64 -2
  12. package/dist/chart/animation/viewport-model-animation.d.ts +1 -1
  13. package/dist/chart/animation/viewport-model-animation.js +21 -2
  14. package/dist/chart/bootstrap.d.ts +52 -49
  15. package/dist/chart/bootstrap.js +450 -2
  16. package/dist/chart/canvas/canvas-bounds-container.d.ts +1 -6
  17. package/dist/chart/canvas/canvas-bounds-container.js +816 -2
  18. package/dist/chart/canvas/canvas-chart-html.d.ts +1 -1
  19. package/dist/chart/canvas/canvas-chart-html.js +17 -19
  20. package/dist/chart/canvas/chart-elements.d.ts +2 -5
  21. package/dist/chart/canvas/chart-elements.js +23 -2
  22. package/dist/chart/canvas/cursor.handler.d.ts +1 -1
  23. package/dist/chart/canvas/cursor.handler.js +123 -2
  24. package/dist/chart/canvas/layout-creator.d.ts +1 -1
  25. package/dist/chart/canvas/layout-creator.js +35 -2
  26. package/dist/chart/canvas/y-axis-bounds.container.d.ts +3 -3
  27. package/dist/chart/canvas/y-axis-bounds.container.js +68 -2
  28. package/dist/chart/chart-container.d.ts +1 -1
  29. package/dist/chart/chart-container.js +2 -2
  30. package/dist/chart/chart.config.d.ts +5 -6
  31. package/dist/chart/chart.config.js +646 -2
  32. package/dist/chart/chart.d.ts +62 -0
  33. package/dist/chart/chart.js +106 -0
  34. package/dist/chart/components/chart/basic-scale.d.ts +3 -3
  35. package/dist/chart/components/chart/basic-scale.js +32 -2
  36. package/dist/chart/components/chart/candle-transformer.functions.d.ts +1 -1
  37. package/dist/chart/components/chart/candle-transformer.functions.js +16 -2
  38. package/dist/chart/components/chart/candle-width-calculator.functions.d.ts +1 -1
  39. package/dist/chart/components/chart/candle-width-calculator.functions.js +3 -2
  40. package/dist/chart/components/chart/candle.functions.d.ts +1 -1
  41. package/dist/chart/components/chart/candle.functions.js +45 -2
  42. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +4 -4
  43. package/dist/chart/components/chart/chart-area-pan.handler.js +198 -2
  44. package/dist/chart/components/chart/chart-base.model.d.ts +1 -1
  45. package/dist/chart/components/chart/chart-base.model.js +67 -2
  46. package/dist/chart/components/chart/chart.component.d.ts +8 -4
  47. package/dist/chart/components/chart/chart.component.js +409 -2
  48. package/dist/chart/components/chart/chart.model.d.ts +5 -12
  49. package/dist/chart/components/chart/chart.model.js +955 -2
  50. package/dist/chart/components/chart/data-series.high-low-provider.d.ts +1 -1
  51. package/dist/chart/components/chart/data-series.high-low-provider.js +35 -2
  52. package/dist/chart/components/chart/fake-candles.d.ts +1 -1
  53. package/dist/chart/components/chart/fake-candles.js +98 -2
  54. package/dist/chart/components/chart/price.formatter.d.ts +1 -1
  55. package/dist/chart/components/chart/price.formatter.js +36 -2
  56. package/dist/chart/components/chart/secondary-chart-colors-pool.d.ts +1 -1
  57. package/dist/chart/components/chart/secondary-chart-colors-pool.js +69 -2
  58. package/dist/chart/components/cross_tool/cross-tool.component.d.ts +1 -1
  59. package/dist/chart/components/cross_tool/cross-tool.component.js +86 -2
  60. package/dist/chart/components/cross_tool/cross-tool.drawer.d.ts +1 -1
  61. package/dist/chart/components/cross_tool/cross-tool.drawer.js +33 -2
  62. package/dist/chart/components/cross_tool/cross-tool.model.d.ts +1 -1
  63. package/dist/chart/components/cross_tool/cross-tool.model.js +108 -2
  64. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.d.ts +1 -1
  65. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +138 -2
  66. package/dist/chart/components/cross_tool/types/none.drawer.d.ts +1 -1
  67. package/dist/chart/components/cross_tool/types/none.drawer.js +4 -2
  68. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.d.ts +1 -1
  69. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +29 -2
  70. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.d.ts +1 -1
  71. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +25 -2
  72. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.d.ts +1 -1
  73. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +54 -2
  74. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  75. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  76. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  77. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  78. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  79. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  80. package/dist/chart/components/events/events-hit-test.drawer.d.ts +1 -1
  81. package/dist/chart/components/events/events-hit-test.drawer.js +64 -2
  82. package/dist/chart/components/events/events.component.d.ts +1 -1
  83. package/dist/chart/components/events/events.component.js +62 -2
  84. package/dist/chart/components/events/events.drawer.d.ts +1 -1
  85. package/dist/chart/components/events/events.drawer.js +196 -2
  86. package/dist/chart/components/events/events.model.d.ts +1 -1
  87. package/dist/chart/components/events/events.model.js +70 -2
  88. package/dist/chart/components/grid/grid.component.d.ts +3 -3
  89. package/dist/chart/components/grid/grid.component.js +32 -2
  90. package/dist/chart/components/grid/grid.drawer.d.ts +5 -4
  91. package/dist/chart/components/grid/grid.drawer.js +107 -2
  92. package/dist/chart/components/high_low/high-low.component.d.ts +1 -1
  93. package/dist/chart/components/high_low/high-low.component.js +13 -2
  94. package/dist/chart/components/high_low/high-low.drawer.d.ts +1 -1
  95. package/dist/chart/components/high_low/high-low.drawer.js +127 -2
  96. package/dist/chart/components/highlights/highlights.component.d.ts +1 -1
  97. package/dist/chart/components/highlights/highlights.component.js +47 -2
  98. package/dist/chart/components/highlights/highlights.drawer.d.ts +1 -1
  99. package/dist/chart/components/highlights/highlights.drawer.js +155 -2
  100. package/dist/chart/components/highlights/highlights.model.d.ts +1 -1
  101. package/dist/chart/components/highlights/highlights.model.js +76 -2
  102. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +2 -2
  103. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +200 -2
  104. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +3 -3
  105. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +109 -2
  106. package/dist/chart/components/navigation_map/navigation-map.component.d.ts +1 -1
  107. package/dist/chart/components/navigation_map/navigation-map.component.js +113 -2
  108. package/dist/chart/components/navigation_map/navigation-map.drawer.d.ts +1 -1
  109. package/dist/chart/components/navigation_map/navigation-map.drawer.js +245 -2
  110. package/dist/chart/components/navigation_map/navigation-map.model.d.ts +1 -1
  111. package/dist/chart/components/navigation_map/navigation-map.model.js +34 -3
  112. package/dist/chart/components/pan/chart-pan.component.d.ts +3 -3
  113. package/dist/chart/components/pan/chart-pan.component.js +52 -2
  114. package/dist/chart/components/pane/extent/y-extent-component.d.ts +13 -19
  115. package/dist/chart/components/pane/extent/y-extent-component.js +121 -2
  116. package/dist/chart/components/pane/pane-hit-test.controller.d.ts +1 -1
  117. package/dist/chart/components/pane/pane-hit-test.controller.js +56 -2
  118. package/dist/chart/components/pane/pane-manager.component.d.ts +11 -6
  119. package/dist/chart/components/pane/pane-manager.component.js +149 -2
  120. package/dist/chart/components/pane/pane.component.d.ts +18 -34
  121. package/dist/chart/components/pane/pane.component.js +279 -2
  122. package/dist/chart/components/resizer/bar-resizer.component.d.ts +1 -1
  123. package/dist/chart/components/resizer/bar-resizer.component.js +140 -2
  124. package/dist/chart/components/resizer/bar-resizer.drawer.d.ts +1 -1
  125. package/dist/chart/components/resizer/bar-resizer.drawer.js +47 -2
  126. package/dist/chart/components/snapshot/snapshot.component.d.ts +1 -1
  127. package/dist/chart/components/snapshot/snapshot.component.js +49 -2
  128. package/dist/chart/components/volumes/separate-volumes.component.d.ts +7 -11
  129. package/dist/chart/components/volumes/separate-volumes.component.js +64 -2
  130. package/dist/chart/components/volumes/volume-color-resolvers.functions.d.ts +1 -1
  131. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +19 -2
  132. package/dist/chart/components/volumes/volumes.component.d.ts +9 -9
  133. package/dist/chart/components/volumes/volumes.component.js +95 -2
  134. package/dist/chart/components/volumes/volumes.drawer.d.ts +6 -13
  135. package/dist/chart/components/volumes/volumes.drawer.js +141 -2
  136. package/dist/chart/components/volumes/volumes.formatter.d.ts +1 -1
  137. package/dist/chart/components/volumes/volumes.formatter.js +32 -2
  138. package/dist/chart/components/volumes/volumes.model.d.ts +3 -3
  139. package/dist/chart/components/volumes/volumes.model.js +44 -2
  140. package/dist/chart/components/watermark/water-mark.component.d.ts +1 -1
  141. package/dist/chart/components/watermark/water-mark.component.js +104 -2
  142. package/dist/chart/components/watermark/water-mark.drawer.d.ts +1 -1
  143. package/dist/chart/components/watermark/water-mark.drawer.js +188 -2
  144. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.d.ts +1 -1
  145. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +28 -2
  146. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.d.ts +1 -1
  147. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +188 -2
  148. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.d.ts +1 -1
  149. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +77 -2
  150. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.d.ts +1 -1
  151. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +80 -2
  152. package/dist/chart/components/x_axis/time/parser/time-formats.model.d.ts +1 -1
  153. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +15 -2
  154. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +2 -2
  155. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +144 -2
  156. package/dist/chart/components/x_axis/time/x-axis-weights.generator.d.ts +1 -1
  157. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +74 -2
  158. package/dist/chart/components/x_axis/x-axis-draw.functions.d.ts +1 -1
  159. package/dist/chart/components/x_axis/x-axis-draw.functions.js +50 -2
  160. package/dist/chart/components/x_axis/x-axis-labels.drawer.d.ts +1 -1
  161. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +71 -2
  162. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +3 -3
  163. package/dist/chart/components/x_axis/x-axis-labels.generator.js +333 -2
  164. package/dist/chart/components/x_axis/x-axis-labels.model.d.ts +1 -1
  165. package/dist/chart/components/x_axis/x-axis-labels.model.js +36 -2
  166. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +3 -3
  167. package/dist/chart/components/x_axis/x-axis-scale.handler.js +61 -2
  168. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.d.ts +1 -1
  169. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +83 -2
  170. package/dist/chart/components/x_axis/x-axis.component.d.ts +3 -3
  171. package/dist/chart/components/x_axis/x-axis.component.js +120 -2
  172. package/dist/chart/components/y_axis/label-color.functions.d.ts +1 -1
  173. package/dist/chart/components/y_axis/label-color.functions.js +54 -2
  174. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +5 -5
  175. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +34 -2
  176. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +4 -4
  177. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +68 -2
  178. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.d.ts +1 -1
  179. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +57 -2
  180. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +1 -1
  181. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -2
  182. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +3 -3
  183. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +120 -2
  184. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +10 -9
  185. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +202 -2
  186. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +7 -8
  187. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +59 -2
  188. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +7 -5
  189. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +48 -2
  190. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +5 -5
  191. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +162 -2
  192. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +3 -3
  193. package/dist/chart/components/y_axis/y-axis-scale.handler.js +73 -2
  194. package/dist/chart/components/y_axis/y-axis.component.d.ts +33 -42
  195. package/dist/chart/components/y_axis/y-axis.component.js +221 -2
  196. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +10 -13
  197. package/dist/chart/components/y_axis/y-axis.drawer.js +97 -2
  198. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -18
  199. package/dist/chart/components/y_axis/y-axis.model.js +34 -2
  200. package/dist/chart/drawers/chart-background.drawer.d.ts +1 -1
  201. package/dist/chart/drawers/chart-background.drawer.js +70 -2
  202. package/dist/chart/drawers/chart-type-drawers/area.drawer.d.ts +1 -1
  203. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +70 -2
  204. package/dist/chart/drawers/chart-type-drawers/bar.drawer.d.ts +1 -1
  205. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +58 -2
  206. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.d.ts +1 -1
  207. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +85 -2
  208. package/dist/chart/drawers/chart-type-drawers/candle.drawer.d.ts +1 -1
  209. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +163 -2
  210. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.d.ts +1 -1
  211. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +58 -2
  212. package/dist/chart/drawers/chart-type-drawers/line.drawer.d.ts +1 -1
  213. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +39 -2
  214. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.d.ts +1 -1
  215. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +20 -2
  216. package/dist/chart/drawers/clear-canvas.drawer.d.ts +1 -1
  217. package/dist/chart/drawers/clear-canvas.drawer.js +15 -2
  218. package/dist/chart/drawers/composite.drawer.d.ts +1 -1
  219. package/dist/chart/drawers/composite.drawer.js +68 -2
  220. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.d.ts +1 -1
  221. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +51 -2
  222. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.d.ts +1 -1
  223. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +36 -2
  224. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.d.ts +1 -1
  225. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +17 -2
  226. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.d.ts +1 -1
  227. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +107 -2
  228. package/dist/chart/drawers/data-series-drawers/histogram.drawer.d.ts +1 -1
  229. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +24 -2
  230. package/dist/chart/drawers/data-series-drawers/linear.drawer.d.ts +1 -1
  231. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +20 -2
  232. package/dist/chart/drawers/data-series-drawers/points.drawer.d.ts +1 -1
  233. package/dist/chart/drawers/data-series-drawers/points.drawer.js +20 -2
  234. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.d.ts +1 -1
  235. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +8 -2
  236. package/dist/chart/drawers/data-series-drawers/text.drawer.d.ts +1 -1
  237. package/dist/chart/drawers/data-series-drawers/text.drawer.js +26 -2
  238. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.d.ts +1 -1
  239. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +36 -2
  240. package/dist/chart/drawers/data-series-drawers/triangle.drawer.d.ts +1 -1
  241. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +23 -2
  242. package/dist/chart/drawers/data-series.drawer.d.ts +6 -8
  243. package/dist/chart/drawers/data-series.drawer.js +57 -2
  244. package/dist/chart/drawers/drawing-manager.d.ts +2 -2
  245. package/dist/chart/drawers/drawing-manager.js +178 -2
  246. package/dist/chart/drawers/ht-data-series.drawer.d.ts +1 -1
  247. package/dist/chart/drawers/ht-data-series.drawer.js +38 -2
  248. package/dist/chart/events/event-bus.d.ts +1 -1
  249. package/dist/chart/events/event-bus.js +74 -2
  250. package/dist/chart/events/events.d.ts +1 -1
  251. package/dist/chart/events/events.js +4 -2
  252. package/dist/chart/inputhandlers/candle-tap.handler.d.ts +1 -1
  253. package/dist/chart/inputhandlers/candle-tap.handler.js +47 -2
  254. package/dist/chart/inputhandlers/chart-resize.handler.d.ts +1 -1
  255. package/dist/chart/inputhandlers/chart-resize.handler.js +99 -2
  256. package/dist/chart/inputhandlers/cross-event-producer.component.d.ts +1 -1
  257. package/dist/chart/inputhandlers/cross-event-producer.component.js +68 -2
  258. package/dist/chart/inputhandlers/hover-producer.component.d.ts +3 -3
  259. package/dist/chart/inputhandlers/hover-producer.component.js +229 -2
  260. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +3 -3
  261. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +81 -2
  262. package/dist/chart/inputlisteners/canvas-input-listener.component.d.ts +1 -1
  263. package/dist/chart/inputlisteners/canvas-input-listener.component.js +630 -2
  264. package/dist/chart/model/baseline.model.d.ts +1 -1
  265. package/dist/chart/model/baseline.model.js +89 -2
  266. package/dist/chart/model/bounds.model.d.ts +1 -1
  267. package/dist/chart/model/bounds.model.js +2 -2
  268. package/dist/chart/model/candle-hover.d.ts +1 -1
  269. package/dist/chart/model/candle-hover.js +71 -2
  270. package/dist/chart/model/candle-series-high-low.provider.d.ts +1 -1
  271. package/dist/chart/model/candle-series-high-low.provider.js +46 -2
  272. package/dist/chart/model/candle-series.model.d.ts +4 -4
  273. package/dist/chart/model/candle-series.model.js +246 -2
  274. package/dist/chart/model/candle.model.d.ts +1 -1
  275. package/dist/chart/model/candle.model.js +70 -2
  276. package/dist/chart/model/canvas.model.d.ts +1 -1
  277. package/dist/chart/model/canvas.model.js +229 -2
  278. package/dist/chart/model/chart-base-element.d.ts +1 -1
  279. package/dist/chart/model/chart-base-element.js +130 -2
  280. package/dist/chart/model/compare-series-hover.d.ts +1 -1
  281. package/dist/chart/model/compare-series-hover.js +26 -2
  282. package/dist/chart/model/data-series-view.d.ts +6 -6
  283. package/dist/chart/model/data-series-view.js +112 -2
  284. package/dist/chart/model/data-series.config.d.ts +1 -1
  285. package/dist/chart/model/data-series.config.js +15 -2
  286. package/dist/chart/model/data-series.model.d.ts +5 -5
  287. package/dist/chart/model/data-series.model.js +282 -2
  288. package/dist/chart/model/date-time.formatter.d.ts +1 -1
  289. package/dist/chart/model/date-time.formatter.js +152 -2
  290. package/dist/chart/model/hit-test-canvas.model.d.ts +2 -2
  291. package/dist/chart/model/hit-test-canvas.model.js +257 -2
  292. package/dist/chart/model/main-candle-series.model.d.ts +2 -2
  293. package/dist/chart/model/main-candle-series.model.js +30 -2
  294. package/dist/chart/model/scale.model.d.ts +3 -2
  295. package/dist/chart/model/scale.model.js +317 -2
  296. package/dist/chart/model/scaling/auto-scale.model.d.ts +1 -1
  297. package/dist/chart/model/scaling/auto-scale.model.js +98 -2
  298. package/dist/chart/model/scaling/constrait.functions.d.ts +1 -1
  299. package/dist/chart/model/scaling/constrait.functions.js +62 -2
  300. package/dist/chart/model/scaling/lock-ratio.model.d.ts +1 -1
  301. package/dist/chart/model/scaling/lock-ratio.model.js +18 -2
  302. package/dist/chart/model/scaling/move-chart.functions.d.ts +1 -1
  303. package/dist/chart/model/scaling/move-chart.functions.js +23 -2
  304. package/dist/chart/model/scaling/viewport.model.d.ts +3 -3
  305. package/dist/chart/model/scaling/viewport.model.js +280 -2
  306. package/dist/chart/model/scaling/x-zooming.functions.d.ts +1 -1
  307. package/dist/chart/model/scaling/x-zooming.functions.js +36 -2
  308. package/dist/chart/model/time-zone.model.d.ts +1 -1
  309. package/dist/chart/model/time-zone.model.js +110 -2
  310. package/dist/chart/model/visual-candle.d.ts +1 -1
  311. package/dist/chart/model/visual-candle.js +135 -2
  312. package/dist/chart/utils/__tests__/array.utils.test.d.ts +1 -1
  313. package/dist/chart/utils/__tests__/array.utils.test.js +136 -2
  314. package/dist/chart/utils/{perfomance/debounce.utils.js → __tests__/math.utils.test.d.ts} +2 -2
  315. package/dist/chart/utils/__tests__/math.utils.test.js +19 -0
  316. package/dist/chart/utils/__tests__/object.utils.test.d.ts +1 -1
  317. package/dist/chart/utils/__tests__/object.utils.test.js +12 -2
  318. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.d.ts +1 -1
  319. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +30 -2
  320. package/dist/chart/utils/array.utils.d.ts +2 -2
  321. package/dist/chart/utils/array.utils.js +270 -2
  322. package/dist/chart/utils/auto-period-detector.utils.d.ts +1 -1
  323. package/dist/chart/utils/auto-period-detector.utils.js +40 -2
  324. package/dist/chart/utils/candles-generator-ts.utils.d.ts +1 -1
  325. package/dist/chart/utils/candles-generator-ts.utils.js +21 -2
  326. package/dist/chart/utils/candles-generator.utils.d.ts +1 -1
  327. package/dist/chart/utils/candles-generator.utils.js +162 -2
  328. package/dist/chart/utils/candles.utils.d.ts +1 -1
  329. package/dist/chart/utils/candles.utils.js +43 -2
  330. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.d.ts +1 -1
  331. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +145 -2
  332. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.d.ts +1 -1
  333. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +52 -2
  334. package/dist/chart/utils/canvas/canvas-text-functions.utils.d.ts +1 -1
  335. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +157 -2
  336. package/dist/chart/utils/color.utils.d.ts +1 -1
  337. package/dist/chart/utils/color.utils.js +32 -2
  338. package/dist/chart/utils/device/browser.utils.d.ts +1 -1
  339. package/dist/chart/utils/device/browser.utils.js +11 -2
  340. package/dist/chart/utils/device/device-detector.utils.d.ts +1 -1
  341. package/dist/chart/utils/device/device-detector.utils.js +25 -2
  342. package/dist/chart/utils/device/device-pixel-ratio.utils.d.ts +1 -1
  343. package/dist/chart/utils/device/device-pixel-ratio.utils.js +22 -2
  344. package/dist/chart/utils/device/touchpad.utils.d.ts +1 -1
  345. package/dist/chart/utils/device/touchpad.utils.js +92 -2
  346. package/dist/chart/utils/dom.utils.d.ts +1 -1
  347. package/dist/chart/utils/dom.utils.js +16 -2
  348. package/dist/chart/utils/function.utils.d.ts +1 -1
  349. package/dist/chart/utils/function.utils.js +17 -2
  350. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  351. package/dist/chart/utils/linkedList.utils.js +138 -0
  352. package/dist/chart/utils/math.utils.d.ts +1 -1
  353. package/dist/chart/utils/math.utils.js +116 -2
  354. package/dist/chart/utils/merge.utils.d.ts +1 -1
  355. package/dist/chart/utils/merge.utils.js +57 -2
  356. package/dist/chart/utils/object.utils.d.ts +1 -1
  357. package/dist/chart/utils/object.utils.js +44 -2
  358. package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +1 -1
  359. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  360. package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +1 -1
  361. package/dist/chart/utils/performance/debounce.utils.js +12 -0
  362. package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +1 -1
  363. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  364. package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +1 -1
  365. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  366. package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +1 -1
  367. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  368. package/dist/chart/utils/price-increments.utils.d.ts +2 -1
  369. package/dist/chart/utils/price-increments.utils.js +128 -2
  370. package/dist/chart/utils/uuid.utils.d.ts +1 -1
  371. package/dist/chart/utils/uuid.utils.js +5 -2
  372. package/dist/dxchart.min.js +10 -13
  373. package/dist/index.d.ts +4 -4
  374. package/dist/index.js +21 -2
  375. package/package.json +4 -4
  376. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  377. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  378. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  379. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
@@ -1,6 +1,108 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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{CHART_UUID as w,CanvasElement as f}from"../../canvas/canvas-bounds-container";import{ChartBaseElement as d}from"../../model/chart-base-element";import{merge as n}from"../../utils/merge.utils";import{WaterMarkDrawer as k}from"./water-mark.drawer";export class WaterMarkComponent extends d{constructor(t,e,c,h,a,i,o){super(),this.paneManager=t,this.chartModel=e,this.eventBus=c,this.config=h,this.canvasModel=i,this.waterMarkConfig=this.config.components.waterMark,this.waterMarkData=this.getWaterMarkData(),this.waterMarkDrawer=new k(this.config,a,i,()=>this.waterMarkConfig,()=>this.waterMarkData),this.addRxSubscription(n(a.observeBoundsChanged(f.PANE_UUID(w)),this.paneManager.panesChangedSubject).subscribe(r=>{this.waterMarkConfig=this.recalculateTextSize(r.width,r.height)})),this.addRxSubscription(this.chartModel.candlesSetSubject.subscribe(()=>{this.waterMarkData=this.getWaterMarkData()})),o.addDrawerAfter(this.waterMarkDrawer,"WATERMARK","DRAWINGS")}setWaterMarkVisible(t){this.config.components&&this.config.components.waterMark&&(this.config.components.waterMark.visible=t,this.canvasModel.fireDraw())}setWaterMarkData(t){this.waterMarkData=t,this.canvasModel.fireDraw()}getWaterMarkData(){return this.waterMarkData||{}}setWaterMarkConfig(t){if(!(!t||!this.config.components)){if(!this.config.components.waterMark)this.config.components.waterMark=JSON.parse(JSON.stringify(t));else{const e={};n(e,t),n(e,this.config.components.waterMark),this.config.components.waterMark=e}this.canvasModel.fireDraw()}}setLogoImage(t){this.waterMarkDrawer.setLogoImage(t)}recalculateTextSize(t,e){const a=g=>.15*Math.log(g)/Math.log(1.5)+1,i=a(t/1920),o=a(e/1080),r=Math.min(i,o),s=r>=0?r:0,M={firstRowFontSize:Math.round(this.config.components.waterMark.firstRowFontSize*s),secondRowFontSize:Math.round(this.config.components.waterMark.secondRowFontSize*s),thirdRowFontSize:Math.round(this.config.components.waterMark.thirdRowFontSize*s)};return Object.assign(Object.assign({},this.config.components.waterMark),M)}}
6
+ import { CHART_UUID, CanvasElement } from '../../canvas/canvas-bounds-container';
7
+ import { ChartBaseElement } from '../../model/chart-base-element';
8
+ import { merge } from '../../utils/merge.utils';
9
+ import { WaterMarkDrawer } from './water-mark.drawer';
10
+ export class WaterMarkComponent extends ChartBaseElement {
11
+ constructor(paneManager, chartModel, eventBus, config, canvasBoundsContainer, canvasModel, drawingManager) {
12
+ super();
13
+ this.paneManager = paneManager;
14
+ this.chartModel = chartModel;
15
+ this.eventBus = eventBus;
16
+ this.config = config;
17
+ this.canvasModel = canvasModel;
18
+ this.waterMarkConfig = this.config.components.waterMark;
19
+ this.waterMarkData = this.getWaterMarkData();
20
+ this.waterMarkDrawer = new WaterMarkDrawer(this.config, canvasBoundsContainer, canvasModel, () => this.waterMarkConfig, () => this.waterMarkData);
21
+ this.addRxSubscription(merge(canvasBoundsContainer.observeBoundsChanged(CanvasElement.PANE_UUID(CHART_UUID)), this.paneManager.panesChangedSubject).subscribe((bounds) => {
22
+ this.waterMarkConfig = this.recalculateTextSize(bounds.width, bounds.height);
23
+ }));
24
+ this.addRxSubscription(this.chartModel.candlesSetSubject.subscribe(() => {
25
+ this.waterMarkData = this.getWaterMarkData();
26
+ }));
27
+ drawingManager.addDrawerAfter(this.waterMarkDrawer, 'WATERMARK', 'DYNAMIC_OBJECTS');
28
+ }
29
+ /**
30
+ * Sets the visibility of the watermark component.
31
+ *
32
+ * @param {boolean} visible - A boolean indicating whether the watermark should be visible or not.
33
+ * @returns {void}
34
+ */
35
+ setWaterMarkVisible(visible) {
36
+ if (this.config.components && this.config.components.waterMark) {
37
+ this.config.components.waterMark.visible = visible;
38
+ this.canvasModel.fireDraw();
39
+ }
40
+ }
41
+ /**
42
+ * Sets the watermark data to be used in the canvas.
43
+ * @param {WaterMarkData} watermarkData - The data to be used as watermark.
44
+ * @returns {void}
45
+ */
46
+ setWaterMarkData(watermarkData) {
47
+ this.waterMarkData = watermarkData;
48
+ this.canvasModel.fireDraw();
49
+ }
50
+ /**
51
+ * Returns the water mark data object if it exists, otherwise returns an empty object.
52
+ * @returns {WaterMarkData} The water mark data object.
53
+ */
54
+ getWaterMarkData() {
55
+ return this.waterMarkData || {};
56
+ }
57
+ /**
58
+ * Sets the watermark configuration for the chart.
59
+ * @param {WaterMarkConfig} watermarkConfig - The configuration object for the watermark.
60
+ * @returns {void}
61
+
62
+ */
63
+ setWaterMarkConfig(watermarkConfig) {
64
+ if (!watermarkConfig || !this.config.components) {
65
+ return;
66
+ }
67
+ if (!this.config.components.waterMark) {
68
+ this.config.components.waterMark = JSON.parse(JSON.stringify(watermarkConfig));
69
+ }
70
+ else {
71
+ const newWatermark = {};
72
+ merge(newWatermark, watermarkConfig);
73
+ merge(newWatermark, this.config.components.waterMark);
74
+ // eslint-disable-next-line no-restricted-syntax
75
+ this.config.components.waterMark = newWatermark;
76
+ }
77
+ this.canvasModel.fireDraw();
78
+ }
79
+ /**
80
+ * Sets the logo image to be used as a watermark.
81
+ * @param {CanvasImageSource} img - The image to be used as a watermark.
82
+ */
83
+ setLogoImage(img) {
84
+ this.waterMarkDrawer.setLogoImage(img);
85
+ }
86
+ /**
87
+ * Recalculates the watermark text size based on the chart's width and height.
88
+ * @param {number} chartWidth - The width of the chart.
89
+ * @param {number} chartHeight - The height of the chart.
90
+ * @returns {Object} - An object containing the updated watermark font sizes.
91
+ */
92
+ recalculateTextSize(chartWidth, chartHeight) {
93
+ const defaultScreenWidth = 1920;
94
+ const defaultScreenHeight = 1080;
95
+ // this function is used to make logarithmic dependency between screen size and watermark size
96
+ const fun = (x) => (0.15 * Math.log(x)) / Math.log(1.5) + 1;
97
+ const textSizeRatioHorizontal = fun(chartWidth / defaultScreenWidth);
98
+ const textSizeRatioVertical = fun(chartHeight / defaultScreenHeight);
99
+ const textSizeRatio = Math.min(textSizeRatioHorizontal, textSizeRatioVertical);
100
+ const textRatio = textSizeRatio >= 0 ? textSizeRatio : 0;
101
+ const updatedProps = {
102
+ firstRowFontSize: Math.round(this.config.components.waterMark.firstRowFontSize * textRatio),
103
+ secondRowFontSize: Math.round(this.config.components.waterMark.secondRowFontSize * textRatio),
104
+ thirdRowFontSize: Math.round(this.config.components.waterMark.thirdRowFontSize * textRatio),
105
+ };
106
+ return Object.assign(Object.assign({}, this.config.components.waterMark), updatedProps);
107
+ }
108
+ }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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
  */
@@ -1,6 +1,192 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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{CHART_UUID as k,CanvasElement as B}from"../../canvas/canvas-bounds-container";export class WaterMarkDrawer{constructor(e,n,s,w,h){this.config=e,this.canvasBoundsContainer=n,this.canvasModel=s,this.waterMarkConfigProvider=w,this.watermarkDataProvider=h,this.getConfig=(d=0,r,l,g,R,t)=>{const i=this.canvasModel.ctx,o=this.canvasBoundsContainer.getBounds(B.PANE_UUID(k)),{position:u,offsetY:m,offsetX:x}=this.config.components.waterMark;let a;switch(t?a=t:(i.font=setFont(this.config,l),a=i.measureText(r).width,o.width-10<a&&(i.font=reCountingSize(this.config,this.canvasBoundsContainer,l,a),a=i.measureText(r).width)),u){case"left-top":return{x:x+o.x,y:m+d+o.y,font:i.font,text:r,color:g};case"left-bottom":return{x:x+o.x,y:o.height-R-m+d+o.y,font:i.font,text:r,color:g};case"center":return{x:o.width/2-a/2+o.x,y:(o.height-R)/2+d+o.y,font:i.font,text:r,color:g}}}}draw(){var e,n,s,w,h,d,r;if(!((e=this.config.components.waterMark)===null||e===void 0)&&e.visible&&this.config.colors){const{firstRow:l,secondRow:g,thirdRow:R}=this.watermarkDataProvider(),t=this.waterMarkConfigProvider(),i=this.config.colors.waterMarkTheme,o=this.canvasModel.ctx;let u=0,m=0,x=0,a=0,v=0;if(o.save(),t.firstRowFontSize&&l){o.font=setFont(this.config,t.firstRowFontSize);const c=o.measureText(l);u=c.actualBoundingBoxAscent+c.actualBoundingBoxDescent}if(t.secondRowFontSize&&g){o.font=setFont(this.config,t.secondRowFontSize);const c=o.measureText(g);m=c.actualBoundingBoxAscent+c.actualBoundingBoxDescent,x=(n=t.firstRowBottomPadding)!==null&&n!==void 0?n:0}if(t.thirdRowFontSize&&R){o.font=setFont(this.config,t.thirdRowFontSize);const c=o.measureText(R);a=c.actualBoundingBoxAscent+c.actualBoundingBoxDescent,v=(s=t.secondRowBottomPadding)!==null&&s!==void 0?s:0}const p=(w=t.thirdRowBottomPadding)!==null&&w!==void 0?w:0,C=(h=t.logoHeight)!==null&&h!==void 0?h:0,M=u+m+x+a+v+p+C;if(l&&this.drawWaterMark(this.getConfig(u,l,t.firstRowFontSize,i.firstRowColor,M)),g&&this.drawWaterMark(this.getConfig(u+x+m,g,t.secondRowFontSize,i.secondRowColor,M)),R&&this.drawWaterMark(this.getConfig(u+x+m+v+a,R,t.thirdRowFontSize,i.thirdRowColor,M)),this.logoImage){const c=this.getConfig(u+x+m+v+a+p,"",t.thirdRowFontSize,i.thirdRowColor,M,t.logoWidth);this.canvasModel.ctx.drawImage(this.logoImage,c.x,c.y,(d=t.logoWidth)!==null&&d!==void 0?d:0,(r=t.logoHeight)!==null&&r!==void 0?r:0)}o.restore()}}getCanvasIds(){return[this.canvasModel.canvasId]}setLogoImage(e){this.logoImage=e}drawWaterMark(e){const n=e.text;if(!n||!n.length)return;const s=this.canvasModel.ctx;s.font=e.font,s.fillStyle=e.color;const w=e.x,h=e.y;s.fillText(n,w,h)}reset(){}}export const reCountingSize=(f,e,n,s)=>{const h=((r,l)=>e.getBounds(B.CHART).width/l*r)(n,s);let d;return f.components&&f.components.waterMark&&(d=f.components.waterMark.fontFamily),h+"px "+d},setFont=(f,e)=>{let n;return f.components&&f.components.waterMark&&(n=f.components.waterMark.fontFamily),e+"px "+n};
6
+ import { CHART_UUID, CanvasElement } from '../../canvas/canvas-bounds-container';
7
+ export class WaterMarkDrawer {
8
+ constructor(config, canvasBoundsContainer, canvasModel, waterMarkConfigProvider, watermarkDataProvider) {
9
+ this.config = config;
10
+ this.canvasBoundsContainer = canvasBoundsContainer;
11
+ this.canvasModel = canvasModel;
12
+ this.waterMarkConfigProvider = waterMarkConfigProvider;
13
+ this.watermarkDataProvider = watermarkDataProvider;
14
+ this.getConfig = (offset = 0, text, fontSize, color, totalHeight, redefinedWidth) => {
15
+ const ctx = this.canvasModel.ctx;
16
+ const chartBounds = this.canvasBoundsContainer.getBounds(CanvasElement.PANE_UUID(CHART_UUID));
17
+ const { position: posType, offsetY, offsetX } = this.config.components.waterMark;
18
+ let width;
19
+ if (!redefinedWidth) {
20
+ ctx.font = setFont(this.config, fontSize);
21
+ width = ctx.measureText(text).width;
22
+ if (chartBounds.width - 10 < width) {
23
+ ctx.font = reCountingSize(this.config, this.canvasBoundsContainer, fontSize, width);
24
+ width = ctx.measureText(text).width;
25
+ }
26
+ }
27
+ else {
28
+ width = redefinedWidth;
29
+ }
30
+ switch (posType) {
31
+ case 'left-top':
32
+ return {
33
+ x: offsetX + chartBounds.x,
34
+ y: offsetY + offset + chartBounds.y,
35
+ font: ctx.font,
36
+ text,
37
+ color,
38
+ };
39
+ case 'left-bottom':
40
+ return {
41
+ x: offsetX + chartBounds.x,
42
+ y: chartBounds.height - totalHeight - offsetY + offset + chartBounds.y,
43
+ font: ctx.font,
44
+ text,
45
+ color,
46
+ };
47
+ case 'center':
48
+ return {
49
+ x: chartBounds.width / 2 - width / 2 + chartBounds.x,
50
+ y: (chartBounds.height - totalHeight) / 2 + offset + chartBounds.y,
51
+ font: ctx.font,
52
+ text,
53
+ color,
54
+ };
55
+ }
56
+ };
57
+ }
58
+ /**
59
+ * Draws a watermark on the canvas if the watermark is visible and the colors are provided in the configuration.
60
+ * The watermark consists of three rows of text and an optional logo image.
61
+ * The height of each row is calculated based on the font size and the actual text height.
62
+ * The total height of the watermark is calculated by adding the heights of all rows and the logo image.
63
+ * The watermark is drawn using the drawWaterMark() method and the configuration is provided by the getConfig() method.
64
+ * The font size and color of each row are provided in the waterMarkConfig object.
65
+ * The logo image is drawn using the drawImage() method and its dimensions are provided in the waterMarkConfig object.
66
+ * @function
67
+ */
68
+ draw() {
69
+ var _a, _b, _c, _d, _e, _f, _g;
70
+ if (((_a = this.config.components.waterMark) === null || _a === void 0 ? void 0 : _a.visible) && this.config.colors) {
71
+ const { firstRow, secondRow, thirdRow } = this.watermarkDataProvider();
72
+ const waterMarkConfig = this.waterMarkConfigProvider();
73
+ const waterMarkTheme = this.config.colors.waterMarkTheme;
74
+ const ctx = this.canvasModel.ctx;
75
+ let firstRowHeight = 0;
76
+ let secondRowHeight = 0;
77
+ let secondRowGap = 0;
78
+ let thirdRowHeight = 0;
79
+ let thirdRowGap = 0;
80
+ ctx.save();
81
+ // set font for first watermark Row
82
+ if (waterMarkConfig.firstRowFontSize && firstRow) {
83
+ ctx.font = setFont(this.config, waterMarkConfig.firstRowFontSize);
84
+ const firstRowMetrics = ctx.measureText(firstRow);
85
+ firstRowHeight = firstRowMetrics.actualBoundingBoxAscent + firstRowMetrics.actualBoundingBoxDescent;
86
+ }
87
+ // set font for second watermark Row
88
+ if (waterMarkConfig.secondRowFontSize && secondRow) {
89
+ ctx.font = setFont(this.config, waterMarkConfig.secondRowFontSize);
90
+ const secondRowMetrics = ctx.measureText(secondRow);
91
+ secondRowHeight = secondRowMetrics.actualBoundingBoxAscent + secondRowMetrics.actualBoundingBoxDescent;
92
+ secondRowGap = (_b = waterMarkConfig.firstRowBottomPadding) !== null && _b !== void 0 ? _b : 0;
93
+ }
94
+ // set font for third watermark Row
95
+ if (waterMarkConfig.thirdRowFontSize && thirdRow) {
96
+ ctx.font = setFont(this.config, waterMarkConfig.thirdRowFontSize);
97
+ const thirdRowMetrics = ctx.measureText(thirdRow);
98
+ thirdRowHeight = thirdRowMetrics.actualBoundingBoxAscent + thirdRowMetrics.actualBoundingBoxDescent;
99
+ thirdRowGap = (_c = waterMarkConfig.secondRowBottomPadding) !== null && _c !== void 0 ? _c : 0;
100
+ }
101
+ const imageGap = (_d = waterMarkConfig.thirdRowBottomPadding) !== null && _d !== void 0 ? _d : 0;
102
+ const imageHeight = (_e = waterMarkConfig.logoHeight) !== null && _e !== void 0 ? _e : 0;
103
+ const totalHeight = firstRowHeight + secondRowHeight + secondRowGap + thirdRowHeight + thirdRowGap + imageGap + imageHeight;
104
+ // draw first Row
105
+ if (firstRow) {
106
+ this.drawWaterMark(this.getConfig(firstRowHeight, firstRow, waterMarkConfig.firstRowFontSize, waterMarkTheme.firstRowColor, totalHeight));
107
+ }
108
+ // draw second Row
109
+ if (secondRow) {
110
+ this.drawWaterMark(this.getConfig(firstRowHeight + secondRowGap + secondRowHeight, secondRow, waterMarkConfig.secondRowFontSize, waterMarkTheme.secondRowColor, totalHeight));
111
+ }
112
+ // draw third Row
113
+ if (thirdRow) {
114
+ this.drawWaterMark(this.getConfig(firstRowHeight + secondRowGap + secondRowHeight + thirdRowGap + thirdRowHeight, thirdRow, waterMarkConfig.thirdRowFontSize, waterMarkTheme.thirdRowColor, totalHeight));
115
+ }
116
+ // draw image
117
+ if (this.logoImage) {
118
+ const config = this.getConfig(firstRowHeight + secondRowGap + secondRowHeight + thirdRowGap + thirdRowHeight + imageGap, '', waterMarkConfig.thirdRowFontSize, waterMarkTheme.thirdRowColor, totalHeight, waterMarkConfig.logoWidth);
119
+ this.canvasModel.ctx.drawImage(this.logoImage, config.x, config.y, (_f = waterMarkConfig.logoWidth) !== null && _f !== void 0 ? _f : 0, (_g = waterMarkConfig.logoHeight) !== null && _g !== void 0 ? _g : 0);
120
+ }
121
+ ctx.restore();
122
+ }
123
+ }
124
+ /**
125
+ * Returns an array of canvas ids.
126
+ *
127
+ * @returns {Array<string>} An array of canvas ids.
128
+ */
129
+ getCanvasIds() {
130
+ return [this.canvasModel.canvasId];
131
+ }
132
+ /**
133
+ * Sets the logo image to be displayed.
134
+ *
135
+ * @param {CanvasImageSource} img - The image to be set as the logo.
136
+ * @returns {void}
137
+ */
138
+ setLogoImage(img) {
139
+ this.logoImage = img;
140
+ }
141
+ /**
142
+ * Draws a watermark on the canvas.
143
+ *
144
+ * @private
145
+ * @param {Object} config - The configuration object for the watermark.
146
+ * @param {string} config.text - The text to be displayed as the watermark.
147
+ * @param {string} config.font - The font to be used for the watermark.
148
+ * @param {string} config.color - The color to be used for the watermark.
149
+ * @param {number} config.x - The x-coordinate of the starting point of the watermark.
150
+ * @param {number} config.y - The y-coordinate of the starting point of the watermark.
151
+ * @returns {void}
152
+ */
153
+ drawWaterMark(config) {
154
+ const text = config.text;
155
+ if (!text || !text.length) {
156
+ return;
157
+ }
158
+ const ctx = this.canvasModel.ctx;
159
+ ctx.font = config.font;
160
+ ctx.fillStyle = config.color;
161
+ const x = config.x;
162
+ const y = config.y;
163
+ ctx.fillText(text, x, y);
164
+ }
165
+ /**
166
+ * A method that resets the state of an object to its initial values.
167
+ *
168
+ * @function
169
+ * @name reset
170
+ * @returns {void}
171
+ */
172
+ reset() { }
173
+ }
174
+ export const reCountingSize = (config, canvasBoundsContainer, fontSize, fontWidth) => {
175
+ const getFontSize = (fontSize, fontWidth) => {
176
+ const chart = canvasBoundsContainer.getBounds(CanvasElement.CHART);
177
+ return (chart.width / fontWidth) * fontSize;
178
+ };
179
+ const size = getFontSize(fontSize, fontWidth);
180
+ let font = undefined;
181
+ if (config.components && config.components.waterMark) {
182
+ font = config.components.waterMark.fontFamily;
183
+ }
184
+ return size + 'px ' + font;
185
+ };
186
+ export const setFont = (config, fontSize) => {
187
+ let font = undefined;
188
+ if (config.components && config.components.waterMark) {
189
+ font = config.components.waterMark.fontFamily;
190
+ }
191
+ return fontSize + 'px ' + font;
192
+ };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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
  */
@@ -1,6 +1,32 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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{NumericAxisLabelsGenerator as s}from"../labels_generator/numeric-axis-labels.generator";export class NumericXAxisLabelsGenerator extends s{constructor(e,a=r=>`${r}`){super(null,()=>[e.yStart,e.yEnd],()=>e.getBounds().width,a,!1,()=>"regular",()=>0,void 0)}get labels(){return this.labelsCache.calculateOrGet()}recalculateLabels(){this.generateNumericLabels()}generateLabels(){this.labelsCache.invalidate(),this.generateNumericLabels()}}
6
+ import { NumericAxisLabelsGenerator } from '../labels_generator/numeric-axis-labels.generator';
7
+ /**
8
+ * Y axis labels generator for prices. Respects price increment from instrument.
9
+ */
10
+ export class NumericXAxisLabelsGenerator extends NumericAxisLabelsGenerator {
11
+ constructor(viewportModel, valueFormatter = value => `${value}`) {
12
+ super(null, () => [viewportModel.yStart, viewportModel.yEnd], () => viewportModel.getBounds().width, valueFormatter, false, () => 'regular', () => 0, undefined);
13
+ }
14
+ get labels() {
15
+ return this.labelsCache.calculateOrGet();
16
+ }
17
+ /**
18
+ * Recalculates the labels of the chart.
19
+ * Calls the generateNumericLabels method to generate new numeric labels.
20
+ */
21
+ recalculateLabels() {
22
+ this.generateNumericLabels();
23
+ }
24
+ /**
25
+ * Invalidates the labels cache and generates numeric labels.
26
+ * @returns {void}
27
+ */
28
+ generateLabels() {
29
+ this.labelsCache.invalidate();
30
+ this.generateNumericLabels();
31
+ }
32
+ }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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
  */
@@ -1,6 +1,192 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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{eachDayOfInterval as k,isSameDay as h,isMonday as M,isTuesday as f,isWednesday as i,isThursday as v,isFriday as w,isSaturday as T,isSunday as g,startOfMonth as S,endOfMonth as O}from"date-fns/esm";export const timeFormatMatcherFactory=e=>{switch(e.key){case"lessThanSecond":return N(e);case"month":return W(e);case"second":case"minute":case"hour":case"day":case"year":return B(e);case"week-weekday":return C(e);default:return()=>!1}};const r=(e,s)=>{switch(s){case"lessThanSecond":return e.getMilliseconds();case"month":return e.getMonth();case"second":return e.getSeconds();case"minute":return e.getMinutes();case"hour":return e.getHours();case"day":return e.getDate();case"year":return e.getFullYear();case"week-weekday":return e.getDate()}},o=e=>(s,n)=>{const c=r(s,e),t=r(n,e);return c!==t},p=e=>(s,n)=>{const c=r(s,e),t=r(n,e);return c>=t},x={1:M,2:f,3:i,4:v,5:w,6:T,7:g},I=(e,s,n)=>{var c;const t=k({start:S(e),end:O(e)}),u=(c=x[n])!==null&&c!==void 0?c:()=>!1;if(s==="$"){for(const a of t.reverse())if(u(a))return h(e,a)}else{let a=1;for(const y of t)if(u(y)){if(a===s)return h(e,y);a++}}return!1},l=(e,s)=>s===1?e===1:e/s===1,d=(e,s)=>s===1?!0:e%s===0,N=e=>(s,n)=>p(e.key)(s,n),W=e=>(s,n)=>{const c=o(e.key)(s,n),t=e.exact?l(r(s,e.key)+1,e.value):d(r(s,e.key)+1,e.value);return c&&t},B=e=>(s,n)=>{const c=o(e.key)(s,n),t=e.exact?l(r(s,e.key),e.value):d(r(s,e.key),e.value);return c&&t},C=e=>(s,n)=>{const c=o(e.key)(s,n),t=I(s,e.week,e.weekday);return c&&t};
6
+ import { eachDayOfInterval, isSameDay, isMonday, isTuesday, isWednesday, isThursday, isFriday, isSaturday, isSunday, startOfMonth, endOfMonth, } from 'date-fns/esm';
7
+ /**
8
+ * Factory that return a {@link TimeFormatMatcher} function for a given {@link ParsedTimeFormats}
9
+ * @see
10
+ * Detailed explanation you can find here {@link TimeFormatMatcher}
11
+ */
12
+ export const timeFormatMatcherFactory = (timeFormat) => {
13
+ switch (timeFormat.key) {
14
+ case 'lessThanSecond':
15
+ return lessThanSecondMatcherFactory(timeFormat);
16
+ case 'month':
17
+ return monthMatcherFactory(timeFormat);
18
+ case 'second':
19
+ case 'minute':
20
+ case 'hour':
21
+ case 'day':
22
+ case 'year':
23
+ return commonMatcherFactory(timeFormat);
24
+ case 'week-weekday':
25
+ return weekWeekdayMatcherFactory(timeFormat);
26
+ default:
27
+ return () => false;
28
+ }
29
+ };
30
+ /**
31
+ * Returns a `number` for a given {@link Date} and {@link TimeFormat}
32
+ * @example
33
+ * const date = new Date('Fri Feb 14 2023 14:50:10 GMT+0500');
34
+ * const timeFormat: TimeFormat = 'day';
35
+ * // `getTimeFromDateByTimeFormat` will return days from given date and it will be 14, because `Feb 14`
36
+ * const days = getTimeFromDateByTimeFormat(date, timeFormat); // 14
37
+ */
38
+ const getTimeFromDateByTimeFormat = (date, timeFormat) => {
39
+ switch (timeFormat) {
40
+ case 'lessThanSecond':
41
+ return date.getMilliseconds();
42
+ case 'month':
43
+ return date.getMonth();
44
+ case 'second':
45
+ return date.getSeconds();
46
+ case 'minute':
47
+ return date.getMinutes();
48
+ case 'hour':
49
+ return date.getHours();
50
+ case 'day':
51
+ return date.getDate();
52
+ case 'year':
53
+ return date.getFullYear();
54
+ case 'week-weekday':
55
+ return date.getDate();
56
+ }
57
+ };
58
+ /**
59
+ * Checks if the given dates are not the same for a given {@link TimeFormat}
60
+ * @example
61
+ * const date1 = new Date('Fri Feb 10 2023 14:50:10 GMT+0500');
62
+ * const date2 = new Date('Fri Feb 09 2023 14:50:10 GMT+0500');
63
+ * const timeFormat: TimeFormat = 'day';
64
+ * // `true` because it takes days from `Feb 10` and `Feb 09`, and 10 !== 9
65
+ * const notTheSame = datesNOTtheSame(timeFormat)(date1, date2); // true
66
+ *
67
+ */
68
+ const datesNOTtheSame = (key) => (currentDate, prevDate) => {
69
+ const currentTime = getTimeFromDateByTimeFormat(currentDate, key);
70
+ const prevTime = getTimeFromDateByTimeFormat(prevDate, key);
71
+ return currentTime !== prevTime;
72
+ };
73
+ /**
74
+ * Checks if the given dates are are bigger or equal for a given {@link TimeFormat}
75
+ * @example
76
+ * const date1 = new Date('Fri Feb 10 2023 14:50:10 GMT+0500');
77
+ * const date2 = new Date('Fri Feb 10 2023 14:50:10 GMT+0500');
78
+ * const timeFormat: TimeFormat = 'day';
79
+ * // `true` because it takes days from `Feb 10` and `Feb 10`, and 10 === 10
80
+ * const areTheSame = datesAreTheSame(timeFormat)(date1, date2); // true
81
+ */
82
+ const datesBiggerOrEqual = (key) => (currentDate, prevDate) => {
83
+ const currentTime = getTimeFromDateByTimeFormat(currentDate, key);
84
+ const prevTime = getTimeFromDateByTimeFormat(prevDate, key);
85
+ return currentTime >= prevTime;
86
+ };
87
+ //#region TimeFormat matchers
88
+ const weekdayCheckDict = {
89
+ 1: isMonday,
90
+ 2: isTuesday,
91
+ 3: isWednesday,
92
+ 4: isThursday,
93
+ 5: isFriday,
94
+ 6: isSaturday,
95
+ 7: isSunday,
96
+ };
97
+ /**
98
+ * Checks if the given {@link Date} matches with `weekMatchValue` and `weekdayMatchValue`
99
+ * @example
100
+ * const date = new Date('Fri Feb 10 2023 14:50:10 GMT+0500');
101
+ * // '$' means last week of the month
102
+ * const weekMatchValue = '$';
103
+ * // 5 means Friday
104
+ * const weekdayMatchValue = 5;
105
+ * // to sum up '$' and 5 means `last Friday in month`
106
+ *
107
+ * // false, because `Feb 10` is 2nd Friday in Feb 2023
108
+ * const match = weekWeekdayMatch(date, weekMatchValue, weekdayMatchValue); // false
109
+ *
110
+ * @example
111
+ * const date = new Date('Tue Feb 7 2023 14:50:10 GMT+0500');
112
+ * // 1 means first week of the month
113
+ * const weekMatchValue = 1;
114
+ * // 2 means Tuesday
115
+ * const weekdayMatchValue = 2;
116
+ * // to sum up 1 and 2 means `first Tuesday in month`
117
+ *
118
+ * // true, but there's a tricky part:
119
+ * // Feb 2023 doesn't have a Tuesday on the first week, so for such cases
120
+ * // match function will take the next week, and search Tuesday on it.
121
+ * // Therefore weekMatchValue becomes 2, and 2nd weeks' Tuesday in Feb 2023 is Feb 7
122
+ * const match = weekWeekdayMatch(date, weekMatchValue, weekdayMatchValue); // true
123
+ */
124
+ const weekWeekdayMatch = (date, weekMatchValue, weekdayMatchValue) => {
125
+ var _a;
126
+ const fullMonthInterval = eachDayOfInterval({
127
+ start: startOfMonth(date),
128
+ end: endOfMonth(date),
129
+ });
130
+ const weekdayCheckFn = (_a = weekdayCheckDict[weekdayMatchValue]) !== null && _a !== void 0 ? _a : (() => false);
131
+ if (weekMatchValue === '$') {
132
+ for (const dateOfInterval of fullMonthInterval.reverse()) {
133
+ if (weekdayCheckFn(dateOfInterval)) {
134
+ return isSameDay(date, dateOfInterval);
135
+ }
136
+ }
137
+ }
138
+ else {
139
+ let week = 1;
140
+ for (const dateOfInterval of fullMonthInterval) {
141
+ if (weekdayCheckFn(dateOfInterval)) {
142
+ if (week === weekMatchValue) {
143
+ return isSameDay(date, dateOfInterval);
144
+ }
145
+ else {
146
+ week++;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return false;
152
+ };
153
+ /**
154
+ * Checks if the given `value` and `matchValue` match exactly
155
+ * @example
156
+ * const match = exactMatch(10, 10); // true
157
+ * const match = exactMatch(10, 5); // false
158
+ **/
159
+ const exactMatch = (value, matchValue) => {
160
+ return matchValue === 1 ? value === 1 : value / matchValue === 1;
161
+ };
162
+ /**
163
+ * Checks if the given `value` is divisible by `matchValue`
164
+ * const match = looseMatch(10, 5); // true
165
+ * const match = looseMatch(11, 5); // false
166
+ */
167
+ const looseMatch = (value, matchValue) => {
168
+ return matchValue === 1 ? true : value % matchValue === 0;
169
+ };
170
+ //#endregion TimeFormat matchers
171
+ //#region TimeFormat matchers factories
172
+ const lessThanSecondMatcherFactory = (timeFormat) => (currentDate, prevDate) => datesBiggerOrEqual(timeFormat.key)(currentDate, prevDate);
173
+ const monthMatcherFactory = (timeFormat) => (currentDate, prevDate) => {
174
+ const datesNotMatch = datesNOTtheSame(timeFormat.key)(currentDate, prevDate);
175
+ const valueMatch = timeFormat.exact
176
+ ? exactMatch(getTimeFromDateByTimeFormat(currentDate, timeFormat.key) + 1, timeFormat.value)
177
+ : looseMatch(getTimeFromDateByTimeFormat(currentDate, timeFormat.key) + 1, timeFormat.value);
178
+ return datesNotMatch && valueMatch;
179
+ };
180
+ const commonMatcherFactory = (timeFormat) => (currentDate, prevDate) => {
181
+ const datesNotMatch = datesNOTtheSame(timeFormat.key)(currentDate, prevDate);
182
+ const valueMatch = timeFormat.exact
183
+ ? exactMatch(getTimeFromDateByTimeFormat(currentDate, timeFormat.key), timeFormat.value)
184
+ : looseMatch(getTimeFromDateByTimeFormat(currentDate, timeFormat.key), timeFormat.value);
185
+ return datesNotMatch && valueMatch;
186
+ };
187
+ const weekWeekdayMatcherFactory = (timeFormat) => (currentDate, prevDate) => {
188
+ const datesNotMatch = datesNOTtheSame(timeFormat.key)(currentDate, prevDate);
189
+ const valueMatch = weekWeekdayMatch(currentDate, timeFormat.week, timeFormat.weekday);
190
+ return datesNotMatch && valueMatch;
191
+ };
192
+ //#endregion TimeFormat matchers factories
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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
  */
@@ -1,6 +1,81 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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{timeFormatConfirugableGuard as m,timeFormatNoNConfirugableGuard as p,weekWeekdayGuard as u}from"./time-formats.model";const c=r=>{const e={"!":!1,$:!1};return r.includes("!")&&(e["!"]=!0),r.includes("$")&&(e.$=!0),e},o=r=>parseInt(r,10);export const parseTimeFormatsFromKey=r=>{const[e,...n]=r.split("_");if(m(e)){const[t]=n,s=c(t),a=o(t);return{key:e,value:a,exact:s["!"]}}else if(u(e)){const[t,s]=n,a=c(t),l=o(t),i=o(s);return{key:e,week:a.$?"$":l,weekday:i}}else return p(e)?{key:e}:(console.warn(`${r} is not fit, check the documentation to see available formats https://webdev.prosp.devexperts.com:8095/docs/chart/x-axis`),null)};
6
+ import { timeFormatConfirugableGuard, timeFormatNoNConfirugableGuard, weekWeekdayGuard, } from './time-formats.model';
7
+ /**
8
+ * Parses a parameter string and returns a Map containg
9
+ * `specialSymbol: boolean` pairs, which tells if the special symbol
10
+ * is presented in the parameter string
11
+ *
12
+ * @example
13
+ * const parameter = `12!`;
14
+ * const specialSymbolsMap = parseSpecialSymbolsFromParameter(parameter); // { '!': true, '$': false }
15
+ *
16
+ */
17
+ const parseSpecialSymbolsFromParameter = (parameter) => {
18
+ const specialSymbolsMap = {
19
+ '!': false,
20
+ $: false,
21
+ };
22
+ if (parameter.includes('!')) {
23
+ specialSymbolsMap['!'] = true;
24
+ }
25
+ if (parameter.includes('$')) {
26
+ specialSymbolsMap['$'] = true;
27
+ }
28
+ return specialSymbolsMap;
29
+ };
30
+ const parseValueFromParameter = (parameter) => {
31
+ return parseInt(parameter, 10);
32
+ };
33
+ /**
34
+ * Parses the {@link TimeFormatWithDuration}
35
+ * and returns {@link ParsedTimeFormat} for a successfil parsing and `null`
36
+ * if the {@link TimeFormatWithDuration} couldn't be parsed.
37
+ * @example
38
+ * const timeFormat = 'day_14!';
39
+ * const parsedTimeFormat = parseTimeFormatsFromKey(timeFormat); // { key: 'day', value: 14, exact: true }
40
+ *
41
+ * @example
42
+ * const timeFormat = 'week-weekday_3_5';
43
+ * const parsedTimeFormat = parseTimeFormatsFromKey(timeFormat); // { key: 'week-weekday', week: 3, weekday: 5 }
44
+ *
45
+ * @example
46
+ * const timeFormat = 'bla-bla_1234';
47
+ * const parsedTimeFormat = parseTimeFormatsFromKey(timeFormat); // null
48
+ */
49
+ export const parseTimeFormatsFromKey = (format) => {
50
+ const [keyType, ...parameters] = format.split('_');
51
+ if (timeFormatConfirugableGuard(keyType)) {
52
+ const [parameter] = parameters;
53
+ const specialSymbols = parseSpecialSymbolsFromParameter(parameter);
54
+ const value = parseValueFromParameter(parameter);
55
+ return {
56
+ key: keyType,
57
+ value,
58
+ exact: specialSymbols['!'],
59
+ };
60
+ }
61
+ else if (weekWeekdayGuard(keyType)) {
62
+ const [parameter1, parameter2] = parameters;
63
+ const specialSymbols = parseSpecialSymbolsFromParameter(parameter1);
64
+ const week = parseValueFromParameter(parameter1);
65
+ const weekday = parseValueFromParameter(parameter2);
66
+ return {
67
+ key: keyType,
68
+ week: specialSymbols['$'] ? '$' : week,
69
+ weekday,
70
+ };
71
+ }
72
+ else if (timeFormatNoNConfirugableGuard(keyType)) {
73
+ return {
74
+ key: keyType,
75
+ };
76
+ }
77
+ else {
78
+ console.warn(`${format} is not fit, check the documentation to see available formats https://webdev.prosp.devexperts.com:8095/docs/chart/x-axis`);
79
+ return null;
80
+ }
81
+ };