@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,146 @@
|
|
|
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{calculateTextWidth
|
|
6
|
+
import { calculateTextWidth } from '../../../utils/canvas/canvas-font-measure-tool.utils';
|
|
7
|
+
import { XAxisTimeLabelsDrawer } from '../x-axis-time-labels.drawer';
|
|
8
|
+
const timeFormatToWeightMap = {
|
|
9
|
+
lessThanSecond: 0,
|
|
10
|
+
second: 100,
|
|
11
|
+
minute: 200,
|
|
12
|
+
hour: 300,
|
|
13
|
+
day: 400,
|
|
14
|
+
'week-weekday': 500,
|
|
15
|
+
month: 600,
|
|
16
|
+
year: 10000,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Generates `weight` based on the {@link ParsedTimeFormat}
|
|
20
|
+
* @example
|
|
21
|
+
* const timeFormat: ParsedTimeFormat = {
|
|
22
|
+
* key: 'day',
|
|
23
|
+
* value: 15,
|
|
24
|
+
* exact: false
|
|
25
|
+
* }
|
|
26
|
+
* const weight = getWeightFromTimeFormat(timeFormat); // 415
|
|
27
|
+
*/
|
|
28
|
+
export const getWeightFromTimeFormat = (format) => {
|
|
29
|
+
switch (format.key) {
|
|
30
|
+
case 'second':
|
|
31
|
+
case 'minute':
|
|
32
|
+
case 'hour':
|
|
33
|
+
case 'day':
|
|
34
|
+
case 'month':
|
|
35
|
+
case 'year':
|
|
36
|
+
return timeFormatToWeightMap[format.key] + format.value;
|
|
37
|
+
case 'lessThanSecond':
|
|
38
|
+
return timeFormatToWeightMap[format.key];
|
|
39
|
+
case 'week-weekday':
|
|
40
|
+
return timeFormatToWeightMap[format.key] + (format.week === '$' ? 9 : format.week) + format.weekday * 10;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Group {@link XAxisLabelWeighted} by `weight` in a `Record<number, XAxisLabelWeighted[]>`
|
|
45
|
+
* @example
|
|
46
|
+
* const groupedLabels = {
|
|
47
|
+
* 601: Array(359),
|
|
48
|
+
* 415: Array(1685),
|
|
49
|
+
* ...
|
|
50
|
+
* }
|
|
51
|
+
*/
|
|
52
|
+
export const groupLabelsByWeight = (weightedLabels) => {
|
|
53
|
+
const labelsGroupedByWeight = {};
|
|
54
|
+
weightedLabels.forEach(weightedLabel => {
|
|
55
|
+
const labelsByWeight = labelsGroupedByWeight[weightedLabel.weight];
|
|
56
|
+
if (labelsByWeight === undefined) {
|
|
57
|
+
labelsGroupedByWeight[weightedLabel.weight] = [weightedLabel];
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
labelsByWeight.push(weightedLabel);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return labelsGroupedByWeight;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* FilterMap grouped {@link XAxisLabelWeighted} labels by `coverUpLevel` value
|
|
67
|
+
*
|
|
68
|
+
* @see
|
|
69
|
+
* `coverUpLevel` - is a ratio, which tells us how much more space the widest label
|
|
70
|
+
* will take relative to the candle width
|
|
71
|
+
* @example
|
|
72
|
+
* const maxLabelWidthPx = 10;
|
|
73
|
+
* const meanCandleWidthPx = 5;
|
|
74
|
+
* const coverUpLevel = Math.round(10 / 5); // 2
|
|
75
|
+
*
|
|
76
|
+
* // `coverUpLebel = 2` means that label for a candle take `2x` more width
|
|
77
|
+
* // than the candle on the screen for that label.
|
|
78
|
+
* // That kind of fact give us a hint, that we can't draw labels for `i - 1` and `i + 1` candles,
|
|
79
|
+
* // because it wouldn't be enough space (`i` candle label will take all the place).
|
|
80
|
+
* // But we can draw labels for `i - 2` and `i + 2` candles.
|
|
81
|
+
* @see
|
|
82
|
+
* That algorightm do exactly that - it filters out labels (taking in mind its weight, weight is a priority) that couldn't be drawn
|
|
83
|
+
* because there's not enough space for them.
|
|
84
|
+
*/
|
|
85
|
+
export const filterMapGroupedLabelsByCoverUpLevel = (labelsGroupedByWeight, coverUpLevel) => {
|
|
86
|
+
const weights = Object.keys(labelsGroupedByWeight)
|
|
87
|
+
.map(item => parseInt(item, 10))
|
|
88
|
+
.sort((a, b) => b - a);
|
|
89
|
+
let labels = [];
|
|
90
|
+
// TODO: ADD COMMENTS, WE NEED COMMENTS
|
|
91
|
+
for (const weight of weights) {
|
|
92
|
+
const currentWeightLabels = labelsGroupedByWeight[weight];
|
|
93
|
+
if (!currentWeightLabels) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const previousWeightLabels = [...labels];
|
|
97
|
+
labels = [];
|
|
98
|
+
const previousWeightLabelsLength = previousWeightLabels.length;
|
|
99
|
+
const currentWeightLength = currentWeightLabels.length;
|
|
100
|
+
let previousWeightLabelsPointer = 0;
|
|
101
|
+
let rightIndex = Infinity;
|
|
102
|
+
let leftIndex = -Infinity;
|
|
103
|
+
for (let i = 0; i < currentWeightLength; i++) {
|
|
104
|
+
const mark = currentWeightLabels[i];
|
|
105
|
+
const currentIndex = mark.idx;
|
|
106
|
+
while (previousWeightLabelsPointer < previousWeightLabelsLength) {
|
|
107
|
+
const lastMark = previousWeightLabels[previousWeightLabelsPointer];
|
|
108
|
+
const lastIndex = lastMark.idx;
|
|
109
|
+
if (currentIndex > lastIndex) {
|
|
110
|
+
previousWeightLabelsPointer++;
|
|
111
|
+
labels.push(lastMark);
|
|
112
|
+
leftIndex = lastIndex;
|
|
113
|
+
rightIndex = Infinity;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
rightIndex = lastIndex;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (rightIndex - currentIndex >= coverUpLevel && currentIndex - leftIndex >= coverUpLevel) {
|
|
121
|
+
labels.push(mark);
|
|
122
|
+
leftIndex = currentIndex;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
while (previousWeightLabelsPointer < previousWeightLabelsLength) {
|
|
126
|
+
labels.push(previousWeightLabels[previousWeightLabelsPointer]);
|
|
127
|
+
previousWeightLabelsPointer++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return labels;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* The function compares 2 labels and checks if they overlap each other
|
|
134
|
+
* @param {CanvasRenderingContext2D} ctx - canvas context
|
|
135
|
+
* @param {FullChartConfig} config - chart config
|
|
136
|
+
* @param {NumericAxisLabel} label - first label to compare
|
|
137
|
+
* @param {NumericAxisLabel} nextLabel - second label to compare
|
|
138
|
+
* @param {ScaleModel} scaleModel - chart scale model
|
|
139
|
+
* @returns
|
|
140
|
+
*/
|
|
141
|
+
export const overlappingPredicate = (ctx, config, label, nextLabel, scale, overlapingDistance) => {
|
|
142
|
+
const font = XAxisTimeLabelsDrawer.getFontFromConfig(config);
|
|
143
|
+
const currentLabelTextWidth = calculateTextWidth(label.text, ctx, font);
|
|
144
|
+
const nextLabelTextWidth = calculateTextWidth(nextLabel.text, ctx, font);
|
|
145
|
+
const curPx = scale.toX(label.value) + currentLabelTextWidth / 2;
|
|
146
|
+
const nextPx = scale.toX(nextLabel.value) - nextLabelTextWidth / 2;
|
|
147
|
+
return nextPx - curPx < overlapingDistance;
|
|
148
|
+
};
|
|
@@ -3,4 +3,76 @@
|
|
|
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{typedEntries_UNSAFE
|
|
6
|
+
import { typedEntries_UNSAFE } from '../../../utils/object.utils';
|
|
7
|
+
import { timeFormatMatcherFactory } from './parser/time-formats-matchers.functions';
|
|
8
|
+
import { parseTimeFormatsFromKey } from './parser/time-formats-parser.functions';
|
|
9
|
+
import { validateParsedTimeFormat } from './parser/time-formats-validators.functions';
|
|
10
|
+
import { getWeightFromTimeFormat } from './x-axis-weights.functions';
|
|
11
|
+
/**
|
|
12
|
+
* Returns the weight for a given date.
|
|
13
|
+
* Under the hood compares given date and previous date, to prevent generating the same label twice.
|
|
14
|
+
* It loops through the record of `weight` and corresponding {@link TimeFormatMatcher} pair, and tests the given date, if all the
|
|
15
|
+
* conditions are true, and it match some matcher, the weight returned for the given date.
|
|
16
|
+
* @see
|
|
17
|
+
* Weights order matters!
|
|
18
|
+
* @see
|
|
19
|
+
* returns `null` if date doesn't match any condition
|
|
20
|
+
*/
|
|
21
|
+
const getWeightByDate = (currentDate, previousDate, sortedWeights, tzOffset) => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const offsetCurrentDate = tzOffset(currentDate.getTime());
|
|
24
|
+
const offsetPrevDate = tzOffset(previousDate.getTime());
|
|
25
|
+
for (const [weight, timeMatcher] of sortedWeights) {
|
|
26
|
+
if (timeMatcher(offsetCurrentDate, offsetPrevDate)) {
|
|
27
|
+
return weight;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// if date doesn't match any condition get the lowest weight
|
|
31
|
+
return (_b = (_a = sortedWeights[sortedWeights.length - 1]) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : 0;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Transforms {@link VisualCandle} to {@link WeightedPoint}
|
|
35
|
+
*/
|
|
36
|
+
export function mapCandlesToWeightedPoints(visualCandles, sortedWeights, tzOffset) {
|
|
37
|
+
const result = new Array(visualCandles.length);
|
|
38
|
+
// assume that candles` timestamp before the first visual candle is unreachable
|
|
39
|
+
let prevDate = new Date(0);
|
|
40
|
+
for (let i = 0; i < visualCandles.length; i++) {
|
|
41
|
+
const currentCandle = visualCandles[i];
|
|
42
|
+
const currentDate = new Date(currentCandle.candle.timestamp);
|
|
43
|
+
const currentWeightedPoint = {
|
|
44
|
+
weight: getWeightByDate(currentDate, prevDate, sortedWeights, tzOffset),
|
|
45
|
+
};
|
|
46
|
+
result[i] = currentWeightedPoint;
|
|
47
|
+
prevDate = currentDate;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generates two maps for a given config.
|
|
53
|
+
* 1st map is { [weight]: [format] } to control which format should be used for a given weight;
|
|
54
|
+
* 2nd map is { [weight]: [Matcher] } to test a date for a match for a given weight;
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* const config: Record<TimeFormatWithDuration, string> = {
|
|
58
|
+
* 'day_15': 'dd.MM',
|
|
59
|
+
* 'month_7!': 'MMM'
|
|
60
|
+
* }
|
|
61
|
+
* const { map1, map2 } = generateWeightsMapForConfig(config);
|
|
62
|
+
* // map1 = { 415: 'dd.MM', 607: 'MMM' };
|
|
63
|
+
* // map2 = { 415: DayMatcher, 607: MonthMatcher }
|
|
64
|
+
*/
|
|
65
|
+
export const generateWeightsMapForConfig = (config) => {
|
|
66
|
+
const weightToTimeFormatsDict = {};
|
|
67
|
+
const weightToTimeFormatMatcherDict = {};
|
|
68
|
+
typedEntries_UNSAFE(config).forEach(([item, format]) => {
|
|
69
|
+
const timeFormat = parseTimeFormatsFromKey(item);
|
|
70
|
+
const validFormat = timeFormat === null ? false : validateParsedTimeFormat(timeFormat);
|
|
71
|
+
if (timeFormat && validFormat) {
|
|
72
|
+
const weight = getWeightFromTimeFormat(timeFormat);
|
|
73
|
+
weightToTimeFormatsDict[weight] = format;
|
|
74
|
+
weightToTimeFormatMatcherDict[weight] = timeFormatMatcherFactory(timeFormat);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return { weightToTimeFormatsDict, weightToTimeFormatMatcherDict };
|
|
78
|
+
};
|
|
@@ -3,4 +3,52 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{CanvasElement
|
|
6
|
+
import { CanvasElement } from '../../canvas/canvas-bounds-container';
|
|
7
|
+
import { redrawBackgroundArea } from '../../drawers/chart-background.drawer';
|
|
8
|
+
const DEFAULT_X_LABEL_PADDING = { x: 4, y: 4 };
|
|
9
|
+
/**
|
|
10
|
+
* Draws the label on X axis.
|
|
11
|
+
* @param ctx
|
|
12
|
+
* @param canvasBoundsContainer
|
|
13
|
+
* @param config
|
|
14
|
+
* @param label
|
|
15
|
+
*/
|
|
16
|
+
export function drawXAxisLabel(backgroundCtx, ctx, canvasBoundsContainer, config, label) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
const alignType = (_a = label.alignType) !== null && _a !== void 0 ? _a : 'middle';
|
|
19
|
+
const { fontSize, fontFamily, padding } = config.components.xAxis;
|
|
20
|
+
const offsetTop = (_b = padding.top) !== null && _b !== void 0 ? _b : 0;
|
|
21
|
+
const xAxis = canvasBoundsContainer.getBounds(CanvasElement.X_AXIS);
|
|
22
|
+
ctx.save();
|
|
23
|
+
ctx.font = `bold ${fontSize}px ${fontFamily}`;
|
|
24
|
+
const labelWidth = ctx.measureText(label.text).width;
|
|
25
|
+
const boxWidth = labelWidth + DEFAULT_X_LABEL_PADDING.x * 2;
|
|
26
|
+
let boxStart = 0;
|
|
27
|
+
const x = label.x;
|
|
28
|
+
switch (alignType) {
|
|
29
|
+
case 'start':
|
|
30
|
+
boxStart = x - boxWidth;
|
|
31
|
+
break;
|
|
32
|
+
case 'end':
|
|
33
|
+
boxStart = x;
|
|
34
|
+
break;
|
|
35
|
+
case 'middle':
|
|
36
|
+
default:
|
|
37
|
+
boxStart = x - boxWidth / 2;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
// label can overlap with regular x-axis label, so we need to hide regular x-axis label
|
|
41
|
+
redrawBackgroundArea(backgroundCtx, ctx, boxStart, xAxis.y, boxWidth, xAxis.height - 1);
|
|
42
|
+
if (alignType !== 'middle') {
|
|
43
|
+
ctx.strokeStyle = label.color;
|
|
44
|
+
ctx.beginPath();
|
|
45
|
+
ctx.moveTo(x, xAxis.y);
|
|
46
|
+
ctx.lineTo(x, xAxis.y + xAxis.height);
|
|
47
|
+
ctx.stroke();
|
|
48
|
+
}
|
|
49
|
+
ctx.fillStyle = label.color;
|
|
50
|
+
const xTextPos = boxStart + DEFAULT_X_LABEL_PADDING.x;
|
|
51
|
+
const yTextPos = xAxis.y + offsetTop + fontSize; // -2 for vertical adjustment
|
|
52
|
+
ctx.fillText(label.text, xTextPos, yTextPos);
|
|
53
|
+
ctx.restore();
|
|
54
|
+
}
|
|
@@ -3,4 +3,73 @@
|
|
|
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{drawXAxisLabel
|
|
6
|
+
import { drawXAxisLabel } from './x-axis-draw.functions';
|
|
7
|
+
import { CanvasElement } from '../../canvas/canvas-bounds-container';
|
|
8
|
+
import Color from 'color';
|
|
9
|
+
import { fillRect } from '../../utils/canvas/canvas-drawing-functions.utils';
|
|
10
|
+
/**
|
|
11
|
+
* This drawer draws custom labels for X Axis, using labels from XAxisLabelModel.
|
|
12
|
+
* By default labels for drawings are drawn by this drawer.
|
|
13
|
+
*/
|
|
14
|
+
export class XAxisLabelsDrawer {
|
|
15
|
+
constructor(backgroundCanvasModel, config, canvasModel, canvasBoundsContainer, xAxisLabelsModel) {
|
|
16
|
+
this.backgroundCanvasModel = backgroundCanvasModel;
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.canvasModel = canvasModel;
|
|
19
|
+
this.canvasBoundsContainer = canvasBoundsContainer;
|
|
20
|
+
this.xAxisLabelsModel = xAxisLabelsModel;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Draws the X axis labels on the canvas.
|
|
24
|
+
* @function
|
|
25
|
+
* @name draw
|
|
26
|
+
* @memberof XAxisLabelsDrawer
|
|
27
|
+
* @returns {void}
|
|
28
|
+
*/
|
|
29
|
+
draw() {
|
|
30
|
+
const ctx = this.canvasModel.ctx;
|
|
31
|
+
this.drawHighlightedBackgroundBetweenLabels();
|
|
32
|
+
this.xAxisLabelsModel.labels.forEach(l => {
|
|
33
|
+
drawXAxisLabel(this.backgroundCanvasModel.ctx, ctx, this.canvasBoundsContainer, this.config, l);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// this is a very simple solution which matches 2 labels with same "subGroupId"
|
|
37
|
+
// in future we may want to change it, but for now it's enough
|
|
38
|
+
/**
|
|
39
|
+
* Draws a highlighted background between two labels with the same "subGroupId".
|
|
40
|
+
*
|
|
41
|
+
* @returns {void}
|
|
42
|
+
*/
|
|
43
|
+
drawHighlightedBackgroundBetweenLabels() {
|
|
44
|
+
const ctx = this.canvasModel.ctx;
|
|
45
|
+
const initial = {};
|
|
46
|
+
const groupedLabels = this.xAxisLabelsModel.labels.reduce((acc, label) => {
|
|
47
|
+
if (label.subGroupId !== undefined) {
|
|
48
|
+
let group = acc[label.subGroupId];
|
|
49
|
+
if (!group) {
|
|
50
|
+
group = [];
|
|
51
|
+
acc[label.subGroupId] = group;
|
|
52
|
+
}
|
|
53
|
+
group.push(label);
|
|
54
|
+
}
|
|
55
|
+
return acc;
|
|
56
|
+
}, initial);
|
|
57
|
+
Object.keys(groupedLabels).forEach(subGroupId => {
|
|
58
|
+
const labels = groupedLabels[subGroupId];
|
|
59
|
+
// expect 2 labels only
|
|
60
|
+
if (labels.length === 2) {
|
|
61
|
+
const xAxisBounds = this.canvasBoundsContainer.getBounds(CanvasElement.X_AXIS);
|
|
62
|
+
ctx.fillStyle = Color.rgb(labels[0].color).alpha(0.1).toString();
|
|
63
|
+
fillRect(ctx, { x: labels[0].x, y: xAxisBounds.y }, { x: labels[1].x, y: xAxisBounds.y + xAxisBounds.height });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns an array with the ID of the canvas model.
|
|
69
|
+
*
|
|
70
|
+
* @returns {Array} An array with the ID of the canvas model.
|
|
71
|
+
*/
|
|
72
|
+
getCanvasIds() {
|
|
73
|
+
return [this.canvasModel.canvasId];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -45,7 +45,7 @@ export declare class XAxisTimeLabelsGenerator implements XAxisLabelsGenerator {
|
|
|
45
45
|
private eventBus;
|
|
46
46
|
private config;
|
|
47
47
|
private chartModel;
|
|
48
|
-
private
|
|
48
|
+
private scale;
|
|
49
49
|
private timeZoneModel;
|
|
50
50
|
private canvasModel;
|
|
51
51
|
private labelsGroupedByWeight;
|
|
@@ -56,7 +56,7 @@ export declare class XAxisTimeLabelsGenerator implements XAxisLabelsGenerator {
|
|
|
56
56
|
private weightToTimeFormatMatcherArray;
|
|
57
57
|
private weightToTimeFormatsDict;
|
|
58
58
|
private extendedLabelsFilterConfig;
|
|
59
|
-
constructor(eventBus: EventBus, config: FullChartConfig, chartModel: ChartModel,
|
|
59
|
+
constructor(eventBus: EventBus, config: FullChartConfig, chartModel: ChartModel, scale: ScaleModel, timeZoneModel: TimeZoneModel, canvasModel: CanvasModel);
|
|
60
60
|
private getLabelsFromChartType;
|
|
61
61
|
/**
|
|
62
62
|
* Make a prediction(750) about how many candles we need to fake to fill all X axis by labels
|