DataGrid - Pager - Show correct pageIndex when virtualScrolling is enabled on pageSize change#33412
Conversation
0b6a17d to
664a129
Compare
There was a problem hiding this comment.
Pull request overview
Fixes DataGrid pager’s displayed page index when switching the page size to “all” (internally pageSize = 0) while virtual scrolling is enabled, ensuring the pager info shows a valid “Page 1 of 1 …” state.
Changes:
- Adjust pager page index calculation to handle
pageSize === 0(the “all items” mode). - Add a TestCafe e2e regression test covering the virtual-scrolling + pageSize “all” scenario.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| packages/devextreme/js/__internal/grids/grid_core/pager/m_pager.ts | Ensures pager’s 1-based pageIndex is correct when pageSize is set to 0 (“all”). |
| e2e/testcafe-devextreme/tests/dataGrid/common/pager.ts | Adds regression test verifying pager info becomes “Page 1 of 1 …” after switching to “all” with virtual scrolling. |
| export const MAX_PAGES_COUNT = 10; | ||
|
|
||
| const getPageIndex = function (dataController) { | ||
| if (dataController.pageSize() === 0) { |
There was a problem hiding this comment.
This lines may confuse later, I think it should be fixed on pageIndex level instead
like changePaging in data controller resets pageIndex to 0 in case of pageSize = 0, same should be here, also you may notice that after changing to pageSize = All grid shows 1st page (rows from 1), not keeps the prev one
f4a744f to
09c0b62
Compare
| @@ -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'); | |||
There was a problem hiding this comment.
Name of the test suggest that focusedRowChangedFiresCount should increase after refresh, but current test doesn't check it.
Initial test did it, though: link
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts:57
- When setting
pageIndex/pageSize,changePagingnow returns an already-resolved Deferred instead of returning thedataSource.load()/reload()Deferred. This breaks the existing contract where callers can chain.done(items => ...)and receive the loaded items after paging completes (see existing tests liketesting/tests/DevExpress.ui.widgets.dataGrid/dataController.tests.jsthat assert the loaded items in the.donecallback). Please restore returning the actual load/reload promise (and its resolved items) while still fixing the pageIndex reset behavior for pageSize changes.
return Deferred().resolve().promise();
}
return dataSource[optionName]();
}
| 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(); | ||
| } | ||
| } | ||
| }, |
15682ba to
07a49c2
Compare
| change.needUpdateDimensions = change.needUpdateDimensions || that._needUpdateDimensions; | ||
| if (this._repaintChangesOnly !== undefined) { | ||
| change.repaintChangesOnly ??= this._repaintChangesOnly; | ||
| change.needUpdateDimensions ??= this._needUpdateDimensions; |
There was a problem hiding this comment.
This is not the same as previous version, now we override undefined only, before we also update value for false
| change.needUpdateDimensions = true; | ||
| } | ||
| change.repaintChangesOnly = operationTypes && !operationTypes.grouping && !operationTypes.filtering && this.option('repaintChangesOnly'); | ||
| change.needUpdateDimensions = operationTypes && (operationTypes.reload || operationTypes.paging || operationTypes.groupExpanding); |
There was a problem hiding this comment.
Let's keep prev version, it was easier for reading, also we changes logic a bit: now it unconditionally assigns true/false/undefined whereas before it left a pre-existing value alone when the condition was false.
| that._skipProcessingPagingChange = true; | ||
|
|
||
| if (optionName === 'pageSize') { | ||
| that.option('paging.pageIndex', 0); |
There was a problem hiding this comment.
Is there any reason to update paging.pageIndex not in the same moment as dataSource.pageIndex? If not, let's combine them in single condition for readability
There was a problem hiding this comment.
combined, but had to update one qunit test:
Because it checked that pageIndex should be 0, but since we decided to keep the pageIndex between finite pageSize changes, the test is not actual anymore
|
|
||
| that._skipProcessingPagingChange = true; | ||
|
|
||
| if (optionName === 'pageSize') { |
There was a problem hiding this comment.
Please, add here condition: && value === 0 to reset page index only for 'All' case
This reverts commit 07a49c2.
This reverts commit b676939.
No description provided.