react-toolkits 2.24.19 → 2.24.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +14 -0
  3. package/lib/chunk-3VI7KSDA.js +2 -0
  4. package/lib/{chunk-H5Y4DYUL.js.map → chunk-3VI7KSDA.js.map} +1 -1
  5. package/lib/chunk-3ZT3BOPJ.js +3 -0
  6. package/lib/chunk-3ZT3BOPJ.js.map +1 -0
  7. package/lib/{chunk-D75NVCYN.js → chunk-D5OM3OZU.js} +2 -2
  8. package/lib/{chunk-D75NVCYN.js.map → chunk-D5OM3OZU.js.map} +1 -1
  9. package/lib/chunk-F3OT6ENF.js +2 -0
  10. package/lib/{chunk-UPO7NB6O.js.map → chunk-F3OT6ENF.js.map} +1 -1
  11. package/lib/chunk-FD52RBG7.js +2 -0
  12. package/lib/{chunk-ZF7POJAA.js.map → chunk-FD52RBG7.js.map} +1 -1
  13. package/lib/{chunk-ST7VUWJ4.js → chunk-IWPBGSXS.js} +2 -2
  14. package/lib/{chunk-ST7VUWJ4.js.map → chunk-IWPBGSXS.js.map} +1 -1
  15. package/lib/chunk-S4LUEDFA.js +2 -0
  16. package/lib/{chunk-NNXVZIY2.js.map → chunk-S4LUEDFA.js.map} +1 -1
  17. package/lib/chunk-SMBHLRAO.js +2 -0
  18. package/lib/chunk-SMBHLRAO.js.map +1 -0
  19. package/lib/chunk-XX2BCZJU.js +2 -0
  20. package/lib/{chunk-MTRFNFEM.js.map → chunk-XX2BCZJU.js.map} +1 -1
  21. package/lib/{createMenuItem-SXFYDNCW.js → createMenuItem-5DDIEELO.js} +2 -2
  22. package/lib/{createMenuItem-SXFYDNCW.js.map → createMenuItem-5DDIEELO.js.map} +1 -1
  23. package/lib/index.css +1 -1
  24. package/lib/index.d.ts +9 -2
  25. package/lib/index.js +2 -2
  26. package/lib/index.js.map +1 -1
  27. package/lib/{menuItemList-NIBRDRTA.js → menuItemList-4ZLZ7HSG.js} +2 -2
  28. package/lib/{menuItemList-NIBRDRTA.js.map → menuItemList-4ZLZ7HSG.js.map} +1 -1
  29. package/lib/{roleDetail-7HEBW7IS.js → roleDetail-42BOHDFS.js} +2 -2
  30. package/lib/{roleDetail-7HEBW7IS.js.map → roleDetail-42BOHDFS.js.map} +1 -1
  31. package/lib/{roleList-WGLD3HXB.js → roleList-KWWO3IFL.js} +2 -2
  32. package/lib/{roleList-WGLD3HXB.js.map → roleList-KWWO3IFL.js.map} +1 -1
  33. package/lib/updateMenuItem-E5QMBR2S.js +2 -0
  34. package/lib/{updateMenuItem-TECCUD6Z.js.map → updateMenuItem-E5QMBR2S.js.map} +1 -1
  35. package/lib/userDetail-L7Q3C67K.js +2 -0
  36. package/lib/{userDetail-WGQJ7IC5.js.map → userDetail-L7Q3C67K.js.map} +1 -1
  37. package/lib/userList-IU4L5YRJ.js +2 -0
  38. package/lib/{userList-2S2FRAG6.js.map → userList-IU4L5YRJ.js.map} +1 -1
  39. package/locale/context.js +1 -7
  40. package/locale/context.js.map +1 -1
  41. package/locale/en_GB.js +1 -94
  42. package/locale/en_GB.js.map +1 -1
  43. package/locale/hooks.js +1 -18
  44. package/locale/hooks.js.map +1 -1
  45. package/locale/index.js +1 -2
  46. package/locale/ja_JP.js +1 -94
  47. package/locale/ja_JP.js.map +1 -1
  48. package/locale/ko_KR.js +1 -94
  49. package/locale/ko_KR.js.map +1 -1
  50. package/locale/zh_CN.js +1 -94
  51. package/locale/zh_CN.js.map +1 -1
  52. package/package.json +1 -1
  53. package/lib/chunk-7X2LW6EY.js +0 -73
  54. package/lib/chunk-7X2LW6EY.js.map +0 -1
  55. package/lib/chunk-DLTAWT6S.js +0 -2
  56. package/lib/chunk-DLTAWT6S.js.map +0 -1
  57. package/lib/chunk-E6L6VKSV.js +0 -227
  58. package/lib/chunk-E6L6VKSV.js.map +0 -1
  59. package/lib/chunk-ESCBNFWD.js +0 -498
  60. package/lib/chunk-ESCBNFWD.js.map +0 -1
  61. package/lib/chunk-FSXYUF4U.js +0 -276
  62. package/lib/chunk-FSXYUF4U.js.map +0 -1
  63. package/lib/chunk-H5Y4DYUL.js +0 -2
  64. package/lib/chunk-LXMQLSQY.js +0 -46
  65. package/lib/chunk-LXMQLSQY.js.map +0 -1
  66. package/lib/chunk-MTRFNFEM.js +0 -2
  67. package/lib/chunk-NNXVZIY2.js +0 -2
  68. package/lib/chunk-OH74GXG4.js +0 -570
  69. package/lib/chunk-OH74GXG4.js.map +0 -1
  70. package/lib/chunk-P25BHLH3.js +0 -3
  71. package/lib/chunk-P25BHLH3.js.map +0 -1
  72. package/lib/chunk-QACSRYJY.js +0 -147
  73. package/lib/chunk-QACSRYJY.js.map +0 -1
  74. package/lib/chunk-UPO7NB6O.js +0 -2
  75. package/lib/chunk-Z6PDWY44.js +0 -17
  76. package/lib/chunk-Z6PDWY44.js.map +0 -1
  77. package/lib/chunk-ZF7POJAA.js +0 -2
  78. package/lib/chunk-ZOHMJAAX.js +0 -120
  79. package/lib/chunk-ZOHMJAAX.js.map +0 -1
  80. package/lib/createMenuItem-CICLQWU6.js +0 -86
  81. package/lib/createMenuItem-CICLQWU6.js.map +0 -1
  82. package/lib/menuItemList-EHQSS4YZ.js +0 -132
  83. package/lib/menuItemList-EHQSS4YZ.js.map +0 -1
  84. package/lib/roleDetail-JCDOXKAM.js +0 -72
  85. package/lib/roleDetail-JCDOXKAM.js.map +0 -1
  86. package/lib/roleList-4C77ULPK.js +0 -161
  87. package/lib/roleList-4C77ULPK.js.map +0 -1
  88. package/lib/updateMenuItem-K62CKVXP.js +0 -109
  89. package/lib/updateMenuItem-K62CKVXP.js.map +0 -1
  90. package/lib/updateMenuItem-TECCUD6Z.js +0 -2
  91. package/lib/userDetail-WGQJ7IC5.js +0 -2
  92. package/lib/userDetail-WYN52ZJ2.js +0 -116
  93. package/lib/userDetail-WYN52ZJ2.js.map +0 -1
  94. package/lib/userList-2S2FRAG6.js +0 -2
  95. package/lib/userList-AMVG7RCE.js +0 -195
  96. package/lib/userList-AMVG7RCE.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # react-toolkits
2
2
 
3
+ ## 2.24.20
4
+
5
+ ### Patch Changes
6
+
7
+ - ea089e2: feat: add requireGame configuration to ToolkitsProvider and update related components
8
+
3
9
  ## 2.24.19
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -53,6 +53,19 @@ root.render(
53
53
  <RouterProvider router={router} />
54
54
  </ToolkitsProvider>,
55
55
  )
