всякие статусы лишние убраны
This commit is contained in:
@@ -6,6 +6,9 @@ import {
|
||||
persistOwnTab,
|
||||
persistPage,
|
||||
routeUrl,
|
||||
storedOwnStatus,
|
||||
storedOwnTab,
|
||||
storedPageFor,
|
||||
} from './routing';
|
||||
|
||||
// buildQuery/navigate читают и пишут window.location через history API, а
|
||||
@@ -206,6 +209,34 @@ describe('страница таблицы (rppage + persistPage)', () => {
|
||||
expect(parseRoute(window.location.search).page).toBe(3);
|
||||
});
|
||||
|
||||
// Ради этого storedPageFor и заведён: при переходе по меню маршрут СТРОИТСЯ,
|
||||
// и если не подставить запомненную страницу явно, она останется только в
|
||||
// состоянии — в адресе будет первая, а на экране открытая (см. goto в
|
||||
// RequestPortal.tsx).
|
||||
it('storedPageFor отдаёт запомненную страницу нужной таблицы', () => {
|
||||
persistPage({ mode: 'submit', nav: 'approvals' }, 4);
|
||||
expect(storedPageFor('approvals')).toBe(4);
|
||||
expect(storedPageFor('execution')).toBe(1);
|
||||
});
|
||||
|
||||
it('storedPageFor различает подвкладки «Моих заявок»', () => {
|
||||
persistPage({ mode: 'submit', nav: 'own', ownTab: 'rejected' }, 6);
|
||||
expect(storedPageFor('own', 'rejected')).toBe(6);
|
||||
expect(storedPageFor('own', 'created')).toBe(1);
|
||||
});
|
||||
|
||||
it('storedPageFor без подвкладки берёт запомненную — ту, что и откроется', () => {
|
||||
persistOwnTab('executed');
|
||||
persistPage({ mode: 'submit', nav: 'own', ownTab: 'executed' }, 2);
|
||||
expect(storedPageFor('own')).toBe(2);
|
||||
});
|
||||
|
||||
it('переход по меню кладёт запомненную страницу в адрес', () => {
|
||||
persistPage({ mode: 'submit', nav: 'approvals' }, 3);
|
||||
navigate({ mode: 'submit', nav: 'approvals', page: storedPageFor('approvals') });
|
||||
expect(window.location.search).toContain('rppage=3');
|
||||
});
|
||||
|
||||
it('localStorage недоступен — страница просто первая, без падения', () => {
|
||||
const original = window.localStorage.getItem;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- имитация приватного режима, где чтение localStorage бросает
|
||||
@@ -253,6 +284,40 @@ describe('persistOwnTab/persistOwnStatus — запоминание подвкл
|
||||
expect(parseRoute('?rpnav=approvals').ownTab).toBeUndefined();
|
||||
});
|
||||
|
||||
// Как и со страницей: при переходе маршрут СТРОИТСЯ, и без явной подстановки
|
||||
// восстановленный фильтр остался бы только в состоянии — в адресе его бы не
|
||||
// было (см. goto/gotoOwnTab в RequestPortal.tsx).
|
||||
it('storedOwnStatus отдаёт фильтр только для вкладки «Инициированные»', () => {
|
||||
persistOwnStatus('Отклонено');
|
||||
expect(storedOwnStatus('created')).toBe('Отклонено');
|
||||
expect(storedOwnStatus('approved')).toBeUndefined();
|
||||
expect(storedOwnStatus('rejected')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('storedOwnTab отдаёт запомненную подвкладку', () => {
|
||||
persistOwnTab('executed');
|
||||
expect(storedOwnTab()).toBe('executed');
|
||||
});
|
||||
|
||||
it('переход в «Мои заявки» кладёт восстановленный фильтр в адрес', () => {
|
||||
persistOwnStatus('Согласовано');
|
||||
const ownTab = storedOwnTab();
|
||||
|
||||
navigate({ mode: 'submit', nav: 'own', ownTab, ownStatus: storedOwnStatus(ownTab) });
|
||||
|
||||
expect(window.location.search).toContain('rpstatus=');
|
||||
expect(parseRoute(window.location.search).ownStatus).toBe('Согласовано');
|
||||
});
|
||||
|
||||
it('переход на подвкладку решений фильтр в адрес не тащит', () => {
|
||||
persistOwnStatus('Согласовано');
|
||||
|
||||
navigate({ mode: 'submit', nav: 'own', ownTab: 'approved', ownStatus: storedOwnStatus('approved') });
|
||||
|
||||
expect(window.location.search).toContain('rptab=approved');
|
||||
expect(window.location.search).not.toContain('rpstatus');
|
||||
});
|
||||
|
||||
// Ровно тот баг, который это всё затевалось починить: подвкладка «Инициированные»
|
||||
// с выбранным фильтром → уход на другую подвкладку → возврат — фильтр должен
|
||||
// остаться прежним, а не сброситься на «Все статусы» (см. RequestPortal.tsx/
|
||||
|
||||
@@ -116,6 +116,20 @@ function readStoredPage(viewKey: string): number | undefined {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Запомненная страница таблицы, на которую собираемся перейти. Нужна там, где
|
||||
* маршрут СТРОИТСЯ (переход по меню/подвкладке): parseRoute подставил бы её и
|
||||
* сам, но тогда номер остался бы только в состоянии и не попал бы в адрес —
|
||||
* ссылка на список показывала бы не ту страницу, что открыта на экране.
|
||||
*
|
||||
* ownTab не задан (переход в «Мои заявки» из другого раздела) — берём
|
||||
* запомненную подвкладку: именно она и откроется (см. parseOwnTab).
|
||||
*/
|
||||
export function storedPageFor(nav: NavSection, ownTab?: OwnTab): number {
|
||||
const tab = nav === 'own' ? ownTab ?? readStoredOwnTab() : undefined;
|
||||
return readStoredPage(viewKeyOf(nav, tab)) ?? 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Запомнить страницу текущей таблицы. Ключ выводится из самого маршрута —
|
||||
* вызывающей стороне не нужно знать, как таблицы различаются между собой.
|
||||
@@ -152,6 +166,21 @@ function readStoredOwnStatus(): string | undefined {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Запомненные подвкладка и фильтр — как и storedPageFor, нужны там, где маршрут
|
||||
* СТРОИТСЯ: parseRoute подставил бы их и сам, но тогда они остались бы только в
|
||||
* состоянии и не попали бы в адрес (ссылка на раздел вела бы не туда, что
|
||||
* открыто на экране).
|
||||
*/
|
||||
export function storedOwnTab(): OwnTab {
|
||||
return readStoredOwnTab();
|
||||
}
|
||||
|
||||
/** Вне вкладки «Инициированные» фильтра по статусу нет по смыслу — там отбор задаёт сама вкладка. */
|
||||
export function storedOwnStatus(ownTab: OwnTab): string | undefined {
|
||||
return ownTab === 'created' ? readStoredOwnStatus() : undefined;
|
||||
}
|
||||
|
||||
/** Запомнить подвкладку «Моих заявок» — вызывать только при явном выборе пользователя. */
|
||||
export function persistOwnTab(ownTab: OwnTab): void {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user