@devexperts/dxcharts-lite 2.7.13 → 2.7.15

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.
@@ -181,7 +181,7 @@ export default class ChartBootstrap {
181
181
  this.volumesComponent = new VolumesComponent(this.dynamicObjectsCanvasModel, chartComponent, scaleModel, canvasBoundsContainer, drawingManager, config, paneManager, this.dynamicObjects);
182
182
  this.chartComponents.push(this.volumesComponent);
183
183
  // grid component
184
- const verticalGridComponent = new GridComponent(mainCanvasModel, scaleModel, config, this.yAxisComponent.state, 'GRID', drawingManager, () => this.canvasBoundsContainer.getBounds(CanvasElement.ALL_PANES), () => this.canvasBoundsContainer.getBounds(chartPaneId), () => this.xAxisComponent.xAxisLabelsGenerator.labels, () => [], undefined, () => config.components.grid.visible);
184
+ const verticalGridComponent = new GridComponent(mainCanvasModel, scaleModel, config, this.yAxisComponent.state, 'GRID', drawingManager, () => this.canvasBoundsContainer.getBounds(CanvasElement.ALL_PANES), () => this.canvasBoundsContainer.getBounds(chartPaneId), () => this.xAxisComponent.xAxisLabelsGenerator.labels, () => [], undefined, undefined, () => config.components.grid.visible);
185
185
  this.chartComponents.push(verticalGridComponent);
186
186
  this.hoverProducer = new HoverProducerComponent(this.crossEventProducer, scaleModel, config, chartModel, canvasInputListener, this.canvasBoundsContainer, this.paneManager, timeZoneModel, chartPanComponent.mainCanvasTouchHandler, formatterFactory);
187
187
  this.chartComponents.push(this.hoverProducer);
@@ -4,7 +4,7 @@
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
  import { Subject, merge } from 'rxjs';
7
- import { distinctUntilChanged } from 'rxjs/operators';
7
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
8
8
  import { CHART_UUID, CanvasElement, areBoundsChanged, } from '../../canvas/canvas-bounds-container';
9
9
  import { getDefaultConfig } from '../../chart.config';
10
10
  import { CandleSeriesModel } from '../../model/candle-series.model';
@@ -25,6 +25,7 @@ import { ChartInstrument } from './chart.component';
25
25
  import { fakeCandle } from './fake-candles';
26
26
  import { SecondaryChartColorsPool } from './secondary-chart-colors-pool';
27
27
  import { uuid } from '../../utils/uuid.utils';
28
+ import { ONE_FRAME_MS } from '../../utils/numeric-constants.utils';
28
29
  export class ChartModel extends ChartBaseElement {
29
30
  get mainCandleSeries() {
30
31
  return this.candleSeries[0];
@@ -101,6 +102,9 @@ export class ChartModel extends ChartBaseElement {
101
102
  .subscribe(bounds => {
102
103
  this.handleChartResize(bounds);
103
104
  }));
105
+ this.addRxSubscription(this.scale.changed
106
+ .pipe(debounceTime(ONE_FRAME_MS))
107
+ .subscribe(() => this.paneManager.yExtents.forEach(e => e.yAxis.updateOrderedLabels(true))));
104
108
  }
105
109
  /**
106
110
  * This method keeps the same candle width on chart canvas resize, so chart candles aren't squeezed when canvas becomes smaller
@@ -15,7 +15,7 @@ export declare class GridComponent extends ChartBaseElement {
15
15
  private drawerName;
16
16
  private drawingManager;
17
17
  private readonly drawer;
18
- constructor(canvasModel: CanvasModel, viewportModel: ViewportModel, config: FullChartConfig, yAxisState: YAxisConfig, drawerName: string, drawingManager: DrawingManager | CompositeDrawer, xBoundsProvider: BoundsProvider, yBoundsProvider: BoundsProvider, xLabelsProvider: () => NumericAxisLabel[], yLabelsProvider: () => NumericAxisLabel[], getBaseline?: () => Unit, drawPredicate?: () => boolean);
18
+ constructor(canvasModel: CanvasModel, viewportModel: ViewportModel, config: FullChartConfig, yAxisState: YAxisConfig, drawerName: string, drawingManager: DrawingManager | CompositeDrawer, xBoundsProvider: BoundsProvider, yBoundsProvider: BoundsProvider, xLabelsProvider: () => NumericAxisLabel[], yLabelsProvider: () => NumericAxisLabel[], extentIdx?: number, getBaseline?: () => Unit, drawPredicate?: () => boolean);
19
19
  /**
20
20
  * This method is used to deactivate the drawer and remove it from the drawing manager.
21
21
  * @protected
@@ -6,11 +6,11 @@
6
6
  import { ChartBaseElement } from '../../model/chart-base-element';
7
7
  import { GridDrawer } from './grid.drawer';
8
8
  export class GridComponent extends ChartBaseElement {
9
- constructor(canvasModel, viewportModel, config, yAxisState, drawerName, drawingManager, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, getBaseline, drawPredicate) {
9
+ constructor(canvasModel, viewportModel, config, yAxisState, drawerName, drawingManager, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, extentIdx, getBaseline, drawPredicate) {
10
10
  super();
11
11
  this.drawerName = drawerName;
12
12
  this.drawingManager = drawingManager;
13
- this.drawer = new GridDrawer(canvasModel, viewportModel, config, yAxisState, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, drawPredicate, getBaseline);
13
+ this.drawer = new GridDrawer(canvasModel, viewportModel, config, yAxisState, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, drawPredicate, extentIdx, getBaseline);
14
14
  }
15
15
  /**
16
16
  * This method is used to deactivate the drawer and remove it from the drawing manager.
@@ -26,8 +26,9 @@ export declare class GridDrawer implements Drawer {
26
26
  private xLabelsProvider;
27
27
  private yLabelsProvider;
28
28
  private drawPredicate;
29
+ private extentIdx?;
29
30
  private getBaseline?;
30
- constructor(canvasModel: CanvasModel, viewportModel: ViewportModel, config: FullChartConfig, yAxisState: YAxisConfig, xBoundsProvider: BoundsProvider, yBoundsProvider: BoundsProvider, xLabelsProvider: () => NumericAxisLabel[], yLabelsProvider: () => NumericAxisLabel[], drawPredicate?: () => boolean, getBaseline?: (() => Unit) | undefined);
31
+ constructor(canvasModel: CanvasModel, viewportModel: ViewportModel, config: FullChartConfig, yAxisState: YAxisConfig, xBoundsProvider: BoundsProvider, yBoundsProvider: BoundsProvider, xLabelsProvider: () => NumericAxisLabel[], yLabelsProvider: () => NumericAxisLabel[], drawPredicate?: () => boolean, extentIdx?: number | undefined, getBaseline?: (() => Unit) | undefined);
31
32
  /**
32
33
  * Draws the chart on the canvas if the drawPredicate is true.
33
34
  * @returns {void}
@@ -11,7 +11,7 @@ import { floorToDPR } from '../../utils/device/device-pixel-ratio.utils';
11
11
  * Draws grid lines on chart.
12
12
  */
13
13
  export class GridDrawer {
14
- constructor(canvasModel, viewportModel, config, yAxisState, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, drawPredicate = () => true, getBaseline) {
14
+ constructor(canvasModel, viewportModel, config, yAxisState, xBoundsProvider, yBoundsProvider, xLabelsProvider, yLabelsProvider, drawPredicate = () => true, extentIdx, getBaseline) {
15
15
  this.canvasModel = canvasModel;
16
16
  this.viewportModel = viewportModel;
17
17
  this.config = config;
@@ -21,6 +21,7 @@ export class GridDrawer {
21
21
  this.xLabelsProvider = xLabelsProvider;
22
22
  this.yLabelsProvider = yLabelsProvider;
23
23
  this.drawPredicate = drawPredicate;
24
+ this.extentIdx = extentIdx;
24
25
  this.getBaseline = getBaseline;
25
26
  }
26
27
  /**
@@ -41,7 +42,8 @@ export class GridDrawer {
41
42
  */
42
43
  drawZeroLine(ctx) {
43
44
  const yAxisLabels = this.yLabelsProvider();
44
- if (this.getBaseline &&
45
+ if (this.extentIdx === 0 &&
46
+ this.getBaseline &&
45
47
  this.yAxisState.type === 'percent' &&
46
48
  this.yAxisState.zeroPercentLine &&
47
49
  yAxisLabels.length) {
@@ -94,9 +94,9 @@ export class PaneComponent extends ChartBaseElement {
94
94
  * @param {() => Unit} yAxisBaselineGetter
95
95
  * @returns {GridComponent} - The newly created GridComponent instance.
96
96
  */
97
- createGridComponent(uuid, scale, yAxisState, yAxisLabelsGetter, yAxisBaselineGetter) {
97
+ createGridComponent(uuid, extentIdx, scale, yAxisState, yAxisLabelsGetter, yAxisBaselineGetter) {
98
98
  const chartPaneId = CanvasElement.PANE_UUID(uuid);
99
- const gridComponent = new GridComponent(this.mainCanvasModel, scale, this.config, yAxisState, `PANE_${uuid}_grid_drawer`, this.drawingManager, () => this.canvasBoundsContainer.getBounds(chartPaneId), () => this.canvasBoundsContainer.getBounds(chartPaneId), () => [], yAxisLabelsGetter, yAxisBaselineGetter, () => this.config.components.grid.visible);
99
+ const gridComponent = new GridComponent(this.mainCanvasModel, scale, this.config, yAxisState, `PANE_${uuid}_${extentIdx}_grid_drawer`, this.drawingManager, () => this.canvasBoundsContainer.getBounds(chartPaneId), () => this.canvasBoundsContainer.getBounds(chartPaneId), () => [], yAxisLabelsGetter, extentIdx, yAxisBaselineGetter, () => this.config.components.grid.visible);
100
100
  return gridComponent;
101
101
  }
102
102
  /**
@@ -132,7 +132,7 @@ export class PaneComponent extends ChartBaseElement {
132
132
  const [unsub, dragNDrop] = this.createYPanHandler(this.uuid, scaleModel);
133
133
  // creating partially resolved constructor except formatter & dataSeriesProvider - bcs it's not possible to provide formatter
134
134
  // before y-extent is created
135
- const createYAxisComponent = (formatter, dataSeriesProvider) => new YAxisComponent(this.eventBus, this.config, this.yAxisLabelsCanvasModel, scaleModel, this.canvasInputListener, this.canvasBoundsContainer, this.chartPanComponent, this.cursorHandler, formatter, dataSeriesProvider, this.uuid, extentIdx, this.hitTestCanvasModel, this.chartResizeHandler, initialYAxisState);
135
+ const createYAxisComponent = (formatter, dataSeriesProvider) => new YAxisComponent(this.eventBus, this.config, this.mainCanvasModel, this.yAxisLabelsCanvasModel, scaleModel, this.canvasInputListener, this.canvasBoundsContainer, this.chartPanComponent, this.cursorHandler, formatter, dataSeriesProvider, this.uuid, extentIdx, this.hitTestCanvasModel, this.chartResizeHandler, initialYAxisState);
136
136
  const yExtentComponent = new YExtentComponent(this.config.components.yAxis, this.uuid, extentIdx, this, this.chartBaseModel, this.canvasBoundsContainer, this.hitTestController, this.dynamicObjectsCanvasModel, scaleModel, createYAxisComponent, dragNDrop);
137
137
  yExtentComponent.addSubscription(unsub);
138
138
  yExtentComponent.addSubscription(this.addCursors(extentIdx, yExtentComponent.yAxis));
@@ -143,7 +143,7 @@ export class PaneComponent extends ChartBaseElement {
143
143
  if (useDefaultHighLow) {
144
144
  scaleModel.autoScaleModel.setHighLowProvider('default', createCandlesOffsetProvider(() => ({ top: 10, bottom: 10, left: 0, right: 0, visible: true }), createDefaultYExtentHighLowProvider(yExtentComponent)));
145
145
  }
146
- const gridComponent = this.createGridComponent(this.uuid, scaleModel, yExtentComponent.yAxis.state, () => yExtentComponent.yAxis.model.baseLabelsModel.labels, () => yExtentComponent.toY(yExtentComponent.getBaseline()));
146
+ const gridComponent = this.createGridComponent(this.uuid, yExtentComponent.idx, scaleModel, yExtentComponent.yAxis.state, () => yExtentComponent.yAxis.model.baseLabelsModel.labels, () => yExtentComponent.toY(yExtentComponent.getBaseline()));
147
147
  yExtentComponent.addChildEntity(gridComponent);
148
148
  yExtentComponent.activate();
149
149
  this.yExtentComponents.push(yExtentComponent);
@@ -55,7 +55,9 @@ export class YAxisBaseLabelsModel extends ChartBaseElement {
55
55
  * Then, it calls the updateYAxisWidth method to update the width of the y-axis.
56
56
  */
57
57
  updateLabels() {
58
- this.labels = this.labelsGenerator.generateNumericLabels();
59
- animationFrameThrottledPrior(this.animFrameId, () => this.canvasBoundsContainer.updateYAxisWidths());
58
+ animationFrameThrottledPrior(this.animFrameId, () => {
59
+ this.labels = this.labelsGenerator.generateNumericLabels();
60
+ this.canvasBoundsContainer.updateYAxisWidths();
61
+ });
60
62
  }
61
63
  }
@@ -30,6 +30,7 @@ export type LabelColorResolver = (priceMovement: PriceMovement, colors: FullChar
30
30
  export declare class YAxisComponent extends ChartBaseElement {
31
31
  private eventBus;
32
32
  private config;
33
+ private mainCanvasModel;
33
34
  private canvasModel;
34
35
  scale: ScaleModel;
35
36
  private canvasInputListeners;
@@ -47,7 +48,7 @@ export declare class YAxisComponent extends ChartBaseElement {
47
48
  axisAlignSetSubject: Subject<YAxisAlign>;
48
49
  axisAlignMovedSubject: Subject<YAxisAlign>;
49
50
  readonly state: YAxisConfig;
50
- constructor(eventBus: EventBus, config: FullChartConfig, canvasModel: CanvasModel, scale: ScaleModel, canvasInputListeners: CanvasInputListenerComponent, canvasBoundsContainer: CanvasBoundsContainer, chartPanComponent: ChartPanComponent, cursors: CursorHandler, valueFormatter: (value: number) => string, dataSeriesProvider: () => DataSeriesModel | undefined, paneUUID: string, extentIdx: number, hitTestCanvasModel: HitTestCanvasModel, chartResizeHandler: ChartResizeHandler, initialState?: YAxisConfig);
51
+ constructor(eventBus: EventBus, config: FullChartConfig, mainCanvasModel: CanvasModel, canvasModel: CanvasModel, scale: ScaleModel, canvasInputListeners: CanvasInputListenerComponent, canvasBoundsContainer: CanvasBoundsContainer, chartPanComponent: ChartPanComponent, cursors: CursorHandler, valueFormatter: (value: number) => string, dataSeriesProvider: () => DataSeriesModel | undefined, paneUUID: string, extentIdx: number, hitTestCanvasModel: HitTestCanvasModel, chartResizeHandler: ChartResizeHandler, initialState?: YAxisConfig);
51
52
  setExtentIdx(extentIdx: number): void;
52
53
  /**
53
54
  * Registers default label color resolvers for different chart types.
@@ -88,10 +89,17 @@ export declare class YAxisComponent extends ChartBaseElement {
88
89
  /**
89
90
  * An easier way to manage custom y-axis labels, than y-axis labels providers.
90
91
  * However, overlapping avoidance is not supported
92
+ * deprecated because of naming, use updateCustomYAxisLabel instead
91
93
  * @param name
92
94
  * @param label
93
95
  */
94
96
  addSimpleYAxisLabel(name: string, label: VisualYAxisLabel): void;
97
+ /**
98
+ * Update custom y-axis label
99
+ * @param name
100
+ * @param label
101
+ */
102
+ updateCustomYAxisLabel(name: string, label: VisualYAxisLabel): void;
95
103
  /**
96
104
  * @param name
97
105
  */
@@ -17,10 +17,11 @@ import { cloneUnsafe } from '../../utils/object.utils';
17
17
  * Y axis component. Contains all Y axis related logic.
18
18
  */
19
19
  export class YAxisComponent extends ChartBaseElement {
20
- constructor(eventBus, config, canvasModel, scale, canvasInputListeners, canvasBoundsContainer, chartPanComponent, cursors, valueFormatter, dataSeriesProvider, paneUUID, extentIdx, hitTestCanvasModel, chartResizeHandler, initialState) {
20
+ constructor(eventBus, config, mainCanvasModel, canvasModel, scale, canvasInputListeners, canvasBoundsContainer, chartPanComponent, cursors, valueFormatter, dataSeriesProvider, paneUUID, extentIdx, hitTestCanvasModel, chartResizeHandler, initialState) {
21
21
  super();
22
22
  this.eventBus = eventBus;
23
23
  this.config = config;
24
+ this.mainCanvasModel = mainCanvasModel;
24
25
  this.canvasModel = canvasModel;
25
26
  this.scale = scale;
26
27
  this.canvasInputListeners = canvasInputListeners;
@@ -138,6 +139,7 @@ export class YAxisComponent extends ChartBaseElement {
138
139
  /**
139
140
  * An easier way to manage custom y-axis labels, than y-axis labels providers.
140
141
  * However, overlapping avoidance is not supported
142
+ * deprecated because of naming, use updateCustomYAxisLabel instead
141
143
  * @param name
142
144
  * @param label
143
145
  */
@@ -145,6 +147,15 @@ export class YAxisComponent extends ChartBaseElement {
145
147
  this.model.fancyLabelsModel.customLabels[name] = label;
146
148
  this.canvasModel.fireDraw();
147
149
  }
150
+ /**
151
+ * Update custom y-axis label
152
+ * @param name
153
+ * @param label
154
+ */
155
+ updateCustomYAxisLabel(name, label) {
156
+ this.model.fancyLabelsModel.customLabels[name] = label;
157
+ this.canvasModel.fireDraw();
158
+ }
148
159
  /**
149
160
  * @param name
150
161
  */
@@ -187,6 +198,7 @@ export class YAxisComponent extends ChartBaseElement {
187
198
  this.scale.autoScale(true);
188
199
  this.model.fancyLabelsModel.updateLabels(true);
189
200
  this.updateCursor();
201
+ this.mainCanvasModel.fireDraw();
190
202
  }
191
203
  }
192
204
  /**