56
+
57
+ // 不接入游戏功能的配置示例
58
+ root.render(
59
+ <ToolkitsProvider
60
+ collapsible
61
+ permissionVersion={PermissionVersion.V3}
62
+ loginPath="/sign_in"
63
+ mainPagePath="/"
64
+ requireGame={false} // 设置为 false 以禁用游戏功能
65
+ >
66
+ <RouterProvider router={router} />
67
+ </ToolkitsProvider>,
68
+ )
56
69
  ```
57
70
 
58
71
  ### 配置项(`ToolkitsProvider`)
@@ -62,6 +75,7 @@ root.render(
62
75
  - **permissionVersion**: 权限版本,建议使用 `PermissionVersion.V3`
63
76
  - **collapsible**: 侧边栏是否可折叠
64
77
  - **gameApiV2**: 是否启用游戏相关 V2 接口适配(如不涉及可忽略)
78
+ - **requireGame**: 是否需要游戏选择功能,默认为 `true`。设置为 `false` 时项目不接入游戏功能,将隐藏游戏选择器并跳过游戏相关的检查
65
79
  - 其余高级配置见类型定义 `react-toolkits/components` 内导出的 Provider Props
66
80
 
67
81
  ## 子路径导出(推荐)
@@ -0,0 +1,2 @@
1
+ import {o,p,l}from'./chunk-3ZT3BOPJ.js';import {useQuery,useQueryClient,useMutation}from'@tanstack/react-query';function f(){let s=o();return useQuery({queryKey:p.roles.all,queryFn:()=>s.get("/api/usystem/role/all")})}function R(s){let i=l(o=>o.permissionVersion),t=o(),e=i==="v2"?"v2":"v1";return useQuery({queryKey:p.roles.detail(s,e),queryFn:()=>t.get(`/api/usystem/role/${e==="v2"?"infoV2":"info"}?name=${s}`)})}function q(){let{permissionVersion:s}=l(o=>o),i=o(),t=useQueryClient(),e=s==="v2"?"v2":"v1";return useMutation({mutationKey:p.roles.create(e),mutationFn:({name:o,permissions:u})=>i.post(e==="v2"?"/api/usystem/role/createV2":"/api/usystem/role/create",{name:o,permissions:u}),onSuccess:()=>{t.invalidateQueries({queryKey:p.roles.all});}})}function v(){let{permissionVersion:s}=l(o=>o),i=o(),t=useQueryClient(),e=s==="v2"?"v2":"v1";return useMutation({mutationKey:p.roles.update(e),mutationFn:({id:o,name:u,permissions:m})=>i.post(e==="v2"?"/api/usystem/role/updateV2":"/api/usystem/role/update",{id:o,name:u,permissions:m}),onSuccess:()=>{t.invalidateQueries({queryKey:p.roles.all});}})}function C(){let s=o(),i=useQueryClient();return useMutation({mutationKey:p.roles.delete,mutationFn:({id:t,name:e})=>s.post("/api/usystem/role/delete",{id:t,name:e}),onSuccess:()=>{i.invalidateQueries({queryKey:p.roles.all});}})}function K(){let s=o(),i=useQueryClient(),{permissionVersion:t}=l();return useMutation({mutationKey:p.users.create,mutationFn:e=>{let o=m=>"permissions"in m,u=e;if(o(e)&&t==="v4"){let m=e.permissions.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...e,permissions:m};}return s.post("/api/usystem/user/create",u)},onSuccess:()=>{i.invalidateQueries({queryKey:p.users.all});}})}function h(){let s=o(),i=useQueryClient(),{permissionVersion:t}=l();return useMutation({mutationKey:p.users.update,mutationFn:e=>{let o=m=>"permissions"in m,u=e;if(o(e)&&t==="v4"){let m=e.permissions.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...e,permissions:m};}return s.post("/api/usystem/user/update",u)},onSuccess:()=>{i.invalidateQueries({queryKey:p.users.all});}})}function W(){let s=o(),i=useQueryClient();return useMutation({mutationKey:p.users.delete,mutationFn:({id:t,name:e})=>s.post("/api/usystem/user/delete",{id:t,name:e}),onSuccess:()=>{i.invalidateQueries({queryKey:p.users.all});}})}function k(){let s=o();return useQuery({queryKey:p.permissions.allPermissions,queryFn:()=>s.get("/api/usystem/user/allPermssions")})}function x(){let s=o();return useQuery({queryKey:p.permissions.allPermissionsV2,queryFn:()=>s.get("/api/usystem/user/allPermssionsV2")})}export{f as a,R as b,q as c,v as d,C as e,K as f,h as g,W as h,k as i,x as j};//# sourceMappingURL=chunk-3VI7KSDA.js.map
2
+ //# sourceMappingURL=chunk-3VI7KSDA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/permission/services/index.ts"],"names":["useAllRoles","ky","useKy","useQuery","queryKeys","useRole","name","permissionVersion","useToolkitsStore","state","version","useCreateRole","s","queryClient","useQueryClient","useMutation","permissions","useUpdateRole","id","useRemoveRole","useCreateUser","arg","hasPermissions","obj","requestData","transformedPermissions","item","useUpdateUser","useRemoveUser","useAllPermissions","useAllPermissionsV2"],"mappings":"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","file":"chunk-H5Y4DYUL.js","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionVersion, WILDCARD } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n const ky = useKy()\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => ky.get<RoleEnumItem[]>('/api/usystem/role/all'),\n })\n}\n\nexport function useRole(name: string) {\n const permissionVersion = useToolkitsStore(state => state.permissionVersion)\n const ky = useKy()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, version),\n queryFn: () => ky.get<RoleV1 | RoleV2>(`/api/usystem/role/${version === 'v2' ? 'infoV2' : 'info'}?name=${name}`),\n })\n}\n\nexport function useCreateRole() {\n const { permissionVersion } = useToolkitsStore(s => s)\n const ky = useKy()\n const queryClient = useQueryClient()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useMutation({\n mutationKey: queryKeys.roles.create(version),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n ky.post(version === 'v2' ? '/api/usystem/role/createV2' : '/api/usystem/role/create', { name, permissions }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const { permissionVersion } = useToolkitsStore(s => s)\n const ky = useKy()\n const queryClient = useQueryClient()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useMutation({\n mutationKey: queryKeys.roles.update(version),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n ky.post(version === 'v2' ? '/api/usystem/role/updateV2' : '/api/usystem/role/update', { id, name, permissions }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) => ky.post('/api/usystem/role/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\ntype CreateUserWithRoles = { name: string; roles: string[] }\n\ntype CreateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype CreateUserWithPermissions = {\n name: string\n permissions: CreateUserPermission[]\n}\n\nexport function useCreateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const { permissionVersion } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.create,\n mutationFn: (arg: CreateUserWithRoles | CreateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is CreateUserWithPermissions => 'permissions' in obj\n\n let requestData: CreateUserWithRoles | CreateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionVersion === PermissionVersion.V4) {\n const transformedPermissions = arg.permissions.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/create', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\ntype UpdateUserWithRoles = { id: string; name: string; roles: string[] }\n\ntype UpdateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype UpdateUserWithPermissions = {\n id: string\n name: string\n permissions: UpdateUserPermission[]\n}\n\nexport function useUpdateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const { permissionVersion } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.update,\n mutationFn: (arg: UpdateUserWithRoles | UpdateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is UpdateUserWithPermissions => 'permissions' in obj\n\n let requestData: UpdateUserWithRoles | UpdateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionVersion === PermissionVersion.V4) {\n const transformedPermissions = arg.permissions.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/update', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) => ky.post('/api/usystem/user/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssions'),\n })\n}\n\nexport function useAllPermissionsV2() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssionsV2'),\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/modules/permission/services/index.ts"],"names":["useAllRoles","ky","useKy","useQuery","queryKeys","useRole","name","permissionVersion","useToolkitsStore","state","version","useCreateRole","s","queryClient","useQueryClient","useMutation","permissions","useUpdateRole","id","useRemoveRole","useCreateUser","arg","hasPermissions","obj","requestData","transformedPermissions","item","useUpdateUser","useRemoveUser","useAllPermissions","useAllPermissionsV2"],"mappings":"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","file":"chunk-3VI7KSDA.js","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionVersion, WILDCARD } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n const ky = useKy()\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => ky.get<RoleEnumItem[]>('/api/usystem/role/all'),\n })\n}\n\nexport function useRole(name: string) {\n const permissionVersion = useToolkitsStore(state => state.permissionVersion)\n const ky = useKy()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, version),\n queryFn: () => ky.get<RoleV1 | RoleV2>(`/api/usystem/role/${version === 'v2' ? 'infoV2' : 'info'}?name=${name}`),\n })\n}\n\nexport function useCreateRole() {\n const { permissionVersion } = useToolkitsStore(s => s)\n const ky = useKy()\n const queryClient = useQueryClient()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useMutation({\n mutationKey: queryKeys.roles.create(version),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n ky.post(version === 'v2' ? '/api/usystem/role/createV2' : '/api/usystem/role/create', { name, permissions }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const { permissionVersion } = useToolkitsStore(s => s)\n const ky = useKy()\n const queryClient = useQueryClient()\n const version = permissionVersion === PermissionVersion.V2 ? 'v2' : 'v1'\n\n return useMutation({\n mutationKey: queryKeys.roles.update(version),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n ky.post(version === 'v2' ? '/api/usystem/role/updateV2' : '/api/usystem/role/update', { id, name, permissions }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) => ky.post('/api/usystem/role/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\ntype CreateUserWithRoles = { name: string; roles: string[] }\n\ntype CreateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype CreateUserWithPermissions = {\n name: string\n permissions: CreateUserPermission[]\n}\n\nexport function useCreateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const { permissionVersion } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.create,\n mutationFn: (arg: CreateUserWithRoles | CreateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is CreateUserWithPermissions => 'permissions' in obj\n\n let requestData: CreateUserWithRoles | CreateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionVersion === PermissionVersion.V4) {\n const transformedPermissions = arg.permissions.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/create', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\ntype UpdateUserWithRoles = { id: string; name: string; roles: string[] }\n\ntype UpdateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype UpdateUserWithPermissions = {\n id: string\n name: string\n permissions: UpdateUserPermission[]\n}\n\nexport function useUpdateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const { permissionVersion } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.update,\n mutationFn: (arg: UpdateUserWithRoles | UpdateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is UpdateUserWithPermissions => 'permissions' in obj\n\n let requestData: UpdateUserWithRoles | UpdateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionVersion === PermissionVersion.V4) {\n const transformedPermissions = arg.permissions.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/update', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) => ky.post('/api/usystem/user/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssions'),\n })\n}\n\nexport function useAllPermissionsV2() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssionsV2'),\n })\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import {create,useStore,createStore}from'zustand';import {App}from'antd';import {createContext,useContext,useRef,useMemo}from'react';import {persist,createJSONStorage}from'zustand/middleware';import {jwtDecode}from'jwt-decode';import {jsx,Fragment}from'react/jsx-runtime';import {useQueryClient}from'@tanstack/react-query';import de from'ky';import {useNavigate}from'react-router-dom';function J(){return create((e,t)=>({open:new Map,usedIds:new Set,isOpen(o){return t().open.get(o)??false},show(o){e({open:new Map(t().open).set(o,true)});},hide(o){e({open:new Map(t().open).set(o,false)});},hideAll(){e({open:new Map});},checkUniqueness(o){return !t().usedIds.has(o)},registerIds(o){let{usedIds:i}=t();return i.has(o)?false:(e({usedIds:new Set(i).add(o)}),true)},cleanup(o){let{open:i,usedIds:n}=t(),p=new Map(i),T=new Set(n);p.delete(o),T.delete(o),e({open:p,usedIds:T});}}))}var X=0,Q=()=>{let e=Date.now(),t=Math.floor(Math.random()*1e3),o=++X%1e3;return e*1e6+t*1e3+o};var P={getItem(e){return sessionStorage.getItem(e)??localStorage.getItem(e)},setItem(e,t){sessionStorage.setItem(e,t),localStorage.setItem(e,t);},removeItem(e){sessionStorage.removeItem(e),localStorage.removeItem(e);}};var Ge="https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1",g="App-ID",Le="/console/",E=(n=>(n.V1="v1",n.V2="v2",n.V3="v3",n.V4="v4",n))(E||{}),Ne="*",I="true",_e="false",w="unregistered";var Y={global:{noEntitlement:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",name:"\u540D\u79F0",creationTime:"\u521B\u5EFA\u65F6\u95F4",operation:"\u64CD\u4F5C",update:"\u66F4\u65B0",edit:"\u7F16\u8F91",delete:"\u5220\u9664",selectAll:"\u5168\u9009",game:"\u6E38\u620F",user:"\u7528\u6237",role:"\u89D2\u8272",username:"\u7528\u6237\u540D",password:"\u5BC6\u7801",label:"\u6807\u7B7E",method:"\u65B9\u6CD5",route:"\u8DEF\u7531",request:"\u8BF7\u6C42",response:"\u54CD\u5E94",add:"\u6DFB\u52A0",signIn:"\u767B\u5F55",projectGroup:"\u9879\u76EE\u7EC4",view:"\u67E5\u770B",back:"\u8FD4\u56DE"},SignIn:{title:"\u767B\u5F55\u65B9\u5F0F",signInWithIDass:"IDass \u767B\u5F55",unregistered:"\u60A8\u8FD8\u672A\u5728\u5E73\u53F0\u6CE8\u518C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",welcome:"\u6B22\u8FCE"},NotFound:{subTitle:"\u8BBF\u95EE\u7684\u9875\u9762\u4E0D\u5B58\u5728",buttonText:"\u8FD4\u56DE\u9996\u9875"},FilterFormWrapper:{confirmText:"\u67E5\u8BE2",resetText:"\u91CD\u7F6E"},FormModal:{confirmText:"\u786E\u8BA4",cancelText:"\u53D6\u6D88"},GameSelect:{label:"\u5F53\u524D\u6E38\u620F",placeholder:"\u8BF7\u9009\u62E9\u6E38\u620F"},RequireGame:{description:"\u8BF7\u9009\u62E9\u6E38\u620F"},UserDropdown:{signOutText:"\u767B\u51FA"},User:{createTitle:"\u521B\u5EFA\u7528\u6237",createSuccessfully:"\u7528\u6237\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u7528\u6237",updateSuccessfully:"\u7528\u6237\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u7528\u6237",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u7528\u6237 <%= user %> \u5417\uFF1F",deleteSuccessfully:"\u7528\u6237\u5220\u9664\u6210\u529F"},Role:{createTitle:"\u521B\u5EFA\u89D2\u8272",createSuccessfully:"\u89D2\u8272\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u89D2\u8272",updateSuccessfully:"\u89D2\u8272\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u89D2\u8272",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u89D2\u8272 <%= role %> \u5417\uFF1F",deleteSuccessfully:"\u89D2\u8272\u5220\u9664\u6210\u529F"},PermissionList:{failedDescription:"\u83B7\u53D6\u6743\u9650\u5217\u8868\u5931\u8D25",baseSectionTitle:"\u5E73\u53F0\u57FA\u7840\u6743\u9650",gameSectionTitle:"\u6E38\u620F\u6743\u9650",gameSectionDescription:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",gameSelectPlaceholder:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",removeText:"\u79FB\u9664",addText:"\u6DFB\u52A0\u6E38\u620F\u6743\u9650"},RoleDetail:{title:"\u89D2\u8272\u8BE6\u60C5"},InfiniteList:{loadingText:"\u52A0\u8F7D\u4E2D",reachEndText:"\u5DF2\u7ECF\u5230\u5E95\u4E86",loadMoreText:"\u52A0\u8F7D\u66F4\u591A"}},U=Y;var A=e=>({locale:U,gameApiV2:false,isGlobal:false,requireGame:true,loginPath:"/sign_in",mainPagePath:"/",permissionVersion:"v1",setContext(t){e(o=>({...o,...t}));}});var D=e=>({setAppId:t=>e({appId:t})});var q=e=>({collapsed:false,toggleCollapsed:()=>e(t=>({collapsed:!t.collapsed}))});var Z=e=>{if(!e)return null;try{return jwtDecode(e)}catch{return null}},F=e=>({token:void 0,user:null,setToken:t=>e({token:t,user:Z(t)}),clearToken:()=>e({token:void 0,user:null})});var G=e=>createStore()(persist((...t)=>{let[,o,i]=t;return {...F(...t),...D(...t),...A(...t),...q(...t),...e,clear:()=>{o().clearToken(),i.persist.clearStorage();}}},{name:"toolkits",storage:createJSONStorage(()=>P),partialize:({token:t,appId:o,user:i,collapsed:n})=>({token:t,appId:o,user:i,collapsed:n})}));var C=createContext(null);function b(e){let t=useContext(C);if(!t)throw new Error("Missing ToolkitsProvider in the tree");return useStore(t,e??(o=>o))}var N=e=>{let{children:t,...o}=e,i=useRef(void 0),n=useContext(C)?.getState();if(i.current||(i.current=G({...n,...o})),!i.current.getState().loginPath)throw new Error('ToolkitsProvider: \u8BF7\u914D\u7F6E "loginPath"');return jsx(C.Provider,{value:i.current,children:jsx(App,{children:jsx(Fragment,{children:t})})})},ae=(e,t)=>{let o=i=>jsx(N,{...t,children:jsx(e,{...i})});return o.displayName=`withContext(${e.displayName||e.name||"Component"})`,o},le=N;var O=[0,1,200],x={OK:200,UNAUTHORIZED:401,FORBIDDEN:403,UNREGISTERED:412},fe=3e4;var _=e=>!e||typeof e!="object"?"Unknown error":e.msg||e.message||e.error||"Unknown error",ye=e=>{let{value:t,allowedCodes:o}=e;return t==null||typeof t!="number"?false:o.includes(t)},Se=(e,t)=>{if(t<x.OK||t>=300)return false;if(!e||typeof e!="object")return true;let o=[{field:"code",value:e.code,allowedCodes:O},{field:"status",value:e.status,allowedCodes:O},{field:"errno",value:e.errno,allowedCodes:O}];return o.some(n=>n.value!==void 0&&n.value!==null)?o.every(n=>n.value===void 0||n.value===null||ye(n)):true},ge=async(e,t)=>{switch(t){case "blob":return e.blob();case "text":return e.text();case "arrayBuffer":return e.arrayBuffer();case "formData":return e.formData();case "json":default:return e.json()}},xe=e=>{let{baseURL:t}=e||{},{notification:o}=App.useApp(),i=useNavigate(),n=useQueryClient(),{token:p,isGlobal:T,appId:h,permissionVersion:v,loginPath:S,clear:R,apiBase:M,requireGame:B}=b(),V=()=>{R(),n.clear(),i(S);},K=()=>{if(R(),n.clear(),S){let s=new URL(S,window.location.origin);s.searchParams.set(w,I),i(s.toString());}},j=()=>{o.error({message:"\u8BBF\u95EE\u88AB\u7981\u6B62",description:"\u60A8\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6B64\u8D44\u6E90\u3002"});},H=s=>async(r,a,l)=>{if(s==="blob"||s==="arrayBuffer"||s==="text"||s==="formData")return l;let c;try{c=await l.clone().json();}catch{return l}if(Se(c,l.status)){let f=c.data!==void 0?c.data:c;return new Response(JSON.stringify(f),{status:l.status,statusText:l.statusText,headers:l.headers})}let d=_(c);o.error({message:"Request failed",description:d});let m=new Error(d);throw m.response=l,m.data=c,m},z=(s,r)=>{switch(s){case x.UNAUTHORIZED:V();break;case x.UNREGISTERED:K();break;case x.FORBIDDEN:j();break;default:{let a=_(r)||`HTTP ${s} Error`;o.error({message:"Request failed",description:a});break}}},k=useMemo(()=>de.create({prefixUrl:t??M,retry:0,timeout:fe,headers:{Accept:"application/json","Content-Type":"application/json"},hooks:{beforeRequest:[s=>{p&&s.headers.set("Authorization",`Bearer ${p}`),B&&!s.headers.has(g)&&v!=="v1"&&(T||!h?s.headers.set(g,"global"):s.headers.set(g,encodeURIComponent(String(h))));}],beforeError:[async s=>{let{response:r}=s;if(r){let a=r.status,l;try{let c=r.headers.get("content-type")||"";(c.includes("application/json")||c.startsWith("text/"))&&(l=await r.clone().json());}catch{}z(a,l);}else o.error({message:"Network Error",description:s.message||"Network request failed"});return s}]}}),[t,p,T,h,v,o,S,R,n]),u=async(s,r,a,l)=>{let{responseType:c,...d}=l||{},m={...d,hooks:{...d.hooks,afterResponse:[...d.hooks?.afterResponse||[],H(c)]}},f;return a?f=await k(r,{method:s,json:a,...m}):f=await k(r,{method:s,...m}),ge(f,c)};return {get:(s,r)=>u("GET",s,void 0,r),post:(s,r,a)=>u("POST",s,r,a),put:(s,r,a)=>u("PUT",s,r,a),delete:(s,r)=>u("DELETE",s,void 0,r),patch:(s,r,a)=>u("PATCH",s,r,a),options:(s,r)=>u("OPTIONS",s,void 0,r),head:(s,r)=>u("HEAD",s,void 0,r),request:s=>{let{url:r,...a}=s;return u(a.method||"GET",r,void 0,a)},instance:k}};var ht={permissions:{check:(e,t)=>["permissions","check",e,t],allPermissions:["permissions","all"],allPermissionsV2:["permissions","allV2"]},users:{all:["users"],detail:e=>["users","detail",e],create:["users","create"],update:["users","update"],delete:["users","delete"]},roles:{all:["roles"],detail:(e,t)=>["roles","detail",e,t],create:e=>["roles","create",e],update:e=>["roles","update",e],delete:["roles","delete"]},menus:{all:["menus"],navbar:e=>["menus","navbar",e],detail:e=>["menus","detail",e],create:["menus","create"],update:["menus","update"],delete:["menus","delete"]},enums:{gameGroups:["enums","gameGroups"],gameIds:e=>["enums","gameIds",e]},games:{all:["games","all"]},auth:{ticketLogin:e=>["auth","ticket-login",e]}};
2
+ export{J as a,Q as b,P as c,Ge as d,g as e,Le as f,E as g,Ne as h,I as i,_e as j,w as k,b as l,ae as m,le as n,xe as o,ht as p};//# sourceMappingURL=chunk-3ZT3BOPJ.js.map
3
+ //# sourceMappingURL=chunk-3ZT3BOPJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/createVisibilityStore.ts","../src/utils/generateId.ts","../src/utils/mixedStorage.ts","../src/constants/index.ts","../src/locale/zh_CN.ts","../src/stores/context.ts","../src/stores/game.ts","../src/stores/layout.ts","../src/stores/token.ts","../src/stores/index.ts","../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/libs/ky.ts","../src/queryKeys.ts"],"names":["createVisibilityStore","create","set","get","uuid","usedIds","open","newOpen","newUsedIds","globalCounter","generateId","timestamp","random","counter","mixedStorage","name","value","SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","PermissionVersion","WILDCARD","TRUE","FALSE","UNREGISTERED_FLAG","locale","zh_CN_default","createContextSlice","state","prev","createGameSlice","id","createLayoutSlice","decodeToken","token","jwtDecode","createTokenSlice","createToolkitsStore","initProps","createStore","persist","args","store","createJSONStorage","appId","user","collapsed","ToolkitsContext","createContext","useToolkitsStore","selector","useContext","useStore","ToolkitsProvider","props","children","restProps","storeRef","useRef","parentState","jsx","App","Fragment","withContext","Component","providerProps","WrappedComponent","ToolkitsProvider_default","SUCCESS_RESPONSE_CODES","HTTP_STATUS","REQUEST_TIMEOUT","extractErrorMessage","data","isStatusCodeSuccess","config","allowedCodes","isSuccessResponse","status","statusChecks","processResponseByType","response","responseType","useKy","baseURL","notification","navigate","useNavigate","queryClient","useQueryClient","isGlobal","permissionVersion","loginPath","clear","apiBase","requireGame","handleUnauthorized","handleUnregistered","url","handleForbidden","createResponseHandler","_request","_options","responseData","errorMessage","error","handleHttpStatusError","instance","useMemo","ky","request","contentType","makeRequest","method","requestOptions","kyOptions","finalOptions","options","requestOpts","queryKeys","permissions","version","gameGroups","ticket"],"mappings":"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","file":"chunk-3ZT3BOPJ.js","sourcesContent":["import { create } from 'zustand'\n\nexport interface VisibilityState {\n open: Map<number, boolean>\n usedIds: Set<number>\n isOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n checkUniqueness: (uuid: number) => boolean\n registerIds: (uuid: number) => boolean\n cleanup: (uuid: number) => void\n}\n\n/**\n * 创建一个可见性管理的 Zustand store\n * 用于管理 Modal、Drawer 等组件的显示/隐藏状态\n * 每次调用都会创建一个独立的 store 实例,确保不同组件间的状态隔离\n */\nexport function createVisibilityStore() {\n return create<VisibilityState>((set, get) => ({\n open: new Map(),\n usedIds: new Set(),\n isOpen(uuid) {\n return get().open.get(uuid) ?? false\n },\n show(uuid) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map() })\n },\n checkUniqueness(uuid) {\n return !get().usedIds.has(uuid)\n },\n registerIds(uuid) {\n const { usedIds } = get()\n if (usedIds.has(uuid)) return false\n\n set({ usedIds: new Set(usedIds).add(uuid) })\n return true\n },\n cleanup(uuid) {\n const { open, usedIds } = get()\n const newOpen = new Map(open)\n const newUsedIds = new Set(usedIds)\n newOpen.delete(uuid)\n newUsedIds.delete(uuid)\n set({ open: newOpen, usedIds: newUsedIds })\n },\n }))\n}\n","/**\n * 生成唯一 ID 的函数\n * 使用时间戳 + 随机数 + 计数器的组合来确保唯一性\n */\nlet globalCounter = 0\n\nexport const generateId = (): number => {\n const timestamp = Date.now()\n const random = Math.floor(Math.random() * 1000)\n const counter = ++globalCounter % 1000\n\n // 组合:时间戳(毫秒) * 1000000 + 随机数 * 1000 + 计数器\n // 这样可以确保即使在同一毫秒内生成多个ID也不会重复\n return timestamp * 1000000 + random * 1000 + counter\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n/**\n * 混合存储策略\n * - 优先从 SessionStorage 读取数据,防止多开页面时的数据冲突\n * - 写入时同时更新 SessionStorage 和 LocalStorage\n * - SessionStorage 不存在时,fallback 到 LocalStorage\n */\nexport const mixedStorage: StateStorage = {\n getItem(name) {\n return sessionStorage.getItem(name) ?? localStorage.getItem(name)\n },\n setItem(name, value) {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem(name) {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n\nexport const APP_ID_HEADER = 'App-ID'\n\nexport const FRONTEND_ROUTE_PREFIX = '/console/'\n\nexport enum PermissionVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n V4 = 'v4',\n}\n\nexport const WILDCARD = '*'\n\nexport const TRUE = 'true'\n\nexport const FALSE = 'false'\n\nexport const UNREGISTERED_FLAG = 'unregistered'\n","import type { Locale } from '.'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n projectGroup: '项目组',\n view: '查看',\n back: '返回',\n },\n SignIn: {\n title: '登录方式',\n signInWithIDass: 'IDass 登录',\n unregistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserDropdown: {\n signOutText: '登出',\n },\n User: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n Role: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import type { StateCreator } from 'zustand'\n\nimport { PermissionVersion } from '@/constants'\nimport type { Locale } from '@/locale'\nimport zhCN from '@/locale/zh_CN'\n\nexport interface ContextSlice {\n locale: Locale\n permissionVersion: PermissionVersion // 权限版本\n gameApiV2: boolean\n loginPath: string // 登录页路径\n isGlobal: boolean // 为 true 时,APP-ID header 始终使用 'global',否则为当前游戏 id。\n requireGame?: boolean // 是否需要游戏选择,为 false 时项目不接入游戏功能\n navWidth?: number // 侧边栏宽度\n collapsible?: boolean // 侧边栏是否可折叠\n mainPagePath: string // 首页地址\n apiBase?: string // 接口基础路径\n setContext(state: Partial<Omit<ContextSlice, 'setContext'>>): void\n}\n\nexport const createContextSlice: StateCreator<ContextSlice, [], [], ContextSlice> = set => ({\n locale: zhCN,\n gameApiV2: false,\n isGlobal: false,\n requireGame: true, // 默认需要游戏选择,保持向后兼容\n loginPath: '/sign_in',\n mainPagePath: '/',\n permissionVersion: PermissionVersion.V1,\n setContext(state) {\n set(prev => ({ ...prev, ...state }))\n },\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface GameSlice {\n appId?: string | number\n setAppId: (id?: string | number) => void\n}\n\nexport const createGameSlice: StateCreator<GameSlice, [], [], GameSlice> = set => ({\n setAppId: id => set({ appId: id }),\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface LayoutSlice {\n collapsed: boolean // 侧边栏是否折叠\n toggleCollapsed: () => void\n}\n\nexport const createLayoutSlice: StateCreator<LayoutSlice, [], [], LayoutSlice> = set => ({\n collapsed: false,\n toggleCollapsed: () => set(state => ({ collapsed: !state.collapsed })),\n})\n","import { jwtDecode } from 'jwt-decode'\nimport type { StateCreator } from 'zustand'\n\n/**\n * JWT Token 解码后的用户信息\n */\nexport interface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenSlice {\n /** JWT Token */\n token?: string\n user: UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nconst decodeToken = (token?: string): UserInfo | null => {\n if (!token) return null\n\n try {\n return jwtDecode<UserInfo>(token)\n } catch {\n return null\n }\n}\n\nexport const createTokenSlice: StateCreator<TokenSlice, [], [], TokenSlice> = set => ({\n token: undefined,\n user: null,\n setToken: token => set({ token, user: decodeToken(token) }),\n clearToken: () => set({ token: undefined, user: null }),\n})\n","import { createStore } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { mixedStorage } from '@/utils'\n\nimport { type ContextSlice, createContextSlice } from './context'\nimport { createGameSlice, type GameSlice } from './game'\nimport { createLayoutSlice, type LayoutSlice } from './layout'\nimport { createTokenSlice, type TokenSlice } from './token'\n\nexport type ToolkitsState = TokenSlice &\n GameSlice &\n ContextSlice &\n LayoutSlice & {\n clear: () => void\n }\n\nexport const createToolkitsStore = (initProps?: Partial<ContextSlice>) => {\n return createStore<ToolkitsState>()(\n persist(\n (...args) => {\n const [, get, store] = args\n return {\n ...createTokenSlice(...args),\n ...createGameSlice(...args),\n ...createContextSlice(...args),\n ...createLayoutSlice(...args),\n ...initProps,\n clear: () => {\n get().clearToken()\n store.persist.clearStorage()\n },\n }\n },\n {\n name: 'toolkits',\n storage: createJSONStorage(() => mixedStorage),\n partialize: ({ token, appId, user, collapsed }) => ({\n token,\n appId,\n user,\n collapsed,\n }),\n },\n ),\n )\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { ComponentType, FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n\n return useStore(store, selector ?? (state => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<Omit<ContextSlice, 'setContext'>>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore | undefined>(undefined)\n const parentState = useContext(ToolkitsContext)?.getState()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...parentState, ...restProps })\n }\n\n if (!storeRef.current.getState().loginPath) {\n throw new Error('ToolkitsProvider: 请配置 \"loginPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <>{children}</>\n </App>\n </ToolkitsContext.Provider>\n )\n}\n\nexport const withContext = (Component: ComponentType, providerProps: Omit<ToolkitsProviderProps, 'children'>) => {\n const WrappedComponent = (props: any) => {\n return (\n <ToolkitsProvider {...providerProps}>\n <Component {...props} />\n </ToolkitsProvider>\n )\n }\n\n WrappedComponent.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQueryClient } from '@tanstack/react-query'\nimport { App } from 'antd'\nimport ky, { type KyInstance, type Options as KyOptions } from 'ky'\nimport { useMemo } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionVersion, TRUE, UNREGISTERED_FLAG } from '@/constants'\n\n// 响应成功状态码常量\nconst SUCCESS_RESPONSE_CODES = [0, 1, 200] as const\n\n// HTTP 状态码常量\nconst HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n} as const\n\n// 请求超时时间(毫秒)\nconst REQUEST_TIMEOUT = 30000\n\n// 成功响应状态码字段类型\ntype StatusField = 'code' | 'status' | 'errno'\n\n// 状态码检查配置\ninterface StatusCheckConfig {\n field: StatusField\n value: unknown\n allowedCodes: readonly number[]\n}\n\n// 响应类型枚举\nexport enum ResponseType {\n JSON = 'json',\n BLOB = 'blob',\n TEXT = 'text',\n ARRAY_BUFFER = 'arrayBuffer',\n FORM_DATA = 'formData',\n}\n\n// 通用请求选项接口\ninterface RequestOptions extends KyOptions {\n responseType?: ResponseType\n}\n\n// useKy Hook 配置选项\nexport interface UseKyOptions {\n baseURL?: string\n}\n\n// HTTP客户端方法接口 - 支持泛型响应类型\ninterface KyMethods {\n get: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n post: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n put: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n delete: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n patch: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n options: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n head: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n request: <T = any>(options: RequestOptions & { url: string }) => Promise<T>\n instance: KyInstance\n}\n\n// 错误消息提取工具函数\nconst extractErrorMessage = (data: any): string => {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n return data.msg || data.message || data.error || 'Unknown error'\n}\n\n/**\n * 检查单个状态码字段是否成功\n * @param config 状态码检查配置\n * @returns 是否成功\n */\nconst isStatusCodeSuccess = (config: StatusCheckConfig): boolean => {\n const { value, allowedCodes } = config\n\n if (value === undefined || value === null) {\n return false\n }\n\n if (typeof value !== 'number') {\n return false\n }\n\n return allowedCodes.includes(value)\n}\n\n/**\n * 判断响应是否成功\n * @param data 响应数据\n * @param status HTTP状态码\n * @returns 是否成功\n */\nconst isSuccessResponse = (data: any, status: number): boolean => {\n // 如果HTTP状态码不在2xx范围,直接返回失败\n if (status < HTTP_STATUS.OK || status >= 300) {\n return false\n }\n\n // 如果没有响应数据或不是对象,认为成功(可能是空响应)\n if (!data || typeof data !== 'object') {\n return true\n }\n\n // 定义状态码检查配置\n const statusChecks: StatusCheckConfig[] = [\n { field: 'code', value: data.code, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'status', value: data.status, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'errno', value: data.errno, allowedCodes: SUCCESS_RESPONSE_CODES },\n ]\n\n // 检查是否有任何业务状态码字段存在且表示成功\n const hasBusinessStatusCode = statusChecks.some(config => config.value !== undefined && config.value !== null)\n\n // 如果存在业务状态码字段,则必须检查它们是否都表示成功\n if (hasBusinessStatusCode) {\n return statusChecks.every(\n config => config.value === undefined || config.value === null || isStatusCodeSuccess(config),\n )\n }\n\n // 如果没有业务状态码字段,HTTP 2xx 就认为成功\n return true\n}\n\n/**\n * 根据响应类型处理响应数据\n * @param response 响应对象\n * @param responseType 响应类型\n * @returns 处理后的响应数据\n */\nconst processResponseByType = async (response: Response, responseType?: ResponseType): Promise<any> => {\n switch (responseType) {\n case ResponseType.BLOB:\n return response.blob()\n case ResponseType.TEXT:\n return response.text()\n case ResponseType.ARRAY_BUFFER:\n return response.arrayBuffer()\n case ResponseType.FORM_DATA:\n return response.formData()\n case ResponseType.JSON:\n default:\n return response.json()\n }\n}\n\n/**\n * HTTP客户端Hook (基于 Ky) - 内部使用版本\n * @param config 配置选项\n * @returns HTTP客户端方法集合\n */\nexport const useKy = (config?: UseKyOptions): KyMethods => {\n const { baseURL } = config || {}\n const { notification } = App.useApp()\n const navigate = useNavigate()\n const queryClient = useQueryClient()\n\n // 获取工具包状态\n const { token, isGlobal, appId, permissionVersion, loginPath, clear, apiBase, requireGame } = useToolkitsStore()\n\n // 处理未授权错误\n const handleUnauthorized = () => {\n clear()\n // 清除 React Query 缓存\n queryClient.clear()\n navigate(loginPath)\n }\n\n // 处理未注册错误\n const handleUnregistered = () => {\n clear()\n // 清除 React Query 缓存\n queryClient.clear()\n if (loginPath) {\n // 添加未注册参数到登录页 URL\n const url = new URL(loginPath, window.location.origin)\n url.searchParams.set(UNREGISTERED_FLAG, TRUE)\n navigate(url.toString())\n }\n }\n\n // 处理禁止访问错误\n const handleForbidden = () => {\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n }\n\n // 创建响应处理函数\n const createResponseHandler = (responseType?: ResponseType) => {\n return async (_request: any, _options: any, response: Response): Promise<Response> => {\n // 非 JSON 类型直接交由调用方按响应类型读取\n if (\n responseType === ResponseType.BLOB ||\n responseType === ResponseType.ARRAY_BUFFER ||\n responseType === ResponseType.TEXT ||\n responseType === ResponseType.FORM_DATA\n ) {\n return response\n }\n\n // 默认 JSON\n let data: any\n try {\n data = await response.clone().json()\n } catch {\n // 非 JSON 或空响应体,直接返回原响应\n return response\n }\n\n if (isSuccessResponse(data, response.status)) {\n const responseData = data.data !== undefined ? data.data : data\n return new Response(JSON.stringify(responseData), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const errorMessage = extractErrorMessage(data)\n\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n\n const error = new Error(errorMessage)\n ;(error as any).response = response\n ;(error as any).data = data\n throw error\n }\n }\n\n // 处理HTTP状态码错误\n const handleHttpStatusError = (status: number, data: any) => {\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n handleUnauthorized()\n break\n\n case HTTP_STATUS.UNREGISTERED:\n handleUnregistered()\n break\n\n case HTTP_STATUS.FORBIDDEN:\n handleForbidden()\n break\n\n default: {\n // 安全地提取错误消息\n const errorMessage = extractErrorMessage(data) || `HTTP ${status} Error`\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n break\n }\n }\n }\n\n // 创建ky实例\n const instance = useMemo(() => {\n return ky.create({\n prefixUrl: baseURL ?? apiBase,\n retry: 0,\n timeout: REQUEST_TIMEOUT,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n hooks: {\n beforeRequest: [\n request => {\n // 设置认证 headers\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置应用 ID headers\n // 如果不需要游戏选择,或者权限版本为 V1,则不设置 APP-ID header\n if (requireGame && !request.headers.has(APP_ID_HEADER) && permissionVersion !== PermissionVersion.V1) {\n if (isGlobal || !appId) {\n request.headers.set(APP_ID_HEADER, 'global')\n } else {\n // 对 appId 进行 URL 编码以避免非 ASCII 字符导致的 XMLHttpRequest 错误\n request.headers.set(APP_ID_HEADER, encodeURIComponent(String(appId)))\n }\n }\n },\n ],\n beforeError: [\n async error => {\n const { response } = error\n\n if (response) {\n const status = response.status\n let data: any\n\n try {\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json') || contentType.startsWith('text/')) {\n data = await response.clone().json()\n }\n } catch {\n // 忽略 JSON 解析错误\n }\n\n handleHttpStatusError(status, data)\n } else {\n // 网络错误或请求超时等情况\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n }\n\n return error\n },\n ],\n },\n })\n }, [baseURL, token, isGlobal, appId, permissionVersion, notification, loginPath, clear, queryClient])\n\n // 通用请求处理函数\n const makeRequest = async <T = any>(\n method: string,\n url: string,\n data?: any,\n requestOptions?: RequestOptions,\n ): Promise<T> => {\n const { responseType, ...kyOptions } = requestOptions || {}\n\n // 创建带有响应类型处理器的请求选项\n const finalOptions: KyOptions = {\n ...kyOptions,\n hooks: {\n ...kyOptions.hooks,\n afterResponse: [...(kyOptions.hooks?.afterResponse || []), createResponseHandler(responseType)],\n },\n }\n\n let response: Response\n\n if (data) {\n response = await instance(url, { method, json: data, ...finalOptions })\n } else {\n response = await instance(url, { method, ...finalOptions })\n }\n\n // 根据响应类型返回相应数据\n return processResponseByType(response, responseType)\n }\n\n // HTTP方法\n const get = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('GET', url, undefined, options)\n }\n\n const post = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('POST', url, data, options)\n }\n\n const put = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PUT', url, data, options)\n }\n\n const del = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('DELETE', url, undefined, options)\n }\n\n const patch = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PATCH', url, data, options)\n }\n\n const options = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('OPTIONS', url, undefined, requestOptions)\n }\n\n const head = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('HEAD', url, undefined, requestOptions)\n }\n\n const request = <T = any>(requestOptions: RequestOptions & { url: string }): Promise<T> => {\n const { url, ...requestOpts } = requestOptions\n return makeRequest<T>(requestOpts.method || 'GET', url, undefined, requestOpts)\n }\n\n return {\n get,\n post,\n put,\n delete: del,\n patch,\n options,\n head,\n request,\n instance,\n }\n}\n","// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], version: 'v1' | 'v2') => ['permissions', 'check', permissions, version] as const,\n allPermissions: ['permissions', 'all'] as const,\n allPermissionsV2: ['permissions', 'allV2'] as const,\n },\n // 用户相关\n users: {\n all: ['users'] as const,\n detail: (id: string) => ['users', 'detail', id] as const,\n create: ['users', 'create'] as const,\n update: ['users', 'update'] as const,\n delete: ['users', 'delete'] as const,\n },\n // 角色相关\n roles: {\n all: ['roles'] as const,\n detail: (name: string, version: 'v1' | 'v2') => ['roles', 'detail', name, version] as const,\n create: (version: 'v1' | 'v2') => ['roles', 'create', version] as const,\n update: (version: 'v1' | 'v2') => ['roles', 'update', version] as const,\n delete: ['roles', 'delete'] as const,\n },\n // 菜单相关\n menus: {\n all: ['menus'] as const,\n navbar: (appId?: string) => ['menus', 'navbar', appId] as const,\n detail: (id: number) => ['menus', 'detail', id] as const,\n create: ['menus', 'create'] as const,\n update: ['menus', 'update'] as const,\n delete: ['menus', 'delete'] as const,\n },\n // 枚举相关\n enums: {\n gameGroups: ['enums', 'gameGroups'] as const,\n gameIds: (gameGroups: string[]) => ['enums', 'gameIds', gameGroups] as const,\n },\n // 游戏相关\n games: {\n all: ['games', 'all'] as const,\n },\n // 认证相关\n auth: {\n ticketLogin: (ticket: string | null) => ['auth', 'ticket-login', ticket] as const,\n },\n}\n\nexport type QueryKeys = typeof queryKeys\n"]}
@@ -1,2 +1,2 @@
1
- import {a as a$2}from'./chunk-NNXVZIY2.js';import {a as a$1}from'./chunk-DLTAWT6S.js';import {a,b}from'./chunk-P25BHLH3.js';import {Button,Tooltip,Modal,Form}from'antd';import {jsx,Fragment}from'react/jsx-runtime';import {useMemo,useEffect,useState,useCallback}from'react';var N=h=>{let{children:r,code:n,showLoading:l,disabled:a,config:x,...o}=h,u=n?Array.isArray(n)?n:[n]:[],{data:s,isLoading:d}=a$1(u,x),{t:e}=a$2(),y=s&&(typeof s=="boolean"||Object.values(s).some(Boolean)),p=a||!y||d&&!l,c=d&&l,m=p,f=jsx(Button,{disabled:p,loading:c,...o,children:r});return m?jsx(Tooltip,{defaultOpen:false,title:e("global.noEntitlement"),children:f}):f},j=N;var O=a();function w(h){let{content:r,onConfirm:n,afterOpen:l,afterClose:a,...x}=h,o=useMemo(()=>b(),[]),{show:u,hide:s,isOpen:d,cleanup:e}=O();useEffect(()=>()=>{e(o);},[o,e]);let y=d(o),[p,c]=useState(false),m=typeof r=="function",f=useCallback(async()=>{u(o),await l?.();},[o,u,l]),i=useCallback(()=>{s(o);},[o,s]),t=useCallback(async()=>{i(),await a?.();},[i,a]),V=useCallback(async()=>{try{c(!0),await n?.(),i(),await a?.();}catch(b){throw console.error("Modal confirm error:",b),b}finally{c(false);}},[n,i,a]),P=jsx(Modal,{...x,open:y,confirmLoading:p,onOk:V,onCancel:t,children:m?jsx(Fragment,{children:r({hide:i})}):jsx(Fragment,{children:r})});return {id:o,show:f,hide:i,modal:P}}function q(h){let{content:r,form:n,formProps:l,onConfirm:a,onSuccess:x,afterClose:o,...u}=h,[s,d]=useState({}),[e]=Form.useForm(n),y=typeof r=="function",{id:p,show:c,hide:m,modal:f}=w({...u,content:t=>jsx(Form,{...l,form:e,children:y?jsx(Fragment,{children:r(s,t)}):jsx(Fragment,{children:r})}),onConfirm:async()=>{try{let t=await e.validateFields();await a?.(t,s),x?.(),m();}catch(t){throw console.error("Form validation or submission error:",t),t}},afterClose:()=>{d({}),o?.(e);}}),i=useCallback(t=>{let{initialValues:V,extraValues:P}=t||{};P!==void 0&&d(P),V&&e.setFieldsValue(V),c();},[e,c]);return {id:p,show:i,hide:m,modal:f}}export{j as a,O as b,w as c,q as d};//# sourceMappingURL=chunk-D75NVCYN.js.map
2
- //# sourceMappingURL=chunk-D75NVCYN.js.map
1
+ import {a as a$2}from'./chunk-S4LUEDFA.js';import {a as a$1}from'./chunk-SMBHLRAO.js';import {a,b}from'./chunk-3ZT3BOPJ.js';import {Button,Tooltip,Modal,Form}from'antd';import {jsx,Fragment}from'react/jsx-runtime';import {useMemo,useEffect,useState,useCallback}from'react';var N=h=>{let{children:r,code:n,showLoading:l,disabled:a,config:x,...o}=h,u=n?Array.isArray(n)?n:[n]:[],{data:s,isLoading:d}=a$1(u,x),{t:e}=a$2(),y=s&&(typeof s=="boolean"||Object.values(s).some(Boolean)),p=a||!y||d&&!l,c=d&&l,m=p,f=jsx(Button,{disabled:p,loading:c,...o,children:r});return m?jsx(Tooltip,{defaultOpen:false,title:e("global.noEntitlement"),children:f}):f},j=N;var O=a();function w(h){let{content:r,onConfirm:n,afterOpen:l,afterClose:a,...x}=h,o=useMemo(()=>b(),[]),{show:u,hide:s,isOpen:d,cleanup:e}=O();useEffect(()=>()=>{e(o);},[o,e]);let y=d(o),[p,c]=useState(false),m=typeof r=="function",f=useCallback(async()=>{u(o),await l?.();},[o,u,l]),i=useCallback(()=>{s(o);},[o,s]),t=useCallback(async()=>{i(),await a?.();},[i,a]),V=useCallback(async()=>{try{c(!0),await n?.(),i(),await a?.();}catch(b){throw console.error("Modal confirm error:",b),b}finally{c(false);}},[n,i,a]),P=jsx(Modal,{...x,open:y,confirmLoading:p,onOk:V,onCancel:t,children:m?jsx(Fragment,{children:r({hide:i})}):jsx(Fragment,{children:r})});return {id:o,show:f,hide:i,modal:P}}function q(h){let{content:r,form:n,formProps:l,onConfirm:a,onSuccess:x,afterClose:o,...u}=h,[s,d]=useState({}),[e]=Form.useForm(n),y=typeof r=="function",{id:p,show:c,hide:m,modal:f}=w({...u,content:t=>jsx(Form,{...l,form:e,children:y?jsx(Fragment,{children:r(s,t)}):jsx(Fragment,{children:r})}),onConfirm:async()=>{try{let t=await e.validateFields();await a?.(t,s),x?.(),m();}catch(t){throw console.error("Form validation or submission error:",t),t}},afterClose:()=>{d({}),o?.(e);}}),i=useCallback(t=>{let{initialValues:V,extraValues:P}=t||{};P!==void 0&&d(P),V&&e.setFieldsValue(V),c();},[e,c]);return {id:p,show:i,hide:m,modal:f}}export{j as a,O as b,w as c,q as d};//# sourceMappingURL=chunk-D5OM3OZU.js.map
2
+ //# sourceMappingURL=chunk-D5OM3OZU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/authButton/AuthButton.tsx","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx"],"names":["AuthButton","props","children","code","showLoading","disabled","config","restProps","codes","data","isLoading","useAuth","t","useTranslation","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","jsx","Button","Tooltip","AuthButton_default","useModalStore","createVisibilityStore","useModal","content","onConfirm","afterOpen","afterClose","modalProps","_id","useMemo","generateId","show","hide","isOpen","cleanup","useEffect","open","confirmLoading","setConfirmLoading","useState","isRenderFunction","_show","useCallback","_hide","onCancel","onOk","error","internalModal","Modal","Fragment","useFormModal","form","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","Form","id","modal","operation","values","showForm","options","initialValues","extraValues"],"mappings":"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","file":"chunk-D75NVCYN.js","sourcesContent":["import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface AuthButtonProps extends ButtonProps {\n /** 权限码,支持单个或多个 */\n code?: string | string[]\n /** 加载时是否显示 loading 状态 */\n showLoading?: boolean\n /** 请求配置 */\n config?: KyOptions\n}\n\n/**\n * 授权按钮组件\n * 根据权限码自动控制按钮的启用/禁用状态\n * - 有权限:正常显示可点击按钮\n * - 无权限:显示禁用按钮并带有提示\n * - 加载中:显示加载状态\n */\nconst AuthButton: FC<PropsWithChildren<AuthButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = useAuth(codes, config)\n const { t } = useTranslation()\n\n // 判断是否有权限\n const hasPermission = data && (typeof data === 'boolean' || Object.values(data).some(Boolean))\n\n // 计算最终的禁用状态和加载状态\n const isButtonDisabled = disabled || !hasPermission || (isLoading && !showLoading)\n const isButtonLoading = isLoading && showLoading\n\n // 判断是否需要显示 tooltip(任何禁用状态都显示)\n const shouldShowTooltip = isButtonDisabled\n\n const buttonNode = (\n <Button disabled={isButtonDisabled} loading={isButtonLoading} {...restProps}>\n {children}\n </Button>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n {buttonNode}\n </Tooltip>\n )\n }\n\n return buttonNode\n}\n\nexport default AuthButton\n","import { createVisibilityStore } from '@/utils'\n\nexport const useModalStore = createVisibilityStore()\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useModalStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onCancel: ModalProps['onCancel'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const onOk = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n _hide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm, _hide, afterClose])\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Modal>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n modal,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/components/authButton/AuthButton.tsx","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx"],"names":["AuthButton","props","children","code","showLoading","disabled","config","restProps","codes","data","isLoading","useAuth","t","useTranslation","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","jsx","Button","Tooltip","AuthButton_default","useModalStore","createVisibilityStore","useModal","content","onConfirm","afterOpen","afterClose","modalProps","_id","useMemo","generateId","show","hide","isOpen","cleanup","useEffect","open","confirmLoading","setConfirmLoading","useState","isRenderFunction","_show","useCallback","_hide","onCancel","onOk","error","internalModal","Modal","Fragment","useFormModal","form","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","Form","id","modal","operation","values","showForm","options","initialValues","extraValues"],"mappings":"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","file":"chunk-D5OM3OZU.js","sourcesContent":["import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface AuthButtonProps extends ButtonProps {\n /** 权限码,支持单个或多个 */\n code?: string | string[]\n /** 加载时是否显示 loading 状态 */\n showLoading?: boolean\n /** 请求配置 */\n config?: KyOptions\n}\n\n/**\n * 授权按钮组件\n * 根据权限码自动控制按钮的启用/禁用状态\n * - 有权限:正常显示可点击按钮\n * - 无权限:显示禁用按钮并带有提示\n * - 加载中:显示加载状态\n */\nconst AuthButton: FC<PropsWithChildren<AuthButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = useAuth(codes, config)\n const { t } = useTranslation()\n\n // 判断是否有权限\n const hasPermission = data && (typeof data === 'boolean' || Object.values(data).some(Boolean))\n\n // 计算最终的禁用状态和加载状态\n const isButtonDisabled = disabled || !hasPermission || (isLoading && !showLoading)\n const isButtonLoading = isLoading && showLoading\n\n // 判断是否需要显示 tooltip(任何禁用状态都显示)\n const shouldShowTooltip = isButtonDisabled\n\n const buttonNode = (\n <Button disabled={isButtonDisabled} loading={isButtonLoading} {...restProps}>\n {children}\n </Button>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n {buttonNode}\n </Tooltip>\n )\n }\n\n return buttonNode\n}\n\nexport default AuthButton\n","import { createVisibilityStore } from '@/utils'\n\nexport const useModalStore = createVisibilityStore()\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useModalStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onCancel: ModalProps['onCancel'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const onOk = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n _hide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm, _hide, afterClose])\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Modal>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n modal,\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {o,p}from'./chunk-3ZT3BOPJ.js';import {useQueryClient,useMutation}from'@tanstack/react-query';function y(){let u=o(),t=useQueryClient();return useMutation({mutationKey:p.menus.create,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,id:0,is_model:true}),onSuccess:()=>{t.invalidateQueries({queryKey:p.menus.all}),t.invalidateQueries({queryKey:p.menus.navbar()});}})}function l(){let u=o(),t=useQueryClient();return useMutation({mutationKey:p.menus.update,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,is_model:true}),onSuccess:()=>{t.invalidateQueries({queryKey:p.menus.all}),t.invalidateQueries({queryKey:p.menus.navbar()});}})}function c(){let u=o(),t=useQueryClient();return useMutation({mutationKey:p.menus.delete,mutationFn:n=>u.post("/api/usystem/menu/delete",null,{searchParams:{id:n}}),onSuccess:()=>{t.invalidateQueries({queryKey:p.menus.all}),t.invalidateQueries({queryKey:p.menus.navbar()});}})}export{y as a,l as b,c};//# sourceMappingURL=chunk-F3OT6ENF.js.map
2
+ //# sourceMappingURL=chunk-F3OT6ENF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/menu/services/index.ts"],"names":["useCreateMenu","ky","useKy","queryClient","useQueryClient","useMutation","queryKeys","arg","useUpdateMenu","useRemoveMenu","id"],"mappings":"4GAMO,SAASA,GAAgB,CAC9B,IAAMC,CAAAA,CAAKC,GAAAA,GACLC,CAAAA,CAAcC,cAAAA,GAEpB,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,KAAA,CAAM,MAAA,CAC7B,WAAaC,CAAAA,EAAkCN,CAAAA,CAAG,KAAK,uBAAA,CAAyB,CAAE,GAAGM,CAAAA,CAAK,EAAA,CAAI,CAAA,CAAG,QAAA,CAAU,IAAK,CAAC,CAAA,CACjH,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASE,CAAAA,EAAgB,CAC9B,IAAMP,EAAKC,GAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaC,GAAsBN,CAAAA,CAAG,IAAA,CAAK,wBAAyB,CAAE,GAAGM,CAAAA,CAAK,QAAA,CAAU,IAAK,CAAC,CAAA,CAC9F,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASG,CAAAA,EAAgB,CAC9B,IAAMR,EAAKC,GAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaI,GAAeT,CAAAA,CAAG,IAAA,CAAK,2BAA4B,IAAA,CAAM,CAAE,YAAA,CAAc,CAAE,GAAAS,CAAG,CAAE,CAAC,CAAA,CAC9F,SAAA,CAAW,IAAM,CACfP,CAAAA,CAAY,iBAAA,CAAkB,CAAE,SAAUG,CAAAA,CAAU,KAAA,CAAM,GAAI,CAAC,CAAA,CAC/DH,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH","file":"chunk-UPO7NB6O.js","sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query'\n\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) => ky.post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useUpdateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) => ky.post('/api/usystem/menu/set', { ...arg, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useRemoveMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) => ky.post('/api/usystem/menu/delete', null, { searchParams: { id } }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/modules/menu/services/index.ts"],"names":["useCreateMenu","ky","useKy","queryClient","useQueryClient","useMutation","queryKeys","arg","useUpdateMenu","useRemoveMenu","id"],"mappings":"qGAMO,SAASA,GAAgB,CAC9B,IAAMC,CAAAA,CAAKC,CAAAA,GACLC,CAAAA,CAAcC,cAAAA,GAEpB,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,KAAA,CAAM,MAAA,CAC7B,WAAaC,CAAAA,EAAkCN,CAAAA,CAAG,KAAK,uBAAA,CAAyB,CAAE,GAAGM,CAAAA,CAAK,EAAA,CAAI,CAAA,CAAG,QAAA,CAAU,IAAK,CAAC,CAAA,CACjH,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASE,CAAAA,EAAgB,CAC9B,IAAMP,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaC,GAAsBN,CAAAA,CAAG,IAAA,CAAK,wBAAyB,CAAE,GAAGM,CAAAA,CAAK,QAAA,CAAU,IAAK,CAAC,CAAA,CAC9F,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASG,CAAAA,EAAgB,CAC9B,IAAMR,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,CAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaI,GAAeT,CAAAA,CAAG,IAAA,CAAK,2BAA4B,IAAA,CAAM,CAAE,YAAA,CAAc,CAAE,GAAAS,CAAG,CAAE,CAAC,CAAA,CAC9F,SAAA,CAAW,IAAM,CACfP,CAAAA,CAAY,iBAAA,CAAkB,CAAE,SAAUG,CAAAA,CAAU,KAAA,CAAM,GAAI,CAAC,CAAA,CAC/DH,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,CAAAA,CAAU,MAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH","file":"chunk-F3OT6ENF.js","sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query'\n\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) => ky.post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useUpdateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) => ky.post('/api/usystem/menu/set', { ...arg, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useRemoveMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) => ky.post('/api/usystem/menu/delete', null, { searchParams: { id } }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a as a$1,f,g}from'./chunk-3VI7KSDA.js';import {d}from'./chunk-D5OM3OZU.js';import {a}from'./chunk-S4LUEDFA.js';import {l,o,p}from'./chunk-3ZT3BOPJ.js';import {MinusCircleOutlined}from'@ant-design/icons';import {useQuery}from'@tanstack/react-query';import {Typography,App,Form,Input,Select,Row,Col,Empty,Button}from'antd';import {last,first}from'lodash-es';import {Fragment as Fragment$1}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var {Text:A}=Typography,K=(r,t)=>{last(r)==="*"?t?.(["*"]):first(r)==="*"?t?.(r.slice(1)):t?.(r);},Y=r=>{let{onChange:t,...l}=r,s=o(),{data:g,isLoading:p$1}=useQuery({queryKey:p.enums.gameGroups,queryFn:()=>s.get("/api/enum/get?enum=game_group&type=all")}),d=[{label:"\u901A\u7528",value:"*"}].concat(g?.map(a=>({label:a,value:a}))??[]);return jsx(Select,{...l,allowClear:true,showSearch:true,mode:"tags",optionFilterProp:"label",loading:p$1,options:d,onChange:a=>K(a,t)})},k=r=>{let{groups:t,onChange:l$1,...s}=r,g=o(),{permissionVersion:p$1}=l(),d=p$1==="v3",a=p$1==="v4",{data:c,isLoading:h}=useQuery({queryKey:p.enums.gameIds(a?[]:t??[]),queryFn:()=>g.get(`/api/enum/game_group/get_game_ids${a?"":`?game_groups=${t?.join(",")}`}`).then(o=>o?.list),enabled:a||d&&!!t?.length}),y=c?.map(o=>({label:o.name,value:o.id}));return jsx(Select,{...s,allowClear:true,showSearch:true,optionFilterProp:"label",mode:"tags",loading:h,options:y,onChange:o=>K(o,l$1)})},ue=({mode:r,onSuccess:t})=>{let{message:l}=App.useApp(),{t:s}=a(),{data:g$1,isLoading:p}=a$1(),d$1=f(),a$2=g(),c=r==="create",h=s(c?"User.createTitle":"User.updateTitle"),y=jsxs(Fragment,{children:[jsx(Form.Item,{label:s("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!c})}),jsx(Form.Item,{label:s("global.role"),name:"roles",children:jsx(Select,{allowClear:true,showSearch:true,mode:"multiple",loading:p,optionFilterProp:"label",options:g$1?.map(C=>({label:C.name,value:C.name}))})})]});return d({title:h,width:"600px",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:y,onConfirm:async(C,L)=>{c?(await d$1.mutateAsync(C),l.success(s("User.createSuccessfully"))):(await a$2.mutateAsync({...C,id:L?.id}),l.success(s("User.updateSuccessfully"))),t?.();}})},ge=({mode:r,onSuccess:t})=>{let{message:l$1}=App.useApp(),{t:s}=a(),{data:g$1,isLoading:p}=a$1(),d$1=f(),a$2=g(),c=r==="create",h=s(c?"User.createTitle":"User.updateTitle"),{permissionVersion:y}=l(),o=y==="v3",C=jsxs(Fragment,{children:[jsx(Form.Item,{label:s("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!c})}),jsx(Form.List,{name:"permissions",children:(F,{add:U,remove:B})=>jsxs(Row,{gutter:8,children:[o&&jsx(Col,{span:8,className:"text-center mb-4",children:jsx(A,{strong:true,children:s("global.projectGroup")})}),jsx(Col,{span:o?10:14,className:"text-center mb-4",children:jsx(A,{strong:true,children:s("global.game")})}),jsx(Col,{span:o?6:10,className:"text-center mb-4",children:jsx(A,{strong:true,children:s("global.role")})}),F.map(n=>jsxs(Fragment$1,{children:[o&&jsx(Col,{span:8,children:jsx(Form.Item,{noStyle:true,shouldUpdate:true,children:({setFieldValue:i})=>jsx(Form.Item,{name:[n.name,"game_group"],children:jsx(Y,{onChange:()=>{i(["permissions",n.name,"game_ids"],[]);}})})})}),jsx(Col,{span:o?10:14,children:o?jsx(Form.Item,{noStyle:true,shouldUpdate:(i,f)=>i.permissions[n.name]?.game_group!==f.permissions[n.name]?.game_group,children:({getFieldValue:i})=>{let f=i(["permissions",n.name,"game_group"]);return jsx(Form.Item,{name:[n.name,"game_ids"],dependencies:[["permissions",n.name,"game_group"]],rules:[{required:!!f?.length,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(k,{groups:f})})}}):jsx(Form.Item,{name:[n.name,"game_ids"],rules:[{required:true,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(k,{})})}),jsx(Col,{span:o?6:10,children:jsxs("div",{className:"flex",children:[jsx("div",{className:"flex-1",children:jsx(Form.Item,{name:[n.name,"role"],rules:[{required:true,message:"\u8BF7\u9009\u62E9\u89D2\u8272"},({getFieldValue:i})=>({validator(f,D){return i("permissions").filter((v,E)=>!!v&&E!==n.name).some(v=>v.role===D)?Promise.reject(new Error("\u8BF7\u52FF\u91CD\u590D\u9009\u62E9\u89D2\u8272")):Promise.resolve()}})],children:jsx(Select,{allowClear:true,showSearch:true,optionFilterProp:"label",loading:p,options:g$1?.map(i=>({label:i.name,value:i.name}))})})}),jsx("div",{className:"w-8 text-center",children:jsx(Form.Item,{children:jsx(MinusCircleOutlined,{onClick:()=>{B(n.name);}})})})]})})]},n.key)),F.length===0&&jsx(Col,{span:24,children:jsx(Empty,{className:"mb-6"})}),jsx(Col,{span:24,children:jsx(Button,{block:true,type:"dashed",onClick:()=>U(),children:s("global.add")})})]})})]});return d({title:h,width:"1000px",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:C,onConfirm:async(F,U)=>{c?(await d$1.mutateAsync(F),l$1.success(s("User.createSuccessfully"))):(await a$2.mutateAsync({...F,id:U?.id}),l$1.success(s("User.updateSuccessfully"))),t?.();}})};export{ue as a,ge as b};//# sourceMappingURL=chunk-FD52RBG7.js.map
2
+ //# sourceMappingURL=chunk-FD52RBG7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/permission/hooks/user-hooks.tsx"],"names":["Text","Typography","handleWildcardSelection","value","onChange","last","first","GroupSelect","props","rest","ky","useKy","data","isLoading","useQuery","queryKeys","options","group","jsx","Select","GameSelect","groups","permissionVersion","useToolkitsStore","isV3","isV4","response","useUserModal","mode","onSuccess","message","App","t","useTranslation","roles","isRolesLoading","useAllRoles","create","useCreateUser","update","useUpdateUser","isCreateMode","title","content","jsxs","Fragment","Form","Input","role","useFormModal","values","extraValues","useUserModalV2","fields","add","remove","Row","Col","field","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","item","index","MinusCircleOutlined","Empty","Button"],"mappings":"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","file":"chunk-ZF7POJAA.js","sourcesContent":["import { MinusCircleOutlined } from '@ant-design/icons'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Col, Empty, Form, Input, Row, Select, Typography } from 'antd'\nimport { first, last } from 'lodash-es'\nimport { Fragment } from 'react'\nimport { type FC } from 'react'\n\nimport { useToolkitsStore } from '@/components'\nimport { PermissionVersion, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\n\nimport { useAllRoles, useCreateUser, useUpdateUser } from '../services'\n\nconst { Text } = Typography\n\n/**\n * 处理通配符选择逻辑\n * - 如果最后选择的是通配符,则只保留通配符\n * - 如果第一个是通配符但又选择了其他项,则移除通配符\n */\nconst handleWildcardSelection = (value: string[], onChange?: (value: string[]) => void) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n}\n\ninterface GroupSelectProps {\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GroupSelect: FC<GroupSelectProps> = props => {\n const { onChange, ...rest } = props\n const ky = useKy()\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => ky.get<string[]>('/api/enum/get?enum=game_group&type=all'),\n })\n\n const options = [{ label: '通用', value: WILDCARD }].concat(\n data?.map(group => ({ label: group, value: group })) ?? [],\n )\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n mode=\"tags\"\n optionFilterProp=\"label\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface GameSelectProps {\n groups?: string[]\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\n/**\n * 游戏选择组件\n * - V3: 依赖 groups 参数,需要先选择项目组才能加载游戏列表\n * - V4: 不依赖 groups,直接加载所有游戏列表\n */\nconst GameSelect: FC<GameSelectProps> = props => {\n const { groups, onChange, ...rest } = props\n const ky = useKy()\n const { permissionVersion } = useToolkitsStore()\n const isV3 = permissionVersion === PermissionVersion.V3\n const isV4 = permissionVersion === PermissionVersion.V4\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isV4 ? [] : (groups ?? [])),\n queryFn: () =>\n ky\n .get<{\n list: {\n id: string\n name: string\n }[]\n }>(`/api/enum/game_group/get_game_ids${isV4 ? '' : `?game_groups=${groups?.join(',')}`}`)\n .then(response => response?.list),\n enabled: isV4 || (isV3 && !!groups?.length),\n })\n\n const options = data?.map((group: { id: string; name: string }) => ({ label: group.name, value: group.id }))\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n optionFilterProp=\"label\"\n mode=\"tags\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface UserModalFormSchema {\n name: string\n roles: string[]\n}\n\nexport const useUserModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n showSearch\n mode=\"multiple\"\n loading={isRolesLoading}\n optionFilterProp=\"label\"\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (values: UserModalFormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalFormSchema, { id: string }>({\n title,\n width: '600px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n\ninterface UserModalV2FormSchema {\n name: string\n permissions: {\n game_group: string[]\n game_ids: string[]\n role: string\n }[]\n}\n\n/**\n * 用户弹窗 V2 版本(用于 V3 和 V4 权限系统)\n * - V3: 显示项目组选择,游戏列表依赖项目组\n * - V4: 隐藏项目组选择,游戏列表独立加载\n */\nexport const useUserModalV2 = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n const isCreateMode = mode === 'create'\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n const { permissionVersion } = useToolkitsStore()\n const isV3 = permissionVersion === PermissionVersion.V3\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.List name=\"permissions\">\n {(fields, { add, remove }) => (\n <Row gutter={8}>\n {isV3 && (\n <Col span={8} className=\"text-center mb-4\">\n <Text strong>{t('global.projectGroup')}</Text>\n </Col>\n )}\n <Col span={isV3 ? 10 : 14} className=\"text-center mb-4\">\n <Text strong>{t('global.game')}</Text>\n </Col>\n <Col span={isV3 ? 6 : 10} className=\"text-center mb-4\">\n <Text strong>{t('global.role')}</Text>\n </Col>\n {fields.map(field => (\n <Fragment key={field.key}>\n {isV3 && (\n <Col span={8}>\n <Form.Item noStyle shouldUpdate>\n {({ setFieldValue }) => (\n <Form.Item name={[field.name, 'game_group']}>\n <GroupSelect\n onChange={() => {\n setFieldValue(['permissions', field.name, 'game_ids'], [])\n }}\n />\n </Form.Item>\n )}\n </Form.Item>\n </Col>\n )}\n <Col span={isV3 ? 10 : 14}>\n {isV3 ? (\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, nextValues) =>\n prevValues.permissions[field.name]?.game_group !==\n nextValues.permissions[field.name]?.game_group\n }\n >\n {({ getFieldValue }) => {\n const _groups = getFieldValue(['permissions', field.name, 'game_group'])\n\n return (\n <Form.Item\n name={[field.name, 'game_ids']}\n dependencies={[['permissions', field.name, 'game_group']]}\n rules={[{ required: !!_groups?.length, message: '请选择游戏' }]}\n >\n <GameSelect groups={_groups} />\n </Form.Item>\n )\n }}\n </Form.Item>\n ) : (\n <Form.Item name={[field.name, 'game_ids']} rules={[{ required: true, message: '请选择游戏' }]}>\n <GameSelect />\n </Form.Item>\n )}\n </Col>\n <Col span={isV3 ? 6 : 10}>\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Form.Item\n name={[field.name, 'role']}\n rules={[\n { required: true, message: '请选择角色' },\n ({ getFieldValue }) => ({\n validator(_rule, value) {\n const items = getFieldValue('permissions') as UserModalV2FormSchema['permissions']\n const otherItems = items.filter((item, index) => !!item && index !== field.name)\n if (otherItems.some(item => item.role === value)) {\n return Promise.reject(new Error('请勿重复选择角色'))\n }\n return Promise.resolve()\n },\n }),\n ]}\n >\n <Select\n allowClear\n showSearch\n optionFilterProp=\"label\"\n loading={isRolesLoading}\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </div>\n <div className=\"w-8 text-center\">\n <Form.Item>\n <MinusCircleOutlined\n onClick={() => {\n remove(field.name)\n }}\n />\n </Form.Item>\n </div>\n </div>\n </Col>\n </Fragment>\n ))}\n {fields.length === 0 && (\n <Col span={24}>\n <Empty className=\"mb-6\" />\n </Col>\n )}\n <Col span={24}>\n <Button block type=\"dashed\" onClick={() => add()}>\n {t('global.add')}\n </Button>\n </Col>\n </Row>\n )}\n </Form.List>\n </>\n )\n\n const onConfirm = async (values: UserModalV2FormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalV2FormSchema, { id: string }>({\n title,\n width: '1000px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/modules/permission/hooks/user-hooks.tsx"],"names":["Text","Typography","handleWildcardSelection","value","onChange","last","first","GroupSelect","props","rest","ky","useKy","data","isLoading","useQuery","queryKeys","options","group","jsx","Select","GameSelect","groups","permissionVersion","useToolkitsStore","isV3","isV4","response","useUserModal","mode","onSuccess","message","App","t","useTranslation","roles","isRolesLoading","useAllRoles","create","useCreateUser","update","useUpdateUser","isCreateMode","title","content","jsxs","Fragment","Form","Input","role","useFormModal","values","extraValues","useUserModalV2","fields","add","remove","Row","Col","field","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","item","index","MinusCircleOutlined","Empty","Button"],"mappings":"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","file":"chunk-FD52RBG7.js","sourcesContent":["import { MinusCircleOutlined } from '@ant-design/icons'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Col, Empty, Form, Input, Row, Select, Typography } from 'antd'\nimport { first, last } from 'lodash-es'\nimport { Fragment } from 'react'\nimport { type FC } from 'react'\n\nimport { useToolkitsStore } from '@/components'\nimport { PermissionVersion, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\n\nimport { useAllRoles, useCreateUser, useUpdateUser } from '../services'\n\nconst { Text } = Typography\n\n/**\n * 处理通配符选择逻辑\n * - 如果最后选择的是通配符,则只保留通配符\n * - 如果第一个是通配符但又选择了其他项,则移除通配符\n */\nconst handleWildcardSelection = (value: string[], onChange?: (value: string[]) => void) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n}\n\ninterface GroupSelectProps {\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GroupSelect: FC<GroupSelectProps> = props => {\n const { onChange, ...rest } = props\n const ky = useKy()\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => ky.get<string[]>('/api/enum/get?enum=game_group&type=all'),\n })\n\n const options = [{ label: '通用', value: WILDCARD }].concat(\n data?.map(group => ({ label: group, value: group })) ?? [],\n )\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n mode=\"tags\"\n optionFilterProp=\"label\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface GameSelectProps {\n groups?: string[]\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\n/**\n * 游戏选择组件\n * - V3: 依赖 groups 参数,需要先选择项目组才能加载游戏列表\n * - V4: 不依赖 groups,直接加载所有游戏列表\n */\nconst GameSelect: FC<GameSelectProps> = props => {\n const { groups, onChange, ...rest } = props\n const ky = useKy()\n const { permissionVersion } = useToolkitsStore()\n const isV3 = permissionVersion === PermissionVersion.V3\n const isV4 = permissionVersion === PermissionVersion.V4\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isV4 ? [] : (groups ?? [])),\n queryFn: () =>\n ky\n .get<{\n list: {\n id: string\n name: string\n }[]\n }>(`/api/enum/game_group/get_game_ids${isV4 ? '' : `?game_groups=${groups?.join(',')}`}`)\n .then(response => response?.list),\n enabled: isV4 || (isV3 && !!groups?.length),\n })\n\n const options = data?.map((group: { id: string; name: string }) => ({ label: group.name, value: group.id }))\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n optionFilterProp=\"label\"\n mode=\"tags\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface UserModalFormSchema {\n name: string\n roles: string[]\n}\n\nexport const useUserModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n showSearch\n mode=\"multiple\"\n loading={isRolesLoading}\n optionFilterProp=\"label\"\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (values: UserModalFormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalFormSchema, { id: string }>({\n title,\n width: '600px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n\ninterface UserModalV2FormSchema {\n name: string\n permissions: {\n game_group: string[]\n game_ids: string[]\n role: string\n }[]\n}\n\n/**\n * 用户弹窗 V2 版本(用于 V3 和 V4 权限系统)\n * - V3: 显示项目组选择,游戏列表依赖项目组\n * - V4: 隐藏项目组选择,游戏列表独立加载\n */\nexport const useUserModalV2 = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n const isCreateMode = mode === 'create'\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n const { permissionVersion } = useToolkitsStore()\n const isV3 = permissionVersion === PermissionVersion.V3\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.List name=\"permissions\">\n {(fields, { add, remove }) => (\n <Row gutter={8}>\n {isV3 && (\n <Col span={8} className=\"text-center mb-4\">\n <Text strong>{t('global.projectGroup')}</Text>\n </Col>\n )}\n <Col span={isV3 ? 10 : 14} className=\"text-center mb-4\">\n <Text strong>{t('global.game')}</Text>\n </Col>\n <Col span={isV3 ? 6 : 10} className=\"text-center mb-4\">\n <Text strong>{t('global.role')}</Text>\n </Col>\n {fields.map(field => (\n <Fragment key={field.key}>\n {isV3 && (\n <Col span={8}>\n <Form.Item noStyle shouldUpdate>\n {({ setFieldValue }) => (\n <Form.Item name={[field.name, 'game_group']}>\n <GroupSelect\n onChange={() => {\n setFieldValue(['permissions', field.name, 'game_ids'], [])\n }}\n />\n </Form.Item>\n )}\n </Form.Item>\n </Col>\n )}\n <Col span={isV3 ? 10 : 14}>\n {isV3 ? (\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, nextValues) =>\n prevValues.permissions[field.name]?.game_group !==\n nextValues.permissions[field.name]?.game_group\n }\n >\n {({ getFieldValue }) => {\n const _groups = getFieldValue(['permissions', field.name, 'game_group'])\n\n return (\n <Form.Item\n name={[field.name, 'game_ids']}\n dependencies={[['permissions', field.name, 'game_group']]}\n rules={[{ required: !!_groups?.length, message: '请选择游戏' }]}\n >\n <GameSelect groups={_groups} />\n </Form.Item>\n )\n }}\n </Form.Item>\n ) : (\n <Form.Item name={[field.name, 'game_ids']} rules={[{ required: true, message: '请选择游戏' }]}>\n <GameSelect />\n </Form.Item>\n )}\n </Col>\n <Col span={isV3 ? 6 : 10}>\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Form.Item\n name={[field.name, 'role']}\n rules={[\n { required: true, message: '请选择角色' },\n ({ getFieldValue }) => ({\n validator(_rule, value) {\n const items = getFieldValue('permissions') as UserModalV2FormSchema['permissions']\n const otherItems = items.filter((item, index) => !!item && index !== field.name)\n if (otherItems.some(item => item.role === value)) {\n return Promise.reject(new Error('请勿重复选择角色'))\n }\n return Promise.resolve()\n },\n }),\n ]}\n >\n <Select\n allowClear\n showSearch\n optionFilterProp=\"label\"\n loading={isRolesLoading}\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </div>\n <div className=\"w-8 text-center\">\n <Form.Item>\n <MinusCircleOutlined\n onClick={() => {\n remove(field.name)\n }}\n />\n </Form.Item>\n </div>\n </div>\n </Col>\n </Fragment>\n ))}\n {fields.length === 0 && (\n <Col span={24}>\n <Empty className=\"mb-6\" />\n </Col>\n )}\n <Col span={24}>\n <Button block type=\"dashed\" onClick={() => add()}>\n {t('global.add')}\n </Button>\n </Col>\n </Row>\n )}\n </Form.List>\n </>\n )\n\n const onConfirm = async (values: UserModalV2FormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalV2FormSchema, { id: string }>({\n title,\n width: '1000px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-NNXVZIY2.js';import {a as a$1}from'./chunk-DLTAWT6S.js';import {l}from'./chunk-P25BHLH3.js';import {Form,Spin,Table,Result,theme,Space,Button}from'antd';import {forwardRef,useMemo,useRef,useState,useEffect,useCallback,cloneElement,useImperativeHandle,Fragment}from'react';import {jsx,jsxs,Fragment as Fragment$1}from'react/jsx-runtime';import {flushSync}from'react-dom';import {createRoot}from'react-dom/client';import {isEqual}from'lodash-es';import {create}from'zustand';import {devtools,subscribeWithSelector}from'zustand/middleware';import {useQuery}from'@tanstack/react-query';var Ce=d=>{let{extras:i,isConfirming:e,onConfirm:s,onReset:t,children:a$1,buttonsAlign:r="left",showReset:l}=d,{t:u}=a(),{token:{colorFillAlter:b,lineWidth:x,lineType:y,colorBorder:A,borderRadiusLG:V}}=theme.useToken();return jsx("div",{style:{maxWidth:"none",background:b,borderWidth:x,borderStyle:y,borderColor:A,borderRadius:V,padding:24,marginBottom:24},children:jsxs("div",{className:`flex ${r==="bottom"?"flex-col":"flex-row"}`,children:[jsx("div",{className:`${r==="left"?"flex-grow-0":"flex-1"}`,children:a$1}),jsx("div",{className:`${r==="bottom"?"text-end":"text-start"} ml-4`,children:jsxs(Space,{children:[jsx(Button,{type:"primary",disabled:e,onClick:s,children:u("FilterFormWrapper.confirmText")}),i?.map(R=>jsx(Fragment,{children:R.children},R.key)),l&&jsx(Button,{onClick:t,children:u("FilterFormWrapper.resetText")})]})})]})})},z=Ce;var qe=d=>{let i=/(<[^>]*>)/;return d.split(i).filter(e=>e!=="")};function Me(d){let i=document.createElement("div"),e=createRoot(i);return new Promise(s=>{setTimeout(()=>{flushSync(()=>{e.render(d);}),s(i.innerHTML);});})}var We=d=>{let{texts:i,children:e}=d,[s,t]=useState("");return useEffect(()=>{Me(e).then(a=>{let r=qe(a);for(let l of i)for(let u=0;u<r.length;u++)r[u]=r[u].replace(String(l),`<span style='color: #DC143C;'>${l}</span>`);t(r.join(""));});},[e,i]),jsx("div",{dangerouslySetInnerHTML:{__html:s}})},je=We;var ue=Object.freeze({page:1,size:10,filters:Object.freeze({})}),Ke=()=>create()(devtools(subscribeWithSelector((d,i)=>({instances:new Map,registerInstance(e,s,t,a){d(r=>{let l=r.instances.get(e);if(l){if(l.refetch!==a){let x={...l,refetch:a},y=new Map(r.instances);return y.set(e,x),{instances:y}}return r}let u={id:e,url:s,queryKey:t,payload:ue,refetch:a},b=new Map(r.instances);return b.set(e,u),{instances:b}});},unregisterInstance(e){d(s=>{let t=new Map(s.instances);return t.delete(e)?{instances:t}:s});},updatePayload(e,s){d(t=>{let a=t.instances.get(e);if(!a)return t;let r={...a.payload,...s};if(!isEqual(a.payload,r)){let l={...a,payload:r},u=new Map(t.instances);return u.set(e,l),{instances:u}}return t});},getPayload(e){return i().instances.get(e)?.payload??ue},async refetch(e,s){let t=i().instances.get(e);if(!t){console.warn(`QueryList instance with id "${e}" not found`);return}let a=false;if(s){let r=t.payload,l={...r,...s};isEqual(r,l)||(i().updatePayload(e,s),a=true);}if(!a)try{await t.refetch();}catch(r){throw console.error(`Failed to refetch QueryList instance "${e}":`,r),r}},getInstance(e){return i().instances.get(e)},getAllInstances(){return Array.from(i().instances.values())}})),{name:"query-list-store"})),Ue=Ke(),m=Ue;var me=(t=>(t[t.Confirm=0]="Confirm",t[t.Reset=1]="Reset",t[t.Jump=2]="Jump",t[t.Init=3]="Init",t))(me||{}),rt=300*1e3,nt=30*1e3,pe=["GET","HEAD","OPTIONS"],ot=["POST","PUT","PATCH","DELETE"],st={display:"flex",justifyContent:"center",alignItems:"center",height:300},at=0,it=()=>`queryList_${Date.now()}_${++at}`,ct=(d,i)=>{let{t:e}=a(),{form:s,identifier:t,code:a$2,onePage:r,buttonsAlign:l$1,showReset:u,defaultSize:b=10,refreshInterval:x=0,tableExtra:y,renderForm:A,afterSuccess:V,afterError:K,footer:R,pageSizeOptions:U,request:H,dataAdapter:B,...ye}=d,[o]=Form.useForm(s),f=useMemo(()=>t||it(),[t]),Q=useRef(3),{data:E,isLoading:ge}=a$1(a$2),[he,I]=useState(false),q=useRef(false),M=useRef(false),be=m(n=>n.getPayload(f)),Ie=l(),{page:S,size:T=b,filters:h}=be,Le=typeof H=="function"?H({page:S,size:T,filters:h}):H,{url:D,method:$="GET",body:G,searchParams:W,headers:Pe,cacheTime:Fe=rt,staleTime:xe=nt}=Le,v=$.toUpperCase();[...pe,...ot].includes(v)||console.warn(`QueryList: \u4E0D\u652F\u6301\u7684 HTTP \u8BF7\u6C42\u65B9\u6CD5 "${$}"\uFF0C\u5C06\u4F7F\u7528 GET \u65B9\u6CD5`);let Y=pe.includes(v),J={...h,...!r&&{page:S,size:T}},p,L;G!==void 0?(p=G,L=W):W!==void 0?(L=W,p=void 0):Y?(L=J,p=void 0):(p=J,L=void 0);let X=Pe,Z=useRef(false),ee=["queryList",D,f,v,S,T,h,p,L,X],{data:g,isLoading:te,refetch:j}=useQuery({queryKey:ee,queryFn:async()=>{try{let n={method:v,searchParams:L,headers:X};p&&!Y&&(p instanceof FormData||typeof p=="string"?n.body=p:n.json=p);let c=await Ie.request({url:D,...n});return Z.current=!0,V?.(Q.current,o,c),c}catch(n){let c=n instanceof Error?n:new Error(String(n));throw K?.(c,Q.current,o),c}},retry:(n,c)=>!(n>=3||c?.message?.includes("401")),retryDelay:n=>Math.min(1e3*2**n,3e4),refetchOnWindowFocus:false,refetchInterval:Z.current?x:0,gcTime:Fe,staleTime:xe,enabled:E&&he}),re=useMemo(()=>{let n=B,c={total:g?.total,items:g?.list};return typeof n=="function"?{...c,...n(g)}:{...c,...n}},[B,g]);useEffect(()=>(m.getState().registerInstance(f,D,ee,j),()=>{m.getState().unregisterInstance(f);}),[f,D]);let k=re.items,ne=re.total,Re=useMemo(()=>r?false:{pageSizeOptions:U,showSizeChanger:true,showQuickJumper:true,current:S,pageSize:T,total:ne,onChange:async(n,c)=>{Q.current=2,m.getState().refetch(f,{page:n,size:c});}},[r,U,S,T,ne,f]),oe=useCallback(async()=>{Q.current=0;try{await o.validateFields(),I(!0),m.getState().refetch(f,{page:1,filters:o.getFieldsValue()});}catch{I(false);}},[o,f]),Qe=useCallback(async()=>{Q.current=1,o.resetFields();try{await o.validateFields({validateOnly:!0}),I(!0),m.getState().refetch(f,{page:1,filters:o.getFieldsValue()});}catch{I(false);}},[o,f]),Se=typeof A=="function"?jsx(z,{showReset:u,buttonsAlign:l$1,isConfirming:te,onReset:Qe,onConfirm:oe,children:cloneElement(A(o),{onKeyUp:n=>{n.key==="Enter"&&oe();}})}):jsx(Form,{form:o}),Te=typeof y=="function"?y(o,g):y,Ae=R?()=>jsx(Fragment$1,{children:R(g)}):void 0;return useEffect(()=>{if(!q.current||M.current)return;let n=o.getFieldsValue();h&&!isEqual(n,h)&&(M.current=true,o.setFieldsValue(h),setTimeout(()=>{M.current=false;},0));},[h,o]),useEffect(()=>{if(!E||q.current)return;let n=async()=>{console.log("QueryList init starting");try{o.resetFields();let C=await o.validateFields({validateOnly:!0});console.log("QueryList init validation success:",C),m.getState().updatePayload(f,{page:1,filters:C}),I(!0),console.log("QueryList init completed, isValid set to true");}catch(C){console.log("QueryList init validation failed:",C),I(false);}finally{q.current=true;}},c=requestAnimationFrame(()=>{Promise.resolve().then(n);});return ()=>{c&&cancelAnimationFrame(c);}},[E,f,o]),useImperativeHandle(i,()=>({data:g,dataSource:k,form:o,refetch:j}),[g,k,o,j]),ge?jsx(Spin,{style:st}):E?jsxs("div",{children:[Se,Te,jsx(Table,{...ye,dataSource:k,loading:te,pagination:Re,footer:Ae})]}):jsx(Result,{status:403,subTitle:e("global.noEntitlement")})},lt=forwardRef(ct),ut=lt;export{z as a,je as b,m as c,me as d,ut as e};//# sourceMappingURL=chunk-ST7VUWJ4.js.map
2
- //# sourceMappingURL=chunk-ST7VUWJ4.js.map
1
+ import {a}from'./chunk-S4LUEDFA.js';import {a as a$1}from'./chunk-SMBHLRAO.js';import {o}from'./chunk-3ZT3BOPJ.js';import {Form,Spin,Table,Result,theme,Space,Button}from'antd';import {forwardRef,useMemo,useRef,useState,useEffect,useCallback,cloneElement,useImperativeHandle,Fragment}from'react';import {jsx,jsxs,Fragment as Fragment$1}from'react/jsx-runtime';import {flushSync}from'react-dom';import {createRoot}from'react-dom/client';import {isEqual}from'lodash-es';import {create}from'zustand';import {devtools,subscribeWithSelector}from'zustand/middleware';import {useQuery}from'@tanstack/react-query';var Ce=d=>{let{extras:i,isConfirming:e,onConfirm:s,onReset:t,children:a$1,buttonsAlign:r="left",showReset:l}=d,{t:u}=a(),{token:{colorFillAlter:b,lineWidth:x,lineType:y,colorBorder:A,borderRadiusLG:V}}=theme.useToken();return jsx("div",{style:{maxWidth:"none",background:b,borderWidth:x,borderStyle:y,borderColor:A,borderRadius:V,padding:24,marginBottom:24},children:jsxs("div",{className:`flex ${r==="bottom"?"flex-col":"flex-row"}`,children:[jsx("div",{className:`${r==="left"?"flex-grow-0":"flex-1"}`,children:a$1}),jsx("div",{className:`${r==="bottom"?"text-end":"text-start"} ml-4`,children:jsxs(Space,{children:[jsx(Button,{type:"primary",disabled:e,onClick:s,children:u("FilterFormWrapper.confirmText")}),i?.map(R=>jsx(Fragment,{children:R.children},R.key)),l&&jsx(Button,{onClick:t,children:u("FilterFormWrapper.resetText")})]})})]})})},z=Ce;var qe=d=>{let i=/(<[^>]*>)/;return d.split(i).filter(e=>e!=="")};function Me(d){let i=document.createElement("div"),e=createRoot(i);return new Promise(s=>{setTimeout(()=>{flushSync(()=>{e.render(d);}),s(i.innerHTML);});})}var We=d=>{let{texts:i,children:e}=d,[s,t]=useState("");return useEffect(()=>{Me(e).then(a=>{let r=qe(a);for(let l of i)for(let u=0;u<r.length;u++)r[u]=r[u].replace(String(l),`<span style='color: #DC143C;'>${l}</span>`);t(r.join(""));});},[e,i]),jsx("div",{dangerouslySetInnerHTML:{__html:s}})},je=We;var ue=Object.freeze({page:1,size:10,filters:Object.freeze({})}),Ke=()=>create()(devtools(subscribeWithSelector((d,i)=>({instances:new Map,registerInstance(e,s,t,a){d(r=>{let l=r.instances.get(e);if(l){if(l.refetch!==a){let x={...l,refetch:a},y=new Map(r.instances);return y.set(e,x),{instances:y}}return r}let u={id:e,url:s,queryKey:t,payload:ue,refetch:a},b=new Map(r.instances);return b.set(e,u),{instances:b}});},unregisterInstance(e){d(s=>{let t=new Map(s.instances);return t.delete(e)?{instances:t}:s});},updatePayload(e,s){d(t=>{let a=t.instances.get(e);if(!a)return t;let r={...a.payload,...s};if(!isEqual(a.payload,r)){let l={...a,payload:r},u=new Map(t.instances);return u.set(e,l),{instances:u}}return t});},getPayload(e){return i().instances.get(e)?.payload??ue},async refetch(e,s){let t=i().instances.get(e);if(!t){console.warn(`QueryList instance with id "${e}" not found`);return}let a=false;if(s){let r=t.payload,l={...r,...s};isEqual(r,l)||(i().updatePayload(e,s),a=true);}if(!a)try{await t.refetch();}catch(r){throw console.error(`Failed to refetch QueryList instance "${e}":`,r),r}},getInstance(e){return i().instances.get(e)},getAllInstances(){return Array.from(i().instances.values())}})),{name:"query-list-store"})),Ue=Ke(),m=Ue;var me=(t=>(t[t.Confirm=0]="Confirm",t[t.Reset=1]="Reset",t[t.Jump=2]="Jump",t[t.Init=3]="Init",t))(me||{}),rt=300*1e3,nt=30*1e3,pe=["GET","HEAD","OPTIONS"],ot=["POST","PUT","PATCH","DELETE"],st={display:"flex",justifyContent:"center",alignItems:"center",height:300},at=0,it=()=>`queryList_${Date.now()}_${++at}`,ct=(d,i)=>{let{t:e}=a(),{form:s,identifier:t,code:a$2,onePage:r,buttonsAlign:l,showReset:u,defaultSize:b=10,refreshInterval:x=0,tableExtra:y,renderForm:A,afterSuccess:V,afterError:K,footer:R,pageSizeOptions:U,request:H,dataAdapter:B,...ye}=d,[o$1]=Form.useForm(s),f=useMemo(()=>t||it(),[t]),Q=useRef(3),{data:E,isLoading:ge}=a$1(a$2),[he,I]=useState(false),q=useRef(false),M=useRef(false),be=m(n=>n.getPayload(f)),Ie=o(),{page:S,size:T=b,filters:h}=be,Le=typeof H=="function"?H({page:S,size:T,filters:h}):H,{url:D,method:$="GET",body:G,searchParams:W,headers:Pe,cacheTime:Fe=rt,staleTime:xe=nt}=Le,v=$.toUpperCase();[...pe,...ot].includes(v)||console.warn(`QueryList: \u4E0D\u652F\u6301\u7684 HTTP \u8BF7\u6C42\u65B9\u6CD5 "${$}"\uFF0C\u5C06\u4F7F\u7528 GET \u65B9\u6CD5`);let Y=pe.includes(v),J={...h,...!r&&{page:S,size:T}},p,L;G!==void 0?(p=G,L=W):W!==void 0?(L=W,p=void 0):Y?(L=J,p=void 0):(p=J,L=void 0);let X=Pe,Z=useRef(false),ee=["queryList",D,f,v,S,T,h,p,L,X],{data:g,isLoading:te,refetch:j}=useQuery({queryKey:ee,queryFn:async()=>{try{let n={method:v,searchParams:L,headers:X};p&&!Y&&(p instanceof FormData||typeof p=="string"?n.body=p:n.json=p);let c=await Ie.request({url:D,...n});return Z.current=!0,V?.(Q.current,o$1,c),c}catch(n){let c=n instanceof Error?n:new Error(String(n));throw K?.(c,Q.current,o$1),c}},retry:(n,c)=>!(n>=3||c?.message?.includes("401")),retryDelay:n=>Math.min(1e3*2**n,3e4),refetchOnWindowFocus:false,refetchInterval:Z.current?x:0,gcTime:Fe,staleTime:xe,enabled:E&&he}),re=useMemo(()=>{let n=B,c={total:g?.total,items:g?.list};return typeof n=="function"?{...c,...n(g)}:{...c,...n}},[B,g]);useEffect(()=>(m.getState().registerInstance(f,D,ee,j),()=>{m.getState().unregisterInstance(f);}),[f,D]);let k=re.items,ne=re.total,Re=useMemo(()=>r?false:{pageSizeOptions:U,showSizeChanger:true,showQuickJumper:true,current:S,pageSize:T,total:ne,onChange:async(n,c)=>{Q.current=2,m.getState().refetch(f,{page:n,size:c});}},[r,U,S,T,ne,f]),oe=useCallback(async()=>{Q.current=0;try{await o$1.validateFields(),I(!0),m.getState().refetch(f,{page:1,filters:o$1.getFieldsValue()});}catch{I(false);}},[o$1,f]),Qe=useCallback(async()=>{Q.current=1,o$1.resetFields();try{await o$1.validateFields({validateOnly:!0}),I(!0),m.getState().refetch(f,{page:1,filters:o$1.getFieldsValue()});}catch{I(false);}},[o$1,f]),Se=typeof A=="function"?jsx(z,{showReset:u,buttonsAlign:l,isConfirming:te,onReset:Qe,onConfirm:oe,children:cloneElement(A(o$1),{onKeyUp:n=>{n.key==="Enter"&&oe();}})}):jsx(Form,{form:o$1}),Te=typeof y=="function"?y(o$1,g):y,Ae=R?()=>jsx(Fragment$1,{children:R(g)}):void 0;return useEffect(()=>{if(!q.current||M.current)return;let n=o$1.getFieldsValue();h&&!isEqual(n,h)&&(M.current=true,o$1.setFieldsValue(h),setTimeout(()=>{M.current=false;},0));},[h,o$1]),useEffect(()=>{if(!E||q.current)return;let n=async()=>{console.log("QueryList init starting");try{o$1.resetFields();let C=await o$1.validateFields({validateOnly:!0});console.log("QueryList init validation success:",C),m.getState().updatePayload(f,{page:1,filters:C}),I(!0),console.log("QueryList init completed, isValid set to true");}catch(C){console.log("QueryList init validation failed:",C),I(false);}finally{q.current=true;}},c=requestAnimationFrame(()=>{Promise.resolve().then(n);});return ()=>{c&&cancelAnimationFrame(c);}},[E,f,o$1]),useImperativeHandle(i,()=>({data:g,dataSource:k,form:o$1,refetch:j}),[g,k,o$1,j]),ge?jsx(Spin,{style:st}):E?jsxs("div",{children:[Se,Te,jsx(Table,{...ye,dataSource:k,loading:te,pagination:Re,footer:Ae})]}):jsx(Result,{status:403,subTitle:e("global.noEntitlement")})},lt=forwardRef(ct),ut=lt;export{z as a,je as b,m as c,me as d,ut as e};//# sourceMappingURL=chunk-IWPBGSXS.js.map
2
+ //# sourceMappingURL=chunk-IWPBGSXS.js.map