Skip to content

Роутинг

Общие пути и префиксы

Вкладки объявлены один раз и работают и в проекте, и в портале: внутреннее имя роута получает префикс 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.