react-toolkits 0.8.86 → 0.8.88

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ContextProvider/index.tsx","../src/locales/zh_CN.ts","../src/hooks/i18n.ts","../src/components/FilterFormWrapper/index.tsx","../src/utils/request.ts","../src/stores/token.ts","../src/utils/storage.ts","../src/components/GameSelect/index.tsx","../src/components/Highlight/index.tsx","../src/hooks/permission.ts","../src/components/PermissionButton/index.tsx","../src/components/QueryList/utils.ts","../src/stores/queryList.ts","../src/components/QueryList/constants.ts","../src/components/QueryList/index.tsx","../src/hooks/modal.tsx","../src/hooks/formModal.tsx","../src/pages/NotFound/index.tsx","../src/pages/OperationLogList/index.tsx","../src/constants/index.ts","../src/pages/SignIn/index.tsx","../src/features/permission/hooks/index.ts","../src/features/permission/components/PermissionCollapse/index.tsx","../src/features/permission/components/PermissionListV1/index.tsx","../src/features/permission/components/PermissionListV2/index.tsx","../src/features/permission/components/PermissionList/index.tsx","../src/features/permission/types/index.ts","../src/features/permission/index.ts","../src/pages/permission/UserList/index.tsx","../src/pages/permission/RoleList/index.tsx","../src/pages/permission/RoleDetail/index.tsx","../src/pages/permission/index.tsx","../src/index.ts","../src/components/DynamicTags/index.tsx","../src/components/InfiniteList/index.tsx","../src/components/Layout/index.tsx","../src/components/NavMenu/index.tsx","../src/components/NavMenu/store.ts","../src/components/UserWidget/index.tsx","../src/components/PermissionGuard/index.tsx","../src/utils/router.tsx"],"names":["createContext","useContext","createStore","jsx","useToolkitsContext","ToolkitsContext","defaultState","contextStore","ContextProvider","ContextProvider_default","init_ContextProvider","__esmMin","children","props","config","locale","zh_CN_default","init_zh_CN","get","has","template","useTranslation","key","data","init_i18n","Button","Space","theme","jsxs","FilterFormWrapper","FilterFormWrapper_default","init_FilterFormWrapper","extras","isConfirming","onConfirm","onReset","token","t","style","item","pick","qs","request","url","opts","body","params","headers","responseType","isGlobal","rest","parsed","queryParams","options","queryString","useTokenStore","game","useGameStore","isJsonBody","requestOpts","response","RequestError","responseInterceptor","json","init_request","init_GameSelect","init_token","__publicField","jwtDecode","useSWRImmutable","create","persist","useTokenValidation","skip","usePermissionApiV2","set","store","state","mixedStorage","init_storage","name","value","Select","Typography","useSWRConfig","createJSONStorage","Text","GameSelect","GameSelect_default","switching","id","matchGame","isPermissionApiV2","prevState","gameFilter","games","isLoading","setGame","setSwitching","mutate","onGameChange","useEffect","useState","flushSync","createRoot","renderToString","node","container","root","resolve","splitByTags","Highlight","Highlight_default","init_Highlight","str","regex","part","texts","htmlString","setHtmlString","result","text","index","useSWR","usePermissions","codes","isValidating","acc","curr","usePermission","code","init_permission","Tooltip","PermissionButton","PermissionButton_default","init_PermissionButton","showLoading","disabled","restProps","genSwrKey","payload","action","getParams","getBody","method","onePage","query","page","size","formValues","serialize","deepSortObject","deserialize","init_utils","obj","sortedKeys","sortedObj","useQueryListStore","init_queryList","swrKeyMap","propsMap","payloadMap","getSwrkKey","prevKey","nextKey","getPayload","defaultSize","swrKey","setPayload","updateSwrKey","defaultProps","init_constants","Form","Result","Spin","Table","forwardRef","useImperativeHandle","useRef","QueryListAction","InternalQueryList","QueryList","QueryList_default","init_QueryList","ref","internalProps","form","refreshInterval","extra","renderForm","afterSuccess","getTotal","getDataSource","onTableChange","tableProps","internalForm","accessible","listAction","setProps","removeFromStore","shouldPoll","originalData","setOriginalData","listData","formRenderer","currentPage","currentSize","Modal","useMemo","useModal","content","modalProps","uuid","modalStore","useModalStore","open","confirmLoading","setConfirmLoading","isRenderFunction","show","hide","internalModal","init_modal","useFormModal","formProps","internalExtraValues","setInternalExtraValues","hanldeConfirm","values","afterClose","modal","operation","initialValues","extraValues","init_formModal","NotFound_exports","__export","NotFound_default","useNavigate","NotFound","init_NotFound","navigate","notFoundRedirectUrl","OperationLogList_exports","OperationLogList_default","Card","Col","Input","Row","dayjs","Option","Paragraph","OperationLogList","init_OperationLogList","columns","SSO_URL","SignIn_exports","SignIn_default","Alert","Divider","Navigate","useLocation","useSearchParams","logoUrl","SignIn","init_SignIn","init_background","searchParams","location","setToken","signInPageTitle","localeDropdownMenu","signInSuccessRedirectUrl","idaasRedirectUrl","background_default","useSWRMutation","useAllPermissions","useAllPermissionsV2","useAllRoles","useRole","useCreateRole","arg","useUpdateRole","useRemoveRole","useCreateUser","useUpdateUser","useRemoveUser","init_hooks","Checkbox","Collapse","useCallback","PermissionCollapse","PermissionCollapse_default","init_PermissionCollapse","permissions","readonly","expand","onChange","activeKey","setActiveKey","checkedMap","setCheckedMap","internalValue","setInternalValue","onCollapseChange","getCheckedValue","checkedValue","tempValue","onCheckChange","e","category","permission","Skeleton","PermissionListV1","PermissionListV1_default","init_PermissionListV1","error","Empty","PermissionListV2","PermissionListV2_default","init_PermissionListV2","gameList","setGameList","globalPermissions","gamePermissions","list","addGame","prev","removeGame","_","i","newValue","selectedValue","pev","temp","gameId","Fragment","PermissionList","PermissionList_default","init_PermissionList","init_types","UserList_exports","UserList_default","UserAddOutlined","App","Tag","produce","Link","useCreateModal","message","roles","refresh","role","useUpdateUserModal","update","draft","UserList","init_UserList","remove","showCreateModal","createModal","showUpdateModal","updateModal","RoleList_exports","RoleList_default","UsergroupAddOutlined","useUpdateModal","RoleList","init_RoleList","match","viewable","RoleDetail_exports","RoleDetail_default","Breadcrumb","Descriptions","useParams","RoleDetail","init_RoleDetail","permission_exports","permission_default","lazy","Route","Routes","Permission","PlusOutlined","DynamicTags","initialTags","addable","removable","addCallback","removeCallback","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","handleClose","removedTag","newTags","tag","showInput","handleInputChange","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","DynamicTags_default","useSWRInfinite","InfiniteList","getRowKey","hasMore","transformArg","isValid","setIsValid","setFormValues","getKey","pageIndex","previousPageData","rowKey","args","setSize","isListValidating","dataSource","isLoadingMore","isReachingEnd","isEmpty","loadMore","InfiniteList_default","Antd","Suspense","Menu","memo","useNavStore","keys","withLink","label","route","checkChildren","child","transformItems","items","isPass","flatItems","keypath","NavMenu","menuItems","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","onOpenChange","latestOpenKey","NavMenu_default","LogoutOutlined","UserOutlined","Dropdown","UserWidget","clearToken","getUser","user","logoutRedirectUrl","UserWidget_default","Header","Sider","Content","ContentGuard","hideGameSelect","Layout","colorBgContainer","colorBorder","appTitle","layoutHeaderExtras","Layout_default","PermissionGuard","PermissionGuard_default","withLayout","WrappedComponent","withBaseRoutes","routes","sharedProps"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FC, Key, PropsWithChildren, ReactNode } from 'react'\nimport { createContext, useContext } from 'react'\nimport { createStore } from 'zustand'\nimport type { Locale } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport type { Game } from '../GameSelect'\nimport type { NavMenuItem } from '../NavMenu'\n\nexport interface ContextState {\n appTitle: ReactNode\n signInPageTitle?: ReactNode\n menuItems: NavMenuItem[]\n hideGameSelect: boolean\n usePermissionApiV2: boolean // 使用 V2 版本的权限接口\n gameFilter?: (game: Game) => boolean\n locale?: Locale\n localeDropdownMenu?: ReactNode\n signInSuccessRedirectUrl?: string // 登录成功后的重定向地址\n notFoundRedirectUrl?: string // 404 重定向地址\n logoutRedirectUrl?: string // 退出登录后的重定向地址\n idaasRedirectUrl: string // IDAAS 重定向地址\n layoutHeaderExtras?: { key: Key; children: ReactNode }[]\n isGlobal?: boolean // 用于设置 HTPP 请求内的 APP-ID header 的值,为 true 时的值为 “global”,为 false 时值为当前游戏的 ID。\n responseInterceptor?: (response: Response, opts: RequestOptions) => Promise<any>\n}\n\nconst defaultState: ContextState = {\n appTitle: '',\n menuItems: [],\n hideGameSelect: false,\n usePermissionApiV2: false,\n idaasRedirectUrl: '',\n isGlobal: false,\n}\n\n// 全局的上下文。因为 ContextProvider 支持嵌套,所以 toolkitContextStore 的值等同于最内层的 ContextProvider 包含的上下文。\nexport const contextStore = createStore<ContextState>(() => defaultState)\n\nconst ToolkitsContext = createContext<ContextState>(defaultState)\n\n// 最接近的祖先 ContextProvider 内包含的上下文。\nexport function useToolkitsContext() {\n return useContext(ToolkitsContext)\n}\n\nconst ContextProvider: FC<PropsWithChildren<Partial<ContextState>>> = ({ children, ...props }) => {\n const parentConfig = useToolkitsContext()\n\n const config = {\n ...parentConfig,\n ...props,\n isGlobal: props.isGlobal ?? false,\n }\n\n contextStore.setState(config)\n\n return <ToolkitsContext.Provider value={config}>{children}</ToolkitsContext.Provider>\n}\n\nContextProvider.displayName = 'ToolkitsContextProvider'\n\nexport default ContextProvider\n","import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员。',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n },\n SignIn: {\n title: '登录方式',\n thirdParty: '第三方登录',\n signInWithIDass: 'IDass 登录',\n notRegistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserWidget: {\n signOutText: '登出',\n },\n UserList: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n RoleList: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import { get, has, template } from 'lodash-es'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport zh_CN from '../locales/zh_CN'\nimport type { Locale } from '../types'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const { locale = zh_CN } = useToolkitsContext()\n\n return (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children } = props\n const { token } = theme.useToken()\n const t = useTranslation()\n\n const style = {\n maxWidth: 'none',\n background: token.colorFillAlter,\n borderWidth: token.lineWidth,\n borderStyle: token.lineType,\n borderColor: token.colorBorder,\n borderRadius: token.borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className=\"flex\">\n <div className=\"flex-1\">{children}</div>\n <div className=\"ml-8\">\n <Space>\n <Button type=\"primary\" loading={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>\n {extras?.map(item => <span key={item.key}>{item.children}</span>)}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { pick } from 'lodash-es'\nimport type { StringifyOptions } from 'query-string'\nimport qs from 'query-string'\nimport { contextStore } from '../components/ContextProvider'\nimport { useGameStore } from '../components/GameSelect'\nimport { useTokenStore } from '../stores/token'\n\nexport class RequestError extends Error {\n status!: number\n code?: number\n\n constructor(opts: { message?: string; status: number; code?: number }) {\n super(opts?.message)\n this.status = opts.status\n this.code = opts.code\n }\n}\n\ntype JsonResponse<T> = (\n | {\n code: number\n status?: never\n }\n | {\n code?: never\n status: number\n }\n) & {\n data: T\n msg: string\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: Record<string | number, any> | FormData | null\n params?: Record<string | number, any> | URLSearchParams | null\n responseType?: 'json' | 'blob' | 'text'\n isGlobal?: boolean\n}\n\nexport type RequestResponse<T> = Pick<Response, 'headers' | 'status' | 'statusText' | 'url'> & { data: T }\n\nexport async function request<T = any>(url: string, opts: RequestOptions = {}): Promise<RequestResponse<T>> {\n opts = Object.assign(opts, { responseType: opts.responseType ?? 'json' })\n let { body, params, headers, responseType, isGlobal, ...rest } = opts\n\n const parsed = qs.parseUrl(url)\n const queryParams = Object.assign({}, parsed.query, params)\n const options: StringifyOptions = {\n skipNull: true,\n skipEmptyString: true,\n strict: true,\n encode: true,\n }\n const queryString = qs.stringify(queryParams, options)\n url = queryString ? `${parsed.url}?${queryString}` : url\n\n headers = new Headers(headers)\n\n const token = useTokenStore?.getState()?.token\n\n if (token) {\n headers.set('Authorization', `Bearer ${token}`)\n }\n\n if (contextStore.getState().usePermissionApiV2) {\n if (isGlobal || contextStore.getState().isGlobal) {\n headers.set('App-ID', 'global')\n } else {\n const game = useGameStore.getState().game\n if (game) {\n headers.set('App-ID', game.id)\n }\n }\n }\n\n if (responseType === 'blob') {\n headers.append('Accept', 'application/octet-stream')\n } else if (responseType === 'json') {\n headers.append('Accept', 'application/json')\n }\n\n const isJsonBody = !!(body && typeof body === 'object' && !(body instanceof FormData))\n\n if (isJsonBody) {\n headers.set('Content-Type', 'application/json')\n }\n\n const requestOpts = Object.assign(rest, {\n headers,\n body: isJsonBody ? JSON.stringify(body) : body,\n }) as RequestInit\n\n const response = await fetch(url, requestOpts)\n\n if (!response.ok) {\n throw new RequestError({ status: response.status })\n }\n\n const responseInterceptor = contextStore.getState().responseInterceptor\n\n if (typeof responseInterceptor === 'function') {\n return await responseInterceptor(response, opts)\n } else {\n let data: T\n\n if (responseType === 'blob') {\n data = (await response.blob()) as T\n } else if (responseType === 'json') {\n const json = (await response.json()) as JsonResponse<T>\n if (json.code === 0 || json.status === 0) {\n data = json.data\n } else {\n throw new RequestError({\n code: json.code,\n status: response.status,\n message: json.msg,\n })\n }\n } else {\n data = (await response.text()) as T\n }\n\n return {\n ...pick(response, ['headers', 'status', 'statusText', 'url']),\n data,\n }\n }\n}\n","import { jwtDecode } from 'jwt-decode'\nimport useSWRImmutable from 'swr/immutable'\nimport { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenState {\n token: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nexport const useTokenStore = create<TokenState>()(\n persist(\n (set, get, store) => ({\n token: '',\n getUser: () => {\n try {\n return jwtDecode(get().token) as UserInfo\n } catch (_) {\n return null\n }\n },\n setToken: token => set({ token }),\n clearToken: () => {\n get().setToken('')\n store.persist.clearStorage()\n },\n }),\n {\n name: 'token',\n partialize: state => ({ token: state.token }),\n skipHydration: true,\n },\n ),\n)\n\nexport function useTokenValidation(skip = false) {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n useSWRImmutable(\n !skip ? (usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check') : null,\n (url: string) =>\n request(url, {\n method: 'POST',\n body: {\n permissions: ['100001'],\n },\n isGlobal: true,\n }),\n {\n suspense: true,\n },\n )\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n// 通过 SessionStorage 隔离数据,防止多开页面时的数据冲突\nexport const mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem: async (name: string) => {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","import { Select, Space, Typography } from 'antd'\nimport { useSWRConfig } from 'swr'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { mixedStorage } from '../../utils/storage'\nimport { contextStore, useToolkitsContext } from '../ContextProvider'\n\nconst { Text } = Typography\n\nexport interface Game {\n id: string\n name: string\n area: 'cn' | 'global'\n Ctime: string\n}\n\nexport interface GameState {\n game: Game | null\n games: Game[]\n isLoading: boolean\n setGame: (id: string) => void\n fetchGames: () => void\n switching: boolean // 切换游戏中\n setSwitching: (switching: boolean) => void\n}\n\nexport const useGameStore = create<GameState>()(\n persist(\n (set, get) => ({\n game: null,\n games: [],\n isLoading: false,\n switching: false,\n setSwitching: switching => {\n set({ switching })\n },\n setGame: id => {\n const matchGame = (get().games ?? []).find(item => item.id === id)\n set({ game: matchGame ?? null })\n },\n fetchGames: () => {\n const token = useTokenStore.getState().token\n const isPermissionApiV2 = contextStore.getState().usePermissionApiV2\n\n if (token && isPermissionApiV2) {\n set({ isLoading: true })\n\n fetch('/api/usystem/game/all', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n })\n .then(response => {\n if (response.ok) {\n return response.json()\n }\n throw new Error('Network response was not ok.')\n })\n .then((json: { code: number; data: Game[]; msg: string }) => {\n set({ games: json.data })\n })\n .finally(() => {\n set({ isLoading: false })\n })\n }\n },\n }),\n {\n name: 'game',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({ game: state.game }),\n },\n ),\n)\n\nuseTokenStore.subscribe((state, prevState) => {\n if (state.token !== prevState.token) {\n // FIXME: 因为请求会在 Mock Service Worker 启动前发出,所以这里需要延迟一段时间\n setTimeout(() => {\n useGameStore.getState().fetchGames()\n }, 400)\n }\n})\n\nuseTokenStore.persist.rehydrate()\n\nconst GameSelect = () => {\n const t = useTranslation()\n const { gameFilter } = useToolkitsContext()\n const { game, games, isLoading, setGame, setSwitching } = useGameStore()\n const { mutate } = useSWRConfig()\n\n const options = (games ?? [])\n ?.filter(item => gameFilter?.(item) ?? true)\n ?.map(item => ({\n label: item.name,\n value: item.id,\n }))\n\n const onGameChange = async (id: string) => {\n setSwitching(true)\n // 清除 SWR 缓存\n setGame(id)\n await mutate(\n key => {\n return !(typeof key === 'string' && key.startsWith('/api/usystem/game/all'))\n },\n undefined,\n { revalidate: false },\n )\n setSwitching(false)\n }\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={game?.id}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n style={{ width: '200px' }}\n options={options}\n onChange={onGameChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightTextsProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightTextsProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <div dangerouslySetInnerHTML={{ __html: htmlString }}></div>\n}\n\nexport default Highlight\n","import type { SWRConfiguration } from 'swr'\nimport useSWR from 'swr'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ntype PermissionCheckResult = { has_all: true } | { [k: string]: boolean }\n\nexport function usePermissions(codes: string[], isGlobal?: boolean, config?: SWRConfiguration) {\n const { usePermissionApiV2 } = useToolkitsContext()\n const { data, isValidating, isLoading } = useSWR(\n codes.length > 0 ? [usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check', codes] : null,\n ([url]) =>\n request<PermissionCheckResult>(url, {\n method: 'POST',\n body: {\n permissions: codes,\n },\n isGlobal,\n }).then(response => {\n if (response.data?.has_all) {\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = true\n return acc\n },\n {} as Record<string, boolean>,\n )\n }\n\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = (response.data as Record<string, boolean>)?.[curr] ?? false\n return acc\n },\n {} as Record<string, boolean>,\n )\n }),\n {\n revalidateOnFocus: false,\n ...config,\n },\n )\n\n return { data, isValidating, isLoading }\n}\n\nexport function usePermission(code: string | undefined, isGlobal?: boolean, config?: SWRConfiguration) {\n const { data, isValidating, isLoading } = usePermissions(code ? [code] : [], isGlobal, config)\n\n if (code === undefined) {\n return {\n accessible: true,\n isValidating: false,\n isLoading: false,\n }\n }\n\n return {\n accessible: data?.[code] ?? false,\n isValidating,\n isLoading,\n }\n}\n","import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermissions } from '../../hooks/permission'\n\nexport interface PermissionButtonProps extends ButtonProps {\n code: string | string[]\n showLoading?: boolean\n isGlobal?: boolean\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, isGlobal, disabled, ...restProps } = props\n const { data, isLoading } = usePermissions(Array.isArray(code) ? code : [code], isGlobal)\n const t = useTranslation()\n\n if (isLoading) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n if (!Object.values(data ?? {})?.some(Boolean)) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n }\n\n return (\n <Button disabled={disabled} {...restProps}>\n {children}\n </Button>\n )\n}\n\nexport default PermissionButton\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport qs from 'query-string'\nimport type { QueryListProps } from '.'\nimport type { QueryListPayload } from '../../stores/queryList'\n\ninterface SwrKeyObject {\n url: string\n params?: Record<string, any>\n body?: Record<string, any>\n}\n\nconst deepSortObject = (obj: unknown): unknown => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepSortObject)\n }\n\n const sortedKeys = Object.keys(obj).sort()\n const result: Record<string, unknown> = {}\n\n sortedKeys.forEach(key => {\n result[key] = deepSortObject((obj as Record<string, unknown>)[key])\n })\n\n return result\n}\n\nexport const serialize = (obj: SwrKeyObject) => {\n // 因为键的顺序会影响序列化结果,所以需要先排序。\n const sortedObj = deepSortObject(obj)\n return JSON.stringify(sortedObj)\n}\n\nexport const deserialize = (key: string) => JSON.parse(key) as SwrKeyObject\n\n// 生成 SWR 的 key,用于缓存请求结果。\nexport function genSwrKey(props: QueryListProps, payload?: QueryListPayload) {\n const { action, getParams, getBody, method, onePage } = props\n const { url, query } = qs.parseUrl(action)\n const { page, size, formValues } = payload ?? {}\n\n const params = Object.assign(\n query,\n typeof getParams === 'function'\n ? getParams?.({\n page,\n size,\n formValues,\n })\n : method === 'GET'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : {},\n )\n\n const body =\n typeof getBody === 'function'\n ? getBody?.({ page, size, formValues })\n : method === 'POST'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : undefined\n\n return serialize({\n url,\n body,\n params,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { mutate } from 'swr'\nimport type { MutatorCallback, MutatorOptions } from 'swr/_internal'\nimport { create } from 'zustand'\nimport type { QueryListDataType, QueryListProps } from '../components/QueryList'\nimport { genSwrKey } from '../components/QueryList/utils'\n\ntype QueryListMutator = <Item = any>(\n action: string,\n data?: QueryListDataType<Item> | Promise<QueryListDataType<Item>> | MutatorCallback<QueryListDataType<Item>>,\n opts?: MutatorOptions<QueryListDataType<Item>>,\n) => void\n\nexport interface QueryListPayload<FormValues = any> {\n page?: number\n size?: number\n formValues?: FormValues\n}\n\nexport interface QueryListState {\n swrKeyMap: Map<string, string | null>\n payloadMap: Map<string, QueryListPayload>\n propsMap: Map<string, QueryListProps>\n getSwrkKey(action: string): string | null\n updateSwrKey(action: string, key?: string | null): void\n getPayload: (action: string) => QueryListPayload | undefined\n setPayload(action: string, payload: Partial<QueryListPayload>): void\n mutate: QueryListMutator\n refresh(action: string, page?: number): void\n removeFromStore(action: string): void\n setProps: (action: string, props: QueryListProps) => void\n}\n\nexport const useQueryListStore = create<QueryListState>((set, get) => ({\n swrKeyMap: new Map(),\n payloadMap: new Map(),\n propsMap: new Map(),\n getSwrkKey(action) {\n const { swrKeyMap } = get()\n return swrKeyMap.get(action) ?? null\n },\n updateSwrKey(action, key) {\n const { propsMap, payloadMap, swrKeyMap, getSwrkKey } = get()\n const prevKey = getSwrkKey(action)\n\n if (!propsMap.has(action)) {\n throw new Error(`The action \"${action}\" is not registered in QueryList`)\n }\n\n if (key === null) {\n swrKeyMap.set(action, null)\n mutate(prevKey, undefined, false)\n } else if (key === undefined) {\n const nextKey = genSwrKey(propsMap.get(action) as QueryListProps, payloadMap.get(action))\n\n if (prevKey !== nextKey) {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, nextKey) })\n } else {\n mutate(prevKey, undefined, true)\n }\n } else {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, key) })\n }\n },\n getPayload(action) {\n const { payloadMap } = get()\n return payloadMap.get(action)\n },\n setPayload(action, payload) {\n const { payloadMap, getPayload, propsMap } = get()\n const { defaultSize } = propsMap.get(action) ?? {}\n set({\n payloadMap: new Map(payloadMap).set(action, {\n page: 1,\n size: defaultSize,\n ...(getPayload(action) ?? {}),\n ...payload,\n }),\n })\n },\n mutate: (action, data, opts) => {\n const { swrKeyMap } = get()\n const swrKey = swrKeyMap.get(action)\n mutate(swrKey, data, opts)\n },\n refresh(action, page) {\n const { setPayload, updateSwrKey, payloadMap } = get()\n setPayload(action, { page: page ?? payloadMap.get(action)?.page })\n updateSwrKey(action)\n },\n removeFromStore(action) {\n get().swrKeyMap.delete(action)\n get().payloadMap.delete(action)\n get().propsMap.delete(action)\n },\n setProps(action, props) {\n const { propsMap } = get()\n set({ propsMap: new Map(propsMap).set(action, props) })\n },\n}))\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const defaultProps = {\n method: 'GET',\n defaultSize: 10,\n refreshInterval: 0,\n getTotal: (response: any) => response.total,\n getDataSource: (response: any) => response.list,\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\nimport useSWR from 'swr'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport type { QueryListPayload } from '../../stores/queryList'\nimport { useQueryListStore } from '../../stores/queryList'\nimport type { ListResponse } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\nimport { defaultProps } from './constants'\nimport { deserialize } from './utils'\n\nexport enum QueryListAction {\n Confirm = 'confirm',\n Reset = 'reset',\n Jump = 'jump',\n Init = 'init',\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item = any, Values = any, Response = any> {\n data: QueryListDataType<Item>\n internalForm: FormInstance<Values>\n originalData: Response | undefined\n}\n\nexport interface QueryListProps<Item = any, Values = any, Response = any>\n extends Pick<\n TableProps<Item>,\n 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered' | 'components'\n > {\n code?: string\n isGlobal?: boolean\n action: string\n method?: string\n refreshInterval?: number\n // 无分页\n onePage?: boolean\n defaultSize?: number\n headers?: RequestOptions['headers'] | ((payload: QueryListPayload<Values> | undefined) => RequestOptions['headers'])\n form?: FormInstance<Values>\n getBody?: (payload: QueryListPayload<Values>) => RequestOptions['body']\n getParams?: (payload: QueryListPayload<Values>) => RequestOptions['params']\n renderForm?: (internalForm: FormInstance<Values>) => ReactNode\n extra?: (opts: { form: FormInstance<Values>; data: Response | undefined }) => ReactNode\n onTableChange?: TableProps<Item>['onChange']\n afterSuccess?: (action: QueryListAction, data: QueryListDataType<Item>) => void\n // 默认的接口返回类型为 ListResponse<Item>,当符合时无需设置 getTotal、getDataSource 就可以让组件正确获取 total 与 dataSource。\n getTotal?: (response: Response) => number\n getDataSource?: (response: Response) => Item[]\n}\n\nconst InternalQueryList = <Item extends object, Values extends object | undefined, Response = ListResponse<Item>>(\n props: QueryListProps<Item, Values, Response>,\n ref: Ref<QueryListRef<Item, Values, Response>>,\n) => {\n const internalProps = { ...defaultProps, ...props }\n\n const {\n action,\n code,\n headers,\n isGlobal,\n onePage,\n method,\n form,\n getBody,\n getParams,\n defaultSize,\n refreshInterval,\n extra,\n renderForm,\n afterSuccess,\n getTotal,\n getDataSource,\n onTableChange,\n ...tableProps\n } = internalProps\n\n const t = useTranslation()\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n const { accessible, isLoading } = usePermission(code, isGlobal)\n const listAction = useRef<QueryListAction>(QueryListAction.Init)\n const { setProps, getPayload, setPayload, getSwrkKey, updateSwrKey, removeFromStore } = useQueryListStore()\n const shouldPoll = useRef(false)\n const [originalData, setOriginalData] = useState<Response>()\n\n const { data, isValidating } = useSWR(\n getSwrkKey(action),\n async key => {\n const { url, params, body } = deserialize(key)\n const payload = getPayload(action)\n const response = await request<Response>(url, {\n method,\n body,\n params,\n isGlobal,\n headers: typeof headers === 'function' ? headers(payload) : headers,\n })\n\n setOriginalData(response.data)\n\n return {\n dataSource: getDataSource(response.data),\n total: getTotal(response.data) ?? 0,\n }\n },\n {\n fallbackData: {\n dataSource: [],\n total: 0,\n },\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n refreshInterval: shouldPoll.current ? refreshInterval : 0,\n onSuccess(listData) {\n shouldPoll.current = true\n afterSuccess?.(listAction.current, listData)\n },\n onError() {\n shouldPoll.current = false\n },\n },\n )\n\n const onConfirm = async () => {\n listAction.current = QueryListAction.Confirm\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields()\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n const onReset = async () => {\n listAction.current = QueryListAction.Reset\n internalForm.resetFields()\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n useEffect(() => {\n setProps(action, internalProps)\n\n return () => {\n // 组件卸载时清除缓存\n removeFromStore(action)\n }\n }, [])\n\n useEffect(() => {\n const init = async () => {\n if (accessible) {\n setPayload(action, { page: 1, size: defaultSize, formValues: internalForm.getFieldsValue() })\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n }\n }\n\n init()\n }, [accessible])\n\n useImperativeHandle(ref, () => ({\n data,\n originalData,\n internalForm,\n }))\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const formRenderer = renderForm ? (\n <FilterFormWrapper isConfirming={isValidating} onReset={onReset} onConfirm={onConfirm}>\n {renderForm(internalForm)}\n </FilterFormWrapper>\n ) : (\n // 消除 Antd 的警告\n <Form form={internalForm} />\n )\n\n return (\n <div>\n {formRenderer}\n {extra && <div className=\"mt-2 mb-4\">{extra({ form: internalForm, data: originalData })}</div>}\n <Table\n {...tableProps}\n dataSource={data.dataSource}\n loading={isValidating}\n pagination={\n onePage\n ? false\n : {\n showSizeChanger: true,\n showQuickJumper: true,\n current: getPayload(action)?.page,\n pageSize: getPayload(action)?.size ?? defaultSize,\n total: data.total,\n onChange: async (currentPage: number, currentSize: number) => {\n listAction.current = QueryListAction.Jump\n setPayload(action, { page: currentPage, size: currentSize })\n updateSwrKey(action)\n },\n }\n }\n onChange={onTableChange}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends object,\n Values extends object | undefined,\n Response = ListResponse<Item>,\n>(\n props: QueryListProps<Item, Values, Response> & { ref?: Ref<QueryListRef<Item, Values, Response>> },\n) => ReactElement\n\nexport default QueryList\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { create } from 'zustand'\n\ninterface ModalState {\n open: Map<number, boolean>\n getOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n}\n\nexport const useModalStore = create<ModalState>((set, get) => ({\n open: new Map(),\n getOpen: uuid => get().open.get(uuid) ?? false,\n show(uuid) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map() })\n },\n}))\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n}\n\nlet id = 0\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, ...modalProps } = props\n const uuid = useMemo(() => ++id, [])\n const modalStore = useModalStore()\n const open = modalStore.getOpen(uuid)\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n const isRenderFunction = typeof content === 'function'\n\n const show = () => {\n modalStore.show(uuid)\n }\n\n const hide = () => {\n modalStore.hide(uuid)\n }\n\n const onCancel: ModalProps['onCancel'] = () => {\n hide()\n }\n\n const onOk = async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } finally {\n setConfirmLoading(false)\n }\n }\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? content({ hide }) : content}\n </Modal>\n )\n\n return {\n uuid,\n show,\n hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport type { UseModalOperation, UseModalProps } from './modal'\nimport { useModal } from './modal'\n\ntype RecursivePartial<T> = NonNullable<T> extends object\n ? {\n [P in keyof T]?: NonNullable<T[P]> extends (infer U)[]\n ? RecursivePartial<U>[]\n : NonNullable<T[P]> extends object\n ? RecursivePartial<T[P]>\n : T[P]\n }\n : T\n\nexport interface UseFormModalProps<Values, ExtraValues>\n extends Omit<UseModalProps, 'afterClose' | 'onConfirm' | 'content'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n}\n\nexport function useFormModal<Values, ExtraValues extends NonNullable<unknown> = NonNullable<unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n) {\n const { content, form, formProps, onConfirm, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n\n const isRenderFunction = typeof content === 'function'\n\n const hanldeConfirm = async () => {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues as ExtraValues)\n hide()\n }\n\n const afterClose = () => {\n internalForm.resetFields()\n }\n\n const { uuid, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? content(internalExtraValues as ExtraValues, operation) : content}\n </Form>\n ),\n onConfirm: hanldeConfirm,\n afterClose,\n })\n\n const onShow = ({\n initialValues,\n extraValues,\n }: {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n } = {}) => {\n if (extraValues) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n }\n\n return {\n uuid,\n show: onShow,\n hide,\n modal,\n }\n}\n","import { Button, Result } from 'antd'\nimport { useNavigate } from 'react-router-dom'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst NotFound = () => {\n const navigate = useNavigate()\n const t = useTranslation()\n const { notFoundRedirectUrl } = useToolkitsContext()\n\n return (\n <div className=\"h-screen flex justify-center items-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n notFoundRedirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(notFoundRedirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Col, Form, Input, Row, Select, Typography } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\nimport QueryList from '../../components/QueryList'\nimport type { OperationLogListItem } from '../../features/log'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst { Option } = Select\nconst { Paragraph } = Typography\n\nconst OperationLogList: FC = () => {\n const t = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'id',\n title: 'ID',\n dataIndex: 'id',\n width: 100,\n },\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n {\n List: OperationLogListItem[]\n Total: number\n }\n >\n tableLayout=\"fixed\"\n rowKey=\"id\"\n columns={columns}\n action=\"/api/usystem/log/list\"\n getParams={({ page, size, formValues }) => ({ ...formValues, page, size })}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n renderForm={form => (\n <Form form={form}>\n <Row gutter={10}>\n <Col span={4}>\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear style={{ width: '100px' }}>\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n","import { Alert, Button, Divider, Form, Input, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { Navigate, useLocation, useSearchParams } from 'react-router-dom'\nimport useSWRImmutable from 'swr/immutable'\nimport backgroundUrl from '../../assets/background.svg'\nimport logoUrl from '../../assets/logo.png'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { SSO_URL } from '../../constants'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { request } from '../../utils/request'\n\nconst SignIn: FC = () => {\n const [searchParams] = useSearchParams()\n const location = useLocation()\n const { token, setToken } = useTokenStore()\n const t = useTranslation()\n const { signInPageTitle, localeDropdownMenu, signInSuccessRedirectUrl, idaasRedirectUrl } = useToolkitsContext()\n\n useSWRImmutable(\n searchParams.has('ticket') ? `/api/usystem/user/login?ticket=${searchParams.get('ticket')}` : null,\n url => request<{ token: string }>(url),\n {\n suspense: true,\n onSuccess: data => {\n setToken(data.data.token)\n },\n },\n )\n\n if (token) {\n if (signInSuccessRedirectUrl) {\n return <Navigate replace to={signInSuccessRedirectUrl} />\n }\n\n return <Navigate replace to=\"/\" />\n }\n\n return (\n <div className=\"w-screen h-screen relative flex\">\n {localeDropdownMenu && <div className=\"absolute top-16 right-16 z-10\">{localeDropdownMenu}</div>}\n <div className=\"absolute left-14 top-6\">\n <Space align=\"center\">\n <img src={logoUrl} className=\"w-12\" alt=\"logo\" />\n {signInPageTitle}\n </Space>\n </div>\n <div className=\"flex-1 flex justify-center items-center bg-slate-50\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-10/12\" />\n </div>\n <div className=\"w-[650px] relative top-0 left-0 right-0 bottom-0\">\n <div className=\"absolute top-1/2 -translate-y-1/2 left-0 right-0\">\n <div className=\"-translate-y-10 px-36\">\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10\">\n {location.state?.notUser && <Alert banner closable message={t('SignIn.notRegistered')} type=\"error\" />}\n </div>\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n <div className=\"mt-4\">\n <Form layout=\"vertical\" autoComplete=\"off\">\n <Form.Item label={t('global.username')} name=\"username\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.password')} name=\"password\" rules={[{ required: true }]}>\n <Input.Password />\n </Form.Item>\n <Form.Item>\n <Button block type=\"primary\" shape=\"round\" htmlType=\"submit\">\n {t('global.signIn')}\n </Button>\n </Form.Item>\n </Form>\n </div>\n <Divider plain dashed>\n {t('SignIn.thirdParty')}\n </Divider>\n <div className=\"flex justify-center items-center\">\n <Button block shape=\"round\" href={`${SSO_URL}/login?service=${idaasRedirectUrl}`} target=\"_self\">\n <img src={logoUrl} className=\"w-[18px] mr-2 -mb-0.5\" alt=\"logo\" />\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n","import useSWR from 'swr'\nimport useSWRMutation from 'swr/mutation'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport type { Game } from '../../../components/GameSelect'\nimport { usePermission } from '../../../hooks/permission'\nimport { request } from '../../../utils/request'\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllPermissions() {\n return useSWR('/api/usystem/user/allPermssions', url =>\n request<PermissionEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllPermissionsV2() {\n return useSWR('/api/usystem/user/allPermissionsV2', url =>\n request<{\n game: Game[]\n permission: PermissionEnumItem[]\n }>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllRoles() {\n const { accessible } = usePermission('200005', true)\n return useSWR(accessible ? '/api/usystem/role/all' : null, url =>\n request<RoleEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useRole(name: string) {\n const { usePermissionApiV2 } = useToolkitsContext()\n return useSWR(`/api/usystem/role/${usePermissionApiV2 ? 'infoV2' : 'info'}?name=${name}`, (url: string) =>\n request<RoleV1 | RoleV2>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useCreateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/createV2' : '/api/usystem/role/create',\n (\n url: string,\n {\n arg,\n }: {\n arg: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/updateV2' : '/api/usystem/role/update',\n (\n url: string,\n {\n arg,\n }: {\n arg: { id: number; name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveRole() {\n return useSWRMutation(\n '/api/usystem/role/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: number; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useCreateUser() {\n return useSWRMutation(\n '/api/usystem/user/create',\n (\n url,\n {\n arg,\n }: {\n arg: { name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateUser() {\n return useSWRMutation(\n '/api/usystem/user/update',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveUser() {\n return useSWRMutation(\n '/api/usystem/user/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n","import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport type { PermissionEnumItem } from '../../types'\n\ninterface PermissionCollapseProps {\n expand?: boolean\n permissions?: PermissionEnumItem[]\n readonly?: boolean\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst PermissionCollapse: FC<PermissionCollapseProps> = props => {\n const { permissions, readonly, expand, value, onChange } = props\n const [activeKey, setActiveKey] = useState<string[]>([])\n const [checkedMap, setCheckedMap] = useState<Record<string, boolean>>({})\n const [internalValue, setInternalValue] = useState<string[]>(value ?? [])\n const t = useTranslation()\n\n const onCollapseChange = useCallback((key: string | string[]) => {\n setActiveKey(key as string[])\n }, [])\n\n const getCheckedValue = (checkedValue: boolean, codes: string[]) => {\n let tempValue: string[] = []\n\n if (checkedValue) {\n tempValue = [...new Set(internalValue.concat(codes))]\n } else {\n tempValue = internalValue.slice()\n\n codes.forEach(code => {\n const index = tempValue.findIndex(item => item === code)\n if (index > -1) {\n tempValue.splice(index, 1)\n }\n })\n }\n\n return tempValue\n }\n\n const onCheckChange = (e: CheckboxChangeEvent, codes: string[]) => {\n const checkedValue = getCheckedValue(e.target.checked, codes)\n setInternalValue(checkedValue)\n onChange?.(checkedValue)\n }\n\n useEffect(() => {\n setInternalValue(value ?? [])\n }, [value])\n\n useEffect(() => {\n if (expand) {\n setActiveKey((permissions ?? []).map(({ category }) => category))\n }\n }, [expand, permissions])\n\n useEffect(() => {\n const checkedValue = (permissions ?? []).reduce(\n (acc, curr) => {\n acc[curr.category] = curr.permissions.every(item => internalValue?.includes(item.value))\n return acc\n },\n {} as Record<string, boolean>,\n )\n\n setCheckedMap(checkedValue)\n }, [internalValue, permissions])\n\n return (\n <Collapse\n style={{ width: '100%' }}\n collapsible=\"header\"\n activeKey={activeKey}\n items={(permissions ?? []).map(item => ({\n key: item.category,\n label: item.category,\n extra: !readonly && (\n <Checkbox\n checked={checkedMap[item.category]}\n onChange={e => {\n onCheckChange(\n e,\n item.permissions.map(permission => permission.value),\n )\n }}\n >\n {t('global.selectAll')}\n </Checkbox>\n ),\n children: (\n <Checkbox.Group style={{ width: '100%' }} value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} style={{ width: '100%' }}>\n {item.permissions.map(permission => (\n <Col key={permission.value} span={6}>\n <Checkbox\n value={permission.value}\n onChange={e => {\n onCheckChange(e, [permission.value])\n }}\n >\n {permission.label}\n </Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n ),\n }))}\n onChange={onCollapseChange}\n />\n )\n}\n\nexport default PermissionCollapse\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissions } from '../../hooks'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\n\ninterface PermissionListV1Props extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionListV1: FC<PermissionListV1Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permissions, isLoading, error } = useAllPermissions()\n const t = useTranslation()\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n return (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value}\n permissions={permissions}\n readonly={readonly}\n expand={expand}\n onChange={onChange}\n />\n </Skeleton>\n )\n}\n\nexport default PermissionListV1\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissionsV2 } from '../../hooks'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionListV2Props extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionListV2: FC<PermissionListV2Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: { permission, game: games } = {}, isLoading, error } = useAllPermissionsV2()\n const [gameList, setGameList] = useState<{ gameId: string; permissions: string[] }[]>([])\n const globalPermissions = permission?.filter(item => item.is_common)\n const gamePermissions = permission?.filter(item => !item.is_common)\n const t = useTranslation()\n\n useEffect(() => {\n const list: { gameId: string; permissions: string[] }[] = []\n\n Object.keys(value ?? {}).forEach(key => {\n if (key !== 'global') {\n list.push({ gameId: key, permissions: value?.[key] ?? [] })\n }\n })\n\n setGameList(list)\n }, [value])\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n const addGame = () => {\n setGameList(prev => [...prev, { gameId: '', permissions: [] }])\n }\n\n const removeGame = (index: number) => {\n setGameList(prev => prev.filter((_, i) => i !== index))\n }\n\n return (\n <div className=\"flex flex-col w-full\">\n <div className=\"mb-12\">\n <Divider dashed>{t('PermissionList.baseSectionTitle')}</Divider>\n </div>\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.global}\n readonly={readonly}\n permissions={globalPermissions}\n expand={expand}\n onChange={newValue => {\n onChange?.({\n ...value,\n global: newValue,\n })\n }}\n />\n </Skeleton>\n <div className=\"my-12\">\n <Divider dashed>{t('PermissionList.gameSectionTitle')}</Divider>\n </div>\n {gameList.map((item, index) => (\n <Card\n title={\n <Space>\n <Text>{t('global.game')}</Text>\n {readonly ? (\n <Text>{games?.find(game => game.id === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n style={{ width: '160px' }}\n placeholder={t('PermissionList.gameSelectPlaceholder')}\n onChange={selectedValue => {\n setGameList(pev => {\n const temp = pev.slice()\n temp[index].gameId = selectedValue\n return temp\n })\n }}\n >\n {games?.map(game => (\n <Option key={game.id} value={game.id} disabled={gameList.some(({ gameId }) => gameId === game.id)}>\n {game.name}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n }\n key={index}\n className=\"mb-6\"\n extra={\n !readonly && (\n <Button\n type=\"link\"\n onClick={() => {\n removeGame(index)\n }}\n >\n {t('PermissionList.removeText')}\n </Button>\n )\n }\n >\n {gameList[index].gameId ? (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.[gameList[index].gameId]}\n readonly={readonly}\n expand={expand}\n permissions={gamePermissions}\n onChange={newValue => {\n onChange?.({\n ...value,\n [gameList[index].gameId]: newValue,\n })\n }}\n />\n </Skeleton>\n ) : (\n <Empty description={t('PermissionList.gameSectionDescription')} />\n )}\n </Card>\n ))}\n {!readonly && (\n <Button block type=\"dashed\" onClick={addGame}>\n {t('PermissionList.addText')}\n </Button>\n )}\n </div>\n )\n}\n\nexport default PermissionListV2\n","import type { FC } from 'react'\nimport { useToolkitsContext } from '../../../../components/ContextProvider'\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionListV1 from '../PermissionListV1'\nimport PermissionListV2 from '../PermissionListV2'\n\nexport interface PermissionListPropsBase {\n expand?: boolean\n readonly?: boolean\n}\n\ninterface PermissionListProps extends PermissionListPropsBase {\n value?: RoleV1['permissions'] | RoleV2['permissions']\n onChange?: (checkedValue: RoleV1['permissions'] | RoleV2['permissions']) => void\n}\n\nconst PermissionList: FC<PermissionListProps> = (props: PermissionListProps) => {\n const { value } = props\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return (\n <>\n {usePermissionApiV2 ? (\n <PermissionListV2 {...props} value={value as RoleV2['permissions']} />\n ) : (\n <PermissionListV1 {...props} value={value as RoleV1['permissions']} />\n )}\n </>\n )\n}\n\nexport default PermissionList\n","export interface PermissionEnumItem {\n category: string\n is_common?: boolean\n permissions: {\n label: string\n value: string\n route: string\n }[]\n}\n\nexport interface RoleEnumItem {\n id: string\n name: string\n}\n\nexport interface RoleListItem {\n id: number\n name: string\n ctime: string\n}\n\nexport interface RoleV1 {\n id: number\n name: string\n ctime: string\n permissions: string[]\n}\n\nexport interface RoleV2 {\n id: number\n name: string\n ctime: string\n permissions: Record<string, string[]>\n}\n\nexport interface UserListItem {\n id: string\n name: string\n ctime: string\n roles: string[]\n}\n","import PermissionList from './components/PermissionList'\n\nexport * from './hooks'\nexport * from './types'\nexport { PermissionList }\n","import { UserAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Col, Form, Input, Row, Select, Space, Tag } from 'antd'\nimport { produce } from 'immer'\nimport type { FC } from 'react'\nimport { Link } from 'react-router-dom'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { UserListItem } from '../../../features/permission'\nimport { useAllRoles, useCreateUser, useRemoveUser, useUpdateUser } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { useQueryListStore } from '../../../stores/queryList'\n\nconst { Option } = Select\n\nexport const action = '/api/usystem/user/list'\n\nfunction useCreateModal() {\n const { message } = App.useApp()\n const create = useCreateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { refresh } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }>({\n title: t('UserList.createTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select allowClear mode=\"multiple\" loading={isLoading}>\n {(roles ?? []).map(role => (\n <Option value={role.name} key={role.id}>\n {role.name}\n </Option>\n ))}\n </Select>\n </Form.Item>\n </>\n ),\n async onConfirm(values) {\n await create.trigger(values)\n refresh(action, 1)\n message.success(t('UserList.createSuccessfully'))\n },\n })\n}\n\nfunction useUpdateUserModal() {\n const { message } = App.useApp()\n const update = useUpdateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { mutate } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }, { id: string }>({\n title: t('UserList.updateTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n mode=\"multiple\"\n loading={isLoading}\n options={roles?.map(role => ({\n label: role.name,\n value: role.name,\n }))}\n />\n </Form.Item>\n </>\n ),\n async onConfirm(values, extraValues) {\n await update.trigger(values)\n mutate<UserListItem>(\n action,\n prev => {\n return produce(prev, draft => {\n if (draft?.dataSource) {\n const index = draft.dataSource?.findIndex(item => item.id === extraValues?.id)\n if (index !== -1) {\n draft.dataSource[index].roles = values.roles\n }\n }\n })\n },\n { revalidate: false },\n )\n message.success(t('UserList.updateSuccessfully'))\n },\n })\n}\n\nconst UserList: FC = () => {\n const { modal, message } = App.useApp()\n const remove = useRemoveUser()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateUserModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<UserListItem> = [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render(value: string[]) {\n return (\n <Row gutter={[4, 4]}>\n {(value || []).map((item: string) => (\n <Col key={item}>\n {item === 'root' ? (\n <Tag color=\"#f50\">{item}</Tag>\n ) : (\n <Tag color=\"#ff5a00\">\n <Link to={`/permission/role/${item}`}>{item}</Link>\n </Tag>\n )}\n </Col>\n ))}\n </Row>\n )\n },\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'Ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: UserListItem) => (\n <Space>\n <PermissionButton\n isGlobal\n size=\"small\"\n type=\"link\"\n code=\"100003\"\n onClick={() => {\n showUpdateModal({\n initialValues: {\n name: value.name,\n roles: value.roles,\n },\n extraValues: {\n id: value.id,\n },\n })\n }}\n >\n {t('global.update')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n size=\"small\"\n code=\"100004\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('UserList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('UserList.deleteContent', { user: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('UserList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n ),\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n icon={<UserAddOutlined />}\n code=\"100002\"\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('UserList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<UserListItem, undefined, { List: UserListItem[]; Total: number }>\n isGlobal\n code=\"100001\"\n action={action}\n rowKey=\"id\"\n columns={columns}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default UserList\n","import { UsergroupAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Form, Input, Space } from 'antd'\nimport { produce } from 'immer'\nimport { Link } from 'react-router-dom'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../../../features/permission'\nimport { PermissionList, useCreateRole, useRemoveRole, useUpdateRole } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { usePermission } from '../../../hooks/permission'\nimport { useQueryListStore } from '../../../stores/queryList'\nimport { request } from '../../../utils/request'\n\nconst action = '/api/usystem/role/list'\n\nconst useCreateModal = () => {\n const { message } = App.useApp()\n const { refresh } = useQueryListStore()\n const create = useCreateRole()\n const t = useTranslation()\n\n const onConfirm = async (values: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) => {\n await create.trigger({\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n refresh(action, 1)\n message.success(t('RoleList.createSuccessfully'))\n }\n\n return useFormModal<{\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }>({\n title: t('RoleList.createTitle'),\n width: '50vw',\n formProps: {\n layout: 'vertical',\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm,\n })\n}\n\nconst useUpdateModal = () => {\n const { message } = App.useApp()\n const { mutate } = useQueryListStore()\n const update = useUpdateRole()\n const t = useTranslation()\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n {\n id: number\n }\n >({\n title: t('RoleList.updateTitle'),\n width: '50vw',\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm: async (values, extraValues) => {\n await update.trigger({\n id: extraValues?.id as number,\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n mutate(\n action,\n prev =>\n produce(prev, draft => {\n const match = draft?.dataSource?.find(item => item.id === extraValues?.id)\n\n if (match) {\n match.permissions = values.permissions\n }\n }),\n { revalidate: false },\n )\n message.success(t('RoleList.updateSuccessfully'))\n },\n })\n}\n\nconst RoleList = () => {\n const { accessible: viewable } = usePermission('200005', true)\n const { modal, message } = App.useApp()\n const { usePermissionApiV2 } = useToolkitsContext()\n const remove = useRemoveRole()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<RoleListItem> = [\n {\n title: t('global.name'),\n key: 'name',\n render(value: RoleListItem) {\n if (viewable) {\n return (\n <Link to={`${value.name}`} relative=\"path\">\n {value.name}\n </Link>\n )\n } else {\n return <>{value.name}</>\n }\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: RoleListItem) => {\n return (\n <Space size=\"small\">\n <PermissionButton\n isGlobal\n code=\"200003\"\n size=\"small\"\n type=\"link\"\n onClick={async () => {\n const { data: role } = await request<RoleV1 | RoleV2>(\n `/api/usystem/role/info${usePermissionApiV2 ? 'V2' : ''}?name=${value.name}`,\n { isGlobal: true },\n )\n showUpdateModal({\n initialValues: {\n permissions: role?.permissions,\n name: role?.name.replace(/^role_/, ''),\n },\n extraValues: {\n id: role?.id,\n },\n })\n }}\n >\n {t('global.edit')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n code=\"200004\"\n size=\"small\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('RoleList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('RoleList.deleteContent', { role: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('RoleList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n )\n },\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.role')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n code=\"200002\"\n icon={<UsergroupAddOutlined />}\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('RoleList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<RoleListItem, undefined, { List: RoleListItem[]; Total: number }>\n isGlobal\n rowKey=\"name\"\n columns={columns}\n code=\"200001\"\n action={action}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default RoleList\n","import { Breadcrumb, Card, Descriptions, Skeleton } from 'antd'\nimport { Link, useParams } from 'react-router-dom'\nimport { PermissionList, useRole } from '../../../features/permission'\nimport { useTranslation } from '../../../hooks/i18n'\n\nconst RoleDetail = () => {\n const params = useParams()\n const { data, isLoading } = useRole(params.name as string)\n const t = useTranslation()\n\n return (\n <>\n <Breadcrumb\n style={{ marginBottom: 24 }}\n items={[\n {\n key: '1',\n title: <Link to=\"..\">{t('global.role')}</Link>,\n },\n {\n key: '2',\n title: params.name,\n },\n ]}\n />\n <Card title={t('RoleDetail.title')}>\n <Skeleton loading={isLoading}>\n <Descriptions column={3} layout=\"vertical\">\n <Descriptions.Item label={t('global.name')}>{data?.name}</Descriptions.Item>\n <Descriptions.Item label=\"ID\">{data?.id}</Descriptions.Item>\n <Descriptions.Item label={t('global.creationTime')}>{data?.ctime}</Descriptions.Item>\n </Descriptions>\n <PermissionList readonly value={data?.permissions} />\n </Skeleton>\n </Card>\n </>\n )\n}\n\nexport default RoleDetail\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nconst UserList = lazy(() => import('./UserList'))\nconst RoleList = lazy(() => import('./RoleList'))\nconst RoleDetail = lazy(() => import('./RoleDetail'))\n\nconst Permission = () => {\n return (\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n )\n}\n\nexport default Permission\n","import type { ContextState } from './components/ContextProvider'\nimport ContextProvider, { contextStore, useToolkitsContext } from './components/ContextProvider'\nimport type { DynamicTagsProps } from './components/DynamicTags'\nimport DynamicTags from './components/DynamicTags'\nimport type { FilterFormWrapperProps } from './components/FilterFormWrapper'\nimport FilterFormWrapper from './components/FilterFormWrapper'\nimport type { Game, GameState } from './components/GameSelect'\nimport GameSelect, { useGameStore } from './components/GameSelect'\nimport type { HighlightTextsProps } from './components/Highlight'\nimport Highlight from './components/Highlight'\nimport type { InfiniteListProps } from './components/InfiniteList'\nimport InfiniteList from './components/InfiniteList'\nimport Layout from './components/Layout'\nimport type { NavMenuItem } from './components/NavMenu'\nimport NavMenu from './components/NavMenu'\nimport type { PermissionButtonProps } from './components/PermissionButton'\nimport PermissionButton from './components/PermissionButton'\nimport type { PermissionGuardProps } from './components/PermissionGuard'\nimport PermissionGuard from './components/PermissionGuard'\nimport type { QueryListProps, QueryListRef } from './components/QueryList'\nimport QueryList, { QueryListAction } from './components/QueryList'\nimport UserWidget from './components/UserWidget'\nimport type { UseFormModalProps } from './hooks/formModal'\nimport { useFormModal } from './hooks/formModal'\nimport { useTranslation } from './hooks/i18n'\nimport { useModal, useModalStore } from './hooks/modal'\nimport { usePermission, usePermissions } from './hooks/permission'\nimport NotFound from './pages/NotFound'\nimport OperationLogList from './pages/OperationLogList'\nimport SignIn from './pages/SignIn'\nimport Permission from './pages/permission'\nimport { useQueryListStore } from './stores/queryList'\nimport type { TokenState } from './stores/token'\nimport { useTokenStore, useTokenValidation } from './stores/token'\nimport './styles/index.css'\nimport type { Locale } from './types'\nimport type { RequestOptions, RequestResponse } from './utils/request'\nimport { RequestError, request } from './utils/request'\nimport { withBaseRoutes, withLayout } from './utils/router'\nimport { mixedStorage } from './utils/storage'\n\nexport {\n ContextProvider,\n DynamicTags,\n FilterFormWrapper,\n GameSelect,\n Highlight,\n InfiniteList,\n Layout,\n NavMenu,\n NotFound,\n OperationLogList,\n Permission,\n PermissionButton,\n PermissionGuard,\n QueryList,\n QueryListAction,\n RequestError,\n SignIn,\n UserWidget,\n contextStore,\n mixedStorage,\n request,\n useFormModal,\n useGameStore,\n useModal,\n useModalStore,\n usePermission,\n usePermissions,\n useQueryListStore,\n useTokenStore,\n useTokenValidation,\n useToolkitsContext,\n useTranslation,\n withBaseRoutes,\n withLayout,\n type ContextState,\n type DynamicTagsProps,\n type FilterFormWrapperProps,\n type Game,\n type GameState,\n type HighlightTextsProps,\n type InfiniteListProps,\n type Locale,\n type NavMenuItem,\n type PermissionButtonProps,\n type PermissionGuardProps,\n type QueryListProps,\n type QueryListRef,\n type RequestOptions,\n type RequestResponse,\n type TokenState,\n type UseFormModalProps,\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, CSSProperties, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const t = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n const tagInputStyle: CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n style={tagInputStyle}\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n style={{ userSelect: 'none' }}\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport qs from 'query-string'\nimport type { Key, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport useSWRInfinite from 'swr/infinite'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\n\ninterface InfiniteListExtra<Values> {\n key: Key\n children: ReactNode | ((form: FormInstance<Values>) => ReactNode)\n}\n\nexport interface InfiniteListProps<Item, Values, Response>\n extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'> {\n action: string\n getRowKey: (response: Response) => any\n getDataSource: (data: Response[] | undefined) => Item[]\n code?: string\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n renderForm?: (form: FormInstance<Values>) => ReactNode\n transformArg: (values: Values, rowKey?: string) => Record<any, any>\n hasMore?: (data: Response[] | undefined) => boolean\n isGlobal?: boolean\n extras?: InfiniteListExtra<Values>[]\n}\n\nconst InfiniteList = <Item extends object, Values extends object | undefined = undefined, Response = any>(\n props: InfiniteListProps<Item, Values, Response>,\n) => {\n const {\n code,\n action,\n extras,\n headers,\n isGlobal,\n getRowKey,\n getDataSource,\n hasMore,\n renderForm,\n transformArg,\n ...tableProps\n } = props\n const t = useTranslation()\n const [form] = Form.useForm<Values>()\n const { accessible, isLoading } = usePermission(code)\n const [isValid, setIsValid] = useState(false)\n const [formValues, setFormValues] = useState<Values>()\n\n const getKey = (pageIndex: number, previousPageData: Response) => {\n if (!isValid) return null\n\n const rowKey = pageIndex !== 0 ? getRowKey(previousPageData) : undefined\n const args = transformArg(formValues as Values, rowKey)\n const queryString = qs.stringify(args)\n\n return queryString ? `${action}?${qs.stringify(args)}` : action\n }\n\n const {\n data,\n size,\n setSize,\n isValidating: isListValidating,\n } = useSWRInfinite(\n getKey,\n arg =>\n request<Response>(arg, {\n headers: typeof headers === 'function' ? headers(form) : headers,\n isGlobal,\n }).then(response => response.data),\n {\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n revalidateFirstPage: false,\n },\n )\n\n const dataSource = getDataSource(data)\n const isLoadingMore = isListValidating || (size > 0 && data && typeof data[size - 1] === 'undefined')\n const isReachingEnd = typeof hasMore !== 'undefined' ? !hasMore(data) : true\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n const values = await form.getFieldsValue()\n setFormValues(values)\n\n try {\n await form.validateFields()\n setSize(1)\n setIsValid(true)\n } catch (_) {\n setSize(0)\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n setSize(size + 1)\n }\n\n const onReset = async () => {\n try {\n form.resetFields()\n await form.validateFields({ validateOnly: true })\n setSize(1)\n } catch (_) {\n setSize(0)\n }\n }\n\n useEffect(() => {\n if (accessible) {\n form\n .validateFields({ validateOnly: true })\n .then(values => {\n setFormValues(values)\n setIsValid(true)\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, [accessible])\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <>\n {renderForm ? (\n <FilterFormWrapper\n extras={extras?.map(extra => ({\n key: extra.key,\n children: typeof extra.children === 'function' ? extra.children(form) : extra.children,\n }))}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {renderForm(form)}\n </FilterFormWrapper>\n ) : (\n <Form form={form} />\n )}\n <Table {...tableProps} dataSource={dataSource} loading={isLoadingMore} pagination={false} />\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nexport default InfiniteList\n","import * as Antd from 'antd'\nimport { Card, Divider, Empty, Space } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Suspense } from 'react'\nimport logoUrl from '../../assets/logo.png'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useToolkitsContext } from '../ContextProvider'\nimport GameSelect, { useGameStore } from '../GameSelect'\nimport NavMenu from '../NavMenu'\nimport UserWidget from '../UserWidget'\n\nconst { Spin, theme } = Antd\nconst { Header, Sider, Content } = Antd.Layout\n\nconst ContentGuard: FC<PropsWithChildren> = props => {\n const { children } = props\n const { usePermissionApiV2, hideGameSelect } = useToolkitsContext()\n const { game, isLoading, switching } = useGameStore()\n const t = useTranslation()\n\n if (isLoading || switching) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (usePermissionApiV2 && !hideGameSelect && !game) {\n return (\n <Card>\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n </Card>\n )\n }\n\n return children\n}\n\nconst Layout: FC<PropsWithChildren> = props => {\n const { children } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { appTitle, usePermissionApiV2, hideGameSelect, localeDropdownMenu, layoutHeaderExtras } = useToolkitsContext()\n\n return (\n <Antd.Layout hasSider className=\"h-screen\">\n <Sider\n width={256}\n style={{\n overflow: 'auto',\n height: '100vh',\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n theme=\"light\"\n >\n <div className=\"flex items-center px-6 py-4\">\n <img src={logoUrl} alt=\"logo\" className=\"w-8 h-8\" />\n <div className=\"ml-2\">{appTitle}</div>\n </div>\n <NavMenu />\n </Sider>\n <Antd.Layout className=\"ml-64\">\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: colorBorder,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <div>{usePermissionApiV2 && !hideGameSelect && <GameSelect />}</div>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {layoutHeaderExtras?.map(extra => <span key={extra.key}>{extra.children}</span>)}\n {localeDropdownMenu}\n <UserWidget />\n </Space>\n </div>\n </Header>\n <Content className=\"p-6 bg-gray-50 over\">\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '200px',\n }}\n />\n }\n >\n <ContentGuard>{children}</ContentGuard>\n </Suspense>\n </Content>\n </Antd.Layout>\n </Antd.Layout>\n )\n}\n\nexport default Layout\n","import type { MenuProps } from 'antd'\nimport { Menu } from 'antd'\nimport type {\n ItemType,\n MenuDividerType,\n MenuItemGroupType,\n MenuItemType,\n SubMenuType,\n} from 'antd/es/menu/hooks/useItems'\nimport type { ReactNode } from 'react'\nimport { memo, useEffect, useMemo } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\nimport { usePermissions } from '../../hooks/permission'\nimport { useToolkitsContext } from '../ContextProvider'\nimport { useNavStore } from '../NavMenu/store'\n\n// 扩展 antd Menu 的类型,使其支持一些我们想要的自定义字段。\ntype MenuItemType2 = Merge<\n MenuItemType,\n {\n // 权限编号\n code?: string\n // 前端路由地址\n route?: string\n }\n>\n\ntype SubMenuType2 = Merge<\n SubMenuType,\n {\n children?: NavMenuItem[]\n }\n>\n\ntype MenuItemGroupType2 = Merge<MenuItemGroupType, { children?: NavMenuItem[] }>\n\nexport type NavMenuItem = MenuItemType2 | SubMenuType2 | MenuItemGroupType2 | MenuDividerType | null\n\nconst withLink = (label?: ReactNode, route?: string): ReactNode => {\n if (route) {\n return <Link to={route}>{label}</Link>\n }\n\n return label\n}\n\nfunction checkChildren(children: NavMenuItem[], permissions?: Record<string, boolean>): boolean {\n return (children ?? []).some(child => {\n if (child === null) {\n return false\n } else if ((child as MenuDividerType).type === 'divider') {\n return true\n } else {\n if ((child as SubMenuType2 | MenuItemGroupType2).children) {\n return checkChildren((child as SubMenuType2 | MenuItemGroupType2).children ?? [], permissions)\n } else {\n return !permissions || !(child as MenuItemType2).code || permissions[(child as MenuItemType2).code as string]\n }\n }\n })\n}\n\nfunction transformItems(items: NavMenuItem[], permissions?: Record<string, boolean>) {\n const result: ItemType[] = []\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null) {\n result[i] = null\n } else if ((items[i] as MenuDividerType).type === 'divider') {\n result[i] = { ...items[i] } as MenuDividerType\n } else {\n if ((items[i] as SubMenuType2 | MenuItemGroupType2).children) {\n const { children, ...restProps } = items[i] as SubMenuType2 | MenuItemGroupType2\n\n result[i] = checkChildren(children ?? [], permissions)\n ? ({\n ...restProps,\n children: transformItems(children ?? [], permissions),\n } as SubMenuType | MenuItemGroupType)\n : null\n } else {\n const { route, label, code, ...restProps } = items[i] as MenuItemType2\n const isPass = !code || !permissions || permissions[code]\n\n result[i] = isPass\n ? ({\n ...restProps,\n label: withLink(label, route),\n } as MenuItemType)\n : null\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nfunction flatItems(\n items: NavMenuItem[],\n result: Merge<MenuItemType2, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n) {\n for (const item of items) {\n const children = (item as SubMenuType2 | MenuItemGroupType2)?.children as NavMenuItem[]\n\n if (Array.isArray(children)) {\n const keys =\n (item as MenuItemGroupType2)!.type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, keys)\n } else if (item) {\n result.push(Object.assign(item as MenuItemType2, { keypath }))\n }\n }\n\n return result\n}\n\nconst NavMenu = memo(function NavMenu() {\n const location = useLocation()\n const { menuItems } = useToolkitsContext()\n const flattenItems = useMemo(() => flatItems(menuItems ?? []), [menuItems])\n const codes = flattenItems.map(item => item.code).filter(Boolean) as string[]\n const { data: permissions } = usePermissions(codes, true, { suspense: true })\n const internalItems = useMemo(() => transformItems(menuItems ?? [], permissions), [menuItems, permissions])\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n const onOpenChange: MenuProps['onOpenChange'] = keys => {\n const latestOpenKey = keys?.find(key => openKeys?.indexOf(key) === -1)\n const match = flattenItems.find(item => latestOpenKey === item.key)\n setOpenKeys((match?.keypath ?? [latestOpenKey]) as string[])\n }\n\n useEffect(() => {\n const match = flattenItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n setSelectedKeys([key])\n setOpenKeys(keypath)\n }\n }, [flattenItems, location])\n\n return (\n <Menu\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={onOpenChange}\n />\n )\n})\n\nif (process.env.NODE_ENV === 'development') {\n NavMenu.displayName = 'NavMenu'\n}\n\nexport default NavMenu\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n set => ({\n openKeys: [],\n setOpenKeys: keys => set({ openKeys: keys }),\n selectedKeys: [],\n setSelectedKeys: keys => set({ selectedKeys: keys }),\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n },\n ),\n)\n","import { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { useToolkitsContext } from '../ContextProvider'\n\nconst UserWidget: FC = () => {\n const navigate = useNavigate()\n const { clearToken, getUser } = useTokenStore()\n const user = getUser()\n const t = useTranslation()\n const { logoutRedirectUrl } = useToolkitsContext()\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n label: (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid\n <a\n data-cy=\"user-widget-logout\"\n onClick={() => {\n clearToken()\n if (logoutRedirectUrl) {\n navigate(logoutRedirectUrl)\n }\n }}\n >\n {t('UserWidget.signOutText')}\n </a>\n ),\n icon: <LogoutOutlined />,\n },\n ]\n\n return (\n <div data-cy=\"user-widget\">\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid */}\n <a\n onClick={e => {\n e.preventDefault()\n }}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserWidget\n","import { Result, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\n\nexport interface PermissionGuardProps {\n code: string\n}\n\nconst PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>> = props => {\n const { code, children } = props\n const { accessible, isValidating } = usePermission(code)\n const t = useTranslation()\n\n if (isValidating) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status=\"403\" subTitle={t('global.noEntitlement')} />\n }\n\n return <>{children}</>\n}\n\nexport default PermissionGuard\n","import type { ComponentType, ReactNode } from 'react'\nimport { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\nimport type { ContextState } from '../components/ContextProvider'\nimport ContextProvider from '../components/ContextProvider'\nimport Layout from '../components/Layout'\n\nconst NotFound = lazy(() => import('../pages/NotFound'))\nconst OperationLogList = lazy(() => import('../pages/OperationLogList'))\nconst SignIn = lazy(() => import('../pages/SignIn'))\nconst Permission = lazy(() => import('../pages/permission'))\n\nexport const withLayout = (WrappedComponent: ComponentType, props?: Partial<ContextState>) => {\n const ComponentWithLayout = () => {\n return (\n <ContextProvider {...props}>\n <Layout>\n <WrappedComponent />\n </Layout>\n </ContextProvider>\n )\n }\n\n return ComponentWithLayout\n}\n\nexport function withBaseRoutes(routes: ReactNode, props?: Partial<Omit<ContextState, 'hideGameSelect'>>) {\n const ComponentWithBaseRoutes = () => {\n const sharedProps = Object.assign({}, props, { hideGameSelect: true })\n\n return (\n <Routes>\n {routes}\n <Route path=\"/operation_log\" Component={withLayout(OperationLogList, sharedProps)} />\n <Route path=\"/permission/*\" Component={withLayout(Permission, sharedProps)} />\n <Route path=\"/sign_in\" element={<SignIn />} />\n <Route path=\"*\" element={<NotFound />} />\n </Routes>\n )\n }\n\n return ComponentWithBaseRoutes\n}\n"]}
package/locales/en_GB.js CHANGED
@@ -1,3 +1,5 @@
1
1
  var e={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"},SignIn:{title:"Sign In Method",thirdParty:"Third party sign in",signInWithIDass:"Sign in width IDass",notRegistered:"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"},UserList:{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"},RoleList:{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"}},t=e;
2
2
 
3
3
  export { t as default };
4
+ //# sourceMappingURL=out.js.map
5
+ //# sourceMappingURL=en_GB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locales/en_GB.ts"],"names":["locale","en_GB_default"],"mappings":"AAEA,IAAMA,EAAiB,CACrB,OAAQ,CACN,cAAe,mDACf,KAAM,OACN,aAAc,gBACd,UAAW,YACX,OAAQ,SACR,KAAM,OACN,OAAQ,SACR,UAAW,aACX,KAAM,OACN,KAAM,OACN,KAAM,OACN,SAAU,WACV,SAAU,WACV,MAAO,QACP,OAAQ,SACR,MAAO,QACP,QAAS,UACT,SAAU,WACV,IAAK,MACL,OAAQ,SACV,EACA,OAAQ,CACN,MAAO,iBACP,WAAY,sBACZ,gBAAiB,sBACjB,cAAe,+EACf,QAAS,SACX,EACA,SAAU,CACR,SAAU,sCACV,WAAY,oBACd,EACA,kBAAmB,CACjB,YAAa,SACb,UAAW,OACb,EACA,UAAW,CACT,YAAa,UACb,WAAY,QACd,EACA,WAAY,CACV,MAAO,eACP,YAAa,sBACf,EACA,YAAa,CACX,YAAa,sBACf,EACA,WAAY,CACV,YAAa,UACf,EACA,SAAU,CACR,YAAa,cACb,mBAAoB,4BACpB,YAAa,cACb,mBAAoB,4BACpB,YAAa,cACb,cAAe,oDACf,mBAAoB,2BACtB,EACA,SAAU,CACR,YAAa,cACb,mBAAoB,4BACpB,YAAa,cACb,mBAAoB,4BACpB,YAAa,cACb,cAAe,oDACf,mBAAoB,2BACtB,EACA,eAAgB,CACd,kBAAmB,gCACnB,iBAAkB,6BAClB,iBAAkB,mBAClB,uBAAwB,6BACxB,sBAAuB,6BACvB,WAAY,SACZ,QAAS,sBACX,EACA,WAAY,CACV,MAAO,cACT,EACA,aAAc,CACZ,YAAa,aACb,aAAc,yBACd,aAAc,WAChB,CACF,EAEOC,EAAQD","sourcesContent":["import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: 'No permission, please contact the administrator.',\n name: 'Name',\n creationTime: 'Creation Time',\n operation: 'Operation',\n update: 'Update',\n edit: 'Edit',\n delete: 'Delete',\n selectAll: 'Select All',\n game: 'Game',\n user: 'User',\n role: 'Role',\n username: 'Username',\n password: 'Password',\n label: 'Label',\n method: 'Method',\n route: 'Route',\n request: 'Request',\n response: 'Response',\n add: 'Add',\n signIn: 'Sign In',\n },\n SignIn: {\n title: 'Sign In Method',\n thirdParty: 'Third party sign in',\n signInWithIDass: 'Sign in width IDass',\n notRegistered: 'You are not yet registered on the platform, please contact the administrator',\n welcome: 'Welcome',\n },\n NotFound: {\n subTitle: 'The page you visited does not exist',\n buttonText: 'Return to homepage',\n },\n FilterFormWrapper: {\n confirmText: 'Search',\n resetText: 'Reset',\n },\n FormModal: {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n },\n GameSelect: {\n label: 'Current Game',\n placeholder: 'Please select a game',\n },\n RequireGame: {\n description: 'Please select a game',\n },\n UserWidget: {\n signOutText: 'Sign Out',\n },\n UserList: {\n createTitle: 'Create User',\n createSuccessfully: 'User created successfully',\n updateTitle: 'Update User',\n updateSuccessfully: 'User updated successfully',\n deleteTitle: 'Delete User',\n deleteContent: 'Are you sure you want to delete user <%= user %>?',\n deleteSuccessfully: 'User deleted successfully',\n },\n RoleList: {\n createTitle: 'Create Role',\n createSuccessfully: 'Role created successfully',\n updateTitle: 'Update Role',\n updateSuccessfully: 'Role updated successfully',\n deleteTitle: 'Delete Role',\n deleteContent: 'Are you sure you want to delete role <%= role %>?',\n deleteSuccessfully: 'Role deleted successfully',\n },\n PermissionList: {\n failedDescription: 'Failed to get permission list',\n baseSectionTitle: 'Platform Basic Permissions',\n gameSectionTitle: 'Game Permissions',\n gameSectionDescription: 'Please select a game first',\n gameSelectPlaceholder: 'Please select a game first',\n removeText: 'Remove',\n addText: 'Add Game Permissions',\n },\n RoleDetail: {\n title: 'Role Details',\n },\n InfiniteList: {\n loadingText: 'Loading...',\n reachEndText: \"You've reached the end\",\n loadMoreText: 'Load more',\n },\n}\n\nexport default locale\n"]}
package/locales/ja_JP.js CHANGED
@@ -1,3 +1,5 @@
1
1
  var e={global:{noEntitlement:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002",name:"\u540D\u524D",creationTime:"\u4F5C\u6210\u6642\u9593",operation:"\u64CD\u4F5C",update:"\u66F4\u65B0",edit:"\u7DE8\u96C6",delete:"\u524A\u9664",selectAll:"\u5168\u3066\u9078\u629E",game:"\u30B2\u30FC\u30E0",user:"\u30E6\u30FC\u30B6\u30FC",role:"\u5F79\u5272",username:"\u30E6\u30FC\u30B6\u30FC\u540D",password:"\u30D1\u30B9\u30EF\u30FC\u30C9",label:"\u30E9\u30D9\u30EB",method:"\u65B9\u6CD5",route:"\u30EB\u30FC\u30C8",request:"\u30EA\u30AF\u30A8\u30B9\u30C8",response:"\u30EC\u30B9\u30DD\u30F3\u30B9",add:"\u3064\u3044\u304B",signIn:"\u30ED\u30B0\u30A4\u30F3"},SignIn:{title:"\u30ED\u30B0\u30A4\u30F3\u65B9\u6CD5",thirdParty:"\u30B5\u30FC\u30C9\u30D1\u30FC\u30C6\u30A3\u30ED\u30B0\u30A4\u30F3",signInWithIDass:"IDass \u30ED\u30B0\u30A4\u30F3",notRegistered:"\u3042\u306A\u305F\u306F\u307E\u3060\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044",welcome:"\u30A6\u30A7\u30EB\u30AB\u30E0"},NotFound:{subTitle:"\u30A2\u30AF\u30BB\u30B9\u3057\u305F\u30DA\u30FC\u30B8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093",buttonText:"\u30DA\u30FC\u30B8\u306B\u623B\u308B"},FilterFormWrapper:{confirmText:"\u691C\u7D22",resetText:"\u30EA\u30BB\u30C3\u30C8"},FormModal:{confirmText:"\u78BA\u8A8D",cancelText:"\u30AD\u30E3\u30F3\u30BB\u30EB"},GameSelect:{label:"\u73FE\u5728\u306E\u30B2\u30FC\u30E0",placeholder:"\u30B2\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},RequireGame:{description:"\u30B2\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"},UserWidget:{signOutText:"\u30ED\u30B0\u30A2\u30A6\u30C8"},UserList:{createTitle:"\u30E6\u30FC\u30B6\u30FC\u3092\u4F5C\u6210",createSuccessfully:"\u30E6\u30FC\u30B6\u30FC\u304C\u6B63\u5E38\u306B\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F",updateTitle:"\u30E6\u30FC\u30B6\u30FC\u3092\u66F4\u65B0",updateSuccessfully:"\u30E6\u30FC\u30B6\u30FC\u304C\u6B63\u5E38\u306B\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F",deleteTitle:"\u30E6\u30FC\u30B6\u30FC\u3092\u524A\u9664",deleteContent:"\u30E6\u30FC\u30B6\u30FC<%= user %>\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",deleteSuccessfully:"\u30E6\u30FC\u30B6\u30FC\u304C\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F"},RoleList:{createTitle:"\u5F79\u5272\u3092\u4F5C\u6210",createSuccessfully:"\u5F79\u5272\u304C\u6B63\u5E38\u306B\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F",updateTitle:"\u5F79\u5272\u3092\u66F4\u65B0",updateSuccessfully:"\u5F79\u5272\u304C\u6B63\u5E38\u306B\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F",deleteTitle:"\u5F79\u5272\u3092\u524A\u9664",deleteContent:"\u5F79\u5272<%= role %>\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",deleteSuccessfully:"\u5F79\u5272\u304C\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F"},PermissionList:{failedDescription:"\u6A29\u9650\u30EA\u30B9\u30C8\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F",baseSectionTitle:"\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u57FA\u672C\u6A29\u9650",gameSectionTitle:"\u30B2\u30FC\u30E0\u6A29\u9650",gameSectionDescription:"\u5148\u306B\u30B2\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",gameSelectPlaceholder:"\u5148\u306B\u30B2\u30FC\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",removeText:"\u524A\u9664",addText:"\u30B2\u30FC\u30E0\u6A29\u9650\u3092\u8FFD\u52A0"},RoleDetail:{title:"\u5F79\u5272\u8A73\u7D30"},InfiniteList:{loadingText:"\u8AAD\u307F\u8FBC\u307F\u4E2D",reachEndText:"\u6700\u5F8C\u307E\u3067\u5230\u9054\u3057\u307E\u3057\u305F",loadMoreText:"\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080"}},t=e;
2
2
 
3
3
  export { t as default };
4
+ //# sourceMappingURL=out.js.map
5
+ //# sourceMappingURL=ja_JP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locales/ja_JP.ts"],"names":["locale","ja_JP_default"],"mappings":"AAEA,IAAMA,EAAiB,CACrB,OAAQ,CACN,cAAe,uIACf,KAAM,eACN,aAAc,2BACd,UAAW,eACX,OAAQ,eACR,KAAM,eACN,OAAQ,eACR,UAAW,2BACX,KAAM,qBACN,KAAM,2BACN,KAAM,eACN,SAAU,iCACV,SAAU,iCACV,MAAO,qBACP,OAAQ,eACR,MAAO,qBACP,QAAS,iCACT,SAAU,iCACV,IAAK,qBACL,OAAQ,0BACV,EACA,OAAQ,CACN,MAAO,uCACP,WAAY,qEACZ,gBAAiB,iCACjB,cAAe,iOACf,QAAS,gCACX,EACA,SAAU,CACR,SAAU,mGACV,WAAY,sCACd,EACA,kBAAmB,CACjB,YAAa,eACb,UAAW,0BACb,EACA,UAAW,CACT,YAAa,eACb,WAAY,gCACd,EACA,WAAY,CACV,MAAO,uCACP,YAAa,0EACf,EACA,YAAa,CACX,YAAa,0EACf,EACA,WAAY,CACV,YAAa,gCACf,EACA,SAAU,CACR,YAAa,6CACb,mBAAoB,6FACpB,YAAa,6CACb,mBAAoB,6FACpB,YAAa,6CACb,cAAe,0HACf,mBAAoB,4FACtB,EACA,SAAU,CACR,YAAa,iCACb,mBAAoB,iFACpB,YAAa,iCACb,mBAAoB,iFACpB,YAAa,iCACb,cAAe,8GACf,mBAAoB,gFACtB,EACA,eAAgB,CACd,kBAAmB,6FACnB,iBAAkB,2EAClB,iBAAkB,iCAClB,uBAAwB,uFACxB,sBAAuB,uFACvB,WAAY,eACZ,QAAS,kDACX,EACA,WAAY,CACV,MAAO,0BACT,EACA,aAAc,CACZ,YAAa,iCACb,aAAc,+DACd,aAAc,4CAChB,CACF,EAEOC,EAAQD","sourcesContent":["import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '権限がありません、管理者に連絡してください。',\n name: '名前',\n creationTime: '作成時間',\n operation: '操作',\n update: '更新',\n edit: '編集',\n delete: '削除',\n selectAll: '全て選択',\n game: 'ゲーム',\n user: 'ユーザー',\n role: '役割',\n username: 'ユーザー名',\n password: 'パスワード',\n label: 'ラベル',\n method: '方法',\n route: 'ルート',\n request: 'リクエスト',\n response: 'レスポンス',\n add: 'ついか',\n signIn: 'ログイン',\n },\n SignIn: {\n title: 'ログイン方法',\n thirdParty: 'サードパーティログイン',\n signInWithIDass: 'IDass ログイン',\n notRegistered: 'あなたはまだプラットフォームに登録されていません、管理者に連絡してください',\n welcome: 'ウェルカム',\n },\n NotFound: {\n subTitle: 'アクセスしたページは存在しません',\n buttonText: 'ページに戻る',\n },\n FilterFormWrapper: {\n confirmText: '検索',\n resetText: 'リセット',\n },\n FormModal: {\n confirmText: '確認',\n cancelText: 'キャンセル',\n },\n GameSelect: {\n label: '現在のゲーム',\n placeholder: 'ゲームを選択してください',\n },\n RequireGame: {\n description: 'ゲームを選択してください',\n },\n UserWidget: {\n signOutText: 'ログアウト',\n },\n UserList: {\n createTitle: 'ユーザーを作成',\n createSuccessfully: 'ユーザーが正常に作成されました',\n updateTitle: 'ユーザーを更新',\n updateSuccessfully: 'ユーザーが正常に更新されました',\n deleteTitle: 'ユーザーを削除',\n deleteContent: 'ユーザー<%= user %>を削除してもよろしいですか?',\n deleteSuccessfully: 'ユーザーが正常に削除されました',\n },\n RoleList: {\n createTitle: '役割を作成',\n createSuccessfully: '役割が正常に作成されました',\n updateTitle: '役割を更新',\n updateSuccessfully: '役割が正常に更新されました',\n deleteTitle: '役割を削除',\n deleteContent: '役割<%= role %>を削除してもよろしいですか?',\n deleteSuccessfully: '役割が正常に削除されました',\n },\n PermissionList: {\n failedDescription: '権限リストの取得に失敗しました',\n baseSectionTitle: 'プラットフォーム基本権限',\n gameSectionTitle: 'ゲーム権限',\n gameSectionDescription: '先にゲームを選択してください',\n gameSelectPlaceholder: '先にゲームを選択してください',\n removeText: '削除',\n addText: 'ゲーム権限を追加',\n },\n RoleDetail: {\n title: '役割詳細',\n },\n InfiniteList: {\n loadingText: '読み込み中',\n reachEndText: '最後まで到達しました',\n loadMoreText: 'もっと読み込む',\n },\n}\n\nexport default locale\n"]}
package/locales/ko_KR.js CHANGED
@@ -1,3 +1,5 @@
1
1
  var e={global:{noEntitlement:"\uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4, \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC2ED\uC2DC\uC624.",name:"\uC774\uB984",creationTime:"\uC0DD\uC131 \uC2DC\uAC04",operation:"\uC791\uC5C5",update:"\uC5C5\uB370\uC774\uD2B8",edit:"\uD3B8\uC9D1",delete:"\uC0AD\uC81C",selectAll:"\uBAA8\uB450 \uC120\uD0DD",game:"\uAC8C\uC784",user:"\uC0AC\uC6A9\uC790",role:"\uC5ED\uD560",username:"\uC0AC\uC6A9\uC790 \uC774\uB984",password:"\uBE44\uBC00\uBC88\uD638",label:"\uB77C\uBCA8",method:"\uBC29\uBC95",route:"\uB178\uC120",request:"\uC694\uCCAD",response:"\uC751\uB2F5",add:"\uCD94\uAC00",signIn:"\uB85C\uADF8\uC778"},SignIn:{title:"\uB85C\uADF8\uC778 \uBC29\uBC95",thirdParty:"\uC81C3\uC790 \uB85C\uADF8\uC778",signInWithIDass:"IDass \uB85C\uADF8\uC778",notRegistered:"\uD50C\uB7AB\uD3FC\uC5D0 \uC544\uC9C1 \uB4F1\uB85D\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4, \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC2ED\uC2DC\uC624",welcome:"\uC6F0\uCEF4"},NotFound:{subTitle:"\uBC29\uBB38\uD55C \uD398\uC774\uC9C0\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",buttonText:"\uD398\uC774\uC9C0\uB85C \uB3CC\uC544\uAC00\uAE30"},FilterFormWrapper:{confirmText:"\uAC80\uC0C9",resetText:"\uB9AC\uC14B"},FormModal:{confirmText:"\uD655\uC778",cancelText:"\uCDE8\uC18C"},GameSelect:{label:"\uD604\uC7AC \uAC8C\uC784",placeholder:"\uAC8C\uC784\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694"},RequireGame:{description:"\uAC8C\uC784\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694"},UserWidget:{signOutText:"\uB85C\uADF8\uC544\uC6C3"},UserList:{createTitle:"\uC0AC\uC6A9\uC790 \uC0DD\uC131",createSuccessfully:"\uC0AC\uC6A9\uC790\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4",updateTitle:"\uC0AC\uC6A9\uC790 \uC5C5\uB370\uC774\uD2B8",updateSuccessfully:"\uC0AC\uC6A9\uC790\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC5C5\uB370\uC774\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4",deleteTitle:"\uC0AC\uC6A9\uC790 \uC0AD\uC81C",deleteContent:"\uC0AC\uC6A9\uC790 <%= user %>\uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",deleteSuccessfully:"\uC0AC\uC6A9\uC790\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4"},RoleList:{createTitle:"\uC5ED\uD560 \uC0DD\uC131",createSuccessfully:"\uC5ED\uD560\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4",updateTitle:"\uC5ED\uD560 \uC5C5\uB370\uC774\uD2B8",updateSuccessfully:"\uC5ED\uD560\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uC5C5\uB370\uC774\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4",deleteTitle:"\uC5ED\uD560 \uC0AD\uC81C",deleteContent:"\uC5ED\uD560 <%= role %>\uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",deleteSuccessfully:"\uC5ED\uD560\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4"},PermissionList:{failedDescription:"\uAD8C\uD55C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uB294 \uB370 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",baseSectionTitle:"\uD50C\uB7AB\uD3FC \uAE30\uBCF8 \uAD8C\uD55C",gameSectionTitle:"\uAC8C\uC784 \uAD8C\uD55C",gameSectionDescription:"\uBA3C\uC800 \uAC8C\uC784\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",gameSelectPlaceholder:"\uBA3C\uC800 \uAC8C\uC784\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",removeText:"\uC81C\uAC70",addText:"\uAC8C\uC784 \uAD8C\uD55C \uCD94\uAC00"},RoleDetail:{title:"\uC5ED\uD560 \uC138\uBD80 \uC815\uBCF4"},InfiniteList:{loadingText:"\uB85C\uB529 \uC911",reachEndText:"\uB05D\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4",loadMoreText:"\uB354 \uB85C\uB4DC\uD558\uAE30"}},t=e;
2
2
 
3
3
  export { t as default };
4
+ //# sourceMappingURL=out.js.map
5
+ //# sourceMappingURL=ko_KR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locales/ko_KR.ts"],"names":["locale","ko_KR_default"],"mappings":"AAEA,IAAMA,EAAiB,CACrB,OAAQ,CACN,cAAe,oHACf,KAAM,eACN,aAAc,4BACd,UAAW,eACX,OAAQ,2BACR,KAAM,eACN,OAAQ,eACR,UAAW,4BACX,KAAM,eACN,KAAM,qBACN,KAAM,eACN,SAAU,kCACV,SAAU,2BACV,MAAO,eACP,OAAQ,eACR,MAAO,eACP,QAAS,eACT,SAAU,eACV,IAAK,eACL,OAAQ,oBACV,EACA,OAAQ,CACN,MAAO,kCACP,WAAY,mCACZ,gBAAiB,2BACjB,cAAe,qKACf,QAAS,cACX,EACA,SAAU,CACR,SAAU,gGACV,WAAY,mDACd,EACA,kBAAmB,CACjB,YAAa,eACb,UAAW,cACb,EACA,UAAW,CACT,YAAa,eACb,WAAY,cACd,EACA,WAAY,CACV,MAAO,4BACP,YAAa,yDACf,EACA,YAAa,CACX,YAAa,yDACf,EACA,WAAY,CACV,YAAa,0BACf,EACA,SAAU,CACR,YAAa,kCACb,mBAAoB,qGACpB,YAAa,8CACb,mBAAoB,iHACpB,YAAa,kCACb,cAAe,yFACf,mBAAoB,oGACtB,EACA,SAAU,CACR,YAAa,4BACb,mBAAoB,+FACpB,YAAa,wCACb,mBAAoB,2GACpB,YAAa,4BACb,cAAe,mFACf,mBAAoB,8FACtB,EACA,eAAgB,CACd,kBAAmB,uGACnB,iBAAkB,+CAClB,iBAAkB,4BAClB,uBAAwB,uEACxB,sBAAuB,uEACvB,WAAY,eACZ,QAAS,wCACX,EACA,WAAY,CACV,MAAO,wCACT,EACA,aAAc,CACZ,YAAa,sBACb,aAAc,oDACd,aAAc,iCAChB,CACF,EAEOC,EAAQD","sourcesContent":["import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '권한이 없습니다, 관리자에게 문의하십시오.',\n name: '이름',\n creationTime: '생성 시간',\n operation: '작업',\n update: '업데이트',\n edit: '편집',\n delete: '삭제',\n selectAll: '모두 선택',\n game: '게임',\n user: '사용자',\n role: '역할',\n username: '사용자 이름',\n password: '비밀번호',\n label: '라벨',\n method: '방법',\n route: '노선',\n request: '요청',\n response: '응답',\n add: '추가',\n signIn: '로그인',\n },\n SignIn: {\n title: '로그인 방법',\n thirdParty: '제3자 로그인',\n signInWithIDass: 'IDass 로그인',\n notRegistered: '플랫폼에 아직 등록되지 않았습니다, 관리자에게 문의하십시오',\n welcome: '웰컴',\n },\n NotFound: {\n subTitle: '방문한 페이지가 존재하지 않습니다',\n buttonText: '페이지로 돌아가기',\n },\n FilterFormWrapper: {\n confirmText: '검색',\n resetText: '리셋',\n },\n FormModal: {\n confirmText: '확인',\n cancelText: '취소',\n },\n GameSelect: {\n label: '현재 게임',\n placeholder: '게임을 선택해주세요',\n },\n RequireGame: {\n description: '게임을 선택해주세요',\n },\n UserWidget: {\n signOutText: '로그아웃',\n },\n UserList: {\n createTitle: '사용자 생성',\n createSuccessfully: '사용자가 성공적으로 생성되었습니다',\n updateTitle: '사용자 업데이트',\n updateSuccessfully: '사용자가 성공적으로 업데이트되었습니다',\n deleteTitle: '사용자 삭제',\n deleteContent: '사용자 <%= user %>를 삭제하시겠습니까?',\n deleteSuccessfully: '사용자가 성공적으로 삭제되었습니다',\n },\n RoleList: {\n createTitle: '역할 생성',\n createSuccessfully: '역할이 성공적으로 생성되었습니다',\n updateTitle: '역할 업데이트',\n updateSuccessfully: '역할이 성공적으로 업데이트되었습니다',\n deleteTitle: '역할 삭제',\n deleteContent: '역할 <%= role %>를 삭제하시겠습니까?',\n deleteSuccessfully: '역할이 성공적으로 삭제되었습니다',\n },\n PermissionList: {\n failedDescription: '권한 목록을 가져오는 데 실패했습니다',\n baseSectionTitle: '플랫폼 기본 권한',\n gameSectionTitle: '게임 권한',\n gameSectionDescription: '먼저 게임을 선택해주세요',\n gameSelectPlaceholder: '먼저 게임을 선택해주세요',\n removeText: '제거',\n addText: '게임 권한 추가',\n },\n RoleDetail: {\n title: '역할 세부 정보',\n },\n InfiniteList: {\n loadingText: '로딩 중',\n reachEndText: '끝에 도달했습니다',\n loadMoreText: '더 로드하기',\n },\n}\n\nexport default locale\n"]}
package/locales/zh_CN.js CHANGED
@@ -1,3 +1,5 @@
1
1
  var e={global:{noEntitlement:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002",name:"\u540D\u79F0",creationTime:"\u521B\u5EFA\u65F6\u95F4",operation:"\u64CD\u4F5C",update:"\u66F4\u65B0",edit:"\u7F16\u8F91",delete:"\u5220\u9664",selectAll:"\u5168\u9009",game:"\u6E38\u620F",user:"\u7528\u6237",role:"\u89D2\u8272",username:"\u7528\u6237\u540D",password:"\u5BC6\u7801",label:"\u6807\u7B7E",method:"\u65B9\u6CD5",route:"\u8DEF\u7531",request:"\u8BF7\u6C42",response:"\u54CD\u5E94",add:"\u6DFB\u52A0",signIn:"\u767B\u5F55"},SignIn:{title:"\u767B\u5F55\u65B9\u5F0F",thirdParty:"\u7B2C\u4E09\u65B9\u767B\u5F55",signInWithIDass:"IDass \u767B\u5F55",notRegistered:"\u60A8\u8FD8\u672A\u5728\u5E73\u53F0\u6CE8\u518C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",welcome:"\u6B22\u8FCE"},NotFound:{subTitle:"\u8BBF\u95EE\u7684\u9875\u9762\u4E0D\u5B58\u5728",buttonText:"\u8FD4\u56DE\u9996\u9875"},FilterFormWrapper:{confirmText:"\u67E5\u8BE2",resetText:"\u91CD\u7F6E"},FormModal:{confirmText:"\u786E\u8BA4",cancelText:"\u53D6\u6D88"},GameSelect:{label:"\u5F53\u524D\u6E38\u620F",placeholder:"\u8BF7\u9009\u62E9\u6E38\u620F"},RequireGame:{description:"\u8BF7\u9009\u62E9\u6E38\u620F"},UserWidget:{signOutText:"\u767B\u51FA"},UserList:{createTitle:"\u521B\u5EFA\u7528\u6237",createSuccessfully:"\u7528\u6237\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u7528\u6237",updateSuccessfully:"\u7528\u6237\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u7528\u6237",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u7528\u6237 <%= user %> \u5417\uFF1F",deleteSuccessfully:"\u7528\u6237\u5220\u9664\u6210\u529F"},RoleList:{createTitle:"\u521B\u5EFA\u89D2\u8272",createSuccessfully:"\u89D2\u8272\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u89D2\u8272",updateSuccessfully:"\u89D2\u8272\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u89D2\u8272",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u89D2\u8272 <%= role %> \u5417\uFF1F",deleteSuccessfully:"\u89D2\u8272\u5220\u9664\u6210\u529F"},PermissionList:{failedDescription:"\u83B7\u53D6\u6743\u9650\u5217\u8868\u5931\u8D25",baseSectionTitle:"\u5E73\u53F0\u57FA\u7840\u6743\u9650",gameSectionTitle:"\u6E38\u620F\u6743\u9650",gameSectionDescription:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",gameSelectPlaceholder:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",removeText:"\u79FB\u9664",addText:"\u6DFB\u52A0\u6E38\u620F\u6743\u9650"},RoleDetail:{title:"\u89D2\u8272\u8BE6\u60C5"},InfiniteList:{loadingText:"\u52A0\u8F7D\u4E2D",reachEndText:"\u5DF2\u7ECF\u5230\u5E95\u4E86",loadMoreText:"\u52A0\u8F7D\u66F4\u591A"}},t=e;
2
2
 
3
3
  export { t as default };
4
+ //# sourceMappingURL=out.js.map
5
+ //# sourceMappingURL=zh_CN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/locales/zh_CN.ts"],"names":["locale","zh_CN_default"],"mappings":"AAEA,IAAMA,EAAiB,CACrB,OAAQ,CACN,cAAe,qEACf,KAAM,eACN,aAAc,2BACd,UAAW,eACX,OAAQ,eACR,KAAM,eACN,OAAQ,eACR,UAAW,eACX,KAAM,eACN,KAAM,eACN,KAAM,eACN,SAAU,qBACV,SAAU,eACV,MAAO,eACP,OAAQ,eACR,MAAO,eACP,QAAS,eACT,SAAU,eACV,IAAK,eACL,OAAQ,cACV,EACA,OAAQ,CACN,MAAO,2BACP,WAAY,iCACZ,gBAAiB,qBACjB,cAAe,6FACf,QAAS,cACX,EACA,SAAU,CACR,SAAU,mDACV,WAAY,0BACd,EACA,kBAAmB,CACjB,YAAa,eACb,UAAW,cACb,EACA,UAAW,CACT,YAAa,eACb,WAAY,cACd,EACA,WAAY,CACV,MAAO,2BACP,YAAa,gCACf,EACA,YAAa,CACX,YAAa,gCACf,EACA,WAAY,CACV,YAAa,cACf,EACA,SAAU,CACR,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,cAAe,sEACf,mBAAoB,sCACtB,EACA,SAAU,CACR,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,cAAe,sEACf,mBAAoB,sCACtB,EACA,eAAgB,CACd,kBAAmB,mDACnB,iBAAkB,uCAClB,iBAAkB,2BAClB,uBAAwB,uCACxB,sBAAuB,uCACvB,WAAY,eACZ,QAAS,sCACX,EACA,WAAY,CACV,MAAO,0BACT,EACA,aAAc,CACZ,YAAa,qBACb,aAAc,iCACd,aAAc,0BAChB,CACF,EAEOC,EAAQD","sourcesContent":["import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员。',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n },\n SignIn: {\n title: '登录方式',\n thirdParty: '第三方登录',\n signInWithIDass: 'IDass 登录',\n notRegistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserWidget: {\n signOutText: '登出',\n },\n UserList: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n RoleList: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-toolkits",
3
3
  "type": "module",
4
- "version": "0.8.86",
4
+ "version": "0.8.88",
5
5
  "sideEffects": [
6
6
  "**/*.css"
7
7
  ],
@@ -64,9 +64,9 @@
64
64
  "ts-essentials": "^9.4.1",
65
65
  "tsup": "^8.0.2",
66
66
  "typescript": "^5.3.3",
67
- "@flow97/eslint-config-mono": "0.0.4",
68
67
  "tailwind-config": "0.1.1",
69
- "tsconfig": "0.0.5"
68
+ "tsconfig": "0.0.5",
69
+ "@flow97/eslint-config-mono": "0.0.4"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "antd": "^5.12.2",