react-toolkits 2.25.0 → 2.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +5 -5
- package/lib/chunk-24U2EF5M.js +2 -0
- package/lib/chunk-24U2EF5M.js.map +1 -0
- package/lib/{chunk-GI5OS4VD.js → chunk-5QAEUAZE.js} +2 -2
- package/lib/{chunk-GI5OS4VD.js.map → chunk-5QAEUAZE.js.map} +1 -1
- package/lib/chunk-D5YXBSTI.js +2 -0
- package/lib/chunk-D5YXBSTI.js.map +1 -0
- package/lib/chunk-F2GDEOP4.js +3 -0
- package/lib/chunk-F2GDEOP4.js.map +1 -0
- package/lib/{chunk-742NAY4S.js → chunk-FIT6S4UM.js} +2 -2
- package/lib/{chunk-742NAY4S.js.map → chunk-FIT6S4UM.js.map} +1 -1
- package/lib/{chunk-PLJPZJ7T.js → chunk-IKGXKB6T.js} +2 -2
- package/lib/{chunk-PLJPZJ7T.js.map → chunk-IKGXKB6T.js.map} +1 -1
- package/lib/chunk-JDCSIJL7.js +2 -0
- package/lib/chunk-JDCSIJL7.js.map +1 -0
- package/lib/chunk-KZHYK554.js +2 -0
- package/lib/chunk-KZHYK554.js.map +1 -0
- package/lib/chunk-MVG7YFPB.js +2 -0
- package/lib/chunk-MVG7YFPB.js.map +1 -0
- package/lib/{createMenuItem-C7HUFDD4.js → createMenuItem-Q5TJGFKZ.js} +2 -2
- package/lib/{createMenuItem-C7HUFDD4.js.map → createMenuItem-Q5TJGFKZ.js.map} +1 -1
- package/lib/index.d.ts +76 -37
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/{menuItemList-2OFNRCPR.js → menuItemList-2QZXJVWZ.js} +2 -2
- package/lib/{menuItemList-2OFNRCPR.js.map → menuItemList-2QZXJVWZ.js.map} +1 -1
- package/lib/{roleDetail-YBO7TOL5.js → roleDetail-ODJVDVB4.js} +2 -2
- package/lib/{roleDetail-YBO7TOL5.js.map → roleDetail-ODJVDVB4.js.map} +1 -1
- package/lib/roleList-MQOFJ3LH.js +2 -0
- package/lib/roleList-MQOFJ3LH.js.map +1 -0
- package/lib/{updateMenuItem-23ZR4X2P.js → updateMenuItem-4HDRJAY7.js} +2 -2
- package/lib/{updateMenuItem-23ZR4X2P.js.map → updateMenuItem-4HDRJAY7.js.map} +1 -1
- package/lib/userDetail-B5H4A4X2.js +2 -0
- package/lib/userDetail-B5H4A4X2.js.map +1 -0
- package/lib/userList-QHQHRPSV.js +2 -0
- package/lib/userList-QHQHRPSV.js.map +1 -0
- package/locale/hooks.js +1 -1
- package/locale/hooks.js.map +1 -1
- package/package.json +11 -11
- package/lib/chunk-EESZYCYA.js +0 -2
- package/lib/chunk-EESZYCYA.js.map +0 -1
- package/lib/chunk-K43HSNXS.js +0 -2
- package/lib/chunk-K43HSNXS.js.map +0 -1
- package/lib/chunk-LEVOCZUQ.js +0 -2
- package/lib/chunk-LEVOCZUQ.js.map +0 -1
- package/lib/chunk-V3YBDED3.js +0 -2
- package/lib/chunk-V3YBDED3.js.map +0 -1
- package/lib/chunk-VFRB44XY.js +0 -2
- package/lib/chunk-VFRB44XY.js.map +0 -1
- package/lib/chunk-W3E3WPLB.js +0 -3
- package/lib/chunk-W3E3WPLB.js.map +0 -1
- package/lib/roleList-UEZPNJ2L.js +0 -2
- package/lib/roleList-UEZPNJ2L.js.map +0 -1
- package/lib/userDetail-QZDRSIYE.js +0 -2
- package/lib/userDetail-QZDRSIYE.js.map +0 -1
- package/lib/userList-IBXB6M6R.js +0 -2
- package/lib/userList-IBXB6M6R.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/filterFormWrapper/FilterFormWrapper.tsx","../src/components/highlight/Highlight.tsx","../src/components/queryList/stores.ts","../src/components/queryList/QueryList.tsx"],"names":["FilterFormWrapper","props","extras","isConfirming","onConfirm","onReset","children","buttonsAlign","showReset","t","useTranslation","colorFillAlter","lineWidth","lineType","colorBorder","borderRadiusLG","theme","jsx","jsxs","Space","Button","item","Fragment","FilterFormWrapper_default","splitByTags","str","regex","part","renderToString","node","container","root","createRoot","resolve","flushSync","Highlight","texts","htmlString","setHtmlString","useState","useEffect","result","text","index","Highlight_default","DEFAULT_PAYLOAD","createStore","create","devtools","subscribeWithSelector","set","get","id","url","queryKey","refetch","state","existingInstance","updatedInstance","newInstances","instance","payload","newPayload","isEqual","payloadChanged","currentPayload","error","store","useQueryListStore","QueryListAction","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","BODYLESS_METHODS","BODY_SUPPORTED_METHODS","identifierCounter","generateUniqueIdentifier","InternalQueryList","ref","form","identifier","code","onePage","defaultSize","refreshInterval","tableExtra","renderForm","afterSuccess","afterError","footer","pageSizeOptions","request","dataAdapter","tableProps","formInstance","Form","finalIdentifier","useMemo","action","useRef","accessible","isChecking","useAuth","isValid","setIsValid","isInitialized","isUpdatingFromPayload","subscribedPayload","s","ky","useKy","page","size","filters","resolvedRequest","method","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","isBodylessMethod","defaultRequestData","requestBody","requestSearchParams","requestHeaders","shouldPoll","data","isLoading","useQuery","kyOptions","response","err","errorObj","failureCount","retryError","attemptIndex","resolvedDataAdapter","adapter","defaultAdapter","dataSource","total","pagination","currentPage","currentSize","useCallback","formRenderer","cloneElement","e","tableExtraRenderer","renderFooter","currentFormValues","init","value","rafId","useImperativeHandle","Spin","Table","Result","QueryList","forwardRef","QueryList_default"],"mappings":"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","file":"chunk-PLJPZJ7T.js","sourcesContent":["import { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Fragment } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n buttonsAlign?: 'left' | 'right' | 'bottom'\n showReset?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children, buttonsAlign = 'left', showReset } = props\n const { t } = useTranslation()\n const {\n token: { colorFillAlter, lineWidth, lineType, colorBorder, borderRadiusLG },\n } = theme.useToken()\n\n return (\n <div\n className=\"max-w-none p-6 mb-6 border\"\n style={{\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n }}\n >\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'grow-0' : 'flex-1'}`}>{children}</div>\n <div className={`${buttonsAlign === 'bottom' ? 'text-end' : 'text-start'} ml-4`}>\n <Space>\n <Button type=\"primary\" disabled={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n {extras?.map(item => (\n <Fragment key={item.key}>{item.children}</Fragment>\n ))}\n {showReset && <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\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 HighlightProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightProps) => {\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 { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryListPayload } from './QueryList'\n\n// Query 更新函数类型\ntype QueryRefetchFunction = () => void | Promise<unknown>\n\n// QueryList 实例信息\ninterface QueryListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: QueryListPayload\n refetch: QueryRefetchFunction\n}\n\n// 简化的状态接口\ninterface QueryListState {\n // 实例管理\n instances: Map<string, QueryListInstance>\n\n // 核心方法\n registerInstance(id: string, url: string, queryKey: readonly unknown[], refetch: QueryRefetchFunction): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: QueryListPayload): void\n getPayload(id: string): QueryListPayload\n refetch(id: string, payload?: QueryListPayload): Promise<void>\n\n // 工具方法\n getInstance(id: string): QueryListInstance | undefined\n getAllInstances(): QueryListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<QueryListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新refetch函数\n if (existingInstance) {\n // 仅当 refetch 变更时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: QueryListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`QueryList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch QueryList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'query-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useQueryListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useQueryListStore } from './stores'\n\nexport interface ListResponse<T = any> {\n list: T[]\n total: number\n}\n\nexport interface QueryListPayload<Values = any> {\n page?: number\n size?: number\n filters?: Values\n}\n\n// 缓存配置\nexport interface CacheConfig {\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\n// 支持的 HTTP 请求方法类型\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\n// 简化的请求配置\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string\n method?: HttpMethod\n body?: FormData | Record<string | number, any>\n searchParams?: Record<string | number, any>\n headers?: Record<string, string>\n}\n\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\nexport enum QueryListAction {\n Confirm,\n Reset,\n Jump,\n Init,\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any> {\n data: Data | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n}\n\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number\n items?: Item[]\n}\n\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = any> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选的标识符,用于标识和外部控制,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n onePage?: boolean // 无分页\n defaultSize?: number\n pageSizeOptions?: number[]\n request: QueryListRequestConfigType<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n footer?: (data: Data | undefined) => ReactNode\n}\n\n// 常量定义\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000 // 默认缓存5分钟\nconst DEFAULT_STALE_TIME = 30 * 1000 // 默认30秒内数据新鲜\n\n// 无请求体的 HTTP 方法\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD', 'OPTIONS']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\n\n// 生成唯一 identifier 的函数\nconst generateUniqueIdentifier = (): string => {\n return `queryList_${Date.now()}_${++identifierCounter}`\n}\n\nconst InternalQueryList = <Item extends AnyObject = AnyObject, Values extends AnyObject = any, Data = any>(\n props: QueryListProps<Item, Values, Data>,\n ref: Ref<QueryListRef<Item, Values, Data>>,\n) => {\n const { t } = useTranslation()\n\n const {\n form,\n identifier,\n code,\n onePage,\n buttonsAlign,\n showReset,\n defaultSize = 10,\n refreshInterval = 0,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n footer,\n pageSizeOptions,\n request,\n dataAdapter,\n ...tableProps\n } = props\n\n const [formInstance] = Form.useForm<Values>(form)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => {\n return identifier || generateUniqueIdentifier()\n }, [identifier])\n const action = useRef<QueryListAction>(QueryListAction.Init)\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false) // 防止循环更新的标志\n\n // 仅订阅当前 identifier 的 payload,避免因其它实例变化导致不必要重渲染\n const subscribedPayload = useQueryListStore(s => s.getPayload(finalIdentifier))\n const ky = useKy()\n\n const { page, size = defaultSize, filters } = subscribedPayload\n\n const payload = { page, size, filters }\n\n // 处理 request 配置(对象或函数)\n const resolvedRequest = typeof request === 'function' ? request(payload) : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = resolvedRequest\n\n // 验证请求方法\n const normalizedMethod = method.toUpperCase() as HttpMethod\n const allSupportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n\n if (!allSupportedMethods.includes(normalizedMethod)) {\n console.warn(`QueryList: 不支持的 HTTP 请求方法 \"${method}\",将使用 GET 方法`)\n }\n\n // 根据请求方法决定参数传递方式\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 智能参数传递策略:\n // 1. 优先使用用户明确传入的 body 或 searchParams\n // 2. 若用户未指定,根据 HTTP 方法自动选择合适的传递方式\n // 3. 避免同时设置 body 和 searchParams(除非用户明确指定)\n let requestBody: any\n let requestSearchParams: any\n\n if (body !== undefined) {\n // 用户传入了 body,优先使用\n requestBody = body\n requestSearchParams = searchParams\n } else if (searchParams !== undefined) {\n // 用户只传入了 searchParams\n requestSearchParams = searchParams\n requestBody = undefined\n } else {\n // 都未传入,根据方法类型自动选择\n if (isBodylessMethod) {\n requestSearchParams = defaultRequestData\n requestBody = undefined\n } else {\n requestBody = defaultRequestData\n requestSearchParams = undefined\n }\n }\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n // 构建更完整的 queryKey,包含所有影响请求结果的参数\n const queryKey = [\n 'queryList',\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n size,\n filters,\n requestBody,\n requestSearchParams,\n requestHeaders,\n ] as const\n\n const { data, isLoading, refetch } = useQuery({\n queryKey,\n queryFn: async () => {\n try {\n const kyOptions: KyOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n }\n\n // 只有非无请求体方法才允许有 body\n if (requestBody && !isBodylessMethod) {\n if (requestBody instanceof FormData) {\n // FormData 使用 body 方式传递\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n // 字符串直接作为 body\n kyOptions.body = requestBody\n } else {\n // 对象类型使用 .json 方式传递\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, response)\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n retry: (failureCount, retryError) => {\n // 自定义重试逻辑\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false // 认证错误不重试\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000), // 指数退避\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n // 缓存配置\n gcTime: cacheTime,\n staleTime,\n enabled: accessible && isValid,\n })\n\n // 处理 dataAdapter 配置\n const resolvedDataAdapter = useMemo(() => {\n const adapter = dataAdapter\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.total,\n items: (data as ListResponse<Item>)?.list,\n }\n\n if (typeof adapter === 'function') {\n return {\n ...defaultAdapter,\n ...adapter(data as Data),\n }\n }\n return {\n ...defaultAdapter,\n ...adapter,\n }\n }, [dataAdapter, data])\n\n // 在组件挂载时注册实例,避免因 queryKey/refetch 身份变化反复注册\n useEffect(() => {\n useQueryListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch)\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n const dataSource = resolvedDataAdapter.items\n const total = resolvedDataAdapter.total\n\n const pagination = useMemo(() => {\n if (onePage) return false\n\n return {\n pageSizeOptions,\n showSizeChanger: true,\n showQuickJumper: true,\n current: page,\n pageSize: size,\n total,\n onChange: async (currentPage: number, currentSize: number) => {\n action.current = QueryListAction.Jump\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n }, [onePage, pageSizeOptions, page, size, total, finalIdentifier])\n\n const onConfirm = useCallback(async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\n\n const onReset = useCallback(async () => {\n action.current = QueryListAction.Reset\n formInstance.resetFields()\n\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isLoading}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(formInstance) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={formInstance} />\n )\n\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data)}</> : undefined\n\n // 监听 payload.filters 变化并同步更新表单实例\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n // 获取当前表单的值\n const currentFormValues = formInstance.getFieldsValue()\n\n // 如果 payload 中的 filters 与当前表单值不同,则更新表单\n if (filters && !isEqual(currentFormValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n // 使用 setTimeout 确保在下一个事件循环中重置标志\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n // 首次挂载时自动校验表单,校验通过则更新 payload 并允许请求\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n console.log('QueryList init starting')\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n console.log('QueryList init validation success:', value)\n useQueryListStore.getState().updatePayload(finalIdentifier, {\n page: 1,\n filters: value,\n })\n setIsValid(true)\n console.log('QueryList init completed, isValid set to true')\n } catch (error) {\n console.log('QueryList init validation failed:', error)\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance])\n\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\n )\n\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <div>\n {formRenderer}\n {tableExtraRenderer}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isLoading}\n pagination={pagination}\n footer={renderFooter}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: QueryListProps<Item, Values, Data> & { ref?: Ref<QueryListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default QueryList\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/filterFormWrapper/FilterFormWrapper.tsx","../src/components/highlight/Highlight.tsx","../src/components/queryList/stores.ts","../src/components/queryList/QueryList.tsx"],"names":["FilterFormWrapper","props","extras","isConfirming","onConfirm","onReset","children","buttonsAlign","showReset","t","useTranslation","colorFillAlter","lineWidth","lineType","colorBorder","borderRadiusLG","theme","jsx","jsxs","Space","Button","item","Fragment","FilterFormWrapper_default","splitByTags","str","regex","part","renderToString","node","container","root","createRoot","resolve","flushSync","Highlight","texts","htmlString","setHtmlString","useState","useEffect","result","text","index","Highlight_default","DEFAULT_PAYLOAD","createStore","create","devtools","subscribeWithSelector","set","get","id","url","queryKey","refetch","state","existingInstance","updatedInstance","newInstances","instance","payload","newPayload","isEqual","payloadChanged","currentPayload","error","store","useQueryListStore","QueryListAction","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","BODYLESS_METHODS","BODY_SUPPORTED_METHODS","identifierCounter","generateUniqueIdentifier","InternalQueryList","ref","form","identifier","code","onePage","defaultSize","refreshInterval","tableExtra","renderForm","afterSuccess","afterError","footer","pageSizeOptions","request","dataAdapter","tableProps","formInstance","Form","finalIdentifier","useMemo","action","useRef","accessible","isChecking","useAuth","isValid","setIsValid","isInitialized","isUpdatingFromPayload","subscribedPayload","s","ky","useKy","page","size","filters","resolvedRequest","method","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","isBodylessMethod","defaultRequestData","requestBody","requestSearchParams","requestHeaders","shouldPoll","data","isLoading","useQuery","kyOptions","response","err","errorObj","failureCount","retryError","attemptIndex","resolvedDataAdapter","adapter","defaultAdapter","dataSource","total","pagination","currentPage","currentSize","useCallback","formRenderer","cloneElement","e","tableExtraRenderer","renderFooter","currentFormValues","init","value","rafId","useImperativeHandle","Spin","Table","Result","QueryList","forwardRef","QueryList_default"],"mappings":"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","file":"chunk-IKGXKB6T.js","sourcesContent":["import { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Fragment } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n buttonsAlign?: 'left' | 'right' | 'bottom'\n showReset?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children, buttonsAlign = 'left', showReset } = props\n const { t } = useTranslation()\n const {\n token: { colorFillAlter, lineWidth, lineType, colorBorder, borderRadiusLG },\n } = theme.useToken()\n\n return (\n <div\n className=\"max-w-none p-6 mb-6 border\"\n style={{\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n }}\n >\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'grow-0' : 'flex-1'}`}>{children}</div>\n <div className={`${buttonsAlign === 'bottom' ? 'text-end' : 'text-start'} ml-4`}>\n <Space>\n <Button type=\"primary\" disabled={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n {extras?.map(item => (\n <Fragment key={item.key}>{item.children}</Fragment>\n ))}\n {showReset && <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\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 HighlightProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightProps) => {\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 { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryListPayload } from './QueryList'\n\n// Query 更新函数类型\ntype QueryRefetchFunction = () => void | Promise<unknown>\n\n// QueryList 实例信息\ninterface QueryListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: QueryListPayload\n refetch: QueryRefetchFunction\n}\n\n// 简化的状态接口\ninterface QueryListState {\n // 实例管理\n instances: Map<string, QueryListInstance>\n\n // 核心方法\n registerInstance(id: string, url: string, queryKey: readonly unknown[], refetch: QueryRefetchFunction): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: QueryListPayload): void\n getPayload(id: string): QueryListPayload\n refetch(id: string, payload?: QueryListPayload): Promise<void>\n\n // 工具方法\n getInstance(id: string): QueryListInstance | undefined\n getAllInstances(): QueryListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<QueryListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新refetch函数\n if (existingInstance) {\n // 仅当 refetch 变更时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: QueryListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`QueryList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch QueryList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'query-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useQueryListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useQueryListStore } from './stores'\n\nexport interface ListResponse<T = any> {\n list: T[]\n total: number\n}\n\nexport interface QueryListPayload<Values = any> {\n page?: number\n size?: number\n filters?: Values\n}\n\n// 缓存配置\nexport interface CacheConfig {\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\n// 支持的 HTTP 请求方法类型\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\n// 简化的请求配置\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string\n method?: HttpMethod\n body?: FormData | Record<string | number, any>\n searchParams?: Record<string | number, any>\n headers?: Record<string, string>\n}\n\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\nexport enum QueryListAction {\n Confirm,\n Reset,\n Jump,\n Init,\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any> {\n data: Data | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n}\n\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number\n items?: Item[]\n}\n\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = any> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选的标识符,用于标识和外部控制,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n onePage?: boolean // 无分页\n defaultSize?: number\n pageSizeOptions?: number[]\n request: QueryListRequestConfigType<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n footer?: (data: Data | undefined) => ReactNode\n}\n\n// 常量定义\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000 // 默认缓存5分钟\nconst DEFAULT_STALE_TIME = 30 * 1000 // 默认30秒内数据新鲜\n\n// 无请求体的 HTTP 方法\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD', 'OPTIONS']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\n\n// 生成唯一 identifier 的函数\nconst generateUniqueIdentifier = (): string => {\n return `queryList_${Date.now()}_${++identifierCounter}`\n}\n\nconst InternalQueryList = <Item extends AnyObject = AnyObject, Values extends AnyObject = any, Data = any>(\n props: QueryListProps<Item, Values, Data>,\n ref: Ref<QueryListRef<Item, Values, Data>>,\n) => {\n const { t } = useTranslation()\n\n const {\n form,\n identifier,\n code,\n onePage,\n buttonsAlign,\n showReset,\n defaultSize = 10,\n refreshInterval = 0,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n footer,\n pageSizeOptions,\n request,\n dataAdapter,\n ...tableProps\n } = props\n\n const [formInstance] = Form.useForm<Values>(form)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => {\n return identifier || generateUniqueIdentifier()\n }, [identifier])\n const action = useRef<QueryListAction>(QueryListAction.Init)\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false) // 防止循环更新的标志\n\n // 仅订阅当前 identifier 的 payload,避免因其它实例变化导致不必要重渲染\n const subscribedPayload = useQueryListStore(s => s.getPayload(finalIdentifier))\n const ky = useKy()\n\n const { page, size = defaultSize, filters } = subscribedPayload\n\n const payload = { page, size, filters }\n\n // 处理 request 配置(对象或函数)\n const resolvedRequest = typeof request === 'function' ? request(payload) : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = resolvedRequest\n\n // 验证请求方法\n const normalizedMethod = method.toUpperCase() as HttpMethod\n const allSupportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n\n if (!allSupportedMethods.includes(normalizedMethod)) {\n console.warn(`QueryList: 不支持的 HTTP 请求方法 \"${method}\",将使用 GET 方法`)\n }\n\n // 根据请求方法决定参数传递方式\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 智能参数传递策略:\n // 1. 优先使用用户明确传入的 body 或 searchParams\n // 2. 若用户未指定,根据 HTTP 方法自动选择合适的传递方式\n // 3. 避免同时设置 body 和 searchParams(除非用户明确指定)\n let requestBody: any\n let requestSearchParams: any\n\n if (body !== undefined) {\n // 用户传入了 body,优先使用\n requestBody = body\n requestSearchParams = searchParams\n } else if (searchParams !== undefined) {\n // 用户只传入了 searchParams\n requestSearchParams = searchParams\n requestBody = undefined\n } else {\n // 都未传入,根据方法类型自动选择\n if (isBodylessMethod) {\n requestSearchParams = defaultRequestData\n requestBody = undefined\n } else {\n requestBody = defaultRequestData\n requestSearchParams = undefined\n }\n }\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n // 构建更完整的 queryKey,包含所有影响请求结果的参数\n const queryKey = [\n 'queryList',\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n size,\n filters,\n requestBody,\n requestSearchParams,\n requestHeaders,\n ] as const\n\n const { data, isLoading, refetch } = useQuery({\n queryKey,\n queryFn: async () => {\n try {\n const kyOptions: KyOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n }\n\n // 只有非无请求体方法才允许有 body\n if (requestBody && !isBodylessMethod) {\n if (requestBody instanceof FormData) {\n // FormData 使用 body 方式传递\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n // 字符串直接作为 body\n kyOptions.body = requestBody\n } else {\n // 对象类型使用 .json 方式传递\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, response)\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n retry: (failureCount, retryError) => {\n // 自定义重试逻辑\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false // 认证错误不重试\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000), // 指数退避\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n // 缓存配置\n gcTime: cacheTime,\n staleTime,\n enabled: accessible && isValid,\n })\n\n // 处理 dataAdapter 配置\n const resolvedDataAdapter = useMemo(() => {\n const adapter = dataAdapter\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.total,\n items: (data as ListResponse<Item>)?.list,\n }\n\n if (typeof adapter === 'function') {\n return {\n ...defaultAdapter,\n ...adapter(data as Data),\n }\n }\n return {\n ...defaultAdapter,\n ...adapter,\n }\n }, [dataAdapter, data])\n\n // 在组件挂载时注册实例,避免因 queryKey/refetch 身份变化反复注册\n useEffect(() => {\n useQueryListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch)\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n const dataSource = resolvedDataAdapter.items\n const total = resolvedDataAdapter.total\n\n const pagination = useMemo(() => {\n if (onePage) return false\n\n return {\n pageSizeOptions,\n showSizeChanger: true,\n showQuickJumper: true,\n current: page,\n pageSize: size,\n total,\n onChange: async (currentPage: number, currentSize: number) => {\n action.current = QueryListAction.Jump\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n }, [onePage, pageSizeOptions, page, size, total, finalIdentifier])\n\n const onConfirm = useCallback(async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\n\n const onReset = useCallback(async () => {\n action.current = QueryListAction.Reset\n formInstance.resetFields()\n\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isLoading}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(formInstance) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={formInstance} />\n )\n\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data)}</> : undefined\n\n // 监听 payload.filters 变化并同步更新表单实例\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n // 获取当前表单的值\n const currentFormValues = formInstance.getFieldsValue()\n\n // 如果 payload 中的 filters 与当前表单值不同,则更新表单\n if (filters && !isEqual(currentFormValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n // 使用 setTimeout 确保在下一个事件循环中重置标志\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n // 首次挂载时自动校验表单,校验通过则更新 payload 并允许请求\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n console.log('QueryList init starting')\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n console.log('QueryList init validation success:', value)\n useQueryListStore.getState().updatePayload(finalIdentifier, {\n page: 1,\n filters: value,\n })\n setIsValid(true)\n console.log('QueryList init completed, isValid set to true')\n } catch (error) {\n console.log('QueryList init validation failed:', error)\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance])\n\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\n )\n\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <div>\n {formRenderer}\n {tableExtraRenderer}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isLoading}\n pagination={pagination}\n footer={renderFooter}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: QueryListProps<Item, Values, Data> & { ref?: Ref<QueryListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default QueryList\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {k as k$1,l,i,e}from'./chunk-F2GDEOP4.js';import {useQuery}from'@tanstack/react-query';function k(e,t){let s=k$1(),n=typeof e<"u"?typeof e=="string"?[e]:e:[],{data:r,...f}=useQuery({queryKey:l.permissions.check(n,"game_scoped"),queryFn:()=>s.post("/api/usystem/user/checkV2",{permissions:n},t),enabled:n.length>0,retry:false}),i=true;return typeof e=="string"?i=r?.has_all?true:r?.[e]??false:Array.isArray(e)&&e.length>0&&(i=n.reduce((l,y)=>(l[y]=r?.has_all?true:r?.[y]??false,l),{})),{...f,data:i}}function A(){let{context:{loginPath:e$1},game:{appId:t}}=i(),s=k$1();return useQuery({queryKey:l.menus.navbar(t?String(t):void 0),queryFn:()=>s.get("/api/usystem/menu/navbar",{headers:{[e]:t?encodeURIComponent(String(t)):"global"}}),enabled:window.location.pathname!==e$1})}var K=()=>{let{context:{useGameApiV2:e$1}}=i(),t=k$1();return useQuery({queryKey:l.games.all,queryFn:async()=>{let s={headers:{[e]:"global"}};return e$1?(await t.get("/api/game/list",s))?.list??[]:await t.get("/api/usystem/game/all",s)??[]},retry:false})};export{k as a,A as b,K as c};//# sourceMappingURL=chunk-JDCSIJL7.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-JDCSIJL7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/index.ts"],"names":["useAuth","code","config","ky","useKy","permissionCodes","data","rest","useQuery","queryKeys","newData","acc","curr","useMenuList","loginPath","appId","useToolkitsStore","APP_ID_HEADER","useGames","useGameApiV2","requestConfig"],"mappings":"8FAUO,SAASA,CAAAA,CAAQC,EAA0BC,CAAAA,CAAoB,CACpE,IAAMC,CAAAA,CAAKC,GAAAA,EAAM,CACXC,EAA4B,OAAOJ,CAAAA,CAAS,GAAA,CAAe,OAAOA,CAAAA,EAAS,QAAA,CAAW,CAACA,CAAI,CAAA,CAAIA,CAAAA,CAAQ,EAAC,CAExG,CAAE,IAAA,CAAAK,EAAM,GAAGC,CAAK,CAAA,CAAIC,QAAAA,CAAS,CACjC,QAAA,CAAUC,EAAU,WAAA,CAAY,KAAA,CAAMJ,CAAAA,CAAAA,aAA2C,CAAA,CACjF,OAAA,CAAS,IACPF,EAAG,IAAA,CACD,2BAAA,CACA,CACE,WAAA,CAAaE,CACf,CAAA,CACAH,CACF,CAAA,CACF,OAAA,CAASG,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAClC,KAAA,CAAO,KACT,CAAC,CAAA,CAEGK,CAAAA,CAA6C,IAAA,CAEjD,OAAI,OAAOT,CAAAA,EAAS,SAClBS,CAAAA,CAAUJ,CAAAA,EAAM,OAAA,CAAU,IAAA,CAAQA,CAAAA,GAAOL,CAAI,GAAK,KAAA,CACzC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,CAAS,CAAA,GAC9CS,CAAAA,CAAUL,CAAAA,CAAgB,MAAA,CAAgC,CAACM,CAAAA,CAAKC,CAAAA,IAC9DD,EAAIC,CAAI,CAAA,CAAIN,CAAAA,EAAM,OAAA,CAAU,IAAA,CAAQA,CAAAA,GAAOM,CAAI,CAAA,EAAK,KAAA,CAC7CD,CAAAA,CAAAA,CACN,EAAE,CAAA,CAAA,CAGA,CACL,GAAGJ,CAAAA,CACH,IAAA,CAAMG,CACR,CACF,CAEO,SAASG,CAAAA,EAAc,CAC5B,GAAM,CACJ,OAAA,CAAS,CAAE,SAAA,CAAAC,GAAU,EACrB,IAAA,CAAM,CAAE,KAAA,CAAAC,CAAM,CAChB,CAAA,CAAIC,GAAiB,CACfb,CAAAA,CAAKC,GAAAA,EAAM,CAEjB,OAAOI,QAAAA,CAAS,CACd,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAOM,CAAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAAI,MAAS,CAAA,CAClE,OAAA,CAAS,IACPZ,CAAAA,CAAG,GAAA,CAAoB,2BAA4B,CACjD,OAAA,CAAS,CAAE,CAACc,CAAa,EAAGF,EAAQ,kBAAA,CAAmB,MAAA,CAAOA,CAAK,CAAC,CAAA,CAAI,QAAS,CACnF,CAAC,CAAA,CACH,OAAA,CAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GAAaD,GACxC,CAAC,CACH,CAEO,IAAMI,CAAAA,CAAW,IAAM,CAC5B,GAAM,CACJ,OAAA,CAAS,CAAE,YAAA,CAAAC,GAAa,CAC1B,EAAIH,CAAAA,EAAiB,CACfb,CAAAA,CAAKC,GAAAA,EAAM,CAEjB,OAAOI,SAAS,CACd,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,GAAA,CAC1B,OAAA,CAAS,SAAY,CACnB,IAAMW,CAAAA,CAAgB,CACpB,OAAA,CAAS,CACP,CAACH,CAAa,EAAG,QACnB,CACF,CAAA,CAEA,OAAIE,GAAAA,CAAAA,CACe,MAAMhB,CAAAA,CAAG,GAAA,CAAsB,gBAAA,CAAkBiB,CAAa,CAAA,GAC9D,IAAA,EAAQ,GAGV,MAAMjB,CAAAA,CAAG,GAAA,CAAY,uBAAA,CAAyBiB,CAAa,CAAA,EACzD,EACrB,CAAA,CACA,KAAA,CAAO,KACT,CAAC,CACH","file":"chunk-JDCSIJL7.js","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport type { Options as KyOptions } from 'ky'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionMode } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useAuth(code?: string | string[], config?: KyOptions) {\n const ky = useKy()\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, PermissionMode.GAME_SCOPED),\n queryFn: () =>\n ky.post<Record<string, boolean> & { has_all?: boolean }>(\n '/api/usystem/user/checkV2',\n {\n permissions: permissionCodes,\n },\n config,\n ),\n enabled: permissionCodes.length > 0,\n retry: false,\n })\n\n let newData: boolean | Record<string, boolean> = true\n\n if (typeof code === 'string') {\n newData = data?.has_all ? true : (data?.[code] ?? false)\n } else if (Array.isArray(code) && code.length > 0) {\n newData = permissionCodes.reduce<Record<string, boolean>>((acc, curr) => {\n acc[curr] = data?.has_all ? true : (data?.[curr] ?? false)\n return acc\n }, {})\n }\n\n return {\n ...rest,\n data: newData,\n }\n}\n\nexport function useMenuList() {\n const {\n context: { loginPath },\n game: { appId },\n } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(appId ? String(appId) : undefined),\n queryFn: () =>\n ky.get<MenuListItem[]>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: appId ? encodeURIComponent(String(appId)) : 'global' },\n }),\n enabled: window.location.pathname !== loginPath,\n })\n}\n\nexport const useGames = () => {\n const {\n context: { useGameApiV2 },\n } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.games.all,\n queryFn: async () => {\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (useGameApiV2) {\n const response = await ky.get<{ list: Game[] }>('/api/game/list', requestConfig)\n return response?.list ?? []\n }\n\n const response = await ky.get<Game[]>('/api/usystem/game/all', requestConfig)\n return response ?? []\n },\n retry: false,\n })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {k,l,i}from'./chunk-F2GDEOP4.js';import {useQuery,useQueryClient,useMutation}from'@tanstack/react-query';function f(){let e=k();return useQuery({queryKey:l.roles.all,queryFn:()=>e.get("/api/usystem/role/all")})}function C(e){let i$1=k(),{context:{permissionMode:r}}=i();return useQuery({queryKey:l.roles.detail(e,r),queryFn:()=>i$1.get(`/api/usystem/role/${r==="game_scoped"?"info":"infoV2"}?name=${e}`)})}function q(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.roles.create(r),mutationFn:({name:s,permissions:n})=>e.post(`/api/usystem/role/${r==="game_scoped"?"create":"createV2"}`,{name:s,permissions:n}),onSuccess:()=>{i$1.invalidateQueries({queryKey:l.roles.all});}})}function K(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.roles.update(r),mutationFn:({id:s,name:n,permissions:u})=>e.post(`/api/usystem/role/${r==="game_scoped"?"update":"updateV2"}`,{id:s,name:n,permissions:u}),onSuccess:()=>{i$1.invalidateQueries({queryKey:l.roles.all});}})}function h(){let e=k(),i=useQueryClient();return useMutation({mutationKey:l.roles.delete,mutationFn:({id:r,name:s})=>e.post("/api/usystem/role/delete",{id:r,name:s}),onSuccess:()=>{i.invalidateQueries({queryKey:l.roles.all});}})}function x(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.users.create,mutationFn:s=>{let n=m=>"permissions"in m,u=s;if(n(s)&&r==="direct_game"){let m=s.permissions?.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...s,permissions:m};}return e.post("/api/usystem/user/create",u)},onSuccess:()=>{i$1.invalidateQueries({queryKey:l.users.all});}})}function E(){let e=k(),i$1=useQueryClient(),r=i(s=>s.context.permissionMode);return useMutation({mutationKey:l.users.update,mutationFn:s=>{let n=m=>"permissions"in m,u=s;if(n(s)&&r==="direct_game"){let m=s.permissions?.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...s,permissions:m};}return e.post("/api/usystem/user/update",u)},onSuccess:()=>{i$1.invalidateQueries({queryKey:l.users.all});}})}function W(){let e=k(),i=useQueryClient();return useMutation({mutationKey:l.users.delete,mutationFn:({id:r,name:s})=>e.post("/api/usystem/user/delete",{id:r,name:s}),onSuccess:()=>{i.invalidateQueries({queryKey:l.users.all});}})}function _(){let e=k();return useQuery({queryKey:l.permissions.allPermissions,queryFn:()=>e.get("/api/usystem/user/allPermssions")})}function V(){let e=k();return useQuery({queryKey:l.permissions.allPermissionsV2,queryFn:()=>e.get("/api/usystem/user/allPermssionsV2")})}export{f as a,C as b,q as c,K as d,h as e,x as f,E as g,W as h,_ as i,V as j};//# sourceMappingURL=chunk-KZHYK554.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-KZHYK554.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/permission/services/index.ts"],"names":["useAllRoles","ky","useKy","useQuery","queryKeys","useRole","name","permissionMode","useToolkitsStore","useCreateRole","queryClient","useQueryClient","useMutation","permissions","useUpdateRole","id","useRemoveRole","useCreateUser","arg","hasPermissions","obj","requestData","transformedPermissions","item","useUpdateUser","state","useRemoveUser","useAllPermissions","useAllPermissionsV2"],"mappings":"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","file":"chunk-KZHYK554.js","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n const ky = useKy()\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => ky.get<RoleEnumItem[]>('/api/usystem/role/all'),\n })\n}\n\nexport function useRole(name: string) {\n const ky = useKy()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, permissionMode),\n queryFn: () =>\n ky.get<RoleV1 | RoleV2>(\n `/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'info' : 'infoV2'}?name=${name}`,\n ),\n })\n}\n\nexport function useCreateRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.create(permissionMode),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n ky.post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'create' : 'createV2'}`, {\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.update(permissionMode),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n ky.post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'update' : 'updateV2'}`, {\n id,\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) => ky.post('/api/usystem/role/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\ntype CreateUserWithRoles = { name: string; roles: string[] }\n\ntype CreateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype CreateUserWithPermissions = {\n name: string\n permissions: CreateUserPermission[]\n}\n\nexport function useCreateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.create,\n mutationFn: (arg: CreateUserWithRoles | CreateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is CreateUserWithPermissions => 'permissions' in obj\n\n let requestData: CreateUserWithRoles | CreateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/create', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\ntype UpdateUserWithRoles = { id: string; name: string; roles: string[] }\n\ntype UpdateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype UpdateUserWithPermissions = {\n id: string\n name: string\n permissions: UpdateUserPermission[]\n}\n\nexport function useUpdateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const permissionMode = useToolkitsStore(state => state.context.permissionMode)\n\n return useMutation({\n mutationKey: queryKeys.users.update,\n mutationFn: (arg: UpdateUserWithRoles | UpdateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is UpdateUserWithPermissions => 'permissions' in obj\n\n let requestData: UpdateUserWithRoles | UpdateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/update', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) => ky.post('/api/usystem/user/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssions'),\n })\n}\n\nexport function useAllPermissionsV2() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssionsV2'),\n })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d,i as i$1,j}from'./chunk-KZHYK554.js';import {d as d$1}from'./chunk-5QAEUAZE.js';import {a}from'./chunk-D5YXBSTI.js';import {c as c$1}from'./chunk-JDCSIJL7.js';import {i}from'./chunk-F2GDEOP4.js';import {Typography,Select,App,Form,Input,Skeleton,Divider,Card,Empty,Button,Space,Checkbox,Row,Col,Collapse}from'antd';import {useState,useEffect,useTransition,useCallback}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var oe=m=>{let{permissions:r,readonly:t,expand:n,value:l,onChange:f}=m,[c,g]=useState([]),[P,R]=useState({}),[a$1,d]=useState(l??[]),{t:y}=a(),[,C]=useTransition(),x=useCallback(e=>{g(e);},[]),p=(e,s)=>{let o=[];return e?o=[...new Set(a$1.concat(s))]:(o=a$1.slice(),s.forEach(u=>{let b=o.findIndex(X=>X===u);b>-1&&o.splice(b,1);})),o},L=(e,s)=>{let o=p(e.target.checked,s);d(o),f?.(o);};useEffect(()=>{d(l??[]);},[l]),useEffect(()=>{n&&C(()=>{g((r??[]).map(({category:e})=>e));});},[n,r]),useEffect(()=>{let e=(r??[]).reduce((s,o)=>(s[o.category]=o.permissions.every(u=>a$1?.includes(u.value)),s),{});R(e);},[a$1,r]);let I=(r??[]).map(e=>({key:e.category,label:e.category,extra:!t&&jsx(Checkbox,{checked:P[e.category],onChange:s=>{L(s,e.permissions?.map(o=>o.value));},children:y("global.selectAll")}),children:jsx(Checkbox.Group,{className:"w-full",value:a$1,disabled:t,children:jsx(Row,{gutter:[10,10],className:"w-full",children:e.permissions?.map(s=>jsx(Col,{span:6,children:jsx(Checkbox,{value:s.value,onChange:o=>{L(o,[s.value]);},children:s.label})},s.value))})})}));return jsx(Collapse,{className:"w-full",collapsible:"header",activeKey:c,items:I,onChange:x})},k=oe;var{Text:w}=Typography,{Option:le}=Select,pe=m=>{let{expand:r=true,value:t,readonly:n,onChange:l}=m,{data:f,isLoading:c,error:g}=j(),{data:P,isLoading:R}=c$1(),[a$1,d]=useState([]),y=f?.filter(e=>e.is_common),C=f?.filter(e=>!e.is_common),x=c||R,{t:p}=a();if(useEffect(()=>{let e=[];Object.keys(t??{}).forEach(s=>{s!=="global"&&e.push({gameId:s,permissions:t?.[s]??[]});}),d(e);},[t]),g)return jsx("div",{className:"flex justify-center",children:jsx(w,{type:"danger",children:p("PermissionList.failedDescription")})});let L=()=>{d(e=>[...e,{gameId:"",permissions:[]}]);},I=e=>{d(s=>s.filter((o,u)=>u!==e));};return jsxs("div",{className:"flex flex-col w-full",children:[jsx("div",{className:"mb-12",children:jsx(Divider,{dashed:true,children:p("PermissionList.baseSectionTitle")})}),jsx(Skeleton,{active:true,loading:x,children:jsx(k,{value:t?.global,readonly:n,permissions:y,expand:r,onChange:e=>{l?.({...t,global:e});}})}),jsx("div",{className:"my-12",children:jsx(Divider,{dashed:true,children:p("PermissionList.gameSectionTitle")})}),a$1.map((e,s)=>jsx(Card,{title:jsxs(Space,{children:[jsx(w,{children:p("global.game")}),n?jsx(w,{children:P?.find(o=>String(o.id)===e.gameId)?.name}):jsx(Select,{disabled:n,value:a$1[s].gameId||void 0,className:"w-40",placeholder:p("PermissionList.gameSelectPlaceholder"),onChange:o=>{d(u=>{let b=u.slice();return b[s].gameId=o,b});},children:P?.map(o=>jsx(le,{value:o.id,disabled:a$1.some(({gameId:u})=>u===String(o.id)),children:o.name},o.id))})]}),className:"mb-6",extra:!n&&jsx(Button,{type:"link",onClick:()=>{I(s);},children:p("PermissionList.removeText")}),children:a$1[s].gameId?jsx(Skeleton,{active:true,loading:x,children:jsx(k,{value:t?.[a$1[s].gameId],readonly:n,expand:r,permissions:C,onChange:o=>{l?.({...t,[a$1[s].gameId]:o});}})}):jsx(Empty,{description:p("PermissionList.gameSectionDescription")})},s)),!n&&jsx(Button,{block:true,type:"dashed",onClick:L,children:p("PermissionList.addText")})]})},$=pe;var{Text:ue}=Typography,fe=m=>{let{expand:r=true,value:t,readonly:n,onChange:l}=m,{data:f,isLoading:c,error:g}=i$1(),{t:P}=a();return g?jsx("div",{className:"flex justify-center",children:jsx(ue,{type:"danger",children:P("PermissionList.failedDescription")})}):jsx(Skeleton,{active:true,loading:c,children:jsx(k,{value:t,permissions:f,readonly:n,expand:r,onChange:l})})},z=fe;var ge=m=>{let{value:r}=m,{context:{permissionMode:t}}=i();return t==="game_scoped"?jsx(z,{...m,value:r}):jsx($,{...m,value:r})},J=ge;var Qe=({mode:m,onSuccess:r})=>{let{message:t}=App.useApp(),{t:n}=a(),l=c(),f=d(),c$1=m==="create",g=n(c$1?"Role.createTitle":"Role.updateTitle"),P=jsxs(Fragment,{children:[jsx(Form.Item,{label:n("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!c$1})}),jsx(Form.Item,{name:"permissions",children:jsx(J,{})})]});return d$1({title:g,width:"1000px",formProps:{layout:"vertical"},content:P,onConfirm:async(a,d)=>{let y=`role_${a.name}`,C=a.permissions;c$1?(await l.mutateAsync({name:y,permissions:C}),t.success(n("Role.createSuccessfully"))):(await f.mutateAsync({id:d?.id,name:y,permissions:C}),t.success(n("Role.updateSuccessfully"))),r?.();}})};export{J as a,Qe as b};//# sourceMappingURL=chunk-MVG7YFPB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MVG7YFPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/permission/components/permissionCollapse/index.tsx","../src/modules/permission/components/permissionList/PermissionWithGame.tsx","../src/modules/permission/components/permissionList/PermissionWithoutGame.tsx","../src/modules/permission/components/permissionList/index.tsx","../src/modules/permission/hooks/role-hooks.tsx"],"names":["PermissionCollapse","props","permissions","readonly","expand","value","onChange","activeKey","setActiveKey","useState","checkedMap","setCheckedMap","internalValue","setInternalValue","t","useTranslation","startTransition","useTransition","onCollapseChange","useCallback","key","getCheckedValue","checkedValue","codes","tempValue","code","index","item","onCheckChange","useEffect","category","acc","curr","items","jsx","Checkbox","e","permission","Row","Col","Collapse","permissionCollapse_default","Text","Typography","Option","Select","PermissionWithGame","isPermissionLoading","error","useAllPermissionsV2","games","isGamesLoading","useGames","gameList","setGameList","globalPermissions","gamePermissions","isLoading","list","addGame","prev","removeGame","_","i","jsxs","Divider","Skeleton","newValue","Card","Space","game","selectedValue","pev","temp","gameId","Button","Empty","PermissionWithGame_default","PermissionWithoutGame","useAllPermissions","PermissionWithoutGame_default","PermissionList","permissionMode","useToolkitsStore","permissionList_default","useRoleModal","mode","onSuccess","message","App","create","useCreateRole","update","useUpdateRole","isCreateMode","title","content","Fragment","Form","Input","useFormModal","values","extraValues","name"],"mappings":"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","file":"chunk-MVG7YFPB.js","sourcesContent":["import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useCallback, useEffect, useState, useTransition } from 'react'\n\nimport { useTranslation } from '@/locale'\n\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 const [, startTransition] = useTransition()\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 startTransition(() => {\n // 改变展开状态\n setActiveKey((permissions ?? []).map(({ category }) => category))\n })\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 const 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 className=\"w-full\" value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} className=\"w-full\">\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\n return (\n <Collapse className=\"w-full\" collapsible=\"header\" activeKey={activeKey} items={items} onChange={onCollapseChange} />\n )\n}\n\nexport default PermissionCollapse\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport { useAllPermissionsV2 } from '../../services'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionWithGameProps extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionWithGame: FC<PermissionWithGameProps> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permission, isLoading: isPermissionLoading, error } = useAllPermissionsV2()\n const { data: games, isLoading: isGamesLoading } = useGames()\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 isLoading = isPermissionLoading || isGamesLoading\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 => String(game.id) === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n className=\"w-40\"\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\n key={game.id}\n value={game.id}\n disabled={gameList.some(({ gameId }) => gameId === String(game.id))}\n >\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 PermissionWithGame\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nimport { useAllPermissions } from '../../services'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\n\ninterface PermissionWithoutGameProps extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionWithoutGame: FC<PermissionWithoutGameProps> = 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 PermissionWithoutGame\n","import type { FC } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode } from '@/constants'\n\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionWithGame from './PermissionWithGame'\nimport PermissionWithoutGame from './PermissionWithoutGame'\nimport type { PermissionListPropsBase } from './types'\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 {\n context: { permissionMode },\n } = useToolkitsStore()\n\n if (permissionMode === PermissionMode.GAME_SCOPED) {\n return <PermissionWithoutGame {...props} value={value as RoleV1['permissions']} />\n }\n\n return <PermissionWithGame {...props} value={value as RoleV2['permissions']} />\n}\n\nexport default PermissionList\n","import { App, Form, Input } from 'antd'\n\nimport { useFormModal } from '@/hooks/modal'\nimport { useTranslation } from '@/locale'\n\nimport PermissionList from '../components/permissionList'\nimport { useCreateRole, useUpdateRole } from '../services'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../types'\n\nexport const useRoleModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const create = useCreateRole()\n const update = useUpdateRole()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('Role.createTitle') : t('Role.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (\n values: { name: string; permissions: RoleListItem['permissions'] },\n extraValues: { id: number },\n ) => {\n const name = `role_${values.name}`\n const permissions = values.permissions\n\n if (isCreateMode) {\n await create.mutateAsync({ name, permissions })\n message.success(t('Role.createSuccessfully'))\n } else {\n await update.mutateAsync({ id: extraValues?.id, name, permissions })\n message.success(t('Role.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n { id: number }\n >({\n title,\n width: '1000px',\n formProps: {\n layout: 'vertical',\n },\n content,\n onConfirm,\n })\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=createMenuItem-
|
|
1
|
+
import {a}from'./chunk-FIT6S4UM.js';import {f}from'./chunk-F2GDEOP4.js';import {Editor}from'@monaco-editor/react';import {App,Form,Card,Input,Switch,InputNumber,Button}from'antd';import {useNavigate}from'react-router-dom';import {jsx,jsxs}from'react/jsx-runtime';var v=()=>{let{message:u}=App.useApp(),[p]=Form.useForm(),o=useNavigate(),{mutateAsync:c}=a();return jsx(Card,{title:"\u521B\u5EFA\u83DC\u5355\u9879",children:jsxs(Form,{scrollToFirstError:true,form:p,labelCol:{flex:"120px"},initialValues:{is_common:false,is_model:false,order:0},onFinish:async I=>{let{permissions:s,front_route:d,...f$1}=I;await c({...f$1,front_route:f+d,permissions:s?JSON.parse(s):void 0}),u.success("\u521B\u5EFA\u6210\u529F",.8,()=>o("..",{relative:"route"}));},children:[jsx(Form.Item,{label:"\u83DC\u5355\u9879\u540D\u79F0",name:"category",rules:[{required:true}],children:jsx(Input,{})}),jsx(Form.Item,{label:"\u524D\u7AEF\u8DEF\u7531",name:"front_route",rules:[{required:true}],children:jsx(Input,{prefix:f})}),jsx(Form.Item,{label:"\u6A21\u677F\u540D\u79F0",name:"model_name",rules:[{required:true}],children:jsx(Input,{})}),jsx(Form.Item,{label:"Is Common",name:"is_common",rules:[{required:true}],valuePropName:"checked",children:jsx(Switch,{})}),jsx(Form.Item,{label:"Order",name:"order",children:jsx(InputNumber,{className:"w-full"})}),jsx(Form.Item,{label:"\u63A5\u53E3\u89C4\u5219",name:"permissions",children:jsx(Editor,{theme:"vs-dark",height:"300px",language:"json",options:{minimap:{enabled:false}}})}),jsx(Form.Item,{label:"Schema",name:"scheme",rules:[{required:true}],children:jsx(Editor,{theme:"vs-dark",height:"600px",language:"json",options:{minimap:{enabled:false}}})}),jsx(Form.Item,{label:"Ext",name:"ext",children:jsx(Input.TextArea,{rows:5})}),jsx(Form.Item,{children:jsxs("div",{className:"flex justify-center gap-8",children:[jsx(Button,{type:"primary",htmlType:"submit",children:"\u63D0\u4EA4"}),jsx(Button,{onClick:()=>{o("..",{relative:"path"});},children:"\u53D6\u6D88"})]})})]})})},q=v;export{q as default};//# sourceMappingURL=createMenuItem-Q5TJGFKZ.js.map
|
|
2
|
+
//# sourceMappingURL=createMenuItem-Q5TJGFKZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/menu/pages/createMenuItem/index.tsx"],"names":["CreateMenuItem","message","App","form","Form","navigate","useNavigate","createMenu","useCreateMenu","jsx","Card","jsxs","values","permissions","front_route","rest","FRONTEND_ROUTE_PREFIX","Input","Switch","InputNumber","Editor","Button","createMenuItem_default"],"mappings":"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","file":"createMenuItem-
|
|
1
|
+
{"version":3,"sources":["../src/modules/menu/pages/createMenuItem/index.tsx"],"names":["CreateMenuItem","message","App","form","Form","navigate","useNavigate","createMenu","useCreateMenu","jsx","Card","jsxs","values","permissions","front_route","rest","FRONTEND_ROUTE_PREFIX","Input","Switch","InputNumber","Editor","Button","createMenuItem_default"],"mappings":"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","file":"createMenuItem-Q5TJGFKZ.js","sourcesContent":["import { Editor } from '@monaco-editor/react'\nimport { App, Button, Card, Form, Input, InputNumber, Switch } from 'antd'\nimport { useNavigate } from 'react-router-dom'\n\nimport { FRONTEND_ROUTE_PREFIX } from '@/constants'\nimport type { MenuListItem } from '@/types'\n\nimport { useCreateMenu } from '../../services'\n\ntype FormSchema = Omit<MenuListItem, 'id' | 'permissions'> & { permissions: string }\n\nconst CreateMenuItem = () => {\n const { message } = App.useApp()\n const [form] = Form.useForm<FormSchema>()\n const navigate = useNavigate()\n const { mutateAsync: createMenu } = useCreateMenu()\n\n const onFinish = async (values: FormSchema) => {\n const { permissions, front_route, ...rest } = values\n await createMenu({\n ...rest,\n front_route: FRONTEND_ROUTE_PREFIX + front_route,\n permissions: permissions ? JSON.parse(permissions) : undefined,\n })\n message.success('创建成功', 0.8, () => navigate('..', { relative: 'route' }))\n }\n\n return (\n <Card title=\"创建菜单项\">\n <Form\n scrollToFirstError\n form={form}\n labelCol={{ flex: '120px' }}\n initialValues={{ is_common: false, is_model: false, order: 0 }}\n onFinish={onFinish}\n >\n <Form.Item label=\"菜单项名称\" name=\"category\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"前端路由\" name=\"front_route\" rules={[{ required: true }]}>\n <Input prefix={FRONTEND_ROUTE_PREFIX} />\n </Form.Item>\n <Form.Item label=\"模板名称\" name=\"model_name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"Is Common\" name=\"is_common\" rules={[{ required: true }]} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n <Form.Item label=\"Order\" name=\"order\">\n <InputNumber className=\"w-full\" />\n </Form.Item>\n <Form.Item label=\"接口规则\" name=\"permissions\">\n <Editor\n theme=\"vs-dark\"\n height=\"300px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Schema\" name=\"scheme\" rules={[{ required: true }]}>\n <Editor\n theme=\"vs-dark\"\n height=\"600px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Ext\" name=\"ext\">\n <Input.TextArea rows={5} />\n </Form.Item>\n <Form.Item>\n <div className=\"flex justify-center gap-8\">\n <Button type=\"primary\" htmlType=\"submit\">\n 提交\n </Button>\n <Button\n onClick={() => {\n navigate('..', { relative: 'path' })\n }}\n >\n 取消\n </Button>\n </div>\n </Form.Item>\n </Form>\n </Card>\n )\n}\n\nexport default CreateMenuItem\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ButtonProps, FormInstance,
|
|
1
|
+
import { ButtonProps, FormInstance, SelectProps, MenuProps, DrawerProps, Button, FormProps, ModalProps } from 'antd';
|
|
2
2
|
import { Options } from 'ky';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { FC, PropsWithChildren, Key, ReactNode, ReactElement, Ref, DetailedHTMLProps, ImgHTMLAttributes, ComponentProps } from 'react';
|
|
@@ -157,24 +157,6 @@ declare const useInfiniteListStore: zustand.UseBoundStore<Omit<Omit<zustand.Stor
|
|
|
157
157
|
};
|
|
158
158
|
}>;
|
|
159
159
|
|
|
160
|
-
type NavMenuItemType = Merge<MenuItemType, {
|
|
161
|
-
route?: string;
|
|
162
|
-
}>;
|
|
163
|
-
interface NavSubMenuType extends Omit<SubMenuType, 'children'> {
|
|
164
|
-
children?: NavItem[];
|
|
165
|
-
}
|
|
166
|
-
interface NavMenuItemGroupType extends Omit<MenuItemGroupType, 'children'> {
|
|
167
|
-
children?: NavItem[];
|
|
168
|
-
}
|
|
169
|
-
type NavItem = Exclude<ItemType, SubMenuType | MenuItemGroupType | MenuItemType> | NavMenuItemType | NavSubMenuType | NavMenuItemGroupType;
|
|
170
|
-
|
|
171
|
-
interface NavProps {
|
|
172
|
-
items?: NavItem[];
|
|
173
|
-
theme?: MenuProps['theme'];
|
|
174
|
-
loading?: boolean;
|
|
175
|
-
}
|
|
176
|
-
declare const Nav: (props: NavProps) => react_jsx_runtime.JSX.Element;
|
|
177
|
-
|
|
178
160
|
type Area = 'all' | 'cn' | 'global';
|
|
179
161
|
type ScreenOrientation = 0 | 1;
|
|
180
162
|
interface Game {
|
|
@@ -197,23 +179,68 @@ interface GameSelectProps<T extends Game = Game> {
|
|
|
197
179
|
filter?: (game: T) => boolean;
|
|
198
180
|
options?: (data?: T[]) => SelectProps['options'];
|
|
199
181
|
}
|
|
182
|
+
declare const GameSelect: <T extends Game = Game>(props: GameSelectProps<T>) => react_jsx_runtime.JSX.Element;
|
|
200
183
|
|
|
184
|
+
type NavMenuItemType = Merge<MenuItemType, {
|
|
185
|
+
route?: string;
|
|
186
|
+
}>;
|
|
187
|
+
interface NavSubMenuType extends Omit<SubMenuType, 'children'> {
|
|
188
|
+
children?: NavItem[];
|
|
189
|
+
}
|
|
190
|
+
interface NavMenuItemGroupType extends Omit<MenuItemGroupType, 'children'> {
|
|
191
|
+
children?: NavItem[];
|
|
192
|
+
}
|
|
193
|
+
type NavItem = Exclude<ItemType, SubMenuType | MenuItemGroupType | MenuItemType> | NavMenuItemType | NavSubMenuType | NavMenuItemGroupType;
|
|
194
|
+
|
|
195
|
+
interface NavProps {
|
|
196
|
+
items?: NavItem[];
|
|
197
|
+
theme?: MenuProps['theme'];
|
|
198
|
+
loading?: boolean;
|
|
199
|
+
}
|
|
200
|
+
declare const Nav: (props: NavProps) => react_jsx_runtime.JSX.Element;
|
|
201
|
+
|
|
202
|
+
/** Header 扩展项配置 */
|
|
201
203
|
type HeaderExtra = {
|
|
202
204
|
key: Key;
|
|
203
205
|
children: ReactNode;
|
|
204
206
|
};
|
|
207
|
+
/** Header 扩展区域配置 */
|
|
208
|
+
interface HeaderExtraConfig {
|
|
209
|
+
/** 左侧扩展项 */
|
|
210
|
+
left?: HeaderExtra[];
|
|
211
|
+
/** 右侧扩展项 */
|
|
212
|
+
right?: HeaderExtra[];
|
|
213
|
+
}
|
|
214
|
+
/** 导航配置 */
|
|
215
|
+
interface NavigationConfig {
|
|
216
|
+
/** 导航菜单项 */
|
|
217
|
+
items?: NavItem[];
|
|
218
|
+
/** 菜单加载状态 */
|
|
219
|
+
loading?: boolean;
|
|
220
|
+
}
|
|
221
|
+
/** 路由匹配规则类型 */
|
|
222
|
+
type RouteMatchRule = string | RegExp;
|
|
223
|
+
/** 游戏选择器配置 */
|
|
224
|
+
interface GameSelectConfig<T extends Game = Game> {
|
|
225
|
+
/** 游戏过滤函数 */
|
|
226
|
+
filter?: GameSelectProps<T>['filter'];
|
|
227
|
+
/** 选项自定义函数 */
|
|
228
|
+
options?: GameSelectProps<T>['options'];
|
|
229
|
+
/** 在这些路由路径下隐藏游戏选择器(支持字符串路径或正则表达式) */
|
|
230
|
+
hideOnRoutes?: RouteMatchRule[];
|
|
231
|
+
}
|
|
232
|
+
/** Layout 组件属性 */
|
|
205
233
|
interface LayoutProps<T extends Game = Game> {
|
|
234
|
+
/** 应用标题(显示在侧边栏顶部) */
|
|
206
235
|
title?: string;
|
|
236
|
+
/** 应用副标题(显示在标题下方) */
|
|
207
237
|
subtitle?: string;
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
headerExtra?:
|
|
214
|
-
left?: HeaderExtra[];
|
|
215
|
-
right?: HeaderExtra[];
|
|
216
|
-
};
|
|
238
|
+
/** 导航配置 */
|
|
239
|
+
navigation?: NavigationConfig;
|
|
240
|
+
/** 游戏选择器配置 */
|
|
241
|
+
gameSelect?: GameSelectConfig<T>;
|
|
242
|
+
/** Header 扩展区域配置 */
|
|
243
|
+
headerExtra?: HeaderExtraConfig;
|
|
217
244
|
}
|
|
218
245
|
declare const Layout: <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => react_jsx_runtime.JSX.Element;
|
|
219
246
|
|
|
@@ -342,11 +369,19 @@ declare const _default$2: react.NamedExoticComponent<{
|
|
|
342
369
|
declare const SSO_URL = "https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1";
|
|
343
370
|
declare const APP_ID_HEADER = "App-ID";
|
|
344
371
|
declare const FRONTEND_ROUTE_PREFIX = "/console/";
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
372
|
+
/**
|
|
373
|
+
* 权限系统模式枚举
|
|
374
|
+
* - GAME_SCOPED: 游戏范围权限(角色权限包含游戏信息)
|
|
375
|
+
* - GROUP_BASED: 基于项目组的权限(需要先选择项目组才能选择游戏)
|
|
376
|
+
* - DIRECT_GAME: 直接游戏权限(不需要项目组,直接选择游戏)
|
|
377
|
+
*/
|
|
378
|
+
declare enum PermissionMode {
|
|
379
|
+
/** 游戏范围权限:角色权限包含游戏范围信息 */
|
|
380
|
+
GAME_SCOPED = "game_scoped",
|
|
381
|
+
/** 基于项目组的权限:权限依赖项目组,需要先选择项目组才能选择游戏 */
|
|
382
|
+
GROUP_BASED = "group_based",
|
|
383
|
+
/** 直接游戏权限:权限直接选择游戏,不需要项目组作为中间层 */
|
|
384
|
+
DIRECT_GAME = "direct_game"
|
|
350
385
|
}
|
|
351
386
|
declare const WILDCARD = "*";
|
|
352
387
|
|
|
@@ -443,11 +478,11 @@ type Locale = {
|
|
|
443
478
|
|
|
444
479
|
interface ContextSlice {
|
|
445
480
|
locale: Locale;
|
|
446
|
-
|
|
481
|
+
permissionMode: PermissionMode;
|
|
447
482
|
useGameApiV2: boolean;
|
|
448
483
|
loginPath: string;
|
|
449
484
|
isGlobalMode: boolean;
|
|
450
|
-
|
|
485
|
+
gameScoped?: boolean;
|
|
451
486
|
sidebarWidth?: number;
|
|
452
487
|
sidebarCollapsible?: boolean;
|
|
453
488
|
homePath: string;
|
|
@@ -479,7 +514,11 @@ interface TokenSlice {
|
|
|
479
514
|
clearToken: () => void;
|
|
480
515
|
}
|
|
481
516
|
|
|
482
|
-
type ToolkitsState =
|
|
517
|
+
type ToolkitsState = {
|
|
518
|
+
context: ContextSlice;
|
|
519
|
+
token: TokenSlice;
|
|
520
|
+
game: GameSlice;
|
|
521
|
+
layout: LayoutSlice;
|
|
483
522
|
clear: () => void;
|
|
484
523
|
};
|
|
485
524
|
|
|
@@ -829,4 +868,4 @@ declare function useAuth(code?: string | string[], config?: Options): {
|
|
|
829
868
|
declare function useMenuList(): _tanstack_react_query.UseQueryResult<MenuListItem[], Error>;
|
|
830
869
|
declare const useGames: () => _tanstack_react_query.UseQueryResult<Game[], Error>;
|
|
831
870
|
|
|
832
|
-
export { APP_ID_HEADER, AuthButton, type AuthButtonProps, DynamicTags, type DynamicTagsProps, ExpandableParagraph, type ExpandableParagraphProps, FRONTEND_ROUTE_PREFIX, FilterFormWrapper, type FilterFormWrapperProps, type Game, Highlight, type HighlightProps, InfiniteList, InfiniteListAction, type InfiniteListPayload, type InfiniteListProps, type InfiniteListRef, type InfiniteListRequestConfig, Layout, type LayoutProps, Logo, type LogoProps, type MenuListItem, Nav, type NavItem, NotFound, OperationLogList, type Permission,
|
|
871
|
+
export { APP_ID_HEADER, AuthButton, type AuthButtonProps, DynamicTags, type DynamicTagsProps, ExpandableParagraph, type ExpandableParagraphProps, FRONTEND_ROUTE_PREFIX, FilterFormWrapper, type FilterFormWrapperProps, type Game, GameSelect, type GameSelectConfig, type GameSelectProps, type HeaderExtra, type HeaderExtraConfig, Highlight, type HighlightProps, InfiniteList, InfiniteListAction, type InfiniteListPayload, type InfiniteListProps, type InfiniteListRef, type InfiniteListRequestConfig, Layout, type LayoutProps, Logo, type LogoProps, type MenuListItem, Nav, type NavItem, type NavigationConfig, NotFound, OperationLogList, type Permission, PermissionMode, QueryList, QueryListAction, type QueryListPayload, type QueryListProps, type QueryListRef, type RecursivePartial, RequireAuth, type RequireAuthProps, _default$2 as RequireGame, type RouteMatchRule, SSO_URL, SignIn, ToolkitsProvider, type ToolkitsProviderProps, type UseFormDrawerProps, type UseFormModalProps, UserDropdown, type VisibilityState, WILDCARD, createVisibilityStore, generateId, _default$1 as menu, mixedStorage, _default as permission, useAuth, useDrawer, useDrawerStore, useFormDrawer, useFormModal, useGames, useInfiniteListStore, useMenuList, useModal, useModalStore, useQueryListStore, useToolkitsStore };
|