Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/12
This commit was merged in pull request #12.
This commit is contained in:
@@ -16,6 +16,7 @@ import { IMyRequest } from './models/IMyRequest';
|
||||
import { DataTable, IDataTableColumn } from '@tnsu/ui-kit';
|
||||
import { REQUEST_STATUS, REQUEST_STATUS_CHOICES, IRequestType, StatusBadge } from '../../shared/approval';
|
||||
import { onRequestsChanged } from '../../shared/requestEvents';
|
||||
import { perfScope } from '../../shared/perfTrace';
|
||||
import { useRoutedQuery } from '../../shared/usePersistedQuery';
|
||||
import { IPage, pageKey, pageSignature, readPage, writePage } from './pageCache';
|
||||
import { Pager } from './Pager';
|
||||
@@ -352,18 +353,26 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
|
||||
const q = debouncedQuery.trim();
|
||||
|
||||
const fetchRows = async (): Promise<IPage> => {
|
||||
// onPartial — Search и REST-довесок по свежести («Мои заявки»/«Доработка»,
|
||||
// см. getOwnRequests/getOwnRequestsByStatus в myRequests.service.ts) теперь
|
||||
// идут параллельно, и заранее не угадать, какой из двух ответит первым —
|
||||
// сеть шумит то в одну, то в другую сторону. onPartial зовётся с тем, что
|
||||
// пришло раньше, чтобы не держать список пустым ради заведомо более
|
||||
// медленного источника. Остальные ветки (approvals/execution/поиск) его
|
||||
// просто не принимают — там нет пары «Search + довесок» с независимо
|
||||
// валидным промежуточным результатом.
|
||||
const fetchRows = async (onPartial?: (p: IPage) => void): Promise<IPage> => {
|
||||
// «Доработка» — тот же список, что «Инициированные», просто со статусом,
|
||||
// зашитым в раздел, а не выбранным в фильтре.
|
||||
if (view === 'rework' || (view === 'own:created' && statusFilter)) {
|
||||
const status = view === 'rework' ? REQUEST_STATUS.returned : statusFilter;
|
||||
return getOwnRequestsByStatus(context, types, status, page, debouncedQuery);
|
||||
return getOwnRequestsByStatus(context, types, status, page, debouncedQuery, onPartial);
|
||||
}
|
||||
|
||||
if (view === 'own:created') {
|
||||
return q.length > 0
|
||||
? searchOwnRequests(context, types, debouncedQuery, page)
|
||||
: getOwnRequests(context, types, page);
|
||||
: getOwnRequests(context, types, page, onPartial);
|
||||
}
|
||||
|
||||
const queue = QUEUE_BY_VIEW[view];
|
||||
@@ -386,9 +395,11 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
// Комментарий к решению дочитываем ОДНИМ местом на все ветки: «Доработка» и
|
||||
// «Отклонённые мной» приходят разными путями (по автору и по строкам
|
||||
// маршрута соответственно), а колонка у них одинаковая по смыслу. И только
|
||||
// для видимой страницы — как и автор в hydratePendingAuthors.
|
||||
const fetchPage = async (): Promise<IPage> => {
|
||||
const result = await fetchRows();
|
||||
// для видимой страницы — как и автор в hydratePendingAuthors. Промежуточный
|
||||
// показ (onPartial) комментарий ещё не несёт — он дочитывается только для
|
||||
// ИТОГОВОГО результата, полный показ его донесёт следом.
|
||||
const fetchPage = async (onPartial?: (p: IPage) => void): Promise<IPage> => {
|
||||
const result = await fetchRows(onPartial);
|
||||
const decisionStatus = decisionStatusFor(view, statusFilter);
|
||||
if (decisionStatus) {
|
||||
await hydrateDecisionComments(context, types, result.rows, decisionStatus);
|
||||
@@ -398,7 +409,23 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
|
||||
const load = async (forceRender = false): Promise<void> => {
|
||||
try {
|
||||
const fresh = await fetchPage();
|
||||
// Промежуточный показ — ТОЛЬКО когда для этой страницы прямо СЕЙЧАС
|
||||
// ничего не закешировано (первый заход, экран пуст). Проверяем на
|
||||
// каждый вызов load(), а не один раз на весь эффект: тот же load()
|
||||
// переиспользуется автообновлением по таймеру и событием
|
||||
// rp-requests-changed все 10 минут жизни вкладки, и ко второму вызову
|
||||
// кеш почти наверняка уже есть — без повторной проверки список бы на
|
||||
// мгновение "усыхал" при КАЖДОМ фоновом обновлении, а не только при
|
||||
// самой первой загрузке.
|
||||
const onPartial = readPage(cacheKey)
|
||||
? undefined
|
||||
: (partial: IPage): void => {
|
||||
if (cancelled) return;
|
||||
setRows(partial.rows);
|
||||
setTotalRows(partial.totalRows);
|
||||
};
|
||||
|
||||
const fresh = await perfScope(`таблица ${view} стр.${page}`, () => fetchPage(onPartial));
|
||||
if (cancelled) return;
|
||||
|
||||
// Перерисовываем, только если данные реально изменились — иначе при
|
||||
|
||||
Reference in New Issue
Block a user