@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,190 @@
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
+ };
@@ -3,4 +3,30 @@
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
+ }
@@ -3,4 +3,190 @@
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
@@ -3,4 +3,79 @@
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
+ };
@@ -3,4 +3,82 @@
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 validateParsedTimeFormat=e=>{switch(e.key){case"second":case"minute":return a(e.value);case"hour":return o(e.value);case"day":return s(e.value);case"month":return u(e.value);case"year":return d(e.value);case"week-weekday":const r=c(e.week),n=i(e.weekday);return r&&n;case"lessThanSecond":return!0;default:return!1}};const a=e=>e>0&&e<=60,o=e=>e>0&&e<=24,s=e=>e>0&&e<=31,i=e=>t(e)?e>=1&&e<=7:!1,c=e=>e==="$"?!0:t(e)?e>=1&&e<=6:!1,u=e=>e>0&&e<=12,d=e=>e>0,t=e=>!isNaN(e)&&isFinite(e);
6
+ /**
7
+ * Validators are aimed to check if the `ParsedTimeFormat` is correct
8
+ *
9
+ * @example
10
+ * const timeFormat: ParsedTimeFormat = {
11
+ * key: 'day',
12
+ * value: 13,
13
+ * exact: true
14
+ * };
15
+ * // valid, because day should be between 1 and 31
16
+ * const valid = validateParsedTimeFormat(timeFormat); // true
17
+ *
18
+ * @example
19
+ * const timeFormat: ParsedTimeFormat = {
20
+ * key: 'minute',
21
+ * value: 255,
22
+ * exact: true
23
+ * };
24
+ * // INvalid, because minute should be between 1 and 60
25
+ * const valid = validateParsedTimeFormat(timeFormat); // false
26
+ */
27
+ export const validateParsedTimeFormat = (parsed) => {
28
+ switch (parsed.key) {
29
+ case 'second':
30
+ case 'minute':
31
+ return secondsAndMinutesValidator(parsed.value);
32
+ case 'hour':
33
+ return hoursValidator(parsed.value);
34
+ case 'day':
35
+ return dayValidatior(parsed.value);
36
+ case 'month':
37
+ return monthValidatior(parsed.value);
38
+ case 'year':
39
+ return yearValidatior(parsed.value);
40
+ case 'week-weekday':
41
+ const weekValid = weekValidator(parsed.week);
42
+ const weekdayValid = weekdayValidator(parsed.weekday);
43
+ return weekValid && weekdayValid;
44
+ case 'lessThanSecond':
45
+ return true;
46
+ default:
47
+ return false;
48
+ }
49
+ };
50
+ //#region validators
51
+ const secondsAndMinutesValidator = (value) => {
52
+ return value > 0 && value <= 60;
53
+ };
54
+ const hoursValidator = (value) => {
55
+ return value > 0 && value <= 24;
56
+ };
57
+ const dayValidatior = (value) => {
58
+ return value > 0 && value <= 31;
59
+ };
60
+ const weekdayValidator = (value) => {
61
+ if (!isValidNumber(value)) {
62
+ return false;
63
+ }
64
+ return value >= 1 && value <= 7;
65
+ };
66
+ const weekValidator = (value) => {
67
+ if (value === '$') {
68
+ return true;
69
+ }
70
+ if (!isValidNumber(value)) {
71
+ return false;
72
+ }
73
+ return value >= 1 && value <= 6;
74
+ };
75
+ const monthValidatior = (value) => {
76
+ return value > 0 && value <= 12;
77
+ };
78
+ const yearValidatior = (value) => {
79
+ return value > 0;
80
+ };
81
+ const isValidNumber = (value) => {
82
+ return !isNaN(value) && isFinite(value);
83
+ };
84
+ //#endregion validators
@@ -3,4 +3,17 @@
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
- const a="week-weekday",r=["second","minute","hour","day","month","year"],t=["lessThanSecond"];export const timeFormatConfirugableGuard=e=>r.some(o=>o===e),weekWeekdayGuard=e=>e==="week-weekday",timeFormatNoNConfirugableGuard=e=>t.some(o=>o===e);
6
+ const weekWeekday = 'week-weekday';
7
+ const timeFormatsConfirugable = ['second', 'minute', 'hour', 'day', 'month', 'year'];
8
+ const timeFormatsNoNConfirugable = ['lessThanSecond'];
9
+ //#region `ParsedTimeFormat` guards
10
+ export const timeFormatConfirugableGuard = (key) => {
11
+ return timeFormatsConfirugable.some(type => type === key);
12
+ };
13
+ export const weekWeekdayGuard = (key) => {
14
+ return key === 'week-weekday';
15
+ };
16
+ export const timeFormatNoNConfirugableGuard = (key) => {
17
+ return timeFormatsNoNConfirugable.some(type => type === key);
18
+ };
19
+ //#endregion guards
@@ -59,4 +59,4 @@ export declare const filterMapGroupedLabelsByCoverUpLevel: (labelsGroupedByWeigh
59
59
  * @param {ScaleModel} scaleModel - chart scale model
60
60
  * @returns
61
61
  */
62
- export declare const overlappingPredicate: (ctx: CanvasRenderingContext2D, config: FullChartConfig, label: NumericAxisLabel, nextLabel: NumericAxisLabel, scaleModel: ScaleModel, overlapingDistance: number) => boolean;
62
+ export declare const overlappingPredicate: (ctx: CanvasRenderingContext2D, config: FullChartConfig, label: NumericAxisLabel, nextLabel: NumericAxisLabel, scale: ScaleModel, overlapingDistance: number) => boolean;