react-toolkits 2.22.12 → 2.22.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/chunk-6XX3UHOU.js +2 -0
  3. package/lib/{chunk-ZRGA4NV7.js.map → chunk-6XX3UHOU.js.map} +1 -1
  4. package/lib/chunk-BKF7C4LV.js +2 -0
  5. package/lib/{chunk-3N7LFLKJ.js.map → chunk-BKF7C4LV.js.map} +1 -1
  6. package/lib/chunk-EKBAANKX.js +3 -0
  7. package/lib/chunk-EKBAANKX.js.map +1 -0
  8. package/lib/chunk-MFVQ4PJU.js +2 -0
  9. package/lib/{chunk-PB74M2DE.js.map → chunk-MFVQ4PJU.js.map} +1 -1
  10. package/lib/{chunk-OLVGFJFN.js → chunk-NNBW4GD4.js} +2 -2
  11. package/lib/{chunk-OLVGFJFN.js.map → chunk-NNBW4GD4.js.map} +1 -1
  12. package/lib/chunk-Q5JJHVZX.js +2 -0
  13. package/lib/chunk-Q5JJHVZX.js.map +1 -0
  14. package/lib/chunk-TLXOBLJT.js +2 -0
  15. package/lib/{chunk-S6NRRFWG.js.map → chunk-TLXOBLJT.js.map} +1 -1
  16. package/lib/chunk-VLNOUQQB.js +2 -0
  17. package/lib/chunk-VLNOUQQB.js.map +1 -0
  18. package/lib/chunk-WUZMZ2YT.js +2 -0
  19. package/lib/chunk-WUZMZ2YT.js.map +1 -0
  20. package/lib/createMenuItem-Z5SGFFW4.js +2 -0
  21. package/lib/{createMenuItem-WS2MRQJF.js.map → createMenuItem-Z5SGFFW4.js.map} +1 -1
  22. package/lib/index.d.ts +35 -34
  23. package/lib/index.js +2 -2
  24. package/lib/index.js.map +1 -1
  25. package/lib/{menuItemList-CVNXJ7CP.js → menuItemList-TPVPEI4U.js} +2 -2
  26. package/lib/{menuItemList-CVNXJ7CP.js.map → menuItemList-TPVPEI4U.js.map} +1 -1
  27. package/lib/{roleDetail-WPKPZSX2.js → roleDetail-UA2UUISJ.js} +2 -2
  28. package/lib/{roleDetail-WPKPZSX2.js.map → roleDetail-UA2UUISJ.js.map} +1 -1
  29. package/lib/roleList-DDCLGGJV.js +2 -0
  30. package/lib/{roleList-RY6ZEVB4.js.map → roleList-DDCLGGJV.js.map} +1 -1
  31. package/lib/{updateMenuItem-AJRUUJ6K.js → updateMenuItem-PCQ4PPNF.js} +2 -2
  32. package/lib/{updateMenuItem-AJRUUJ6K.js.map → updateMenuItem-PCQ4PPNF.js.map} +1 -1
  33. package/lib/{userDetail-QQDMP7HT.js → userDetail-GIPZI62Q.js} +2 -2
  34. package/lib/{userDetail-QQDMP7HT.js.map → userDetail-GIPZI62Q.js.map} +1 -1
  35. package/lib/userList-4WW25S64.js +2 -0
  36. package/lib/{userList-Q4RULNHM.js.map → userList-4WW25S64.js.map} +1 -1
  37. package/package.json +3 -3
  38. package/lib/chunk-3N7LFLKJ.js +0 -2
  39. package/lib/chunk-BRZIJDNT.js +0 -2
  40. package/lib/chunk-BRZIJDNT.js.map +0 -1
  41. package/lib/chunk-JQHQKJFH.js +0 -2
  42. package/lib/chunk-JQHQKJFH.js.map +0 -1
  43. package/lib/chunk-N67BWR5M.js +0 -3
  44. package/lib/chunk-N67BWR5M.js.map +0 -1
  45. package/lib/chunk-PB74M2DE.js +0 -2
  46. package/lib/chunk-PMXRIKKI.js +0 -2
  47. package/lib/chunk-PMXRIKKI.js.map +0 -1
  48. package/lib/chunk-S6NRRFWG.js +0 -2
  49. package/lib/chunk-ZRGA4NV7.js +0 -2
  50. package/lib/createMenuItem-WS2MRQJF.js +0 -2
  51. package/lib/roleList-RY6ZEVB4.js +0 -2
  52. package/lib/userList-Q4RULNHM.js +0 -2
