@qin-ui/element-plus-pro 1.4.3 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/shared/ui/index.ts","../src/components/component-provider/constants/index.ts","../src/components/form/components/ContainerFragment/index.vue","../src/components/form/components/SlotComponent/index.vue","../src/components/form/constants/index.ts","../src/components/form/hooks/useForm.ts","../src/components/form/components/BaseField/utils/index.ts","../src/components/form/utils/disabled.ts","../src/locale/zh-CN.ts","../src/locale/zh-TW.ts","../src/locale/en-US.ts","../src/locale/index.ts","../src/components/form/components/BaseField/index.vue","../src/components/form/hooks/useGroupFieldAttrs.ts","../src/components/form/components/BaseFormItem/index.vue","../src/components/form/utils/fieldKey.ts","../src/components/form/components/BaseFormItems/index.vue","../src/components/form/components/ProForm/index.vue","../src/components/form/hooks/useFields.ts","../src/components/form/hooks/useFormRef.ts","../src/components/table/components/icons/DownOutlined.vue","../src/components/table/components/SearchForm.vue","../src/components/table/components/DefaultSearchFormContainer.vue","../src/components/table/components/DefaultTableContainer.vue","../src/components/table/components/icons/ColumnHeightOutlined.vue","../src/components/table/components/SizeControl.vue","../src/components/table/components/icons/FilterOutlined.vue","../src/components/table/components/ColumnControl.vue","../src/components/table/components/TableColumnRenderer.vue","../src/components/table/components/ProTable.vue","../src/components/table/hooks/useTable.ts","../src/components/component-provider/components/index.vue","../src/index.ts"],"sourcesContent":["import {\n ElForm as Form,\n ElFormItem as FormItem,\n ElRow as Grid,\n ElCol as GridItem,\n ElTable as Table,\n ElTableColumn as TableColumn,\n ElSpace as Space,\n ElDropdown as Dropdown,\n ElDropdownMenu as DropdownMenu,\n ElDropdownItem as DropdownItem,\n ElCheckbox as Checkbox,\n ElCheckboxGroup as CheckboxGroup,\n ElButton as Button,\n ElAutocomplete as AutoComplete,\n ElCascader as Cascader,\n ElDatePicker as DatePicker,\n ElInput as Input,\n ElInputNumber as InputNumber,\n ElSelect as Select,\n ElSlider as Slider,\n ElSwitch as Switch,\n ElTransfer as Transfer,\n ElTreeSelect as TreeSelect,\n ElRadioGroup as RadioGroup,\n ElTimePicker as TimePicker,\n ElTimeSelect as TimeSelect,\n ElPagination as Pagination,\n useFormDisabled,\n useSize,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type TableProps as _TableProps,\n type TableEmits,\n type TableColumnCtx as ColumnType,\n type PaginationProps,\n type RowProps as GridProps,\n type ColProps as GridItemProps,\n} from 'element-plus';\nimport { type MaybeRefOrGetter, computed, inject, provide, toValue } from 'vue';\n\nexport {\n Form,\n FormItem,\n Grid,\n GridItem,\n Table,\n TableColumn,\n Space,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n CheckboxGroup,\n Button,\n AutoComplete,\n Cascader,\n DatePicker,\n Input,\n InputNumber,\n Select,\n Slider,\n Switch,\n Transfer,\n TreeSelect,\n RadioGroup,\n TimePicker,\n TimeSelect,\n Pagination,\n useSize,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type PaginationProps,\n type GridProps,\n type GridItemProps,\n type ColumnType,\n type TableEmits,\n};\n\n/** 宿主 Table 属性面(放宽泛型以兼容任意行数据) */\nexport type TableProps = _TableProps<any>;\n\nconst _tableProps = (Table as any).props || {};\nconst _paginationProps = (Pagination as any).props || {};\nconst _gridItemProps = (GridItem as any).props || {};\nconst _formItemProps = (FormItem as any).props || {};\n\n/** 宿主 Table 的静态 props 快照(透传键名白名单用) */\nexport const tableProps = () => _tableProps;\n/** 宿主 Pagination 的静态 props 快照(分页配置键名白名单用) */\nexport const paginationProps = () => _paginationProps;\n/** 宿主 Row/Col 的静态 props 快照 */\nexport const gridItemProps = () => _gridItemProps;\n/** 宿主 FormItem 的静态 props 快照 */\nexport const formItemProps = () => _formItemProps;\n\nconst DisabledContextKey = Symbol.for('pro-form-disabled-context');\n\n/** 禁用上下文取值\n *\n * @description 字段级禁用优先,未声明时回退宿主 `el-form` 的禁用状态\n * @returns {ComputedRef<boolean>} 当前生效的禁用状态\n */\nexport const useDisabledContext = () => {\n const formDisabled = useFormDisabled();\n const customDisabled = inject<MaybeRefOrGetter<boolean | undefined>>(\n DisabledContextKey,\n undefined\n );\n return computed(() => {\n const custom = toValue(customDisabled);\n if (custom !== undefined) return Boolean(custom);\n return Boolean(formDisabled.value);\n });\n};\n\n/** 禁用上下文提供者\n *\n * @description 与父级禁用上下文合并:未声明时保持继承,声明时(含 false)覆盖\n * @param {MaybeRefOrGetter<boolean | undefined>} disabled - 本层声明的禁用状态\n */\nexport const useDisabledContextProvider = (\n disabled: MaybeRefOrGetter<boolean | undefined>\n) => {\n // 与父级禁用上下文合并:未声明时保持继承,声明时(含 false)覆盖\n const parentDisabled = useDisabledContext();\n provide(\n DisabledContextKey,\n computed(() => toValue(disabled) ?? parentDisabled.value)\n );\n};\n\n/** {@link useDisabledContext} 的别名 */\nexport const useInjectDisabled = useDisabledContext;\n/** {@link useDisabledContextProvider} 的别名 */\nexport const useProviderDisabled = useDisabledContextProvider;\n\n/** 字段路径:字符串、数字或分段数组 */\nexport type NamePath = string | number | (string | number)[];\n","import type { RequiredComponentVars } from '../types';\nimport type { InjectionKey, Component } from 'vue';\nimport { type ComputedRef } from 'vue';\n\n/** 全量 componentVars 注入通道:运行期新增的自定义组件键由此读取(按组件名取配置) */\nexport const INJECT_COMPONENT_VARS: InjectionKey<\n ComputedRef<Record<string, any> | undefined> | Record<string, any>\n> = Symbol('COMPONENT_VARS');\n\n/** 注入项配置:注入 key、内置默认值与不可注入键清单 */\nexport type InjectConfigEntry<T = any> = {\n injectionKey: InjectionKey<T>;\n default: T;\n /** 不接受 Provider 注入的键,注入层静默剔除 */\n ignoreProps?: readonly string[];\n};\n\n/**\n * 注入项配置表:键为内置组件名与 `pro-*` 组件名,值为注入 key、内置默认值与不可注入键清单\n */\nexport const INJECT_CONFIG: {\n [key in keyof RequiredComponentVars]: InjectConfigEntry<\n RequiredComponentVars[key]\n >;\n} = {\n 'pro-table': {\n injectionKey: Symbol(''),\n // 数据取自 `:table` 实例或显式 `:data`;列与加载态非类型面成员,同样在注入层忽略\n ignoreProps: ['loading', 'columns', 'data'],\n default: {\n pagination: {\n layout: 'total, sizes, prev, pager, next, jumper',\n pageSizes: [10, 20, 30, 40, 50, 100],\n background: true,\n },\n searchFormConfig: {\n layout: 'grid',\n expand: { minExpandRows: 2, expandStatus: false },\n },\n control: true,\n addIndexColumn: true,\n },\n },\n 'pro-form': {\n injectionKey: Symbol(''),\n // 表单实例由 `:form` 显式传入;grid 仅作为启用时的参数默认值,不开启网格\n ignoreProps: ['form'],\n default: { grid: { gutter: 24 } },\n },\n 'pro-form-item': {\n injectionKey: Symbol(''),\n default: { span: 8 },\n },\n input: {\n injectionKey: Symbol(''),\n default: { maxlength: 100, clearable: true },\n },\n 'input.textarea': {\n injectionKey: Symbol(''),\n default: {\n maxlength: 200,\n autosize: { minRows: 3, maxRows: 6 },\n showWordLimit: true,\n clearable: true,\n },\n },\n 'input.password': {\n injectionKey: Symbol(''),\n default: {\n showPassword: true,\n maxlength: 100,\n clearable: true,\n },\n },\n 'input-number': {\n injectionKey: Symbol(''),\n default: {\n max: 10 ** 15 - 1,\n min: -(10 ** 15 - 1),\n controls: false,\n style: { width: '100%' },\n },\n },\n autocomplete: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n select: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n cascader: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n 'date-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.date': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.dates': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.daterange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.week': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.month': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.monthrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.months': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.yearrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.year': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.years': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarter': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarters': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarterrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetime': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetimerange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-select': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'checkbox-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'radio-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n switch: {\n injectionKey: Symbol(''),\n default: { modelProp: 'modelValue' },\n },\n slider: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'tree-select': {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n transfer: {\n injectionKey: Symbol(''),\n default: {},\n },\n};\n\n/** componentMap 注入 key:BaseField 解析组件时优先取用 */\nexport const INJECT_COMPONENTS: InjectionKey<\n | ComputedRef<Partial<Record<string, Component>> | undefined>\n | Partial<Record<string, Component>>\n> = Symbol('INJECT_COMPONENTS');\n\nconst DYNAMIC_INJECT_CONFIG: Record<string, InjectConfigEntry> =\n Object.create(null);\n\n/**\n * 读取注入项配置\n *\n * @param {string} key - 组件名或自定义注入键\n * @returns {InjectConfigEntry | undefined} 内置或动态注入项配置,未注册时返回 undefined\n */\nexport const getInjectConfig = (key: string): InjectConfigEntry | undefined => {\n return (\n (INJECT_CONFIG as Record<string, InjectConfigEntry>)[key] ||\n DYNAMIC_INJECT_CONFIG[key]\n );\n};\n\n/**\n * 读取注入项配置,未注册时按组件名补建动态注入项\n *\n * @param {string} key - 组件名或自定义注入键\n * @returns {InjectConfigEntry} 已存在或新建的注入项配置\n */\nexport const ensureInjectConfig = (key: string): InjectConfigEntry => {\n const existing = getInjectConfig(key);\n if (existing) return existing;\n const created: InjectConfigEntry = {\n injectionKey: Symbol(`dynamic:${key}`),\n default: {},\n };\n DYNAMIC_INJECT_CONFIG[key] = created;\n return created;\n};\n","<script lang=\"ts\" setup>\n/**\n * 容器分片渲染组件\n *\n * @component ContainerFragment\n * @description 用于动态渲染表单行或表单项的外部包裹容器(例如 Grid 行、Col 列等布局容器)\n *\n * @public\n */\nimport type { ContainerComponent } from '../../types';\n\ntype Props = {\n component?: ContainerComponent;\n};\n\ndefineProps<Props>();\n\ndefineOptions({ name: 'ContainerFragment', inheritAttrs: false });\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"component\" v-bind=\"$attrs\">\n <slot />\n </component>\n <slot v-else />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 插槽渲染辅助组件\n *\n * @component SlotComponent\n * @description 用于在表单或表格的自定义插槽中动态渲染外部传入的 VNode、渲染函数、组件定义对象或静态字符串\n *\n * @public\n */\nimport type { SlotComponentType } from '../../types';\n\ndefineOptions({ name: 'SlotComponent', inheritAttrs: false });\n\ntype Props = {\n component?: SlotComponentType;\n};\ndefineProps<Props>();\n\n/*\n * 可组件化渲染判定:VNode / 函数(含函数式组件)/ 组件定义对象\n * 其余(string/number/boolean/null/undefined)一律按文本渲染,不作为 <component :is> 的标签名解析\n */\nconst isRenderable = (c: Props['component']) =>\n c !== null &&\n c !== undefined &&\n (typeof c === 'function' || typeof c === 'object');\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"isRenderable(component)\" v-bind=\"$attrs\" />\n <template v-else>{{ component }}</template>\n</template>\n","import {\n Cascader,\n CheckboxGroup,\n DatePicker,\n AutoComplete,\n Input,\n InputNumber,\n RadioGroup,\n Select,\n Slider,\n Switch,\n TimePicker,\n TimeSelect,\n Transfer,\n TreeSelect,\n} from '../../../shared/ui';\n\n/**\n * FormItem 插槽名称列表\n * @description 用于在字段配置中透传 FormItem 的插槽(Element Plus 版本)\n */\n// prettier-ignore\nexport const FORM_ITEM_SLOT_KEYS = ['label', 'error'] as const;\n\n/**\n * 内置组件映射表\n * @description Element Plus 内置支持的组件类型映射\n */\n// prettier-ignore\nexport type BaseComponentMap = {\n 'input': typeof Input;\n 'input-number': typeof InputNumber;\n 'autocomplete': typeof AutoComplete;\n 'select': typeof Select;\n 'cascader': typeof Cascader;\n 'date-picker': typeof DatePicker;\n 'time-picker': typeof TimePicker;\n 'time-select': typeof TimeSelect;\n 'checkbox-group': typeof CheckboxGroup;\n 'radio-group': typeof RadioGroup;\n 'switch': typeof Switch;\n 'slider': typeof Slider;\n 'tree-select': typeof TreeSelect;\n 'transfer': typeof Transfer;\n}\n\n/**\n * 组件映射扩展接口\n * @description 暴露给外部扩充自定义组件类型的接口。\n * 用户可通过 TypeScript 的声明合并(module augmentation)添加自定义组件。\n *\n * @example\n * ```ts\n * declare module '@qin-ui/element-plus-pro' {\n * interface ComponentMap {\n * 'my-custom-input': typeof MyCustomInput;\n * }\n * }\n * ```\n *\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ComponentMap {}\n\n/**\n * 组件名称联合类型\n * @description 所有支持的组件名称\n *\n * @public\n */\nexport type ComponentName =\n | keyof BaseComponentMap\n | keyof ComponentMap\n | 'custom';\n\n/**\n * 根据组件名获取组件类型\n * @template K - 组件名称\n */\nexport type GetComponentType<K extends ComponentName> =\n K extends keyof ComponentMap\n ? ComponentMap[K]\n : K extends keyof BaseComponentMap\n ? BaseComponentMap[K]\n : never;\n\n/**\n * 组件名称到 Element Plus 组件的映射\n */\n// prettier-ignore\nexport const componentMap: BaseComponentMap = {\n 'input': Input,\n 'input-number': InputNumber,\n 'autocomplete': AutoComplete,\n 'select': Select,\n 'cascader': Cascader,\n 'date-picker': DatePicker,\n 'time-picker': TimePicker,\n 'time-select': TimeSelect,\n 'checkbox-group': CheckboxGroup,\n 'radio-group': RadioGroup,\n 'switch': Switch,\n 'slider': Slider,\n 'tree-select': TreeSelect,\n 'transfer': Transfer,\n}\n\n/**\n * 字段标识键序:el-form-item 的 prop 优先,path 兜底\n *\n * 与字段读写绑定、表单域标识、字段查找 API 共用同一解析入口\n */\nexport const ELEMENT_FIELD_IDENTITY_KEYS = ['prop', 'path'] as const;\n\n// inject keys\nexport { InjectionFormKey, InjectionFormSlotsKey } from '../../../shared/core';\n","import {\n useForm as coreUseForm,\n type Form as _Form,\n} from '../../../shared/core';\nimport type { Data, ExtendWithAny, DeepPartial } from '../../../shared/core';\nimport type { Field } from '../types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\nimport type { ComponentName } from '../constants';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单实例类型\n *\n * @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,\n * 将底层表单实例 I 绑定为 Element Plus 的 FormInstance,使 formRef 获得完整的类型提示。\n *\n * @template D - 表单数据类型\n * @template F - 字段配置类型,默认使用本地 Field 类型\n *\n * @property formData - 响应式表单数据对象,可直接读写,支持深层路径如 `formData.address.city`\n * @property getFormData - 获取指定路径的表单数据,支持点号分隔的深层路径,如 `getFormData('address.city')`\n * @property setFormData - 设置表单数据,支持四种调用方式:<br>\n * 1. `setFormData(path, value)` - 设置指定路径的值<br>\n * 2. `setFormData(path, prev => newVal)` - 函数式更新<br>\n * 3. `setFormData({ ... })` - 批量覆盖整个表单<br>\n * 4. `setFormData(prev => ({ ...prev, name: '新' }))` - 基于当前数据函数式批量更新\n * @property fields - 字段配置数组(响应式 Ref),ProForm 根据此数组渲染表单字段\n * @property getField - 获取字段配置,支持路径字符串(如 `'name'`)或查找函数(如 `f => f.label === '姓名'`)\n * @property setField - 更新字段配置,默认合并模式(Object.assign),可通过 `{ updateType: 'rewrite' }` 覆盖\n * @property deleteField - 删除字段配置,支持 `{ all: true }` 批量删除所有匹配项\n * @property appendField - 在指定字段后追加新字段,传 `undefined` 则在末尾追加\n * @property prependField - 在指定字段前插入新字段,传 `undefined` 则在开头插入\n * @property getParentField - 获取指定字段的父级字段配置,用于嵌套字段场景\n * @property formRef - 底层 Element Plus Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetFields()` 等方法\n * @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n * const form: Form<User> = useForm({ name: '张三', age: 25 })\n *\n * form.formData.name // 直接读写响应式数据\n * form.getFormData('name') // 通过路径读取\n * form.setFormData('name', '李四') // 更新数据\n * form.formRef.value?.validate() // 访问底层 Form 实例\n * ```\n *\n * @public\n */\nexport type Form<\n D extends Data = Data,\n F extends Field<ComponentName, D> = Field<ComponentName, D>,\n> = _Form<D, F, FormInstance>;\n\n/**\n * 创建表单实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 所有内置组件类型推导)\n * - 表单实例 -> Element Plus 的 `FormInstance`(使 formRef 获得完整的类型提示)\n *\n * 表单实例组合了三个子模块的能力:\n * - **useFormData**:表单数据管理(响应式数据、读写、批量更新)\n * - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)\n * - **useFormRef**:底层 Form 组件实例引用\n *\n * @template D - 表单数据类型\n *\n * @param {ExtendWithAny<DeepPartial<D>>} [initFormData] - 初始表单数据\n * @param {Field<ComponentName, D>[]} [initFields] - 初始字段配置数组\n * @param {boolean} [root=true] - 是否为根表单。设为 `false` 时尝试从父组件注入获取表单实例\n *\n * @returns {Form<D>} 表单实例,包含数据操作、字段操作和 ref 操作\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * // 方式一:同时传入初始数据和字段\n * const form = useForm<User>(\n * { name: '张三', age: 25 },\n * [\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ],\n * true\n * )\n *\n * // 方式二:仅设置 root 标识\n * const form = useForm<User>(true)\n *\n * // 使用\n * const { formData, formRef, fields, setFormData, getField } = form\n * setFormData('name', '李四')\n * await formRef.value?.validate()\n * ```\n *\n * @see {@link coreUseForm} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useForm<D extends Data = Data>(\n initFormData?: ExtendWithAny<DeepPartial<D>>,\n initFields?: Field<ComponentName, D>[],\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm<D extends Data = Data>(\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm(...args: any[]) {\n // root 单参重载不承载字段配置,标识键无适用对象\n if (args.length === 1 && typeof args[0] === 'boolean') {\n return coreUseForm(args[0]);\n }\n return coreUseForm(args[0], args[1], args[2], {\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n}\n","import type { Field } from '../../../types';\n\ntype LocaleT = (\n key: string,\n params?: Record<string, string | number>\n) => string;\n\n/** 单值组件的占位符对应的 locale key */\nconst PLACEHOLDER_KEYS: Record<string, string> = {\n input: 'input.placeholder',\n 'input.textarea': 'input.placeholder',\n 'input.password': 'input.placeholder',\n 'input-number': 'input.placeholder',\n autocomplete: 'input.placeholder',\n select: 'select.placeholder',\n cascader: 'select.placeholder',\n 'tree-select': 'select.placeholder',\n 'date-picker': 'date-picker.placeholder',\n 'date-picker.date': 'date-picker.placeholder',\n 'date-picker.dates': 'date-picker.placeholder',\n 'date-picker.week': 'date-picker.placeholder',\n 'date-picker.month': 'date-picker.placeholder',\n 'date-picker.months': 'date-picker.placeholder',\n 'date-picker.quarter': 'date-picker.placeholder',\n 'date-picker.quarters': 'date-picker.placeholder',\n 'date-picker.year': 'date-picker.placeholder',\n 'date-picker.years': 'date-picker.placeholder',\n 'date-picker.datetime': 'date-picker.placeholder',\n 'time-picker': 'date-picker.placeholder',\n 'time-select': 'date-picker.placeholder',\n};\n\n/** 区间组件 start/end 占位符对应的 locale key */\nconst RANGE_PLACEHOLDER_KEYS: Record<string, [string, string]> = {\n 'date-picker.daterange': ['date-picker.start', 'date-picker.end'],\n 'date-picker.monthrange': ['date-picker.startMonth', 'date-picker.endMonth'],\n 'date-picker.yearrange': ['date-picker.startYear', 'date-picker.endYear'],\n 'date-picker.quarterrange': ['date-picker.start', 'date-picker.end'],\n 'date-picker.datetimerange': ['date-picker.startTime', 'date-picker.endTime'],\n};\n\n/** 根据组件 key 兜底生成 locale 占位符;已显式设置占位符(componentVars 或字段属性)时不兜底 */\nconst getPlaceholderProps = (\n key: string,\n injectProps: Record<string, any>,\n t: LocaleT\n): Record<string, string> => {\n const rangeKeys = RANGE_PLACEHOLDER_KEYS[key];\n if (rangeKeys) {\n if (\n injectProps.startPlaceholder !== undefined ||\n injectProps.placeholder !== undefined\n )\n return {};\n return {\n startPlaceholder: t(rangeKeys[0]),\n endPlaceholder: t(rangeKeys[1]),\n };\n }\n const placeholderKey = PLACEHOLDER_KEYS[key];\n if (!placeholderKey || injectProps.placeholder !== undefined) return {};\n return { placeholder: t(placeholderKey) };\n};\n\n/**\n * 组件初始属性:以内置默认值为底,按下发组件名补默认占位符文案\n *\n * @description 组件名由 `component` 与 `type` 拼接(如 `input.password`);`component` 非字符串时返回空记录。\n * @param {Field} field - 字段配置\n * @param {Record<string, any>} injectProps - Provider 下发的组件默认属性\n * @param {LocaleT} t - 取文案的翻译函数\n * @returns {Record<string, any>} 组件初始属性(键值均来自注入配置与默认文案)\n */\nexport const getInitProps = (\n field: Field,\n injectProps: Record<string, any> = {},\n t: LocaleT\n): Record<string, any> => {\n const { component, type } = field as any;\n if (typeof component === 'string') {\n const k = [component, type].filter(Boolean).join('.');\n return { ...injectProps, ...getPlaceholderProps(k, injectProps, t) };\n }\n return {};\n};\n\n/** 已告警过的未知组件名(模块级去重集合) */\nconst warnedUnknownComponents = new Set<string>();\n\n/**\n * 未识别组件名的降级告警\n *\n * @description 同一组件名仅告警一次,提示注册 componentMap 或 ProComponentProvider。\n * @param {string} name - 未识别的组件类型名\n */\nexport function warnUnknownComponent(name: string) {\n if (warnedUnknownComponents.has(name)) return;\n warnedUnknownComponents.add(name);\n console.warn(\n `[pro-components] 未识别的组件类型 \"${name}\",已降级为原生元素渲染。如为自定义组件请在 componentMap 或 ProComponentProvider 中注册。`\n );\n}\n","/**\n * 归一化禁用值\n *\n * @description 字符串形态与宿主 Boolean prop 一致:`''` 与 `disabled` 为 true,其余取真值\n * @param value - 原始禁用值\n * @returns 归一化后的布尔值\n */\nexport const normalizeDisabled = (value: unknown) =>\n value === '' || value === 'disabled' ? true : Boolean(value);\n\n/**\n * 解析显式声明的禁用值\n *\n * @description `undefined` / `null` 为未声明,返回 `undefined`;其余返回归一化结果\n * @param value - 原始禁用值\n * @returns 显式禁用值;未声明时为 `undefined`\n */\nexport const resolveDisabled = (value: unknown): boolean | undefined =>\n value === undefined || value === null ? undefined : normalizeDisabled(value);\n\n/**\n * 解析控件最终生效的禁用状态\n *\n * @description 字段显式声明(含 `false`)优先;未声明时继承外层禁用,外层为真即禁用;\n * 外层未禁用时回退 Provider 注入的组件级默认值\n * @param explicit - 字段显式声明的禁用值\n * @param inherited - 外层禁用上下文取值\n * @param fallback - Provider 注入的组件级默认禁用值\n * @returns 最终生效的禁用状态\n */\nexport const resolveEffectiveDisabled = (\n explicit: unknown,\n inherited: unknown,\n fallback: unknown\n): boolean =>\n resolveDisabled(explicit) ??\n (normalizeDisabled(inherited) || normalizeDisabled(fallback));\n","/**\n * element-plus-pro 语言包(简体中文)\n *\n * @description 在 core 通用语言包基础上,扩展 element-plus 特有的\n * 日期/时间组件占位符文案。\n */\nimport { zhCN } from '../shared/core';\n\nexport default {\n ...zhCN,\n // 日期/时间选择器占位符(对应 INJECT_CONFIG 中 date-picker.* 的占位默认值)\n 'date-picker.placeholder': '请选择',\n 'date-picker.start': '开始日期',\n 'date-picker.end': '结束日期',\n 'date-picker.startMonth': '开始月份',\n 'date-picker.endMonth': '结束月份',\n 'date-picker.startYear': '开始年份',\n 'date-picker.endYear': '结束年份',\n 'date-picker.startTime': '开始时间',\n 'date-picker.endTime': '结束时间',\n} as const;\n","/**\n * element-plus-pro 语言包(繁體中文)\n *\n * @description 在 core 通用語言包基礎上,擴展 element-plus 特有的\n * 日期/時間元件佔位符文案。\n */\nimport { zhTW } from '../shared/core';\n\nexport default {\n ...zhTW,\n // 日期/時間選擇器佔位符(對應 INJECT_CONFIG 中 date-picker.* 的佔位預設值)\n 'date-picker.placeholder': '請選擇',\n 'date-picker.start': '開始日期',\n 'date-picker.end': '結束日期',\n 'date-picker.startMonth': '開始月份',\n 'date-picker.endMonth': '結束月份',\n 'date-picker.startYear': '開始年份',\n 'date-picker.endYear': '結束年份',\n 'date-picker.startTime': '開始時間',\n 'date-picker.endTime': '結束時間',\n} as const;\n","/**\n * element-plus-pro language pack (English)\n *\n * @description Extends the core language pack with element-plus specific\n * date/time picker placeholder texts.\n */\nimport { enUS } from '../shared/core';\n\nexport default {\n ...enUS,\n // Date/time picker placeholders (defaults of date-picker.* in INJECT_CONFIG)\n 'date-picker.placeholder': 'Please select',\n 'date-picker.start': 'Start date',\n 'date-picker.end': 'End date',\n 'date-picker.startMonth': 'Start month',\n 'date-picker.endMonth': 'End month',\n 'date-picker.startYear': 'Start year',\n 'date-picker.endYear': 'End year',\n 'date-picker.startTime': 'Start time',\n 'date-picker.endTime': 'End time',\n} as const;\n","/**\n * element-plus-pro locale 模块\n *\n * @description 提供 useLocale 组合式函数与语言包。\n * 语言自动跟随宿主应用的 element-plus `el-config-provider` locale 切换,\n * 也可通过 ProComponentProvider 的 `locale` prop 覆盖任意文案。\n */\nimport {\n computed,\n inject,\n toValue,\n type InjectionKey,\n type MaybeRef,\n} from 'vue';\nimport { useLocale as useElLocale, localeContextKey } from 'element-plus';\nimport { format, resolveLocaleName, type ProLocaleName } from '../shared/core';\nimport zhCN from './zh-CN';\nimport zhTW from './zh-TW';\nimport enUS from './en-US';\n\nexport { zhCN, zhTW, enUS };\n\n/** 内置文案类型:键集合与 zh-CN 对齐,取值允许任意文案覆盖 */\nexport type ProLocale = Record<keyof typeof zhCN, string>;\n\n/** ProComponentProvider 通过该 key 注入局部覆盖文案 */\nexport const LOCALE_INJECT_KEY: InjectionKey<\n MaybeRef<Partial<ProLocale> | undefined>\n> = Symbol('pro-locale');\n\n/**\n * 获取响应式 locale 文案\n *\n * @description 返回 `t` 翻译函数与当前语言名。\n * `t` 在 computed / 模板中调用时会随宿主语言切换自动更新。\n *\n * @returns\n * - `t(key, params?)` - 翻译函数,支持 `{placeholder}` 参数\n * - `lang` - 当前解析出的语言名('zh-CN' | 'zh-TW' | 'en-US')\n *\n * @example\n * ```ts\n * const { t } = useLocale();\n * t('table.query') // '查询' / '查詢' / 'Search'\n * t('pagination.total', { total: 100 }) // '共 100 条'\n * ```\n */\nexport const useLocale = () => {\n const elLocaleContext = inject(localeContextKey, undefined);\n const { lang: elLang } = useElLocale();\n const override = inject(LOCALE_INJECT_KEY, undefined);\n\n const lang = computed<ProLocaleName>(() => {\n // 注入上下文为 computed/ref 包装,按取值本体判定宿主是否提供语言\n if (toValue(elLocaleContext) == null) return 'zh-CN';\n return resolveLocaleName(elLang.value);\n });\n const pack = computed<Record<string, string>>(() =>\n lang.value === 'zh-TW' ? zhTW : lang.value === 'en-US' ? enUS : zhCN\n );\n\n const t = (key: string, params?: Record<string, string | number>): string => {\n const overrides = toValue(override) as Record<string, string> | undefined;\n const text =\n overrides?.[key] ?? (pack.value as Record<string, string>)[key] ?? key;\n return format(text, params);\n };\n\n return { t, lang };\n};\n","<script lang=\"ts\" setup>\n/**\n * 字段级渲染组件\n *\n * @component BaseField\n * @description 负责将 field 配置渲染为实际的输入组件\n *\n * ## 核心职责\n *\n * 1. **组件解析**:按优先级解析要渲染的组件(teleport 插槽 > 自定义组件 > 内置组件映射 > 原始值)\n * 2. **v-model 双向绑定**:通过 computed getter/setter 将组件值与 formData 的深层路径绑定\n * 3. **valueFormatter 处理**:支持 get/set 格式化函数,用于数据转换(如日期格式化)\n * 4. **属性合并**:将注入的默认 props、组件传入的 attrs 合并为最终属性\n *\n * ## 组件解析优先级\n *\n * ```\n * teleport 组件(ProForm 插槽注入)\n * ↓ 未匹配\n * 自定义组件(ProComponentProvider 的 componentMap)\n * ↓ 未匹配\n * 内置组件映射(componentMap: input → Input, select → Select ...)\n * ↓ 未匹配\n * 原始 component 值(可能是字符串或 Vue 组件对象)\n * ```\n *\n * @param {string | Component} [component] - 组件名或组件对象\n * @param {string} [path] - 字段路径,用于绑定表单数据\n *\n * @slot default - 默认插槽(透传给组件)\n */\nimport {\n type Component,\n computed,\n inject,\n mergeProps,\n ref,\n toValue,\n} from 'vue';\nimport {\n cloneDeep,\n getObject,\n useReactiveAttrs,\n} from '../../../../shared/core';\nimport { useDisabledContext } from '../../../../shared/ui';\nimport type { Field } from '../../types';\nimport ContainerFragment from '../ContainerFragment/index.vue';\nimport SlotComponent from '../SlotComponent/index.vue';\nimport { componentMap, InjectionFormSlotsKey } from '../../constants';\nimport {\n INJECT_COMPONENT_VARS,\n INJECT_COMPONENTS,\n getInjectConfig,\n} from '../../../component-provider/constants';\nimport { useForm } from '../../hooks/useForm';\nimport { getInitProps, warnUnknownComponent } from './utils';\nimport { resolveEffectiveDisabled } from '../../utils/disabled';\nimport { useLocale } from '../../../../locale';\n\nconst cloneDeepIfObject = (val: unknown) =>\n // 原始值直接传递,引用值克隆快照\n typeof val === 'object' && val !== null ? cloneDeep(val) : val;\n\ndefineOptions({ name: 'BaseField', inheritAttrs: false });\n\ntype Props = {\n component?: string | Component;\n path?: string;\n};\nconst props = withDefaults(defineProps<Props>(), {\n component: undefined,\n path: '',\n});\n\nconst { t } = useLocale();\n\nconst form = useForm(false);\n\nconst componentRef = ref<any>();\n\nconst attrs: any = useReactiveAttrs();\n\n/**\n * 全局默认配置注入:key = 组件名 + type 修饰段,inject 须在 setup 同步期调用。\n * 组件名与 `type` 仅取 setup 期初始值——运行期变更不会切换 Provider 的默认值预设\n * (`date-picker.month` 等子类型预设需在初始渲染前确定)。\n */\nconst typeVal = attrs.type;\nconst injectConfigKey =\n typeof props.component === 'string'\n ? [props.component, typeVal].filter(Boolean).join('.')\n : '';\nconst componentInjectConfig = injectConfigKey\n ? getInjectConfig(injectConfigKey)\n : undefined;\nconst rawInjectComponentProps = componentInjectConfig\n ? inject(componentInjectConfig.injectionKey, componentInjectConfig.default)\n : undefined;\n// 全量 componentVars:运行期新增的自定义组件键由此兜底读取\nconst componentVars = inject(INJECT_COMPONENT_VARS, undefined);\n\n// setter: 向 formData 写入值,支持 valueFormatter / valueFormatter.set 转换\nconst value = computed({\n get() {\n let val = form.getFormData?.(props.path);\n const { valueFormatter } = groupedAttrs.value;\n if (\n typeof valueFormatter === 'object' &&\n typeof valueFormatter.get === 'function'\n ) {\n val = valueFormatter.get(val);\n }\n return val;\n },\n set(val) {\n let newVal = val;\n const { valueFormatter } = groupedAttrs.value;\n const setFormatter =\n typeof valueFormatter === 'function'\n ? valueFormatter\n : typeof valueFormatter === 'object' &&\n typeof valueFormatter?.set === 'function'\n ? valueFormatter.set\n : undefined;\n\n if (setFormatter) {\n // 仅当 set 转换函数需要旧值参数时,才获取旧值上下文\n const oldVal =\n setFormatter.length > 1\n ? cloneDeepIfObject(form.getFormData?.(props.path))\n : undefined;\n newVal = setFormatter(val, oldVal);\n }\n form.setFormData?.(props.path, newVal);\n // 字段配置/attrs 传入的 onUpdate:* 监听器与内部写值组合回放,参数为组件原始 emit 值\n const { onUpdateValue } = groupedAttrs.value;\n if (typeof onUpdateValue === 'function') {\n onUpdateValue(val);\n } else if (Array.isArray(onUpdateValue)) {\n onUpdateValue.forEach(listener => listener(val));\n }\n },\n});\n\nconst parentDisabled = useDisabledContext();\n\n/*\n * 将注入的默认 props、外部传入的 attrs、field 配置合并为最终属性\n * 属性分为三类:绑定属性(v-model)、组件属性(传递给组件)、插槽(动态渲染)\n */\nconst groupedAttrs = computed(() => {\n const currentInjectProps = {\n ...(toValue(rawInjectComponentProps) || {}),\n ...getObject(toValue(componentVars)?.[injectConfigKey]),\n };\n const initProps = getInitProps(\n {\n component: props.component,\n type: attrs.type,\n } as unknown as Field,\n currentInjectProps,\n t\n );\n const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';\n const effectiveDisabled = resolveEffectiveDisabled(\n attrs.disabled,\n parentDisabled.value,\n initProps.disabled\n );\n const mergedProps = mergeProps(\n initProps,\n attrs,\n { class: attrs.componentClass, style: attrs.componentStyle },\n { disabled: effectiveDisabled },\n { modelProp: modelPropName }\n ) as Required<Field>;\n\n // prettier-ignore\n const { valueFormatter, modelProp, slots, componentClass, componentStyle, componentContainer, [modelPropName]: _modelVal, [`onUpdate:${modelPropName}`]: onUpdateValue, ...bindAttrs } = mergedProps as any;\n\n return {\n attrs: bindAttrs,\n slots,\n componentContainer,\n modelProp: modelPropName,\n valueFormatter,\n onUpdateValue,\n };\n});\n\n// 从 ProForm 插槽注入的 slots 集合(优先级最高)\nconst injectedFormSlots = inject(InjectionFormSlotsKey, undefined);\n\n// 从 ProComponentProvider 注入的自定义组件映射\nconst customComponents = inject(INJECT_COMPONENTS, {});\n\n/*\n * 按优先级解析最终要渲染的组件:\n * ProForm 插槽 → 自定义组件映射 → 内置组件映射 → 原始 component 值\n */\nconst is = computed(() => {\n const teleportSlot = props.path && injectedFormSlots?.value?.[props.path];\n if (teleportSlot) return teleportSlot;\n if (typeof props.component === 'string') {\n const resolved =\n toValue(customComponents as any)?.[props.component] ||\n (componentMap as any)[props.component];\n if (resolved) return resolved;\n warnUnknownComponent(props.component);\n return props.component;\n }\n return props.component;\n});\n\ndefineExpose({\n getComponentRef: () => componentRef.value,\n getComponentComputedProps: () => groupedAttrs.value.attrs as any,\n});\n</script>\n\n<template>\n <ContainerFragment\n :component=\"groupedAttrs.componentContainer\"\n :path=\"props.path\"\n >\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\n :path=\"props.path\"\n >\n <template\n v-for=\"(slot, name) in groupedAttrs.slots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent :path=\"props.path\" v-bind=\"scoped\" :component=\"slot\" />\n </template>\n </component>\n </ContainerFragment>\n</template>\n","import {\n computed,\n inject,\n mergeProps,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from 'vue';\nimport {\n formItemProps,\n gridItemProps,\n type FormItemProps,\n type GridItemProps,\n} from '../../../shared/ui';\nimport { isPlainObject, resolveFieldIdentity } from '../../../shared/core';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport { ELEMENT_FIELD_IDENTITY_KEYS, FORM_ITEM_SLOT_KEYS } from '../constants';\nimport type { Base, Field } from '../types';\n\nconst formItemPropKeys = Object.keys(formItemProps());\nconst gridItemPropKeys = Object.keys(gridItemProps());\nconst gridItemPropKeySet = new Set<string>(gridItemPropKeys);\nconst formItemPropKeySet = new Set<string>(formItemPropKeys);\nconst formItemSlotKeySet = new Set<string>(FORM_ITEM_SLOT_KEYS);\n\n/** 单个字段的分组结果:栅格 / FormItem / 组件属性与插槽 */\nexport interface GroupedField {\n path: string;\n gridItemProps: GridItemProps;\n formItemProps: FormItemProps;\n formItemSlots: Record<(typeof FORM_ITEM_SLOT_KEYS)[number], any>;\n componentProps: Record<string, any>;\n container?: Base['formItemContainer'];\n rawField: Field;\n}\n\n/** 将单个字段配置拆分为 grid / formItem / component / slots 分组 */\nconst groupField = (\n field: Field,\n rawInjectProps: Record<string, any>\n): GroupedField => {\n let gridItemProps: Record<string, any> = {};\n let formItemProps: Record<string, any> = {};\n const componentProps: Record<string, any> = { slots: {} };\n const formItemSlots: Record<string, any> = {};\n\n if (isPlainObject(field)) {\n // prettier-ignore\n const { path: _path, prop: _prop, fields, formItemClass, formItemStyle, formItemContainer, hidden, span, getFormItemRef, getComponentRef, getFormItemComputedProps, getComponentComputedProps, slots = {}, formItemDataAttrs = {}, componentDataAttrs = {}, extraProps, ...rest } =\n field as any;\n\n // prettier-ignore\n const { class: injectClassName, style: injectStyle, span: injectSpan, formItemContainer: injectFormItemContainer, xs, sm, md, lg, xl, ...injectRest } = rawInjectProps;\n\n /*\n * 字段显式指定 span 时整体接管栅格,不再叠加注入的响应式断点;\n * 未指定 span 时使用注入的断点配置\n */\n const initGridItemProps =\n span || span === 0 ? { span } : { xs, sm, md, lg, xl, span: injectSpan };\n\n // 分组字段未指定 span 时整行渲染(span 兜底 24),注入的响应式断点保持生效\n gridItemProps = fields\n ? { ...initGridItemProps, span: span ?? 24 }\n : initGridItemProps;\n formItemProps = mergeProps(\n injectRest as any,\n { class: injectClassName, style: injectStyle },\n { class: toValue(formItemClass), style: toValue(formItemStyle) },\n formItemDataAttrs\n );\n // 字段级容器优先,回退注入级配置\n const container = formItemContainer ?? injectFormItemContainer;\n\n Object.keys(rest).forEach(k => {\n if (gridItemPropKeySet.has(k)) {\n gridItemProps[k] = rest[k];\n } else if (formItemPropKeySet.has(k)) {\n (formItemProps as any)[k] = rest[k];\n } else {\n componentProps[k] = rest[k];\n }\n });\n\n Object.assign(componentProps, componentDataAttrs);\n Object.keys(slots).forEach(k => {\n if (formItemSlotKeySet.has(k)) {\n formItemSlots[k] = slots[k];\n } else {\n componentProps.slots[k] = slots[k];\n }\n });\n\n // 字段标识经统一解析(prop 优先,path 兜底);name 作为控件自身属性经 rest 透传\n return {\n path: resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS),\n gridItemProps: gridItemProps as GridItemProps,\n formItemProps: formItemProps as any,\n formItemSlots,\n componentProps,\n container,\n rawField: field,\n };\n }\n\n return {\n path: resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS),\n gridItemProps: gridItemProps as GridItemProps,\n formItemProps: formItemProps as any,\n formItemSlots,\n componentProps,\n rawField: field,\n };\n};\n\n/**\n * 将 fields 配置数组逐个拆分为 grid / formItem / component / slots 分组。\n *\n * @description\n * 1. 响应式集成 ProComponentProvider 的 `pro-form-item` 全局变量配置;\n * 2. 剥离 `extraProps`(用户自定义字段标识袋):保留在字段原始对象上供业务层存取,渲染层经解构剥离,不落入 componentProps 透传。\n *\n * @param {ComputedRef<Field[]>} validFields - 已过滤的字段配置数组\n * @returns {ComputedRef<GroupedField[]>} 分组后的字段属性数组\n */\nexport function useGroupFieldAttrs(validFields: ComputedRef<Field[]>) {\n const config = INJECT_CONFIG['pro-form-item'];\n const injectFormItemProps = inject(config.injectionKey, config.default);\n\n return computed<GroupedField[]>(() => {\n const rawInjectProps = toValue(injectFormItemProps) || {};\n return validFields.value.map(field => groupField(field, rawInjectProps));\n });\n}\n\n/**\n * 将单个字段配置拆分为 grid / formItem / component / slots 分组\n *\n * @description 拆分规则与 `useGroupFieldAttrs` 一致,结果依赖该字段自身配置与 Provider 的 `pro-form-item` 默认值。\n *\n * @param {MaybeRefOrGetter<Field>} field - 待拆分的字段配置\n * @returns {ComputedRef<GroupedField>} 单字段渲染分组\n */\nexport function useGroupedField(field: MaybeRefOrGetter<Field>) {\n const config = INJECT_CONFIG['pro-form-item'];\n const injectFormItemProps = inject(config.injectionKey, config.default);\n\n return computed<GroupedField>(() =>\n groupField(toValue(field), toValue(injectFormItemProps) || {})\n );\n}\n","<script lang=\"ts\">\n/**\n * 单字段行渲染组件\n *\n * @component BaseFormItem\n *\n * 将单个字段配置渲染为栅格项、FormItem 与控件,支持:\n * - 字段属性分流(grid / formItem / component / slots)\n * - 嵌套字段递归渲染(交由 BaseFormItems)\n * - FormItem / 控件实例登记\n *\n * @param {Field} field - 字段配置\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 上层下发的禁用状态\n * @param {Function} [setFormItemRef] - FormItem 实例登记回调\n * @param {Function} [setComponentRef] - 控件实例登记回调\n *\n * @internal\n */\nimport {\n computed,\n defineComponent,\n h,\n toValue,\n watch,\n type PropType,\n type VNode,\n} from 'vue';\nimport { normalizePathKey } from '../../../../shared/core';\nimport { FormItem, GridItem as ElGridItem } from '../../../../shared/ui';\nimport type { Field, Grid } from '../../types';\nimport BaseField from '../BaseField/index.vue';\nimport BaseFormItems from '../BaseFormItems/index.vue';\nimport SlotComponent from '../SlotComponent/index.vue';\nimport {\n useGroupedField,\n type GroupedField,\n} from '../../hooks/useGroupFieldAttrs';\n\nexport default defineComponent({\n name: 'BaseFormItem',\n inheritAttrs: false,\n props: {\n /** 字段配置 */\n field: { type: Object as PropType<Field>, required: true },\n /** 是否启用网格布局 */\n grid: {\n type: [Boolean, Object] as PropType<Grid>,\n default: undefined,\n },\n /** 上层下发的禁用状态 */\n disabled: { type: Boolean, default: undefined },\n /** FormItem 实例登记回调 */\n setFormItemRef: {\n type: Function as PropType<\n (field: Field, el: any, getFormItemProps: () => any) => void\n >,\n default: undefined,\n },\n /** 控件实例登记回调 */\n setComponentRef: {\n type: Function as PropType<(field: Field, el: any) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const grouped = useGroupedField(() => props.field);\n const enableGrid = computed(() => !!props.grid);\n\n // 控件级配置身份:字符串组件名 + type 段;组件对象无 Provider 配置,使用固定值\n const componentKey = computed(() => {\n const field = props.field as any;\n const component = toValue(field.component);\n if (typeof component !== 'string') return 'component-object';\n return `string:${component}:${toValue(field.type) ?? ''}`;\n });\n const effectiveDisabled = computed(\n () => toValue(props.field.disabled) ?? props.disabled\n );\n\n const setItemRef = (el: any) => {\n props.setFormItemRef?.(\n props.field,\n el,\n () => grouped.value.formItemProps\n );\n };\n\n const setFieldRef = (el: any) => {\n props.setComponentRef?.(props.field, el);\n };\n\n // 字段对象变化后,实例访问器归属当前字段\n watch(\n () => props.field,\n (next, prev) => {\n if (!prev || prev === next) return;\n props.setFormItemRef?.(prev, null, () => grouped.value.formItemProps);\n props.setComponentRef?.(prev, null);\n },\n { flush: 'pre' }\n );\n\n /** 按容器组件逐层包裹当前节点 */\n const withContainer = (\n node: VNode,\n component: any,\n containerProps: Record<string, any>\n ): VNode =>\n component ? h(component, containerProps, { default: () => node }) : node;\n\n /** 组装 FormItem 的动态插槽与默认插槽 */\n const renderFormItemSlots = (groupedField: GroupedField) => {\n const slots: Record<string, any> = {};\n Object.entries(groupedField.formItemSlots).forEach(([name, slot]) => {\n slots[name] = (scope?: Record<string, any>) =>\n h(SlotComponent as any, {\n path: groupedField.path,\n component: slot,\n ...(scope || {}),\n });\n });\n\n slots.default = () => {\n const field = props.field as any;\n if (field.fields) {\n return h(BaseFormItems as any, {\n grid: field.grid ?? props.grid,\n fields: field.fields,\n disabled: effectiveDisabled.value,\n });\n }\n return h(BaseField as any, {\n key: componentKey.value,\n ref: setFieldRef,\n ...groupedField.componentProps,\n path: groupedField.path,\n disabled: effectiveDisabled.value,\n });\n };\n return slots;\n };\n\n return () => {\n const groupedField = grouped.value;\n let node: VNode = h(\n FormItem as any,\n {\n ...groupedField.formItemProps,\n ref: setItemRef,\n prop: normalizePathKey(groupedField.path),\n path: groupedField.path,\n },\n renderFormItemSlots(groupedField)\n );\n node = withContainer(node, groupedField.container, {\n path: groupedField.path,\n });\n node = withContainer(\n node,\n enableGrid.value ? ElGridItem : undefined,\n groupedField.gridItemProps\n );\n return node;\n };\n },\n});\n</script>\n\n<style scoped lang=\"less\">\n/* 分组字段的嵌套 FormItem 间距 */\n[class*='-form-item'] [class*='-form-item'] {\n margin-bottom: 18px;\n}\n</style>\n","import { toRaw } from 'vue';\nimport { resolveFieldIdentity, toPath } from '../../../shared/core';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\n\nconst fieldKeyMap = new WeakMap<object, number>();\nlet fieldKeySeed = 0;\n\n/**\n * 字段渲染 key\n *\n * @description 以 `toRaw(field)` 为键在模块级 WeakMap 中缓存自增编号,同一字段对象恒得同一 key:\n * key 与字段在数组中的位置解耦,字段插入 / 删除 / 重排 / 过滤后仍与对象绑定;同 `path` 的兄弟字段各得其唯一 key。\n * 非对象项无对象身份,按字面量生成稳定 key;渲染路径传入的字段项已由调用方过滤为非 null 对象,\n * 该分支供本模块的直接调用者使用\n *\n * @param field - 字段配置项\n * @returns 字段渲染 key\n */\nexport const getFieldKey = (field: unknown): string | number => {\n if (field === null || typeof field !== 'object')\n return `raw_${String(field)}`;\n const raw = toRaw(field);\n let key = fieldKeyMap.get(raw);\n if (key === undefined) {\n key = ++fieldKeySeed;\n fieldKeyMap.set(raw, key);\n }\n return key;\n};\n\n/** 数据行对象身份编号 */\nconst rowKeyMap = new WeakMap<object, number>();\nlet rowKeySeed = 0;\n\nconst getRowKey = (row: object) => {\n const raw = toRaw(row);\n let key = rowKeyMap.get(raw);\n if (key === undefined) {\n key = ++rowKeySeed;\n rowKeyMap.set(raw, key);\n }\n return key;\n};\n\n/** 数组下标段判定:仅十进制非负整数段按数组下标处理 */\nconst isIndexSegment = (segment: string) => /^(?:0|[1-9]\\d*)$/.test(segment);\n\n/**\n * 字段的数据行渲染 key\n *\n * @description 沿字段路径逐段解析原始表单数据,取路径经过的对象数组行元素身份与行内剩余路径组成 key;\n * 同一数据行对象在数组增删 / 重排后恒得同一 key。路径不经过对象数组行、行元素为原始值或数据缺失时,\n * 回退到 {@link getFieldKey} 的字段对象身份。同 key 的去重由调用方按兄弟列表收敛。\n *\n * @param field - 字段配置项\n * @param rawFormData - 原始表单数据(非响应式对象)\n * @returns 数据行 key;无法定位数据行时返回字段对象身份 key\n */\nexport const getFieldDataKey = (\n field: unknown,\n rawFormData: unknown\n): string | number => {\n const path = resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS);\n if (!path || rawFormData === null || rawFormData === undefined) {\n return getFieldKey(field);\n }\n\n const segments = toPath(path);\n let node: any = rawFormData;\n const rowIds: number[] = [];\n let lastRowIndex = -1;\n\n for (let i = 0; i < segments.length; i++) {\n if (Array.isArray(node)) {\n const segment = segments[i];\n if (!isIndexSegment(segment)) break;\n const element = node[Number(segment)];\n if (element === null || typeof element !== 'object') break;\n rowIds.push(getRowKey(toRaw(element) as object));\n lastRowIndex = i;\n node = element;\n continue;\n }\n if (node === null || typeof node !== 'object') break;\n node = node[segments[i]];\n }\n\n if (lastRowIndex === -1) return getFieldKey(field);\n const rest = segments.slice(lastRowIndex + 1).join('.');\n return `data:${rowIds.join('/')}:${rest}`;\n};\n","<script lang=\"ts\" setup>\n/**\n * 表单字段渲染引擎\n *\n * @component BaseFormItems\n *\n * 负责将字段配置数组渲染为实际的表单项,支持:\n * - 字段分组(嵌套 fields 递归渲染,嵌套字段 path 须为完整点分路径)\n * - 网格布局(grid 属性控制)\n * - FormItem 包装(label、rules、校验等)\n * - 组件绑定(通过 BaseField 渲染具体组件)\n * - 插槽透传(label、error 等 FormItem 插槽)\n *\n * ## 渲染流程\n *\n * 1. 遍历 fields 数组,过滤 hidden 字段\n * 2. 每个字段交由 BaseFormItem 拆分为 GridItem / FormItem / 组件 / 插槽并渲染\n * 3. 嵌套 fields 递归渲染下一层 BaseFormItems\n * 4. 渲染后字段对象上可读取 FormItem 与组件实例\n *\n * @param {Fields} [fields] - 字段配置数组\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 是否禁用所有子字段\n *\n * @internal\n */\nimport {\n InjectionFormKey,\n getObject,\n isObjectItem,\n} from '../../../../shared/core';\nimport type { GridProps } from '../../../../shared/ui';\nimport { Grid as ElGrid, useProviderDisabled } from '../../../../shared/ui';\nimport { computed, inject, toRaw, toValue } from 'vue';\nimport type { Fields, Grid } from '../../types';\nimport BaseFormItem from '../BaseFormItem/index.vue';\nimport { getFieldDataKey } from '../../utils/fieldKey';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\n\ndefineOptions({ name: 'BaseFormItems', inheritAttrs: false });\n\ntype Props = {\n grid?: Grid;\n fields?: Fields;\n disabled?: boolean;\n};\nconst props = withDefaults(defineProps<Props>(), {\n grid: undefined,\n fields: () => [],\n disabled: undefined,\n});\n\n// 分组字段的禁用状态向下注入,供 BaseField 经禁用上下文消费\nuseProviderDisabled(computed(() => props.disabled));\n\nconst validFields = computed(() =>\n // hidden 支持 Ref / ComputedRef 响应式形态(统一使用 toValue 取值)\n (props.fields ?? []).filter(\n field => isObjectItem(field) && !toValue((field as any).hidden)\n )\n);\n\n// 数组行按数据对象身份派生 key,字段配置重建后行实例保持复用\nconst injectedForm = inject(InjectionFormKey, undefined) as any;\nconst renderedFields = computed(() => {\n const rawFormData = injectedForm?.formData\n ? toRaw(injectedForm.formData)\n : undefined;\n const seen = new Map<string | number, number>();\n return validFields.value.map(field => {\n const baseKey = getFieldDataKey(field, rawFormData);\n const count = seen.get(baseKey) ?? 0;\n seen.set(baseKey, count + 1);\n return {\n field,\n key: count === 0 ? baseKey : `${String(baseKey)}#${count}`,\n };\n });\n});\n\nconst config = INJECT_CONFIG['pro-form'];\nconst injectFormConfig = inject(config.injectionKey, config.default);\nconst injectGrid = computed(() => toValue(injectFormConfig)?.grid);\n\nconst enableGrid = computed(() => !!props.grid);\n\nconst computedGridProps = computed<GridProps>(() => {\n return enableGrid.value\n ? { ...getObject(injectGrid.value), ...getObject(props.grid) }\n : {};\n});\n\n/**\n * 以字段原始对象为 key 登记 FormItem / 控件实例,供 getFormItemRef / getComponentRef 读取;\n * 字段对象被回收后对应条目不再可读。\n */\nconst formItemInstanceMap = new WeakMap<object, any>();\nconst componentInstanceMap = new WeakMap<object, any>();\n\n/** 已告警过的字段对象(不可写场景去重) */\nconst warnedFrozenFields = new WeakSet<object>();\nconst defineFieldAccessors = (\n raw: object,\n accessors: Record<string, () => any>\n) => {\n try {\n for (const [key, getter] of Object.entries(accessors)) {\n // 访问器仅用于字段对象读取,不参与属性遍历与字段配置透传\n Object.defineProperty(raw, key, {\n value: getter,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n } catch {\n if (!warnedFrozenFields.has(raw)) {\n warnedFrozenFields.add(raw);\n console.warn(\n '[pro-components] 字段配置对象不可写(如被 Object.freeze),getFormItemRef / getComponentRef 等实例访问器挂载失败。'\n );\n }\n }\n};\n\nconst setFormItemRef = (field: any, el: any, getFormItemProps: () => any) => {\n if (!field || typeof field !== 'object') return;\n const raw = toRaw(field);\n if (el) {\n formItemInstanceMap.set(raw, el);\n defineFieldAccessors(raw, {\n getFormItemRef: () => formItemInstanceMap.get(raw),\n getFormItemComputedProps: getFormItemProps,\n });\n } else {\n formItemInstanceMap.delete(raw);\n delete raw.getFormItemRef;\n delete raw.getFormItemComputedProps;\n }\n};\n\nconst setComponentRef = (field: any, el: any) => {\n if (!field || typeof field !== 'object') return;\n const raw = toRaw(field);\n if (el) {\n componentInstanceMap.set(raw, el);\n defineFieldAccessors(raw, {\n getComponentRef: () => componentInstanceMap.get(raw)?.getComponentRef(),\n getComponentComputedProps: () =>\n componentInstanceMap.get(raw)?.getComponentComputedProps(),\n });\n } else {\n componentInstanceMap.delete(raw);\n delete raw.getComponentRef;\n delete raw.getComponentComputedProps;\n }\n};\n</script>\n\n<template>\n <ElGrid v-if=\"enableGrid\" v-bind=\"computedGridProps\" style=\"width: 100%\">\n <BaseFormItem\n v-for=\"item of renderedFields\"\n :key=\"item.key\"\n :field=\"item.field\"\n :grid=\"props.grid\"\n :disabled=\"props.disabled\"\n :set-form-item-ref=\"setFormItemRef\"\n :set-component-ref=\"setComponentRef\"\n />\n </ElGrid>\n <template v-else>\n <BaseFormItem\n v-for=\"item of renderedFields\"\n :key=\"item.key\"\n :field=\"item.field\"\n :grid=\"props.grid\"\n :disabled=\"props.disabled\"\n :set-form-item-ref=\"setFormItemRef\"\n :set-component-ref=\"setComponentRef\"\n />\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"F extends Form<any> = Form\">\n/**\n * 配置驱动表单组件\n *\n * @component ProForm\n *\n * 架构设计说明 (Architecture Overview)\n *\n * [ 数据层 (Core) ] => [ 绑定层 (ProForm) ] => [ 渲染层 (BaseFormItems / BaseFormItem / BaseField) ]\n *\n * 1. 数据隔离:ProForm 本身不负责存储和管理表单状态,所有核心状态(formData, fields, 校验规则)\n * 均交由底层的 `useForm`(@qin-ui/pro-components-core)驱动。\n * 2. 上下文透传:通过 `provide` 将核心状态下发给子组件。\n * 3. 递归渲染:网格布局和具体字段的解析交由 `<BaseFormItems>` 递归完成。\n *\n * @public\n *\n * 通过配置驱动的方式快速构建表单,支持:\n * - 字段联动(通过 setField、watch 等实现)\n * - 嵌套字段(通过 fields 递归配置)\n * - 自定义组件(通过 component 属性和 custom 类型)\n * - 网格布局(通过 grid 属性)\n * - 动态插槽(以字段 path 命名的插槽)\n * - 全局配置注入(通过 ProComponentProvider)\n *\n * @template F - 表单实例类型\n *\n * @param {F} [form] - useForm 返回的表单实例\n * @param {boolean | GridProps} [grid] - 是否启用网格布局,默认关闭;Provider 的 `grid` 仅作为启用时的参数配置\n * @param {...FormProps} ...attrs - Element Plus Form 组件的其他属性\n *\n * @slot default - 默认插槽,可用于添加额外内容\n * @slot [path] - 以字段 path 命名的动态插槽,可用于自定义字段渲染\n *\n * @example\n * ```vue\n * <template>\n * <ProForm :form=\"form\" @submit=\"handleSubmit\">\n * <template #name=\"{ value, disabled }\">\n * <el-input :model-value=\"value\" :disabled=\"disabled\" />\n * </template>\n * </ProForm>\n * </template>\n * ```\n */\nimport type { FormProps as ElFormProps } from '../../../../shared/ui';\nimport { Form as ElForm, useDisabledContext } from '../../../../shared/ui';\nimport {\n computed,\n inject,\n mergeProps,\n onUpdated,\n provide,\n shallowRef,\n toValue,\n triggerRef,\n type Slot,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport BaseFormItems from '../BaseFormItems/index.vue';\nimport { InjectionFormKey, InjectionFormSlotsKey } from '../../constants';\nimport type { Grid, VModelProps, PathProps } from '../../types';\nimport type { Path } from '../../../../shared/core';\nimport {\n camelizeProperties,\n createFormProxy,\n omitBy,\n useReactiveAttrs,\n} from '../../../../shared/core';\nimport { useForm, type Form } from '../../hooks/useForm';\nimport { resolveDisabled } from '../../utils/disabled';\n\ndefineOptions({ name: 'ProForm', inheritAttrs: false });\n\ntype FormProps = Partial<Omit<ElFormProps, 'model'>>;\n\ntype Props = {\n grid?: Grid;\n form?: F;\n} & /* @vue-ignore */ FormProps;\nconst props = withDefaults(defineProps<Props>(), {\n grid: false,\n form: undefined,\n});\n\n/**\n * 依赖注入中心:\n * 未传 form 实例(含运行期置空)时回退内部表单实例;\n * 将 Form 实例注入到 Vue Context 中,供深层子组件跨层级直接访问数据和方法。\n */\n// 兜底表单实例:setup 同步期创建,未传 :form(含运行期置空)时经 currentForm 生效\nconst fallbackForm = useForm() as unknown as F;\nconst currentForm = computed(() => props.form ?? fallbackForm);\n\n/**\n * 表单实例代理:操作全部转发至 currentForm 当前实例;\n * 下游持有本代理即可,:form 运行期替换无需重绑;方法具有引用记忆化。\n */\nconst formProxy = createFormProxy(() => currentForm.value);\n\nprovide(InjectionFormKey, formProxy);\n\nconst fields = computed(() => {\n const f = currentForm.value?.fields;\n return (Array.isArray(f) ? f : f?.value) ?? [];\n});\nconst formData = computed(() => currentForm.value?.formData);\nconst setFormRef = (el: any) => currentForm.value?.setFormRef?.(el);\n\n/*\n * formKey 子树重挂载契约:以 WeakMap 为每个 form 实例生成自增 key,绑定到原生 Form 的 :key\n * :form 运行期替换为全新实例时强制整棵表单子树重新挂载,重置宿主校验状态与深层字段非受控状态\n */\nlet formInstanceCounter = 0;\nconst formInstanceKeyMap = new WeakMap<object, number>();\nconst getFormKey = (f: object) => {\n if (f == null) return 0;\n if (!formInstanceKeyMap.has(f)) {\n formInstanceKeyMap.set(f, ++formInstanceCounter);\n }\n return formInstanceKeyMap.get(f)!;\n};\nconst formKey = computed(() => getFormKey(currentForm.value as any));\n\nconst config = INJECT_CONFIG['pro-form'];\nconst injectFormConfig = inject(config.injectionKey, config.default);\nconst attrs = useReactiveAttrs();\n\n/**\n * 从 ProComponentProvider 获取全局配置,响应式派生以支持动态配置变更\n */\nconst injectAttrs = computed(() => {\n const raw = toValue(injectFormConfig);\n const { grid: _injectGrid, ...rest } = raw || {};\n return rest;\n});\n\nconst formAttrs = computed(() => {\n return mergeProps(\n injectAttrs.value,\n omitBy(camelizeProperties(attrs), value => value === undefined)\n );\n});\n\n// 表单级禁用声明:显式值(含 false)优先,未声明时仅继承外层 true\nconst outerDisabled = useDisabledContext();\nconst formDisabled = computed<boolean | undefined>(() => {\n const explicit = resolveDisabled(toValue(formAttrs.value.disabled));\n if (explicit !== undefined) return explicit;\n return outerDisabled.value ? true : undefined;\n});\n\ntype ExtractPath<T> = T extends Form<infer D> ? Path<D> : string;\ntype FieldSlotProps = VModelProps &\n PathProps & { disabled?: boolean; [x: string]: any };\ntype FieldSlots = Record<ExtractPath<F>, Slot<FieldSlotProps>>;\n\nconst slots = defineSlots<Partial<FieldSlots & { default: Slot }>>();\n\n/*\n * 动态插槽映射中心 (Slot Teleporting):\n * 向深层 BaseField 提供 ProForm 的具名插槽,父级运行期增删插槽后下游可感知\n */\nconst formSlotsRef = shallowRef<Record<string, any>>(slots);\nonUpdated(() => {\n triggerRef(formSlotsRef);\n});\nprovide(InjectionFormSlotsKey, formSlotsRef);\n</script>\n\n<template>\n <!-- el-form 渲染原生 form 元素,拦截回车触发的默认提交 -->\n <ElForm\n :key=\"formKey\"\n :ref=\"setFormRef\"\n :model=\"formData\"\n v-bind=\"formAttrs\"\n class=\"pro-form\"\n @submit.prevent\n >\n <BaseFormItems\n :fields=\"fields\"\n :grid=\"props.grid\"\n :disabled=\"formDisabled\"\n />\n <slot />\n </ElForm>\n</template>\n","import type { FormItemInstance } from '../../../shared/ui';\nimport {\n useFields as coreUseFields,\n type UseFieldsReturn,\n} from '../../../shared/core';\nimport type { Data } from '../../../shared/core';\nimport type { Field, Fields } from '../types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\nimport type { ComponentName } from '../constants';\n\n/**\n * 字段配置管理 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFields`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 组件类型推导)\n * - FormItem 实例 -> Element Plus 的 `FormItemInstance`\n *\n * 提供对字段配置数组的增删改查操作,支持:\n * - 通过路径字符串或查找函数定位字段\n * - 深层嵌套字段的遍历和匹配\n * - 字段配置的合并/覆盖更新\n * - 字段的添加、插入、删除\n * - 父级字段查找\n *\n * @template D - 表单数据类型\n * @param {Fields<D>} [initFields] - 初始字段配置数组\n *\n * @returns 字段操作对象,包含以下属性:\n * - `fields` - 字段配置数组(响应式 Ref\\<F[]\\>)\n * - `getField(path)` - 获取字段配置,支持路径字符串或查找函数\n * - `setField(path, field, options?)` - 更新字段配置,默认合并模式\n * - `deleteField(path, options?)` - 删除字段配置\n * - `appendField(path, field, options?)` - 在指定字段后追加\n * - `prependField(path, field, options?)` - 在指定字段前插入\n * - `getParentField(path, options?)` - 获取父级字段配置\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * const { fields, getField, setField } = useFields<User>([\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ])\n *\n * // 通过路径获取\n * getField('name')\n * // 通过查找函数获取\n * getField(f => f.label === '姓名')\n * // 更新字段(合并模式)\n * setField('name', { label: '用户名', disabled: true })\n * ```\n *\n * @see {@link coreUseFields} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFields<D extends Data = Data>(\n initFields?: Fields<D>\n): UseFieldsReturn<D, Field<ComponentName, D>, FormItemInstance>;\nexport function useFields(initFields?: any) {\n return coreUseFields(initFields, {\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n}\n\n/** useFields 返回值类型\n * @public\n */\nexport type UseFields<D extends Data = Data> = ReturnType<typeof useFields<D>>;\n","import {\n useFormRef as coreUseFormRef,\n type UseFormRefReturn,\n} from '../../../shared/core';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单组件实例引用 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFormRef`,将泛型参数绑定为 Element Plus 的 `FormInstance`,\n * 使 formRef 获取到完整的 Element Plus Form 组件 API 类型提示(如 `validate()`、`resetFields()` 等)。\n *\n * `formRef` 由 ProForm 组件内部自动通过 `setFormRef` 绑定,无需手动调用。\n *\n * @returns 表单组件实例引用管理对象:\n * - `formRef` — Element Plus Form 组件实例的响应式引用(`Ref<FormInstance | undefined>`)\n * - `setFormRef(inst)` — 设置 Form 组件实例,由 ProForm 内部自动调用\n *\n * @example\n * ```ts\n * const { formRef, setFormRef } = useFormRef()\n *\n * // formRef 由 ProForm 自动绑定,可直接使用\n * await formRef.value?.validate()\n * formRef.value?.resetFields()\n * formRef.value?.scrollToField('username')\n * ```\n *\n * @see {@link coreUseFormRef} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFormRef(): UseFormRefReturn<FormInstance> {\n return coreUseFormRef();\n}\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"down\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"></path></svg>\n</template>\n","<script lang=\"ts\">\ntype Expand = {\n /** 网格布局时默认展开行数量 */\n minExpandRows?: number;\n /** 网格布局时展开状态 */\n expandStatus?: boolean;\n};\n\ntype _FormProps = Pick<\n Partial<FormProps>,\n | 'disabled'\n | 'labelPosition'\n | 'labelWidth'\n | 'inline'\n | 'inlineMessage'\n | 'statusIcon'\n | 'showMessage'\n | 'size'\n>;\n\ntype ButtonProps = { onClick: () => void };\ntype ExpandButtonProps = ButtonProps & { expandStatus: boolean };\n\n/**\n * 搜索表单属性面,由 ProTable 经 `searchFormConfig` 下发\n */\nexport type SearchFormProps = {\n /** 搜索表单实例,由 table.searchForm 提供 */\n form: Form;\n /** 布局形态,默认 'grid' */\n layout?: 'grid' | 'inline';\n /** 展开配置,默认 true */\n expand?: boolean | Expand;\n /** 自定义搜索按钮,false 时不渲染 */\n searchButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n /** 自定义重置按钮,false 时不渲染 */\n resetButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n /** 自定义展开/折叠按钮,false 时不渲染 */\n expandButton?:\n | Component<ExpandButtonProps>\n | DefineComponent<ExpandButtonProps>\n | false;\n /** 行间距,默认 16 */\n rowGap?: number;\n /** 列间距,默认 24 */\n columnGap?: number;\n} & /* @vue-ignore */ _FormProps &\n AllowedComponentProps;\n</script>\n\n<script lang=\"ts\" setup>\n/**\n * ProTable 的搜索表单子组件\n *\n * @component SearchForm\n *\n * ## 核心功能\n *\n * 1. 内部渲染 ProForm,使用 table.searchForm 管理搜索条件\n * 2. 支持 grid(网格)和 inline(行内)两种布局\n * 3. 网格布局下支持展开/折叠\n * 4. 提供搜索、重置、展开/折叠按钮(支持自定义)\n *\n * ## 展开/折叠行为\n *\n * 1. 内容高度超出折叠高度(由 minExpandRows 决定,默认 2 行)时显示展开/折叠按钮\n * 2. 隐藏区域存在搜索值时自动展开\n * 3. 用户手动切换后保持手动状态,不随重新测量回退\n *\n * @param {Form} form - 搜索表单实例,由 table.searchForm 提供\n * @param {'grid' | 'inline'} [layout] - 布局形态,默认 'grid'\n * @param {boolean | Expand} [expand] - 展开配置,默认 true\n * @param {Component<ButtonProps> | DefineComponent<ButtonProps> | false} [searchButton] - 自定义搜索按钮,false 时不渲染\n * @param {Component<ButtonProps> | DefineComponent<ButtonProps> | false} [resetButton] - 自定义重置按钮,false 时不渲染\n * @param {Component<ExpandButtonProps> | DefineComponent<ExpandButtonProps> | false} [expandButton] - 自定义展开/折叠按钮,false 时不渲染\n * @param {number} [rowGap] - 行间距,默认 16\n * @param {number} [columnGap] - 列间距,默认 24\n *\n * @slot reset-button - 重置按钮插槽,作用域参数 onReset\n * @slot search-button - 搜索按钮插槽,作用域参数 onSearch\n * @slot expand-button - 展开/折叠按钮插槽,作用域参数 expandStatus / changeExpandStatus\n */\nimport type { FormProps } from '../../../shared/ui';\nimport { Space, Button } from '../../../shared/ui';\nimport type { AllowedComponentProps } from 'vue';\nimport { computed, nextTick, type Component, type DefineComponent } from 'vue';\nimport ProForm from '../../form/components/ProForm/index.vue';\nimport { type Form } from '../../form/hooks/useForm';\nimport DownOutlined from './icons/DownOutlined.vue';\nimport { useLocale } from '../../../locale';\nimport { useSearchFormExpand } from '../../../shared/core';\n\ndefineOptions({ name: 'SearchForm' });\n\nconst { t } = useLocale();\n\nconst props = withDefaults(defineProps<SearchFormProps>(), {\n layout: 'grid',\n expand: true,\n searchButton: undefined,\n resetButton: undefined,\n expandButton: undefined,\n rowGap: 16,\n columnGap: 24,\n});\n\ntype Emits = {\n (e: 'search'): void;\n (e: 'reset'): void;\n};\nconst emit = defineEmits<Emits>();\n\nconst { showExpandToggle, expandStatus, changeExpandStatus, heightStyle } =\n useSearchFormExpand(props);\n\nconst layoutProps = computed(() => {\n return props.layout === 'grid'\n ? {\n grid: {\n gutter: props.columnGap,\n style: { rowGap: `${props.rowGap}px` },\n },\n style: {\n display: 'flex',\n overflow: 'hidden',\n columnGap: `${props.columnGap}px`,\n height: heightStyle.value,\n },\n }\n : {\n inline: true,\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${props.rowGap}px ${props.columnGap}px`,\n },\n grid: false,\n };\n});\n\nconst onReset = () => {\n emit('reset');\n};\n\n// 同一 tick 内 click 与 submit 只放行首个触达者,下一 tick 释放标记\nlet searchTriggeredInTick = false;\n\nconst emitSearch = () => {\n searchTriggeredInTick = true;\n nextTick(() => {\n searchTriggeredInTick = false;\n });\n emit('search');\n};\n\n// 默认查询按钮为 native-type=submit:点击与回车统一经表单 submit 事件触发\nconst onSearchSubmit = () => {\n if (searchTriggeredInTick) return;\n emitSearch();\n};\n\n// 自定义查询按钮与 search-button 插槽经 click 触发\nconst onSearchClick = () => {\n if (searchTriggeredInTick) return;\n emitSearch();\n};\n</script>\n\n<template>\n <ProForm\n v-bind=\"layoutProps\"\n :form=\"props.form\"\n class=\"pro-table_search-form transition\"\n @submit.prevent=\"onSearchSubmit\"\n >\n <Space alignment=\"start\" class=\"pro-table_search-form_button-group\">\n <slot name=\"reset-button\" :on-reset=\"onReset\">\n <template v-if=\"props.resetButton !== false\">\n <component\n :is=\"props.resetButton\"\n v-if=\"props.resetButton\"\n @click=\"onReset\"\n />\n <Button\n v-else\n class=\"pro-table_search-form_reset-button\"\n @click=\"onReset\"\n >\n {{ t('table.reset') }}\n </Button>\n </template>\n </slot>\n <slot name=\"search-button\" :on-search=\"onSearchClick\">\n <template v-if=\"props.searchButton !== false\">\n <component\n :is=\"props.searchButton\"\n v-if=\"props.searchButton\"\n @click=\"onSearchClick\"\n />\n <Button\n v-else\n class=\"pro-table_search-form_search-button\"\n type=\"primary\"\n native-type=\"submit\"\n >\n {{ t('table.query') }}\n </Button>\n </template>\n </slot>\n <slot\n name=\"expand-button\"\n :expand-status=\"expandStatus\"\n :change-expand-status=\"changeExpandStatus\"\n >\n <template v-if=\"props.expandButton !== false && showExpandToggle\">\n <component\n :is=\"props.expandButton\"\n v-if=\"props.expandButton\"\n :expand-status=\"expandStatus\"\n @click=\"changeExpandStatus\"\n />\n <Button\n v-else\n text\n class=\"pro-table_search-form_expand-toggle-button\"\n @click=\"changeExpandStatus\"\n >\n {{ expandStatus ? t('table.collapse') : t('table.expand') }}\n <DownOutlined\n class=\"transition\"\n style=\"margin-left: 4px\"\n :style=\"{ transform: `rotate(${expandStatus ? -180 : 0}deg)` }\"\n />\n </Button>\n </template>\n </slot>\n </Space>\n </ProForm>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form {\n :deep([class*='-form-item']) {\n margin: 0;\n }\n &_expand-toggle-button {\n display: flex;\n align-items: center;\n padding: 0;\n padding-left: 4px;\n }\n\n .transition {\n transition: all 0.25s;\n }\n}\n</style>\n","<template>\n <div class=\"pro-table_search-form-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form-container {\n margin-bottom: 24px;\n padding: 24px;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <div class=\"pro-table_table-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_table-container {\n flex: 1;\n padding: 24px 24px 0;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"column-height\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 00-11.3 0L403.6 366.3a7.23 7.23 0 005.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 表格尺寸切换控件,以图标按钮 + 下拉菜单呈现\n *\n * @component SizeControl\n *\n * @param {Size} [size] - 表格尺寸(`v-model:size`),仅用于回写选中结果\n * @param {Size} [effectiveSize] - 表格实际使用的尺寸,用于高亮选中项;未提供时依次回退 `size`、宿主 ConfigProvider 的尺寸\n */\nimport {\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Button,\n useSize,\n type TableProps,\n} from '../../../shared/ui';\nimport ColumnHeightOutlined from './icons/ColumnHeightOutlined.vue';\nimport { computed } from 'vue';\nimport { useLocale } from '../../../locale';\n\ntype Size = TableProps['size'];\n\nconst { t } = useLocale();\n\nconst props = withDefaults(\n defineProps<{\n effectiveSize?: Size;\n }>(),\n { effectiveSize: undefined }\n);\n\nconst size = defineModel<Size>('size');\n\n// 宿主 ConfigProvider / 表单上下文的尺寸兜底\nconst hostSize = useSize();\n\n// 高亮项:表格有效尺寸 > 本地绑定 > 宿主 ConfigProvider 尺寸 > 默认\nconst currentSize = computed(\n () => (props.effectiveSize ?? size.value ?? hostSize.value) || 'default'\n);\n\nconst items = computed<Array<{ label: string; key: NonNullable<Size> }>>(() => [\n { label: t('table.sizeDefault'), key: 'default' },\n { label: t('table.sizeMiddle'), key: 'large' },\n { label: t('table.sizeCompact'), key: 'small' },\n]);\n</script>\n\n<template>\n <Dropdown trigger=\"click\" @command=\"val => (size = val as any)\">\n <Button text class=\"pro-table_size-control_button\">\n <ColumnHeightOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-for=\"item in items\"\n :key=\"item.key\"\n :command=\"item.key\"\n :disabled=\"item.key === currentSize\"\n >\n {{ item.label }}\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_size-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.3);\n }\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"filter\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 列显隐控制控件,以下拉菜单列出可控列并支持全选/取消全选\n *\n * @component ColumnControl\n *\n * @param {Columns} columns - 参与控制的列配置(由 ProTable 下发)\n * @param {Table} [table] - 表格实例,勾选结果经其 `setColumn` 写回列 `hidden`\n * @param {ColumnControlConfig} [columnControl] - 控制项配置:labels / excludedKeys / disabledKeys / disableCheckAll\n */\nimport {\n Button,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n} from '../../../shared/ui';\nimport { toValue, computed, ref, watch } from 'vue';\nimport type { Column, Columns, ColumnControlConfig } from '../types';\nimport { type Table } from '../hooks';\nimport FilterOutlined from './icons/FilterOutlined.vue';\nimport { useLocale } from '../../../locale';\nimport { isObjectItem, normalizePathKey } from '../../../shared/core';\n\ntype Props = {\n columns: Columns;\n table?: Table;\n columnControl?: ColumnControlConfig;\n};\nconst props = withDefaults(defineProps<Props>(), {\n table: undefined,\n columnControl: undefined,\n});\n\nconst { t } = useLocale();\n\nconst checkAll = ref(false);\nconst indeterminate = ref(false);\n\nconst getColumnKey = (column: Column) => {\n // 空字符串 key 视为未提供,回退 prop(与列渲染口径一致)\n const rawKey = column.key || column.prop;\n if (rawKey === undefined || rawKey === null || rawKey === '')\n return undefined;\n return normalizePathKey(rawKey);\n};\n\nconst checkedColumnsOptions = computed<\n Array<{\n label: string;\n value: string;\n checked: boolean;\n disabled: boolean;\n column: Column;\n }>\n>(() =>\n props.columns.filter(isObjectItem).flatMap(item => {\n const key = getColumnKey(item);\n // 无 key/prop 列不进入列控面板\n if (key === undefined) return [];\n // 默认排除内部序号列 __INDEX__ 及显式指定的 excludedKeys\n if (\n key === '__INDEX__' ||\n (item as any).type === 'index' ||\n props.columnControl?.excludedKeys?.some(ek => String(ek) === key)\n )\n return [];\n const disabled =\n props.columnControl?.disabledKeys?.some(dk => String(dk) === key) ??\n false;\n const rawTitle = item.label ?? (item as any).title;\n const titleLabel = typeof rawTitle === 'string' ? rawTitle : undefined;\n const propLabel =\n item.prop !== undefined && item.prop !== null\n ? String(item.prop)\n : undefined;\n const label =\n (props.columnControl?.labels?.[key] as string) ??\n titleLabel ??\n propLabel ??\n key;\n return {\n label,\n value: key,\n checked: !toValue(item.hidden) || !!disabled,\n disabled: !!disabled,\n column: item,\n };\n })\n);\n\n/** 可被用户勾选/取消的列(非 disabled) */\nconst controllableOptions = computed(() =>\n checkedColumnsOptions.value.filter(item => !item.disabled)\n);\n\nconst checkedColumnKeys = computed({\n get() {\n return checkedColumnsOptions.value.flatMap(item =>\n item.checked ? item.value : []\n );\n },\n set(val: string[]) {\n // 仅写 hidden 发生翻转的列\n const checkedSet = new Set(val);\n checkedColumnsOptions.value.forEach(item => {\n if (item.disabled || item.checked === checkedSet.has(item.value)) return;\n props.table?.setColumn(item.value as any, {\n hidden: !checkedSet.has(item.value),\n });\n });\n },\n});\n\nconst onCheckAllChange = (value: any) => {\n const checked = !!(value?.target?.checked ?? value);\n checkedColumnKeys.value = checked\n ? controllableOptions.value.map(item => item.value)\n : [];\n};\n\nconst toggleColumnsItem = (val: string) => {\n const item = checkedColumnsOptions.value.find(o => o.value === val);\n if (item?.disabled) return;\n if (checkedColumnKeys.value.includes(val)) {\n checkedColumnKeys.value = checkedColumnKeys.value.filter(\n item => item !== val\n );\n } else {\n checkedColumnKeys.value = [...checkedColumnKeys.value, val];\n }\n};\n\nwatch(\n checkedColumnKeys,\n () => {\n const controllableChecked = controllableOptions.value.filter(\n item => item.checked\n );\n indeterminate.value =\n !!controllableChecked.length &&\n controllableChecked.length < controllableOptions.value.length;\n checkAll.value =\n controllableChecked.length === controllableOptions.value.length &&\n controllableOptions.value.length > 0;\n },\n { immediate: true }\n);\n\n// disabledKeys 指定的列始终强制展示\nwatch(\n () => props.columnControl?.disabledKeys,\n keys => {\n keys?.forEach(key => {\n props.table?.setColumn(String(key), { hidden: false });\n });\n },\n { immediate: true, deep: true }\n);\n</script>\n\n<template>\n <Dropdown trigger=\"click\" :hide-on-click=\"false\">\n <Button text class=\"pro-table_column-control_button\">\n <FilterOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-if=\"!props.columnControl?.disableCheckAll\"\n :disabled=\"true\"\n :divided=\"false\"\n >\n <Checkbox\n :model-value=\"checkAll\"\n :indeterminate=\"indeterminate\"\n @change=\"onCheckAllChange\"\n >\n {{ t('table.selectAll') }}\n </Checkbox>\n </DropdownItem>\n <DropdownItem\n v-for=\"item in checkedColumnsOptions\"\n :key=\"item.value\"\n :command=\"item.value\"\n @click.stop=\"toggleColumnsItem(item.value)\"\n >\n <Checkbox :model-value=\"item.checked\" :disabled=\"item.disabled\">\n {{ item.label }}\n </Checkbox>\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_column-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.2, 1.4);\n }\n}\n</style>\n","<script lang=\"ts\">\n/**\n * 列配置渲染器\n *\n * @component TableColumnRenderer\n * @description 把列数组渲染为 el-table-column 树,支持分组列(children)、自定义 render 列与深层路径取值\n *\n * @param {Columns} [columns] - 列配置数组\n *\n * @internal\n */\nimport { defineComponent, h, toRaw, toValue, type PropType } from 'vue';\nimport { get, isObjectItem, normalizePathKey } from '../../../shared/core';\nimport { TableColumn } from '../../../shared/ui';\nimport SlotComponent from '../../form/components/SlotComponent/index.vue';\nimport type { Column, Columns } from '../types';\n\n/*\n * 无 key/prop 列的渲染 key 与列对象身份绑定:\n * 列增删、重排与过滤后 key 不随数组位置漂移\n */\nlet columnKeySeed = 0;\nconst columnKeyMap = new WeakMap<object, number>();\nconst getStableColumnKey = (column: unknown): string | number => {\n if (column === null || typeof column !== 'object')\n return `raw_${String(column)}`;\n const raw = toRaw(column);\n let key = columnKeyMap.get(raw);\n if (key === undefined) {\n key = ++columnKeySeed;\n columnKeyMap.set(raw, key);\n }\n return key;\n};\n\nconst getColumnKey = (column: Column) => {\n // 空字符串 key 视为未提供,与 getColumnProps 的 columnKey 取值一致\n const rawKey = column.key || column.prop;\n if (!rawKey) return getStableColumnKey(column);\n return normalizePathKey(rawKey);\n};\n\nconst getCellValue = (row: Record<string, any>, column: Column) => {\n const path = column.prop;\n if (!path) return undefined;\n return get(row, path);\n};\n\nconst getColumnProps = (column: Column) => {\n const { hidden, render, key, children, ...rest } = column;\n const prop = column.prop ? normalizePathKey(column.prop) : undefined;\n const columnKey = key ? normalizePathKey(key) : prop;\n return {\n ...rest,\n label: column.label ?? (column as any).title,\n prop,\n columnKey,\n };\n};\n\n/*\n * 递归渲染列树:子列以同层 vnode 数组展开,深层分组同样成立;\n * 每层以不可变祖先路径向下传递,重复出现的祖先引用直接剔除(含 a→b→a 互引用)\n */\nconst renderColumn = (\n column: Column,\n ancestors: Set<object> = new Set()\n): any => {\n const hasChildren =\n Array.isArray(column.children) && column.children.length > 0;\n const vnodeProps = { key: getColumnKey(column), ...getColumnProps(column) };\n if (hasChildren) {\n // 每层祖先路径随 vnode 创建确定,环状引用按路径截断\n const nextAncestors = new Set(ancestors).add(column);\n return h(TableColumn, vnodeProps, {\n default: () =>\n column\n .children!.filter(\n child =>\n isObjectItem(child) &&\n !nextAncestors.has(child) &&\n !toValue(child.hidden)\n )\n .map(child => renderColumn(child, nextAncestors)),\n });\n }\n if (typeof column.render === 'function') {\n return h(TableColumn, vnodeProps, {\n default: (scope: any) =>\n h(SlotComponent, {\n component: column.render!({\n ...scope,\n column,\n cellValue: getCellValue(scope.row, column),\n }),\n }),\n });\n }\n return h(TableColumn, vnodeProps);\n};\n\nexport default defineComponent({\n name: 'TableColumnRenderer',\n inheritAttrs: false,\n props: {\n columns: {\n type: Array as PropType<Columns>,\n default: () => [],\n },\n },\n setup(props) {\n return () =>\n props.columns\n .filter(column => isObjectItem(column) && !toValue(column.hidden))\n .map(column => renderColumn(column));\n },\n});\n</script>\n","<script lang=\"ts\" setup generic=\"T extends Table<any> = Table\">\n/**\n * 配置驱动的表格组件\n *\n * @component ProTable\n *\n * ## 架构概览\n *\n * ProTable 是表格系统的顶层容器,负责:\n * 1. 接收 useTable() 创建的表格实例,驱动列、数据源、分页的渲染\n * 2. 内部集成 SearchForm 搜索区域(基于 ProForm)\n * 3. 支持列动态控制(显示/隐藏)和尺寸控制\n * 4. 将分页变化和搜索事件串联到数据查询流程\n *\n * ## 数据流\n *\n * ```\n * useTable({ columns, dataSource, searchFields, ... })\n * ↓ 传入 :table prop\n * ProTable\n * ├── SearchForm (使用 table.searchForm 管理搜索条件)\n * │ └── ProForm\n * ├── SizeControl (表格尺寸切换)\n * ├── ColumnControl (列显示/隐藏)\n * └── ElTable (element-plus Table)\n * └── 转发所有 table 插槽\n * ```\n *\n * ## 搜索行为\n *\n * 1. 搜索:分页回到第一页后发起查询\n * 2. 分页变化:分页参数同步后发起查询\n * 3. 重置:查询参数恢复初始值后重新查询\n *\n * ## 列来源\n *\n * 显式 `:columns` 优先于 `:table` 实例的 `columns`;显式列按原样透传给宿主,不补齐 `key`,\n * 需由调用方提供 `key` / `dataIndex` / `prop`。显式模式下 `setColumn` 与列控入口均不生效。\n *\n * @template T - 表格实例类型(useTable 返回值)\n *\n * @param {T} [table] - 列表表格对象,来自 useTable\n * @param {() => Promise<unknown>} [search] - 列表数据查询方法\n * @param {boolean} [addIndexColumn] - 是否在首列插入序号列\n * @param {boolean} [immediateSearch] - 挂载后是否立即触发一次查询\n * @param {boolean | Partial<Control>} [control] - 是否展示尺寸与列控制按钮;显式传入 columns 时列控入口不渲染\n * @param {SearchFormConfig} [searchFormConfig] - 搜索栏查询字段表单配置\n * @param {ContainerComponent | false} [tableContainer] - 表格区域包裹容器\n *\n * @slot default - 保留给列渲染器,传入内容不参与渲染,自定义区域请使用下列具名插槽\n * @slot search-form - 搜索区域插槽(无作用域)\n * @slot button-bar - 表格头部按钮区插槽\n * @slot toolbar - 工具栏插槽\n * @slot table - 表格区域插槽(无作用域)\n */\nimport {\n Pagination as ElPagination,\n type PaginationProps,\n Table as ElTable,\n type TableProps,\n type TableEmits,\n tableProps,\n paginationProps,\n} from '../../../shared/ui';\nimport { ElLoading } from 'element-plus';\nimport {\n Comment,\n Fragment,\n Text,\n computed,\n effect,\n stop,\n nextTick,\n onMounted,\n inject,\n toValue,\n type Slot,\n useSlots,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport ContainerFragment from '../../form/components/ContainerFragment/index.vue';\nimport type { ContainerComponent } from '../../form/types';\nimport SearchForm from './SearchForm.vue';\nimport type { SearchFormProps } from './SearchForm.vue';\nimport type { Table } from '../hooks';\nimport { useLocale } from '../../../locale';\nimport type { Path } from '../../../shared/core';\nimport {\n camelizeProperties,\n getObject,\n isObjectItem,\n isPlainObject,\n isPromise,\n omitBy,\n pick,\n useReactiveAttrs,\n} from '../../../shared/core';\nimport DefaultSearchFormContainer from './DefaultSearchFormContainer.vue';\nimport DefaultTableContainer from './DefaultTableContainer.vue';\nimport SizeControl from './SizeControl.vue';\nimport ColumnControl from './ColumnControl.vue';\nimport type { Columns, ColumnControlConfig } from '../types';\nimport TableColumnRenderer from './TableColumnRenderer.vue';\n\ndefineOptions({\n name: 'ProTable',\n directives: {\n loading: ElLoading.directive,\n },\n inheritAttrs: false,\n});\n\nconst tableProperties = Object.keys(tableProps());\nconst paginationProperties = Object.keys(paginationProps());\n\ntype Control = {\n /** 是否展示表格尺寸控制 */\n sizeControl: boolean;\n /** 是否展示列控制,传对象时作为列控面板配置 */\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n};\n\n/** 搜索表单配置:SearchFormProps 去掉 form,并加上搜索区显隐与容器 */\ntype SearchFormConfig = Omit<SearchFormProps, 'form'> & {\n /** 是否隐藏搜索表单 */\n hidden?: boolean;\n /** 搜索区域包裹容器 */\n container?: ContainerComponent | false;\n};\n\ntype ReturnTableRecord<V> = V extends Table<any, infer R> ? R : any;\ntype RecordType = ReturnTableRecord<T>;\n\ntype Props = {\n /** 列表表格对象,来自 useTable */\n table?: T;\n /** 列表数据查询方法 */\n search?: () => Promise<unknown>;\n /** 是否在首列插入序号列 */\n addIndexColumn?: boolean;\n /** 挂载后是否立即触发一次查询 */\n immediateSearch?: boolean;\n /** 是否展示尺寸与列控制按钮,支持分别控制;显式传入 columns 时列控入口不渲染 */\n control?: boolean | Partial<Control>;\n /** 搜索栏查询字段表单配置 */\n searchFormConfig?: SearchFormConfig;\n /** 表格区域包裹容器 */\n tableContainer?: ContainerComponent | false;\n /** 直接传入列配置(覆盖 :table 实例的 columns);列需自备 key / dataIndex / prop,显式模式不参与 setColumn 与列控 */\n columns?: Columns<RecordType>;\n /** 直接传入数据源(覆盖 :table 实例的 data) */\n data?: RecordType[];\n /** 分页配置,传 false 禁用 */\n pagination?: false | Partial<PaginationProps>;\n} & /* @vue-ignore */ Omit<TableProps, 'data'>;\n\n/*\n * 组件自身仅触发模型事件;宿主表格事件不入运行时 emits,监听入口保留在 attrs 中透传至 ElTable\n */\ntype Emits = {} & /* @vue-ignore */ TableEmits<RecordType>;\n\ndefineEmits<Emits>();\n\nconst props = withDefaults(defineProps<Props>(), {\n table: undefined,\n search: undefined,\n addIndexColumn: undefined,\n immediateSearch: undefined,\n control: undefined,\n searchFormConfig: undefined,\n tableContainer: undefined,\n columns: undefined,\n data: undefined,\n pagination: undefined,\n});\n\nconst { t } = useLocale();\n\nconst config = INJECT_CONFIG['pro-table'];\nconst injectPropsRaw = inject(config.injectionKey, config.default);\nconst injectProps = computed(() => toValue(injectPropsRaw) || {});\n\nconst attrs = useReactiveAttrs() as Record<string, any>;\n\n// 组件自身消费的 attrs 键:class / style 绑定根节点,onSearch / onChange 由搜索与分页流程消费\nconst PRO_TABLE_CONSUMED_ATTR_KEYS = new Set([\n 'class',\n 'style',\n 'onSearch',\n 'onChange',\n]);\n\n// 组件自身消费的 props 键:对应值按 prop / provider 单一来源派生,provider 注入不再透传这些键\nconst PRO_TABLE_PROP_KEYS = new Set(Object.keys(props));\n\nconst injectTableAttrs = computed(() => {\n const tableConfig: Record<string, any> = {};\n for (const [key, value] of Object.entries(injectProps.value)) {\n if (!PRO_TABLE_PROP_KEYS.has(key)) {\n tableConfig[key] = value;\n }\n }\n return tableConfig as Partial<TableProps>;\n});\n\nconst attrsTableProps = computed(() => {\n return omitBy(\n pick(camelizeProperties(attrs), tableProperties),\n value => value === undefined\n ) as Partial<TableProps>;\n});\n\nconst restTableAttrs = computed(() => {\n const rest: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n if (!PRO_TABLE_CONSUMED_ATTR_KEYS.has(key)) {\n rest[key] = value;\n }\n }\n return omitBy(rest, value => value === undefined);\n});\n\nconst size = defineModel<TableProps['size']>('size');\nconst loading = defineModel<boolean>('loading', { default: false });\n\n// 递增序号做请求竞态守卫,仅最新一次请求可变更 loading\nlet searchSequence = 0;\n// 告警文案按原因分键,各原因独立去重\nconst SEARCH_WARN_MESSAGES = {\n duplicate:\n '同时配置了 :search prop 与 @search 监听,@search 监听不会被执行,请仅保留其一。',\n 'not-promise':\n 'search 未返回 Promise,本次查询不参与 loading 竞态管理(在途请求的 loading 状态保持不变)。',\n} as const;\nconst warnedSearchReasons = new Set<keyof typeof SEARCH_WARN_MESSAGES>();\nconst warnSearchConfig = (reason: keyof typeof SEARCH_WARN_MESSAGES) => {\n if (warnedSearchReasons.has(reason)) return;\n warnedSearchReasons.add(reason);\n console.warn(`[ProTable] ${SEARCH_WARN_MESSAGES[reason]}`);\n};\nconst _search = async () => {\n const search = props.search || attrs.onSearch;\n if (props.search && attrs.onSearch) {\n warnSearchConfig('duplicate');\n }\n if (!search) return;\n const searchPromise = search();\n if (!isPromise(searchPromise)) {\n warnSearchConfig('not-promise');\n return;\n }\n const seq = ++searchSequence;\n loading.value = true;\n try {\n await searchPromise;\n } finally {\n if (seq === searchSequence) {\n loading.value = false;\n }\n }\n};\n\n// 重置:恢复查询参数到初始值,重新搜索\nconst reset = () => {\n props.table?.resetQueryParams?.();\n nextTick(() => {\n _search();\n });\n};\n\nconst customSlotNames = [\n 'search-form',\n 'button-bar',\n 'toolbar',\n 'table',\n] as const;\n\ntype CustomSlots = Readonly<\n Partial<Record<(typeof customSlotNames)[number], Slot>>\n>;\ntype Slots = CustomSlots & Readonly<Record<string, Slot>>;\n\nconst slots = useSlots() as Slots;\n\n/** 插槽产出是否含可渲染内容:注释节点与空白文本不计 */\nconst hasRenderableContent = (nodes: unknown): boolean => {\n if (nodes === null || nodes === undefined || nodes === false) return false;\n if (typeof nodes === 'string') return nodes.trim() !== '';\n if (typeof nodes === 'number') return true;\n if (Array.isArray(nodes)) return nodes.some(hasRenderableContent);\n const vnode = nodes as { type?: unknown; children?: unknown };\n if (vnode.type === Comment) return false;\n if (vnode.type === Text) return String(vnode.children ?? '').trim() !== '';\n if (vnode.type === Fragment) return hasRenderableContent(vnode.children);\n return true;\n};\n\n/*\n * 求值一次 default 插槽产出,用于判定是否有可渲染内容(空插槽 / 包装组件透传不提示)。\n * 求值由一次性 effect 执行并立即停止,插槽内的响应式读取不进入 ProTable 的渲染依赖。\n */\nconst evaluateSlotContent = (): boolean => {\n let hasContent = false;\n const runner = effect(() => {\n try {\n hasContent = hasRenderableContent(slots.default?.());\n } catch {\n // 产出无法求值时按有内容处理,照常提示 default 插槽被保留\n hasContent = true;\n }\n });\n stop(runner);\n return hasContent;\n};\n\n// default 插槽保留给列渲染器,同名用户插槽不透传宿主表格\nlet defaultSlotChecked = false;\nconst checkDefaultSlot = () => {\n if (defaultSlotChecked) return;\n if (!Object.prototype.hasOwnProperty.call(slots, 'default')) return;\n defaultSlotChecked = true;\n if (evaluateSlotContent()) {\n console.warn(\n '[pro-components] ProTable 的 default 插槽保留用于列渲染,已忽略传入的 default 插槽内容;自定义区域请使用 search-form / button-bar / toolbar / table 具名插槽。'\n );\n }\n};\n\nconst forwardedSlotNames = () => {\n checkDefaultSlot();\n return Object.keys(slots).filter(\n name => name !== 'default' && !customSlotNames.includes(name as any)\n );\n};\n\nconst searchPage1st = () => {\n props.table?.setPageParam?.({ current: 1 });\n _search();\n};\n\nconst computedSearchFormConfig = computed(() => {\n const container =\n props.searchFormConfig?.container ??\n (injectProps.value.searchFormConfig as any)?.container ??\n DefaultSearchFormContainer;\n return {\n ...injectProps.value.searchFormConfig,\n ...getObject(props.searchFormConfig),\n container: container ? container : undefined,\n };\n});\n\n/** SearchForm 属性面:容器与显隐由 ProTable 自身消费,不下发 SearchForm */\nconst searchFormProps = computed(() => {\n const {\n container: _container,\n hidden: _hidden,\n ...rest\n } = computedSearchFormConfig.value;\n return rest;\n});\n\nconst computedTableContainer = computed(() => {\n const container =\n props.tableContainer ??\n injectProps.value.tableContainer ??\n DefaultTableContainer;\n return container ? container : undefined;\n});\n\n/*\n * 序号列随有效分页偏移:分页关闭时退化为 index + 1;\n * current / pageSize 取有效分页(显式 :pagination 或 Provider 注入),table.pageParam 仅作兜底\n */\nconst getIndex = (i: number) => {\n const pagination = computedPagination.value;\n if (pagination === false) return i + 1;\n const pageParam = props.table?.pageParam;\n const current = pagination.currentPage ?? pageParam?.current ?? 1;\n const pageSize = pagination.pageSize ?? pageParam?.pageSize ?? 10;\n return (current - 1) * pageSize + i + 1;\n};\n\n/** 调用方是否显式传入 columns(值为 undefined 时视为未指定) */\nconst hasExplicitColumns = computed(() => props.columns !== undefined);\n\n/** 显式列原样透传(key 由调用方提供);table 列经 core 规范化 */\nconst normalizedRawColumns = computed(() => {\n const source = (\n (props.columns ?? toValue(props.table?.columns) ?? []) as any[]\n ).filter(isObjectItem);\n if (props.addIndexColumn ?? injectProps.value.addIndexColumn) {\n return [\n {\n key: '__INDEX__',\n type: 'index',\n label: t('table.index'),\n width: 80,\n index: getIndex,\n },\n ...source,\n ];\n }\n return source;\n});\n\nconst computedDataSource = computed<any[]>(() => {\n return props.data ?? toValue(props.table?.data) ?? [];\n});\n\nconst computedTableProps = computed<TableProps>(() => {\n return {\n ...injectTableAttrs.value,\n ...restTableAttrs.value,\n ...attrsTableProps.value,\n } as TableProps;\n});\n\n/*\n * 分页来源:分页开关与展示配置取 props.pagination 显式配置 > provider 全局配置 > 默认合成;\n * currentPage / pageSize / total 以 table.pageParam 为实时状态,显式配置仅在 pageParam 缺省时兜底\n */\nconst computedPagination = computed<false | Partial<PaginationProps>>(() => {\n if (props.pagination === false) return false;\n if (isPlainObject(props.pagination)) {\n const pageConfig = props.pagination as Partial<PaginationProps>;\n const globalPagination =\n (injectProps.value.pagination as any) === false\n ? {}\n : (injectProps.value.pagination as Partial<PaginationProps>) || {};\n const pageParam = props.table?.pageParam;\n return {\n ...globalPagination,\n ...pick(pageConfig as Record<string, any>, paginationProperties),\n currentPage: pageParam?.current ?? (pageConfig as any).currentPage ?? 1,\n pageSize: pageParam?.pageSize ?? (pageConfig as any).pageSize ?? 10,\n total: pageParam?.total ?? (pageConfig as any).total ?? 0,\n };\n }\n\n if ((injectProps.value.pagination as any) === false) return false;\n\n const pageParam = props.table?.pageParam;\n return {\n ...(injectProps.value.pagination as Partial<PaginationProps>),\n currentPage: pageParam?.current ?? 1,\n pageSize: pageParam?.pageSize ?? 10,\n total: pageParam?.total ?? 0,\n };\n});\n\nconst showPagination = computed(() => computedPagination.value !== false);\n\n// pageSize 变更窗口:窗口内忽略宿主级联的 current-change\nlet sizeChangeWindow = false;\n\nconst onCurrentChange = (current: number) => {\n if (sizeChangeWindow) return;\n props.table?.setPageParam?.({ current });\n _search();\n};\n\n// 改变 pageSize 时重置回第 1 页并重新查询\nconst onSizeChange = (pageSize: number) => {\n sizeChangeWindow = true;\n props.table?.setPageParam?.({ pageSize, current: 1 });\n _search();\n nextTick(() => {\n sizeChangeWindow = false;\n });\n};\n\nconst onPaginationChange = (currentPage: number, pageSize: number) => {\n // 透传 el-pagination change 回调\n attrs.onChange?.(currentPage, pageSize);\n};\n\nconst searchFormVisible = computed(() => {\n const searchFields = props.table?.searchForm?.fields;\n const fieldList =\n (Array.isArray(searchFields) ? searchFields : searchFields?.value) ?? [];\n return !!(\n (computedSearchFormConfig.value as any)?.hidden !== true &&\n props.table?.searchForm &&\n fieldList.filter((item: any) => isObjectItem(item) && !toValue(item.hidden))\n .length > 0\n );\n});\n\n/*\n * 控制项来源:显式控制配置 > Provider 全局配置\n */\nconst resolvedControl = computed<{\n sizeControl: boolean;\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n}>(() => {\n const mergedControl = props.control ?? injectProps.value.control;\n if (typeof mergedControl === 'boolean') {\n return { sizeControl: mergedControl, columnControl: mergedControl };\n }\n const c = mergedControl as Control;\n const sizeControl = c?.sizeControl ?? false;\n const columnControl = c?.columnControl ?? false;\n return { sizeControl: !!sizeControl, columnControl };\n});\n\n/* 显式 columns 模式下渲染源不受 table.setColumn 影响,列控入口隐藏 */\nconst computedControl = computed(() =>\n hasExplicitColumns.value && resolvedControl.value.columnControl\n ? { ...resolvedControl.value, columnControl: false }\n : resolvedControl.value\n);\n\nconst columnControlConfig = computed(() => {\n const cc = computedControl.value.columnControl;\n return typeof cc === 'object' ? cc : undefined;\n});\n\n// 尺寸来源:size 模型 > provider 全局配置\nconst resolvedSize = computed(() => {\n return size.value ?? injectProps.value.size;\n});\n\nonMounted(() => {\n if (props.immediateSearch ?? injectProps.value.immediateSearch) {\n _search();\n }\n});\n\ndefineExpose({\n /** 手动触发一次查询(与内部搜索共用 loading 竞态守卫),便于外部刷新列表 */\n search: _search,\n});\n</script>\n\n<template>\n <div class=\"pro-table\" :class=\"attrs.class\" :style=\"attrs.style\">\n <ContainerFragment\n v-if=\"searchFormVisible || $slots['search-form']\"\n :component=\"computedSearchFormConfig.container\"\n >\n <slot name=\"search-form\">\n <SearchForm\n v-if=\"props.table?.searchForm\"\n :form=\"props.table.searchForm\"\n v-bind=\"searchFormProps\"\n @search=\"searchPage1st\"\n @reset=\"reset\"\n />\n </slot>\n </ContainerFragment>\n\n <ContainerFragment :component=\"computedTableContainer\">\n <div class=\"pro-table_header\">\n <div v-if=\"$slots['button-bar']\" class=\"pro-table_header_button-bar\">\n <slot name=\"button-bar\" />\n </div>\n <div v-if=\"$slots['toolbar']\" class=\"pro-table_header_toolbar\">\n <slot name=\"toolbar\" />\n </div>\n <div\n v-if=\"computedControl.sizeControl\"\n class=\"pro-table_header_size-control\"\n >\n <SizeControl v-model:size=\"size\" :effective-size=\"resolvedSize\" />\n </div>\n <div\n v-if=\"computedControl.columnControl\"\n class=\"pro-table_header_column-control\"\n >\n <ColumnControl\n :columns=\"\n normalizedRawColumns.filter(item => item.key !== '__INDEX__')\n \"\n :table=\"props.table\"\n :column-control=\"columnControlConfig\"\n />\n </div>\n </div>\n\n <slot name=\"table\">\n <ElTable\n v-loading=\"loading\"\n class=\"pro-table_content\"\n v-bind=\"computedTableProps\"\n :size=\"resolvedSize\"\n :data=\"computedDataSource\"\n >\n <TableColumnRenderer :columns=\"normalizedRawColumns\" />\n <template\n v-for=\"name in forwardedSlotNames()\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <slot :name=\"name\" v-bind=\"scoped\" />\n </template>\n </ElTable>\n </slot>\n\n <ElPagination\n v-if=\"showPagination\"\n class=\"pro-table_pagination\"\n v-bind=\"computedPagination\"\n @current-change=\"onCurrentChange\"\n @size-change=\"onSizeChange\"\n @change=\"onPaginationChange\"\n />\n </ContainerFragment>\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table {\n &_header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n &:empty {\n display: none;\n }\n\n & + &_content {\n margin-top: 16px;\n }\n\n &_button-bar {\n flex: 1;\n }\n\n &_toolbar {\n margin-left: 12px;\n }\n }\n\n &_pagination {\n justify-content: flex-end;\n padding: 16px 0;\n }\n}\n</style>\n","import {\n useTable as coreUseTable,\n type Table as _Table,\n} from '../../../shared/core';\nimport type {\n Data,\n ExtendWithAny,\n DeepPartial,\n PageParam,\n} from '../../../shared/core';\nimport type { Fields } from '../../form/types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../../form/constants';\nimport type { Column, Columns } from '../types';\nimport type { Ref } from 'vue';\n\n/**\n * 表格实例类型\n *\n * @description 在 core Table 类型的基础上,将列类型 C 绑定为本地 Column<T>,\n * 并将 dataSource 重命名为 data(Element Plus 使用 data 而非 dataSource),\n * 使 columns 操作获得 Element Plus 表格列的完整属性类型提示。\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型(一行数据的类型)\n *\n * @property columns - 列配置数组(响应式 Ref),用于渲染表格列\n * @property data - 表格数据源(响应式 Ref),对应 Element Plus Table 的 data 属性\n * @property pageParam - 分页参数(响应式 reactive),包含 current、pageSize、total\n * @property searchForm - 搜索表单实例(Form 类型),用于管理搜索区域的字段和数据\n * @property setColumn - 更新列配置,支持合并/覆盖两种模式,用法同 setField\n * @property deleteColumn - 删除列,支持路径或查找函数\n * @property appendColumn - 在指定列后追加新列,传 undefined 在末尾追加\n * @property prependColumn - 在指定列前插入新列,传 undefined 在开头插入\n * @property setPageParam - 设置分页参数,支持部分更新和函数式更新\n * @property resetQueryParams - 恢复分页与搜索条件到初始化时的快照(含自定义分页键,非固定回到第一页)\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number }\n *\n * const table: Table<SearchParams, User> = useTable({\n * columns: [{ prop: 'name', title: '姓名' }],\n * })\n *\n * table.columns.value // 访问列配置\n * table.setColumn('name', { width: 150 }) // 更新列\n * table.setPageParam({ current: 2 }) // 切换页码\n * table.searchForm.setFormData('keyword', '搜索词') // 操作搜索表单\n * ```\n *\n * @public\n */\nexport type Table<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = Omit<_Table<D, T, Column<T>>, 'dataSource'> & {\n /**\n * Element Plus 数据源(与 core 的 dataSource 对应)\n */\n data: Ref<T[]>;\n};\n\ntype UseTableParams<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = {\n /** 列配置数组 */\n columns?: Columns<T>;\n /** 数据源数组(Element Plus 使用 data 而非 dataSource) */\n data?: T[];\n /** 初始分页参数 */\n pageParam?: PageParam;\n /** 初始搜索参数 */\n searchParam?: ExtendWithAny<DeepPartial<D>>;\n /** 搜索表单字段配置 */\n searchFields?: Fields<D>;\n};\n\n/**\n * 创建表格实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useTable` 封装,适配 Element Plus 的 API 风格:\n * - 数据源使用 `data` 而非 `dataSource`\n *\n * 是 ProTable 组件的核心 Hook,提供了:\n * - 列配置管理(增删改查)\n * - 数据源管理\n * - 分页管理\n * - 搜索表单集成(内部使用 useForm)\n * - 查询参数重置\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型\n *\n * @param {object} params - 表格配置参数\n * @param {Columns<T>} [params.columns] - 初始列配置数组\n * @param {T[]} [params.data] - 初始数据源(Element Plus 风格)\n * @param {PageParam} [params.pageParam] - 初始分页参数,默认 `{ current: 1, pageSize: 10, total: 0 }`\n * @param {ExtendWithAny<DeepPartial<D>>} [params.searchParam] - 初始搜索参数\n * @param {Fields<D>} [params.searchFields] - 搜索表单字段配置\n *\n * @returns {Table<D, T>} 表格实例\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number; email: string }\n *\n * const table = useTable<SearchParams, User>({\n * columns: [\n * { prop: 'name', title: '姓名', width: 120 },\n * { prop: 'age', title: '年龄', width: 80 },\n * ],\n * data: [],\n * pageParam: { current: 1, pageSize: 20, total: 0 },\n * searchParam: { keyword: '' },\n * searchFields: [\n * { path: 'keyword', label: '关键词', component: 'input' },\n * ],\n * })\n * ```\n *\n * @see {@link coreUseTable} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useTable<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n>(params: UseTableParams<D, T> = {}): Table<D, T> {\n const { data, columns, ...rest } = params;\n const coreTable = coreUseTable<D, T, Column<T>>({\n ...rest,\n dataSource: data,\n columns: columns as any,\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n\n const { dataSource, ...tableWithoutDataSource } = coreTable as Omit<\n _Table<D, T, Column<T>>,\n 'dataSource'\n > & {\n dataSource: Ref<T[]>;\n };\n const table: Table<D, T> = {\n ...tableWithoutDataSource,\n data: dataSource,\n };\n\n return table;\n}\n","<script lang=\"ts\" setup>\n/**\n * 全局配置提供者组件\n *\n * @component ProComponentProvider\n * @public\n *\n * 用于在组件树的顶层配置所有子组件的全局默认属性。\n * 支持配置 ProForm、ProTable、ProFormItem 以及所有内置组件的默认属性。\n *\n * @param {ComponentVars} [componentVars] - 组件全局配置变量\n * @param {Record<ComponentName, any>} [componentMap] - 自定义组件映射,用于替换或扩展内置组件\n * @param {Partial<ProLocale>} [locale] - 内置文案覆盖,可覆盖任意 locale 文案(如查询/重置/序号/占位符等)\n *\n * @slot default - 需要应用全局配置的子组件内容\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider\n * :componentVars=\"{\n * 'pro-form': { grid: { gutter: 24 } },\n * 'input': { placeholder: '请输入', maxlength: 200 },\n * 'select': { placeholder: '请选择' },\n * }\"\n * >\n * <ProForm :form=\"form\" />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nimport {\n INJECT_COMPONENT_VARS,\n INJECT_COMPONENTS,\n INJECT_CONFIG,\n ensureInjectConfig,\n} from '../constants';\nimport type { ComponentVars } from '../types';\nimport { computed, provide } from 'vue';\nimport { getObject, omit } from '../../../shared/core';\nimport type { ComponentName } from '../../form/constants';\nimport { LOCALE_INJECT_KEY, type ProLocale } from '../../../locale';\n\ntype ComponentMap = Partial<Record<ComponentName, any>>;\n\ndefineOptions({\n name: 'ProComponentProvider',\n inheritAttrs: false,\n});\n\ntype Props = {\n /**\n * 组件全局配置,可配置所有内置组件和 Pro 组件的默认属性\n * @example { 'input': { placeholder: '请输入' }, 'pro-form': { grid: { gutter: 24 } } }\n */\n componentVars?: ComponentVars;\n /**\n * 自定义组件映射:用于替换或扩展内置组件,传入的组件会覆盖默认的同名组件\n * @example { 'input': MyCustomInput, 'select': MyCustomSelect }\n */\n componentMap?: ComponentMap;\n /**\n * 内置文案覆盖:可覆盖任意 locale 文案(如查询/重置/序号/占位符等),\n * 未覆盖的文案默认跟随宿主组件库语言自动切换\n * @example { 'table.query': '搜索' }\n */\n locale?: Partial<ProLocale>;\n};\n\nconst props = withDefaults(defineProps<Props>(), {\n componentVars: undefined,\n componentMap: undefined,\n locale: undefined,\n});\n\n/*\n * 遍历 componentVars 的每个 key,获取或创建对应的 inject 配置\n * 将用户提供的值合并到默认值上,剔除该注入项的不可注入键后通过 provide 响应式注入到子组件树\n * 子组件通过 inject(config.injectionKey) 获取合并后的计算属性配置\n */\n(Object.keys(INJECT_CONFIG) as Array<keyof typeof INJECT_CONFIG>).forEach(\n key => {\n const config = INJECT_CONFIG[key];\n const ignored = config.ignoreProps;\n provide(\n config.injectionKey as any,\n computed(() =>\n omit(\n {\n ...config.default,\n ...getObject(props.componentVars?.[key as keyof ComponentVars]),\n },\n ignored ?? []\n )\n )\n );\n }\n);\n\n// 为内置集合之外的 componentVars 自定义 key 补建同构注入通道\nif (props.componentVars) {\n Object.keys(props.componentVars).forEach(key => {\n if (!(key in INJECT_CONFIG)) {\n const config = ensureInjectConfig(key);\n provide(\n config.injectionKey as any,\n computed(() => ({\n ...config.default,\n ...getObject((props.componentVars as any)?.[key]),\n }))\n );\n }\n });\n}\n\n// 全量 componentVars:自定义组件键在运行期新增后同样可被子组件读取\nprovide(\n INJECT_COMPONENT_VARS,\n computed(() => (props.componentVars as Record<string, any>) ?? {})\n);\n\n// 注入自定义组件映射,BaseField 在解析组件时会优先使用此映射\nprovide(\n INJECT_COMPONENTS,\n computed(() => props.componentMap)\n);\n\n// 注入内置文案覆盖,useLocale 在解析文案时会优先使用\nprovide(\n LOCALE_INJECT_KEY,\n computed(() => props.locale)\n);\n</script>\n\n<template>\n <slot />\n</template>\n","import type { App } from 'vue';\nimport ProForm from './components/form';\nimport ProTable from './components/table';\nimport ProComponentProvider from './components/component-provider';\n\nexport * from './components/form';\nexport * from './components/table';\nexport * from './components/component-provider';\nexport * from './locale';\n\n/**\n * Schema 驱动的表单组件,基于 element-plus Form 封装\n *\n * @description 通过声明式 JSON Schema 配置即可快速生成表单,\n * 提供极致的 TypeScript 类型推导与组件库插槽扩展能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProForm, useForm } from '@qin-ui/element-plus-pro'\n * const form = useForm<User>({ name: '' }, [\n * { path: 'name', label: '姓名', component: 'input' }\n * ])\n * </script>\n * <template>\n * <ProForm :form=\"form\" />\n * </template>\n * ```\n */\nexport { ProForm };\n/**\n * Schema 驱动的表格组件,基于 element-plus Table 封装\n *\n * @description 通过声明式列配置即可生成功能完整的表格,\n * 支持列动态控制、搜索表单集成、分页管理等企业级能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProTable, useTable } from '@qin-ui/element-plus-pro'\n * const table = useTable<User>({ columns: [{ key: 'name', title: '姓名' }] })\n * </script>\n * <template>\n * <ProTable :table=\"table\" />\n * </template>\n * ```\n */\nexport { ProTable };\n/**\n * 组件提供者,用于全局配置 ProForm 和 ProTable 的默认行为\n *\n * @description 通过 `ProComponentProvider` 包裹应用根组件,\n * 可以全局覆盖组件的默认属性(如表单布局、表格尺寸等)。\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider :componentVars=\"customVars\">\n * <App />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nexport { ProComponentProvider };\n\nexport default {\n /**\n * 安装方法:全局注册 ProForm / ProTable / ProComponentProvider\n *\n * @description 供 `app.use(ProComponents)` 调用\n * @param {App} app - Vue 应用实例\n * @example\n * ```ts\n * import { createApp } from 'vue'\n * import ProComponents from '@qin-ui/element-plus-pro'\n * const app = createApp(App)\n * app.use(ProComponents)\n * ```\n */\n install(app: App) {\n app.component(ProForm.name, ProForm);\n app.component(ProTable.name, ProTable);\n app.component(\n ProComponentProvider.name ?? 'ProComponentProvider',\n ProComponentProvider\n );\n },\n};\n"],"names":["Table","Pagination","GridItem","FormItem","_createBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","$attrs","_renderSlot","_createElementBlock","_Fragment","Input","InputNumber","AutoComplete","Select","Cascader","DatePicker","TimePicker","TimeSelect","CheckboxGroup","RadioGroup","Switch","Slider","TreeSelect","Transfer","coreUseForm","zhCN","zhTW","enUS","useElLocale","ContainerFragment","_openBlock","_renderList","_withCtx","_createVNode","SlotComponent","gridItemProps","formItemProps","BaseFormItems","BaseField","ElGridItem","_unref","_useSlots","coreUseFields","coreUseFormRef","_hoisted_1","_createElementVNode","ProForm","Space","Button","_createTextVNode","_toDisplayString","_normalizeStyle","_useModel","Dropdown","DropdownMenu","DropdownItem","getColumnKey","item","Checkbox","_withModifiers","TableColumn","pageParam","_normalizeClass","$slots","_withDirectives","TableColumnRenderer","_guardReactiveProps","coreUseTable","ProComponentProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/shared/ui/index.ts","../src/components/component-provider/constants/index.ts","../src/components/form/components/ContainerFragment/index.vue","../src/components/form/components/SlotComponent/index.vue","../src/components/form/constants/index.ts","../src/components/form/hooks/useForm.ts","../src/components/form/components/BaseField/utils/index.ts","../src/components/form/utils/disabled.ts","../src/locale/zh-CN.ts","../src/locale/zh-TW.ts","../src/locale/en-US.ts","../src/locale/index.ts","../src/components/form/components/BaseField/index.vue","../src/components/form/hooks/useGroupFieldAttrs.ts","../src/components/form/components/BaseFormItem/index.vue","../src/components/form/utils/fieldKey.ts","../src/components/form/components/BaseFormItems/index.vue","../src/components/form/components/ProForm/index.vue","../src/components/form/hooks/useFields.ts","../src/components/form/hooks/useFormRef.ts","../src/components/table/components/icons/DownOutlined.vue","../src/components/table/components/SearchForm.vue","../src/components/table/components/DefaultSearchFormContainer.vue","../src/components/table/components/DefaultTableContainer.vue","../src/components/table/components/icons/ColumnHeightOutlined.vue","../src/components/table/components/SizeControl.vue","../src/components/table/components/icons/FilterOutlined.vue","../src/components/table/components/ColumnControl.vue","../src/components/table/components/TableColumnRenderer.vue","../src/components/table/components/ProTable.vue","../src/components/table/hooks/useTable.ts","../src/components/component-provider/components/index.vue","../src/index.ts"],"sourcesContent":["import {\n ElForm as Form,\n ElFormItem as FormItem,\n ElRow as Grid,\n ElCol as GridItem,\n ElTable as Table,\n ElTableColumn as TableColumn,\n ElSpace as Space,\n ElDropdown as Dropdown,\n ElDropdownMenu as DropdownMenu,\n ElDropdownItem as DropdownItem,\n ElCheckbox as Checkbox,\n ElCheckboxGroup as CheckboxGroup,\n ElButton as Button,\n ElAutocomplete as AutoComplete,\n ElCascader as Cascader,\n ElDatePicker as DatePicker,\n ElInput as Input,\n ElInputNumber as InputNumber,\n ElSelect as Select,\n ElSlider as Slider,\n ElSwitch as Switch,\n ElTransfer as Transfer,\n ElTreeSelect as TreeSelect,\n ElRadioGroup as RadioGroup,\n ElTimePicker as TimePicker,\n ElTimeSelect as TimeSelect,\n ElPagination as Pagination,\n useFormDisabled,\n useSize,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type TableProps as _TableProps,\n type TableEmits,\n type TableColumnCtx as ColumnType,\n type PaginationProps,\n type RowProps as GridProps,\n type ColProps as GridItemProps,\n} from 'element-plus';\nimport { type MaybeRefOrGetter, computed, inject, provide, toValue } from 'vue';\n\nexport {\n Form,\n FormItem,\n Grid,\n GridItem,\n Table,\n TableColumn,\n Space,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n CheckboxGroup,\n Button,\n AutoComplete,\n Cascader,\n DatePicker,\n Input,\n InputNumber,\n Select,\n Slider,\n Switch,\n Transfer,\n TreeSelect,\n RadioGroup,\n TimePicker,\n TimeSelect,\n Pagination,\n useSize,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type PaginationProps,\n type GridProps,\n type GridItemProps,\n type ColumnType,\n type TableEmits,\n};\n\n/** 宿主 Table 属性面(放宽泛型以兼容任意行数据) */\nexport type TableProps = _TableProps<any>;\n\nconst _tableProps = (Table as any).props || {};\nconst _paginationProps = (Pagination as any).props || {};\nconst _gridItemProps = (GridItem as any).props || {};\nconst _formItemProps = (FormItem as any).props || {};\n\n/** 宿主 Table 的静态 props 快照(透传键名白名单用) */\nexport const tableProps = () => _tableProps;\n/** 宿主 Pagination 的静态 props 快照(分页配置键名白名单用) */\nexport const paginationProps = () => _paginationProps;\n/** 宿主 Row/Col 的静态 props 快照 */\nexport const gridItemProps = () => _gridItemProps;\n/** 宿主 FormItem 的静态 props 快照 */\nexport const formItemProps = () => _formItemProps;\n\nconst DisabledContextKey = Symbol.for('pro-form-disabled-context');\n\n/** 禁用上下文取值\n *\n * @description 字段级禁用优先,未声明时回退宿主 `el-form` 的禁用状态\n * @returns {ComputedRef<boolean>} 当前生效的禁用状态\n */\nexport const useDisabledContext = () => {\n const formDisabled = useFormDisabled();\n const customDisabled = inject<MaybeRefOrGetter<boolean | undefined>>(\n DisabledContextKey,\n undefined\n );\n return computed(() => {\n const custom = toValue(customDisabled);\n if (custom !== undefined) return Boolean(custom);\n return Boolean(formDisabled.value);\n });\n};\n\n/** 禁用上下文提供者\n *\n * @description 与父级禁用上下文合并:未声明时保持继承,声明时(含 false)覆盖\n * @param {MaybeRefOrGetter<boolean | undefined>} disabled - 本层声明的禁用状态\n */\nexport const useDisabledContextProvider = (\n disabled: MaybeRefOrGetter<boolean | undefined>\n) => {\n // 与父级禁用上下文合并:未声明时保持继承,声明时(含 false)覆盖\n const parentDisabled = useDisabledContext();\n provide(\n DisabledContextKey,\n computed(() => toValue(disabled) ?? parentDisabled.value)\n );\n};\n\n/** {@link useDisabledContext} 的别名 */\nexport const useInjectDisabled = useDisabledContext;\n/** {@link useDisabledContextProvider} 的别名 */\nexport const useProviderDisabled = useDisabledContextProvider;\n\n/** 字段路径:字符串、数字或分段数组 */\nexport type NamePath = string | number | (string | number)[];\n","import type { RequiredComponentVars } from '../types';\nimport type { InjectionKey, Component } from 'vue';\nimport { type ComputedRef } from 'vue';\n\n/** 全量 componentVars 注入通道:运行期新增的自定义组件键由此读取(按组件名取配置) */\nexport const INJECT_COMPONENT_VARS: InjectionKey<\n ComputedRef<Record<string, any> | undefined> | Record<string, any>\n> = Symbol('COMPONENT_VARS');\n\n/** 注入项配置:注入 key、内置默认值与不可注入键清单 */\nexport type InjectConfigEntry<T = any> = {\n injectionKey: InjectionKey<T>;\n default: T;\n /** 不接受 Provider 注入的键,注入层静默剔除 */\n ignoreProps?: readonly string[];\n};\n\n/**\n * 注入项配置表:键为内置组件名与 `pro-*` 组件名,值为注入 key、内置默认值与不可注入键清单\n */\nexport const INJECT_CONFIG: {\n [key in keyof RequiredComponentVars]: InjectConfigEntry<\n RequiredComponentVars[key]\n >;\n} = {\n 'pro-table': {\n injectionKey: Symbol(''),\n // 数据取自 `:table` 实例或显式 `:data`;列与加载态非类型面成员,同样在注入层忽略\n ignoreProps: ['loading', 'columns', 'data'],\n default: {\n pagination: {\n layout: 'total, sizes, prev, pager, next, jumper',\n pageSizes: [10, 20, 30, 40, 50, 100],\n background: true,\n },\n searchFormConfig: {\n layout: 'grid',\n expand: { minExpandRows: 2, expandStatus: false },\n },\n control: true,\n addIndexColumn: true,\n },\n },\n 'pro-form': {\n injectionKey: Symbol(''),\n // 表单实例由 `:form` 显式传入;grid 仅作为启用时的参数默认值,不开启网格\n ignoreProps: ['form'],\n default: { grid: { gutter: 24 } },\n },\n 'pro-form-item': {\n injectionKey: Symbol(''),\n default: { span: 8 },\n },\n input: {\n injectionKey: Symbol(''),\n default: { maxlength: 100, clearable: true },\n },\n 'input.textarea': {\n injectionKey: Symbol(''),\n default: {\n maxlength: 200,\n autosize: { minRows: 3, maxRows: 6 },\n showWordLimit: true,\n clearable: true,\n },\n },\n 'input.password': {\n injectionKey: Symbol(''),\n default: {\n showPassword: true,\n maxlength: 100,\n clearable: true,\n },\n },\n 'input-number': {\n injectionKey: Symbol(''),\n default: {\n max: 10 ** 15 - 1,\n min: -(10 ** 15 - 1),\n controls: false,\n style: { width: '100%' },\n },\n },\n autocomplete: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n select: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n cascader: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n 'date-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.date': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.dates': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.daterange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.week': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.month': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.monthrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.months': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.yearrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.year': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.years': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarter': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarters': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.quarterrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetime': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetimerange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-select': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'checkbox-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'radio-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n switch: {\n injectionKey: Symbol(''),\n default: { modelProp: 'modelValue' },\n },\n slider: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'tree-select': {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n transfer: {\n injectionKey: Symbol(''),\n default: {},\n },\n};\n\n/** componentMap 注入 key:BaseField 解析组件时优先取用 */\nexport const INJECT_COMPONENTS: InjectionKey<\n | ComputedRef<Partial<Record<string, Component>> | undefined>\n | Partial<Record<string, Component>>\n> = Symbol('INJECT_COMPONENTS');\n\nconst DYNAMIC_INJECT_CONFIG: Record<string, InjectConfigEntry> =\n Object.create(null);\n\n/**\n * 读取注入项配置\n *\n * @param {string} key - 组件名或自定义注入键\n * @returns {InjectConfigEntry | undefined} 内置或动态注入项配置,未注册时返回 undefined\n */\nexport const getInjectConfig = (key: string): InjectConfigEntry | undefined => {\n return (\n (INJECT_CONFIG as Record<string, InjectConfigEntry>)[key] ||\n DYNAMIC_INJECT_CONFIG[key]\n );\n};\n\n/**\n * 读取注入项配置,未注册时按组件名补建动态注入项\n *\n * @param {string} key - 组件名或自定义注入键\n * @returns {InjectConfigEntry} 已存在或新建的注入项配置\n */\nexport const ensureInjectConfig = (key: string): InjectConfigEntry => {\n const existing = getInjectConfig(key);\n if (existing) return existing;\n const created: InjectConfigEntry = {\n injectionKey: Symbol(`dynamic:${key}`),\n default: {},\n };\n DYNAMIC_INJECT_CONFIG[key] = created;\n return created;\n};\n","<script lang=\"ts\" setup>\n/**\n * 容器分片渲染组件\n *\n * @component ContainerFragment\n * @description 用于动态渲染表单行或表单项的外部包裹容器(例如 Grid 行、Col 列等布局容器)\n *\n * @public\n */\nimport type { ContainerComponent } from '../../types';\n\ntype Props = {\n component?: ContainerComponent;\n};\n\ndefineProps<Props>();\n\ndefineOptions({ name: 'ContainerFragment', inheritAttrs: false });\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"component\" v-bind=\"$attrs\">\n <slot />\n </component>\n <slot v-else />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 插槽渲染辅助组件\n *\n * @component SlotComponent\n * @description 用于在表单或表格的自定义插槽中动态渲染外部传入的 VNode、渲染函数、组件定义对象或静态字符串\n *\n * @public\n */\nimport type { SlotComponentType } from '../../types';\n\ndefineOptions({ name: 'SlotComponent', inheritAttrs: false });\n\ntype Props = {\n component?: SlotComponentType;\n};\ndefineProps<Props>();\n\n/*\n * 可组件化渲染判定:VNode / 函数(含函数式组件)/ 组件定义对象\n * 其余(string/number/boolean/null/undefined)一律按文本渲染,不作为 <component :is> 的标签名解析\n */\nconst isRenderable = (c: Props['component']) =>\n c !== null &&\n c !== undefined &&\n (typeof c === 'function' || typeof c === 'object');\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"isRenderable(component)\" v-bind=\"$attrs\" />\n <template v-else>{{ component }}</template>\n</template>\n","import {\n Cascader,\n CheckboxGroup,\n DatePicker,\n AutoComplete,\n Input,\n InputNumber,\n RadioGroup,\n Select,\n Slider,\n Switch,\n TimePicker,\n TimeSelect,\n Transfer,\n TreeSelect,\n} from '../../../shared/ui';\n\n/**\n * FormItem 插槽名称列表\n * @description 用于在字段配置中透传 FormItem 的插槽(Element Plus 版本)\n */\n// prettier-ignore\nexport const FORM_ITEM_SLOT_KEYS = ['label', 'error'] as const;\n\n/**\n * 内置组件映射表\n * @description Element Plus 内置支持的组件类型映射\n */\n// prettier-ignore\nexport type BaseComponentMap = {\n 'input': typeof Input;\n 'input-number': typeof InputNumber;\n 'autocomplete': typeof AutoComplete;\n 'select': typeof Select;\n 'cascader': typeof Cascader;\n 'date-picker': typeof DatePicker;\n 'time-picker': typeof TimePicker;\n 'time-select': typeof TimeSelect;\n 'checkbox-group': typeof CheckboxGroup;\n 'radio-group': typeof RadioGroup;\n 'switch': typeof Switch;\n 'slider': typeof Slider;\n 'tree-select': typeof TreeSelect;\n 'transfer': typeof Transfer;\n}\n\n/**\n * 组件映射扩展接口\n * @description 暴露给外部扩充自定义组件类型的接口。\n * 用户可通过 TypeScript 的声明合并(module augmentation)添加自定义组件。\n *\n * @example\n * ```ts\n * declare module '@qin-ui/element-plus-pro' {\n * interface ComponentMap {\n * 'my-custom-input': typeof MyCustomInput;\n * }\n * }\n * ```\n *\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ComponentMap {}\n\n/**\n * 组件名称联合类型\n * @description 所有支持的组件名称\n *\n * @public\n */\nexport type ComponentName =\n | keyof BaseComponentMap\n | keyof ComponentMap\n | 'custom';\n\n/**\n * 根据组件名获取组件类型\n * @template K - 组件名称\n */\nexport type GetComponentType<K extends ComponentName> =\n K extends keyof ComponentMap\n ? ComponentMap[K]\n : K extends keyof BaseComponentMap\n ? BaseComponentMap[K]\n : never;\n\n/**\n * 组件名称到 Element Plus 组件的映射\n */\n// prettier-ignore\nexport const componentMap: BaseComponentMap = {\n 'input': Input,\n 'input-number': InputNumber,\n 'autocomplete': AutoComplete,\n 'select': Select,\n 'cascader': Cascader,\n 'date-picker': DatePicker,\n 'time-picker': TimePicker,\n 'time-select': TimeSelect,\n 'checkbox-group': CheckboxGroup,\n 'radio-group': RadioGroup,\n 'switch': Switch,\n 'slider': Slider,\n 'tree-select': TreeSelect,\n 'transfer': Transfer,\n}\n\n/**\n * 字段标识键序:el-form-item 的 prop 优先,path 兜底\n *\n * 与字段读写绑定、表单域标识、字段查找 API 共用同一解析入口\n */\nexport const ELEMENT_FIELD_IDENTITY_KEYS = ['prop', 'path'] as const;\n\n// inject keys\nexport { InjectionFormKey, InjectionFormSlotsKey } from '../../../shared/core';\n","import {\n useForm as coreUseForm,\n type Form as _Form,\n} from '../../../shared/core';\nimport type { Data, ExtendWithAny, DeepPartial } from '../../../shared/core';\nimport type { Field } from '../types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\nimport type { ComponentName } from '../constants';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单实例类型\n *\n * @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,\n * 将底层表单实例 I 绑定为 Element Plus 的 FormInstance,使 formRef 获得完整的类型提示。\n *\n * @template D - 表单数据类型\n * @template F - 字段配置类型,默认使用本地 Field 类型\n *\n * @property formData - 响应式表单数据对象,可直接读写,支持深层路径如 `formData.address.city`\n * @property getFormData - 获取指定路径的表单数据,支持点号分隔的深层路径,如 `getFormData('address.city')`\n * @property setFormData - 设置表单数据,支持四种调用方式:<br>\n * 1. `setFormData(path, value)` - 设置指定路径的值<br>\n * 2. `setFormData(path, prev => newVal)` - 函数式更新<br>\n * 3. `setFormData({ ... })` - 批量覆盖整个表单<br>\n * 4. `setFormData(prev => ({ ...prev, name: '新' }))` - 基于当前数据函数式批量更新\n * @property fields - 字段配置数组(响应式 Ref),ProForm 根据此数组渲染表单字段\n * @property getField - 获取字段配置,支持路径字符串(如 `'name'`)或查找函数(如 `f => f.label === '姓名'`)\n * @property setField - 更新字段配置,默认合并模式(Object.assign),可通过 `{ updateType: 'rewrite' }` 覆盖\n * @property deleteField - 删除字段配置,支持 `{ all: true }` 批量删除所有匹配项\n * @property appendField - 在指定字段后追加新字段,传 `undefined` 则在末尾追加\n * @property prependField - 在指定字段前插入新字段,传 `undefined` 则在开头插入\n * @property getParentField - 获取指定字段的父级字段配置,用于嵌套字段场景\n * @property formRef - 底层 Element Plus Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetFields()` 等方法\n * @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n * const form: Form<User> = useForm({ name: '张三', age: 25 })\n *\n * form.formData.name // 直接读写响应式数据\n * form.getFormData('name') // 通过路径读取\n * form.setFormData('name', '李四') // 更新数据\n * form.formRef.value?.validate() // 访问底层 Form 实例\n * ```\n *\n * @public\n */\nexport type Form<\n D extends Data = Data,\n F extends Field<ComponentName, D> = Field<ComponentName, D>,\n> = _Form<D, F, FormInstance>;\n\n/**\n * 创建表单实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 所有内置组件类型推导)\n * - 表单实例 -> Element Plus 的 `FormInstance`(使 formRef 获得完整的类型提示)\n *\n * 表单实例组合了三个子模块的能力:\n * - **useFormData**:表单数据管理(响应式数据、读写、批量更新)\n * - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)\n * - **useFormRef**:底层 Form 组件实例引用\n *\n * @template D - 表单数据类型\n *\n * @param {ExtendWithAny<DeepPartial<D>>} [initFormData] - 初始表单数据\n * @param {Field<ComponentName, D>[]} [initFields] - 初始字段配置数组\n * @param {boolean} [root=true] - 是否为根表单。设为 `false` 时尝试从父组件注入获取表单实例\n *\n * @returns {Form<D>} 表单实例,包含数据操作、字段操作和 ref 操作\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * // 方式一:同时传入初始数据和字段\n * const form = useForm<User>(\n * { name: '张三', age: 25 },\n * [\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ],\n * true\n * )\n *\n * // 方式二:仅设置 root 标识\n * const form = useForm<User>(true)\n *\n * // 使用\n * const { formData, formRef, fields, setFormData, getField } = form\n * setFormData('name', '李四')\n * await formRef.value?.validate()\n * ```\n *\n * @see {@link coreUseForm} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useForm<D extends Data = Data>(\n initFormData?: ExtendWithAny<DeepPartial<D>>,\n initFields?: Field<ComponentName, D>[],\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm<D extends Data = Data>(\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm(...args: any[]) {\n // root 单参重载不承载字段配置,标识键无适用对象\n if (args.length === 1 && typeof args[0] === 'boolean') {\n return coreUseForm(args[0]);\n }\n return coreUseForm(args[0], args[1], args[2], {\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n}\n","import type { Field } from '../../../types';\n\ntype LocaleT = (\n key: string,\n params?: Record<string, string | number>\n) => string;\n\n/** 单值组件的占位符对应的 locale key */\nconst PLACEHOLDER_KEYS: Record<string, string> = {\n input: 'input.placeholder',\n 'input.textarea': 'input.placeholder',\n 'input.password': 'input.placeholder',\n 'input-number': 'input.placeholder',\n autocomplete: 'input.placeholder',\n select: 'select.placeholder',\n cascader: 'select.placeholder',\n 'tree-select': 'select.placeholder',\n 'date-picker': 'date-picker.placeholder',\n 'date-picker.date': 'date-picker.placeholder',\n 'date-picker.dates': 'date-picker.placeholder',\n 'date-picker.week': 'date-picker.placeholder',\n 'date-picker.month': 'date-picker.placeholder',\n 'date-picker.months': 'date-picker.placeholder',\n 'date-picker.quarter': 'date-picker.placeholder',\n 'date-picker.quarters': 'date-picker.placeholder',\n 'date-picker.year': 'date-picker.placeholder',\n 'date-picker.years': 'date-picker.placeholder',\n 'date-picker.datetime': 'date-picker.placeholder',\n 'time-picker': 'date-picker.placeholder',\n 'time-select': 'date-picker.placeholder',\n};\n\n/** 区间组件 start/end 占位符对应的 locale key */\nconst RANGE_PLACEHOLDER_KEYS: Record<string, [string, string]> = {\n 'date-picker.daterange': ['date-picker.start', 'date-picker.end'],\n 'date-picker.monthrange': ['date-picker.startMonth', 'date-picker.endMonth'],\n 'date-picker.yearrange': ['date-picker.startYear', 'date-picker.endYear'],\n 'date-picker.quarterrange': ['date-picker.start', 'date-picker.end'],\n 'date-picker.datetimerange': ['date-picker.startTime', 'date-picker.endTime'],\n};\n\n/** 根据组件 key 兜底生成 locale 占位符;已显式设置占位符(componentVars 或字段属性)时不兜底 */\nconst getPlaceholderProps = (\n key: string,\n injectProps: Record<string, any>,\n t: LocaleT\n): Record<string, string> => {\n const rangeKeys = RANGE_PLACEHOLDER_KEYS[key];\n if (rangeKeys) {\n if (\n injectProps.startPlaceholder !== undefined ||\n injectProps.placeholder !== undefined\n )\n return {};\n return {\n startPlaceholder: t(rangeKeys[0]),\n endPlaceholder: t(rangeKeys[1]),\n };\n }\n const placeholderKey = PLACEHOLDER_KEYS[key];\n if (!placeholderKey || injectProps.placeholder !== undefined) return {};\n return { placeholder: t(placeholderKey) };\n};\n\n/**\n * 组件初始属性:以内置默认值为底,按下发组件名补默认占位符文案\n *\n * @description 占位符按 `component` 与 `type` 拼接的键查表(如 `input.password`),\n * 该键无占位符映射时回落到基础组件名;`component` 非字符串时返回空记录。\n * @param {Field} field - 字段配置\n * @param {Record<string, any>} injectProps - Provider 下发的组件默认属性\n * @param {LocaleT} t - 取文案的翻译函数\n * @returns {Record<string, any>} 组件初始属性(键值均来自注入配置与默认文案)\n */\nexport const getInitProps = (\n field: Field,\n injectProps: Record<string, any> = {},\n t: LocaleT\n): Record<string, any> => {\n const { component, type } = field as any;\n if (typeof component === 'string') {\n const subtypeKey = [component, type].filter(Boolean).join('.');\n const key =\n PLACEHOLDER_KEYS[subtypeKey] || RANGE_PLACEHOLDER_KEYS[subtypeKey]\n ? subtypeKey\n : component;\n return { ...injectProps, ...getPlaceholderProps(key, injectProps, t) };\n }\n return {};\n};\n\n/** 已告警过的未知组件名(模块级去重集合) */\nconst warnedUnknownComponents = new Set<string>();\n\n/**\n * 未识别组件名的降级告警\n *\n * @description 同一组件名仅告警一次,提示注册 componentMap 或 ProComponentProvider。\n * @param {string} name - 未识别的组件类型名\n */\nexport function warnUnknownComponent(name: string) {\n if (warnedUnknownComponents.has(name)) return;\n warnedUnknownComponents.add(name);\n console.warn(\n `[pro-components] 未识别的组件类型 \"${name}\",已降级为原生元素渲染。如为自定义组件请在 componentMap 或 ProComponentProvider 中注册。`\n );\n}\n","/**\n * 归一化禁用值\n *\n * @description 字符串形态与宿主 Boolean prop 一致:`''` 与 `disabled` 为 true,其余取真值\n * @param value - 原始禁用值\n * @returns 归一化后的布尔值\n */\nexport const normalizeDisabled = (value: unknown) =>\n value === '' || value === 'disabled' ? true : Boolean(value);\n\n/**\n * 解析显式声明的禁用值\n *\n * @description `undefined` / `null` 为未声明,返回 `undefined`;其余返回归一化结果\n * @param value - 原始禁用值\n * @returns 显式禁用值;未声明时为 `undefined`\n */\nexport const resolveDisabled = (value: unknown): boolean | undefined =>\n value === undefined || value === null ? undefined : normalizeDisabled(value);\n\n/**\n * 解析控件最终生效的禁用状态\n *\n * @description 字段显式声明(含 `false`)优先;未声明时继承外层禁用,外层为真即禁用;\n * 外层未禁用时回退 Provider 注入的组件级默认值\n * @param explicit - 字段显式声明的禁用值\n * @param inherited - 外层禁用上下文取值\n * @param fallback - Provider 注入的组件级默认禁用值\n * @returns 最终生效的禁用状态\n */\nexport const resolveEffectiveDisabled = (\n explicit: unknown,\n inherited: unknown,\n fallback: unknown\n): boolean =>\n resolveDisabled(explicit) ??\n (normalizeDisabled(inherited) || normalizeDisabled(fallback));\n","/**\n * element-plus-pro 语言包(简体中文)\n *\n * @description 在 core 通用语言包基础上,扩展 element-plus 特有的\n * 日期/时间组件占位符文案。\n */\nimport { zhCN } from '../shared/core';\n\nexport default {\n ...zhCN,\n // 日期/时间选择器占位符(对应 INJECT_CONFIG 中 date-picker.* 的占位默认值)\n 'date-picker.placeholder': '请选择',\n 'date-picker.start': '开始日期',\n 'date-picker.end': '结束日期',\n 'date-picker.startMonth': '开始月份',\n 'date-picker.endMonth': '结束月份',\n 'date-picker.startYear': '开始年份',\n 'date-picker.endYear': '结束年份',\n 'date-picker.startTime': '开始时间',\n 'date-picker.endTime': '结束时间',\n} as const;\n","/**\n * element-plus-pro 语言包(繁體中文)\n *\n * @description 在 core 通用語言包基礎上,擴展 element-plus 特有的\n * 日期/時間元件佔位符文案。\n */\nimport { zhTW } from '../shared/core';\n\nexport default {\n ...zhTW,\n // 日期/時間選擇器佔位符(對應 INJECT_CONFIG 中 date-picker.* 的佔位預設值)\n 'date-picker.placeholder': '請選擇',\n 'date-picker.start': '開始日期',\n 'date-picker.end': '結束日期',\n 'date-picker.startMonth': '開始月份',\n 'date-picker.endMonth': '結束月份',\n 'date-picker.startYear': '開始年份',\n 'date-picker.endYear': '結束年份',\n 'date-picker.startTime': '開始時間',\n 'date-picker.endTime': '結束時間',\n} as const;\n","/**\n * element-plus-pro language pack (English)\n *\n * @description Extends the core language pack with element-plus specific\n * date/time picker placeholder texts.\n */\nimport { enUS } from '../shared/core';\n\nexport default {\n ...enUS,\n // Date/time picker placeholders (defaults of date-picker.* in INJECT_CONFIG)\n 'date-picker.placeholder': 'Please select',\n 'date-picker.start': 'Start date',\n 'date-picker.end': 'End date',\n 'date-picker.startMonth': 'Start month',\n 'date-picker.endMonth': 'End month',\n 'date-picker.startYear': 'Start year',\n 'date-picker.endYear': 'End year',\n 'date-picker.startTime': 'Start time',\n 'date-picker.endTime': 'End time',\n} as const;\n","/**\n * element-plus-pro locale 模块\n *\n * @description 提供 useLocale 组合式函数与语言包。\n * 语言自动跟随宿主应用的 element-plus `el-config-provider` locale 切换,\n * 也可通过 ProComponentProvider 的 `locale` prop 覆盖任意文案。\n */\nimport {\n computed,\n inject,\n toValue,\n type InjectionKey,\n type MaybeRef,\n} from 'vue';\nimport { useLocale as useElLocale, localeContextKey } from 'element-plus';\nimport { format, resolveLocaleName, type ProLocaleName } from '../shared/core';\nimport zhCN from './zh-CN';\nimport zhTW from './zh-TW';\nimport enUS from './en-US';\n\nexport { zhCN, zhTW, enUS };\n\n/** 内置文案类型:键集合与 zh-CN 对齐,取值允许任意文案覆盖 */\nexport type ProLocale = Record<keyof typeof zhCN, string>;\n\n/** ProComponentProvider 通过该 key 注入局部覆盖文案 */\nexport const LOCALE_INJECT_KEY: InjectionKey<\n MaybeRef<Partial<ProLocale> | undefined>\n> = Symbol('pro-locale');\n\n/**\n * 获取响应式 locale 文案\n *\n * @description 返回 `t` 翻译函数与当前语言名。\n * `t` 在 computed / 模板中调用时会随宿主语言切换自动更新。\n *\n * @returns\n * - `t(key, params?)` - 翻译函数,支持 `{placeholder}` 参数\n * - `lang` - 当前解析出的语言名('zh-CN' | 'zh-TW' | 'en-US')\n *\n * @example\n * ```ts\n * const { t } = useLocale();\n * t('table.query') // '查询' / '查詢' / 'Search'\n * t('pagination.total', { total: 100 }) // '共 100 条'\n * ```\n */\nexport const useLocale = () => {\n const elLocaleContext = inject(localeContextKey, undefined);\n const { lang: elLang } = useElLocale();\n const override = inject(LOCALE_INJECT_KEY, undefined);\n\n const lang = computed<ProLocaleName>(() => {\n // 注入上下文为 computed/ref 包装,按取值本体判定宿主是否提供语言\n if (toValue(elLocaleContext) == null) return 'zh-CN';\n return resolveLocaleName(elLang.value);\n });\n const pack = computed<Record<string, string>>(() =>\n lang.value === 'zh-TW' ? zhTW : lang.value === 'en-US' ? enUS : zhCN\n );\n\n const t = (key: string, params?: Record<string, string | number>): string => {\n const overrides = toValue(override) as Record<string, string> | undefined;\n const text =\n overrides?.[key] ?? (pack.value as Record<string, string>)[key] ?? key;\n return format(text, params);\n };\n\n return { t, lang };\n};\n","<script lang=\"ts\" setup>\n/**\n * 字段级渲染组件\n *\n * @component BaseField\n * @description 负责将 field 配置渲染为实际的输入组件\n *\n * ## 核心职责\n *\n * 1. **组件解析**:按优先级解析要渲染的组件(teleport 插槽 > 自定义组件 > 内置组件映射 > 原始值)\n * 2. **v-model 双向绑定**:通过 computed getter/setter 将组件值与 formData 的深层路径绑定\n * 3. **valueFormatter 处理**:支持 get/set 格式化函数,用于数据转换(如日期格式化)\n * 4. **属性合并**:将注入的默认 props、组件传入的 attrs 合并为最终属性\n *\n * ## 组件解析优先级\n *\n * ```\n * teleport 组件(ProForm 插槽注入)\n * ↓ 未匹配\n * 自定义组件(ProComponentProvider 的 componentMap)\n * ↓ 未匹配\n * 内置组件映射(componentMap: input → Input, select → Select ...)\n * ↓ 未匹配\n * 原始 component 值(可能是字符串或 Vue 组件对象)\n * ```\n *\n * @param {string | Component} [component] - 组件名或组件对象\n * @param {string} [path] - 字段路径,用于绑定表单数据\n *\n * @slot default - 默认插槽(透传给组件)\n */\nimport {\n type Component,\n computed,\n inject,\n mergeProps,\n ref,\n toValue,\n} from 'vue';\nimport {\n cloneDeep,\n getObject,\n omitBy,\n useReactiveAttrs,\n} from '../../../../shared/core';\nimport { useDisabledContext } from '../../../../shared/ui';\nimport type { Field } from '../../types';\nimport ContainerFragment from '../ContainerFragment/index.vue';\nimport SlotComponent from '../SlotComponent/index.vue';\nimport { componentMap, InjectionFormSlotsKey } from '../../constants';\nimport {\n INJECT_COMPONENT_VARS,\n INJECT_COMPONENTS,\n getInjectConfig,\n} from '../../../component-provider/constants';\nimport { useForm } from '../../hooks/useForm';\nimport { getInitProps, warnUnknownComponent } from './utils';\nimport { resolveEffectiveDisabled } from '../../utils/disabled';\nimport { useLocale } from '../../../../locale';\n\nconst cloneDeepIfObject = (val: unknown) =>\n // 原始值直接传递,引用值克隆快照\n typeof val === 'object' && val !== null ? cloneDeep(val) : val;\n\ndefineOptions({ name: 'BaseField', inheritAttrs: false });\n\ntype Props = {\n component?: string | Component;\n path?: string;\n};\nconst props = withDefaults(defineProps<Props>(), {\n component: undefined,\n path: '',\n});\n\nconst { t } = useLocale();\n\nconst form = useForm(false);\n\nconst componentRef = ref<any>();\n\nconst attrs: any = useReactiveAttrs();\n\n/**\n * 全局默认配置注入:按组件名与 type 修饰段分别解析注入通道,inject 须在 setup 同步期调用。\n * 组件名与 `type` 仅取 setup 期初始值——运行期变更不会切换 Provider 的默认值预设\n * (`date-picker.month` 等子类型预设需在初始渲染前确定)。\n * `date-picker` 的 type 缺省时按 `date` 段解析子类型预设。\n */\nconst typeVal = attrs.type;\nconst baseConfigKey =\n typeof props.component === 'string' ? props.component : '';\nconst typeConfigKey =\n typeVal || (baseConfigKey === 'date-picker' ? 'date' : '');\nconst subtypeConfigKey =\n baseConfigKey && typeConfigKey ? `${baseConfigKey}.${typeConfigKey}` : '';\nconst baseInjectConfig = baseConfigKey\n ? getInjectConfig(baseConfigKey)\n : undefined;\nconst subtypeInjectConfig = subtypeConfigKey\n ? getInjectConfig(subtypeConfigKey)\n : undefined;\n// 全量 componentVars:运行期新增的自定义组件键由此兜底读取\nconst componentVars = inject(INJECT_COMPONENT_VARS, undefined);\n\n// setter: 向 formData 写入值,支持 valueFormatter / valueFormatter.set 转换\nconst value = computed({\n get() {\n let val = form.getFormData?.(props.path);\n const { valueFormatter } = groupedAttrs.value;\n if (\n typeof valueFormatter === 'object' &&\n typeof valueFormatter.get === 'function'\n ) {\n val = valueFormatter.get(val);\n }\n return val;\n },\n set(val) {\n let newVal = val;\n const { valueFormatter } = groupedAttrs.value;\n const setFormatter =\n typeof valueFormatter === 'function'\n ? valueFormatter\n : typeof valueFormatter === 'object' &&\n typeof valueFormatter?.set === 'function'\n ? valueFormatter.set\n : undefined;\n\n if (setFormatter) {\n // 仅当 set 转换函数需要旧值参数时,才获取旧值上下文\n const oldVal =\n setFormatter.length > 1\n ? cloneDeepIfObject(form.getFormData?.(props.path))\n : undefined;\n newVal = setFormatter(val, oldVal);\n }\n form.setFormData?.(props.path, newVal);\n // 字段配置/attrs 传入的 onUpdate:* 监听器与内部写值组合回放,参数为组件原始 emit 值\n const { onUpdateValue } = groupedAttrs.value;\n if (typeof onUpdateValue === 'function') {\n onUpdateValue(val);\n } else if (Array.isArray(onUpdateValue)) {\n onUpdateValue.forEach(listener => listener(val));\n }\n },\n});\n\nconst parentDisabled = useDisabledContext();\n\n/*\n * 将注入的默认 props、外部传入的 attrs、field 配置合并为最终属性\n * 属性分为三类:绑定属性(v-model)、组件属性(传递给组件)、插槽(动态渲染)\n */\nconst groupedAttrs = computed(() => {\n // 库内置默认(基础键 → 子类型键)之后再铺项目配置,项目配置始终覆盖库默认\n const currentInjectProps = {\n ...getObject(baseInjectConfig?.default),\n ...getObject(subtypeInjectConfig?.default),\n ...getObject(toValue(componentVars)?.[baseConfigKey]),\n ...getObject(toValue(componentVars)?.[subtypeConfigKey]),\n };\n const initProps = getInitProps(\n {\n component: props.component,\n type: attrs.type,\n } as unknown as Field,\n currentInjectProps,\n t\n );\n const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';\n const effectiveDisabled = resolveEffectiveDisabled(\n attrs.disabled,\n parentDisabled.value,\n initProps.disabled\n );\n const mergedProps = mergeProps(\n initProps,\n // 未赋值(undefined)的键不作为显式值下发,保留注入默认值与占位符兜底\n omitBy(attrs, value => value === undefined),\n { class: attrs.componentClass, style: attrs.componentStyle },\n { disabled: effectiveDisabled },\n { modelProp: modelPropName }\n ) as Required<Field>;\n\n // prettier-ignore\n const { valueFormatter, modelProp, slots, componentClass, componentStyle, componentContainer, [modelPropName]: _modelVal, [`onUpdate:${modelPropName}`]: onUpdateValue, ...bindAttrs } = mergedProps as any;\n\n return {\n attrs: bindAttrs,\n slots,\n componentContainer,\n modelProp: modelPropName,\n valueFormatter,\n onUpdateValue,\n };\n});\n\n// 从 ProForm 插槽注入的 slots 集合(优先级最高)\nconst injectedFormSlots = inject(InjectionFormSlotsKey, undefined);\n\n// 从 ProComponentProvider 注入的自定义组件映射\nconst customComponents = inject(INJECT_COMPONENTS, {});\n\n/*\n * 按优先级解析最终要渲染的组件:\n * ProForm 插槽 → 自定义组件映射 → 内置组件映射 → 原始 component 值\n */\nconst is = computed(() => {\n const teleportSlot = props.path && injectedFormSlots?.value?.[props.path];\n if (teleportSlot) return teleportSlot;\n if (typeof props.component === 'string') {\n const resolved =\n toValue(customComponents as any)?.[props.component] ||\n (componentMap as any)[props.component];\n if (resolved) return resolved;\n warnUnknownComponent(props.component);\n return props.component;\n }\n return props.component;\n});\n\ndefineExpose({\n getComponentRef: () => componentRef.value,\n getComponentComputedProps: () => groupedAttrs.value.attrs as any,\n});\n</script>\n\n<template>\n <ContainerFragment\n :component=\"groupedAttrs.componentContainer\"\n :path=\"props.path\"\n >\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\n :path=\"props.path\"\n >\n <template\n v-for=\"(slot, name) in groupedAttrs.slots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent :path=\"props.path\" v-bind=\"scoped\" :component=\"slot\" />\n </template>\n </component>\n </ContainerFragment>\n</template>\n","import {\n computed,\n inject,\n mergeProps,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from 'vue';\nimport {\n formItemProps,\n gridItemProps,\n type FormItemProps,\n type GridItemProps,\n} from '../../../shared/ui';\nimport { isPlainObject, resolveFieldIdentity } from '../../../shared/core';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport { ELEMENT_FIELD_IDENTITY_KEYS, FORM_ITEM_SLOT_KEYS } from '../constants';\nimport type { Base, Field } from '../types';\n\nconst formItemPropKeys = Object.keys(formItemProps());\nconst gridItemPropKeys = Object.keys(gridItemProps());\nconst gridItemPropKeySet = new Set<string>(gridItemPropKeys);\nconst formItemPropKeySet = new Set<string>(formItemPropKeys);\nconst formItemSlotKeySet = new Set<string>(FORM_ITEM_SLOT_KEYS);\n\n/** 单个字段的分组结果:栅格 / FormItem / 组件属性与插槽 */\nexport interface GroupedField {\n path: string;\n gridItemProps: GridItemProps;\n formItemProps: FormItemProps;\n formItemSlots: Record<(typeof FORM_ITEM_SLOT_KEYS)[number], any>;\n componentProps: Record<string, any>;\n container?: Base['formItemContainer'];\n rawField: Field;\n}\n\n/** 将单个字段配置拆分为 grid / formItem / component / slots 分组 */\nconst groupField = (\n field: Field,\n rawInjectProps: Record<string, any>\n): GroupedField => {\n let gridItemProps: Record<string, any> = {};\n let formItemProps: Record<string, any> = {};\n const componentProps: Record<string, any> = { slots: {} };\n const formItemSlots: Record<string, any> = {};\n\n if (isPlainObject(field)) {\n // prettier-ignore\n const { path: _path, prop: _prop, fields, formItemClass, formItemStyle, formItemContainer, hidden, span, getFormItemRef, getComponentRef, getFormItemComputedProps, getComponentComputedProps, slots = {}, formItemDataAttrs = {}, componentDataAttrs = {}, extraProps, ...rest } =\n field as any;\n\n // prettier-ignore\n const { class: injectClassName, style: injectStyle, span: injectSpan, formItemContainer: injectFormItemContainer, xs, sm, md, lg, xl, ...injectRest } = rawInjectProps;\n\n /*\n * 字段显式指定 span 时整体接管栅格,不再叠加注入的响应式断点;\n * 未指定 span 时使用注入的断点配置\n */\n const initGridItemProps =\n span || span === 0 ? { span } : { xs, sm, md, lg, xl, span: injectSpan };\n\n // 分组字段未指定 span 时整行渲染(span 兜底 24),注入的响应式断点保持生效\n gridItemProps = fields\n ? { ...initGridItemProps, span: span ?? 24 }\n : initGridItemProps;\n formItemProps = mergeProps(\n injectRest as any,\n { class: injectClassName, style: injectStyle },\n { class: toValue(formItemClass), style: toValue(formItemStyle) },\n formItemDataAttrs\n );\n // 字段级容器优先,回退注入级配置\n const container = formItemContainer ?? injectFormItemContainer;\n\n Object.keys(rest).forEach(k => {\n if (gridItemPropKeySet.has(k)) {\n gridItemProps[k] = rest[k];\n } else if (formItemPropKeySet.has(k)) {\n (formItemProps as any)[k] = rest[k];\n } else {\n componentProps[k] = rest[k];\n }\n });\n\n Object.assign(componentProps, componentDataAttrs);\n Object.keys(slots).forEach(k => {\n if (formItemSlotKeySet.has(k)) {\n formItemSlots[k] = slots[k];\n } else {\n componentProps.slots[k] = slots[k];\n }\n });\n\n // 字段标识经统一解析(prop 优先,path 兜底);name 作为控件自身属性经 rest 透传\n return {\n path: resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS),\n gridItemProps: gridItemProps as GridItemProps,\n formItemProps: formItemProps as any,\n formItemSlots,\n componentProps,\n container,\n rawField: field,\n };\n }\n\n return {\n path: resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS),\n gridItemProps: gridItemProps as GridItemProps,\n formItemProps: formItemProps as any,\n formItemSlots,\n componentProps,\n rawField: field,\n };\n};\n\n/**\n * 将 fields 配置数组逐个拆分为 grid / formItem / component / slots 分组。\n *\n * @description\n * 1. 响应式集成 ProComponentProvider 的 `pro-form-item` 全局变量配置;\n * 2. 剥离 `extraProps`(用户自定义字段标识袋):保留在字段原始对象上供业务层存取,渲染层经解构剥离,不落入 componentProps 透传。\n *\n * @param {ComputedRef<Field[]>} validFields - 已过滤的字段配置数组\n * @returns {ComputedRef<GroupedField[]>} 分组后的字段属性数组\n */\nexport function useGroupFieldAttrs(validFields: ComputedRef<Field[]>) {\n const config = INJECT_CONFIG['pro-form-item'];\n const injectFormItemProps = inject(config.injectionKey, config.default);\n\n return computed<GroupedField[]>(() => {\n const rawInjectProps = toValue(injectFormItemProps) || {};\n return validFields.value.map(field => groupField(field, rawInjectProps));\n });\n}\n\n/**\n * 将单个字段配置拆分为 grid / formItem / component / slots 分组\n *\n * @description 拆分规则与 `useGroupFieldAttrs` 一致,结果依赖该字段自身配置与 Provider 的 `pro-form-item` 默认值。\n *\n * @param {MaybeRefOrGetter<Field>} field - 待拆分的字段配置\n * @returns {ComputedRef<GroupedField>} 单字段渲染分组\n */\nexport function useGroupedField(field: MaybeRefOrGetter<Field>) {\n const config = INJECT_CONFIG['pro-form-item'];\n const injectFormItemProps = inject(config.injectionKey, config.default);\n\n return computed<GroupedField>(() =>\n groupField(toValue(field), toValue(injectFormItemProps) || {})\n );\n}\n","<script lang=\"ts\">\n/**\n * 单字段行渲染组件\n *\n * @component BaseFormItem\n *\n * 将单个字段配置渲染为栅格项、FormItem 与控件,支持:\n * - 字段属性分流(grid / formItem / component / slots)\n * - 嵌套字段递归渲染(交由 BaseFormItems)\n * - FormItem / 控件实例登记\n *\n * @param {Field} field - 字段配置\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 上层下发的禁用状态\n * @param {Function} [setFormItemRef] - FormItem 实例登记回调\n * @param {Function} [setComponentRef] - 控件实例登记回调\n *\n * @internal\n */\nimport {\n computed,\n defineComponent,\n h,\n toValue,\n watch,\n type PropType,\n type VNode,\n} from 'vue';\nimport { normalizePathKey } from '../../../../shared/core';\nimport { FormItem, GridItem as ElGridItem } from '../../../../shared/ui';\nimport type { Field, Grid } from '../../types';\nimport BaseField from '../BaseField/index.vue';\nimport BaseFormItems from '../BaseFormItems/index.vue';\nimport SlotComponent from '../SlotComponent/index.vue';\nimport {\n useGroupedField,\n type GroupedField,\n} from '../../hooks/useGroupFieldAttrs';\n\nexport default defineComponent({\n name: 'BaseFormItem',\n inheritAttrs: false,\n props: {\n /** 字段配置 */\n field: { type: Object as PropType<Field>, required: true },\n /** 是否启用网格布局 */\n grid: {\n type: [Boolean, Object] as PropType<Grid>,\n default: undefined,\n },\n /** 上层下发的禁用状态 */\n disabled: { type: Boolean, default: undefined },\n /** FormItem 实例登记回调 */\n setFormItemRef: {\n type: Function as PropType<\n (field: Field, el: any, getFormItemProps: () => any) => void\n >,\n default: undefined,\n },\n /** 控件实例登记回调 */\n setComponentRef: {\n type: Function as PropType<(field: Field, el: any) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const grouped = useGroupedField(() => props.field);\n const enableGrid = computed(() => !!props.grid);\n\n // 控件级配置身份:字符串组件名 + type 段;组件对象无 Provider 配置,使用固定值\n const componentKey = computed(() => {\n const field = props.field as any;\n const component = toValue(field.component);\n if (typeof component !== 'string') return 'component-object';\n return `string:${component}:${toValue(field.type) ?? ''}`;\n });\n const effectiveDisabled = computed(\n () => toValue(props.field.disabled) ?? props.disabled\n );\n\n const setItemRef = (el: any) => {\n props.setFormItemRef?.(\n props.field,\n el,\n () => grouped.value.formItemProps\n );\n };\n\n const setFieldRef = (el: any) => {\n props.setComponentRef?.(props.field, el);\n };\n\n // 字段对象变化后,实例访问器归属当前字段\n watch(\n () => props.field,\n (next, prev) => {\n if (!prev || prev === next) return;\n props.setFormItemRef?.(prev, null, () => grouped.value.formItemProps);\n props.setComponentRef?.(prev, null);\n },\n { flush: 'pre' }\n );\n\n /** 按容器组件逐层包裹当前节点 */\n const withContainer = (\n node: VNode,\n component: any,\n containerProps: Record<string, any>\n ): VNode =>\n component ? h(component, containerProps, { default: () => node }) : node;\n\n /** 组装 FormItem 的动态插槽与默认插槽 */\n const renderFormItemSlots = (groupedField: GroupedField) => {\n const slots: Record<string, any> = {};\n Object.entries(groupedField.formItemSlots).forEach(([name, slot]) => {\n slots[name] = (scope?: Record<string, any>) =>\n h(SlotComponent as any, {\n path: groupedField.path,\n component: slot,\n ...(scope || {}),\n });\n });\n\n slots.default = () => {\n const field = props.field as any;\n if (field.fields) {\n return h(BaseFormItems as any, {\n grid: field.grid ?? props.grid,\n fields: field.fields,\n disabled: effectiveDisabled.value,\n });\n }\n return h(BaseField as any, {\n key: componentKey.value,\n ref: setFieldRef,\n ...groupedField.componentProps,\n path: groupedField.path,\n disabled: effectiveDisabled.value,\n });\n };\n return slots;\n };\n\n return () => {\n const groupedField = grouped.value;\n let node: VNode = h(\n FormItem as any,\n {\n ...groupedField.formItemProps,\n ref: setItemRef,\n prop: normalizePathKey(groupedField.path),\n path: groupedField.path,\n },\n renderFormItemSlots(groupedField)\n );\n node = withContainer(node, groupedField.container, {\n path: groupedField.path,\n });\n node = withContainer(\n node,\n enableGrid.value ? ElGridItem : undefined,\n groupedField.gridItemProps\n );\n return node;\n };\n },\n});\n</script>\n\n<style scoped lang=\"less\">\n/* 分组字段的嵌套 FormItem 间距 */\n[class*='-form-item'] [class*='-form-item'] {\n margin-bottom: 18px;\n}\n</style>\n","import { toRaw } from 'vue';\nimport { resolveFieldIdentity, toPath } from '../../../shared/core';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\n\nconst fieldKeyMap = new WeakMap<object, number>();\nlet fieldKeySeed = 0;\n\n/**\n * 字段渲染 key\n *\n * @description 以 `toRaw(field)` 为键在模块级 WeakMap 中缓存自增编号,同一字段对象恒得同一 key:\n * key 与字段在数组中的位置解耦,字段插入 / 删除 / 重排 / 过滤后仍与对象绑定;同 `path` 的兄弟字段各得其唯一 key。\n * 非对象项无对象身份,按字面量生成稳定 key;渲染路径传入的字段项已由调用方过滤为非 null 对象,\n * 该分支供本模块的直接调用者使用\n *\n * @param field - 字段配置项\n * @returns 字段渲染 key\n */\nexport const getFieldKey = (field: unknown): string | number => {\n if (field === null || typeof field !== 'object')\n return `raw_${String(field)}`;\n const raw = toRaw(field);\n let key = fieldKeyMap.get(raw);\n if (key === undefined) {\n key = ++fieldKeySeed;\n fieldKeyMap.set(raw, key);\n }\n return key;\n};\n\n/** 数据行对象身份编号 */\nconst rowKeyMap = new WeakMap<object, number>();\nlet rowKeySeed = 0;\n\nconst getRowKey = (row: object) => {\n const raw = toRaw(row);\n let key = rowKeyMap.get(raw);\n if (key === undefined) {\n key = ++rowKeySeed;\n rowKeyMap.set(raw, key);\n }\n return key;\n};\n\n/** 数组下标段判定:仅十进制非负整数段按数组下标处理 */\nconst isIndexSegment = (segment: string) => /^(?:0|[1-9]\\d*)$/.test(segment);\n\n/**\n * 字段的数据行渲染 key\n *\n * @description 沿字段路径逐段解析原始表单数据,取路径经过的对象数组行元素身份与行内剩余路径组成 key;\n * 同一数据行对象在数组增删 / 重排后恒得同一 key。路径不经过对象数组行、行元素为原始值或数据缺失时,\n * 回退到 {@link getFieldKey} 的字段对象身份。同 key 的去重由调用方按兄弟列表收敛。\n *\n * @param field - 字段配置项\n * @param rawFormData - 原始表单数据(非响应式对象)\n * @returns 数据行 key;无法定位数据行时返回字段对象身份 key\n */\nexport const getFieldDataKey = (\n field: unknown,\n rawFormData: unknown\n): string | number => {\n const path = resolveFieldIdentity(field, ELEMENT_FIELD_IDENTITY_KEYS);\n if (!path || rawFormData === null || rawFormData === undefined) {\n return getFieldKey(field);\n }\n\n const segments = toPath(path);\n let node: any = rawFormData;\n const rowIds: number[] = [];\n let lastRowIndex = -1;\n\n for (let i = 0; i < segments.length; i++) {\n if (Array.isArray(node)) {\n const segment = segments[i];\n if (!isIndexSegment(segment)) break;\n const element = node[Number(segment)];\n if (element === null || typeof element !== 'object') break;\n rowIds.push(getRowKey(toRaw(element) as object));\n lastRowIndex = i;\n node = element;\n continue;\n }\n if (node === null || typeof node !== 'object') break;\n node = node[segments[i]];\n }\n\n if (lastRowIndex === -1) return getFieldKey(field);\n const rest = segments.slice(lastRowIndex + 1).join('.');\n return `data:${rowIds.join('/')}:${rest}`;\n};\n","<script lang=\"ts\" setup>\n/**\n * 表单字段渲染引擎\n *\n * @component BaseFormItems\n *\n * 负责将字段配置数组渲染为实际的表单项,支持:\n * - 字段分组(嵌套 fields 递归渲染,嵌套字段 path 须为完整点分路径)\n * - 网格布局(grid 属性控制)\n * - FormItem 包装(label、rules、校验等)\n * - 组件绑定(通过 BaseField 渲染具体组件)\n * - 插槽透传(label、error 等 FormItem 插槽)\n *\n * ## 渲染流程\n *\n * 1. 遍历 fields 数组,过滤 hidden 字段\n * 2. 每个字段交由 BaseFormItem 拆分为 GridItem / FormItem / 组件 / 插槽并渲染\n * 3. 嵌套 fields 递归渲染下一层 BaseFormItems\n * 4. 渲染后字段对象上可读取 FormItem 与组件实例\n *\n * @param {Fields} [fields] - 字段配置数组\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 是否禁用所有子字段\n *\n * @internal\n */\nimport {\n InjectionFormKey,\n getObject,\n isObjectItem,\n} from '../../../../shared/core';\nimport type { GridProps } from '../../../../shared/ui';\nimport { Grid as ElGrid, useProviderDisabled } from '../../../../shared/ui';\nimport { computed, inject, toRaw, toValue } from 'vue';\nimport type { Fields, Grid } from '../../types';\nimport BaseFormItem from '../BaseFormItem/index.vue';\nimport { getFieldDataKey } from '../../utils/fieldKey';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\n\ndefineOptions({ name: 'BaseFormItems', inheritAttrs: false });\n\ntype Props = {\n grid?: Grid;\n fields?: Fields;\n disabled?: boolean;\n};\nconst props = withDefaults(defineProps<Props>(), {\n grid: undefined,\n fields: () => [],\n disabled: undefined,\n});\n\n// 分组字段的禁用状态向下注入,供 BaseField 经禁用上下文消费\nuseProviderDisabled(computed(() => props.disabled));\n\nconst validFields = computed(() =>\n // hidden 支持 Ref / ComputedRef 响应式形态(统一使用 toValue 取值)\n (props.fields ?? []).filter(\n field => isObjectItem(field) && !toValue((field as any).hidden)\n )\n);\n\n// 数组行按数据对象身份派生 key,字段配置重建后行实例保持复用\nconst injectedForm = inject(InjectionFormKey, undefined) as any;\nconst renderedFields = computed(() => {\n const rawFormData = injectedForm?.formData\n ? toRaw(injectedForm.formData)\n : undefined;\n const seen = new Map<string | number, number>();\n return validFields.value.map(field => {\n const baseKey = getFieldDataKey(field, rawFormData);\n const count = seen.get(baseKey) ?? 0;\n seen.set(baseKey, count + 1);\n return {\n field,\n key: count === 0 ? baseKey : `${String(baseKey)}#${count}`,\n };\n });\n});\n\nconst config = INJECT_CONFIG['pro-form'];\nconst injectFormConfig = inject(config.injectionKey, config.default);\nconst injectGrid = computed(() => toValue(injectFormConfig)?.grid);\n\nconst enableGrid = computed(() => !!props.grid);\n\nconst computedGridProps = computed<GridProps>(() => {\n return enableGrid.value\n ? { ...getObject(injectGrid.value), ...getObject(props.grid) }\n : {};\n});\n\n/**\n * 以字段原始对象为 key 登记 FormItem / 控件实例,供 getFormItemRef / getComponentRef 读取;\n * 字段对象被回收后对应条目不再可读。\n */\nconst formItemInstanceMap = new WeakMap<object, any>();\nconst componentInstanceMap = new WeakMap<object, any>();\n\n/** 已告警过的字段对象(不可写场景去重) */\nconst warnedFrozenFields = new WeakSet<object>();\nconst defineFieldAccessors = (\n raw: object,\n accessors: Record<string, () => any>\n) => {\n try {\n for (const [key, getter] of Object.entries(accessors)) {\n // 访问器仅用于字段对象读取,不参与属性遍历与字段配置透传\n Object.defineProperty(raw, key, {\n value: getter,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n } catch {\n if (!warnedFrozenFields.has(raw)) {\n warnedFrozenFields.add(raw);\n console.warn(\n '[pro-components] 字段配置对象不可写(如被 Object.freeze),getFormItemRef / getComponentRef 等实例访问器挂载失败。'\n );\n }\n }\n};\n\nconst setFormItemRef = (field: any, el: any, getFormItemProps: () => any) => {\n if (!field || typeof field !== 'object') return;\n const raw = toRaw(field);\n if (el) {\n formItemInstanceMap.set(raw, el);\n defineFieldAccessors(raw, {\n getFormItemRef: () => formItemInstanceMap.get(raw),\n getFormItemComputedProps: getFormItemProps,\n });\n } else {\n formItemInstanceMap.delete(raw);\n delete raw.getFormItemRef;\n delete raw.getFormItemComputedProps;\n }\n};\n\nconst setComponentRef = (field: any, el: any) => {\n if (!field || typeof field !== 'object') return;\n const raw = toRaw(field);\n if (el) {\n componentInstanceMap.set(raw, el);\n defineFieldAccessors(raw, {\n getComponentRef: () => componentInstanceMap.get(raw)?.getComponentRef(),\n getComponentComputedProps: () =>\n componentInstanceMap.get(raw)?.getComponentComputedProps(),\n });\n } else {\n componentInstanceMap.delete(raw);\n delete raw.getComponentRef;\n delete raw.getComponentComputedProps;\n }\n};\n</script>\n\n<template>\n <ElGrid v-if=\"enableGrid\" v-bind=\"computedGridProps\" style=\"width: 100%\">\n <BaseFormItem\n v-for=\"item of renderedFields\"\n :key=\"item.key\"\n :field=\"item.field\"\n :grid=\"props.grid\"\n :disabled=\"props.disabled\"\n :set-form-item-ref=\"setFormItemRef\"\n :set-component-ref=\"setComponentRef\"\n />\n </ElGrid>\n <template v-else>\n <BaseFormItem\n v-for=\"item of renderedFields\"\n :key=\"item.key\"\n :field=\"item.field\"\n :grid=\"props.grid\"\n :disabled=\"props.disabled\"\n :set-form-item-ref=\"setFormItemRef\"\n :set-component-ref=\"setComponentRef\"\n />\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"F extends Form<any> = Form\">\n/**\n * 配置驱动表单组件\n *\n * @component ProForm\n *\n * 架构设计说明 (Architecture Overview)\n *\n * [ 数据层 (Core) ] => [ 绑定层 (ProForm) ] => [ 渲染层 (BaseFormItems / BaseFormItem / BaseField) ]\n *\n * 1. 数据隔离:ProForm 本身不负责存储和管理表单状态,所有核心状态(formData, fields, 校验规则)\n * 均交由底层的 `useForm`(@qin-ui/pro-components-core)驱动。\n * 2. 上下文透传:通过 `provide` 将核心状态下发给子组件。\n * 3. 递归渲染:网格布局和具体字段的解析交由 `<BaseFormItems>` 递归完成。\n *\n * @public\n *\n * 通过配置驱动的方式快速构建表单,支持:\n * - 字段联动(通过 setField、watch 等实现)\n * - 嵌套字段(通过 fields 递归配置)\n * - 自定义组件(通过 component 属性和 custom 类型)\n * - 网格布局(通过 grid 属性)\n * - 动态插槽(以字段 path 命名的插槽)\n * - 全局配置注入(通过 ProComponentProvider)\n *\n * @template F - 表单实例类型\n *\n * @param {F} [form] - useForm 返回的表单实例\n * @param {boolean | GridProps} [grid] - 是否启用网格布局,默认关闭;Provider 的 `grid` 仅作为启用时的参数配置\n * @param {...FormProps} ...attrs - Element Plus Form 组件的其他属性\n *\n * @slot default - 默认插槽,可用于添加额外内容\n * @slot [path] - 以字段 path 命名的动态插槽,优先于 component 渲染;作用域含字段值 modelValue、回写通道 onUpdate:modelValue、disabled、path 与合并后的控件属性,可直接 v-bind 给控件\n *\n * @example\n * ```vue\n * <template>\n * <ProForm :form=\"form\" @submit=\"handleSubmit\">\n * <template #name=\"scoped\">\n * <el-input v-bind=\"scoped\" />\n * </template>\n * </ProForm>\n * </template>\n * ```\n */\nimport type { FormProps as ElFormProps } from '../../../../shared/ui';\nimport { Form as ElForm, useDisabledContext } from '../../../../shared/ui';\nimport {\n computed,\n inject,\n mergeProps,\n onUpdated,\n provide,\n shallowRef,\n toValue,\n triggerRef,\n type Slot,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport BaseFormItems from '../BaseFormItems/index.vue';\nimport { InjectionFormKey, InjectionFormSlotsKey } from '../../constants';\nimport type { Grid, VModelProps, PathProps } from '../../types';\nimport type { Path } from '../../../../shared/core';\nimport {\n camelizeProperties,\n createFormProxy,\n omitBy,\n useReactiveAttrs,\n} from '../../../../shared/core';\nimport { useForm, type Form } from '../../hooks/useForm';\nimport { resolveDisabled } from '../../utils/disabled';\n\ndefineOptions({ name: 'ProForm', inheritAttrs: false });\n\ntype FormProps = Partial<Omit<ElFormProps, 'model'>>;\n\ntype Props = {\n grid?: Grid;\n form?: F;\n} & /* @vue-ignore */ FormProps;\nconst props = withDefaults(defineProps<Props>(), {\n grid: false,\n form: undefined,\n});\n\n/**\n * 依赖注入中心:\n * 未传 form 实例(含运行期置空)时回退内部表单实例;\n * 将 Form 实例注入到 Vue Context 中,供深层子组件跨层级直接访问数据和方法。\n */\n// 兜底表单实例:setup 同步期创建,未传 :form(含运行期置空)时经 currentForm 生效\nconst fallbackForm = useForm() as unknown as F;\nconst currentForm = computed(() => props.form ?? fallbackForm);\n\n/**\n * 表单实例代理:操作全部转发至 currentForm 当前实例;\n * 下游持有本代理即可,:form 运行期替换无需重绑;方法具有引用记忆化。\n */\nconst formProxy = createFormProxy(() => currentForm.value);\n\nprovide(InjectionFormKey, formProxy);\n\nconst fields = computed(() => {\n const f = currentForm.value?.fields;\n return (Array.isArray(f) ? f : f?.value) ?? [];\n});\nconst formData = computed(() => currentForm.value?.formData);\n/*\n * ref 回调按渲染期实例路由:卸载回调(null)写回该子树所属表单,\n * 运行期替换 :form 后旧实例的 formRef 同步清空\n */\nconst formRefSetter = computed(() => {\n const form = currentForm.value;\n return (el: any) => form?.setFormRef?.(el);\n});\n\n/*\n * formKey 子树重挂载契约:以 WeakMap 为每个 form 实例生成自增 key,绑定到原生 Form 的 :key\n * :form 运行期替换为全新实例时强制整棵表单子树重新挂载,重置宿主校验状态与深层字段非受控状态\n */\nlet formInstanceCounter = 0;\nconst formInstanceKeyMap = new WeakMap<object, number>();\nconst getFormKey = (f: object) => {\n if (f == null) return 0;\n if (!formInstanceKeyMap.has(f)) {\n formInstanceKeyMap.set(f, ++formInstanceCounter);\n }\n return formInstanceKeyMap.get(f)!;\n};\nconst formKey = computed(() => getFormKey(currentForm.value as any));\n\nconst config = INJECT_CONFIG['pro-form'];\nconst injectFormConfig = inject(config.injectionKey, config.default);\nconst attrs = useReactiveAttrs();\n\n/**\n * 从 ProComponentProvider 获取全局配置,响应式派生以支持动态配置变更\n */\nconst injectAttrs = computed(() => {\n const raw = toValue(injectFormConfig);\n const { grid: _injectGrid, ...rest } = raw || {};\n return rest;\n});\n\nconst formAttrs = computed(() => {\n return mergeProps(\n injectAttrs.value,\n omitBy(camelizeProperties(attrs), value => value === undefined)\n );\n});\n\n// 表单级禁用声明:显式值(含 false)优先,未声明时仅继承外层 true\nconst outerDisabled = useDisabledContext();\nconst formDisabled = computed<boolean | undefined>(() => {\n const explicit = resolveDisabled(toValue(formAttrs.value.disabled));\n if (explicit !== undefined) return explicit;\n return outerDisabled.value ? true : undefined;\n});\n\ntype ExtractPath<T> = T extends Form<infer D> ? Path<D> : string;\ntype FieldSlotProps = VModelProps &\n PathProps & { disabled?: boolean; [x: string]: any };\ntype FieldSlots = Record<ExtractPath<F>, Slot<FieldSlotProps>>;\n\nconst slots = defineSlots<Partial<FieldSlots & { default: Slot }>>();\n\n/*\n * 动态插槽映射中心 (Slot Teleporting):\n * 向深层 BaseField 提供 ProForm 的具名插槽,父级运行期增删插槽后下游可感知\n */\nconst formSlotsRef = shallowRef<Record<string, any>>(slots);\nonUpdated(() => {\n triggerRef(formSlotsRef);\n});\nprovide(InjectionFormSlotsKey, formSlotsRef);\n</script>\n\n<template>\n <!-- el-form 渲染原生 form 元素,拦截回车触发的默认提交 -->\n <ElForm\n :key=\"formKey\"\n :ref=\"formRefSetter\"\n :model=\"formData\"\n v-bind=\"formAttrs\"\n class=\"pro-form\"\n @submit.prevent\n >\n <BaseFormItems\n :fields=\"fields\"\n :grid=\"props.grid\"\n :disabled=\"formDisabled\"\n />\n <slot />\n </ElForm>\n</template>\n","import type { FormItemInstance } from '../../../shared/ui';\nimport {\n useFields as coreUseFields,\n type UseFieldsReturn,\n} from '../../../shared/core';\nimport type { Data } from '../../../shared/core';\nimport type { Field, Fields } from '../types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../constants';\nimport type { ComponentName } from '../constants';\n\n/**\n * 字段配置管理 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFields`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 组件类型推导)\n * - FormItem 实例 -> Element Plus 的 `FormItemInstance`\n *\n * 提供对字段配置数组的增删改查操作,支持:\n * - 通过路径字符串或查找函数定位字段\n * - 深层嵌套字段的遍历和匹配\n * - 字段配置的合并/覆盖更新\n * - 字段的添加、插入、删除\n * - 父级字段查找\n *\n * @template D - 表单数据类型\n * @param {Fields<D>} [initFields] - 初始字段配置数组\n *\n * @returns 字段操作对象,包含以下属性:\n * - `fields` - 字段配置数组(响应式 Ref\\<F[]\\>)\n * - `getField(path)` - 获取字段配置,支持路径字符串或查找函数\n * - `setField(path, field, options?)` - 更新字段配置,默认合并模式\n * - `deleteField(path, options?)` - 删除字段配置\n * - `appendField(path, field, options?)` - 在指定字段后追加\n * - `prependField(path, field, options?)` - 在指定字段前插入\n * - `getParentField(path, options?)` - 获取父级字段配置\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * const { fields, getField, setField } = useFields<User>([\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ])\n *\n * // 通过路径获取\n * getField('name')\n * // 通过查找函数获取\n * getField(f => f.label === '姓名')\n * // 更新字段(合并模式)\n * setField('name', { label: '用户名', disabled: true })\n * ```\n *\n * @see {@link coreUseFields} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFields<D extends Data = Data>(\n initFields?: Fields<D>\n): UseFieldsReturn<D, Field<ComponentName, D>, FormItemInstance>;\nexport function useFields(initFields?: any) {\n return coreUseFields(initFields, {\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n}\n\n/** useFields 返回值类型\n * @public\n */\nexport type UseFields<D extends Data = Data> = ReturnType<typeof useFields<D>>;\n","import {\n useFormRef as coreUseFormRef,\n type UseFormRefReturn,\n} from '../../../shared/core';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单组件实例引用 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFormRef`,将泛型参数绑定为 Element Plus 的 `FormInstance`,\n * 使 formRef 获取到完整的 Element Plus Form 组件 API 类型提示(如 `validate()`、`resetFields()` 等)。\n *\n * `formRef` 由 ProForm 组件内部自动通过 `setFormRef` 绑定,无需手动调用。\n *\n * @returns 表单组件实例引用管理对象:\n * - `formRef` — Element Plus Form 组件实例的响应式引用(`Ref<FormInstance | undefined>`)\n * - `setFormRef(inst)` — 设置 Form 组件实例,由 ProForm 内部自动调用\n *\n * @example\n * ```ts\n * const { formRef, setFormRef } = useFormRef()\n *\n * // formRef 由 ProForm 自动绑定,可直接使用\n * await formRef.value?.validate()\n * formRef.value?.resetFields()\n * formRef.value?.scrollToField('username')\n * ```\n *\n * @see {@link coreUseFormRef} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFormRef(): UseFormRefReturn<FormInstance> {\n return coreUseFormRef();\n}\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"down\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"></path></svg>\n</template>\n","<script lang=\"ts\">\ntype Expand = {\n /** 网格布局时默认展开行数量 */\n minExpandRows?: number;\n /** 网格布局时展开状态 */\n expandStatus?: boolean;\n};\n\ntype _FormProps = Pick<\n Partial<FormProps>,\n | 'disabled'\n | 'labelPosition'\n | 'labelWidth'\n | 'inline'\n | 'inlineMessage'\n | 'statusIcon'\n | 'showMessage'\n | 'size'\n>;\n\ntype ButtonProps = { onClick: () => void };\ntype ExpandButtonProps = ButtonProps & { expandStatus: boolean };\n\n/**\n * 搜索表单属性面,由 ProTable 经 `searchFormConfig` 下发\n */\nexport type SearchFormProps = {\n /** 搜索表单实例,由 table.searchForm 提供 */\n form: Form;\n /** 布局形态,默认 'grid' */\n layout?: 'grid' | 'inline';\n /** 展开配置,默认 true */\n expand?: boolean | Expand;\n /** 自定义搜索按钮,false 时不渲染 */\n searchButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n /** 自定义重置按钮,false 时不渲染 */\n resetButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n /** 自定义展开/折叠按钮,false 时不渲染 */\n expandButton?:\n | Component<ExpandButtonProps>\n | DefineComponent<ExpandButtonProps>\n | false;\n /** 行间距,默认 16 */\n rowGap?: number;\n /** 列间距,默认 24 */\n columnGap?: number;\n} & /* @vue-ignore */ _FormProps &\n AllowedComponentProps;\n</script>\n\n<script lang=\"ts\" setup>\n/**\n * ProTable 的搜索表单子组件\n *\n * @component SearchForm\n *\n * ## 核心功能\n *\n * 1. 内部渲染 ProForm,使用 table.searchForm 管理搜索条件\n * 2. 支持 grid(网格)和 inline(行内)两种布局\n * 3. 网格布局下支持展开/折叠\n * 4. 提供搜索、重置、展开/折叠按钮(支持自定义)\n *\n * ## 展开/折叠行为\n *\n * 1. 内容高度超出折叠高度(由 minExpandRows 决定,默认 2 行)时显示展开/折叠按钮\n * 2. 隐藏区域存在搜索值时自动展开\n * 3. 用户手动切换后保持手动状态,不随重新测量回退\n *\n * @param {Form} form - 搜索表单实例,由 table.searchForm 提供\n * @param {'grid' | 'inline'} [layout] - 布局形态,默认 'grid'\n * @param {boolean | Expand} [expand] - 展开配置,默认 true\n * @param {Component<ButtonProps> | DefineComponent<ButtonProps> | false} [searchButton] - 自定义搜索按钮,false 时不渲染\n * @param {Component<ButtonProps> | DefineComponent<ButtonProps> | false} [resetButton] - 自定义重置按钮,false 时不渲染\n * @param {Component<ExpandButtonProps> | DefineComponent<ExpandButtonProps> | false} [expandButton] - 自定义展开/折叠按钮,false 时不渲染\n * @param {number} [rowGap] - 行间距,默认 16\n * @param {number} [columnGap] - 列间距,默认 24\n *\n * @slot reset-button - 重置按钮插槽,作用域参数 onReset\n * @slot search-button - 搜索按钮插槽,作用域参数 onSearch\n * @slot expand-button - 展开/折叠按钮插槽,作用域参数 expandStatus / changeExpandStatus\n */\nimport type { FormProps } from '../../../shared/ui';\nimport { Space, Button } from '../../../shared/ui';\nimport type { AllowedComponentProps } from 'vue';\nimport { computed, nextTick, type Component, type DefineComponent } from 'vue';\nimport ProForm from '../../form/components/ProForm/index.vue';\nimport { type Form } from '../../form/hooks/useForm';\nimport DownOutlined from './icons/DownOutlined.vue';\nimport { useLocale } from '../../../locale';\nimport { useSearchFormExpand } from '../../../shared/core';\n\ndefineOptions({ name: 'SearchForm' });\n\nconst { t } = useLocale();\n\nconst props = withDefaults(defineProps<SearchFormProps>(), {\n layout: 'grid',\n expand: true,\n searchButton: undefined,\n resetButton: undefined,\n expandButton: undefined,\n rowGap: 16,\n columnGap: 24,\n});\n\ntype Emits = {\n (e: 'search'): void;\n (e: 'reset'): void;\n};\nconst emit = defineEmits<Emits>();\n\nconst { showExpandToggle, expandStatus, changeExpandStatus, heightStyle } =\n useSearchFormExpand(props);\n\nconst layoutProps = computed(() => {\n return props.layout === 'grid'\n ? {\n grid: {\n gutter: props.columnGap,\n style: { rowGap: `${props.rowGap}px` },\n },\n style: {\n display: 'flex',\n overflow: 'hidden',\n columnGap: `${props.columnGap}px`,\n height: heightStyle.value,\n },\n }\n : {\n inline: true,\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${props.rowGap}px ${props.columnGap}px`,\n },\n grid: false,\n };\n});\n\nconst onReset = () => {\n emit('reset');\n};\n\n// 同一 tick 内 click 与 submit 只放行首个触达者,下一 tick 释放标记\nlet searchTriggeredInTick = false;\n\nconst emitSearch = () => {\n searchTriggeredInTick = true;\n nextTick(() => {\n searchTriggeredInTick = false;\n });\n emit('search');\n};\n\n// 默认查询按钮为 native-type=submit:点击与回车统一经表单 submit 事件触发\nconst onSearchSubmit = () => {\n if (searchTriggeredInTick) return;\n emitSearch();\n};\n\n// 自定义查询按钮与 search-button 插槽经 click 触发\nconst onSearchClick = () => {\n if (searchTriggeredInTick) return;\n emitSearch();\n};\n</script>\n\n<template>\n <ProForm\n v-bind=\"layoutProps\"\n :form=\"props.form\"\n class=\"pro-table_search-form transition\"\n @submit.prevent=\"onSearchSubmit\"\n >\n <Space alignment=\"start\" class=\"pro-table_search-form_button-group\">\n <slot name=\"reset-button\" :on-reset=\"onReset\">\n <template v-if=\"props.resetButton !== false\">\n <component\n :is=\"props.resetButton\"\n v-if=\"props.resetButton\"\n @click=\"onReset\"\n />\n <Button\n v-else\n class=\"pro-table_search-form_reset-button\"\n @click=\"onReset\"\n >\n {{ t('table.reset') }}\n </Button>\n </template>\n </slot>\n <slot name=\"search-button\" :on-search=\"onSearchClick\">\n <template v-if=\"props.searchButton !== false\">\n <component\n :is=\"props.searchButton\"\n v-if=\"props.searchButton\"\n @click=\"onSearchClick\"\n />\n <Button\n v-else\n class=\"pro-table_search-form_search-button\"\n type=\"primary\"\n native-type=\"submit\"\n >\n {{ t('table.query') }}\n </Button>\n </template>\n </slot>\n <slot\n name=\"expand-button\"\n :expand-status=\"expandStatus\"\n :change-expand-status=\"changeExpandStatus\"\n >\n <template v-if=\"props.expandButton !== false && showExpandToggle\">\n <component\n :is=\"props.expandButton\"\n v-if=\"props.expandButton\"\n :expand-status=\"expandStatus\"\n @click=\"changeExpandStatus\"\n />\n <Button\n v-else\n text\n class=\"pro-table_search-form_expand-toggle-button\"\n @click=\"changeExpandStatus\"\n >\n {{ expandStatus ? t('table.collapse') : t('table.expand') }}\n <DownOutlined\n class=\"transition\"\n style=\"margin-left: 4px\"\n :style=\"{ transform: `rotate(${expandStatus ? -180 : 0}deg)` }\"\n />\n </Button>\n </template>\n </slot>\n </Space>\n </ProForm>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form {\n :deep([class*='-form-item']) {\n margin: 0;\n }\n &_expand-toggle-button {\n display: flex;\n align-items: center;\n padding: 0;\n padding-left: 4px;\n }\n\n .transition {\n transition: all 0.25s;\n }\n}\n</style>\n","<template>\n <div class=\"pro-table_search-form-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form-container {\n margin-bottom: 24px;\n padding: 24px;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <div class=\"pro-table_table-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_table-container {\n flex: 1;\n padding: 24px 24px 0;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"column-height\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 00-11.3 0L403.6 366.3a7.23 7.23 0 005.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 表格尺寸切换控件,以图标按钮 + 下拉菜单呈现\n *\n * @component SizeControl\n *\n * @param {Size} [size] - 表格尺寸(`v-model:size`),仅用于回写选中结果\n * @param {Size} [effectiveSize] - 表格实际使用的尺寸,用于高亮选中项;未提供时依次回退 `size`、宿主 ConfigProvider 的尺寸\n */\nimport {\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Button,\n useSize,\n type TableProps,\n} from '../../../shared/ui';\nimport ColumnHeightOutlined from './icons/ColumnHeightOutlined.vue';\nimport { computed } from 'vue';\nimport { useLocale } from '../../../locale';\n\ntype Size = TableProps['size'];\n\nconst { t } = useLocale();\n\nconst props = withDefaults(\n defineProps<{\n effectiveSize?: Size;\n }>(),\n { effectiveSize: undefined }\n);\n\nconst size = defineModel<Size>('size');\n\n// 宿主 ConfigProvider / 表单上下文的尺寸兜底\nconst hostSize = useSize();\n\n// 高亮项:表格有效尺寸 > 本地绑定 > 宿主 ConfigProvider 尺寸 > 默认\nconst currentSize = computed(\n () => (props.effectiveSize ?? size.value ?? hostSize.value) || 'default'\n);\n\nconst items = computed<Array<{ label: string; key: NonNullable<Size> }>>(() => [\n { label: t('table.sizeDefault'), key: 'default' },\n { label: t('table.sizeMiddle'), key: 'large' },\n { label: t('table.sizeCompact'), key: 'small' },\n]);\n</script>\n\n<template>\n <Dropdown trigger=\"click\" @command=\"val => (size = val as any)\">\n <Button text class=\"pro-table_size-control_button\">\n <ColumnHeightOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-for=\"item in items\"\n :key=\"item.key\"\n :command=\"item.key\"\n :disabled=\"item.key === currentSize\"\n >\n {{ item.label }}\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_size-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.3);\n }\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"filter\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * 列显隐控制控件,以下拉菜单列出可控列并支持全选/取消全选\n *\n * @component ColumnControl\n *\n * @param {Columns} columns - 参与控制的列配置(由 ProTable 下发)\n * @param {Table} [table] - 表格实例,勾选结果经其 `setColumn` 写回列 `hidden`\n * @param {ColumnControlConfig} [columnControl] - 控制项配置:labels / excludedKeys / disabledKeys / disableCheckAll\n */\nimport {\n Button,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n} from '../../../shared/ui';\nimport { toValue, computed, ref, watch } from 'vue';\nimport type { Column, Columns, ColumnControlConfig } from '../types';\nimport { type Table } from '../hooks';\nimport FilterOutlined from './icons/FilterOutlined.vue';\nimport { useLocale } from '../../../locale';\nimport { isObjectItem, normalizePathKey } from '../../../shared/core';\n\ntype Props = {\n columns: Columns;\n table?: Table;\n columnControl?: ColumnControlConfig;\n};\nconst props = withDefaults(defineProps<Props>(), {\n table: undefined,\n columnControl: undefined,\n});\n\nconst { t } = useLocale();\n\nconst checkAll = ref(false);\nconst indeterminate = ref(false);\n\nconst getColumnKey = (column: Column) => {\n // 空字符串 key 视为未提供,回退 prop(与列渲染口径一致)\n const rawKey = column.key || column.prop;\n if (rawKey === undefined || rawKey === null || rawKey === '')\n return undefined;\n return normalizePathKey(rawKey);\n};\n\nconst checkedColumnsOptions = computed<\n Array<{\n label: string;\n value: string;\n checked: boolean;\n disabled: boolean;\n column: Column;\n }>\n>(() =>\n props.columns.filter(isObjectItem).flatMap(item => {\n const key = getColumnKey(item);\n // 无 key/prop 列不进入列控面板\n if (key === undefined) return [];\n // 默认排除内部序号列 __INDEX__ 及显式指定的 excludedKeys\n if (\n key === '__INDEX__' ||\n (item as any).type === 'index' ||\n props.columnControl?.excludedKeys?.some(ek => String(ek) === key)\n )\n return [];\n const disabled =\n props.columnControl?.disabledKeys?.some(dk => String(dk) === key) ??\n false;\n const rawTitle = item.label ?? (item as any).title;\n const titleLabel = typeof rawTitle === 'string' ? rawTitle : undefined;\n const propLabel =\n item.prop !== undefined && item.prop !== null\n ? String(item.prop)\n : undefined;\n const label =\n (props.columnControl?.labels?.[key] as string) ??\n titleLabel ??\n propLabel ??\n key;\n return {\n label,\n value: key,\n checked: !toValue(item.hidden) || !!disabled,\n disabled: !!disabled,\n column: item,\n };\n })\n);\n\n/** 可被用户勾选/取消的列(非 disabled) */\nconst controllableOptions = computed(() =>\n checkedColumnsOptions.value.filter(item => !item.disabled)\n);\n\nconst checkedColumnKeys = computed({\n get() {\n return checkedColumnsOptions.value.flatMap(item =>\n item.checked ? item.value : []\n );\n },\n set(val: string[]) {\n // 仅写 hidden 发生翻转的列\n const checkedSet = new Set(val);\n checkedColumnsOptions.value.forEach(item => {\n if (item.disabled || item.checked === checkedSet.has(item.value)) return;\n props.table?.setColumn(item.value as any, {\n hidden: !checkedSet.has(item.value),\n });\n });\n },\n});\n\nconst onCheckAllChange = (value: any) => {\n const checked = !!(value?.target?.checked ?? value);\n checkedColumnKeys.value = checked\n ? controllableOptions.value.map(item => item.value)\n : [];\n};\n\nconst toggleColumnsItem = (val: string) => {\n const item = checkedColumnsOptions.value.find(o => o.value === val);\n if (item?.disabled) return;\n if (checkedColumnKeys.value.includes(val)) {\n checkedColumnKeys.value = checkedColumnKeys.value.filter(\n item => item !== val\n );\n } else {\n checkedColumnKeys.value = [...checkedColumnKeys.value, val];\n }\n};\n\nwatch(\n checkedColumnKeys,\n () => {\n const controllableChecked = controllableOptions.value.filter(\n item => item.checked\n );\n indeterminate.value =\n !!controllableChecked.length &&\n controllableChecked.length < controllableOptions.value.length;\n checkAll.value =\n controllableChecked.length === controllableOptions.value.length &&\n controllableOptions.value.length > 0;\n },\n { immediate: true }\n);\n\n// disabledKeys 指定的列始终强制展示\nwatch(\n () => props.columnControl?.disabledKeys,\n keys => {\n keys?.forEach(key => {\n props.table?.setColumn(String(key), { hidden: false });\n });\n },\n { immediate: true, deep: true }\n);\n</script>\n\n<template>\n <Dropdown trigger=\"click\" :hide-on-click=\"false\">\n <Button text class=\"pro-table_column-control_button\">\n <FilterOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-if=\"!props.columnControl?.disableCheckAll\"\n :disabled=\"true\"\n :divided=\"false\"\n >\n <Checkbox\n :model-value=\"checkAll\"\n :indeterminate=\"indeterminate\"\n @change=\"onCheckAllChange\"\n >\n {{ t('table.selectAll') }}\n </Checkbox>\n </DropdownItem>\n <DropdownItem\n v-for=\"item in checkedColumnsOptions\"\n :key=\"item.value\"\n :command=\"item.value\"\n @click.stop=\"toggleColumnsItem(item.value)\"\n >\n <Checkbox :model-value=\"item.checked\" :disabled=\"item.disabled\">\n {{ item.label }}\n </Checkbox>\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_column-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.2, 1.4);\n }\n}\n</style>\n","<script lang=\"ts\">\n/**\n * 列配置渲染器\n *\n * @component TableColumnRenderer\n * @description 把列数组渲染为 el-table-column 树,支持分组列(children)、自定义 render 列与深层路径取值\n *\n * @param {Columns} [columns] - 列配置数组\n *\n * @internal\n */\nimport { defineComponent, h, toRaw, toValue, type PropType } from 'vue';\nimport { get, isObjectItem, normalizePathKey } from '../../../shared/core';\nimport { TableColumn } from '../../../shared/ui';\nimport SlotComponent from '../../form/components/SlotComponent/index.vue';\nimport type { Column, Columns } from '../types';\n\n/*\n * 无 key/prop 列的渲染 key 与列对象身份绑定:\n * 列增删、重排与过滤后 key 不随数组位置漂移\n */\nlet columnKeySeed = 0;\nconst columnKeyMap = new WeakMap<object, number>();\nconst getStableColumnKey = (column: unknown): string | number => {\n if (column === null || typeof column !== 'object')\n return `raw_${String(column)}`;\n const raw = toRaw(column);\n let key = columnKeyMap.get(raw);\n if (key === undefined) {\n key = ++columnKeySeed;\n columnKeyMap.set(raw, key);\n }\n return key;\n};\n\nconst getColumnKey = (column: Column) => {\n // 空字符串 key 视为未提供,与 getColumnProps 的 columnKey 取值一致\n const rawKey = column.key || column.prop;\n if (!rawKey) return getStableColumnKey(column);\n return normalizePathKey(rawKey);\n};\n\nconst getCellValue = (row: Record<string, any>, column: Column) => {\n const path = column.prop;\n if (!path) return undefined;\n return get(row, path);\n};\n\nconst getColumnProps = (column: Column) => {\n const { hidden, render, key, children, ...rest } = column;\n const prop = column.prop ? normalizePathKey(column.prop) : undefined;\n const columnKey = key ? normalizePathKey(key) : prop;\n return {\n ...rest,\n label: column.label ?? (column as any).title,\n prop,\n columnKey,\n };\n};\n\n/*\n * 递归渲染列树:子列以同层 vnode 数组展开,深层分组同样成立;\n * 每层以不可变祖先路径向下传递,重复出现的祖先引用直接剔除(含 a→b→a 互引用)\n */\nconst renderColumn = (\n column: Column,\n ancestors: Set<object> = new Set()\n): any => {\n const hasChildren =\n Array.isArray(column.children) && column.children.length > 0;\n const vnodeProps = { key: getColumnKey(column), ...getColumnProps(column) };\n if (hasChildren) {\n // 每层祖先路径随 vnode 创建确定,环状引用按路径截断\n const nextAncestors = new Set(ancestors).add(column);\n return h(TableColumn, vnodeProps, {\n default: () =>\n column\n .children!.filter(\n child =>\n isObjectItem(child) &&\n !nextAncestors.has(child) &&\n !toValue(child.hidden)\n )\n .map(child => renderColumn(child, nextAncestors)),\n });\n }\n if (typeof column.render === 'function') {\n return h(TableColumn, vnodeProps, {\n default: (scope: any) =>\n h(SlotComponent, {\n component: column.render!({\n ...scope,\n column,\n cellValue: getCellValue(scope.row, column),\n }),\n }),\n });\n }\n return h(TableColumn, vnodeProps);\n};\n\nexport default defineComponent({\n name: 'TableColumnRenderer',\n inheritAttrs: false,\n props: {\n columns: {\n type: Array as PropType<Columns>,\n default: () => [],\n },\n },\n setup(props) {\n return () =>\n props.columns\n .filter(column => isObjectItem(column) && !toValue(column.hidden))\n .map(column => renderColumn(column));\n },\n});\n</script>\n","<script lang=\"ts\" setup generic=\"T extends Table<any> = Table\">\n/**\n * 配置驱动的表格组件\n *\n * @component ProTable\n *\n * ## 架构概览\n *\n * ProTable 是表格系统的顶层容器,负责:\n * 1. 接收 useTable() 创建的表格实例,驱动列、数据源、分页的渲染\n * 2. 内部集成 SearchForm 搜索区域(基于 ProForm)\n * 3. 支持列动态控制(显示/隐藏)和尺寸控制\n * 4. 将分页变化和搜索事件串联到数据查询流程\n *\n * ## 数据流\n *\n * ```\n * useTable({ columns, dataSource, searchFields, ... })\n * ↓ 传入 :table prop\n * ProTable\n * ├── SearchForm (使用 table.searchForm 管理搜索条件)\n * │ └── ProForm\n * ├── SizeControl (表格尺寸切换)\n * ├── ColumnControl (列显示/隐藏)\n * └── ElTable (element-plus Table)\n * └── 转发所有 table 插槽\n * ```\n *\n * ## 搜索行为\n *\n * 1. 搜索:分页回到第一页后发起查询\n * 2. 分页变化:分页参数同步后发起查询\n * 3. 重置:查询参数恢复初始值后重新查询\n *\n * ## 列来源\n *\n * 显式 `:columns` 优先于 `:table` 实例的 `columns`;显式列按原样透传给宿主,不补齐 `key`,\n * 需由调用方提供 `key` / `dataIndex` / `prop`。显式模式下 `setColumn` 与列控入口均不生效。\n *\n * @template T - 表格实例类型(useTable 返回值)\n *\n * @param {T} [table] - 列表表格对象,来自 useTable\n * @param {() => Promise<unknown>} [search] - 列表数据查询方法\n * @param {boolean} [addIndexColumn] - 是否在首列插入序号列\n * @param {boolean} [immediateSearch] - 挂载后是否立即触发一次查询\n * @param {boolean | Partial<Control>} [control] - 是否展示尺寸与列控制按钮;显式传入 columns 时列控入口不渲染\n * @param {SearchFormConfig} [searchFormConfig] - 搜索栏查询字段表单配置\n * @param {ContainerComponent | false} [tableContainer] - 表格区域包裹容器\n *\n * @slot default - 保留给列渲染器,传入内容不参与渲染,自定义区域请使用下列具名插槽\n * @slot search-form - 搜索区域插槽(无作用域)\n * @slot button-bar - 表格头部按钮区插槽\n * @slot toolbar - 工具栏插槽\n * @slot table - 表格区域插槽(无作用域)\n */\nimport {\n Pagination as ElPagination,\n type PaginationProps,\n Table as ElTable,\n type TableProps,\n type TableEmits,\n tableProps,\n paginationProps,\n} from '../../../shared/ui';\nimport { ElLoading } from 'element-plus';\nimport {\n Comment,\n Fragment,\n Text,\n computed,\n effect,\n stop,\n nextTick,\n onMounted,\n inject,\n toValue,\n type Slot,\n useSlots,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport ContainerFragment from '../../form/components/ContainerFragment/index.vue';\nimport type { ContainerComponent } from '../../form/types';\nimport SearchForm from './SearchForm.vue';\nimport type { SearchFormProps } from './SearchForm.vue';\nimport type { Table } from '../hooks';\nimport { useLocale } from '../../../locale';\nimport type { Path } from '../../../shared/core';\nimport {\n camelizeProperties,\n callListeners,\n getObject,\n isObjectItem,\n isPlainObject,\n isPromise,\n omitBy,\n pick,\n useReactiveAttrs,\n} from '../../../shared/core';\nimport DefaultSearchFormContainer from './DefaultSearchFormContainer.vue';\nimport DefaultTableContainer from './DefaultTableContainer.vue';\nimport SizeControl from './SizeControl.vue';\nimport ColumnControl from './ColumnControl.vue';\nimport type { Columns, ColumnControlConfig } from '../types';\nimport TableColumnRenderer from './TableColumnRenderer.vue';\n\ndefineOptions({\n name: 'ProTable',\n directives: {\n loading: ElLoading.directive,\n },\n inheritAttrs: false,\n});\n\nconst tableProperties = Object.keys(tableProps());\nconst paginationProperties = Object.keys(paginationProps());\n\ntype Control = {\n /** 是否展示表格尺寸控制 */\n sizeControl: boolean;\n /** 是否展示列控制,传对象时作为列控面板配置 */\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n};\n\n/** 搜索表单配置:SearchFormProps 去掉 form,并加上搜索区显隐与容器 */\ntype SearchFormConfig = Omit<SearchFormProps, 'form'> & {\n /** 是否隐藏搜索表单 */\n hidden?: boolean;\n /** 搜索区域包裹容器 */\n container?: ContainerComponent | false;\n};\n\ntype ReturnTableRecord<V> = V extends Table<any, infer R> ? R : any;\ntype RecordType = ReturnTableRecord<T>;\n\ntype Props = {\n /** 列表表格对象,来自 useTable */\n table?: T;\n /** 列表数据查询方法 */\n search?: () => Promise<unknown>;\n /** 是否在首列插入序号列 */\n addIndexColumn?: boolean;\n /** 挂载后是否立即触发一次查询 */\n immediateSearch?: boolean;\n /** 是否展示尺寸与列控制按钮,支持分别控制;显式传入 columns 时列控入口不渲染 */\n control?: boolean | Partial<Control>;\n /** 搜索栏查询字段表单配置 */\n searchFormConfig?: SearchFormConfig;\n /** 表格区域包裹容器 */\n tableContainer?: ContainerComponent | false;\n /** 直接传入列配置(覆盖 :table 实例的 columns);列需自备 key / dataIndex / prop,显式模式不参与 setColumn 与列控 */\n columns?: Columns<RecordType>;\n /** 直接传入数据源(覆盖 :table 实例的 data) */\n data?: RecordType[];\n /** 分页配置,传 false 禁用 */\n pagination?: false | Partial<PaginationProps>;\n} & /* @vue-ignore */ Omit<TableProps, 'data'>;\n\n/*\n * 组件自身仅触发模型事件;宿主表格事件不入运行时 emits,监听入口保留在 attrs 中透传至 ElTable\n */\ntype Emits = {} & /* @vue-ignore */ TableEmits<RecordType>;\n\ndefineEmits<Emits>();\n\nconst props = withDefaults(defineProps<Props>(), {\n table: undefined,\n search: undefined,\n addIndexColumn: undefined,\n immediateSearch: undefined,\n control: undefined,\n searchFormConfig: undefined,\n tableContainer: undefined,\n columns: undefined,\n data: undefined,\n pagination: undefined,\n});\n\nconst { t } = useLocale();\n\nconst config = INJECT_CONFIG['pro-table'];\nconst injectPropsRaw = inject(config.injectionKey, config.default);\nconst injectProps = computed(() => toValue(injectPropsRaw) || {});\n\nconst attrs = useReactiveAttrs() as Record<string, any>;\n\n// 组件自身消费的 attrs 键:class / style 绑定根节点,onSearch / onChange 由搜索与分页流程消费\nconst PRO_TABLE_CONSUMED_ATTR_KEYS = new Set([\n 'class',\n 'style',\n 'onSearch',\n 'onChange',\n]);\n\n// 组件自身消费的 props 键:对应值按 prop / provider 单一来源派生,provider 注入不再透传这些键\nconst PRO_TABLE_PROP_KEYS = new Set(Object.keys(props));\n\nconst injectTableAttrs = computed(() => {\n const tableConfig: Record<string, any> = {};\n for (const [key, value] of Object.entries(injectProps.value)) {\n if (!PRO_TABLE_PROP_KEYS.has(key)) {\n tableConfig[key] = value;\n }\n }\n return tableConfig as Partial<TableProps>;\n});\n\nconst attrsTableProps = computed(() => {\n return omitBy(\n pick(camelizeProperties(attrs), tableProperties),\n value => value === undefined\n ) as Partial<TableProps>;\n});\n\nconst restTableAttrs = computed(() => {\n const rest: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n if (!PRO_TABLE_CONSUMED_ATTR_KEYS.has(key)) {\n rest[key] = value;\n }\n }\n return omitBy(rest, value => value === undefined);\n});\n\nconst size = defineModel<TableProps['size']>('size');\nconst loading = defineModel<boolean>('loading', { default: false });\n\n// 递增序号做请求竞态守卫,仅最新一次请求可变更 loading\nlet searchSequence = 0;\n// 告警文案按原因分键,各原因独立去重\nconst SEARCH_WARN_MESSAGES = {\n duplicate:\n '同时配置了 :search prop 与 @search 监听,@search 监听不会被执行,请仅保留其一。',\n 'not-promise':\n 'search 未返回 Promise,本次查询不参与 loading 竞态管理(在途请求的 loading 状态保持不变)。',\n} as const;\nconst warnedSearchReasons = new Set<keyof typeof SEARCH_WARN_MESSAGES>();\nconst warnSearchConfig = (reason: keyof typeof SEARCH_WARN_MESSAGES) => {\n if (warnedSearchReasons.has(reason)) return;\n warnedSearchReasons.add(reason);\n console.warn(`[ProTable] ${SEARCH_WARN_MESSAGES[reason]}`);\n};\nconst _search = async () => {\n const search = props.search || attrs.onSearch;\n if (props.search && attrs.onSearch) {\n warnSearchConfig('duplicate');\n }\n const results = callListeners(search);\n if (!results.length) return;\n const promises = results.filter(isPromise);\n if (!promises.length) {\n warnSearchConfig('not-promise');\n return;\n }\n const seq = ++searchSequence;\n loading.value = true;\n try {\n const settled = await Promise.allSettled(promises);\n const rejected = settled.find(item => item.status === 'rejected') as\n | PromiseRejectedResult\n | undefined;\n if (rejected) throw rejected.reason;\n } finally {\n if (seq === searchSequence) {\n loading.value = false;\n }\n }\n};\n\n// 重置:恢复查询参数到初始值,重新搜索\nconst reset = () => {\n props.table?.resetQueryParams?.();\n nextTick(() => {\n _search();\n });\n};\n\nconst customSlotNames = [\n 'search-form',\n 'button-bar',\n 'toolbar',\n 'table',\n] as const;\n\ntype CustomSlots = Readonly<\n Partial<Record<(typeof customSlotNames)[number], Slot>>\n>;\ntype Slots = CustomSlots & Readonly<Record<string, Slot>>;\n\nconst slots = useSlots() as Slots;\n\n/** 插槽产出是否含可渲染内容:注释节点与空白文本不计 */\nconst hasRenderableContent = (nodes: unknown): boolean => {\n if (nodes === null || nodes === undefined || nodes === false) return false;\n if (typeof nodes === 'string') return nodes.trim() !== '';\n if (typeof nodes === 'number') return true;\n if (Array.isArray(nodes)) return nodes.some(hasRenderableContent);\n const vnode = nodes as { type?: unknown; children?: unknown };\n if (vnode.type === Comment) return false;\n if (vnode.type === Text) return String(vnode.children ?? '').trim() !== '';\n if (vnode.type === Fragment) return hasRenderableContent(vnode.children);\n return true;\n};\n\n/*\n * 求值一次 default 插槽产出,用于判定是否有可渲染内容(空插槽 / 包装组件透传不提示)。\n * 求值由一次性 effect 执行并立即停止,插槽内的响应式读取不进入 ProTable 的渲染依赖。\n */\nconst evaluateSlotContent = (): boolean => {\n let hasContent = false;\n const runner = effect(() => {\n try {\n hasContent = hasRenderableContent(slots.default?.());\n } catch {\n // 产出无法求值时按有内容处理,照常提示 default 插槽被保留\n hasContent = true;\n }\n });\n stop(runner);\n return hasContent;\n};\n\n// default 插槽保留给列渲染器,同名用户插槽不透传宿主表格\nlet defaultSlotChecked = false;\nconst checkDefaultSlot = () => {\n if (defaultSlotChecked) return;\n if (!Object.prototype.hasOwnProperty.call(slots, 'default')) return;\n defaultSlotChecked = true;\n if (evaluateSlotContent()) {\n console.warn(\n '[pro-components] ProTable 的 default 插槽保留用于列渲染,已忽略传入的 default 插槽内容;自定义区域请使用 search-form / button-bar / toolbar / table 具名插槽。'\n );\n }\n};\n\nconst forwardedSlotNames = () => {\n checkDefaultSlot();\n return Object.keys(slots).filter(\n name => name !== 'default' && !customSlotNames.includes(name as any)\n );\n};\n\nconst searchPage1st = () => {\n props.table?.setPageParam?.({ current: 1 });\n _search();\n};\n\nconst computedSearchFormConfig = computed(() => {\n const container =\n props.searchFormConfig?.container ??\n (injectProps.value.searchFormConfig as any)?.container ??\n DefaultSearchFormContainer;\n return {\n ...injectProps.value.searchFormConfig,\n ...getObject(props.searchFormConfig),\n container: container ? container : undefined,\n };\n});\n\n/** SearchForm 属性面:容器与显隐由 ProTable 自身消费,不下发 SearchForm */\nconst searchFormProps = computed(() => {\n const {\n container: _container,\n hidden: _hidden,\n ...rest\n } = computedSearchFormConfig.value;\n return rest;\n});\n\nconst computedTableContainer = computed(() => {\n const container =\n props.tableContainer ??\n injectProps.value.tableContainer ??\n DefaultTableContainer;\n return container ? container : undefined;\n});\n\n/*\n * 序号列随有效分页偏移:分页关闭时退化为 index + 1;\n * current / pageSize 取有效分页(显式 :pagination 或 Provider 注入),table.pageParam 仅作兜底\n */\nconst getIndex = (i: number) => {\n const pagination = computedPagination.value;\n if (pagination === false) return i + 1;\n const pageParam = props.table?.pageParam;\n const current = pagination.currentPage ?? pageParam?.current ?? 1;\n const pageSize = pagination.pageSize ?? pageParam?.pageSize ?? 10;\n return (current - 1) * pageSize + i + 1;\n};\n\n/** 调用方是否显式传入 columns(值为 undefined 时视为未指定) */\nconst hasExplicitColumns = computed(() => props.columns !== undefined);\n\n/** 显式列原样透传(key 由调用方提供);table 列经 core 规范化 */\nconst normalizedRawColumns = computed(() => {\n const source = (\n (props.columns ?? toValue(props.table?.columns) ?? []) as any[]\n ).filter(isObjectItem);\n if (props.addIndexColumn ?? injectProps.value.addIndexColumn) {\n return [\n {\n key: '__INDEX__',\n type: 'index',\n label: t('table.index'),\n width: 80,\n index: getIndex,\n },\n ...source,\n ];\n }\n return source;\n});\n\nconst computedDataSource = computed<any[]>(() => {\n return props.data ?? toValue(props.table?.data) ?? [];\n});\n\nconst computedTableProps = computed<TableProps>(() => {\n return {\n ...injectTableAttrs.value,\n ...restTableAttrs.value,\n ...attrsTableProps.value,\n } as TableProps;\n});\n\n/*\n * 分页来源:分页开关与展示配置取 props.pagination 显式配置 > provider 全局配置 > 默认合成;\n * currentPage / pageSize / total 以 table.pageParam 为实时状态,显式配置仅在 pageParam 缺省时兜底\n */\nconst computedPagination = computed<false | Partial<PaginationProps>>(() => {\n if (props.pagination === false) return false;\n if (isPlainObject(props.pagination)) {\n const pageConfig = props.pagination as Partial<PaginationProps>;\n const globalPagination =\n (injectProps.value.pagination as any) === false\n ? {}\n : (injectProps.value.pagination as Partial<PaginationProps>) || {};\n const pageParam = props.table?.pageParam;\n return {\n ...globalPagination,\n ...pick(pageConfig as Record<string, any>, paginationProperties),\n currentPage: pageParam?.current ?? (pageConfig as any).currentPage ?? 1,\n pageSize: pageParam?.pageSize ?? (pageConfig as any).pageSize ?? 10,\n total: pageParam?.total ?? (pageConfig as any).total ?? 0,\n };\n }\n\n if ((injectProps.value.pagination as any) === false) return false;\n\n const pageParam = props.table?.pageParam;\n return {\n ...(injectProps.value.pagination as Partial<PaginationProps>),\n currentPage: pageParam?.current ?? 1,\n pageSize: pageParam?.pageSize ?? 10,\n total: pageParam?.total ?? 0,\n };\n});\n\nconst showPagination = computed(() => computedPagination.value !== false);\n\n// pageSize 变更窗口:窗口内忽略宿主级联的 current-change\nlet sizeChangeWindow = false;\n\nconst onCurrentChange = (current: number) => {\n if (sizeChangeWindow) return;\n props.table?.setPageParam?.({ current });\n _search();\n};\n\n// 改变 pageSize 时重置回第 1 页并重新查询\nconst onSizeChange = (pageSize: number) => {\n sizeChangeWindow = true;\n props.table?.setPageParam?.({ pageSize, current: 1 });\n _search();\n nextTick(() => {\n sizeChangeWindow = false;\n });\n};\n\nconst onPaginationChange = (currentPage: number, pageSize: number) => {\n // 透传 el-pagination change 回调\n callListeners(attrs.onChange, currentPage, pageSize);\n};\n\nconst searchFormVisible = computed(() => {\n const searchFields = props.table?.searchForm?.fields;\n const fieldList =\n (Array.isArray(searchFields) ? searchFields : searchFields?.value) ?? [];\n return !!(\n (computedSearchFormConfig.value as any)?.hidden !== true &&\n props.table?.searchForm &&\n fieldList.filter((item: any) => isObjectItem(item) && !toValue(item.hidden))\n .length > 0\n );\n});\n\n/*\n * 控制项来源:显式控制配置 > Provider 全局配置\n */\nconst resolvedControl = computed<{\n sizeControl: boolean;\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n}>(() => {\n const mergedControl = props.control ?? injectProps.value.control;\n if (typeof mergedControl === 'boolean') {\n return { sizeControl: mergedControl, columnControl: mergedControl };\n }\n const c = mergedControl as Control;\n const sizeControl = c?.sizeControl ?? false;\n const columnControl = c?.columnControl ?? false;\n return { sizeControl: !!sizeControl, columnControl };\n});\n\n/* 显式 columns 模式下渲染源不受 table.setColumn 影响,列控入口隐藏 */\nconst computedControl = computed(() =>\n hasExplicitColumns.value && resolvedControl.value.columnControl\n ? { ...resolvedControl.value, columnControl: false }\n : resolvedControl.value\n);\n\nconst columnControlConfig = computed(() => {\n const cc = computedControl.value.columnControl;\n return typeof cc === 'object' ? cc : undefined;\n});\n\n// 尺寸来源:size 模型 > provider 全局配置\nconst resolvedSize = computed(() => {\n return size.value ?? injectProps.value.size;\n});\n\nonMounted(() => {\n if (props.immediateSearch ?? injectProps.value.immediateSearch) {\n _search();\n }\n});\n\ndefineExpose({\n /** 手动触发一次查询(与内部搜索共用 loading 竞态守卫),便于外部刷新列表 */\n search: _search,\n});\n</script>\n\n<template>\n <div class=\"pro-table\" :class=\"attrs.class\" :style=\"attrs.style\">\n <ContainerFragment\n v-if=\"searchFormVisible || $slots['search-form']\"\n :component=\"computedSearchFormConfig.container\"\n >\n <slot name=\"search-form\">\n <SearchForm\n v-if=\"props.table?.searchForm\"\n :form=\"props.table.searchForm\"\n v-bind=\"searchFormProps\"\n @search=\"searchPage1st\"\n @reset=\"reset\"\n />\n </slot>\n </ContainerFragment>\n\n <ContainerFragment :component=\"computedTableContainer\">\n <div class=\"pro-table_header\">\n <div v-if=\"$slots['button-bar']\" class=\"pro-table_header_button-bar\">\n <slot name=\"button-bar\" />\n </div>\n <div v-if=\"$slots['toolbar']\" class=\"pro-table_header_toolbar\">\n <slot name=\"toolbar\" />\n </div>\n <div\n v-if=\"computedControl.sizeControl\"\n class=\"pro-table_header_size-control\"\n >\n <SizeControl v-model:size=\"size\" :effective-size=\"resolvedSize\" />\n </div>\n <div\n v-if=\"computedControl.columnControl\"\n class=\"pro-table_header_column-control\"\n >\n <ColumnControl\n :columns=\"\n normalizedRawColumns.filter(item => item.key !== '__INDEX__')\n \"\n :table=\"props.table\"\n :column-control=\"columnControlConfig\"\n />\n </div>\n </div>\n\n <slot name=\"table\">\n <ElTable\n v-loading=\"loading\"\n class=\"pro-table_content\"\n v-bind=\"computedTableProps\"\n :size=\"resolvedSize\"\n :data=\"computedDataSource\"\n >\n <TableColumnRenderer :columns=\"normalizedRawColumns\" />\n <template\n v-for=\"name in forwardedSlotNames()\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <slot :name=\"name\" v-bind=\"scoped\" />\n </template>\n </ElTable>\n </slot>\n\n <ElPagination\n v-if=\"showPagination\"\n class=\"pro-table_pagination\"\n v-bind=\"computedPagination\"\n @current-change=\"onCurrentChange\"\n @size-change=\"onSizeChange\"\n @change=\"onPaginationChange\"\n />\n </ContainerFragment>\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table {\n &_header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-bottom: 8px;\n\n &:empty {\n display: none;\n }\n\n &_button-bar {\n flex: 1;\n }\n\n &_toolbar {\n margin-left: 12px;\n }\n }\n\n &_pagination {\n justify-content: flex-end;\n padding: 16px 0;\n }\n}\n</style>\n","import {\n useTable as coreUseTable,\n type Table as _Table,\n} from '../../../shared/core';\nimport type {\n Data,\n ExtendWithAny,\n DeepPartial,\n PageParam,\n} from '../../../shared/core';\nimport type { Fields } from '../../form/types';\nimport { ELEMENT_FIELD_IDENTITY_KEYS } from '../../form/constants';\nimport type { Column, Columns } from '../types';\nimport type { Ref } from 'vue';\n\n/**\n * 表格实例类型\n *\n * @description 在 core Table 类型的基础上,将列类型 C 绑定为本地 Column<T>,\n * 并将 dataSource 重命名为 data(Element Plus 使用 data 而非 dataSource),\n * 使 columns 操作获得 Element Plus 表格列的完整属性类型提示。\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型(一行数据的类型)\n *\n * @property columns - 列配置数组(响应式 Ref),用于渲染表格列\n * @property data - 表格数据源(响应式 Ref),对应 Element Plus Table 的 data 属性\n * @property pageParam - 分页参数(响应式 reactive),包含 current、pageSize、total\n * @property searchForm - 搜索表单实例(Form 类型),用于管理搜索区域的字段和数据\n * @property setColumn - 更新列配置,支持合并/覆盖两种模式,用法同 setField\n * @property deleteColumn - 删除列,支持路径或查找函数\n * @property appendColumn - 在指定列后追加新列,传 undefined 在末尾追加\n * @property prependColumn - 在指定列前插入新列,传 undefined 在开头插入\n * @property setPageParam - 设置分页参数,支持部分更新和函数式更新\n * @property resetQueryParams - 恢复分页与搜索条件到初始化时的快照(含自定义分页键,非固定回到第一页)\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number }\n *\n * const table: Table<SearchParams, User> = useTable({\n * columns: [{ prop: 'name', title: '姓名' }],\n * })\n *\n * table.columns.value // 访问列配置\n * table.setColumn('name', { width: 150 }) // 更新列\n * table.setPageParam({ current: 2 }) // 切换页码\n * table.searchForm.setFormData('keyword', '搜索词') // 操作搜索表单\n * ```\n *\n * @public\n */\nexport type Table<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = Omit<_Table<D, T, Column<T>>, 'dataSource'> & {\n /**\n * Element Plus 数据源(与 core 的 dataSource 对应)\n */\n data: Ref<T[]>;\n};\n\ntype UseTableParams<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = {\n /** 列配置数组 */\n columns?: Columns<T>;\n /** 数据源数组(Element Plus 使用 data 而非 dataSource) */\n data?: T[];\n /** 初始分页参数 */\n pageParam?: PageParam;\n /** 初始搜索参数 */\n searchParam?: ExtendWithAny<DeepPartial<D>>;\n /** 搜索表单字段配置 */\n searchFields?: Fields<D>;\n};\n\n/**\n * 创建表格实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useTable` 封装,适配 Element Plus 的 API 风格:\n * - 数据源使用 `data` 而非 `dataSource`\n *\n * 是 ProTable 组件的核心 Hook,提供了:\n * - 列配置管理(增删改查)\n * - 数据源管理\n * - 分页管理\n * - 搜索表单集成(内部使用 useForm)\n * - 查询参数重置\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型\n *\n * @param {object} params - 表格配置参数\n * @param {Columns<T>} [params.columns] - 初始列配置数组\n * @param {T[]} [params.data] - 初始数据源(Element Plus 风格)\n * @param {PageParam} [params.pageParam] - 初始分页参数,默认 `{ current: 1, pageSize: 10, total: 0 }`\n * @param {ExtendWithAny<DeepPartial<D>>} [params.searchParam] - 初始搜索参数\n * @param {Fields<D>} [params.searchFields] - 搜索表单字段配置\n *\n * @returns {Table<D, T>} 表格实例\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number; email: string }\n *\n * const table = useTable<SearchParams, User>({\n * columns: [\n * { prop: 'name', title: '姓名', width: 120 },\n * { prop: 'age', title: '年龄', width: 80 },\n * ],\n * data: [],\n * pageParam: { current: 1, pageSize: 20, total: 0 },\n * searchParam: { keyword: '' },\n * searchFields: [\n * { path: 'keyword', label: '关键词', component: 'input' },\n * ],\n * })\n * ```\n *\n * @see {@link coreUseTable} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useTable<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n>(params: UseTableParams<D, T> = {}): Table<D, T> {\n const { data, columns, ...rest } = params;\n const coreTable = coreUseTable<D, T, Column<T>>({\n ...rest,\n dataSource: data,\n columns: columns as any,\n fieldIdentityKeys: ELEMENT_FIELD_IDENTITY_KEYS,\n });\n\n const { dataSource, ...tableWithoutDataSource } = coreTable as Omit<\n _Table<D, T, Column<T>>,\n 'dataSource'\n > & {\n dataSource: Ref<T[]>;\n };\n const table: Table<D, T> = {\n ...tableWithoutDataSource,\n data: dataSource,\n };\n\n return table;\n}\n","<script lang=\"ts\" setup>\n/**\n * 全局配置提供者组件\n *\n * @component ProComponentProvider\n * @public\n *\n * 用于在组件树的顶层配置所有子组件的全局默认属性。\n * 支持配置 ProForm、ProTable、ProFormItem 以及所有内置组件的默认属性。\n *\n * @param {ComponentVars} [componentVars] - 组件全局配置变量\n * @param {Record<ComponentName, any>} [componentMap] - 自定义组件映射,用于替换或扩展内置组件\n * @param {Partial<ProLocale>} [locale] - 内置文案覆盖,可覆盖任意 locale 文案(如查询/重置/序号/占位符等)\n *\n * @slot default - 需要应用全局配置的子组件内容\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider\n * :componentVars=\"{\n * 'pro-form': { grid: { gutter: 24 } },\n * 'input': { placeholder: '请输入', maxlength: 200 },\n * 'select': { placeholder: '请选择' },\n * }\"\n * >\n * <ProForm :form=\"form\" />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nimport {\n INJECT_COMPONENT_VARS,\n INJECT_COMPONENTS,\n INJECT_CONFIG,\n ensureInjectConfig,\n} from '../constants';\nimport type { ComponentVars } from '../types';\nimport { computed, inject, provide, toValue } from 'vue';\nimport { getObject, mergeComponentVars, omit } from '../../../shared/core';\nimport type { ComponentName } from '../../form/constants';\nimport { LOCALE_INJECT_KEY, type ProLocale } from '../../../locale';\n\ntype ComponentMap = Partial<Record<ComponentName, any>>;\n\ndefineOptions({\n name: 'ProComponentProvider',\n inheritAttrs: false,\n});\n\ntype Props = {\n /**\n * 组件全局配置,可配置所有内置组件和 Pro 组件的默认属性\n * @example { 'input': { placeholder: '请输入' }, 'pro-form': { grid: { gutter: 24 } } }\n */\n componentVars?: ComponentVars;\n /**\n * 自定义组件映射:用于替换或扩展内置组件,传入的组件会覆盖默认的同名组件\n * @example { 'input': MyCustomInput, 'select': MyCustomSelect }\n */\n componentMap?: ComponentMap;\n /**\n * 内置文案覆盖:可覆盖任意 locale 文案(如查询/重置/序号/占位符等),\n * 未覆盖的文案默认跟随宿主组件库语言自动切换\n * @example { 'table.query': '搜索' }\n */\n locale?: Partial<ProLocale>;\n};\n\nconst props = withDefaults(defineProps<Props>(), {\n componentVars: undefined,\n componentMap: undefined,\n locale: undefined,\n});\n\n/*\n * 遍历 componentVars 的每个 key,读取祖先注入值与本层配置合并后向下 provide\n * 合并顺序为内置默认值 → 祖先注入值 → 本层 componentVars,剔除该注入项的不可注入键\n * 子组件通过 inject(config.injectionKey) 获取合并后的计算属性配置\n */\n(Object.keys(INJECT_CONFIG) as Array<keyof typeof INJECT_CONFIG>).forEach(\n key => {\n const config = INJECT_CONFIG[key];\n const ignored = config.ignoreProps;\n const parentConfig = inject(config.injectionKey as any, undefined);\n provide(\n config.injectionKey as any,\n computed(() =>\n omit(\n {\n ...config.default,\n ...(toValue(parentConfig) || {}),\n ...getObject(props.componentVars?.[key as keyof ComponentVars]),\n },\n ignored ?? []\n )\n )\n );\n }\n);\n\n// 为内置集合之外的 componentVars 自定义 key 补建同构注入通道\nif (props.componentVars) {\n Object.keys(props.componentVars).forEach(key => {\n if (!(key in INJECT_CONFIG)) {\n const config = ensureInjectConfig(key);\n const parentConfig = inject(config.injectionKey as any, undefined);\n provide(\n config.injectionKey as any,\n computed(() => ({\n ...(toValue(parentConfig) || {}),\n ...getObject((props.componentVars as any)?.[key]),\n }))\n );\n }\n });\n}\n\nconst parentComponentVars = inject(INJECT_COMPONENT_VARS, undefined);\n// 全量 componentVars:自定义组件键在运行期新增后同样可被子组件读取\nprovide(\n INJECT_COMPONENT_VARS,\n computed(() =>\n mergeComponentVars(\n toValue(parentComponentVars),\n props.componentVars as Record<string, any>\n )\n )\n);\n\nconst parentComponents = inject(INJECT_COMPONENTS, undefined);\n// 注入自定义组件映射,BaseField 在解析组件时会优先使用此映射\nprovide(\n INJECT_COMPONENTS,\n computed(() => ({\n ...(toValue(parentComponents) || {}),\n ...(props.componentMap ?? {}),\n }))\n);\n\nconst parentLocale = inject(LOCALE_INJECT_KEY, undefined);\n// 注入内置文案覆盖,useLocale 在解析文案时会优先使用\nprovide(\n LOCALE_INJECT_KEY,\n computed(() => ({\n ...(toValue(parentLocale) || {}),\n ...(props.locale ?? {}),\n }))\n);\n</script>\n\n<template>\n <slot />\n</template>\n","import type { App } from 'vue';\nimport ProForm from './components/form';\nimport ProTable from './components/table';\nimport ProComponentProvider from './components/component-provider';\n\nexport * from './components/form';\nexport * from './components/table';\nexport * from './components/component-provider';\nexport * from './locale';\n\n/**\n * Schema 驱动的表单组件,基于 element-plus Form 封装\n *\n * @description 通过声明式 JSON Schema 配置即可快速生成表单,\n * 提供极致的 TypeScript 类型推导与组件库插槽扩展能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProForm, useForm } from '@qin-ui/element-plus-pro'\n * const form = useForm<User>({ name: '' }, [\n * { path: 'name', label: '姓名', component: 'input' }\n * ])\n * </script>\n * <template>\n * <ProForm :form=\"form\" />\n * </template>\n * ```\n */\nexport { ProForm };\n/**\n * Schema 驱动的表格组件,基于 element-plus Table 封装\n *\n * @description 通过声明式列配置即可生成功能完整的表格,\n * 支持列动态控制、搜索表单集成、分页管理等企业级能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProTable, useTable } from '@qin-ui/element-plus-pro'\n * const table = useTable<User>({ columns: [{ key: 'name', title: '姓名' }] })\n * </script>\n * <template>\n * <ProTable :table=\"table\" />\n * </template>\n * ```\n */\nexport { ProTable };\n/**\n * 组件提供者,用于全局配置 ProForm 和 ProTable 的默认行为\n *\n * @description 通过 `ProComponentProvider` 包裹应用根组件,\n * 可以全局覆盖组件的默认属性(如表单布局、表格尺寸等)。\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider :componentVars=\"customVars\">\n * <App />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nexport { ProComponentProvider };\n\nexport default {\n /**\n * 安装方法:全局注册 ProForm / ProTable / ProComponentProvider\n *\n * @description 供 `app.use(ProComponents)` 调用\n * @param {App} app - Vue 应用实例\n * @example\n * ```ts\n * import { createApp } from 'vue'\n * import ProComponents from '@qin-ui/element-plus-pro'\n * const app = createApp(App)\n * app.use(ProComponents)\n * ```\n */\n install(app: App) {\n app.component(ProForm.name, ProForm);\n app.component(ProTable.name, ProTable);\n app.component(\n ProComponentProvider.name ?? 'ProComponentProvider',\n ProComponentProvider\n );\n },\n};\n"],"names":["Table","Pagination","GridItem","FormItem","_createBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","$attrs","_renderSlot","_createElementBlock","_Fragment","Input","InputNumber","AutoComplete","Select","Cascader","DatePicker","TimePicker","TimeSelect","CheckboxGroup","RadioGroup","Switch","Slider","TreeSelect","Transfer","coreUseForm","zhCN","zhTW","enUS","useElLocale","value","ContainerFragment","_openBlock","_renderList","_withCtx","_createVNode","SlotComponent","gridItemProps","formItemProps","BaseFormItems","BaseField","ElGridItem","_unref","_useSlots","coreUseFields","coreUseFormRef","_hoisted_1","_createElementVNode","ProForm","Space","Button","_createTextVNode","_toDisplayString","_normalizeStyle","_useModel","Dropdown","DropdownMenu","DropdownItem","getColumnKey","item","Checkbox","_withModifiers","TableColumn","pageParam","_normalizeClass","$slots","_withDirectives","TableColumnRenderer","_guardReactiveProps","coreUseTable","ProComponentProvider"],"mappings":"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"}