From 664a12999a09887f29237a93659d1a5c430548b2 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 27 Apr 2026 18:05:22 +0800 Subject: [PATCH 1/9] fix --- .../devextreme/js/__internal/grids/grid_core/pager/m_pager.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts b/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts index ad7118d25190..fdf9ce3e4533 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts @@ -9,6 +9,10 @@ const PAGER_CLASS = 'pager'; export const MAX_PAGES_COUNT = 10; const getPageIndex = function (dataController) { + if (dataController.pageSize() === 0) { + return dataController.pageCount(); + } + // eslint-disable-next-line radix return 1 + (parseInt(dataController.pageIndex()) || 0); }; From 29f7c0253554cb28a61676be9aca1104eb5ee922 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Tue, 28 Apr 2026 18:37:00 +0800 Subject: [PATCH 2/9] implement test --- .../tests/dataGrid/common/pager.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index 9b7973b975dd..c776369d4d95 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -238,6 +238,41 @@ test('Page index should not reset when scrolling while the grid is being refresh height: 440, })); +test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with virtual scrolling', async (t) => { + const dataGrid = new DataGrid('#container'); + const pager = dataGrid.getPager(); + + await t + .click(pager.getNavPage('5').element) + .expect(pager.getNavPage('5').selected) + .ok() + .expect(pager.getInfoText().textContent) + .eql('Page 5 of 10 (50 items)'); + + await t + .click(pager.getPageSize(1).element) + .expect(pager.getInfoText().textContent) + .eql('Page 1 of 1 (50 items)'); +}).before(async () => createWidget('dxDataGrid', { + dataSource: [...new Array(50).keys()].map((i) => ({ id: i })), + keyExpr: 'id', + showBorders: true, + scrolling: { + mode: 'virtual', + }, + paging: { + pageSize: 5, + }, + pager: { + visible: true, + allowedPageSizes: [5, 'all'], + showPageSizeSelector: true, + showInfo: true, + showNavigationButtons: true, + }, + height: 400, +})); + test('No error should occur if dataSource is not defined and pageIndex is promise chained (T1256070)', async (t) => { const dataGrid = new DataGrid('#container'); From eb5a17dadff99504cc2e8aa1b0b8f18747e2edc3 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Wed, 6 May 2026 18:24:56 +0800 Subject: [PATCH 3/9] refix --- .../tests/dataGrid/common/pager.ts | 13 +++--- .../data_controller/m_data_controller.ts | 43 ++++++++----------- .../grids/grid_core/pager/m_pager.ts | 4 -- .../virtual_scrolling/m_virtual_scrolling.ts | 11 ++--- ...eyboardNavigation.realControllers.tests.js | 2 +- 5 files changed, 31 insertions(+), 42 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index c776369d4d95..245f9d76163e 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -238,30 +238,31 @@ test('Page index should not reset when scrolling while the grid is being refresh height: 440, })); -test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with virtual scrolling', async (t) => { +test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with virtual scrolling (T1327238)', async (t) => { const dataGrid = new DataGrid('#container'); const pager = dataGrid.getPager(); - + await t .click(pager.getNavPage('5').element) .expect(pager.getNavPage('5').selected) .ok() .expect(pager.getInfoText().textContent) - .eql('Page 5 of 10 (50 items)'); + .eql('Page 5 of 10 (100 items)'); await t .click(pager.getPageSize(1).element) .expect(pager.getInfoText().textContent) - .eql('Page 1 of 1 (50 items)'); + .eql('Page 1 of 1 (100 items)'); }).before(async () => createWidget('dxDataGrid', { - dataSource: [...new Array(50).keys()].map((i) => ({ id: i })), + dataSource: [...new Array(100).keys()].map((i) => ({ id: i })), keyExpr: 'id', showBorders: true, scrolling: { mode: 'virtual', }, paging: { - pageSize: 5, + pageSize: 10, + pageIndex: 4, }, pager: { visible: true, diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index e8fe7487c881..83a6ed50739e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -213,11 +213,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { this._isPaging = false; this._currentOperationTypes = null; - this._dataChangedHandler = (e) => { - this._currentOperationTypes = this._dataSource.operationTypes(); - this._handleDataChanged(e); - this._currentOperationTypes = null; - }; + this._dataChangedHandler = this._handleDataChanged.bind(this); this._columnsChangedHandler = this._handleColumnsChanged.bind(this); this._loadingChangedHandler = this._handleLoadingChanged.bind(this); this._loadErrorHandler = this._handleLoadError.bind(this); @@ -588,6 +584,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { errors.log('W1005', that.component.NAME); that._applyFilter(); } else { + this._currentOperationTypes = dataSource.operationTypes(); that.updateItems(e, true); } }).fail(() => { @@ -1170,6 +1167,8 @@ export class DataController extends DataHelperMixin(modules.Controller) { const changeType = change.changeType || 'refresh'; change.changeType = changeType; + change.operationTypes = this._currentOperationTypes; + this._currentOperationTypes = null; if (dataSource) { const cachedProcessedItems = this._cachedProcessedItems; @@ -1231,36 +1230,32 @@ export class DataController extends DataHelperMixin(modules.Controller) { } } - public updateItems(change?, isDataChanged?) { - change = change || {}; - const that = this; - change.isFirstRender = !that.changed.fired(); + public updateItems(change: any = {}, isDataChanged?: boolean) { + change.isFirstRender = !this.changed.fired(); - if (that._repaintChangesOnly !== undefined) { - change.repaintChangesOnly = change.repaintChangesOnly ?? that._repaintChangesOnly; - change.needUpdateDimensions = change.needUpdateDimensions || that._needUpdateDimensions; + if (this._repaintChangesOnly !== undefined) { + change.repaintChangesOnly ??= this._repaintChangesOnly; + change.needUpdateDimensions ??= this._needUpdateDimensions; } else if (change.changes) { - change.repaintChangesOnly = that.option('repaintChangesOnly'); + change.repaintChangesOnly = this.option('repaintChangesOnly'); } else if (isDataChanged) { - const operationTypes = that.dataSource().operationTypes(); + const operationTypes = this.dataSource().operationTypes(); - change.repaintChangesOnly = operationTypes && !operationTypes.grouping && !operationTypes.filtering && that.option('repaintChangesOnly'); change.isDataChanged = true; - if (operationTypes && (operationTypes.reload || operationTypes.paging || operationTypes.groupExpanding)) { - change.needUpdateDimensions = true; - } + change.repaintChangesOnly = operationTypes && !operationTypes.grouping && !operationTypes.filtering && this.option('repaintChangesOnly'); + change.needUpdateDimensions = operationTypes && (operationTypes.reload || operationTypes.paging || operationTypes.groupExpanding); } - if (that._updateLockCount && !change.cancel) { - that._changes.push(change); + if (this._updateLockCount && !change.cancel) { + this._changes.push(change); return; } - that._updateItemsCore(change); + this._updateItemsCore(change); if (change.cancel) return; - that._fireChanged(change); + this._fireChanged(change); } public loadingOperationTypes() { @@ -1273,10 +1268,6 @@ export class DataController extends DataHelperMixin(modules.Controller) { * @extended: virtual_scrolling, focus */ protected _fireChanged(change) { - if (this._currentOperationTypes) { - change.operationTypes = this._currentOperationTypes; - this._currentOperationTypes = null; - } deferRender(() => { this.changed.fire(change); }); diff --git a/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts b/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts index fdf9ce3e4533..ad7118d25190 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts @@ -9,10 +9,6 @@ const PAGER_CLASS = 'pager'; export const MAX_PAGES_COUNT = 10; const getPageIndex = function (dataController) { - if (dataController.pageSize() === 0) { - return dataController.pageCount(); - } - // eslint-disable-next-line radix return 1 + (parseInt(dataController.pageIndex()) || 0); }; diff --git a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts index c2717eba9ca3..5a30993d5fa6 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts @@ -1004,18 +1004,19 @@ export const data = (Base: ModuleType) => class VirtualScrolling }; } - private _updateVisiblePageIndex(currentPageIndex?) { + private _updateVisiblePageIndex(value?: number): void { if (!this._rowsScrollController) { return; } - if (isDefined(currentPageIndex)) { - this._silentOption(VISIBLE_PAGE_INDEX, currentPageIndex); + + if (isDefined(value)) { + this._silentOption(VISIBLE_PAGE_INDEX, value); this.pageChanged.fire(); return; } - const viewPortItemIndex = this._rowsScrollController.getViewportItemIndex(); - const newPageIndex = Math.floor(viewPortItemIndex / this.pageSize()); + const viewportItemIndex = this._rowsScrollController.getViewportItemIndex(); + const newPageIndex = Math.floor(viewportItemIndex / this.pageSize()); if (this.pageIndex() !== newPageIndex) { this._silentOption(VISIBLE_PAGE_INDEX, newPageIndex); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.realControllers.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.realControllers.tests.js index 531e3b09673c..b8d81a00877f 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.realControllers.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.realControllers.tests.js @@ -671,7 +671,7 @@ QUnit.module('Real DataController and ColumnsController', { this.cellValue(0, 2, '5'); this.saveEditData(); // assert - assert.equal(focusedRowChangedFiresCount, 2, 'onFocusedRowChanged fires count'); + assert.equal(focusedRowChangedFiresCount, 1, 'onFocusedRowChanged fires count'); // act this.refresh(); From 36a2cce471d8ecaffb9304d39cb9b9acc4816692 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Fri, 8 May 2026 17:01:23 +0800 Subject: [PATCH 4/9] fix test --- e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index 245f9d76163e..c17b027e51d5 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -241,11 +241,8 @@ test('Page index should not reset when scrolling while the grid is being refresh test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with virtual scrolling (T1327238)', async (t) => { const dataGrid = new DataGrid('#container'); const pager = dataGrid.getPager(); - + await t - .click(pager.getNavPage('5').element) - .expect(pager.getNavPage('5').selected) - .ok() .expect(pager.getInfoText().textContent) .eql('Page 5 of 10 (100 items)'); @@ -266,7 +263,7 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with }, pager: { visible: true, - allowedPageSizes: [5, 'all'], + allowedPageSizes: [10, 'all'], showPageSizeSelector: true, showInfo: true, showNavigationButtons: true, From 36e42977e8dc76719982bc52d15910c9b4ae3a8a Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Sat, 9 May 2026 00:19:17 +0800 Subject: [PATCH 5/9] add another test + cover it --- .../tests/dataGrid/common/pager.ts | 46 +++++++++++++++++++ .../data_controller/m_data_controller.ts | 3 ++ 2 files changed, 49 insertions(+) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index c17b027e51d5..d48d5adb7ee0 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -271,6 +271,52 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with height: 400, })); +test('Pager info should show page 1 of 1 after changing pageSize to \'all\' and enabling virtual scrolling (T1327238)', async (t) => { + const dataGrid = new DataGrid('#container'); + const pager = dataGrid.getPager(); + + await t + .expect(pager.getInfoText().textContent) + .eql('Page 5 of 10 (100 items)'); + + await t + .click(pager.getPageSize(1).element) + .expect(pager.getInfoText().textContent) + .eql('Page 1 of 1 (100 items)'); +}).before(async () => createWidget('dxDataGrid', { + dataSource: [...new Array(100).keys()].map((i) => ({ id: i })), + keyExpr: 'id', + showBorders: true, + scrolling: { + mode: 'standard', + }, + paging: { + pageSize: 10, + pageIndex: 4, + }, + pager: { + visible: true, + allowedPageSizes: [10, 'all'], + showPageSizeSelector: true, + showInfo: true, + showNavigationButtons: true, + }, + height: 400, + onOptionChanged(e){ + if (e.fullName === "paging.pageSize") { + const setVirtual = e.value === 0; + const targetRenderingMode = setVirtual ? "virtual" : "standard"; + const currentRenderingMode = e.component.option("scrolling.mode"); + if (currentRenderingMode !== targetRenderingMode) { + e.component.beginUpdate(); + e.component.option("scrolling.mode", targetRenderingMode); + e.component.repaint(); + e.component.endUpdate(); + } + } + }, +})); + test('No error should occur if dataSource is not defined and pageIndex is promise chained (T1256070)', async (t) => { const dataGrid = new DataGrid('#container'); diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index 83a6ed50739e..d85ccd929d3f 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -43,6 +43,9 @@ const changePaging = function (that, optionName, value) { that._skipProcessingPagingChange = true; that.option(`paging.${optionName}`, value); + if (optionName === 'pageSize') { + that.option('paging.pageIndex', 0); + } that._skipProcessingPagingChange = false; const pageIndex = dataSource.pageIndex(); that._isPaging = optionName === 'pageIndex'; From bd3a6daae2dd52f629dcd7c8c01263f71e36df9f Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 11 May 2026 01:00:30 +0800 Subject: [PATCH 6/9] fix --- .../grids/grid_core/data_controller/m_data_controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index d85ccd929d3f..01a945a94879 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -43,7 +43,7 @@ const changePaging = function (that, optionName, value) { that._skipProcessingPagingChange = true; that.option(`paging.${optionName}`, value); - if (optionName === 'pageSize') { + if (optionName === 'pageSize' && value === 0) { that.option('paging.pageIndex', 0); } that._skipProcessingPagingChange = false; From c1657fa6e253dae463bce681aff13e28da78a06e Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 11 May 2026 01:02:20 +0800 Subject: [PATCH 7/9] fix lint --- .../tests/dataGrid/common/pager.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index d48d5adb7ee0..39e2bf4dc996 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -302,16 +302,16 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' and showNavigationButtons: true, }, height: 400, - onOptionChanged(e){ - if (e.fullName === "paging.pageSize") { + onOptionChanged: (e) => { + if (e.fullName === 'paging.pageSize') { const setVirtual = e.value === 0; - const targetRenderingMode = setVirtual ? "virtual" : "standard"; - const currentRenderingMode = e.component.option("scrolling.mode"); + const targetRenderingMode = setVirtual ? 'virtual' : 'standard'; + const currentRenderingMode = e.component.option('scrolling.mode'); if (currentRenderingMode !== targetRenderingMode) { - e.component.beginUpdate(); - e.component.option("scrolling.mode", targetRenderingMode); - e.component.repaint(); - e.component.endUpdate(); + e.component.beginUpdate(); + e.component.option('scrolling.mode', targetRenderingMode); + e.component.repaint(); + e.component.endUpdate(); } } }, From 65b83c760ab6f0da7db759d24d11d4674d1b1fc5 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Mon, 11 May 2026 01:12:31 +0800 Subject: [PATCH 8/9] fix lint --- e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts index 39e2bf4dc996..665d10e0c810 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts @@ -312,7 +312,7 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' and e.component.option('scrolling.mode', targetRenderingMode); e.component.repaint(); e.component.endUpdate(); - } + } } }, })); From 07a49c2c8de880aaf2fa5ad1a0772c5833020a37 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Wed, 20 May 2026 16:25:18 +0800 Subject: [PATCH 9/9] remove pageIndex restoration --- .../pager-compact (fluent.blue.light).png | Bin 27591 -> 27591 bytes .../tests/dataGrid/common/pager.ts | 17 +++++++++++++---- .../data_controller/m_data_controller.ts | 9 +++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/common/etalons/pager-compact (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/dataGrid/common/etalons/pager-compact (fluent.blue.light).png index 702a3f0640416e19f5756dc18d1de9a15c9047c9..1a382bbe87883baa35fbbebadbac7ebd53aead59 100644 GIT binary patch delta 3369 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 K8x-r^#r*@w+-r3J delta 3369 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 { .eql('Page 6 of 20 (100 items)') .expect(dataGrid.getDataCell(29, 2).element.textContent) .eql('29'); - // set page sige to 10 + + // set page size to 10 await t .click(pager.getPageSize(1).element) - .expect(dataGrid.getDataCell(10 * 6 - 1, 2).element.textContent) - .eql('59'); + .expect(dataGrid.getDataCell(9, 2).element.textContent) + .eql('9') + .expect(pager.getInfoText().textContent) + .eql('Page 1 of 10 (100 items)'); + // set page index 7 await t .click(pager.getNavPage('7').element) @@ -51,11 +55,13 @@ test('Full size pager', async (t) => { .eql('69') .expect(pager.getInfoText().textContent) .eql('Page 7 of 10 (100 items)'); + // navigate to prev page (6) await t .click(pager.getPrevNavButton().element) .expect(pager.getInfoText().textContent) .eql('Page 6 of 10 (100 items)'); + // navigate to next page (7) await t .click(pager.getNextNavButton().element) @@ -75,12 +81,13 @@ test.meta({ browserSize: [350, 600] })('Compact pager', async (t) => { const pageIndexWidget = new TextBox(pager.getPageIndexWidget() as any); const { takeScreenshot, compareResults } = createScreenshotsComparer(t); await t - .typeText(pageIndexWidget.input, '7', { replace: true }) .click(pageSizeWidget.dropDownButton) .pressKey('down') .pressKey('enter') .expect(pageSizeWidget.input.value) .eql('10') + .typeText(pageIndexWidget.input, '7', { replace: true }) + .pressKey('enter') .expect(dataGrid.getDataCell(10 * 7 - 1, 2).element.textContent) .eql('69'); @@ -267,6 +274,7 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' with showPageSizeSelector: true, showInfo: true, showNavigationButtons: true, + displayMode: 'full', }, height: 400, })); @@ -300,6 +308,7 @@ test('Pager info should show page 1 of 1 after changing pageSize to \'all\' and showPageSizeSelector: true, showInfo: true, showNavigationButtons: true, + displayMode: 'full', }, height: 400, onOptionChanged: (e) => { diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index 01a945a94879..7597a26849db 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -42,21 +42,26 @@ const changePaging = function (that, optionName, value) { dataSource[optionName](value); that._skipProcessingPagingChange = true; - that.option(`paging.${optionName}`, value); - if (optionName === 'pageSize' && value === 0) { + + if (optionName === 'pageSize') { that.option('paging.pageIndex', 0); } + that.option(`paging.${optionName}`, value); + that._skipProcessingPagingChange = false; const pageIndex = dataSource.pageIndex(); that._isPaging = optionName === 'pageIndex'; + return dataSource[optionName === 'pageIndex' ? 'load' : 'reload']() .done(() => { that._isPaging = false; that.pageChanged.fire(pageIndex); }); } + return Deferred().resolve().promise(); } + return dataSource[optionName](); }