react-toolkits 2.22.8 → 2.22.10
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 +350 -26
- package/lib/chunk-4GULXGNG.js +1 -0
- package/lib/chunk-7NM3DK6A.js +1 -0
- package/lib/chunk-FXPGR372.js +0 -0
- package/lib/chunk-HZHE6R72.js +1 -0
- package/lib/chunk-JIBSYGRB.js +1 -0
- package/lib/chunk-JLHCYGWL.js +1 -0
- package/lib/chunk-JTDKSGJR.js +1 -0
- package/lib/chunk-LRMME3YZ.js +2 -0
- package/lib/chunk-MSKNHKMD.js +1 -0
- package/lib/chunk-O7AQM3CB.js +1 -0
- package/lib/chunk-OLM4QNJB.js +1 -0
- package/lib/chunk-RITI5HRV.js +1 -0
- package/lib/chunk-SJK2ZPEL.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/chunk-YIJSACFM.js +1 -0
- package/lib/chunk-ZCPZYTPN.js +1 -0
- package/lib/components.d.ts +429 -0
- package/lib/components.js +1 -0
- package/lib/constants.d.ts +11 -0
- package/lib/constants.js +1 -0
- package/lib/createMenuItem-HUQG2HQY.js +1 -0
- package/lib/hooks.d.ts +108 -0
- package/lib/hooks.js +1 -0
- package/lib/index.d.ts +21 -789
- package/lib/index.js +1 -2
- package/lib/menuItemList-AS6ZDOTZ.js +1 -0
- package/lib/modules.d.ts +7 -0
- package/lib/modules.js +1 -0
- package/lib/pages.d.ts +20 -0
- package/lib/pages.js +1 -0
- package/lib/roleDetail-2QUBILZK.js +1 -0
- package/lib/roleList-KWWVOLWJ.js +1 -0
- package/lib/services.d.ts +196 -0
- package/lib/services.js +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/updateMenuItem-7SUIOBXS.js +1 -0
- package/lib/userDetail-TXGT2W7X.js +1 -0
- package/lib/userList-ELLBMK76.js +1 -0
- package/lib/utils.d.ts +6 -0
- package/lib/utils.js +1 -0
- package/locale/chunk-GHHHKGNN.js +1 -0
- package/locale/hooks.js +1 -1
- package/locale/index.js +1 -1
- package/package.json +35 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# react-toolkits
|
|
2
2
|
|
|
3
|
+
## 2.22.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 426c6cb: 新增hooks子路径导出,重构相关组件,移除不再使用的drawer和modal组件,优化README文档以反映最新的结构和使用方式,提升代码可读性和用户体验。
|
|
8
|
+
|
|
9
|
+
## 2.22.9
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 92b3c0f: 新增多个子路径导出,优化包结构,提升Tree Shaking支持。同时更新README文档,增加特性描述和安装说明,确保用户更易于使用和理解。
|
|
14
|
+
|
|
3
15
|
## 2.22.8
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,44 +1,368 @@
|
|
|
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`、`InfiniteList`)
|
|
70
|
+
- `react-toolkits/hooks`:表单弹层 Hooks(如 `useFormDrawer`、`useFormModal`)
|
|
71
|
+
- `react-toolkits/pages`:内置页面与路由片段(如 `permissionRoutes`、`menuRoutes`、`SignIn`)
|
|
72
|
+
- `react-toolkits/services`:请求相关 Hooks(如 `usePermission`、`useMenuList`、`useGames`)
|
|
73
|
+
- `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`PermissionVersion`)
|
|
74
|
+
- `react-toolkits/types`:公共类型
|
|
75
|
+
- `react-toolkits/utils`:工具函数
|
|
76
|
+
- `react-toolkits/locale` 与 `react-toolkits/locale/*`:国际化资源与工具
|
|
77
|
+
|
|
78
|
+
示例:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { Layout } from 'react-toolkits/components'
|
|
82
|
+
import { useFormDrawer } from 'react-toolkits/hooks'
|
|
83
|
+
import { permissionRoutes } from 'react-toolkits/pages'
|
|
84
|
+
import { usePermission } from 'react-toolkits/services'
|
|
85
|
+
import { APP_ID_HEADER } from 'react-toolkits/constants'
|
|
86
|
+
import type { NavMenuItem } from 'react-toolkits/types'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 权限与菜单集成示例
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { createBrowserRouter } from 'react-router-dom'
|
|
93
|
+
import { Layout } from 'react-toolkits/components'
|
|
94
|
+
import { permissionRoutes, menuRoutes, SignIn } from 'react-toolkits/pages'
|
|
95
|
+
|
|
96
|
+
const router = createBrowserRouter([
|
|
97
|
+
{
|
|
98
|
+
path: '/',
|
|
99
|
+
element: <Layout />, // 自动接入面包屑、侧边栏与鉴权
|
|
100
|
+
children: [
|
|
101
|
+
// 权限/菜单内置片段(可按需选择)
|
|
102
|
+
...permissionRoutes,
|
|
103
|
+
...menuRoutes,
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
{ path: '/sign_in', element: <SignIn /> },
|
|
107
|
+
])
|
|
108
|
+
|
|
109
|
+
export default router
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 国际化(Locale)
|
|
113
|
+
|
|
114
|
+
内置基础语言包与上下文工具,也可与第三方 i18n 方案并存:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { useTranslation } from 'react-toolkits/locale'
|
|
118
|
+
import zhCN from 'react-toolkits/locale/zh_CN'
|
|
119
|
+
import enGB from 'react-toolkits/locale/en_GB'
|
|
120
|
+
|
|
121
|
+
const { t } = useTranslation()
|
|
122
|
+
// t('FilterFormWrapper.confirmText') → "查询"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
如果你已使用 `react-i18next` 等,可以仅复用本包的页面/菜单能力。
|
|
126
|
+
|
|
127
|
+
### 自定义菜单文案
|
|
128
|
+
|
|
129
|
+
- 使用 `react-toolkits/locale` 的 `useTranslation` 配合内置 key,或在你的 i18n 方案中映射同名 key
|
|
130
|
+
- 可按需引入 `react-toolkits/locale/zh_CN`、`en_GB` 等作为基础词条
|
|
131
|
+
|
|
132
|
+
## 目录结构(概览)
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
src/
|
|
136
|
+
components/ // 组件与 Hooks(以 react-toolkits/components 导出)
|
|
137
|
+
hooks/ // 表单弹层 Hooks(以 react-toolkits/hooks 导出)
|
|
138
|
+
features/ // 特性模块(权限/菜单等:hooks/组件/服务聚合)
|
|
139
|
+
pages/ // 内置页面与路由片段
|
|
140
|
+
services/ // 数据服务 hooks(依赖 libs/ky 与全局上下文)
|
|
141
|
+
constants/ // 常量与枚举
|
|
142
|
+
utils/ // 工具函数
|
|
143
|
+
locale/ // 国际化上下文与语言包
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 常用用法示例
|
|
147
|
+
|
|
148
|
+
### 列表(分页 `QueryList`)
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
import { QueryList } from 'react-toolkits/components'
|
|
152
|
+
|
|
153
|
+
export default function UserTable() {
|
|
154
|
+
return (
|
|
155
|
+
<QueryList
|
|
156
|
+
queryKey={['users']}
|
|
157
|
+
queryFn={async ({ page, pageSize }) => {
|
|
158
|
+
// 返回 { list: T[]; total: number }
|
|
159
|
+
const res = await fetch(`/api/users?page=${page}&pageSize=${pageSize}`)
|
|
160
|
+
return res.json()
|
|
161
|
+
}}
|
|
162
|
+
columns={[
|
|
163
|
+
{ title: 'ID', dataIndex: 'id' },
|
|
164
|
+
{ title: 'Name', dataIndex: 'name' },
|
|
165
|
+
]}
|
|
166
|
+
/>
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 列表(无限滚动 `InfiniteList`)
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
import { InfiniteList } from 'react-toolkits/components'
|
|
175
|
+
|
|
176
|
+
export default function LogList() {
|
|
177
|
+
return (
|
|
178
|
+
<InfiniteList
|
|
179
|
+
queryKey={['logs']}
|
|
180
|
+
queryFn={async ({ pageParam = 1 }) => {
|
|
181
|
+
// 返回 { list: T[]; nextPage?: number }
|
|
182
|
+
const res = await fetch(`/api/logs?page=${pageParam}`)
|
|
183
|
+
return res.json()
|
|
184
|
+
}}
|
|
185
|
+
itemRender={item => <div>{item.message}</div>}
|
|
186
|
+
/>
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 表单弹层(`useFormDrawer`)
|
|
192
|
+
|
|
193
|
+
```tsx
|
|
194
|
+
import { Button } from 'antd'
|
|
195
|
+
import { useFormDrawer } from 'react-toolkits/hooks'
|
|
196
|
+
|
|
197
|
+
export default function CreateUser() {
|
|
198
|
+
const { show, drawer } = useFormDrawer({
|
|
199
|
+
title: '新建用户',
|
|
200
|
+
onConfirm: async values => {
|
|
201
|
+
await fetch('/api/users', { method: 'POST', body: JSON.stringify(values) })
|
|
202
|
+
},
|
|
203
|
+
content: (
|
|
204
|
+
<>
|
|
205
|
+
<Form.Item name="name" label="姓名" rules={[{ required: true }]}>
|
|
206
|
+
<Input />
|
|
207
|
+
</Form.Item>
|
|
208
|
+
<Form.Item name="role" label="角色" rules={[{ required: true }]}>
|
|
209
|
+
<Select
|
|
210
|
+
options={[
|
|
211
|
+
{ value: 'admin', label: '管理员' },
|
|
212
|
+
{ value: 'user', label: '用户' },
|
|
213
|
+
]}
|
|
214
|
+
/>
|
|
215
|
+
</Form.Item>
|
|
216
|
+
</>
|
|
217
|
+
),
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<>
|
|
222
|
+
<Button onClick={show}>新建</Button>
|
|
223
|
+
{drawer}
|
|
224
|
+
</>
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### 表单弹层(`useFormModal`)
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
import { Button, Form, Input, Select } from 'antd'
|
|
233
|
+
import { useFormModal } from 'react-toolkits/hooks'
|
|
234
|
+
|
|
235
|
+
export default function EditUser() {
|
|
236
|
+
const { show, modal } = useFormModal({
|
|
237
|
+
title: '编辑用户',
|
|
238
|
+
onConfirm: async values => {
|
|
239
|
+
await fetch('/api/users', { method: 'PUT', body: JSON.stringify(values) })
|
|
240
|
+
},
|
|
241
|
+
content: (
|
|
242
|
+
<>
|
|
243
|
+
<Form.Item name="name" label="姓名" rules={[{ required: true }]}>
|
|
244
|
+
<Input />
|
|
245
|
+
</Form.Item>
|
|
246
|
+
<Form.Item name="role" label="角色" rules={[{ required: true }]}>
|
|
247
|
+
<Select
|
|
248
|
+
options={[
|
|
249
|
+
{ value: 'admin', label: '管理员' },
|
|
250
|
+
{ value: 'user', label: '用户' },
|
|
251
|
+
]}
|
|
252
|
+
/>
|
|
253
|
+
</Form.Item>
|
|
254
|
+
</>
|
|
255
|
+
),
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
<>
|
|
260
|
+
<Button onClick={() => show({ initialValues: { name: 'John', role: 'user' } })}>编辑</Button>
|
|
261
|
+
{modal}
|
|
262
|
+
</>
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 服务层 Hooks(`react-toolkits/services`)
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
import { usePermission, useMenuList } from 'react-toolkits/services'
|
|
271
|
+
|
|
272
|
+
export function UseDataExample() {
|
|
273
|
+
const { data: permissions } = usePermission()
|
|
274
|
+
const { data: menus } = useMenuList()
|
|
275
|
+
// 根据你的业务渲染
|
|
276
|
+
return null
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Ky 与请求拦截(`useKy`)
|
|
281
|
+
|
|
282
|
+
- 内置 `useKy` 封装了鉴权与 `APP_ID_HEADER` 注入逻辑,结合 Provider 的上下文使用
|
|
283
|
+
- 你也可以直接使用 `fetch`,但推荐统一通过 `services` 或 `useKy`
|
|
284
|
+
|
|
285
|
+
```tsx
|
|
286
|
+
import { useEffect } from 'react'
|
|
287
|
+
import { useKy } from 'react-toolkits/components'
|
|
288
|
+
import { APP_ID_HEADER } from 'react-toolkits/constants'
|
|
289
|
+
|
|
290
|
+
export default function FetchWithKy() {
|
|
291
|
+
const ky = useKy({
|
|
292
|
+
headers: {
|
|
293
|
+
[APP_ID_HEADER]: 'my-app-id',
|
|
294
|
+
},
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
useEffect(() => {
|
|
298
|
+
ky.get('/api/ping').json()
|
|
299
|
+
}, [ky])
|
|
300
|
+
|
|
301
|
+
return null
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
提示:若你的应用已有全局请求层,可仅复用本包页面/组件,将头与鉴权逻辑放到你的层中保持一致性。
|
|
306
|
+
|
|
307
|
+
## 迁移指南(从根导入 → 子路径导出)
|
|
308
|
+
|
|
309
|
+
过去:
|
|
310
|
+
|
|
311
|
+
```ts
|
|
312
|
+
import { ToolkitsProvider, Layout, useFormDrawer } from 'react-toolkits'
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
现在(推荐):
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
import { ToolkitsProvider, Layout } from 'react-toolkits/components'
|
|
319
|
+
import { useFormDrawer, useFormModal } from 'react-toolkits/hooks'
|
|
320
|
+
import { permissionRoutes } from 'react-toolkits/pages'
|
|
321
|
+
import { usePermission } from 'react-toolkits/services'
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
收益:边界清晰、按需打包更友好(Tree Shaking)。
|
|
325
|
+
|
|
326
|
+
### 权限版本兼容
|
|
327
|
+
|
|
328
|
+
- 历史上存在不同权限数据结构,`PermissionVersion` 用于适配后端变体
|
|
329
|
+
- 新项目建议使用 `V3`;旧项目如为 `V2`,只需在 `ToolkitsProvider` 中切换版本
|
|
330
|
+
|
|
331
|
+
## 常见问题(FAQ)
|
|
332
|
+
|
|
333
|
+
- 如何引入样式?
|
|
334
|
+
- 在应用入口一次性引入:`import 'react-toolkits/style.css'`
|
|
335
|
+
- Provider 放哪?
|
|
336
|
+
- 在应用根部使用 `ToolkitsProvider`,传入登录路径、主页路径、权限版本等配置。
|
|
337
|
+
- 如何自定义菜单?
|
|
338
|
+
- 通过 `Layout` 的 `items` 或参考示例应用的 `menu-items.tsx`。
|
|
339
|
+
- 如何统一请求与拦截?
|
|
340
|
+
- 使用 `useKy` 或 `services` 中的 hooks(自动注入鉴权与 App-ID 头)。
|
|
341
|
+
- 若需要自定义拦截,传入 `useKy` 的配置或在应用层包裹一层。
|
|
342
|
+
- 列表的数据结构需要什么格式?
|
|
343
|
+
- 分页:`{ list: T[]; total: number }`;无限滚动:`{ list: T[]; nextPage?: number }`
|
|
344
|
+
- 可以只用页面和路由,不用 Provider 吗?
|
|
345
|
+
- 不建议。多数功能依赖上下文(鉴权、国际化、请求)。若必须,请自行在应用层提供等价上下文。
|
|
346
|
+
|
|
347
|
+
## 本地开发与构建
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
# 构建
|
|
351
|
+
pnpm -C packages/react-toolkits build
|
|
352
|
+
|
|
353
|
+
# 开发调试(监听)
|
|
354
|
+
pnpm -C packages/react-toolkits dev
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
构建将产出多入口:`lib/index.js`、`lib/components.js`、`lib/hooks.js`、`lib/pages.js`、`lib/services.js`、`lib/types.js`、`lib/utils.js`,以及 `locale/*`。
|
|
358
|
+
|
|
359
|
+
提示:发布前请确保示例应用验证通过,并更新 `CHANGELOG.md` 描述变更与迁移说明。
|
|
360
|
+
|
|
361
|
+
## 变更与发布
|
|
362
|
+
|
|
363
|
+
- 更新日志见 `CHANGELOG.md`
|
|
364
|
+
- 遵循 semver;涉及子路径导出/目录变更会在次版本提供迁移说明
|
|
365
|
+
|
|
366
|
+
## 许可证
|
|
43
367
|
|
|
44
|
-
|
|
368
|
+
MIT
|
|
@@ -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 {b}from'./chunk-OLM4QNJB.js';import {create}from'zustand';import {Modal,Form}from'antd';import {useMemo,useEffect,useState,useCallback}from'react';import {jsx}from'react/jsx-runtime';var P=create((s,o)=>({open:new Map,usedIds:new Set,isOpen:e=>o().open.get(e)??!1,show(e){s({open:new Map(o().open).set(e,!0)});},hide(e){s({open:new Map(o().open).set(e,!1)});},hideAll(){s({open:new Map});},checkUniqueness(e){let{usedIds:r}=o();return !r.has(e)},registerIds(e){let{usedIds:r}=o();return r.has(e)?!1:(s({usedIds:new Set(r).add(e)}),!0)},cleanup(e){let{open:r,usedIds:i}=o(),l=new Map(r),n=new Set(i);l.delete(e),n.delete(e),s({open:l,usedIds:n});}}));function v(s){let{content:o,onConfirm:e,afterOpen:r,afterClose:i,...l}=s,n=useMemo(()=>b(),[]),{show:p,hide:u,isOpen:w,cleanup:t}=P();useEffect(()=>()=>{t(n);},[n,t]);let y=w(n),[x,c]=useState(!1),m=typeof o=="function",V=useCallback(async()=>{p(n),await r?.();},[n,p,r]),d=useCallback(()=>{u(n);},[n,u]),a=useCallback(async()=>{d(),await i?.();},[d,i]),f=useCallback(async()=>{try{c(!0),await e?.(),d(),await i?.();}catch(O){throw console.error("Modal confirm error:",O),O}finally{c(!1);}},[e,d,i]),M=jsx(Modal,{...l,open:y,confirmLoading:x,onOk:f,onCancel:a,children:m?o({hide:d}):o});return {id:n,show:V,hide:d,modal:M}}function N(s){let{content:o,form:e,formProps:r,onConfirm:i,onSuccess:l,afterClose:n,...p}=s,[u,w]=useState({}),[t]=Form.useForm();t=e||t;let y=typeof o=="function",{id:x,show:c,hide:m,modal:V}=v({...p,content:a=>jsx(Form,{...r,form:t,children:y?o(u,a):o}),onConfirm:async()=>{try{let a=await t.validateFields();await i?.(a,u),l?.(),m();}catch(a){throw console.error("Form validation or submission error:",a),a}},afterClose:()=>{n?.(t);}}),d=useCallback(a=>{let{initialValues:f,extraValues:M}=a||{};M&&w(M),f&&t.setFieldsValue(f),c();},[t,c]);return {id:x,show:d,hide:m,modal:V}}export{P as a,v as b,N as c};
|
|
@@ -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 {c,d,j,i}from'./chunk-XQERUQGQ.js';import {c as c$1}from'./chunk-HZHE6R72.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 {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 {PlusOutlined,LogoutOutlined,UserOutlined,MenuUnfoldOutlined,MenuFoldOutlined}from'@ant-design/icons';import*as B from'antd';import {Spin,Menu,Form,Result,Table,Button,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 {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useInfiniteQuery,useQueryClient}from'@tanstack/react-query';import {isEqual}from'lodash-es';import {create}from'zustand';import {persist,createJSONStorage,devtools,subscribeWithSelector}from'zustand/middleware';import {Link,useLocation,useNavigate}from'react-router-dom';var at=r=>{let{initialTags:a$1,addable:e,removable:t,addCallback:n,removeCallback:o}=r,{t:i}=a(),{token:c}=theme.useToken(),[p,I]=useState([]),[s,v]=useState(!1),[u,L]=useState(""),[m,f]=useState(-1),[h,x]=useState(""),k=useRef(null),P=useRef(null);useEffect(()=>{I(a$1??[]);},[a$1]),useEffect(()=>{s&&k.current?.focus();},[s]),useEffect(()=>{P.current?.focus();},[u]);let d=async y=>{if(await o?.(y)){let M=p.filter(ae=>ae!==y);I(M);}},V=()=>{v(!0);},F=y=>{L(y.target.value);},D=async()=>{u&&p.indexOf(u)===-1&&await n?.(u)&&I([...p,u]),v(!1),L("");},S=y=>{x(y.target.value);},j=()=>{let y=[...p];y[m]=h,I(y),f(-1),L("");},N={width:78,verticalAlign:"top"},re={background:c.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:p.map((y,C)=>m===C?jsx(Input,{ref:P,size:"small",style:N,value:h,onChange:S,onBlur:j,onPressEnter:j},y):jsx(Tag,{closable:t,style:{userSelect:"none"},onClose:async M=>{M.preventDefault(),await d(y);},children:jsx("span",{onDoubleClick:M=>{C!==0&&(f(C),x(y),M.preventDefault());},children:y})},y))}),e&&(s?jsx(Input,{ref:k,type:"text",size:"small",style:N,value:u,onChange:F,onBlur:D,onPressEnter:D}):jsxs(Tag,{style:re,onClick:V,children:[jsx(PlusOutlined,{}),"\xA0",i("global.add")]}))]})},ot=at;var ct=()=>create()(devtools(subscribeWithSelector((r,a)=>({instances:new Map,registerInstance(e,t,n,o,i){r(c=>{let p=c.instances.get(e);if(p){let v={...p,refetch:o,fetchNextPage:i},u=new Map(c.instances);return u.set(e,v),{instances:u}}let I={id:e,url:t,queryKey:n,payload:{page:0,formValue:{}},refetch:o,fetchNextPage:i},s=new Map(c.instances);return s.set(e,I),{instances:s}});},unregisterInstance(e){r(t=>{let n=new Map(t.instances);return n.delete(e)?{instances:n}:t});},updatePayload(e,t){r(n=>{let o=n.instances.get(e);if(!o)return n;let i={...o.payload,...t};if(!isEqual(o.payload,i)){let c={...o,payload:i},p=new Map(n.instances);return p.set(e,c),{instances:p}}return n});},getPayload(e){return a().instances.get(e)?.payload??{page:0,formValue:{}}},async refetch(e,t){let n=a().instances.get(e);if(!n){console.warn(`InfiniteList instance with id "${e}" not found`);return}if(t){let o=n.payload,i={...o,...t};isEqual(o,i)||a().updatePayload(e,t);}try{await n.refetch();}catch(o){throw console.error(`Failed to refetch InfiniteList instance "${e}":`,o),o}},async fetchNextPage(e){let t=a().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 a().instances.get(e)},getAllInstances(){return Array.from(a().instances.values())}})),{name:"infinite-list-store"})),pt=ct(),T=pt;var xt=(r,a$3)=>{let t={refreshInterval:0,initialPageParam:0,...r,dataAdapter:{...{items:l=>l?l.flatMap(g=>g?.list||g||[]):[],hasMore:l=>{if(!l)return !1;let g=l;return g?.hasMore||g?.has_more||!1},nextPageParam:(l,g,W)=>(G=>{if(!G)return !1;let H=G;return H?.hasMore||H?.has_more||!1})(l)?g.length:void 0},...r.dataAdapter}},{identifier:n,code:o,buttonsAlign:i,showReset:c,refreshInterval:p,request:I,tableExtra:s,renderForm:v,afterSuccess:u,afterError:L,dataAdapter:m,initialPageParam:f,footer:h,form:x,...k}=t,{t:P}=a(),[d$1]=Form.useForm(x),[V,F]=useState(!1),D=useRef(!1),S=useRef(3),j=d(),{data:N,isLoading:re}=a$1(o),y=useCallback(()=>T.getState().getPayload(n),[n]),C=useMemo(()=>d$1,[d$1]),{url:M,method:ae="GET",body:oe,params:ie,headers:Q,cacheTime:Ue=5*60*1e3,staleTime:Xe=0}=I,se=useMemo(()=>typeof Q=="function"?Q(C):Q,[Q,C]),le=useMemo(()=>{let l=y();return [M,n,N,V,l,se]},[M,n,N,V,y,se]),{data:U,fetchNextPage:ce,hasNextPage:Ie,isFetchingNextPage:be,refetch:X,isFetching:ve}=useInfiniteQuery({queryKey:le,queryFn:async({pageParam:l=f})=>{try{let g=y(),W=typeof ie=="function"?ie(g,l):ie,z=typeof oe=="function"?oe(g,l):oe,G={method:ae,searchParams:W,headers:se};z&&(z instanceof FormData?G.body=z:G.json=z);let H=await j.request({url:M,...G});return D.current=!0,u?.(S.current,C,[H]),H}catch(g){let W=g instanceof Error?g:new Error(String(g));throw L?.(W,S.current,C),W}},initialPageParam:f,getNextPageParam:(l,g)=>m?.nextPageParam?.(l,g,f),enabled:N&&V,retry:(l,g)=>!(l>=3||g?.message?.includes("401")),retryDelay:l=>Math.min(1e3*2**l,3e4),refetchOnWindowFocus:!1,refetchInterval:D.current?p:0,gcTime:Ue,staleTime:Xe});useEffect(()=>(T.getState().registerInstance(n,M,le,X,ce),()=>{T.getState().unregisterInstance(n);}),[n,M,le,X,ce]);let $=m?.items?.(U?.pages,C),pe=be,xe=!Ie,$e=!$||$.length===0,Pe=async()=>{S.current=0;let l=await d$1.getFieldsValue();try{await d$1.validateFields(),F(!0),T.getState().updatePayload(n,{page:0,formValue:l}),X();}catch{F(!1);}},Ye=()=>{S.current=2,ce();},Je=async()=>{S.current=1;try{d$1.resetFields();let l=await d$1.getFieldsValue();T.getState().updatePayload(n,{page:0,formValue:l}),await d$1.validateFields({validateOnly:!0}),X();}catch{}};if(useEffect(()=>{setTimeout(()=>{N&&d$1.validateFields({validateOnly:!0}).then(l=>{F(!0),T.getState().updatePayload(n,{page:0,formValue:l});}).catch(()=>{F(!1);});},300);},[N,d$1,n]),useImperativeHandle(a$3,()=>({data:U?.pages,dataSource:$,form:d$1,refetch:()=>T.getState().refetch(n),fetchNextPage:()=>T.getState().fetchNextPage(n),hasNextPage:!!Ie,isFetchingNextPage:be})),re)return jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:300}});if(!N)return jsx(Result,{status:403,subTitle:P("global.noEntitlement")});let Ze=h&&(()=>h(U?.pages)),et=()=>typeof s=="function"?s(C,U?.pages):s,tt=typeof v=="function"?jsx(a$2,{showReset:c,buttonsAlign:i,isConfirming:ve,onReset:Je,onConfirm:Pe,children:cloneElement(v(d$1),{onKeyUp:l=>{l.key==="Enter"&&Pe();}})}):jsx(Form,{form:d$1});return jsxs(Fragment,{children:[tt,et(),jsx("div",{style:{minHeight:"400px"},children:jsx(Table,{...k,dataSource:$,loading:ve,pagination:!1,footer:Ze})}),!$e&&jsx(Button,{block:!0,loading:pe,type:"link",htmlType:"button",disabled:pe||xe,onClick:Ye,children:P(pe?"InfiniteList.loadingText":xe?"InfiniteList.reachEndText":"InfiniteList.loadMoreText")})]})},Pt=forwardRef(xt),St=Pt;var Ve=create()(persist((r,a)=>({openKeys:[],setOpenKeys:e=>{let t=a();(t.openKeys.length!==e.length||!t.openKeys.every((n,o)=>n===e[o]))&&r({openKeys:e});},selectedKeys:[],setSelectedKeys:e=>{let t=a();(t.selectedKeys.length!==e.length||!t.selectedKeys.every((n,o)=>n===e[o]))&&r({selectedKeys:e});}}),{name:"nav",storage:createJSONStorage(()=>localStorage),partialize:r=>({openKeys:r.openKeys,selectedKeys:r.selectedKeys}),skipHydration:!1,version:1}));var Ke=memo(({to:r,children:a})=>jsx(Link,{to:r,children:a}));Ke.displayName="MemoizedLink";function Z(r){let a=[];if(r)for(let e=0;e<r.length;e++)if(r[e]===null||r[e].type==="divider")a[e]=r[e];else if(r[e].children){let{children:t,...n}=r[e];a[e]={...n,children:Z(t)};}else {let{route:t,label:n,...o}=r[e],i=t?jsx(Ke,{to:t,children:n}):n;a[e]={...o,label:i};}return a}function ee(r,a=[],e=[]){for(let t of r){let n=t?.children;if(Array.isArray(n)){let o=t.type!=="group"&&t.key?[...e,t.key]:e;ee(n,a,o);}else t&&a.push(Object.assign(t,{keypath:e}));}return a}var Ot=memo(function(a){let{items:e=[],theme:t,loading:n}=a,o=useLocation(),i=useRef(),c=useRef(),p=useMemo(()=>i.current===e?i.current?ee(i.current):[]:(i.current=e,ee(e)),[e]),I=useMemo(()=>i.current===e?i.current?Z(i.current):[]:Z(e),[e]),{openKeys:s,selectedKeys:v,setOpenKeys:u,setSelectedKeys:L}=Ve(),m=useCallback(f=>{let h=f.find(x=>!s.includes(x));if(h){let x=p.find(P=>P.key===h),k=x?.keypath?[...x.keypath,h]:[h];u(k);}else u(f);},[p,s,u]);return useEffect(()=>{if(c.current===o.pathname)return;c.current=o.pathname;let f=p.find(h=>o.pathname===h.route);if(f){let h=f.key,x=f.keypath;(v[0]!==h||!s.every((k,P)=>k===x[P]))&&(L([h]),u(x));}},[p,o.pathname,v,s,L,u]),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:v,onOpenChange:m})}),de=Ot;var {Spin:qt}=B,Wt=({children:r})=>{let{permissionVersion:a$1,gameId:e,isGlobal:t}=a$3(i=>i),{isLoading:n}=c(),{t:o}=a();return n?jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:400},children:jsx(qt,{})}):a$1==="v1"||t?r:e?jsx(Fragment$1,{children:r},e):jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:o("RequireGame.description")})},ye=Wt;var Qt=()=>{let{t:r}=a(),a$1=useNavigate(),{clearToken:e,getUser:t,signInPath:n}=a$3(s=>s),o=t(),i=()=>{e(),a$1(n);},c=s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),i());},p=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:r("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:p,children:jsxs(Space,{align:"center",children:[jsx("span",{children:o?.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})})},ge=Qt;var{Text:en}=Typography,tn=r=>{let{filter:a$1,options:e}=r,{t}=a(),{gameApiV2:n,gameId:o,setGameId:i}=a$3(m=>m),{data:c$1,isLoading:p}=c(),I=useQueryClient(),s=c$1?.filter(m=>a$1?.(m)??!0),v=typeof e=="function"?e(s):s?.map(m=>({label:m.name,value:n?m.game_id:m.id})),u=m=>{L(),i(m);},L=()=>{I.removeQueries({predicate:m=>{let f=m.queryKey;return !f.includes("/api/game/list")&&!f.includes("/api/usystem/game/all")}});};return useEffect(()=>{if(c$1&&c$1.length>0){let m=n?c$1[0].game_id:c$1[0].id;c$1.every(f=>String(f.game_id||f.id)!==String(o))&&i(m);}},[c$1]),jsxs(Space,{children:[jsx(en,{children:t("GameSelect.label")}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:o,placeholder:t("GameSelect.placeholder"),loading:p,style:{width:"200px"},options:v,onChange:u})]})},ze=tn;var _e=memo(({title:r,subtitle:a,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)"}})}),r&&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:r,style:{letterSpacing:"0.02em",textShadow:"0 1px 2px rgba(0, 0, 0, 0.05)"},children:r})})]}),jsx("div",{className:"w-full mt-2 overflow-hidden",style:{height:a&&!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:!a||t?1:0,transition:"opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}}),a&&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:a,children:a}),jsx("div",{className:"flex-1 border-t border-gray-200"})]})]})})]}));_e.displayName="LayoutHeader";var Be=_e;var {Spin:pn,theme:mn}=B,{Header:un,Sider:fn,Content:dn}=B.Layout,yn=r=>{let{collapsible:a,isMenuLoading:e,items:t,headerExtra:n,children:o,navWidth:i,filter:c,gameSelectOptions:p,title:I,subtitle:s}=r,{token:{colorBgContainer:v,colorBorder:u}}=mn.useToken(),{permissionVersion:L,navWidth:m,collapsible:f,mainPagePath:h,collapsed:x,setContext:k,isGlobal:P}=a$3(),[d,V]=useState(x),F=async()=>{V(!d),k({collapsed:!d});},D=a??f??!1;return jsxs(B.Layout,{children:[jsxs(fn,{collapsible:D,theme:"light",trigger:null,collapsed:d,width:i??m,style:{height:"100vh",overflowX:"hidden",overflowY:"auto",borderRightWidth:1,borderRightStyle:"solid",borderRightColor:u,transition:"all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:[jsx(Be,{title:I,subtitle:s,mainPagePath:h,collapsed:d||!1}),jsx(de,{items:t,loading:e})]}),jsxs(B.Layout,{children:[jsx(un,{style:{padding:"0 24px",background:v},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:[D&&jsx(Button,{type:"text",icon:d?jsx(MenuUnfoldOutlined,{}):jsx(MenuFoldOutlined,{}),style:{fontSize:"16px"},onClick:F}),L!=="v1"&&!P&&jsx(ze,{filter:c,options:p}),n?.left?.map(S=>jsx("span",{children:S.children},S.key))]}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[n?.right?.map(S=>jsx("span",{children:S.children},S.key)),jsx(ge,{})]})]})}),jsx(dn,{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(pn,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"200px"}}),children:jsx(ye,{children:o})})})]})]})},gn=yn;var bn=r=>{let{code:a$2,config:e,children:t}=r,{data:n,isLoading:o}=a$1(a$2,e),{t:i}=a();return o?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):n?jsx(Fragment,{children:t}):jsx(Result,{status:"403",subTitle:i("global.noEntitlement")})},vn=bn;export{ot as a,T as b,St as c,de as d,ye as e,ge as f,gn as g,vn as h};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$1,f,g}from'./chunk-XQERUQGQ.js';import {c}from'./chunk-HZHE6R72.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
|
+
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 {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}from'./chunk-7NM3DK6A.js';import {a}from'./chunk-X6ZI7RL7.js';import {Button,Tooltip}from'antd';import {jsx}from'react/jsx-runtime';var B=d=>{let{children:n,code:o,showLoading:i,disabled:l,config:m,...r}=d,u=o?Array.isArray(o)?o:[o]:[],{data:s,isLoading:f}=a(u,m),{t:P}=a$1();return f?jsx(Button,{loading:i,disabled:!i,...r,children:n}):typeof s=="boolean"||s&&Object.values(s).some(Boolean)?jsx(Button,{disabled:l,...r,children:n}):jsx(Tooltip,{defaultOpen:!1,title:P("global.noEntitlement"),children:jsx(Button,{disabled:!0,...r,children:n})})},y=B;export{y as a};
|
|
@@ -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};
|