Исправить расхождение счётчика и строк в «Все заявки»
Tests / frontend-test (pull_request) Successful in 1m22s
Tests / frontend-test (pull_request) Successful in 1m22s
getAllRequestsForType брал totalRows из сырого ответа Search (RowLimit/ StartRow), а строки — из hitsToEntries, который дедуплицирует хиты по (тип, Id): TrimDuplicates:false намеренно допускает, что индекс отдаст один и тот же элемент несколько раз. Счётчик над таблицей поэтому мог быть больше числа видимых строк. Теперь берём весь срез разом (fetchAllSearchRows), дедуп и оба числа считаются по одному и тому же набору. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1381,6 +1381,14 @@ export async function searchOwnRequests(
|
|||||||
// searchOwnRequests — без фильтра по автору, и только ОДИН тип (раздел уже
|
// searchOwnRequests — без фильтра по автору, и только ОДИН тип (раздел уже
|
||||||
// показывает конкретный выбранный тип, а не все связанные разом). Только
|
// показывает конкретный выбранный тип, а не все связанные разом). Только
|
||||||
// Search, без REST-подстраховки на свежесть — как и у searchOwnRequests.
|
// Search, без REST-подстраховки на свежесть — как и у searchOwnRequests.
|
||||||
|
//
|
||||||
|
// Весь найденный срез целиком (fetchAllSearchRows), а не постранично через
|
||||||
|
// Search RowLimit/StartRow: totalRows там был бы сырым счётчиком индекса ДО
|
||||||
|
// дедупа по (тип, Id) (см. hitsToEntries — TrimDuplicates:false намеренно, и
|
||||||
|
// индекс может вернуть один и тот же элемент несколькими хитами), и на
|
||||||
|
// странице оказывалось МЕНЬШЕ строк, чем показывал счётчик над таблицей.
|
||||||
|
// Тип здесь только один — набор в разумных пределах, дедуп и сортировка идут
|
||||||
|
// по всему сразу, страница нарезается уже в памяти.
|
||||||
export async function getAllRequestsForType(
|
export async function getAllRequestsForType(
|
||||||
context: WebPartContext,
|
context: WebPartContext,
|
||||||
type: IRequestType,
|
type: IRequestType,
|
||||||
@@ -1393,23 +1401,15 @@ export async function getAllRequestsForType(
|
|||||||
if (text) clauses.push(text);
|
if (text) clauses.push(text);
|
||||||
const kql = clauses.join(' AND ');
|
const kql = clauses.join(' AND ');
|
||||||
|
|
||||||
const results = await traced('Search: все заявки типа', () =>
|
const hits = await traced('Search: все заявки типа', () =>
|
||||||
sp.search({
|
fetchAllSearchRows(sp, kql, OWN_SELECT_PROPERTIES, 'Все заявки типа', [{ Property: 'Created', Direction: 1 }])
|
||||||
Querytext: kql,
|
|
||||||
RowLimit: PAGE_SIZE,
|
|
||||||
StartRow: (page - 1) * PAGE_SIZE,
|
|
||||||
SelectProperties: OWN_SELECT_PROPERTIES,
|
|
||||||
TrimDuplicates: false,
|
|
||||||
SortList: [{ Property: 'Created', Direction: 1 }],
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const totalRows = results.TotalRows || 0;
|
|
||||||
// kind: 'other' — заявка не обязательно текущего пользователя, открывается
|
// kind: 'other' — заявка не обязательно текущего пользователя, открывается
|
||||||
// только на просмотр (см. IMyRequest.kind, openRequest в RequestPortal.tsx).
|
// только на просмотр (см. IMyRequest.kind, openRequest в RequestPortal.tsx).
|
||||||
const rows = hitsToEntries(results, [type]).map((e) => toMyRequestFromSearch(e, 'other'));
|
const rows = hitsToEntries({ PrimarySearchResults: hits }, [type]).map((e) => toMyRequestFromSearch(e, 'other'));
|
||||||
|
|
||||||
return { rows, totalRows };
|
return { rows: rows.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE), totalRows: rows.length };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Свои заявки с конкретным статусом ЗАЯВКИ (не строки маршрута) — «Доработка»
|
// Свои заявки с конкретным статусом ЗАЯВКИ (не строки маршрута) — «Доработка»
|
||||||
|
|||||||
Reference in New Issue
Block a user