куча доработок
This commit is contained in:
@@ -62,6 +62,54 @@ export interface IRoute {
|
||||
|
||||
const ROUTE_CHANGE_EVENT = 'rp-route-change';
|
||||
|
||||
// Подвкладка и фильтр «Моих заявок» переживают перезагрузку страницы и новый
|
||||
// визит (localStorage), но НЕ более того — как и текст поиска в
|
||||
// usePersistedQuery.ts, это просто «продолжить с того же места», а не
|
||||
// синхронизация между вкладками/устройствами.
|
||||
//
|
||||
// Читаются здесь же, в parseRoute, а не отдельным хуком в компоненте: URL уже
|
||||
// является единственным источником правды для ownTab/ownStatus (см.
|
||||
// buildQuery — он не пишет значения по умолчанию в адрес), поэтому именно тут,
|
||||
// где URL молчит, естественно спросить «а что было в прошлый раз».
|
||||
// Пишутся ТОЛЬКО через persistOwnSelection — то есть только там, где
|
||||
// пользователь СОЗНАТЕЛЬНО меняет вкладку/фильтр (см. gotoOwnTab/setOwnStatus
|
||||
// в RequestPortal.tsx), а не при каждой навигации: иначе, например, просто
|
||||
// открыв и закрыв заявку, можно было бы затереть запомненное значение
|
||||
// значением по умолчанию.
|
||||
const OWN_TAB_STORAGE_KEY = 'rp-own-tab';
|
||||
const OWN_STATUS_STORAGE_KEY = 'rp-own-status';
|
||||
|
||||
function readStoredOwnTab(): OwnTab {
|
||||
try {
|
||||
const raw = window.localStorage.getItem(OWN_TAB_STORAGE_KEY);
|
||||
return raw === 'approved' || raw === 'rejected' || raw === 'executed' ? raw : 'created';
|
||||
} catch {
|
||||
return 'created';
|
||||
}
|
||||
}
|
||||
|
||||
function readStoredOwnStatus(): string | undefined {
|
||||
try {
|
||||
return window.localStorage.getItem(OWN_STATUS_STORAGE_KEY) || undefined;
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/** Запомнить подвкладку/фильтр «Моих заявок» — вызывать только при явном выборе пользователя. */
|
||||
export function persistOwnSelection(ownTab: OwnTab, ownStatus: string | undefined): void {
|
||||
try {
|
||||
window.localStorage.setItem(OWN_TAB_STORAGE_KEY, ownTab);
|
||||
if (ownStatus) {
|
||||
window.localStorage.setItem(OWN_STATUS_STORAGE_KEY, ownStatus);
|
||||
} else {
|
||||
window.localStorage.removeItem(OWN_STATUS_STORAGE_KEY);
|
||||
}
|
||||
} catch {
|
||||
// localStorage недоступен (приватный режим и т.п.) — просто не сохраняем.
|
||||
}
|
||||
}
|
||||
|
||||
function parseNav(raw: string | undefined): NavSection {
|
||||
if (
|
||||
raw === 'approvals' ||
|
||||
@@ -76,8 +124,8 @@ function parseNav(raw: string | undefined): NavSection {
|
||||
}
|
||||
|
||||
function parseOwnTab(raw: string | undefined): OwnTab {
|
||||
if (raw === 'approved' || raw === 'rejected' || raw === 'executed') return raw;
|
||||
return 'created';
|
||||
if (raw === 'approved' || raw === 'rejected' || raw === 'executed' || raw === 'created') return raw;
|
||||
return readStoredOwnTab();
|
||||
}
|
||||
|
||||
/** Разобрать строку запроса (по умолчанию — из адреса страницы) в маршрут. */
|
||||
@@ -96,7 +144,7 @@ export function parseRoute(search: string = window.location.search): IRoute {
|
||||
// Фильтр по статусу живёт только на вкладке «Инициированные»: у вкладок с
|
||||
// решениями отбор задаёт сама вкладка.
|
||||
const ownTab = nav === 'own' ? parseOwnTab(params.get('rptab') ?? undefined) : undefined;
|
||||
const ownStatus = ownTab === 'created' ? params.get('rpstatus') ?? undefined : undefined;
|
||||
const ownStatus = ownTab === 'created' ? params.get('rpstatus') ?? readStoredOwnStatus() : undefined;
|
||||
|
||||
// Открытая заявка (панель поверх раздела) — при полном наборе параметров.
|
||||
// Раздел под панелью сохраняется целиком, вместе с подвкладкой и фильтром:
|
||||
|
||||
Reference in New Issue
Block a user