From 2b52fe0e5f80d93574dba91cae79942b55aec114 Mon Sep 17 00:00:00 2001 From: ushkal <44223690+ushkal@users.noreply.github.com> Date: Thu, 6 Jun 2019 14:27:15 +0300 Subject: [PATCH] fix(react-grid): change processing of last page in lazy load mode (#2067) --- .../virtual-table-state/helpers.test.ts | 8 +++++++ .../plugins/virtual-table-state/helpers.ts | 21 +++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.test.ts b/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.test.ts index fc475f6eff..71dbdeb440 100644 --- a/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.test.ts +++ b/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.test.ts @@ -203,6 +203,14 @@ describe('VirtualTableState helpers', () => { expect(calculateRequestedRange(loadedInterval, newInterval, 399, pageSize)) .toEqual({ start: 300, end: 500 }); }); + + it('should correctly process the last page', () => { + const loadedInterval = createInterval(0, 200); + const newInterval = createInterval(1000, 1200); + + expect(calculateRequestedRange(loadedInterval, newInterval, 1180, pageSize)) + .toEqual({ start: 1000, end: 1200 }); + }); }); describe('fast scroll', () => { diff --git a/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.ts b/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.ts index 7aa97e8cf6..62164d2374 100644 --- a/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.ts +++ b/packages/dx-grid-core/src/plugins/virtual-table-state/helpers.ts @@ -45,16 +45,19 @@ export const mergeRows: MergeRowsFn = ( export const calculateRequestedRange: CalculateRequestedRangeFn = ( loadedInterval, newRange, referenceIndex, pageSize, ) => { - if (Math.abs(loadedInterval.start - newRange.start) >= 2 * pageSize) { - const useFirstHalf = referenceIndex % pageSize < pageSize / 2; - const start = useFirstHalf - ? newRange.start - : newRange.start + pageSize; - const end = Math.min(newRange.end, start + 2 * pageSize); - - return { start, end }; + const isAdjacentPage = Math.abs(loadedInterval.start - newRange.start) < 2 * pageSize; + if (isAdjacentPage) { + return intervalUtil.difference(newRange, loadedInterval); } - return intervalUtil.difference(newRange, loadedInterval); + + const useFirstHalf = referenceIndex % pageSize < pageSize / 2; + const isLastPage = intervalUtil.getLength(newRange) / pageSize < 3; + const start = useFirstHalf || isLastPage + ? newRange.start + : newRange.start + pageSize; + const end = Math.min(newRange.end, start + 2 * pageSize); + + return { start, end }; }; export const rowToPageIndex: PureComputed<[number, number]> = (