From baab53a1f3fe66a4cdfa7d3d7405ca14b101aea8 Mon Sep 17 00:00:00 2001 From: Evgeniy Timokhov Date: Wed, 27 Nov 2019 14:05:40 +0300 Subject: [PATCH] Fixed setting empty data to series (#267) --- src/api/chart-api.ts | 4 +- src/api/data-layer.ts | 4 +- src/model/series.ts | 33 ++++++--------- .../series/set-empty-data-to-histogram.js | 41 +++++++++++++++++++ tests/unittests/data-layer.spec.ts | 1 + 5 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 tests/e2e/graphics/test-cases/series/set-empty-data-to-histogram.js diff --git a/src/api/chart-api.ts b/src/api/chart-api.ts index e11ffcc6ef..f011e6e9da 100644 --- a/src/api/chart-api.ts +++ b/src/api/chart-api.ts @@ -194,7 +194,7 @@ export class ChartApi implements IChartApi, DataUpdatesConsumer { const timeScaleUpdate = update.timeScaleUpdate; model.updateTimeScale(timeScaleUpdate.index, timeScaleUpdate.changes, timeScaleUpdate.marks, true); timeScaleUpdate.seriesUpdates.forEach((value: SeriesUpdatePacket, key: Series) => { - key.setData(value.update); + key.updateData(value.update); }); model.updateTimeScaleBaseIndex(0 as TimePointIndex); this._seriesMap.delete(seriesObj); @@ -207,7 +207,7 @@ export class ChartApi implements IChartApi, DataUpdatesConsumer { const timeScaleUpdate = update.timeScaleUpdate; model.updateTimeScale(timeScaleUpdate.index, timeScaleUpdate.changes, timeScaleUpdate.marks, true); timeScaleUpdate.seriesUpdates.forEach((value: SeriesUpdatePacket, key: Series) => { - key.setData(value.update); + key.updateData(value.update); }); model.updateTimeScaleBaseIndex(0 as TimePointIndex); } diff --git a/src/api/data-layer.ts b/src/api/data-layer.ts index 0ba4db6da5..f3baac3434 100644 --- a/src/api/data-layer.ts +++ b/src/api/data-layer.ts @@ -258,8 +258,8 @@ export class DataLayer { } public setSeriesData(series: Series, data: SeriesDataItemTypeMap[TSeriesType][]): UpdatePacket { - // palette will be filled inside _setNewPoints - series.palette().clear(); + series.clearData(); + convertStringsToBusinessDays(data); this._pointDataByTimePoint.forEach((value: TimePointData) => value.mapping.delete(series)); const timeConverter = selectTimeConverter(data); diff --git a/src/model/series.ts b/src/model/series.ts index 4d0d1a9c03..1ef29617e9 100644 --- a/src/model/series.ts +++ b/src/model/series.ts @@ -243,16 +243,23 @@ export class Series extends PriceDataSource i this.model().updateSource(this); } - public setData(data: ReadonlyArray>): void { + public clearData(): void { this._data.clear(); + this._palette.clear(); + + // we must either re-create pane view on clear data + // or clear all caches inside pane views + // but currently we can't separate update/append last bar and full data replacement (update vs setData) in pane views invalidation + // so let's just re-create all views + this._recreatePaneViews(); + } + + public updateData(data: ReadonlyArray>): void { this._data.bars().merge(data); this._recalculateMarkers(); - // we must either re-create pane view on full data replacement - // or clear all caches inside pane view - // but currently we can't separate update/append last bar and full data replacement (update vs setData) - // so let's re-create all views - this._recreatePaneViews(); + this._paneView.update('data'); + this._markersPaneView.update('data'); const sourcePane = this.model().paneForSource(this); this.model().recalculatePane(sourcePane); @@ -294,20 +301,6 @@ export class Series extends PriceDataSource i } } - public updateData(data: ReadonlyArray>): void { - this._data.bars().merge(data); - this._recalculateMarkers(); - - this._paneView.update('data'); - this._markersPaneView.update('data'); - - const sourcePane = this.model().paneForSource(this); - this.model().recalculatePane(sourcePane); - this.model().updateSource(this); - this.model().updateCrosshair(); - this.model().lightUpdate(); - } - public palette(): Palette { return this._palette; } diff --git a/tests/e2e/graphics/test-cases/series/set-empty-data-to-histogram.js b/tests/e2e/graphics/test-cases/series/set-empty-data-to-histogram.js new file mode 100644 index 0000000000..8935653779 --- /dev/null +++ b/tests/e2e/graphics/test-cases/series/set-empty-data-to-histogram.js @@ -0,0 +1,41 @@ +function generateData() { + var res = []; + var time = new Date(Date.UTC(2018, 0, 1, 0, 0, 0, 0)); + for (var i = 0; i < 30; ++i) { + res.push({ + time: time.getTime() / 1000, + value: i, + }); + + time.setUTCDate(time.getUTCDate() + 1); + } + return res; +} + +function generateColoredData() { + var data = generateData(); + data.forEach((item, index) => { + item.color = index % 2 === 0 ? 'rgba(0, 150, 136, 0.8)' : 'rgba(255,82,82, 0.8)'; + }); + + return data; +} + +// eslint-disable-next-line no-unused-vars +function runTestCase(container) { + var chart = LightweightCharts.createChart(container); + + var areaSeries = chart.addAreaSeries(); + var volumeSeries = chart.addHistogramSeries(); + + areaSeries.setData(generateData()); + + volumeSeries.setData(generateColoredData()); + + return new Promise((resolve) => { + setTimeout(() => { + volumeSeries.setData([]); + resolve(); + }, 1000); + }); +} diff --git a/tests/unittests/data-layer.spec.ts b/tests/unittests/data-layer.spec.ts index 375c96cbaf..cc1a1e0536 100644 --- a/tests/unittests/data-layer.spec.ts +++ b/tests/unittests/data-layer.spec.ts @@ -19,6 +19,7 @@ function createSeriesMock(seriesType?: T): Series data: () => data, palette: () => new Palette(), seriesType: () => seriesType || 'Line', + clearData: () => data.clear(), } as Series; }