персист левой вкладки
Tests / frontend-test (pull_request) Successful in 1m8s

This commit is contained in:
gorbenko.pavel
2026-08-20 11:37:11 +05:00
parent 5f9302e3f0
commit 5a62bfea66
2 changed files with 39 additions and 2 deletions
@@ -7,6 +7,7 @@ import type { ISidebarItem } from '@tnsu/ui-kit';
import { ConfirmHost } from '../shared/ui';
import {
navigate,
persistNav,
persistOwnTab,
persistOwnStatus,
persistPage,
@@ -130,6 +131,9 @@ const RequestPortal: React.FC<IRequestPortalProps> = ({ hasTeamsContext, context
};
const goto = (nav: NavSection): void => {
// Запоминаем раздел, чтобы следующий заход на портал (без rpnav в адресе)
// открыл его же, а не всегда «Новую заявку» (см. persistNav в routing.ts).
persistNav(nav);
// Клик по УЖЕ активному пункту меню не меняет маршрут, значит эффект
// загрузки в таблице не перезапустится сам. Шлём событие обновления —
// таблица на него подписана и перечитает данные фоном, не убирая с экрана
+35 -2
View File
@@ -101,6 +101,11 @@ const ROUTE_CHANGE_EVENT = 'rp-route-change';
// вернувшись обратно, фильтр каждый раз сбрасывался на «Все статусы».
const OWN_TAB_STORAGE_KEY = 'rp-own-tab';
const OWN_STATUS_STORAGE_KEY = 'rp-own-status';
// Раздел бокового меню — тем же приёмом: запоминается только по явному клику
// (см. persistNav в goto() RequestPortal.tsx), чтобы заход на портал без
// rpnav в адресе открывал тот раздел, на котором остановились в прошлый раз,
// а не всегда «Новую заявку».
const NAV_STORAGE_KEY = 'rp-nav';
// Страница запоминается ОТДЕЛЬНО ДЛЯ КАЖДОЙ таблицы (см. viewKeyOf): один общий
// номер переносился бы между разделами, где у каждого свой объём данных, —
// уйдя со страницы 3 «Моих заявок» в «На согласовании», где страница всего
@@ -246,17 +251,45 @@ export function persistOwnStatus(ownStatus: string | undefined): void {
}
}
function readStoredNav(): NavSection {
try {
const raw = window.localStorage.getItem(NAV_STORAGE_KEY);
return raw === 'approvals' ||
raw === 'execution' ||
raw === 'rework' ||
raw === 'own' ||
raw === 'search' ||
raw === 'new'
? raw
: 'new';
} catch {
return 'new';
}
}
/** Запомнить раздел бокового меню — вызывать только при явном выборе пользователя. */
export function persistNav(nav: NavSection): void {
try {
window.localStorage.setItem(NAV_STORAGE_KEY, nav);
} catch {
// localStorage недоступен (приватный режим и т.п.) — просто не сохраняем.
}
}
function parseNav(raw: string | undefined): NavSection {
if (
raw === 'approvals' ||
raw === 'execution' ||
raw === 'rework' ||
raw === 'own' ||
raw === 'search'
raw === 'search' ||
raw === 'new'
) {
return raw;
}
return 'new';
// В адресе раздела нет (rpnav отсутствует, в т.ч. при заходе на портал по
// голой ссылке) — открываем запомненный раздел, а не всегда «Новую заявку».
return readStoredNav();
}
function parseOwnTab(raw: string | undefined): OwnTab {