roles.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { defineStore } from 'pinia'
  2. import { routesMetas, RoutesName } from '@/router'
  3. import { fetchRoleOptions, RoleOption } from '@/api'
  4. import type { RoleOptions } from '@/api'
  5. export type { RoleOptions, RoleOption } from '@/api'
  6. export { fetchRoleOptions } from '@/api'
  7. export type MenuTree = {
  8. key: RoleOption['id']
  9. title: string
  10. children: MenuTree[]
  11. }
  12. const transformMenuTree = (
  13. roleOptions: RoleOptions,
  14. disabledIds: RoleOption['id'][] = []
  15. ): MenuTree[] => {
  16. return roleOptions.map(role => ({
  17. title: routesMetas[role.path].title,
  18. key: role.id,
  19. children: role.children
  20. ? transformMenuTree(role.children, disabledIds)
  21. : [],
  22. disabled: disabledIds.includes(role.id)
  23. }))
  24. }
  25. export const transformNames = (options: RoleOptions) => {
  26. const names: RoutesName[] = []
  27. for (const option of options) {
  28. names.push(option.path)
  29. if (option.children) {
  30. names.push(...transformNames(option.children))
  31. }
  32. }
  33. return names
  34. }
  35. const findRole = (
  36. list: RoleOptions,
  37. predicate: (option: RoleOption) => boolean
  38. ): RoleOption | void => {
  39. for (const option of list) {
  40. if (predicate(option)) {
  41. return option
  42. } else if (option.children?.length) {
  43. const selected = findRole(option.children, predicate)
  44. if (selected) {
  45. return selected
  46. }
  47. }
  48. }
  49. }
  50. export const useRoleStore = defineStore('role', {
  51. state: () => ({
  52. list: [] as RoleOptions
  53. }),
  54. getters: {
  55. getRole: state => (name: RoutesName) =>
  56. findRole(state.list, role => role.path === name)!,
  57. getName: state => (id: RoleOption['id']) =>
  58. (findRole(state.list, role => role.id === id)! as any).path,
  59. getRoles() {
  60. return (names: RoutesName[]) => names.map(name => this.getRole(name))
  61. },
  62. getRoleId(state) {
  63. return (name: RoutesName) => this.getRole(name).id
  64. },
  65. getRoleIds() {
  66. return (names: RoutesName[]) => names.map(name => this.getRoleId(name))
  67. },
  68. getNames() {
  69. return (ids: RoleOption['id'][]) => ids.map(this.getName)
  70. },
  71. getMenuTree:
  72. state =>
  73. (disabledIds: RoleOption['id'][] = []) =>
  74. transformMenuTree(state.list, disabledIds)
  75. },
  76. actions: {
  77. async fetch() {
  78. this.list = await fetchRoleOptions()
  79. }
  80. }
  81. })