feat: переход по ссылке между парными заявками — без перезагрузки страницы
Tests / frontend-test (pull_request) Successful in 1m15s
Tests / frontend-test (pull_request) Successful in 1m15s
navigateToRequestLink (shared/routing): если абсолютная ссылка ведёт на ЭТУ ЖЕ страницу портала и на просмотр заявки — открываем её через navigate(), то есть сменой rp-параметров, а не перезагрузкой SPFx-страницы (она грузится секунды, а показать нужно ту же страницу с другими параметрами). Раздел бокового меню берётся текущий: заявка показывается в панели поверх раздела, и переход по ссылке не должен переключать раздел под ней. LinkField перехватывает только «обычный» клик: с Ctrl/⌘/Shift/Alt и не левой кнопкой отдаёт браузеру, href настоящий — ссылку по-прежнему можно скопировать или открыть в отдельной вкладке. Чужой сайт, другая страница и ссылка не на заявку возвращают false и обрабатываются браузером как раньше. Тесты на requestLinkUrl/navigateToRequestLink в routing.test.ts; heft test — 179 успешных, 0 падений. В docs/routing.md добавлены hr-dismissal и clearance-form. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
import {
|
||||
IRoute,
|
||||
navigate,
|
||||
navigateToRequestLink,
|
||||
parseRoute,
|
||||
persistOwnStatus,
|
||||
persistOwnTab,
|
||||
persistPage,
|
||||
persistQuery,
|
||||
requestLinkUrl,
|
||||
routeUrl,
|
||||
storedOwnStatus,
|
||||
storedOwnTab,
|
||||
@@ -527,3 +529,34 @@ describe('navigate', () => {
|
||||
expect(seen[0]).toContain('rpnav=approvals');
|
||||
});
|
||||
});
|
||||
|
||||
describe('requestLinkUrl / navigateToRequestLink', () => {
|
||||
it('ссылка абсолютна и не тащит посторонние параметры текущей страницы', () => {
|
||||
window.history.replaceState({}, '', '/?foo=bar&rpnav=own');
|
||||
expect(requestLinkUrl('clearance-form', 7, '/sites/requests/Lists/List10')).toBe(
|
||||
'http://localhost/?rpmode=approve&rptype=clearance-form&rpid=7&rplist=%2Fsites%2Frequests%2FLists%2FList10'
|
||||
);
|
||||
});
|
||||
|
||||
it('ссылка на заявку этого же портала открывается навигацией, без перезагрузки', () => {
|
||||
window.history.replaceState({}, '', '/?rpnav=own');
|
||||
expect(navigateToRequestLink(requestLinkUrl('clearance-form', 7))).toBe(true);
|
||||
|
||||
const route = parseRoute();
|
||||
expect(route.mode).toBe('approve');
|
||||
expect(route.formKey).toBe('clearance-form');
|
||||
expect(route.itemId).toBe(7);
|
||||
// Раздел под панелью заявки остаётся тем же, что был открыт.
|
||||
expect(route.nav).toBe('own');
|
||||
});
|
||||
|
||||
it('чужой сайт, другая страница и ссылка не на заявку — клик отдаётся браузеру', () => {
|
||||
expect(navigateToRequestLink('https://example.com/p?rpmode=approve&rptype=a&rpid=1')).toBe(false);
|
||||
expect(navigateToRequestLink('/OtherPage.aspx?rpmode=approve&rptype=a&rpid=1')).toBe(false);
|
||||
expect(navigateToRequestLink('http://localhost/?rpnav=own')).toBe(false);
|
||||
});
|
||||
|
||||
it('мусор вместо адреса не роняет обработчик клика', () => {
|
||||
expect(navigateToRequestLink('не ссылка')).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user