@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.
- package/README.md +2 -2
- package/dist/chart/animation/canvas-animation.js +134 -1
- package/dist/chart/animation/types/animation.js +43 -1
- package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-alpha-animation.js +60 -1
- package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-transition-animation.js +86 -1
- package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
- package/dist/chart/animation/viewport-model-animation.js +20 -1
- package/dist/chart/bootstrap.d.ts +51 -48
- package/dist/chart/bootstrap.js +449 -1
- package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
- package/dist/chart/canvas/canvas-bounds-container.js +815 -1
- package/dist/chart/canvas/canvas-chart-html.js +16 -18
- package/dist/chart/canvas/chart-elements.d.ts +1 -4
- package/dist/chart/canvas/chart-elements.js +22 -1
- package/dist/chart/canvas/cursor.handler.js +122 -1
- package/dist/chart/canvas/layout-creator.js +34 -1
- package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
- package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
- package/dist/chart/chart-container.js +1 -1
- package/dist/chart/chart.config.d.ts +4 -5
- package/dist/chart/chart.config.js +645 -1
- package/dist/chart/chart.d.ts +62 -0
- package/dist/chart/chart.js +106 -0
- package/dist/chart/components/chart/basic-scale.d.ts +2 -2
- package/dist/chart/components/chart/basic-scale.js +31 -1
- package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
- package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
- package/dist/chart/components/chart/candle.functions.js +44 -1
- package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
- package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
- package/dist/chart/components/chart/chart-base.model.js +66 -1
- package/dist/chart/components/chart/chart.component.d.ts +7 -3
- package/dist/chart/components/chart/chart.component.js +408 -1
- package/dist/chart/components/chart/chart.model.d.ts +4 -11
- package/dist/chart/components/chart/chart.model.js +954 -1
- package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
- package/dist/chart/components/chart/fake-candles.js +97 -1
- package/dist/chart/components/chart/price.formatter.js +35 -1
- package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
- package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
- package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
- package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
- package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
- package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
- package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
- package/dist/chart/components/events/events.component.js +61 -1
- package/dist/chart/components/events/events.drawer.js +195 -1
- package/dist/chart/components/events/events.model.js +69 -1
- package/dist/chart/components/grid/grid.component.d.ts +2 -2
- package/dist/chart/components/grid/grid.component.js +31 -1
- package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
- package/dist/chart/components/grid/grid.drawer.js +106 -1
- package/dist/chart/components/high_low/high-low.component.js +12 -1
- package/dist/chart/components/high_low/high-low.drawer.js +126 -1
- package/dist/chart/components/highlights/highlights.component.js +46 -1
- package/dist/chart/components/highlights/highlights.drawer.js +154 -1
- package/dist/chart/components/highlights/highlights.model.js +75 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
- package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
- package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
- package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
- package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
- package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
- package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
- package/dist/chart/components/pan/chart-pan.component.js +51 -1
- package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
- package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
- package/dist/chart/components/pane/pane-hit-test.controller.d.ts +2 -2
- package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
- package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
- package/dist/chart/components/pane/pane-manager.component.js +149 -1
- package/dist/chart/components/pane/pane.component.d.ts +16 -32
- package/dist/chart/components/pane/pane.component.js +278 -1
- package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
- package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
- package/dist/chart/components/snapshot/snapshot.component.js +48 -1
- package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
- package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
- package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
- package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
- package/dist/chart/components/volumes/volumes.component.js +94 -1
- package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
- package/dist/chart/components/volumes/volumes.drawer.js +140 -1
- package/dist/chart/components/volumes/volumes.formatter.js +31 -1
- package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
- package/dist/chart/components/volumes/volumes.model.js +43 -1
- package/dist/chart/components/watermark/water-mark.component.js +103 -1
- package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
- package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
- package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
- package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
- package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
- package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
- package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
- package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
- package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
- package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis.component.js +119 -1
- package/dist/chart/components/y_axis/label-color.functions.js +53 -1
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
- package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
- package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
- package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
- package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
- package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
- package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
- package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
- package/dist/chart/components/y_axis/y-axis.component.js +220 -1
- package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
- package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
- package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
- package/dist/chart/components/y_axis/y-axis.model.js +34 -1
- package/dist/chart/drawers/chart-background.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
- package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
- package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
- package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
- package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
- package/dist/chart/drawers/composite.drawer.js +67 -1
- package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
- package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
- package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
- package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
- package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
- package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
- package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
- package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
- package/dist/chart/drawers/data-series.drawer.js +56 -1
- package/dist/chart/drawers/drawing-manager.d.ts +1 -1
- package/dist/chart/drawers/drawing-manager.js +177 -1
- package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
- package/dist/chart/events/event-bus.js +73 -1
- package/dist/chart/events/events.js +3 -1
- package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
- package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
- package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
- package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
- package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
- package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
- package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
- package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
- package/dist/chart/model/baseline.model.js +88 -1
- package/dist/chart/model/bounds.model.js +1 -1
- package/dist/chart/model/candle-hover.js +70 -1
- package/dist/chart/model/candle-series-high-low.provider.js +45 -1
- package/dist/chart/model/candle-series.model.d.ts +3 -3
- package/dist/chart/model/candle-series.model.js +245 -1
- package/dist/chart/model/candle.model.js +69 -1
- package/dist/chart/model/canvas.model.js +228 -1
- package/dist/chart/model/chart-base-element.js +129 -1
- package/dist/chart/model/compare-series-hover.js +25 -1
- package/dist/chart/model/data-series-view.d.ts +5 -5
- package/dist/chart/model/data-series-view.js +111 -1
- package/dist/chart/model/data-series.config.js +14 -1
- package/dist/chart/model/data-series.model.d.ts +4 -4
- package/dist/chart/model/data-series.model.js +281 -1
- package/dist/chart/model/date-time.formatter.js +151 -1
- package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
- package/dist/chart/model/hit-test-canvas.model.js +256 -1
- package/dist/chart/model/main-candle-series.model.d.ts +1 -1
- package/dist/chart/model/main-candle-series.model.js +29 -1
- package/dist/chart/model/scale.model.d.ts +3 -2
- package/dist/chart/model/scale.model.js +316 -1
- package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
- package/dist/chart/model/scaling/auto-scale.model.js +91 -1
- package/dist/chart/model/scaling/constrait.functions.js +61 -1
- package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
- package/dist/chart/model/scaling/move-chart.functions.js +22 -1
- package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
- package/dist/chart/model/scaling/viewport.model.js +279 -1
- package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
- package/dist/chart/model/time-zone.model.js +109 -1
- package/dist/chart/model/visual-candle.js +134 -1
- package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
- package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
- package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
- package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
- package/dist/chart/utils/array.utils.d.ts +1 -1
- package/dist/chart/utils/array.utils.js +269 -1
- package/dist/chart/utils/auto-period-detector.utils.js +39 -1
- package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
- package/dist/chart/utils/candles-generator.utils.js +161 -1
- package/dist/chart/utils/candles.utils.js +42 -1
- package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
- package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
- package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
- package/dist/chart/utils/color.utils.js +31 -1
- package/dist/chart/utils/device/browser.utils.js +10 -1
- package/dist/chart/utils/device/device-detector.utils.js +24 -1
- package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
- package/dist/chart/utils/device/touchpad.utils.js +91 -1
- package/dist/chart/utils/dom.utils.js +15 -1
- package/dist/chart/utils/function.utils.js +16 -1
- package/dist/chart/utils/linkedList.utils.d.ts +28 -0
- package/dist/chart/utils/linkedList.utils.js +138 -0
- package/dist/chart/utils/math.utils.js +115 -1
- package/dist/chart/utils/merge.utils.js +56 -1
- package/dist/chart/utils/object.utils.js +43 -1
- package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
- package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
- package/dist/chart/utils/performance/memoize.utils.js +74 -0
- package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
- package/dist/chart/utils/performance/throttle.utils.js +26 -0
- package/dist/chart/utils/price-increments.utils.d.ts +1 -0
- package/dist/chart/utils/price-increments.utils.js +127 -1
- package/dist/chart/utils/uuid.utils.js +4 -1
- package/dist/dxchart.min.js +9 -12
- package/dist/index.d.ts +3 -3
- package/dist/index.js +20 -1
- package/package.json +4 -4
- package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
- package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
- package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
- package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
- /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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,
|
|
62
|
+
export declare const overlappingPredicate: (ctx: CanvasRenderingContext2D, config: FullChartConfig, label: NumericAxisLabel, nextLabel: NumericAxisLabel, scale: ScaleModel, overlapingDistance: number) => boolean;
|