Appearance
Роутинг
Общие пути и префиксы
Вкладки объявлены один раз и работают и в проекте, и в портале: внутреннее имя роута получает префикс project- или portal- в зависимости от того, откуда идёт переход. Ссылки в клиентском коде остаются общими.
Возврат на сохранённый путь
Сохранённые пути хранятся в localStorage (bms_last_routes) и переживают перезагрузку браузера: при переходе сохранённый путь подставляется сам — пользователь оказывается там, где был в прошлый раз. Возврат в корень той же страницы стирает её сохранённые пути.
ts
/*
url можно представить как массив сегментов ['', 'object', '123', 'settings'] => /object/123/settings
сегменты и их индексы для страницы портала и проектов;
выборка сегмента по индексам — getSubRoute(path, start, end)
*/
export enum EObjectURL {
/** пустой сегмент до первого слэша */
ROOT,
/** страница: projects или portals */
PAGE,
/** id проекта или портала */
PAGE_ID,
/** подраздел страницы: objects, drivers, alarms… */
SUB_PAGE,
/** id объекта */
ID,
/** вкладка объекта */
TAB,
}
/*
Карта сохранённых путей одного сценария:
key - произвольный ключ, его возвращает getKey правила;
value - полный путь (fullPath), на котором был пользователь в момент сохранения.
{ some_key: '/objects/123/settings/some-tab' }
В localStorage лежит на уровень глубже, по имени сценария:
bms_last_routes = { [IMetaSaveRoute.type]: TLastRoute }
*/
export type TLastRoute = Record<string, string>;
/**
* Сценарии сохранения путей; имя сценария — ключ верхнего уровня
* в bms_last_routes.
*/
export enum ESaveRouteType {
/** переход к объекту — открывается последний таб этого раздела страницы
* (таб запоминается один на раздел, а не на каждый объект) */
OBJECT_TO_OBJECT = "objectToObject",
/** возврат на страницу — открывается её последний путь */
PAGE_TO_PAGE = "pageToPage",
/** заход на пустую страницу /projects или /portals — открывается
* последний открытый проект или портал */
TO_EMPTY_PORTAL_OR_PROJECT = "toEmptyPortalOrProject",
/** переход в другой проект или портал — открывается последний путь
* этого проекта или портала */
TO_ANOTHER_PROJECT = "toAnotherProject",
}
/**
* Правило сохранения пути; роут берёт массив правил в meta.saveRoute.
* Гвард применяет правило к каждому переходу: вычисляет getKey; если путь
* уже сохранён и needRedirect вернул true — перенаправляет через
* valueToRedirect, переход на этом заканчивается; если needStore вернул
* true — запоминает текущий fullPath. Возврат в корень той же страницы
* стирает сохранённое значение.
*/
export interface IMetaSaveRoute {
/** имя сценария — ключ верхнего уровня в bms_last_routes */
type: ESaveRouteType;
/** ключ, по которому определяется, был ли пользователь на этой странице */
getKey: (to: RouteLocationNormalized, from: RouteLocationNormalized) => string;
/** запоминать ли пару ключ — значение */
needStore: (to: RouteLocationNormalized, from: RouteLocationNormalized) => boolean;
/** делать ли перенаправление, если ключ найден */
needRedirect: (to: RouteLocationNormalized, from: RouteLocationNormalized) => boolean;
/** адрес перенаправления из сохранённого значения */
valueToRedirect: (
value: string,
to: RouteLocationNormalized,
from: RouteLocationNormalized,
) => string;
}Mentioned In
None yet.