From cfeec00011d7cd9b7c1bc9fe9ee48da509e89f67 Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Wed, 4 Feb 2026 14:16:51 -0300 Subject: [PATCH 1/7] =?UTF-8?q?PivotGrid:=20T1317109=20=E2=80=94=20fix=20m?= =?UTF-8?q?emory=20leak=20after=20PivotGridDataSource=20is=20reassigned?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data_controller/m_data_controller.ts | 67 +++++++++++++------ .../__internal/grids/pivot_grid/m_widget.ts | 5 +- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts index 2975ab9a0892..56ef4034b00d 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts @@ -142,8 +142,12 @@ class DataController { that.progressChanged = Callbacks(); that.scrollChanged = Callbacks(); - that.load(); - that._update(); + if (that._isSharedDataSource) { + that._update(); + } else { + that.load(); + that._update(); + } that.changed = Callbacks(); } @@ -1062,18 +1066,8 @@ class DataController { this._options.onFieldsPrepared?.(e); } - _createDataSource(options) { + _initEventHandlers() { const that: any = this; - const dataSourceOptions = options.dataSource; - let dataSource; - - that._isSharedDataSource = dataSourceOptions instanceof PivotGridDataSource; - - if (that._isSharedDataSource) { - dataSource = dataSourceOptions; - } else { - dataSource = new PivotGridDataSource(dataSourceOptions); - } that._expandValueChangingHandler = that._handleExpandValueChanging.bind(that); that._loadingChangedHandler = that._handleLoadingChanged.bind(that); @@ -1086,6 +1080,10 @@ class DataController { that._progressChangedHandler = function (progress) { that._handleProgressChanged(progress * 0.8); }; + } + + _subscribeToDataSource(dataSource) { + const that: any = this; dataSource.on('changed', that._changedHandler); dataSource.on('expandValueChanging', that._expandValueChangingHandler); @@ -1093,6 +1091,38 @@ class DataController { dataSource.on('progressChanged', that._progressChangedHandler); dataSource.on('fieldsPrepared', that._fieldsPreparedHandler); dataSource.on('customizeStoreLoadOptions', that._customizeStoreLoadOptionsHandler); + } + + _unsubscribeFromDataSource() { + const that: any = this; + + if (!that._dataSource || that._dataSource.isDisposed()) { + return; + } + + that._dataSource.off('changed', that._changedHandler); + that._dataSource.off('expandValueChanging', that._expandValueChangingHandler); + that._dataSource.off('loadingChanged', that._loadingChangedHandler); + that._dataSource.off('progressChanged', that._progressChangedHandler); + that._dataSource.off('fieldsPrepared', that._fieldsPreparedHandler); + that._dataSource.off('customizeStoreLoadOptions', that._customizeStoreLoadOptionsHandler); + } + + _createDataSource(options) { + const that: any = this; + const dataSourceOptions = options.dataSource; + let dataSource; + + that._isSharedDataSource = dataSourceOptions instanceof PivotGridDataSource; + + if (that._isSharedDataSource) { + dataSource = dataSourceOptions; + } else { + dataSource = new PivotGridDataSource(dataSourceOptions); + } + + that._initEventHandlers(); + that._subscribeToDataSource(dataSource); return dataSource; } @@ -1354,14 +1384,9 @@ class DataController { dispose() { const that: any = this; - if (that._isSharedDataSource) { - that._dataSource.off('changed', that._changedHandler); - that._dataSource.off('expandValueChanging', that._expandValueChangingHandler); - that._dataSource.off('loadingChanged', that._loadingChangedHandler); - that._dataSource.off('progressChanged', that._progressChangedHandler); - that._dataSource.off('fieldsPrepared', that._fieldsPreparedHandler); - that._dataSource.off('customizeStoreLoadOptions', that._customizeStoreLoadOptionsHandler); - } else { + + that._unsubscribeFromDataSource(); + if (!that._isSharedDataSource && that._dataSource) { that._dataSource.dispose(); } diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts index a8551242092a..29d79e1f6ffe 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts @@ -328,7 +328,10 @@ class PivotGrid extends Widget { _initDataController() { const that = this; - that._dataController && that._dataController.dispose(); + + if (that._dataController) { + that._dataController.dispose(); + } that._dataController = new DataControllerImport .DataController(that._getDataControllerOptions()); From b032dc2f66b81c4b3a70d84bed02d51d724bf7d7 Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Wed, 4 Feb 2026 14:32:23 -0300 Subject: [PATCH 2/7] Empty --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e8f65f4b59e9..320bf307eee0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # DevExtreme + DevExtreme is an enterprise-ready suite of powerful, engaging UI components for popular front-end frameworks: Angular, React, Vue, and jQuery. ![DevExtreme components](https://js.devexpress.com/Content/Images/Main/modern/AdaptivityDesktop.png) From 3afa18b194fe9a4700f56d748c5640d610893599 Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Wed, 4 Feb 2026 14:32:30 -0300 Subject: [PATCH 3/7] Revert "Empty" This reverts commit b032dc2f66b81c4b3a70d84bed02d51d724bf7d7. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 320bf307eee0..e8f65f4b59e9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # DevExtreme - DevExtreme is an enterprise-ready suite of powerful, engaging UI components for popular front-end frameworks: Angular, React, Vue, and jQuery. ![DevExtreme components](https://js.devexpress.com/Content/Images/Main/modern/AdaptivityDesktop.png) From ff8240e93dffee4065297dd9004e5973a04b50fd Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Wed, 4 Feb 2026 15:13:33 -0300 Subject: [PATCH 4/7] DataController: handle fields preparation when using shared data source --- .../grids/pivot_grid/data_controller/m_data_controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts index 56ef4034b00d..09c4cd9d66ac 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts @@ -143,6 +143,7 @@ class DataController { that.scrollChanged = Callbacks(); if (that._isSharedDataSource) { + that._handleFieldsPrepared(that._dataSource.fields()); that._update(); } else { that.load(); From 7d1798f2bc1412e196360313c9add5679255e0d3 Mon Sep 17 00:00:00 2001 From: Aleksey Semikozov Date: Thu, 5 Feb 2026 06:14:09 -0300 Subject: [PATCH 5/7] DataController: refactor data source update logic; improve handling in updateDataSource method --- .../data_controller/m_data_controller.ts | 28 ++++++++++++++----- .../__internal/grids/pivot_grid/m_widget.ts | 3 +- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts index 09c4cd9d66ac..6a6c23c10624 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts @@ -142,13 +142,8 @@ class DataController { that.progressChanged = Callbacks(); that.scrollChanged = Callbacks(); - if (that._isSharedDataSource) { - that._handleFieldsPrepared(that._dataSource.fields()); - that._update(); - } else { - that.load(); - that._update(); - } + that.load(); + that._update(); that.changed = Callbacks(); } @@ -1132,6 +1127,25 @@ class DataController { return this._dataSource; } + updateDataSource(options) { + const that: any = this; + + that._unsubscribeFromDataSource(); + if (!that._isSharedDataSource && that._dataSource) { + that._dataSource.dispose(); + } + + that._options = options; + that._dataSource = that._createDataSource(options); + + if (that._isSharedDataSource) { + that._handleFieldsPrepared(that._dataSource.fields()); + that._update(); + } else { + that.load(); + } + } + isLoading() { return this._dataSource.isLoading(); } diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts index 29d79e1f6ffe..1177d4bf2408 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts @@ -330,7 +330,8 @@ class PivotGrid extends Widget { const that = this; if (that._dataController) { - that._dataController.dispose(); + that._dataController.updateDataSource(that._getDataControllerOptions()); + return; } that._dataController = new DataControllerImport From d977370db54be0c62829f1eabff6905fc8c89384 Mon Sep 17 00:00:00 2001 From: Sergio Bur Date: Fri, 6 Feb 2026 13:49:52 +0100 Subject: [PATCH 6/7] fix: fix test --- .../grids/pivot_grid/data_controller/m_data_controller.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts index 6a6c23c10624..bbeda1bef892 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts @@ -1141,8 +1141,6 @@ class DataController { if (that._isSharedDataSource) { that._handleFieldsPrepared(that._dataSource.fields()); that._update(); - } else { - that.load(); } } From 8c2b5165937a69eee7d1db4c3b287909bce4cfef Mon Sep 17 00:00:00 2001 From: Sergio Bur Date: Fri, 6 Feb 2026 14:03:46 +0100 Subject: [PATCH 7/7] Revert "fix: fix test" This reverts commit d977370db54be0c62829f1eabff6905fc8c89384. --- .../grids/pivot_grid/data_controller/m_data_controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts index bbeda1bef892..6a6c23c10624 100644 --- a/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/pivot_grid/data_controller/m_data_controller.ts @@ -1141,6 +1141,8 @@ class DataController { if (that._isSharedDataSource) { that._handleFieldsPrepared(that._dataSource.fields()); that._update(); + } else { + that.load(); } }