menu.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import type { SystemModel, TransformData } from '#/api';
  2. export function fromMenus(menus: TransformData[]): SystemModel.Menu[] {
  3. const getType = (menu: TransformData): SystemModel.Menu['type'] => {
  4. if (menu.type) return menu.type;
  5. if (menu.component && menu.children === null) return 'menu';
  6. return menu.component ? 'catalog' : 'button';
  7. };
  8. return Array.isArray(menus)
  9. ? menus
  10. .map((menu: TransformData) => {
  11. menu.meta ??= {};
  12. menu.meta.order ??= menu?.orderNum ?? -1;
  13. return {
  14. type: getType(menu),
  15. id: menu.id ?? menu.meta.id,
  16. pid: menu.parentId,
  17. name: menu.name,
  18. path: menu.path,
  19. component: menu.component,
  20. meta: fromMenuMeta(menu.meta),
  21. children: fromMenus(menu.children),
  22. } satisfies SystemModel.Menu;
  23. })
  24. .sort((a, b) => (a.meta.order ?? -1) - (b.meta.order ?? -1))
  25. : [];
  26. }
  27. type MenuMeta = SystemModel.Menu['meta'];
  28. export function getDefaultMenuMeta(meta?: MenuMeta): MenuMeta {
  29. return Object.assign(
  30. {
  31. keepAlive: true,
  32. },
  33. meta,
  34. );
  35. }
  36. function fromMenuMeta(meta: TransformData): MenuMeta {
  37. return getDefaultMenuMeta(meta satisfies MenuMeta);
  38. }