3782389229
Tests / frontend-test (pull_request) Has been cancelled
Колонка «Дата выхода» (StartDate) показывается только во «Все заявки» для типа it-workplace-setup. Значение дочитывается из списка данных по партиции строки, только для видимой страницы; учтено в сигнатуре кеша страницы. Функция вынесена в startDates.service.ts, чтобы не превысить лимит строк myRequests.service.ts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
62 lines
3.4 KiB
TypeScript
62 lines
3.4 KiB
TypeScript
import { IMyRequest } from './models/IMyRequest';
|
|
|
|
// Загруженная страница таблицы — то, что кладётся в кеш вкладки
|
|
// (см. RequestsTableView/SearchView).
|
|
export interface IPage {
|
|
rows: IMyRequest[];
|
|
totalRows: number;
|
|
}
|
|
|
|
// Хранилище на уровне МОДУЛЯ, а не внутри компонента (useRef), потому что
|
|
// компоненты таблиц размонтируются при переключении разделов: RequestPortal
|
|
// рендерит либо SubmitFeature, либо SearchView, либо RequestsTableView — уход
|
|
// на «Поиск» или «Новая заявка» уничтожает экземпляр таблицы вместе со всем его
|
|
// состоянием. С useRef кеш переживал только переключение «Мои заявки» ↔ «На
|
|
// согласовании» (там экземпляр один, меняется лишь проп kind), а после захода
|
|
// на «Поиск» терялся. Здесь он живёт до перезагрузки страницы.
|
|
//
|
|
// Ключ формирует вызывающая сторона и обязательно начинает с префикса раздела
|
|
// (см. pageKey), иначе ключи двух таблиц пересеклись бы.
|
|
const store = new Map<string, IPage>();
|
|
|
|
// Ключ кеша: раздел + всё, от чего зависит содержимое страницы.
|
|
export function pageKey(view: string, parts: Array<string | number>): string {
|
|
return [view, ...parts].join('|');
|
|
}
|
|
|
|
export function readPage(key: string): IPage | undefined {
|
|
return store.get(key);
|
|
}
|
|
|
|
export function writePage(key: string, page: IPage): void {
|
|
store.set(key, page);
|
|
}
|
|
|
|
// Слепок страницы для сравнения «изменилось ли что-нибудь». Сравниваем поля,
|
|
// которые видны в таблице: если они совпали, перерисовывать нечего — иначе при
|
|
// каждом возврате на вкладку и при каждом фоновом обновлении таблица моргала бы,
|
|
// перерисовываясь тем же самым содержимым.
|
|
// code — тоже видимое поле (колонка «Код»), и его обязательно учитывать: он
|
|
// проставляется ВТОРЫМ запросом, уже после создания элемента (см.
|
|
// saveRequestItem), поэтому первая выдача может прийти без него. Без code в
|
|
// слепке подъехавший позже код совпал бы с прежней подписью, перерисовки не
|
|
// случилось бы, и в таблице до перезагрузки страницы висело бы «#5».
|
|
export function pageSignature(page: IPage): string {
|
|
return `${page.totalRows}|${page.rows
|
|
.map((r) =>
|
|
[
|
|
r.requestTypeId,
|
|
r.id,
|
|
r.code,
|
|
r.title,
|
|
r.status,
|
|
r.created,
|
|
r.authorName,
|
|
r.decisionComment ?? '',
|
|
r.startDate ?? '',
|
|
(r.currentAssignees ?? []).map((a) => `${a.name}/${a.email}`).join(','),
|
|
].join('~')
|
|
)
|
|
.join(';')}`;
|
|
}
|