Merge branch 'feat/236-aurora-1843-svod2-server-paging-web' into feat/236-aurora-1843-svod2-server-paging-perf

This commit is contained in:
Andrey Epifancev 2026-10-29 13:21:51 +04:00
commit 60b963c573
3 changed files with 32 additions and 2 deletions

View File

@ -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,

View File

@ -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);
});

View File

@ -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;