diff --git a/web/src/pages/Svod2Page/svod2Paging.js b/web/src/pages/Svod2Page/svod2Paging.js index 6e76155..a7318a0 100644 --- a/web/src/pages/Svod2Page/svod2Paging.js +++ b/web/src/pages/Svod2Page/svod2Paging.js @@ -48,6 +48,14 @@ export function buildWindowRows(pages, pageCache, total) { return result; } +const NO_PAGES = Object.freeze(new Map()); + +// Страницы, которые можно показывать: только поколения, чьи данные уже пришли. После смены условий (поиск, фильтры, +// «Обновить») поколение вырастает сразу, а первый ответ нового приходит позже: до него все строки окна — заглушки. +export function getCurrentPages({ pages, dataGeneration, generation }) { + return dataGeneration === generation ? pages : NO_PAGES; +} + export function getVirtualizerPadding({ windowStart, windowEnd, total, rowHeight }) { return { paddingStart: windowStart * rowHeight, diff --git a/web/src/pages/Svod2Page/svod2Paging.test.js b/web/src/pages/Svod2Page/svod2Paging.test.js index 1e44844..bd60d39 100644 --- a/web/src/pages/Svod2Page/svod2Paging.test.js +++ b/web/src/pages/Svod2Page/svod2Paging.test.js @@ -8,6 +8,7 @@ import { buildWindowRows, createSheetPagingState, facetsToMaps, + getCurrentPages, getMissingPages, getPageCount, getSkeletonWidth, @@ -328,3 +329,18 @@ test('первая страница при смене условий: запас assert.equal(shouldFetchFirstPageFallback({ candidate: 37, total: 22419 }), false); assert.equal(shouldFetchFirstPageFallback({ candidate: 75, total: 22419 }), true); }); + +test('смена поколения условий: пока нет ответа нового поколения, старые страницы не показываются (все строки окна — заглушки)', () => { + const pages = new Map([[0, [{ data: 1 }]]]); + assert.equal(getCurrentPages({ pages, dataGeneration: 3, generation: 3 }), pages); + const stale = getCurrentPages({ pages, dataGeneration: 3, generation: 4 }); + assert.equal(stale.size, 0); + const rows = buildWindowRows([0], stale, 3); + assert.deepEqual( + rows.map((r) => isPlaceholderRow(r)), + [true, true, true], + ); +}); +test('до первой загрузки (поколение 0) страниц нет и показывать нечего', () => { + assert.equal(getCurrentPages({ pages: new Map(), dataGeneration: 0, generation: 0 }).size, 0); +}); diff --git a/web/src/pages/Svod2Page/useSvod2Pages.js b/web/src/pages/Svod2Page/useSvod2Pages.js index 2c02353..201575f 100644 --- a/web/src/pages/Svod2Page/useSvod2Pages.js +++ b/web/src/pages/Svod2Page/useSvod2Pages.js @@ -11,6 +11,7 @@ import { buildWindowRows, createSheetPagingState, facetsToMaps, + getCurrentPages, getMissingPages, getPageCount, getVirtualizerPadding, @@ -300,8 +301,13 @@ export function useSvod2Pages({ sheet, year, orgIds, queryKey, search, columnFil const visiblePage = getVisiblePage({ scrollTop: scrollPage * PAGE_SIZE * rowHeight, rowHeight, total: sheetState.total }); const windowPages = useMemo(() => getWindowPages(visiblePage, sheetState.total), [visiblePage, sheetState.total]); const windowRows = useMemo( - () => buildWindowRows(windowPages, sheetState.pages, sheetState.total), - [windowPages, sheetState.pages, sheetState.total], + () => + buildWindowRows( + windowPages, + getCurrentPages({ pages: sheetState.pages, dataGeneration: sheetState.dataGeneration, generation: sheetState.generation }), + sheetState.total, + ), + [windowPages, sheetState.pages, sheetState.dataGeneration, sheetState.generation, sheetState.total], ); const padding = useMemo(() => { if (!hasCurrentData) return NO_PADDING;