react-toolkits 2.22.7 → 2.22.9
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.
- package/CHANGELOG.md +12 -0
- package/README.md +297 -26
- package/lib/chunk-3OYXD4UE.js +1 -0
- package/lib/chunk-4GULXGNG.js +1 -0
- package/lib/chunk-7NM3DK6A.js +1 -0
- package/lib/chunk-FXPGR372.js +0 -0
- package/lib/chunk-JIBSYGRB.js +1 -0
- package/lib/chunk-JTDKSGJR.js +1 -0
- package/lib/chunk-K5HXGCZ4.js +1 -0
- package/lib/chunk-LRMME3YZ.js +2 -0
- package/lib/chunk-OLM4QNJB.js +1 -0
- package/lib/chunk-P5SX5RW3.js +1 -0
- package/lib/chunk-RITI5HRV.js +1 -0
- package/lib/chunk-TRRCT3ST.js +1 -0
- package/lib/chunk-TYDTFWYK.js +1 -0
- package/lib/chunk-WHOTHZUW.js +1 -0
- package/lib/chunk-X6ZI7RL7.js +1 -0
- package/lib/chunk-XQERUQGQ.js +1 -0
- package/lib/chunk-XWIQENHQ.js +2 -0
- package/lib/components.d.ts +530 -0
- package/lib/components.js +1 -0
- package/lib/components.js.map +1 -0
- package/lib/constants.d.ts +11 -0
- package/lib/constants.js +1 -0
- package/lib/constants.js.map +1 -0
- package/lib/createMenuItem-HUQG2HQY.js +1 -0
- package/lib/index.css.map +1 -0
- package/lib/index.d.ts +20 -789
- package/lib/index.js +1 -2
- package/lib/index.js.map +1 -0
- package/lib/menuItemList-AS6ZDOTZ.js +1 -0
- package/lib/modules.d.ts +7 -0
- package/lib/modules.js +1 -0
- package/lib/modules.js.map +1 -0
- package/lib/pages.d.ts +20 -0
- package/lib/pages.js +1 -0
- package/lib/pages.js.map +1 -0
- package/lib/roleDetail-PFVKUPYB.js +1 -0
- package/lib/roleList-AHH4PNYW.js +1 -0
- package/lib/services.d.ts +196 -0
- package/lib/services.js +1 -0
- package/lib/services.js.map +1 -0
- package/lib/types-DVKf5poe.d.ts +19 -0
- package/lib/types.d.ts +23 -0
- package/lib/types.js +1 -0
- package/lib/types.js.map +1 -0
- package/lib/updateMenuItem-7SUIOBXS.js +1 -0
- package/lib/userDetail-JJNDBV5T.js +1 -0
- package/lib/userList-KX3POGAU.js +1 -0
- package/lib/utils.d.ts +6 -0
- package/lib/utils.js +1 -0
- package/lib/utils.js.map +1 -0
- package/locale/chunk-GHHHKGNN.js +1 -0
- package/locale/context.js +9 -1
- package/locale/context.js.map +1 -0
- package/locale/en_GB.js +96 -1
- package/locale/en_GB.js.map +1 -0
- package/locale/hooks.js +29 -1
- package/locale/hooks.js.map +1 -0
- package/locale/index.js +29 -1
- package/locale/index.js.map +1 -0
- package/locale/ja_JP.js +96 -1
- package/locale/ja_JP.js.map +1 -0
- package/locale/ko_KR.js +96 -1
- package/locale/ko_KR.js.map +1 -0
- package/locale/zh_CN.js +96 -1
- package/locale/zh_CN.js.map +1 -0
- package/package.json +31 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# react-toolkits
|
|
2
2
|
|
|
3
|
+
## 2.22.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 92b3c0f: 新增多个子路径导出,优化包结构,提升Tree Shaking支持。同时更新README文档,增加特性描述和安装说明,确保用户更易于使用和理解。
|
|
8
|
+
|
|
9
|
+
## 2.22.8
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 779d222: 优化QueryList组件,统一使用filters替代formValue
|
|
14
|
+
|
|
3
15
|
## 2.22.7
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,44 +1,315 @@
|
|
|
1
1
|
# React Toolkits
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一套面向企业级应用的前端工具集,基于 React、Ant Design 与 TanStack Query。开箱即用的应用壳、权限/菜单、通用列表(分页/无限滚动)、抽屉/弹框表单与国际化支持,助你快速搭建一致、可维护的中后台应用。
|
|
4
|
+
|
|
5
|
+
## 亮点特性
|
|
6
|
+
|
|
7
|
+
- 应用壳与导航:`Layout`、侧边菜单、面包屑、登录页、404
|
|
8
|
+
- 列表范式:`QueryList`(分页)、`InfiniteList`(无限滚动)
|
|
9
|
+
- 表单弹层:`useFormModal`、`useFormDrawer`
|
|
10
|
+
- 权限体系:`RequirePermission`、`PermissionButton`,以及权限/菜单路由片段
|
|
11
|
+
- 数据获取:内置 `useKy` 与服务层 hooks(如 `usePermission`、`useMenuList`、`useGames`)
|
|
12
|
+
- 子路径导出按域组织,Tree Shaking 友好
|
|
13
|
+
|
|
14
|
+
## 安装与要求
|
|
4
15
|
|
|
5
16
|
```bash
|
|
6
|
-
pnpm
|
|
17
|
+
pnpm add react-toolkits
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
对等依赖(需由你的应用提供):
|
|
21
|
+
|
|
22
|
+
- react、react-dom:^18
|
|
23
|
+
- antd:^5
|
|
24
|
+
- react-router-dom:^6
|
|
25
|
+
|
|
26
|
+
样式:
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import 'react-toolkits/style.css'
|
|
7
30
|
```
|
|
8
31
|
|
|
9
|
-
##
|
|
32
|
+
## 快速上手
|
|
10
33
|
|
|
11
34
|
```tsx
|
|
12
35
|
import 'react-toolkits/style.css'
|
|
13
36
|
import { createRoot } from 'react-dom/client'
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
37
|
+
import { RouterProvider } from 'react-router-dom'
|
|
38
|
+
import { ToolkitsProvider } from 'react-toolkits/components'
|
|
39
|
+
import { PermissionVersion } from 'react-toolkits/constants'
|
|
16
40
|
|
|
17
|
-
|
|
18
|
-
const root = createRoot(container)
|
|
41
|
+
import router from './router'
|
|
19
42
|
|
|
20
|
-
const
|
|
43
|
+
const root = createRoot(document.getElementById('root') as HTMLElement)
|
|
21
44
|
|
|
22
45
|
root.render(
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
width: '100vw',
|
|
33
|
-
height: '100vh',
|
|
34
|
-
}}
|
|
35
|
-
/>
|
|
36
|
-
}
|
|
37
|
-
/>
|
|
38
|
-
</ContextProvider>,
|
|
46
|
+
<ToolkitsProvider
|
|
47
|
+
collapsible
|
|
48
|
+
gameApiV2
|
|
49
|
+
permissionVersion={PermissionVersion.V3}
|
|
50
|
+
signInPath="/sign_in"
|
|
51
|
+
mainPagePath="/"
|
|
52
|
+
>
|
|
53
|
+
<RouterProvider router={router} />
|
|
54
|
+
</ToolkitsProvider>,
|
|
39
55
|
)
|
|
40
56
|
```
|
|
41
57
|
|
|
42
|
-
|
|
58
|
+
### 配置项(`ToolkitsProvider`)
|
|
59
|
+
|
|
60
|
+
- **signInPath**: 登录页路径(未鉴权时会跳转)
|
|
61
|
+
- **mainPagePath**: 登录后主页路径(鉴权通过时进入)
|
|
62
|
+
- **permissionVersion**: 权限版本,建议使用 `PermissionVersion.V3`
|
|
63
|
+
- **collapsible**: 侧边栏是否可折叠
|
|
64
|
+
- **gameApiV2**: 是否启用游戏相关 V2 接口适配(如不涉及可忽略)
|
|
65
|
+
- 其余高级配置见类型定义 `react-toolkits/components` 内导出的 Provider Props
|
|
66
|
+
|
|
67
|
+
## 子路径导出(推荐)
|
|
68
|
+
|
|
69
|
+
- `react-toolkits/components`:组件与 Hooks(如 `Layout`、`ToolkitsProvider`、`useFormDrawer`、`InfiniteList`)
|
|
70
|
+
- `react-toolkits/pages`:内置页面与路由片段(如 `permissionRoutes`、`menuRoutes`、`SignIn`)
|
|
71
|
+
- `react-toolkits/services`:请求相关 Hooks(如 `usePermission`、`useMenuList`、`useGames`)
|
|
72
|
+
- `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`PermissionVersion`)
|
|
73
|
+
- `react-toolkits/types`:公共类型
|
|
74
|
+
- `react-toolkits/utils`:工具函数
|
|
75
|
+
- `react-toolkits/locale` 与 `react-toolkits/locale/*`:国际化资源与工具
|
|
76
|
+
|
|
77
|
+
示例:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { Layout, useFormDrawer } from 'react-toolkits/components'
|
|
81
|
+
import { permissionRoutes } from 'react-toolkits/pages'
|
|
82
|
+
import { usePermission } from 'react-toolkits/services'
|
|
83
|
+
import { APP_ID_HEADER } from 'react-toolkits/constants'
|
|
84
|
+
import type { NavMenuItem } from 'react-toolkits/types'
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 权限与菜单集成示例
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import { createBrowserRouter } from 'react-router-dom'
|
|
91
|
+
import { Layout } from 'react-toolkits/components'
|
|
92
|
+
import { permissionRoutes, menuRoutes, SignIn } from 'react-toolkits/pages'
|
|
93
|
+
|
|
94
|
+
const router = createBrowserRouter([
|
|
95
|
+
{
|
|
96
|
+
path: '/',
|
|
97
|
+
element: <Layout />, // 自动接入面包屑、侧边栏与鉴权
|
|
98
|
+
children: [
|
|
99
|
+
// 权限/菜单内置片段(可按需选择)
|
|
100
|
+
...permissionRoutes,
|
|
101
|
+
...menuRoutes,
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{ path: '/sign_in', element: <SignIn /> },
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
export default router
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 国际化(Locale)
|
|
111
|
+
|
|
112
|
+
内置基础语言包与上下文工具,也可与第三方 i18n 方案并存:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
import { useTranslation } from 'react-toolkits/locale'
|
|
116
|
+
import zhCN from 'react-toolkits/locale/zh_CN'
|
|
117
|
+
import enGB from 'react-toolkits/locale/en_GB'
|
|
118
|
+
|
|
119
|
+
const { t } = useTranslation()
|
|
120
|
+
// t('FilterFormWrapper.confirmText') → "查询"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
如果你已使用 `react-i18next` 等,可以仅复用本包的页面/菜单能力。
|
|
124
|
+
|
|
125
|
+
### 自定义菜单文案
|
|
126
|
+
|
|
127
|
+
- 使用 `react-toolkits/locale` 的 `useTranslation` 配合内置 key,或在你的 i18n 方案中映射同名 key
|
|
128
|
+
- 可按需引入 `react-toolkits/locale/zh_CN`、`en_GB` 等作为基础词条
|
|
129
|
+
|
|
130
|
+
## 目录结构(概览)
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
src/
|
|
134
|
+
components/ // 组件与 Hooks(以 react-toolkits/components 导出)
|
|
135
|
+
features/ // 特性模块(权限/菜单等:hooks/组件/服务聚合)
|
|
136
|
+
pages/ // 内置页面与路由片段
|
|
137
|
+
services/ // 数据服务 hooks(依赖 libs/ky 与全局上下文)
|
|
138
|
+
constants/ // 常量与枚举
|
|
139
|
+
utils/ // 工具函数
|
|
140
|
+
locale/ // 国际化上下文与语言包
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 常用用法示例
|
|
144
|
+
|
|
145
|
+
### 列表(分页 `QueryList`)
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
import { QueryList } from 'react-toolkits/components'
|
|
149
|
+
|
|
150
|
+
export default function UserTable() {
|
|
151
|
+
return (
|
|
152
|
+
<QueryList
|
|
153
|
+
queryKey={['users']}
|
|
154
|
+
queryFn={async ({ page, pageSize }) => {
|
|
155
|
+
// 返回 { list: T[]; total: number }
|
|
156
|
+
const res = await fetch(`/api/users?page=${page}&pageSize=${pageSize}`)
|
|
157
|
+
return res.json()
|
|
158
|
+
}}
|
|
159
|
+
columns={[
|
|
160
|
+
{ title: 'ID', dataIndex: 'id' },
|
|
161
|
+
{ title: 'Name', dataIndex: 'name' },
|
|
162
|
+
]}
|
|
163
|
+
/>
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 列表(无限滚动 `InfiniteList`)
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import { InfiniteList } from 'react-toolkits/components'
|
|
172
|
+
|
|
173
|
+
export default function LogList() {
|
|
174
|
+
return (
|
|
175
|
+
<InfiniteList
|
|
176
|
+
queryKey={['logs']}
|
|
177
|
+
queryFn={async ({ pageParam = 1 }) => {
|
|
178
|
+
// 返回 { list: T[]; nextPage?: number }
|
|
179
|
+
const res = await fetch(`/api/logs?page=${pageParam}`)
|
|
180
|
+
return res.json()
|
|
181
|
+
}}
|
|
182
|
+
itemRender={item => <div>{item.message}</div>}
|
|
183
|
+
/>
|
|
184
|
+
)
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 表单弹层(`useFormDrawer`)
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
import { Button } from 'antd'
|
|
192
|
+
import { useFormDrawer } from 'react-toolkits/components'
|
|
193
|
+
|
|
194
|
+
export default function CreateUser() {
|
|
195
|
+
const { show, drawer } = useFormDrawer({
|
|
196
|
+
title: '新建用户',
|
|
197
|
+
onSubmit: async values => {
|
|
198
|
+
await fetch('/api/users', { method: 'POST', body: JSON.stringify(values) })
|
|
199
|
+
},
|
|
200
|
+
schema: [
|
|
201
|
+
{ name: 'name', label: '姓名', type: 'input' },
|
|
202
|
+
{ name: 'role', label: '角色', type: 'select', options: ['admin', 'user'] },
|
|
203
|
+
],
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<>
|
|
208
|
+
<Button onClick={show}>新建</Button>
|
|
209
|
+
{drawer}
|
|
210
|
+
</>
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 服务层 Hooks(`react-toolkits/services`)
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
import { usePermission, useMenuList } from 'react-toolkits/services'
|
|
219
|
+
|
|
220
|
+
export function UseDataExample() {
|
|
221
|
+
const { data: permissions } = usePermission()
|
|
222
|
+
const { data: menus } = useMenuList()
|
|
223
|
+
// 根据你的业务渲染
|
|
224
|
+
return null
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Ky 与请求拦截(`useKy`)
|
|
229
|
+
|
|
230
|
+
- 内置 `useKy` 封装了鉴权与 `APP_ID_HEADER` 注入逻辑,结合 Provider 的上下文使用
|
|
231
|
+
- 你也可以直接使用 `fetch`,但推荐统一通过 `services` 或 `useKy`
|
|
232
|
+
|
|
233
|
+
```tsx
|
|
234
|
+
import { useEffect } from 'react'
|
|
235
|
+
import { useKy } from 'react-toolkits/components'
|
|
236
|
+
import { APP_ID_HEADER } from 'react-toolkits/constants'
|
|
237
|
+
|
|
238
|
+
export default function FetchWithKy() {
|
|
239
|
+
const ky = useKy({
|
|
240
|
+
headers: {
|
|
241
|
+
[APP_ID_HEADER]: 'my-app-id',
|
|
242
|
+
},
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
useEffect(() => {
|
|
246
|
+
ky.get('/api/ping').json()
|
|
247
|
+
}, [ky])
|
|
248
|
+
|
|
249
|
+
return null
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
提示:若你的应用已有全局请求层,可仅复用本包页面/组件,将头与鉴权逻辑放到你的层中保持一致性。
|
|
254
|
+
|
|
255
|
+
## 迁移指南(从根导入 → 子路径导出)
|
|
256
|
+
|
|
257
|
+
过去:
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
import { ToolkitsProvider, Layout } from 'react-toolkits'
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
现在(推荐):
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
import { ToolkitsProvider, Layout } from 'react-toolkits/components'
|
|
267
|
+
import { permissionRoutes } from 'react-toolkits/pages'
|
|
268
|
+
import { usePermission } from 'react-toolkits/services'
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
收益:边界清晰、按需打包更友好(Tree Shaking)。
|
|
272
|
+
|
|
273
|
+
### 权限版本兼容
|
|
274
|
+
|
|
275
|
+
- 历史上存在不同权限数据结构,`PermissionVersion` 用于适配后端变体
|
|
276
|
+
- 新项目建议使用 `V3`;旧项目如为 `V2`,只需在 `ToolkitsProvider` 中切换版本
|
|
277
|
+
|
|
278
|
+
## 常见问题(FAQ)
|
|
279
|
+
|
|
280
|
+
- 如何引入样式?
|
|
281
|
+
- 在应用入口一次性引入:`import 'react-toolkits/style.css'`
|
|
282
|
+
- Provider 放哪?
|
|
283
|
+
- 在应用根部使用 `ToolkitsProvider`,传入登录路径、主页路径、权限版本等配置。
|
|
284
|
+
- 如何自定义菜单?
|
|
285
|
+
- 通过 `Layout` 的 `items` 或参考示例应用的 `menu-items.tsx`。
|
|
286
|
+
- 如何统一请求与拦截?
|
|
287
|
+
- 使用 `useKy` 或 `services` 中的 hooks(自动注入鉴权与 App-ID 头)。
|
|
288
|
+
- 若需要自定义拦截,传入 `useKy` 的配置或在应用层包裹一层。
|
|
289
|
+
- 列表的数据结构需要什么格式?
|
|
290
|
+
- 分页:`{ list: T[]; total: number }`;无限滚动:`{ list: T[]; nextPage?: number }`
|
|
291
|
+
- 可以只用页面和路由,不用 Provider 吗?
|
|
292
|
+
- 不建议。多数功能依赖上下文(鉴权、国际化、请求)。若必须,请自行在应用层提供等价上下文。
|
|
293
|
+
|
|
294
|
+
## 本地开发与构建
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# 构建
|
|
298
|
+
pnpm -C packages/react-toolkits build
|
|
299
|
+
|
|
300
|
+
# 开发调试(监听)
|
|
301
|
+
pnpm -C packages/react-toolkits dev
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
构建将产出多入口:`lib/index.js`、`lib/components.js`、`lib/pages.js`、`lib/services.js`、`lib/types.js`、`lib/utils.js`,以及 `locale/*`。
|
|
305
|
+
|
|
306
|
+
提示:发布前请确保示例应用验证通过,并更新 `CHANGELOG.md` 描述变更与迁移说明。
|
|
307
|
+
|
|
308
|
+
## 变更与发布
|
|
309
|
+
|
|
310
|
+
- 更新日志见 `CHANGELOG.md`
|
|
311
|
+
- 遵循 semver;涉及子路径导出/目录变更会在次版本提供迁移说明
|
|
312
|
+
|
|
313
|
+
## 许可证
|
|
43
314
|
|
|
44
|
-
|
|
315
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-7NM3DK6A.js';import {a}from'./chunk-X6ZI7RL7.js';import {b}from'./chunk-OLM4QNJB.js';import {create}from'zustand';import {Modal,Form,Button,Tooltip}from'antd';import {useMemo,useEffect,useState,useCallback}from'react';import {jsx}from'react/jsx-runtime';var O=create((s,e)=>({open:new Map,usedIds:new Set,isOpen:o=>e().open.get(o)??!1,show(o){s({open:new Map(e().open).set(o,!0)});},hide(o){s({open:new Map(e().open).set(o,!1)});},hideAll(){s({open:new Map});},checkUniqueness(o){let{usedIds:n}=e();return !n.has(o)},registerIds(o){let{usedIds:n}=e();return n.has(o)?!1:(s({usedIds:new Set(n).add(o)}),!0)},cleanup(o){let{open:n,usedIds:a}=e(),l=new Map(n),t=new Set(a);l.delete(o),t.delete(o),s({open:l,usedIds:t});}}));function V(s){let{content:e,onConfirm:o,afterOpen:n,afterClose:a,...l}=s,t=useMemo(()=>b(),[]),{show:u,hide:d,isOpen:m,cleanup:r}=O();useEffect(()=>()=>{r(t);},[t,r]);let w=m(t),[x,c]=useState(!1),f=typeof e=="function",b$1=useCallback(async()=>{u(t),await n?.();},[t,u,n]),p=useCallback(()=>{d(t);},[t,d]),i=useCallback(async()=>{p(),await a?.();},[p,a]),y=useCallback(async()=>{try{c(!0),await o?.(),p(),await a?.();}catch(v){throw console.error("Modal confirm error:",v),v}finally{c(!1);}},[o,p,a]),P=jsx(Modal,{...l,open:w,confirmLoading:x,onOk:y,onCancel:i,children:f?e({hide:p}):e});return {id:t,show:b$1,hide:p,modal:P}}function _(s){let{content:e,form:o,formProps:n,onConfirm:a,onSuccess:l,afterClose:t,...u}=s,[d,m]=useState({}),[r]=Form.useForm();r=o||r;let w=typeof e=="function",{id:x,show:c,hide:f,modal:b}=V({...u,content:i=>jsx(Form,{...n,form:r,children:w?e(d,i):e}),onConfirm:async()=>{try{let i=await r.validateFields();await a?.(i,d),l?.(),f();}catch(i){throw console.error("Form validation or submission error:",i),i}},afterClose:()=>{t?.(r);}}),p=useCallback(i=>{let{initialValues:y,extraValues:P}=i||{};P&&m(P),y&&r.setFieldsValue(y),c();},[r,c]);return {id:x,show:p,hide:f,modal:b}}var q=s=>{let{children:e,code:o,showLoading:n,disabled:a$2,config:l,...t}=s,u=o?Array.isArray(o)?o:[o]:[],{data:d,isLoading:m}=a(u,l),{t:r}=a$1();return m?jsx(Button,{loading:n,disabled:!n,...t,children:e}):typeof d=="boolean"||d&&Object.values(d).some(Boolean)?jsx(Button,{disabled:a$2,...t,children:e}):jsx(Tooltip,{defaultOpen:!1,title:r("global.noEntitlement"),children:jsx(Button,{disabled:!0,...t,children:e})})},K=q;export{O as a,V as b,_ as c,K as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a}from'./chunk-7NM3DK6A.js';import {a as a$1}from'./chunk-X6ZI7RL7.js';import {d}from'./chunk-WHOTHZUW.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}from'react/jsx-runtime';import {isEqual}from'lodash-es';import {create}from'zustand';import {devtools,subscribeWithSelector}from'zustand/middleware';import {useQuery}from'@tanstack/react-query';var Oe=m=>{let{extras:l,isConfirming:r,onConfirm:o,onReset:e,children:s,buttonsAlign:n="left",showReset:u}=m,{t:d}=a(),{token:{colorFillAlter:h,lineWidth:F,lineType:p,colorBorder:S,borderRadiusLG:O}}=theme.useToken();return jsx("div",{style:{maxWidth:"none",background:h,borderWidth:F,borderStyle:p,borderColor:S,borderRadius:O,padding:24,marginBottom:24},children:jsxs("div",{className:`flex ${n==="bottom"?"flex-col":"flex-row"}`,children:[jsx("div",{className:`${n==="left"?"flex-grow-0":"flex-1"}`,children:s}),jsx("div",{className:`${n==="bottom"?"text-end":"text-start"} ml-4`,children:jsxs(Space,{children:[jsx(Button,{type:"primary",disabled:r,onClick:o,children:d("FilterFormWrapper.confirmText")}),l?.map(P=>jsx(Fragment,{children:P.children},P.key)),u&&jsx(Button,{onClick:e,children:d("FilterFormWrapper.resetText")})]})})]})})},k=Oe;var se=Object.freeze({page:1,size:10,filters:Object.freeze({})}),je=()=>create()(devtools(subscribeWithSelector((m,l)=>({instances:new Map,registerInstance(r,o,e,s){m(n=>{let u=n.instances.get(r);if(u){if(u.refetch!==s){let F={...u,refetch:s},p=new Map(n.instances);return p.set(r,F),{instances:p}}return n}let d={id:r,url:o,queryKey:e,payload:se,refetch:s},h=new Map(n.instances);return h.set(r,d),{instances:h}});},unregisterInstance(r){m(o=>{let e=new Map(o.instances);return e.delete(r)?{instances:e}:o});},updatePayload(r,o){m(e=>{let s=e.instances.get(r);if(!s)return e;let n={...s.payload,...o};if(!isEqual(s.payload,n)){let u={...s,payload:n},d=new Map(e.instances);return d.set(r,u),{instances:d}}return e});},getPayload(r){return l().instances.get(r)?.payload??se},async refetch(r,o){let e=l().instances.get(r);if(!e){console.warn(`QueryList instance with id "${r}" not found`);return}let s=!1;if(o){let n=e.payload,u={...n,...o};isEqual(n,u)||(l().updatePayload(r,o),s=!0);}if(!s)try{await e.refetch();}catch(n){throw console.error(`Failed to refetch QueryList instance "${r}":`,n),n}},getInstance(r){return l().instances.get(r)},getAllInstances(){return Array.from(l().instances.values())}})),{name:"query-list-store"})),We=je(),f=We;var le=(e=>(e[e.Confirm=0]="Confirm",e[e.Reset=1]="Reset",e[e.Jump=2]="Jump",e[e.Init=3]="Init",e))(le||{}),Ge=5*60*1e3,Ye=30*1e3,ce=["GET","HEAD"],ue=["POST","PUT","PATCH","DELETE"],Je={display:"flex",justifyContent:"center",alignItems:"center",height:300},Xe=0,Ze=()=>`queryList_${Date.now()}_${++Xe}`,et=(m,l)=>{let{t:r}=a(),{form:o,identifier:e,code:s,onePage:n,buttonsAlign:u,showReset:d$1,defaultSize:h=10,refreshInterval:F=0,tableExtra:p,renderForm:S,afterSuccess:O,afterError:_,footer:P,pageSizeOptions:B,request:V,dataAdapter:K,...de}=m,[a$2]=Form.useForm(o),c=useMemo(()=>e||Ze(),[e]),Q=useRef(3),{data:T,isLoading:fe}=a$1(s),[pe,b]=useState(!1),q=useRef(!1),M=useRef(!1),ye=f(t=>t.getPayload(c)),me=d(),{page:R,size:x=h,filters:g}=ye,ge=typeof V=="function"?V({page:R,size:x,filters:g}):V,{url:D,method:N="GET",body:he,searchParams:be,headers:Le,cacheTime:Ie=Ge,staleTime:Fe=Ye}=ge,E=N.toUpperCase();[...ce,...ue].includes(E)||console.warn(`QueryList: \u4E0D\u652F\u6301\u7684 HTTP \u8BF7\u6C42\u65B9\u6CD5 "${N}"\uFF0C\u5C06\u4F7F\u7528 GET \u65B9\u6CD5`);let Pe=ce.includes(E),Qe=ue.includes(E),U={...g,...!n&&{page:R,size:x}},L=he||(Qe?U:void 0),Re=be||U,xe=Le,$=useRef(!1),G=["queryList",D,c,R,x,g],{data:y,isLoading:Y,refetch:j}=useQuery({queryKey:G,queryFn:async()=>{try{let t={method:E,searchParams:Re,headers:xe};L&&!Pe&&(L instanceof FormData||typeof L=="string"?t.body=L:t.json=L);let i=await me.request({url:D,...t});return $.current=!0,O?.(Q.current,a$2,i),i}catch(t){let i=t instanceof Error?t:new Error(String(t));throw _?.(i,Q.current,a$2),i}},retry:(t,i)=>!(t>=3||i?.message?.includes("401")),retryDelay:t=>Math.min(1e3*2**t,3e4),refetchOnWindowFocus:!1,refetchInterval:$.current?F:0,gcTime:Ie,staleTime:Fe,enabled:T&&pe}),J=useMemo(()=>{let t=K,i={total:y?.total,items:y?.list};return typeof t=="function"?{...i,...t(y)}:{...i,...t}},[K,y]);useEffect(()=>(f.getState().registerInstance(c,D,G,j),()=>{f.getState().unregisterInstance(c);}),[c,D]);let W=J.items,X=J.total,Ae=useMemo(()=>n?!1:{pageSizeOptions:B,showSizeChanger:!0,showQuickJumper:!0,current:R,pageSize:x,total:X,onChange:async(t,i)=>{Q.current=2,f.getState().refetch(c,{page:t,size:i});}},[n,B,R,x,X,c]),Z=useCallback(async()=>{Q.current=0;try{await a$2.validateFields(),b(!0),f.getState().refetch(c,{page:1,filters:a$2.getFieldsValue()});}catch{b(!1);}},[a$2,c]),Se=useCallback(async()=>{Q.current=1,a$2.resetFields();try{await a$2.validateFields({validateOnly:!0}),b(!0),f.getState().refetch(c,{page:1,filters:a$2.getFieldsValue()});}catch{b(!1);}},[a$2,c]),Te=typeof S=="function"?jsx(k,{showReset:d$1,buttonsAlign:u,isConfirming:Y,onReset:Se,onConfirm:Z,children:cloneElement(S(a$2),{onKeyUp:t=>{t.key==="Enter"&&Z();}})}):jsx(Form,{form:a$2}),De=typeof p=="function"?p(a$2,y):p,Ee=P?()=>P(y):void 0;return useEffect(()=>{if(!q.current||M.current)return;let t=a$2.getFieldsValue();g&&!isEqual(t,g)&&(M.current=!0,a$2.setFieldsValue(g),setTimeout(()=>{M.current=!1;},0));},[g,a$2]),useEffect(()=>{if(!T||q.current)return;let t=async()=>{console.log("QueryList init starting");try{a$2.resetFields();let v=await a$2.validateFields({validateOnly:!0});console.log("QueryList init validation success:",v),f.getState().updatePayload(c,{page:1,filters:v}),b(!0),console.log("QueryList init completed, isValid set to true");}catch(v){console.log("QueryList init validation failed:",v),b(!1);}finally{q.current=!0;}},i=requestAnimationFrame(()=>{Promise.resolve().then(t);});return ()=>{i&&cancelAnimationFrame(i);}},[T,c,a$2]),useImperativeHandle(l,()=>({data:y,dataSource:W,form:a$2,refetch:j}),[y,W,a$2,j]),fe?jsx(Spin,{style:Je}):T?jsxs("div",{children:[Te,De,jsx(Table,{...de,dataSource:W,loading:Y,pagination:Ae,footer:Ee})]}):jsx(Result,{status:403,subTitle:r("global.noEntitlement")})},tt=forwardRef(et),rt=tt;export{k as a,f as b,le as c,rt as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a}from'./chunk-WHOTHZUW.js';import {has,template,get}from'lodash-es';import {useMemo}from'react';function l(){let t=a(e=>e.locale);return {t:useMemo(()=>(e,r)=>has(t,e)?template(get(t,e))(r):e,[t])}}export{l as a};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d,e}from'./chunk-WHOTHZUW.js';import {useQueryClient,useMutation}from'@tanstack/react-query';function y(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.create,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,id:0,is_model:!0}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}function l(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.update,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,is_model:!0}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}function c(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.delete,mutationFn:n=>u.post("/api/usystem/menu/delete",null,{searchParams:{id:n}}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}export{y as a,l as b,c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {Typography}from'antd';import {useState}from'react';import {jsx}from'react/jsx-runtime';import P from'./logo-L6MFCL6M.png';var g=a=>{let{children:r,...p}=a,[o,e]=useState(!1);return jsx(Typography.Paragraph,{...p,className:"mb-0",ellipsis:{rows:2,expandable:"collapsible",expanded:o,onExpand:(f,t)=>{e(t.expanded);}},children:r})},m=g;var n=a=>jsx("img",{src:P,alt:"logo",...a}),i=n;export{m as a,i as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b}from'./chunk-JTDKSGJR.js';import {a as a$2}from'./chunk-4GULXGNG.js';import {a}from'./chunk-7NM3DK6A.js';import {a as a$1,c}from'./chunk-X6ZI7RL7.js';import {d,a as a$3}from'./chunk-WHOTHZUW.js';import {b as b$1}from'./chunk-OLM4QNJB.js';import*as _ from'antd';import {Spin,Menu,Button,Drawer,Form,Result,Table,theme,Space,Input,Tag,Empty,Dropdown,Divider,Select,Typography}from'antd';import {forwardRef,memo,useRef,useMemo,useCallback,useEffect,useState,useImperativeHandle,cloneElement,Fragment as Fragment$1,Suspense}from'react';import {create}from'zustand';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {PlusOutlined,LogoutOutlined,UserOutlined,MenuUnfoldOutlined,MenuFoldOutlined}from'@ant-design/icons';import {useInfiniteQuery,useQueryClient}from'@tanstack/react-query';import {isEqual}from'lodash-es';import {persist,createJSONStorage,devtools,subscribeWithSelector}from'zustand/middleware';import {Link,useLocation,useNavigate}from'react-router-dom';var me=create((o,r)=>({open:new Map,usedIds:new Set,isOpen:e=>r().open.get(e)??!1,show(e){o({open:new Map(r().open).set(e,!0)});},hide(e){o({open:new Map(r().open).set(e,!1)});},hideAll(){o({open:new Map});},checkUniqueness(e){let{usedIds:t}=r();return !t.has(e)},registerIds(e){let{usedIds:t}=r();return t.has(e)?!1:(o({usedIds:new Set(t).add(e)}),!0)},cleanup(e){let{open:t,usedIds:n}=r(),a=new Map(t),i=new Set(n);a.delete(e),i.delete(e),o({open:a,usedIds:i});}}));function de(o){let{content:r,onConfirm:e,afterOpen:t,afterClose:n,footer:a,confirmText:i="\u786E\u8BA4",cancelText:c="\u53D6\u6D88",confirmButtonProps:l,cancelButtonProps:I,...s}=o,u=useMemo(()=>b$1(),[]),{show:m,hide:x,isOpen:p,cleanup:f}=me();useEffect(()=>()=>{f(u);},[u,f]);let h=p(u),[d,w]=useState(!1),P=typeof r=="function",g=useCallback(async()=>{m(u),await t?.();},[u,m,t]),D=useCallback(()=>{x(u);},[u,x]),M=useCallback(async()=>{D(),await n?.();},[D,n]),N=useCallback(async()=>{try{w(!0),await e?.();}catch(L){throw console.error("Drawer confirm error:",L),L}finally{w(!1);}},[e]),C=a!==void 0?a:jsxs("div",{className:"flex gap-4 mx-4",children:[jsx(Button,{type:"primary",loading:d,...l,onClick:N,children:i}),jsx(Button,{...I,onClick:M,children:c})]}),A=jsx(Drawer,{...s,open:h,footer:C,onClose:M,children:P?r({hide:D}):r});return {id:u,show:g,hide:D,confirmLoading:d,drawer:A}}function ht(o){let{content:r,form:e,formProps:t,onConfirm:n,onSuccess:a,afterClose:i,...c}=o,[l,I]=useState({}),[s]=Form.useForm();s=e||s;let u=typeof r=="function",{id:m,show:x,hide:p,drawer:f}=de({...c,content:d=>jsx(Form,{...t,form:s,children:u?r(l,d):r}),onConfirm:async()=>{try{let d=await s.validateFields();await n?.(d,l),a?.(),p();}catch(d){throw console.error("Form validation or submission error:",d),d}},afterClose:()=>{i?.(s);}}),h=useCallback(d=>{let{initialValues:w,extraValues:P}=d||{};P&&I(P),w&&s.setFieldsValue(w),x();},[s,x]);return {id:m,show:h,hide:p,drawer:f}}var Pt=o=>{let{initialTags:r,addable:e,removable:t,addCallback:n,removeCallback:a$1}=o,{t:i}=a(),{token:c}=theme.useToken(),[l,I]=useState([]),[s,u]=useState(!1),[m,x]=useState(""),[p,f]=useState(-1),[h,d]=useState(""),w=useRef(null),P=useRef(null);useEffect(()=>{I(r??[]);},[r]),useEffect(()=>{s&&w.current?.focus();},[s]),useEffect(()=>{P.current?.focus();},[m]);let g=async b=>{if(await a$1?.(b)){let k=l.filter(ae=>ae!==b);I(k);}},D=()=>{u(!0);},M=b=>{x(b.target.value);},N=async()=>{m&&l.indexOf(m)===-1&&await n?.(m)&&I([...l,m]),u(!1),x("");},C=b=>{d(b.target.value);},A=()=>{let b=[...l];b[p]=h,I(b),f(-1),x("");},L={width:78,verticalAlign:"top"},oe={background:c.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:l.map((b,R)=>p===R?jsx(Input,{ref:P,size:"small",style:L,value:h,onChange:C,onBlur:A,onPressEnter:A},b):jsx(Tag,{closable:t,style:{userSelect:"none"},onClose:async k=>{k.preventDefault(),await g(b);},children:jsx("span",{onDoubleClick:k=>{R!==0&&(f(R),d(b),k.preventDefault());},children:b})},b))}),e&&(s?jsx(Input,{ref:w,type:"text",size:"small",style:L,value:m,onChange:M,onBlur:N,onPressEnter:N}):jsxs(Tag,{style:oe,onClick:D,children:[jsx(PlusOutlined,{}),"\xA0",i("global.add")]}))]})},vt=Pt;var Dt=()=>create()(devtools(subscribeWithSelector((o,r)=>({instances:new Map,registerInstance(e,t,n,a,i){o(c=>{let l=c.instances.get(e);if(l){let u={...l,refetch:a,fetchNextPage:i},m=new Map(c.instances);return m.set(e,u),{instances:m}}let I={id:e,url:t,queryKey:n,payload:{page:0,formValue:{}},refetch:a,fetchNextPage:i},s=new Map(c.instances);return s.set(e,I),{instances:s}});},unregisterInstance(e){o(t=>{let n=new Map(t.instances);return n.delete(e)?{instances:n}:t});},updatePayload(e,t){o(n=>{let a=n.instances.get(e);if(!a)return n;let i={...a.payload,...t};if(!isEqual(a.payload,i)){let c={...a,payload:i},l=new Map(n.instances);return l.set(e,c),{instances:l}}return n});},getPayload(e){return r().instances.get(e)?.payload??{page:0,formValue:{}}},async refetch(e,t){let n=r().instances.get(e);if(!n){console.warn(`InfiniteList instance with id "${e}" not found`);return}if(t){let a=n.payload,i={...a,...t};isEqual(a,i)||r().updatePayload(e,t);}try{await n.refetch();}catch(a){throw console.error(`Failed to refetch InfiniteList instance "${e}":`,a),a}},async fetchNextPage(e){let t=r().instances.get(e);if(!t){console.warn(`InfiniteList instance with id "${e}" not found`);return}try{await t.fetchNextPage();}catch(n){throw console.error(`Failed to fetch next page for InfiniteList instance "${e}":`,n),n}},getInstance(e){return r().instances.get(e)},getAllInstances(){return Array.from(r().instances.values())}})),{name:"infinite-list-store"})),Lt=Dt(),T=Lt;var At=(o,r)=>{let t={refreshInterval:0,initialPageParam:0,...o,dataAdapter:{...{items:y=>y?y.flatMap(v=>v?.list||v||[]):[],hasMore:y=>{if(!y)return !1;let v=y;return v?.hasMore||v?.has_more||!1},nextPageParam:(y,v,U)=>(G=>{if(!G)return !1;let B=G;return B?.hasMore||B?.has_more||!1})(y)?v.length:void 0},...o.dataAdapter}},{identifier:n,code:a$3,buttonsAlign:i,showReset:c,refreshInterval:l,request:I,tableExtra:s,renderForm:u,afterSuccess:m,afterError:x,dataAdapter:p,initialPageParam:f,footer:h,form:d$1,...w}=t,{t:P}=a(),[g]=Form.useForm(d$1),[D,M]=useState(!1),N=useRef(!1),C=useRef(3),A=d(),{data:L,isLoading:oe}=a$1(a$3),b=useCallback(()=>T.getState().getPayload(n),[n]),R=useMemo(()=>g,[g]),{url:k,method:ae="GET",body:se,params:ie,headers:j,cacheTime:tt=5*60*1e3,staleTime:nt=0}=I,le=useMemo(()=>typeof j=="function"?j(R):j,[j,R]),ce=useMemo(()=>{let y=b();return [k,n,L,D,y,le]},[k,n,L,D,b,le]),{data:Q,fetchNextPage:pe,hasNextPage:ve,isFetchingNextPage:we,refetch:X,isFetching:Se}=useInfiniteQuery({queryKey:ce,queryFn:async({pageParam:y=f})=>{try{let v=b(),U=typeof ie=="function"?ie(v,y):ie,z=typeof se=="function"?se(v,y):se,G={method:ae,searchParams:U,headers:le};z&&(z instanceof FormData?G.body=z:G.json=z);let B=await A.request({url:k,...G});return N.current=!0,m?.(C.current,R,[B]),B}catch(v){let U=v instanceof Error?v:new Error(String(v));throw x?.(U,C.current,R),U}},initialPageParam:f,getNextPageParam:(y,v)=>p?.nextPageParam?.(y,v,f),enabled:L&&D,retry:(y,v)=>!(y>=3||v?.message?.includes("401")),retryDelay:y=>Math.min(1e3*2**y,3e4),refetchOnWindowFocus:!1,refetchInterval:N.current?l:0,gcTime:tt,staleTime:nt});useEffect(()=>(T.getState().registerInstance(n,k,ce,X,pe),()=>{T.getState().unregisterInstance(n);}),[n,k,ce,X,pe]);let $=p?.items?.(Q?.pages,R),ue=we,Ce=!ve,rt=!$||$.length===0,De=async()=>{C.current=0;let y=await g.getFieldsValue();try{await g.validateFields(),M(!0),T.getState().updatePayload(n,{page:0,formValue:y}),X();}catch{M(!1);}},ot=()=>{C.current=2,pe();},at=async()=>{C.current=1;try{g.resetFields();let y=await g.getFieldsValue();T.getState().updatePayload(n,{page:0,formValue:y}),await g.validateFields({validateOnly:!0}),X();}catch{}};if(useEffect(()=>{setTimeout(()=>{L&&g.validateFields({validateOnly:!0}).then(y=>{M(!0),T.getState().updatePayload(n,{page:0,formValue:y});}).catch(()=>{M(!1);});},300);},[L,g,n]),useImperativeHandle(r,()=>({data:Q?.pages,dataSource:$,form:g,refetch:()=>T.getState().refetch(n),fetchNextPage:()=>T.getState().fetchNextPage(n),hasNextPage:!!ve,isFetchingNextPage:we})),oe)return jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:300}});if(!L)return jsx(Result,{status:403,subTitle:P("global.noEntitlement")});let st=h&&(()=>h(Q?.pages)),it=()=>typeof s=="function"?s(R,Q?.pages):s,lt=typeof u=="function"?jsx(a$2,{showReset:c,buttonsAlign:i,isConfirming:Se,onReset:at,onConfirm:De,children:cloneElement(u(g),{onKeyUp:y=>{y.key==="Enter"&&De();}})}):jsx(Form,{form:g});return jsxs(Fragment,{children:[lt,it(),jsx("div",{style:{minHeight:"400px"},children:jsx(Table,{...w,dataSource:$,loading:Se,pagination:!1,footer:st})}),!rt&&jsx(Button,{block:!0,loading:ue,type:"link",htmlType:"button",disabled:ue||Ce,onClick:ot,children:P(ue?"InfiniteList.loadingText":Ce?"InfiniteList.reachEndText":"InfiniteList.loadMoreText")})]})},Gt=forwardRef(At),qt=Gt;var Ue=create()(persist((o,r)=>({openKeys:[],setOpenKeys:e=>{let t=r();(t.openKeys.length!==e.length||!t.openKeys.every((n,a)=>n===e[a]))&&o({openKeys:e});},selectedKeys:[],setSelectedKeys:e=>{let t=r();(t.selectedKeys.length!==e.length||!t.selectedKeys.every((n,a)=>n===e[a]))&&o({selectedKeys:e});}}),{name:"nav",storage:createJSONStorage(()=>localStorage),partialize:o=>({openKeys:o.openKeys,selectedKeys:o.selectedKeys}),skipHydration:!1,version:1}));var ze=memo(({to:o,children:r})=>jsx(Link,{to:o,children:r}));ze.displayName="MemoizedLink";function ee(o){let r=[];if(o)for(let e=0;e<o.length;e++)if(o[e]===null||o[e].type==="divider")r[e]=o[e];else if(o[e].children){let{children:t,...n}=o[e];r[e]={...n,children:ee(t)};}else {let{route:t,label:n,...a}=o[e],i=t?jsx(ze,{to:t,children:n}):n;r[e]={...a,label:i};}return r}function te(o,r=[],e=[]){for(let t of o){let n=t?.children;if(Array.isArray(n)){let a=t.type!=="group"&&t.key?[...e,t.key]:e;te(n,r,a);}else t&&r.push(Object.assign(t,{keypath:e}));}return r}var en=memo(function(r){let{items:e=[],theme:t,loading:n}=r,a=useLocation(),i=useRef(),c=useRef(),l=useMemo(()=>i.current===e?i.current?te(i.current):[]:(i.current=e,te(e)),[e]),I=useMemo(()=>i.current===e?i.current?ee(i.current):[]:ee(e),[e]),{openKeys:s,selectedKeys:u,setOpenKeys:m,setSelectedKeys:x}=Ue(),p=useCallback(f=>{let h=f.find(d=>!s.includes(d));if(h){let d=l.find(P=>P.key===h),w=d?.keypath?[...d.keypath,h]:[h];m(w);}else m(f);},[l,s,m]);return useEffect(()=>{if(c.current===a.pathname)return;c.current=a.pathname;let f=l.find(h=>a.pathname===h.route);if(f){let h=f.key,d=f.keypath;(u[0]!==h||!s.every((w,P)=>w===d[P]))&&(x([h]),m(d));}},[l,a.pathname,u,s,x,m]),n?jsx("div",{className:"flex justify-center items-center",style:{height:"calc(100vh - 64px)"},children:jsx(Spin,{})}):jsx(Menu,{theme:t,style:{borderRight:"none"},items:I,mode:"inline",openKeys:s,selectedKeys:u,onOpenChange:p})}),Ie=en;var {Spin:rn}=_,on=({children:o})=>{let{permissionVersion:r,gameId:e,isGlobal:t}=a$3(i=>i),{isLoading:n}=c(),{t:a$1}=a();return n?jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:400},children:jsx(rn,{})}):r==="v1"||t?o:e?jsx(Fragment$1,{children:o},e):jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:a$1("RequireGame.description")})},be=on;var un=()=>{let{t:o}=a(),r=useNavigate(),{clearToken:e,getUser:t,signInPath:n}=a$3(s=>s),a$1=t(),i=()=>{e(),r(n);},c=s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),i());},l=s=>{(s.key==="Enter"||s.key===" ")&&s.preventDefault();},I=[{key:"1",icon:jsx(LogoutOutlined,{}),label:jsx("a",{role:"button",tabIndex:0,onClick:i,onKeyDown:c,children:o("UserWidget.signOutText")})}];return jsx("div",{children:jsx(Dropdown,{menu:{selectable:!0,items:I},placement:"bottomRight",children:jsx("a",{role:"button",tabIndex:0,onClick:s=>{s.preventDefault();},onKeyDown:l,children:jsxs(Space,{align:"center",children:[jsx("span",{children:a$1?.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})})},xe=un;var{Text:In}=Typography,bn=o=>{let{filter:r,options:e}=o,{t}=a(),{gameApiV2:n,gameId:a$1,setGameId:i}=a$3(p=>p),{data:c$1,isLoading:l}=c(),I=useQueryClient(),s=c$1?.filter(p=>r?.(p)??!0),u=typeof e=="function"?e(s):s?.map(p=>({label:p.name,value:n?p.game_id:p.id})),m=p=>{x(),i(p);},x=()=>{I.removeQueries({predicate:p=>{let f=p.queryKey;return !f.includes("/api/game/list")&&!f.includes("/api/usystem/game/all")}});};return useEffect(()=>{if(c$1&&c$1.length>0){let p=n?c$1[0].game_id:c$1[0].id;c$1.every(f=>String(f.game_id||f.id)!==String(a$1))&&i(p);}},[c$1]),jsxs(Space,{children:[jsx(In,{children:t("GameSelect.label")}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:a$1,placeholder:t("GameSelect.placeholder"),loading:l,style:{width:"200px"},options:u,onChange:m})]})},Xe=bn;var Ye=memo(({title:o,subtitle:r,mainPagePath:e,collapsed:t})=>jsxs("div",{className:"px-6 py-2 font-bold relative bg-gradient-to-r from-white to-gray-50/30",style:{height:"auto",display:"flex",flexDirection:"column",justifyContent:"center",backdropFilter:"blur(4px)",WebkitBackdropFilter:"blur(4px)"},children:[jsxs("div",{className:`flex items-center w-full ${t?"justify-center":""}`,children:[jsx(Link,{to:e,className:"hover:opacity-80 transition-all duration-300 ease-out block rounded-lg p-1 hover:bg-white/50 hover:shadow-sm",style:{transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)",opacity:t?.8:1,transform:"translateX(0)"},children:jsx(b,{width:36,style:{objectFit:"contain",display:"block",filter:"drop-shadow(0 1px 1px rgba(0, 0, 0, 0.05))",transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}})}),o&&jsx("div",{className:"ml-4 overflow-hidden min-w-0",style:{transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)",opacity:t?0:1,width:t?"0px":"auto",marginLeft:t?"0px":"16px",transform:t?"translateX(-8px)":"translateX(0)"},children:jsx(Link,{to:e,className:"text-xl leading-tight hover:text-blue-600 transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block bg-gradient-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent hover:from-blue-600 hover:to-blue-500",title:o,style:{letterSpacing:"0.02em",textShadow:"0 1px 2px rgba(0, 0, 0, 0.05)"},children:o})})]}),jsx("div",{className:"w-full mt-2 overflow-hidden",style:{height:r&&!t?"20px":"1px",transition:"height 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"},children:jsxs("div",{className:"flex items-center justify-center h-full w-full",children:[jsx("div",{className:"w-full border-t border-gray-200 absolute",style:{opacity:!r||t?1:0,transition:"opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}}),r&&jsxs("div",{className:"flex items-center w-full text-sm",style:{opacity:t?0:1,transform:t?"translateY(-3px)":"translateY(0)",transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"},children:[jsx("div",{className:"flex-1 border-t border-gray-200"}),jsx("span",{className:"px-3 text-gray-500 font-medium whitespace-nowrap",title:r,children:r}),jsx("div",{className:"flex-1 border-t border-gray-200"})]})]})})]}));Ye.displayName="LayoutHeader";var Je=Ye;var {Spin:Ln,theme:Fn}=_,{Header:Mn,Sider:Rn,Content:kn}=_.Layout,Nn=o=>{let{collapsible:r,isMenuLoading:e,items:t,headerExtra:n,children:a,navWidth:i,filter:c,gameSelectOptions:l,title:I,subtitle:s}=o,{token:{colorBgContainer:u,colorBorder:m}}=Fn.useToken(),{permissionVersion:x,navWidth:p,collapsible:f,mainPagePath:h,collapsed:d,setContext:w,isGlobal:P}=a$3(),[g,D]=useState(d),M=async()=>{D(!g),w({collapsed:!g});},N=r??f??!1;return jsxs(_.Layout,{children:[jsxs(Rn,{collapsible:N,theme:"light",trigger:null,collapsed:g,width:i??p,style:{height:"100vh",overflowX:"hidden",overflowY:"auto",borderRightWidth:1,borderRightStyle:"solid",borderRightColor:m,transition:"all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:[jsx(Je,{title:I,subtitle:s,mainPagePath:h,collapsed:g||!1}),jsx(Ie,{items:t,loading:e})]}),jsxs(_.Layout,{children:[jsx(Mn,{style:{padding:"0 24px",background:u},children:jsxs("div",{className:"flex justify-between items-center h-full",children:[jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),className:"mr-6",children:[N&&jsx(Button,{type:"text",icon:g?jsx(MenuUnfoldOutlined,{}):jsx(MenuFoldOutlined,{}),style:{fontSize:"16px"},onClick:M}),x!=="v1"&&!P&&jsx(Xe,{filter:c,options:l}),n?.left?.map(C=>jsx("span",{children:C.children},C.key))]}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[n?.right?.map(C=>jsx("span",{children:C.children},C.key)),jsx(xe,{})]})]})}),jsx(kn,{style:{overflow:"auto",padding:"24px 16px",maxHeight:"calc(100vh - 64px)",transition:"margin-left 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:jsx(Suspense,{fallback:jsx(Ln,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"200px"}}),children:jsx(be,{children:a})})})]})]})},Tn=Nn;var On=o=>{let{code:r,config:e,children:t}=o,{data:n,isLoading:a$2}=a$1(r,e),{t:i}=a();return a$2?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):n?jsx(Fragment,{children:t}):jsx(Result,{status:"403",subTitle:i("global.noEntitlement")})},Kn=On;export{me as a,de as b,ht as c,vt as d,T as e,qt as f,Ie as g,be as h,xe as i,Tn as j,Kn as k};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s={getItem:t=>sessionStorage.getItem(t)||localStorage.getItem(t),setItem:(t,e)=>{sessionStorage.setItem(t,e),localStorage.setItem(t,e);},removeItem(t){sessionStorage.removeItem(t),localStorage.removeItem(t);}},r=0,n=()=>{let t=Date.now(),e=Math.floor(Math.random()*1e3),o=++r%1e3;return t*1e6+e*1e3+o};export{s as a,n as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {lazy}from'react';import {Routes,Route,Navigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var i=lazy(()=>import('./menuItemList-AS6ZDOTZ.js')),n=lazy(()=>import('./createMenuItem-HUQG2HQY.js')),s=lazy(()=>import('./updateMenuItem-7SUIOBXS.js')),l=jsxs(Routes,{children:[jsx(Route,{index:!0,element:jsx(i,{})}),jsx(Route,{path:"create",element:jsx(n,{})}),jsx(Route,{path:"update/:id",element:jsx(s,{})})]});var R=lazy(()=>import('./userList-KX3POGAU.js')),c=lazy(()=>import('./userDetail-JJNDBV5T.js')),h=lazy(()=>import('./roleList-AHH4PNYW.js')),x=lazy(()=>import('./roleDetail-PFVKUPYB.js')),I=jsxs(Routes,{children:[jsx(Route,{index:!0,element:jsx(Navigate,{to:"user"})}),jsx(Route,{path:"user",element:jsx(R,{})}),jsx(Route,{path:"user/:id",element:jsx(c,{})}),jsx(Route,{path:"role",element:jsx(h,{})}),jsx(Route,{path:"role/:name",element:jsx(x,{})})]});export{l as a,I as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {useState,useEffect}from'react';import {flushSync}from'react-dom';import {createRoot}from'react-dom/client';import {jsx}from'react/jsx-runtime';var f=r=>{let t=/(<[^>]*>)/;return r.split(t).filter(e=>e!=="")};function a(r){let t=document.createElement("div"),e=createRoot(t);return new Promise(i=>{setTimeout(()=>{flushSync(()=>{e.render(r);}),i(t.innerHTML);});})}var d=r=>{let{texts:t,children:e}=r,[i,l]=useState("");return useEffect(()=>{a(e).then(g=>{let o=f(g);for(let s of t)for(let n=0;n<o.length;n++)o[n]=o[n].replace(String(s),`<span style='color: #DC143C;'>${s}</span>`);l(o.join(""));});},[e,t]),jsx("div",{dangerouslySetInnerHTML:{__html:i}})},u=d;export{u as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$1,f,g}from'./chunk-XQERUQGQ.js';import {c}from'./chunk-3OYXD4UE.js';import {a}from'./chunk-7NM3DK6A.js';import {d,e}from'./chunk-WHOTHZUW.js';import {e as e$1}from'./chunk-LRMME3YZ.js';import {MinusCircleOutlined}from'@ant-design/icons';import {useQuery}from'@tanstack/react-query';import {App,Form,Input,Select,Row,Col,Empty,Button,Typography}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:q}=Typography,$=u=>{let{onChange:a,...r}=u,o=d(),{data:g,isLoading:d$1}=useQuery({queryKey:e.enums.gameGroups,queryFn:()=>o.get("/api/enum/get?enum=game_group&type=all")}),C=[{label:"\u901A\u7528",value:e$1}].concat(g?.map(s=>({label:s,value:s}))??[]);return jsx(Select,{...r,allowClear:!0,showSearch:!0,mode:"tags",optionFilterProp:"label",loading:d$1,options:C,onChange:s=>{last(s)===e$1?a?.([e$1]):first(s)===e$1?a?.(s.slice(1)):a?.(s);}})},z=u=>{let{groups:a,onChange:r,...o}=u,g=d(),{data:d$1,isLoading:C}=useQuery({queryKey:e.enums.gameIds(a||[]),queryFn:()=>g.get(`/api/enum/game_group/get_game_ids?game_groups=${a?.join(",")}`).then(t=>t?.list),enabled:!!a?.length}),h=d$1?.map(t=>({label:t.name,value:t.id}));return jsx(Select,{...o,allowClear:!0,showSearch:!0,optionFilterProp:"label",mode:"tags",loading:C,options:h,onChange:t=>{last(t)===e$1?r?.([e$1]):first(t)===e$1?r?.(t.slice(1)):r?.(t);}})},le=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.Item,{label:o("global.role"),name:"roles",children:jsx(Select,{allowClear:!0,showSearch:!0,mode:"multiple",loading:d,optionFilterProp:"label",options:g$1?.map(n=>({label:n.name,value:n.name}))})})]});return c({title:t,width:"50vw",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})},ie=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.List,{name:"permissions",children:(n,{add:f,remove:V})=>jsxs(Row,{gutter:8,children:[jsx(Col,{span:8,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.projectGroup")})}),jsx(Col,{span:10,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.game")})}),jsx(Col,{span:6,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.role")})}),n.map(m=>jsxs(Fragment$1,{children:[jsx(Col,{span:8,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:!0,children:({setFieldValue:l})=>jsx(Form.Item,{name:[m.name,"game_group"],children:jsx($,{onChange:()=>{l(["permissions",m.name,"game_ids"],[]);}})})})}),jsx(Col,{span:10,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:(l,y)=>l.permissions[m.name]?.game_group!==y.permissions[m.name]?.game_group,children:({getFieldValue:l})=>{let y=l(["permissions",m.name,"game_group"]);return jsx(Form.Item,{name:[m.name,"game_ids"],dependencies:[["permissions",m.name,"game_group"]],rules:[{required:y?.length,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(z,{groups:y})})}})}),jsx(Col,{span:6,children:jsxs("div",{className:"flex",children:[jsx("div",{className:"flex-1",children:jsx(Form.Item,{name:[m.name,"role"],rules:[{required:!0,message:"\u8BF7\u9009\u62E9\u89D2\u8272"},({getFieldValue:l})=>({validator(y,K){return l("permissions").filter((I,j)=>!!I&&j!==m.name).some(I=>I.role===K)?Promise.reject(new Error("\u8BF7\u52FF\u91CD\u590D\u9009\u62E9\u89D2\u8272")):Promise.resolve()}})],children:jsx(Select,{allowClear:!0,showSearch:!0,optionFilterProp:"label",loading:d,options:g$1?.map(l=>({label:l.name,value:l.name}))})})}),jsx("div",{className:"w-8 text-center",children:jsx(Form.Item,{children:jsx(MinusCircleOutlined,{onClick:()=>{V(m.name);}})})})]})})]},m.key)),n.length===0&&jsx(Col,{span:24,children:jsx(Empty,{className:"mb-6"})}),jsx(Col,{span:24,children:jsx(Button,{block:!0,type:"dashed",onClick:()=>f(),children:o("global.add")})})]})})]});return c({title:t,width:"50vw",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})};export{le as a,ie as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {c,d,j,i}from'./chunk-XQERUQGQ.js';import {c as c$1}from'./chunk-3OYXD4UE.js';import {a}from'./chunk-7NM3DK6A.js';import {c as c$2}from'./chunk-X6ZI7RL7.js';import {a as a$1}from'./chunk-WHOTHZUW.js';import {App,Form,Input,Divider,Skeleton,Card,Space,Select,Button,Empty,Typography,Checkbox,Row,Col,Collapse}from'antd';import {useState,useEffect,useTransition,useCallback}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var oe=m=>{let{permissions:i,readonly:n,expand:r,value:l,onChange:g}=m,[c,f]=useState([]),[y,R]=useState({}),[a$1,d]=useState(l??[]),{t:P}=a(),[,v]=useTransition(),V=useCallback(e=>{f(e);},[]),p=(e,s)=>{let o=[];return e?o=[...new Set(a$1.concat(s))]:(o=a$1.slice(),s.forEach(u=>{let b=o.findIndex(X=>X===u);b>-1&&o.splice(b,1);})),o},x=(e,s)=>{let o=p(e.target.checked,s);d(o),g?.(o);};useEffect(()=>{d(l??[]);},[l]),useEffect(()=>{r&&v(()=>{f((i??[]).map(({category:e})=>e));});},[r,i]),useEffect(()=>{let e=(i??[]).reduce((s,o)=>(s[o.category]=o.permissions.every(u=>a$1?.includes(u.value)),s),{});R(e);},[a$1,i]);let I=(i??[]).map(e=>({key:e.category,label:e.category,extra:!n&&jsx(Checkbox,{checked:y[e.category],onChange:s=>{x(s,e.permissions?.map(o=>o.value));},children:P("global.selectAll")}),children:jsx(Checkbox.Group,{style:{width:"100%"},value:a$1,disabled:n,children:jsx(Row,{gutter:[10,10],style:{width:"100%"},children:e.permissions?.map(s=>jsx(Col,{span:6,children:jsx(Checkbox,{value:s.value,onChange:o=>{x(o,[s.value]);},children:s.label})},s.value))})})}));return jsx(Collapse,{style:{width:"100%"},collapsible:"header",activeKey:c,items:I,onChange:V})},k=oe;var{Text:w}=Typography,{Option:le}=Select,pe=m=>{let{expand:i=!0,value:n,readonly:r,onChange:l}=m,{data:g,isLoading:c,error:f}=j(),{data:y,isLoading:R}=c$2(),[a$1,d]=useState([]),P=g?.filter(e=>e.is_common),v=g?.filter(e=>!e.is_common),V=c||R,{t:p}=a();if(useEffect(()=>{let e=[];Object.keys(n??{}).forEach(s=>{s!=="global"&&e.push({gameId:s,permissions:n?.[s]??[]});}),d(e);},[n]),f)return jsx("div",{className:"flex justify-center",children:jsx(w,{type:"danger",children:p("PermissionList.failedDescription")})});let x=()=>{d(e=>[...e,{gameId:"",permissions:[]}]);},I=e=>{d(s=>s.filter((o,u)=>u!==e));};return jsxs("div",{className:"flex flex-col w-full",children:[jsx("div",{className:"mb-12",children:jsx(Divider,{dashed:!0,children:p("PermissionList.baseSectionTitle")})}),jsx(Skeleton,{active:!0,loading:V,children:jsx(k,{value:n?.global,readonly:r,permissions:P,expand:i,onChange:e=>{l?.({...n,global:e});}})}),jsx("div",{className:"my-12",children:jsx(Divider,{dashed:!0,children:p("PermissionList.gameSectionTitle")})}),a$1.map((e,s)=>jsx(Card,{title:jsxs(Space,{children:[jsx(w,{children:p("global.game")}),r?jsx(w,{children:y?.find(o=>String(o.id)===e.gameId)?.name}):jsx(Select,{disabled:r,value:a$1[s].gameId||void 0,style:{width:"160px"},placeholder:p("PermissionList.gameSelectPlaceholder"),onChange:o=>{d(u=>{let b=u.slice();return b[s].gameId=o,b});},children:y?.map(o=>jsx(le,{value:o.id,disabled:a$1.some(({gameId:u})=>u===String(o.id)),children:o.name},o.id))})]}),className:"mb-6",extra:!r&&jsx(Button,{type:"link",onClick:()=>{I(s);},children:p("PermissionList.removeText")}),children:a$1[s].gameId?jsx(Skeleton,{active:!0,loading:V,children:jsx(k,{value:n?.[a$1[s].gameId],readonly:r,expand:i,permissions:v,onChange:o=>{l?.({...n,[a$1[s].gameId]:o});}})}):jsx(Empty,{description:p("PermissionList.gameSectionDescription")})},s)),!r&&jsx(Button,{block:!0,type:"dashed",onClick:x,children:p("PermissionList.addText")})]})},U=pe;var{Text:ue}=Typography,ge=m=>{let{expand:i$1=!0,value:n,readonly:r,onChange:l}=m,{data:g,isLoading:c,error:f}=i(),{t:y}=a();return f?jsx("div",{className:"flex justify-center",children:jsx(ue,{type:"danger",children:y("PermissionList.failedDescription")})}):jsx(Skeleton,{active:!0,loading:c,children:jsx(k,{value:n,permissions:g,readonly:r,expand:i$1,onChange:l})})},$=ge;var fe=m=>{let{value:i}=m;console.log("value",typeof i,i===null,JSON.stringify(i));let{permissionVersion:n}=a$1();return n==="v2"?jsx(U,{...m,value:i}):jsx($,{...m,value:i})},H=fe;var Qe=({mode:m,onSuccess:i})=>{let{message:n}=App.useApp(),{t:r}=a(),l=c(),g=d(),c$2=m==="create",f=r(c$2?"Role.createTitle":"Role.updateTitle"),y=jsxs(Fragment,{children:[jsx(Form.Item,{label:r("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!c$2})}),jsx(Form.Item,{name:"permissions",children:jsx(H,{})})]});return c$1({title:f,width:"1000px",formProps:{layout:"vertical"},content:y,onConfirm:async(a,d)=>{let P=`role_${a.name}`,v=a.permissions;c$2?(await l.mutateAsync({name:P,permissions:v}),n.success(r("Role.createSuccessfully"))):(await g.mutateAsync({id:d?.id,name:P,permissions:v}),n.success(r("Role.updateSuccessfully"))),i?.();}})};export{H as a,Qe as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b as b$1}from'./chunk-LRMME3YZ.js';import {a}from'./chunk-OLM4QNJB.js';import {App}from'antd';import {createContext,useContext,useMemo,useRef}from'react';import {useStore,createStore}from'zustand';import {persist,createJSONStorage}from'zustand/middleware';import {jwtDecode}from'jwt-decode';import {jsx}from'react/jsx-runtime';import $ from'ky';var _={global:{noEntitlement:"No permission, please contact the administrator.",name:"Name",creationTime:"Creation Time",operation:"Operation",update:"Update",edit:"Edit",delete:"Delete",selectAll:"Select All",game:"Game",user:"User",role:"Role",username:"Username",password:"Password",label:"Label",method:"Method",route:"Route",request:"Request",response:"Response",add:"Add",signIn:"Sign In",projectGroup:"Project Group",view:"View"},SignIn:{title:"Sign In Method",thirdParty:"Third party sign in",signInWithIDass:"Sign in with IDass",unregistered:"You are not yet registered on the platform, please contact the administrator",welcome:"Welcome"},NotFound:{subTitle:"The page you visited does not exist",buttonText:"Return to homepage"},FilterFormWrapper:{confirmText:"Search",resetText:"Reset"},FormModal:{confirmText:"Confirm",cancelText:"Cancel"},GameSelect:{label:"Current Game",placeholder:"Please select a game"},RequireGame:{description:"Please select a game"},UserWidget:{signOutText:"Sign Out"},User:{createTitle:"Create User",createSuccessfully:"User created successfully",updateTitle:"Update User",updateSuccessfully:"User updated successfully",deleteTitle:"Delete User",deleteContent:"Are you sure you want to delete user <%= user %>?",deleteSuccessfully:"User deleted successfully"},Role:{createTitle:"Create Role",createSuccessfully:"Role created successfully",updateTitle:"Update Role",updateSuccessfully:"Role updated successfully",deleteTitle:"Delete Role",deleteContent:"Are you sure you want to delete role <%= role %>?",deleteSuccessfully:"Role deleted successfully"},PermissionList:{failedDescription:"Failed to get permission list",baseSectionTitle:"Platform Basic Permissions",gameSectionTitle:"Game Permissions",gameSectionDescription:"Please select a game first",gameSelectPlaceholder:"Please select a game first",removeText:"Remove",addText:"Add Game Permissions"},RoleDetail:{title:"Role Details"},InfiniteList:{loadingText:"Loading...",reachEndText:"You've reached the end",loadMoreText:"Load more"}},v=_;var E=e=>({locale:v,gameApiV2:!1,isGlobal:!1,signInPath:"/sign_in",mainPagePath:"/",permissionVersion:"v1",setContext(t){e(r=>({...r,...t}));}});var b=e=>({setGameId:t=>{e({gameId:t});}});var w=(e,t)=>({getUser:()=>{let r=t().token;if(r)try{return jwtDecode(r)}catch{return null}return null},setToken:r=>e({token:r})});var I=e=>createStore()(persist((...t)=>{let[,r,i]=t,a=()=>{r().setToken(""),i.persist.clearStorage();};return {...w(...t),...b(...t),...E(...t),clearToken:a,...e}},{name:"toolkits",storage:createJSONStorage(()=>a),partialize:t=>({token:t.token,gameId:t.gameId,collapsed:t.collapsed})}));var R=createContext(null);function P(e){let t=useContext(R);if(!t)throw new Error("Missing ToolkitsProvider in the tree");return useStore(t,e||(r=>r))}var A=e=>{let{children:t,...r}=e,i=useRef(),a=useContext(R)?.getState();if(i.current||(i.current=I({...a,...r})),!i.current.getState().signInPath)throw new Error('ToolkitsProvider: \u8BF7\u914D\u7F6E "signInPath"');return jsx(R.Provider,{value:i.current,children:jsx(App,{children:t})})},Y=(e,t)=>{let r=i=>jsx(A,{...t,children:jsx(e,{...i})});return r.displayName=`withContext(${e.displayName||e.name||"Component"})`,r},J=A;var k=[0,1,200],g={OK:200,UNAUTHORIZED:401,FORBIDDEN:403,UNREGISTERED:412},Z=3e4;var q=e=>!e||typeof e!="object"?"Unknown error":e.msg||e.message||e.error||"Unknown error",ee=e=>{let{value:t,allowedCodes:r}=e;return t==null||typeof t!="number"?!1:r.includes(t)},te=(e,t)=>{if(t<g.OK||t>=300)return !1;if(!e||typeof e!="object")return !0;let r=[{field:"code",value:e.code,allowedCodes:k},{field:"status",value:e.status,allowedCodes:k},{field:"errno",value:e.errno,allowedCodes:k}];return r.some(a=>a.value!==void 0&&a.value!==null)?r.every(a=>a.value===void 0||a.value===null||ee(a)):!0},oe=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()}},se=e=>{let{notification:t}=App.useApp(),r=P(),{token:i,isGlobal:a,gameId:S,permissionVersion:x,signInPath:T,clearToken:C}=r,D=()=>{C(),T&&(window.location.href=T);},G=()=>{if(C(),T){let o=new URL(T,window.location.origin);o.searchParams.set("unregistered","true"),window.location.href=o.toString();}},N=()=>{t.error({message:"\u8BBF\u95EE\u88AB\u7981\u6B62",description:"\u60A8\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6B64\u8D44\u6E90\u3002"});},F=o=>async(s,n,c)=>{if(o==="blob"||o==="arrayBuffer"||o==="text"||o==="formData")return c;let l;try{l=await c.clone().json();}catch{return c}if(te(l,c.status)){let m=l.data!==void 0?l.data:l;return new Response(JSON.stringify(m),{status:c.status,statusText:c.statusText,headers:c.headers})}let u=q(l);t.error({message:"Request failed",description:u});let d=new Error(u);throw d.response=c,d.data=l,d},B=(o,s)=>{switch(o){case g.UNAUTHORIZED:D();break;case g.UNREGISTERED:G();break;case g.FORBIDDEN:N();break;default:{let n=q(s)||`HTTP ${o} Error`;t.error({message:"Request failed",description:n});break}}},h=useMemo(()=>$.create({prefixUrl:e,retry:0,timeout:Z,headers:{Accept:"application/json","Content-Type":"application/json"},hooks:{beforeRequest:[s=>{i&&s.headers.set("Authorization",`Bearer ${i}`),!s.headers.has(b$1)&&x!=="v1"&&(a||!S?s.headers.set(b$1,"global"):s.headers.set(b$1,encodeURIComponent(String(S))));}],beforeError:[async s=>{let{response:n}=s;if(n){let c=n.status,l;try{let u=n.headers.get("content-type")||"";(u.includes("application/json")||u.startsWith("text/"))&&(l=await n.clone().json());}catch{}B(c,l);}else t.error({message:"Network Error",description:s.message||"Network request failed"});return s}]}}),[e,i,a,S,x]),p=async(o,s,n,c)=>{let{responseType:l,...u}=c||{},d={...u,hooks:{...u.hooks,afterResponse:[...u.hooks?.afterResponse||[],F(l)]}},m;return n?m=await h(s,{method:o,json:n,...d}):m=await h(s,{method:o,...d}),oe(m,l)};return {get:(o,s)=>p("GET",o,void 0,s),post:(o,s,n)=>p("POST",o,s,n),put:(o,s,n)=>p("PUT",o,s,n),delete:(o,s)=>p("DELETE",o,void 0,s),patch:(o,s,n)=>p("PATCH",o,s,n),options:(o,s)=>p("OPTIONS",o,void 0,s),head:(o,s)=>p("HEAD",o,void 0,s),request:o=>{let{url:s,...n}=o;return p(n.method||"GET",s,void 0,n)},instance:h}};var Ve={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]}};export{P as a,Y as b,J as c,se as d,Ve as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d,a,e}from'./chunk-WHOTHZUW.js';import {b}from'./chunk-LRMME3YZ.js';import {useQuery}from'@tanstack/react-query';function K(e$1,s){let t=d(),{permissionVersion:n}=a(),o=n!=="v1"?"/api/usystem/user/checkV2":"/api/usystem/user/check",r=typeof e$1<"u"?typeof e$1=="string"?[e$1]:e$1:[],g=n!=="v1"?"v2":"v1",{data:i,...d$1}=useQuery({queryKey:r.length>0?e.permissions.check(r,g):["permissions","disabled"],queryFn:()=>t.post(o,{json:{permissions:r},...s}),enabled:r.length>0}),p=!0;return typeof e$1=="string"?p=i?.has_all?!0:i?.[e$1]??!1:Array.isArray(e$1)&&e$1.length>0&&(p=r.reduce((f,c)=>(f[c]=i?.has_all?!0:i?.[c]??!1,f),{})),{...d$1,data:p}}function v(){let{signInPath:e$1,gameId:s}=a(),t=d();return useQuery({queryKey:e.menus.navbar(s?String(s):void 0),queryFn:()=>t.get("/api/usystem/menu/navbar",{headers:{[b]:s?encodeURIComponent(String(s)):"global"}}),enabled:window.location.pathname!==e$1})}var w=()=>{let{gameApiV2:e$1,permissionVersion:s}=a(),t=d(),n=s!=="v1"?e$1?"/api/game/list":"/api/usystem/game/all":null;return useQuery({queryKey:e.enums.gameGroups,queryFn:async()=>{if(!n)return [];let o={headers:{[b]:"global"}};return e$1?(await t.get(n,o))?.list??[]:await t.get(n,o)??[]},enabled:!!n,staleTime:1/0})};export{K as a,v as b,w as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d,e,a}from'./chunk-WHOTHZUW.js';import {useQuery,useQueryClient,useMutation}from'@tanstack/react-query';function q(){let e$1=d();return useQuery({queryKey:e.roles.all,queryFn:()=>e$1.get("/api/usystem/role/all")})}function f(e$1){let t=a(o=>o.permissionVersion),r=d(),n=t==="v2"?"v2":"v1";return useQuery({queryKey:e.roles.detail(e$1,n),queryFn:()=>r.get(`/api/usystem/role/${n==="v2"?"infoV2":"info"}?name=${e$1}`)})}function v(){let{permissionVersion:e$1}=a(o=>o),t=d(),r=useQueryClient(),n=e$1==="v2"?"v2":"v1";return useMutation({mutationKey:e.roles.create(n),mutationFn:({name:o,permissions:y})=>t.post(n==="v2"?"/api/usystem/role/createV2":"/api/usystem/role/create",{name:o,permissions:y}),onSuccess:()=>{r.invalidateQueries({queryKey:e.roles.all});}})}function K(){let{permissionVersion:e$1}=a(o=>o),t=d(),r=useQueryClient(),n=e$1==="v2"?"v2":"v1";return useMutation({mutationKey:e.roles.update(n),mutationFn:({id:o,name:y,permissions:p})=>t.post(n==="v2"?"/api/usystem/role/updateV2":"/api/usystem/role/update",{id:o,name:y,permissions:p}),onSuccess:()=>{r.invalidateQueries({queryKey:e.roles.all});}})}function R(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.roles.delete,mutationFn:({id:r,name:n})=>e$1.post("/api/usystem/role/delete",{id:r,name:n}),onSuccess:()=>{t.invalidateQueries({queryKey:e.roles.all});}})}function k(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.create,mutationFn:r=>e$1.post("/api/usystem/user/create",r),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function x(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.update,mutationFn:r=>e$1.post("/api/usystem/user/update",r),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function F(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.delete,mutationFn:({id:r,name:n})=>e$1.post("/api/usystem/user/delete",{id:r,name:n}),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function P(){let e$1=d();return useQuery({queryKey:e.permissions.allPermissions,queryFn:()=>e$1.get("/api/usystem/user/allPermssions"),staleTime:1/0})}function C(){let e$1=d();return useQuery({queryKey:e.permissions.allPermissionsV2,queryFn:()=>e$1.get("/api/usystem/user/allPermssionsV2"),staleTime:1/0})}export{q as a,f as b,v as c,K as d,R as e,k as f,x as g,F as h,P as i,C as j};
|