@@ -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","SPIN_STYLE","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","usePermission","isValid","setIsValid","isInitialized","isUpdatingFromPayload","subscribedPayload","s","ky","useKy","page","size","filters","resolvedRequest","method","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","isBodylessMethod","supportsBody","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-OLVGFJFN.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 const style = {\n maxWidth: 'none',\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'flex-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 => <Fragment key={item.key}>{item.children}</Fragment>)}\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 { usePermission } 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'\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']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\nconst SPIN_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n}\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 } = usePermission(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 const supportsBody = BODY_SUPPORTED_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 使用用户提供的参数,否则使用默认请求数据\n const requestBody = body || (supportsBody ? defaultRequestData : undefined)\n const requestSearchParams = searchParams || defaultRequestData\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n const queryKey = ['queryList', url, finalIdentifier, page, size, filters]\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), {\n onKeyUp: (e: 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 = 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 <Spin style={SPIN_STYLE} />\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","SPIN_STYLE","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","usePermission","isValid","setIsValid","isInitialized","isUpdatingFromPayload","subscribedPayload","s","ky","useKy","page","size","filters","resolvedRequest","method","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","isBodylessMethod","supportsBody","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-NNBW4GD4.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 const style = {\n maxWidth: 'none',\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'flex-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 => <Fragment key={item.key}>{item.children}</Fragment>)}\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 { usePermission } 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'\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']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\nconst SPIN_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n}\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 } = usePermission(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 const supportsBody = BODY_SUPPORTED_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 使用用户提供的参数,否则使用默认请求数据\n const requestBody = body || (supportsBody ? defaultRequestData : undefined)\n const requestSearchParams = searchParams || defaultRequestData\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n const queryKey = ['queryList', url, finalIdentifier, page, size, filters]\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), {\n onKeyUp: (e: 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 = 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 <Spin style={SPIN_STYLE} />\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 {l,i,m,e}from'./chunk-EKBAANKX.js';import {useQuery}from'@tanstack/react-query';function I(e,s){let t=l(),{permissionVersion:n}=i(),r=typeof e<"u"?typeof e=="string"?[e]:e:[],l$1=n!=="v1"?"v2":"v1",{data:o,...c}=useQuery({queryKey:m.permissions.check(r,l$1),queryFn:()=>t.post(n!=="v1"?"/api/usystem/user/checkV2":"/api/usystem/user/check",{permissions:r},s),enabled:r.length>0}),p=!0;return typeof e=="string"?p=o?.has_all?!0:o?.[e]??!1:Array.isArray(e)&&e.length>0&&(p=r.reduce((f,g)=>(f[g]=o?.has_all?!0:o?.[g]??!1,f),{})),{...c,data:p}}function K(){let{signInPath:e$1,gameId:s}=i(),t=l();return useQuery({queryKey:m.menus.navbar(s?String(s):void 0),queryFn:()=>t.get("/api/usystem/menu/navbar",{headers:{[e]:s?encodeURIComponent(String(s)):"global"}}),enabled:window.location.pathname!==e$1})}var v=()=>{let{gameApiV2:e$1,permissionVersion:s}=i(),t=l({suppressErrorNotification:!0});return useQuery({queryKey:m.enums.gameGroups,queryFn:async()=>{let n={headers:{[e]:"global"}};return e$1?(await t.get("/api/game/list",n))?.list??[]:await t.get("/api/usystem/game/all",n)??[]},enabled:s!=="v1",staleTime:1/0,retry:!1})};export{I as a,K as b,v as c};//# sourceMappingURL=chunk-Q5JJHVZX.js.map
2
+ //# sourceMappingURL=chunk-Q5JJHVZX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/index.ts"],"names":["usePermission","code","config","ky","useKy","permissionVersion","useToolkitsStore","permissionCodes","version","data","rest","useQuery","queryKeys","newData","acc","curr","useMenuList","signInPath","gameId","APP_ID_HEADER","useGames","gameApiV2","requestConfig"],"mappings":"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","file":"chunk-Q5JJHVZX.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, PermissionVersion } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function usePermission(code?: string | string[], config?: KyOptions) {\n const ky = useKy()\n const { permissionVersion } = useToolkitsStore()\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n const version = permissionVersion !== PermissionVersion.V1 ? 'v2' : 'v1'\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, version),\n queryFn: () =>\n ky.post<Record<string, boolean> & { has_all?: boolean }>(\n permissionVersion !== PermissionVersion.V1 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check',\n {\n permissions: permissionCodes,\n },\n config,\n ),\n enabled: permissionCodes.length > 0,\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 { signInPath, gameId } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(gameId ? String(gameId) : undefined),\n queryFn: () =>\n ky.get<MenuListItem[]>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: gameId ? encodeURIComponent(String(gameId)) : 'global' },\n }),\n enabled: window.location.pathname !== signInPath,\n })\n}\n\nexport const useGames = () => {\n const { gameApiV2, permissionVersion } = useToolkitsStore()\n const ky = useKy({ suppressErrorNotification: true })\n\n return useQuery({\n queryKey: queryKeys.enums.gameGroups, // 复用现有的 key,或者可以创建专门的 games key\n queryFn: async () => {\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (gameApiV2) {\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 enabled: permissionVersion !== PermissionVersion.V1,\n staleTime: Infinity,\n retry: false,\n })\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {i}from'./chunk-EKBAANKX.js';import {has,template,get}from'lodash-es';import {useMemo}from'react';function l(){let t=i(e=>e.locale);return {t:useMemo(()=>(e,r)=>has(t,e)?template(get(t,e))(r):e,[t])}}export{l as a};//# sourceMappingURL=chunk-TLXOBLJT.js.map
2
+ //# sourceMappingURL=chunk-TLXOBLJT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/locale/hooks.ts"],"names":["useTranslation","locale","useToolkitsStore","state","useMemo","key","data","has","template","get"],"mappings":"yGAmBO,SAASA,CAAAA,EAAiB,CAC/B,IAAMC,CAAAA,CAASC,EAAiBC,CAASA,EAAAA,CAAAA,CAAM,MAAM,CAAA,CAQrD,OAAO,CAAE,EANCC,OACR,CAAA,IAAM,CAACC,CAAoBC,CAAAA,CAAAA,GACzBC,IAAIN,CAAQI,CAAAA,CAAG,EAAIG,QAASC,CAAAA,GAAAA,CAAIR,EAAQI,CAAa,CAAC,EAAEC,CAAI,CAAA,CAAID,EAClE,CAACJ,CAAM,CACT,CAEW,CACb","file":"chunk-S6NRRFWG.js","sourcesContent":["import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n"]}
1
+ {"version":3,"sources":["../src/locale/hooks.ts"],"names":["useTranslation","locale","useToolkitsStore","state","useMemo","key","data","has","template","get"],"mappings":"yGAmBO,SAASA,CAAAA,EAAiB,CAC/B,IAAMC,CAAAA,CAASC,EAAiBC,CAASA,EAAAA,CAAAA,CAAM,MAAM,CAAA,CAQrD,OAAO,CAAE,EANCC,OACR,CAAA,IAAM,CAACC,CAAoBC,CAAAA,CAAAA,GACzBC,IAAIN,CAAQI,CAAAA,CAAG,EAAIG,QAASC,CAAAA,GAAAA,CAAIR,EAAQI,CAAa,CAAC,EAAEC,CAAI,CAAA,CAAID,EAClE,CAACJ,CAAM,CACT,CAEW,CACb","file":"chunk-TLXOBLJT.js","sourcesContent":["import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a as a$2}from'./chunk-TLXOBLJT.js';import {a as a$1}from'./chunk-Q5JJHVZX.js';import {a,b}from'./chunk-EKBAANKX.js';import {Modal,Form,Button,Tooltip}from'antd';import {jsx}from'react/jsx-runtime';import {useMemo,useEffect,useState,useCallback}from'react';var S=p=>{let{children:e,code:r,showLoading:l,disabled:a,config:c,...o}=p,d=r?Array.isArray(r)?r:[r]:[],{data:n,isLoading:m}=a$1(d,c),{t}=a$2();return m?jsx(Button,{loading:l,disabled:!l,...o,children:e}):typeof n=="boolean"||n&&Object.values(n).some(Boolean)?jsx(Button,{disabled:a,...o,children:e}):jsx(Tooltip,{defaultOpen:!1,title:t("global.noEntitlement"),children:jsx(Button,{disabled:!0,...o,children:e})})},A=S;var w=a();function C(p){let{content:e,onConfirm:r,afterOpen:l,afterClose:a,...c}=p,o=useMemo(()=>b(),[]),{show:d,hide:n,isOpen:m,cleanup:t}=w();useEffect(()=>()=>{t(o);},[o,t]);let h=m(o),[M,u]=useState(!1),f=typeof e=="function",O=useCallback(async()=>{d(o),await l?.();},[o,d,l]),i=useCallback(()=>{n(o);},[o,n]),s=useCallback(async()=>{i(),await a?.();},[i,a]),x=useCallback(async()=>{try{u(!0),await r?.(),i(),await a?.();}catch(B){throw B}finally{u(!1);}},[r,i,a]),y=jsx(Modal,{...c,open:h,confirmLoading:M,onOk:x,onCancel:s,children:f?e({hide:i}):e});return {id:o,show:O,hide:i,modal:y}}function K(p){let{content:e,form:r,formProps:l,onConfirm:a,onSuccess:c,afterClose:o,...d}=p,[n,m]=useState({}),[t]=Form.useForm(r),h=typeof e=="function",{id:M,show:u,hide:f,modal:O}=C({...d,content:s=>jsx(Form,{...l,form:t,children:h?e(n,s):e}),onConfirm:async()=>{try{let s=await t.validateFields();await a?.(s,n),c?.(),f();}catch(s){throw s}},afterClose:()=>{m({}),o?.(t);}}),i=useCallback(s=>{let{initialValues:x,extraValues:y}=s||{};y!==void 0&&m(y),x&&t.setFieldsValue(x),u();},[t,u]);return {id:M,show:i,hide:f,modal:O}}export{A as a,w as b,C as c,K as d};//# sourceMappingURL=chunk-VLNOUQQB.js.map
2
+ //# sourceMappingURL=chunk-VLNOUQQB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/permissionButton/PermissionButton.tsx","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx"],"names":["PermissionButton","props","children","code","showLoading","disabled","config","restProps","codes","data","isLoading","usePermission","useTranslation","jsx","Button","Tooltip","PermissionButton_default","useModalStore","createVisibilityStore","useModal","content","onConfirm","afterOpen","afterClose","modalProps","_id","useMemo","generateId","show","hide","isOpen","cleanup","useEffect","open","confirmLoading","setConfirmLoading","useState","isRenderFunction","_show","useCallback","_hide","onCancel","onOk","error","internalModal","Modal","useFormModal","form","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","Form","id","modal","operation","values","showForm","options","initialValues","extraValues"],"mappings":"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","file":"chunk-VLNOUQQB.js","sourcesContent":["import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { usePermission } from '@/services'\n\nexport interface PermissionButtonProps extends ButtonProps {\n code?: string | string[]\n showLoading?: boolean\n config?: KyOptions\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = usePermission(codes, config)\n const { t } = useTranslation()\n\n if (isLoading) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n // 只要有一个权限即可\n if (typeof data === 'boolean' || (data && Object.values(data).some(Boolean))) {\n return (\n <Button disabled={disabled} {...restProps}>\n {children}\n </Button>\n )\n }\n\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n}\n\nexport default PermissionButton\n","import { createVisibilityStore } from '@/utils'\n\nexport const useModalStore = createVisibilityStore()\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useModalStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onCancel: ModalProps['onCancel'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const onOk = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n _hide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm, _hide, afterClose])\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? content({ hide: _hide }) : content}\n </Modal>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? content(internalExtraValues, operation) : content}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n modal,\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a as a$1,f,g}from'./chunk-BKF7C4LV.js';import {d}from'./chunk-VLNOUQQB.js';import {a}from'./chunk-TLXOBLJT.js';import {l,m,h}from'./chunk-EKBAANKX.js';import {MinusCircleOutlined}from'@ant-design/icons';import {useQuery}from'@tanstack/react-query';import {App,Form,Input,Select,Row,Col,Empty,Button,Typography}from'antd';import {last,first}from'lodash-es';import {Fragment as Fragment$1}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var {Text:T}=Typography,$=u=>{let{onChange:a,...r}=u,o=l(),{data:g,isLoading:d}=useQuery({queryKey:m.enums.gameGroups,queryFn:()=>o.get("/api/enum/get?enum=game_group&type=all")}),C=[{label:"\u901A\u7528",value:h}].concat(g?.map(s=>({label:s,value:s}))??[]);return jsx(Select,{...r,allowClear:!0,showSearch:!0,mode:"tags",optionFilterProp:"label",loading:d,options:C,onChange:s=>{last(s)===h?a?.([h]):first(s)===h?a?.(s.slice(1)):a?.(s);}})},z=u=>{let{groups:a,onChange:r,...o}=u,g=l(),{data:d,isLoading:C}=useQuery({queryKey:m.enums.gameIds(a||[]),queryFn:()=>g.get(`/api/enum/game_group/get_game_ids?game_groups=${a?.join(",")}`).then(t=>t?.list),enabled:!!a?.length}),h$1=d?.map(t=>({label:t.name,value:t.id}));return jsx(Select,{...o,allowClear:!0,showSearch:!0,optionFilterProp:"label",mode:"tags",loading:C,options:h$1,onChange:t=>{last(t)===h?r?.([h]):first(t)===h?r?.(t.slice(1)):r?.(t);}})},le=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d$1}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.Item,{label:o("global.role"),name:"roles",children:jsx(Select,{allowClear:!0,showSearch:!0,mode:"multiple",loading:d$1,optionFilterProp:"label",options:g$1?.map(n=>({label:n.name,value:n.name}))})})]});return d({title:t,width:"600px",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})},ie=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d$1}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.List,{name:"permissions",children:(n,{add:f,remove:R})=>jsxs(Row,{gutter:8,children:[jsx(Col,{span:8,className:"text-center mb-4",children:jsx(T,{strong:!0,children:o("global.projectGroup")})}),jsx(Col,{span:10,className:"text-center mb-4",children:jsx(T,{strong:!0,children:o("global.game")})}),jsx(Col,{span:6,className:"text-center mb-4",children:jsx(T,{strong:!0,children:o("global.role")})}),n.map(m=>jsxs(Fragment$1,{children:[jsx(Col,{span:8,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:!0,children:({setFieldValue:l})=>jsx(Form.Item,{name:[m.name,"game_group"],children:jsx($,{onChange:()=>{l(["permissions",m.name,"game_ids"],[]);}})})})}),jsx(Col,{span:10,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:(l,y)=>l.permissions[m.name]?.game_group!==y.permissions[m.name]?.game_group,children:({getFieldValue:l})=>{let y=l(["permissions",m.name,"game_group"]);return jsx(Form.Item,{name:[m.name,"game_ids"],dependencies:[["permissions",m.name,"game_group"]],rules:[{required:y?.length,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(z,{groups:y})})}})}),jsx(Col,{span:6,children:jsxs("div",{className:"flex",children:[jsx("div",{className:"flex-1",children:jsx(Form.Item,{name:[m.name,"role"],rules:[{required:!0,message:"\u8BF7\u9009\u62E9\u89D2\u8272"},({getFieldValue:l})=>({validator(y,K){return l("permissions").filter((I,j)=>!!I&&j!==m.name).some(I=>I.role===K)?Promise.reject(new Error("\u8BF7\u52FF\u91CD\u590D\u9009\u62E9\u89D2\u8272")):Promise.resolve()}})],children:jsx(Select,{allowClear:!0,showSearch:!0,optionFilterProp:"label",loading:d$1,options:g$1?.map(l=>({label:l.name,value:l.name}))})})}),jsx("div",{className:"w-8 text-center",children:jsx(Form.Item,{children:jsx(MinusCircleOutlined,{onClick:()=>{R(m.name);}})})})]})})]},m.key)),n.length===0&&jsx(Col,{span:24,children:jsx(Empty,{className:"mb-6"})}),jsx(Col,{span:24,children:jsx(Button,{block:!0,type:"dashed",onClick:()=>f(),children:o("global.add")})})]})})]});return d({title:t,width:"1000px",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})};export{le as a,ie as b};//# sourceMappingURL=chunk-WUZMZ2YT.js.map
2
+ //# sourceMappingURL=chunk-WUZMZ2YT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/permission/hooks/user-hooks.tsx"],"names":["Text","Typography","GroupSelect","props","onChange","rest","ky","useKy","data","isLoading","useQuery","queryKeys","options","WILDCARD","group","jsx","Select","value","last","first","GameSelect","groups","response","useUserModal","mode","onSuccess","message","App","t","useTranslation","roles","isRolesLoading","useAllRoles","create","useCreateUser","update","useUpdateUser","isCreateMode","title","content","jsxs","Fragment","Form","Input","role","useFormModal","values","extraValues","useUserModalV2","fields","add","remove","Row","Col","field","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","item","index","MinusCircleOutlined","Empty","Button"],"mappings":"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","file":"chunk-WUZMZ2YT.js","sourcesContent":["import { MinusCircleOutlined } from '@ant-design/icons'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Col, Empty, Form, Input, Row, Select, Typography } from 'antd'\nimport { first, last } from 'lodash-es'\nimport { Fragment } from 'react'\nimport { type FC } from 'react'\n\nimport { WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\n\nimport { useAllRoles, useCreateUser, useUpdateUser } from '../services'\n\nconst { Text } = Typography\n\ninterface GroupSelectProps {\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GroupSelect: FC<GroupSelectProps> = props => {\n const { onChange, ...rest } = props\n const ky = useKy()\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => ky.get<string[]>('/api/enum/get?enum=game_group&type=all'),\n })\n\n const options = [{ label: '通用', value: WILDCARD }].concat(\n data?.map(group => ({ label: group, value: group })) ?? [],\n )\n\n const onValueChange = (value: string[]) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n }\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n mode=\"tags\"\n optionFilterProp=\"label\"\n loading={isLoading}\n options={options}\n onChange={onValueChange}\n />\n )\n}\n\ninterface GameSelectProps {\n groups?: string[]\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GameSelect: FC<GameSelectProps> = props => {\n const { groups, onChange, ...rest } = props\n const ky = useKy()\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(groups || []),\n queryFn: () =>\n ky\n .get<{\n list: {\n id: string\n name: string\n }[]\n }>(`/api/enum/game_group/get_game_ids?game_groups=${groups?.join(',')}`)\n .then(response => response?.list),\n enabled: !!groups?.length,\n })\n\n const options = data?.map((group: { id: string; name: string }) => ({ label: group.name, value: group.id }))\n\n const onValueChange = (value: string[]) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n }\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n optionFilterProp=\"label\"\n mode=\"tags\"\n loading={isLoading}\n options={options}\n onChange={onValueChange}\n />\n )\n}\n\ninterface UserModalFormSchema {\n name: string\n roles: string[]\n}\n\nexport const useUserModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n showSearch\n mode=\"multiple\"\n loading={isRolesLoading}\n optionFilterProp=\"label\"\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (values: UserModalFormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalFormSchema, { id: string }>({\n title,\n width: '600px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n\ninterface UserModalV2FormSchema {\n name: string\n permissions: {\n game_group: string[]\n game_ids: string[]\n role: string\n }[]\n}\n\nexport const useUserModalV2 = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.List name=\"permissions\">\n {(fields, { add, remove }) => (\n <Row gutter={8}>\n <Col span={8} className=\"text-center mb-4\">\n <Text strong>{t('global.projectGroup')}</Text>\n </Col>\n <Col span={10} className=\"text-center mb-4\">\n <Text strong>{t('global.game')}</Text>\n </Col>\n <Col span={6} className=\"text-center mb-4\">\n <Text strong>{t('global.role')}</Text>\n </Col>\n {fields.map(field => (\n <Fragment key={field.key}>\n <Col span={8}>\n <Form.Item noStyle shouldUpdate>\n {({ setFieldValue }) => (\n <Form.Item name={[field.name, 'game_group']}>\n <GroupSelect\n onChange={() => {\n setFieldValue(['permissions', field.name, 'game_ids'], [])\n }}\n />\n </Form.Item>\n )}\n </Form.Item>\n </Col>\n <Col span={10}>\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, nextValues) =>\n prevValues.permissions[field.name]?.game_group !== nextValues.permissions[field.name]?.game_group\n }\n >\n {({ getFieldValue }) => {\n const _groups = getFieldValue(['permissions', field.name, 'game_group'])\n\n return (\n <Form.Item\n name={[field.name, 'game_ids']}\n dependencies={[['permissions', field.name, 'game_group']]}\n rules={[{ required: _groups?.length, message: '请选择游戏' }]}\n >\n <GameSelect groups={_groups} />\n </Form.Item>\n )\n }}\n </Form.Item>\n </Col>\n <Col span={6}>\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Form.Item\n name={[field.name, 'role']}\n rules={[\n { required: true, message: '请选择角色' },\n ({ getFieldValue }) => ({\n validator(_rule, value) {\n const items = getFieldValue('permissions') as UserModalV2FormSchema['permissions']\n const otherItems = items.filter((item, index) => !!item && index !== field.name)\n if (otherItems.some(item => item.role === value)) {\n return Promise.reject(new Error('请勿重复选择角色'))\n }\n return Promise.resolve()\n },\n }),\n ]}\n >\n <Select\n allowClear\n showSearch\n optionFilterProp=\"label\"\n loading={isRolesLoading}\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </div>\n <div className=\"w-8 text-center\">\n <Form.Item>\n <MinusCircleOutlined\n onClick={() => {\n remove(field.name)\n }}\n />\n </Form.Item>\n </div>\n </div>\n </Col>\n </Fragment>\n ))}\n {fields.length === 0 && (\n <Col span={24}>\n <Empty className=\"mb-6\" />\n </Col>\n )}\n <Col span={24}>\n <Button block type=\"dashed\" onClick={() => add()}>\n {t('global.add')}\n </Button>\n </Col>\n </Row>\n )}\n </Form.List>\n </>\n )\n\n const onConfirm = async (values: UserModalV2FormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n await create.mutateAsync(values)\n message.success(t('User.createSuccessfully'))\n } else {\n await update.mutateAsync({ ...values, id: extraValues?.id })\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalV2FormSchema, { id: string }>({\n title,\n width: '1000px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a}from'./chunk-MFVQ4PJU.js';import {j,f}from'./chunk-EKBAANKX.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 y=j(()=>{let{message:p}=App.useApp(),[c]=Form.useForm(),o=useNavigate(),{mutate:I}=a();return jsx(Card,{title:"\u521B\u5EFA\u83DC\u5355\u9879",children:jsxs(Form,{scrollToFirstError:!0,form:c,labelCol:{flex:"120px"},initialValues:{is_common:!1,is_model:!1,order:0},onFinish:async d=>{let{permissions:s,front_route:f$1,...F}=d;await I({...F,front_route:f+f$1,permissions:s?JSON.parse(s):void 0}),p.success("\u521B\u5EFA\u6210\u529F",.8,()=>o("..",{relative:"route"}));},children:[jsx(Form.Item,{label:"\u83DC\u5355\u9879\u540D\u79F0",name:"category",rules:[{required:!0}],children:jsx(Input,{})}),jsx(Form.Item,{label:"\u524D\u7AEF\u8DEF\u7531",name:"front_route",rules:[{required:!0}],children:jsx(Input,{prefix:f})}),jsx(Form.Item,{label:"\u6A21\u677F\u540D\u79F0",name:"model_name",rules:[{required:!0}],children:jsx(Input,{})}),jsx(Form.Item,{label:"Is Common",name:"is_common",rules:[{required:!0}],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:!1}}})}),jsx(Form.Item,{label:"Schema",name:"scheme",rules:[{required:!0}],children:jsx(Editor,{theme:"vs-dark",height:"600px",language:"json",options:{minimap:{enabled:!1}}})}),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"})]})})]})})},{isGlobal:!0}),M=y;export{M as default};//# sourceMappingURL=createMenuItem-Z5SGFFW4.js.map
2
+ //# sourceMappingURL=createMenuItem-Z5SGFFW4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/menu/pages/createMenuItem/index.tsx"],"names":["CreateMenuItem","withContext","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-WS2MRQJF.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 { withContext } from '@/components/toolkitsProvider'\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 = withContext(\n () => {\n const { message } = App.useApp()\n const [form] = Form.useForm<FormSchema>()\n const navigate = useNavigate()\n const { mutate: 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 { isGlobal: true },\n)\n\nexport default CreateMenuItem\n"]}
1
+ {"version":3,"sources":["../src/modules/menu/pages/createMenuItem/index.tsx"],"names":["CreateMenuItem","withContext","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-Z5SGFFW4.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 { withContext } from '@/components/toolkitsProvider'\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 = withContext(\n () => {\n const { message } = App.useApp()\n const [form] = Form.useForm<FormSchema>()\n const navigate = useNavigate()\n const { mutate: 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 { isGlobal: true },\n)\n\nexport default CreateMenuItem\n"]}
package/lib/index.d.ts CHANGED
@@ -498,7 +498,11 @@ type RecursivePartial<T> = NonNullable<T> extends object ? {
498
498
  [P in keyof T]?: NonNullable<T[P]> extends (infer U)[] ? RecursivePartial<U>[] : NonNullable<T[P]> extends object ? RecursivePartial<T[P]> : T[P];
499
499
  } : T;
500
500
 
501
- interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
501
+ interface ShowFormOptions$1<Values extends AnyObject, ExtraValues> {
502
+ initialValues?: RecursivePartial<Values>;
503
+ extraValues?: ExtraValues;
504
+ }
505
+ interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>> extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
502
506
  formProps?: Omit<FormProps, 'form'>;
503
507
  form?: FormInstance<Values>;
504
508
  content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode);
@@ -506,17 +510,15 @@ interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues =
506
510
  onSuccess?: () => void;
507
511
  afterClose?: (form: FormInstance<Values>) => void;
508
512
  }
509
- declare function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormDrawerProps<Values, ExtraValues>): {
513
+ interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {
510
514
  id: number;
511
- show: (options?: {
512
- initialValues?: RecursivePartial<Values>;
513
- extraValues?: ExtraValues;
514
- }) => void;
515
+ show: (options?: ShowFormOptions$1<Values, ExtraValues>) => void;
515
516
  hide: () => void;
516
- drawer: react_jsx_runtime.JSX.Element;
517
- };
517
+ drawer: ReactNode;
518
+ }
519
+ declare function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(props: UseFormDrawerProps<Values, ExtraValues>): UseFormDrawerReturn<Values, ExtraValues>;
518
520
 
519
- interface DrawerState {
521
+ interface VisibilityState {
520
522
  open: Map<number, boolean>;
521
523
  usedIds: Set<number>;
522
524
  isOpen: (uuid: number) => boolean;
@@ -527,7 +529,18 @@ interface DrawerState {
527
529
  registerIds: (uuid: number) => boolean;
528
530
  cleanup: (uuid: number) => void;
529
531
  }
530
- declare const useDrawerStore: zustand.UseBoundStore<zustand.StoreApi<DrawerState>>;
532
+ /**
533
+ * 创建一个可见性管理的 Zustand store
534
+ * 用于管理 Modal、Drawer 等组件的显示/隐藏状态
535
+ * 每次调用都会创建一个独立的 store 实例,确保不同组件间的状态隔离
536
+ */
537
+ declare function createVisibilityStore(): zustand.UseBoundStore<zustand.StoreApi<VisibilityState>>;
538
+
539
+ declare const generateId: () => number;
540
+
541
+ declare const mixedStorage: StateStorage;
542
+
543
+ declare const useDrawerStore: zustand.UseBoundStore<zustand.StoreApi<VisibilityState>>;
531
544
 
532
545
  interface UseModalOperation {
533
546
  hide: () => void;
@@ -545,7 +558,11 @@ declare function useModal(props: UseModalProps): {
545
558
  modal: react_jsx_runtime.JSX.Element;
546
559
  };
547
560
 
548
- interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
561
+ interface ShowFormOptions<Values extends AnyObject, ExtraValues> {
562
+ initialValues?: RecursivePartial<Values>;
563
+ extraValues?: ExtraValues;
564
+ }
565
+ interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>> extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
549
566
  formProps?: Omit<FormProps, 'form'>;
550
567
  form?: FormInstance<Values>;
551
568
  content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode);
@@ -553,28 +570,15 @@ interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues =
553
570
  onSuccess?: () => void;
554
571
  afterClose?: (form: FormInstance<Values>) => void;
555
572
  }
556
- declare function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormModalProps<Values, ExtraValues>): {
573
+ interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {
557
574
  id: number;
558
- show: (options?: {
559
- initialValues?: RecursivePartial<Values>;
560
- extraValues?: ExtraValues;
561
- }) => void;
575
+ show: (options?: ShowFormOptions<Values, ExtraValues>) => void;
562
576
  hide: () => void;
563
- modal: react_jsx_runtime.JSX.Element;
564
- };
565
-
566
- interface ModalState {
567
- open: Map<number, boolean>;
568
- usedIds: Set<number>;
569
- isOpen: (uuid: number) => boolean;
570
- show: (uuid: number) => void;
571
- hide: (uuid: number) => void;
572
- hideAll: () => void;
573
- checkUniqueness: (uuid: number) => boolean;
574
- registerIds: (uuid: number) => boolean;
575
- cleanup: (uuid: number) => void;
577
+ modal: ReactNode;
576
578
  }
577
- declare const useModalStore: zustand.UseBoundStore<zustand.StoreApi<ModalState>>;
579
+ declare function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(props: UseFormModalProps<Values, ExtraValues>): UseFormModalReturn<Values, ExtraValues>;
580
+
581
+ declare const useModalStore: zustand.UseBoundStore<zustand.StoreApi<VisibilityState>>;
578
582
 
579
583
  declare const _default$2: react_jsx_runtime.JSX.Element;
580
584
 
@@ -786,7 +790,4 @@ declare function usePermission(code?: string | string[], config?: Options): {
786
790
  declare function useMenuList(): _tanstack_react_query.UseQueryResult<MenuListItem[], Error>;
787
791
  declare const useGames: () => _tanstack_react_query.UseQueryResult<Game[], Error>;
788
792
 
789
- declare const mixedStorage: StateStorage;
790
- declare const generateId: () => number;
791
-
792
- export { APP_ID_HEADER, 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, NavMenu, type NavMenuItem, NotFound, _default as OperationLogList, type Permission, PermissionButton, type PermissionButtonProps, PermissionVersion, QueryList, QueryListAction, type QueryListPayload, type QueryListProps, type QueryListRef, type RecursivePartial, RequireGame, RequirePermission, type RequirePermissionProps, SSO_URL, SignIn, ToolkitsProvider, type ToolkitsProviderProps, type UseFormDrawerProps, type UseFormModalProps, UserWidget, WILDCARD, generateId, _default$2 as menu, mixedStorage, _default$1 as permission, useDrawer, useDrawerStore, useFormDrawer, useFormModal, useGames, useInfiniteListStore, useMenuList, useModal, useModalStore, usePermission, useQueryListStore, useToolkitsStore, withContext };
793
+ export { APP_ID_HEADER, 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, NavMenu, type NavMenuItem, NotFound, _default as OperationLogList, type Permission, PermissionButton, type PermissionButtonProps, PermissionVersion, QueryList, QueryListAction, type QueryListPayload, type QueryListProps, type QueryListRef, type RecursivePartial, RequireGame, RequirePermission, type RequirePermissionProps, SSO_URL, SignIn, ToolkitsProvider, type ToolkitsProviderProps, type UseFormDrawerProps, type UseFormModalProps, UserWidget, type VisibilityState, WILDCARD, createVisibilityStore, generateId, _default$2 as menu, mixedStorage, _default$1 as permission, useDrawer, useDrawerStore, useFormDrawer, useFormModal, useGames, useInfiniteListStore, useMenuList, useModal, useModalStore, usePermission, useQueryListStore, useToolkitsStore, withContext };