Skip to content

Commit a08a085

Browse files
Tucchhaapomahtri
andauthored
CardView: Normalize pageIndex on pageCount changed (DevExpress#29883)
Co-authored-by: Roman Semenov <[email protected]>
1 parent ce40b81 commit a08a085

File tree

5 files changed

+148
-507
lines changed

5 files changed

+148
-507
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { describe, expect, it } from '@jest/globals';
2+
3+
import { getContext } from '../di.test_utils';
4+
import type { Options } from '../options';
5+
import { OptionsControllerMock } from '../options_controller/options_controller.mock';
6+
import { DataController } from './data_controller';
7+
8+
const getControllers = (options?: Options) => {
9+
const context = getContext(options ?? {});
10+
11+
const optionsController = context.get(OptionsControllerMock);
12+
13+
return {
14+
optionsController,
15+
dataController: context.get(DataController),
16+
};
17+
};
18+
19+
const generateData = (length: number) => [...new Array(length)].map((_, index) => ({ field: `test_${index}` }));
20+
21+
describe('DataController', () => {
22+
describe('pageIndex', () => {
23+
it('does not change after pageSize increased and pageIndex < pageCount', async () => {
24+
const { optionsController, dataController } = getControllers({
25+
dataSource: generateData(20),
26+
paging: {
27+
pageIndex: 1,
28+
pageSize: 5,
29+
},
30+
});
31+
await dataController.waitLoaded();
32+
33+
optionsController.option('paging.pageSize', 10);
34+
await dataController.waitLoaded();
35+
36+
expect(optionsController.oneWay('paging.pageIndex').peek()).toEqual(1);
37+
});
38+
39+
it('set to last page after pageSize increased and pageIndex >= pageCount', async () => {
40+
const { optionsController, dataController } = getControllers({
41+
dataSource: generateData(20),
42+
paging: {
43+
pageIndex: 3,
44+
pageSize: 5,
45+
},
46+
});
47+
await dataController.waitLoaded();
48+
49+
optionsController.option('paging.pageSize', 10);
50+
await dataController.waitLoaded();
51+
52+
expect(optionsController.oneWay('paging.pageIndex').peek()).toEqual(1);
53+
});
54+
55+
it('set to last and only page after pageSize increased and pageIndex >= pageCount == 1', async () => {
56+
const { optionsController, dataController } = getControllers({
57+
dataSource: generateData(20),
58+
paging: {
59+
pageIndex: 1,
60+
pageSize: 5,
61+
},
62+
});
63+
await dataController.waitLoaded();
64+
65+
optionsController.option('paging.pageSize', 20);
66+
await dataController.waitLoaded();
67+
68+
expect(optionsController.oneWay('paging.pageIndex').peek()).toEqual(0);
69+
});
70+
});
71+
});

packages/devextreme/js/__internal/grids/new/grid_core/data_controller/data_controller.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ export class DataController {
223223
const dataSource = this.dataSource.value;
224224
const pageIndex = this.pageIndex.value;
225225
const pageSize = this.pageSize.value;
226+
const isLoaded = this.isLoaded.value;
226227
const displayFilter = this.filterController.displayFilter.value;
227228
const pagingEnabled = this.pagingEnabled.value;
228229
const sortParameters = this.sortingController.sortParameters.value;
@@ -234,7 +235,13 @@ export class DataController {
234235
}
235236

236237
if (dataSource.pageSize() !== pageSize) {
238+
const newPageIndex = isLoaded
239+
? Math.max(Math.min(this.pageCount.peek() - 1, pageIndex), 0)
240+
: pageIndex;
241+
237242
dataSource.pageSize(pageSize);
243+
dataSource.pageIndex(newPageIndex);
244+
238245
someParamChanged ||= true;
239246
}
240247

packages/devextreme/js/__internal/grids/new/grid_core/data_controller/public_methods.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ describe('PublicMethods', () => {
155155
});
156156
expect(gridCore.pageIndex()).toBe(0);
157157

158-
dataController.pageIndex.value = 3;
159-
expect(gridCore.pageIndex()).toBe(3);
158+
dataController.pageIndex.value = 1;
159+
expect(gridCore.pageIndex()).toBe(1);
160160
});
161161
});
162162

0 commit comments

Comments
 (0)