@aspire-ui/element-component-pro 1.0.25 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/ProTableForm/CellEditor.vue.d.ts +33 -0
  2. package/dist/ProTableForm/ProTableForm.vue.d.ts +122 -102
  3. package/dist/ProTableForm/index.d.ts +4 -2
  4. package/dist/ProTableForm/types.d.ts +1 -69
  5. package/dist/ProTableForm/useProTableForm.d.ts +55 -0
  6. package/dist/element-component-pro.es.js +1433 -1255
  7. package/dist/element-component-pro.es.js.map +1 -1
  8. package/dist/element-component-pro.umd.js +2 -2
  9. package/dist/element-component-pro.umd.js.map +1 -1
  10. package/dist/index.d.ts +445 -282
  11. package/dist/style.css +1 -1
  12. package/dist/types/index.d.ts +227 -0
  13. package/docs/CollapseContainer.md +100 -0
  14. package/docs/ComponentSetting.md +113 -0
  15. package/docs/ProDescriptions.md +215 -0
  16. package/docs/ProForm.md +879 -0
  17. package/docs/ProTable-Redesign.md +214 -0
  18. package/docs/ProTable.md +556 -0
  19. package/docs/ProTableForm.md +207 -0
  20. package/docs/image.png +0 -0
  21. package/package.json +3 -2
  22. package/src/CollapseContainer/CollapseContainer.vue +1 -1
  23. package/src/ProDescriptions/ProDescriptions.vue +1 -1
  24. package/src/ProForm/FormActions.vue +1 -1
  25. package/src/ProForm/ProForm.vue +1 -1
  26. package/src/ProForm/ProFormItem.vue +1 -1
  27. package/src/ProForm/TreeSelect.vue +1 -1
  28. package/src/ProTable/ProTable.vue +1 -2
  29. package/src/ProTable/TableAction.vue +1 -1
  30. package/src/ProTableForm/CellEditor.vue +192 -0
  31. package/src/ProTableForm/ProTableForm.vue +350 -453
  32. package/src/ProTableForm/TableFormCell.vue +46 -0
  33. package/src/ProTableForm/index.ts +6 -7
  34. package/src/ProTableForm/types.ts +12 -72
  35. package/src/ProTableForm/useProTableForm.ts +442 -0
  36. package/src/index.ts +6 -4
  37. package/src/types/index.ts +241 -0
@@ -1 +1 @@
1
- {"version":3,"file":"element-component-pro.es.js","sources":["../src/useComponentSetting.ts","../src/ProTable/components/CellRenderers.ts","../src/ProTable/components/TableColumnGroup.vue","../src/ProTable/ProTable.vue","../src/utils/tooltip.ts","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.vue","../src/utils/formattedNumber.ts","../src/ProForm/FormattedNumberInput.vue","../src/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/ProDescriptions/ProDescriptions.vue","../src/ProDescriptions/useDescription.ts","../src/CollapseContainer/CollapseContainer.vue","../src/ProTableForm/ProTableForm.vue","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\n/**\n * 深度合并两个对象\n * - source 的值会覆盖 target 的值\n * - 对于嵌套对象,会递归合并\n * - 数组直接替换,不合并\n */\nfunction deepMerge(target: Record<string, unknown>, source?: Record<string, unknown>): Record<string, unknown> {\n if (!source) return target\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const targetValue = target[key]\n const sourceValue = source[key]\n if (key === 'components') {\n target[key] = { ...(targetValue as Record<string, unknown>), ...(sourceValue as Record<string, unknown>) }\n } else if (isPlainObject(sourceValue)) {\n if (!isPlainObject(targetValue)) {\n target[key] = { ...(sourceValue as Record<string, unknown>) }\n } else {\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n }\n } else {\n target[key] = sourceValue\n }\n }\n }\n\n return target\n}\n\n/** 判断是否为普通对象(非数组、非 null) */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string) => T\n /** 设置组件默认配置(与已有配置深度合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n /** 合并组件配置:全局配置与组件 props 合并,返回合并后的结果 */\n mergeSettings: <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>) => T\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置\n * - setSetting:设置组件默认配置(深度合并),可在应用入口或按需调用\n * - mergeSettings:合并全局配置与组件 props,props 优先级更高\n *\n * 合并优先级:组件默认值 < 全局配置 < 组件 props\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n /** 返回浅拷贝(仅外层解包),内部保持对 reactive 存储的直接引用,保证响应式追踪 */\n const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return { ...componentSettings } as T\n }\n return { ...(componentSettings[componentName] ?? {}) } as T\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n if (current) {\n componentSettings[componentName] = deepMerge({ ...current }, config)\n } else {\n componentSettings[componentName] = { ...config }\n }\n }\n\n /** 合并全局配置与组件 props,props 优先级更高 */\n const mergeSettings = <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>): T => {\n const globalSetting = componentSettings[componentName] ?? {}\n return deepMerge({ ...globalSetting }, props) as T\n }\n\n return {\n getSetting,\n setSetting,\n mergeSettings,\n }\n}\n","import { defineComponent, h } from 'vue'\nimport type { ProColumn } from '../types'\n\nexport const DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n },\n setup(p) {\n return () => {\n const col = p.column as any\n if (col?.customRender) {\n const r = col.customRender({ text: p.value, record: p.record, index: p.index })\n if (typeof r === 'string' || typeof r === 'number') return h('span', String(r))\n return r as any\n }\n if (col?.valueEnum) {\n const text = col.valueEnum?.[p.value]?.text ?? p.value\n return h('span', text == null ? '' : String(text))\n }\n return h('span', p.value == null ? '' : String(p.value))\n }\n },\n})\n\nexport const BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n customRender: { type: Function, required: false },\n valueEnum: { type: Object, required: false },\n },\n setup(p) {\n return () => {\n const slot = p.slotRender as any\n const nodes = slot?.({ column: p.column, record: p.record, index: p.index, value: p.value })\n\n const normalize = (n: any) => {\n if (n == null) return []\n if (Array.isArray(n)) return n.filter((x) => x != null && x !== false && !x.isComment)\n return [n]\n }\n const normalized = normalize(nodes)\n if (normalized.length > 0) return nodes\n\n const col = { ...(p.column as any) }\n if (p.customRender) col.customRender = p.customRender\n if (p.valueEnum) col.valueEnum = p.valueEnum\n return h(DefaultCellRenderer as any, { props: { column: col, record: p.record, index: p.index, value: p.value } })\n }\n },\n})\n","<template>\n <el-table-column\n v-if=\"column.children && column.children.length > 0\"\n :label=\"column.title\"\n :align=\"column.align || 'left'\"\n :fixed=\"column.fixed\"\n >\n <template v-for=\"child in column.children\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(child)\"\n :key=\"child.key || child.dataIndex || child.title\"\n :column=\"child\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n </el-table-column>\n <el-table-column\n v-else\n :prop=\"column.dataIndex\"\n :label=\"column.title\"\n :min-width=\"getColumnWidth(column)\"\n :fixed=\"column.fixed\"\n :align=\"column.align || 'left'\"\n :sortable=\"column.sortable\"\n :formatter=\"column.formatter\"\n :show-overflow-tooltip=\"column.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template #default=\"slotProps\">\n <slot\n v-if=\"column.dataIndex && $scopedSlots[column.dataIndex]\"\n :name=\"column.dataIndex\"\n :row=\"slotProps.row\"\n :column=\"column\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n :custom-render=\"column.customRender\"\n :value-enum=\"column.valueEnum\"\n />\n <DefaultCellRenderer\n v-else\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n </template>\n <template #header>\n <slot\n v-if=\"column.dataIndex && $scopedSlots[`header-${column.dataIndex}`]\"\n :name=\"`header-${column.dataIndex}`\"\n :column=\"column\"\n />\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"column\"\n />\n <template v-else>\n <span>{{ column.title }}</span>\n <el-tooltip v-if=\"column.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template #content>\n <span v-if=\"Array.isArray(column.helpMessage)\">\n <div v-for=\"(msg, i) in column.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ column.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n </el-table-column>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlots } from 'vue'\nimport type { ProColumn, ProTableProps } from '../types'\nimport { DefaultCellRenderer, BodyCellRenderer } from './CellRenderers'\n\nconst props = defineProps<{\n column: ProColumn\n effectiveProps: ProTableProps\n getColumnWidth: (col: ProColumn) => number | string | undefined\n}>()\n\nconst $scopedSlots = useSlots()\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n</script>\n","<template>\n <div class=\"ecp-pro-table\">\n <!-- 标题栏 -->\n <div v-if=\"showTitleBar\" class=\"ecp-pro-table__header\">\n <div class=\"ecp-pro-table__title-wrapper\">\n <span class=\"ecp-pro-table__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.titleHelpMessage\" class=\"ecp-pro-table__help\" placement=\"top\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.titleHelpMessage)\">\n <div v-for=\"(msg, i) in effectiveProps.titleHelpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.titleHelpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </div>\n <div class=\"ecp-pro-table__toolbar\">\n <slot name=\"tableTitle\" />\n <slot name=\"toolbar\" />\n <slot name=\"toolbar-right\">\n <el-button\n v-if=\"effectiveProps.tableSetting?.redo !== false\"\n type=\"text\"\n icon=\"el-icon-refresh\"\n size=\"small\"\n @click=\"handleReload\"\n >\n 刷新\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 表格主体(Element UI el-table 无 loading 属性,使用 v-loading 指令) -->\n <div ref=\"tableWrapRef\" class=\"ecp-pro-table__body\" v-loading=\"loading\">\n <el-table\n ref=\"tableRef\"\n :data=\"innerData\"\n :row-key=\"effectiveProps.rowKey\"\n :border=\"effectiveProps.bordered\"\n :stripe=\"effectiveProps.striped\"\n :size=\"effectiveProps.size\"\n :max-height=\"effectiveProps.maxHeight\"\n :height=\"effectiveProps.height\"\n :default-sort=\"effectiveProps.defaultSort\"\n :span-method=\"spanMethodAdapter\"\n :tree-props=\"effectiveProps.treeProps\"\n :default-expand-all=\"effectiveProps.defaultExpandAll\"\n :expand-row-keys=\"effectiveProps.expandRowKeys || []\"\n :lazy=\"effectiveProps.lazy\"\n :load=\"effectiveProps.load\"\n v-bind=\"effectiveProps.tableProps\"\n :row-class-name=\"effectiveProps.rowClassName\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @sort-change=\"handleSortChange\"\n @expand-change=\"handleExpandChange\"\n >\n <!-- 选择列:自定义实现,参考 VbenAdmin,支持单选/多选/禁用/跨页 -->\n <el-table-column\n v-if=\"effectiveProps.rowSelection\"\n :width=\"effectiveProps.rowSelection.width || 48\"\n :fixed=\"effectiveProps.rowSelection.fixed\"\n align=\"center\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 多选:表头全选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isAllCurrentPageSelected\"\n :indeterminate=\"isIndeterminate\"\n :disabled=\"!hasSelectableRows\"\n @change=\"handleSelectAll\"\n />\n <span v-else />\n </template>\n <template slot-scope=\"scope\">\n <!-- 多选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isRowSelected(scope.row)\"\n :disabled=\"getCheckboxDisabled(scope.row)\"\n @change=\"(val) => handleCheckboxChange(scope.row, val)\"\n @click.native.stop\n />\n <!-- 单选 -->\n <el-radio\n v-else\n :value=\"selectedRows[0]?.[rowKeyField]\"\n :label=\"scope.row[rowKeyField]\"\n :disabled=\"getRadioDisabled(scope.row)\"\n @change=\"handleRadioSelect(scope.row)\"\n @click.native.stop\n >\n <span />\n </el-radio>\n </template>\n </el-table-column>\n <!-- 序号列 -->\n <el-table-column\n v-if=\"effectiveProps.showIndexColumn\"\n type=\"index\"\n :label=\"effectiveProps.indexColumnProps?.title || '序号'\"\n :width=\"effectiveProps.indexColumnProps?.width || 60\"\n :fixed=\"effectiveProps.indexColumnProps?.fixed\"\n :align=\"effectiveProps.indexColumnProps?.align || 'center'\"\n />\n <!-- 数据列(支持多级表头) -->\n <template v-for=\"col in displayColumns\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.key || col.dataIndex || col.title\"\n :column=\"col\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n <!-- 操作列 -->\n <el-table-column\n v-if=\"effectiveProps.actionColumn\"\n :label=\"effectiveProps.actionColumn.title || '操作'\"\n :width=\"effectiveProps.actionColumn.width || 150\"\n :fixed=\"effectiveProps.actionColumn.fixed || 'right'\"\n :align=\"effectiveProps.actionColumn.align || 'center'\"\n >\n <template slot-scope=\"scope\">\n <slot\n v-if=\"$scopedSlots['action']\"\n name=\"action\"\n :record=\"scope.row\"\n :column=\"effectiveProps.actionColumn\"\n :index=\"scope.$index\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"effectiveProps.actionColumn\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"undefined\"\n :custom-render=\"effectiveProps.actionColumn.customRender\"\n :value-enum=\"effectiveProps.actionColumn.valueEnum\"\n />\n </template>\n </el-table-column>\n </el-table>\n </div>\n\n <!-- 分页 -->\n <div v-if=\"showPagination\" class=\"ecp-pro-table__pagination\">\n <el-pagination\n :current-page=\"pagination.page\"\n :page-sizes=\"pagination.pageSizes\"\n :page-size=\"pagination.pageSize\"\n :total=\"pagination.total\"\n :small=\"paginationSmall\"\n :background=\"paginationBackground\"\n :layout=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' ? effectiveProps.pagination.layout : null) || 'total, sizes, prev, pager, next, jumper'\"\n v-bind=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' && effectiveProps.pagination.props) || {}\"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// @ts-nocheck - Vue 2 el-table-column slot-scope 类型推断存在已知限制,暂用此方式消除模板内 scope 相关告警\nimport { ref, computed, watch, onMounted, onUnmounted, useSlots, nextTick } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\nimport TableColumnGroup from './components/TableColumnGroup.vue'\nimport { DefaultCellRenderer, BodyCellRenderer } from './components/CellRenderers'\n\nconst props = withDefaults(\n defineProps<{\n columns?: ProColumn[]\n dataSource?: Record<string, unknown>[]\n api?: (params: Record<string, unknown>) => Promise<{ list?: unknown[]; items?: unknown[]; total?: number }>\n rowKey?: string\n title?: string\n titleHelpMessage?: string | string[]\n bordered?: boolean\n striped?: boolean\n size?: 'medium' | 'small' | 'large'\n loading?: boolean\n maxHeight?: number | string\n height?: number | string\n ellipsis?: boolean\n showIndexColumn?: boolean\n indexColumnProps?: Partial<ProColumn>\n actionColumn?: Partial<ProColumn>\n rowSelection?: { type?: 'checkbox' | 'radio'; width?: number; fixed?: 'left' | 'right'; getCheckboxProps?: (r: Record<string, unknown>) => { disabled?: boolean }; getRadioProps?: (r: Record<string, unknown>) => { disabled?: boolean } }\n clearSelectOnPageChange?: boolean\n pagination?: false | { pageSize?: number; pageSizes?: number[]; layout?: string; small?: boolean; background?: boolean; props?: Record<string, unknown> } | Record<string, unknown>\n tableSetting?: { redo?: boolean; size?: boolean; setting?: boolean; fullScreen?: boolean }\n fetchSetting?: FetchSetting\n beforeFetch?: (params: Record<string, unknown>) => Record<string, unknown>\n afterFetch?: (data: unknown) => unknown\n immediate?: boolean\n searchInfo?: Record<string, unknown>\n defaultSort?: { prop: string; order: 'ascending' | 'descending' }\n tableProps?: Record<string, unknown>\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n spanMethod?: (params: { row: Record<string, unknown>; column: Record<string, unknown>; rowIndex: number; columnIndex: number }) => [number, number] | { rowspan: number; colspan: number }\n treeProps?: { hasChildren?: string; children?: string }\n defaultExpandAll?: boolean\n expandRowKeys?: (string | number)[]\n lazy?: boolean\n load?: (row: Record<string, unknown>, treeNode: { level: number; expanded: boolean; loaded: boolean }, resolve: (data: Record<string, unknown>[]) => void) => void\n }>(),\n {\n rowKey: 'id',\n clearSelectOnPageChange: false,\n bordered: false,\n striped: true,\n size: 'medium',\n loading: false,\n ellipsis: true,\n showIndexColumn: true,\n pagination: () => ({ pageSize: 10, pageSizes: [10, 20, 50, 100] }),\n tableSetting: () => ({ redo: true }),\n fetchSetting: () => ({\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'list',\n totalField: 'total',\n }),\n immediate: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: TableActionType): void\n (e: 'fetch-success', data: { items: unknown[]; total: number }): void\n (e: 'fetch-error', error: unknown): void\n (e: 'selection-change', data: { keys: (string | number)[]; rows: Record<string, unknown>[] }): void\n (e: 'row-click', record: Record<string, unknown>, event: Event): void\n (e: 'row-dblclick', record: Record<string, unknown>, event: Event): void\n (e: 'sort-change', sortInfo: { prop: string; order: string }): void\n (e: 'expand-change', row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]): void\n}>()\n\nconst slots = useSlots()\nconst tableRef = ref()\nconst tableWrapRef = ref()\nconst containerWidth = ref(0)\nconst loading = ref(props.loading ?? false)\nconst localFullData = ref<Record<string, unknown>[]>([])\n/** 本地模式数据;API 模式下存服务端返回的当前页数据 */\nconst innerData = computed(() => {\n const data = localFullData.value\n // 不分页时展示全量数据\n if (!showPagination.value) return data\n if (!data.length) return data\n const { page, pageSize } = pagination.value\n const start = (page - 1) * pageSize\n return data.slice(start, start + pageSize)\n})\nconst rawDataSource = ref<Record<string, unknown>>({})\nconst innerColumns = ref<ProColumn[]>([])\nconst innerProps = ref<Partial<ProTableProps>>({})\nconst selectedRows = ref<Record<string, unknown>[]>([])\nconst showPaginationRef = ref<boolean | null>(null)\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<ProTableProps>('ProTable', { ...props, ...innerProps.value }))\n\n/** 从 effectiveProps.pagination 读取分页默认值(已通过深度合并) */\nconst defaultPagination = computed(() => {\n const paginationConfig = effectiveProps.value.pagination\n if (paginationConfig && typeof paginationConfig === 'object') {\n return {\n pageSize: (paginationConfig as Record<string, unknown>).pageSize ?? 10,\n pageSizes: ((paginationConfig as Record<string, unknown>).pageSizes as number[]) ?? [10, 20, 50, 100],\n }\n }\n return { pageSize: 10, pageSizes: [10, 20, 50, 100] as number[] }\n})\n\nconst pagination = ref({\n page: 1,\n pageSize: defaultPagination.value.pageSize,\n pageSizes: defaultPagination.value.pageSizes,\n total: 0,\n})\n\nconst showTitleBar = computed(() => !!effectiveProps.value.title || !!slots.tableTitle || !!slots.toolbar)\nconst showPagination = computed(() => {\n if (showPaginationRef.value !== null) return showPaginationRef.value\n return !!props.pagination && typeof props.pagination === 'object'\n})\n\n/** 分页 small 属性:从 pagination 配置或全局设置中读取 */\nconst paginationSmall = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).small\n }\n return false\n})\n\n/** 分页 background 属性:从 pagination 配置或全局设置中读取 */\nconst paginationBackground = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).background\n }\n return false\n})\n\nconst rowKeyField = computed(() => effectiveProps.value.rowKey || 'id')\n\n/** 选中行 key 集合(用于快速判断) */\nconst selectedKeysSet = computed(() => new Set(selectedRows.value.map((r) => r[rowKeyField.value] as string | number)))\n\n/** 显示列 */\nconst displayColumns = computed(() =>{\n console.log(innerColumns.value)\n return innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n})\n\n/** 扁平列映射:columnId -> 原始 ProColumn(供 spanMethod 使用) */\nconst flatColumnsMap = computed(() => {\n const map = new Map<string, ProColumn>()\n const flatten = (cols: ProColumn[]) => {\n for (const col of cols) {\n if (col.children && col.children.length > 0) {\n flatten(col.children)\n } else {\n if (col.dataIndex) map.set(col.dataIndex, col)\n }\n }\n }\n flatten(displayColumns.value)\n return map\n})\n\n/** 所有可见叶子列(支持多级表头) */\nconst allFlatColumns = computed(() => Array.from(flatColumnsMap.value.values()))\n\n/** 固定列总宽度 */\nconst fixedColumnsWidth = computed(() => {\n let w = 0\n if (effectiveProps.value.rowSelection) w += Number(effectiveProps.value.rowSelection.width) || 48\n if (effectiveProps.value.showIndexColumn) w += Number(effectiveProps.value.indexColumnProps?.width) || 60\n if (effectiveProps.value.actionColumn) w += Number(effectiveProps.value.actionColumn?.width) || 150\n return w\n})\n\nconst isRatioWidth = (w: number | string | undefined) => typeof w === 'number' && w > 0\nconst totalRatio = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && isRatioWidth(c.width))\n return cols.reduce((sum, c) => sum + (typeof c.width === 'number' ? c.width : 0), 0)\n})\n\nconst fixedDataColumnsWidth = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && typeof c.width === 'string')\n return cols.reduce((sum, c) => sum + (Number(getColumnWidth(c)) || 80), 0)\n})\n\nconst parseWidthPx = (v: number | string | undefined): number | null =>\n v == null ? null : typeof v === 'number' ? v : parseInt(String(v).replace(/px$/i, ''), 10) || null\n\n/** spanMethod 适配器:给用户回调注入原始 ProColumn */\nconst spanMethodAdapter: TableProps<any>['spanMethod'] = (\n param: { row: any; column: any; rowIndex: number; columnIndex: number }\n) => {\n if (!effectiveProps.value.spanMethod) return [1, 1]\n const original = flatColumnsMap.value.get(param.column.property)\n return effectiveProps.value.spanMethod({\n ...param,\n column: original ? {...original,...param.column } : { ...param.column, dataIndex: param.column.property, title: param.column.label },\n })\n}\n\nconst getColumnWidth = (col: ProColumn): number | string | undefined => {\n const w = col.width\n if (isRatioWidth(w) && totalRatio.value > 0 && containerWidth.value > 0 && typeof w === 'number') {\n const available = containerWidth.value - fixedColumnsWidth.value - fixedDataColumnsWidth.value\n let result = Math.floor((available * w) / totalRatio.value)\n const minPx = parseWidthPx(col.minWidth) ?? 60\n const maxPx = parseWidthPx(col.maxWidth)\n result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n if (typeof w === 'string') {\n const basePx = parseWidthPx(w) ?? 80\n const minPx = parseWidthPx(col.minWidth)\n const maxPx = parseWidthPx(col.maxWidth)\n let result = basePx\n if (minPx != null) result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n return col.minWidth\n}\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n\n/** 当前页可选行(未禁用) */\nconst selectableRows = computed(() => {\n const getDisabled = effectiveProps.value.rowSelection?.getCheckboxProps\n if (!getDisabled) return innerData.value\n return innerData.value.filter((row) => !getDisabled(row)?.disabled)\n})\n\nconst hasSelectableRows = computed(() => selectableRows.value.length > 0)\n\n/** 当前页是否全选 */\nconst isAllCurrentPageSelected = computed(() => {\n if (selectableRows.value.length === 0) return false\n return selectableRows.value.every((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number))\n})\n\n/** 半选状态 */\nconst isIndeterminate = computed(() => {\n const selectedCount = selectableRows.value.filter((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number)).length\n return selectedCount > 0 && selectedCount < selectableRows.value.length\n})\n\nconst isRowSelected = (row: Record<string, unknown>) =>\n selectedKeysSet.value.has(row[rowKeyField.value] as string | number)\n\nconst getCheckboxDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getCheckboxProps?.(row)?.disabled ?? false\n\nconst getRadioDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getRadioProps?.(row)?.disabled ?? false\n\nconst emitSelectionChange = () => {\n const keys = selectedRows.value.map((r) => r[rowKeyField.value] as string | number)\n emit('selection-change', { keys, rows: selectedRows.value })\n}\n\nconst handleCheckboxChange = (row: Record<string, unknown>, checked: boolean) => {\n const key = row[rowKeyField.value] as string | number\n if (checked) {\n selectedRows.value = [...selectedRows.value.filter((r) => r[rowKeyField.value] !== key), row]\n } else {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n }\n emitSelectionChange()\n}\n\nconst handleRadioSelect = (row: Record<string, unknown>) => {\n selectedRows.value = [row]\n emitSelectionChange()\n}\n\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n const keySet = new Set(selectedRows.value.map((r) => r[rowKeyField.value]))\n const toAdd = selectableRows.value.filter((row) => !keySet.has(row[rowKeyField.value]))\n selectedRows.value = [...selectedRows.value, ...toAdd]\n } else {\n const currentPageKeys = new Set(innerData.value.map((r) => r[rowKeyField.value]))\n selectedRows.value = selectedRows.value.filter((r) => !currentPageKeys.has(r[rowKeyField.value]))\n }\n emitSelectionChange()\n}\n\nconst fetchData = async (opt?: FetchParams) => {\n if (!props.api) {\n if (props.dataSource) return\n localFullData.value = []\n return\n }\n loading.value = true\n try {\n const fs = effectiveProps.value.fetchSetting ?? {}\n const pageField = fs.pageField ?? 'page'\n const sizeField = fs.sizeField ?? 'pageSize'\n const listField = fs.listField ?? 'list'\n const totalField = fs.totalField ?? 'total'\n const params: Record<string, unknown> = {\n [pageField]: opt?.page ?? pagination.value.page,\n [sizeField]: opt?.pageSize ?? pagination.value.pageSize,\n ...props.searchInfo,\n ...opt?.searchInfo,\n }\n if (opt?.page != null) pagination.value.page = opt.page\n if (opt?.pageSize != null) pagination.value.pageSize = opt.pageSize\n const processedParams = props.beforeFetch ? props.beforeFetch(params) : params\n const res = await props.api!(processedParams)\n rawDataSource.value = (res || {}) as Record<string, unknown>\n const data = (props.afterFetch ? props.afterFetch(res) : res) as Record<string, unknown>\n const list = (data[listField] ?? data.items ?? data.list ?? []) as unknown[]\n const total = (data[totalField] ?? 0) as number\n localFullData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\n localFullData.value = []\n emit('fetch-error', e)\n } finally {\n loading.value = false\n }\n}\n\nconst handleReload = () => fetchData(undefined)\nconst handleSizeChange = (size: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.pageSize = size\n pagination.value.page = 1\n fetchData(undefined)\n}\nconst handleCurrentChange = (page: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.page = page\n fetchData(undefined)\n}\nconst handleRowClick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-click', row, event)\nconst handleRowDblclick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-dblclick', row, event)\nconst handleSortChange = ({ prop, order }: { prop: string; order: string }) => emit('sort-change', { prop, order })\nconst handleExpandChange = (row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]) => emit('expand-change', row, expanded)\n\nconst tableAction: TableActionType = {\n setProps: (p) => { innerProps.value = { ...innerProps.value, ...p } },\n reload: (opt) => fetchData(opt),\n redoHeight: () => { tableRef.value?.doLayout?.() },\n setLoading: (v) => { loading.value = v },\n /** 返回全量数据(API 模式为服务端返回的当前页数据,本地模式为原始全量数据) */\n getDataSource: () => localFullData.value,\n getRawDataSource: () => rawDataSource.value,\n /** 设置本地全量数据,同时同步 total */\n setTableData: (data) => {\n localFullData.value = data ?? []\n if (props.pagination !== false) pagination.value.total = (data ?? []).length\n },\n getColumns: () => innerColumns.value,\n setColumns: (cols) => {\n if (Array.isArray(cols) && cols.length > 0 && typeof cols[0] === 'string') {\n const keyList = cols as string[]\n const fromProps = (props.columns ?? []).filter((c) => keyList.includes((c.key ?? c.dataIndex) as string))\n const ordered = keyList.map((k) => fromProps.find((c) => (c.key ?? c.dataIndex) === k)).filter(Boolean) as ProColumn[]\n if (ordered.length) innerColumns.value = ordered\n } else {\n innerColumns.value = (cols as ProColumn[]) ?? []\n }\n },\n setPagination: (info) => {\n if (info?.page) pagination.value.page = info.page\n if (info?.pageSize) pagination.value.pageSize = info.pageSize\n if (info?.total !== undefined) pagination.value.total = info.total\n },\n getSelectRowKeys: () => selectedRows.value.map((r) => r[rowKeyField.value] as string | number),\n getSelectRows: () => selectedRows.value,\n clearSelectedRowKeys: () => { selectedRows.value = []; emitSelectionChange() },\n setSelectedRowKeys: (keys) => {\n const keySet = new Set(keys)\n const rows = localFullData.value.filter((r) => keySet.has(r[rowKeyField.value] as string | number))\n keys.forEach((k) => {\n if (!rows.some((r) => r[rowKeyField.value] === k)) {\n rows.push({ [rowKeyField.value]: k } as Record<string, unknown>)\n }\n })\n selectedRows.value = rows\n emitSelectionChange()\n },\n deleteSelectRowByKey: (key) => {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n emitSelectionChange()\n },\n /** index 为当前页索引,自动转换为全量索引 */\n updateTableData: (index, key, value) => {\n const { page, pageSize } = pagination.value\n const fullIndex = (page - 1) * pageSize + index\n if (fullIndex < 0 || fullIndex >= localFullData.value.length) return\n localFullData.value = [...localFullData.value]\n localFullData.value[fullIndex] = { ...localFullData.value[fullIndex], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = localFullData.value.findIndex((r) => r[rowKeyField.value] === rowKey)\n if (idx < 0) return\n localFullData.value = [...localFullData.value]\n localFullData.value[idx] = { ...localFullData.value[idx], ...record }\n return localFullData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n localFullData.value = localFullData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n if (props.pagination !== false) pagination.value.total = localFullData.value.length\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...localFullData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n localFullData.value = arr\n if (props.pagination !== false) pagination.value.total = localFullData.value.length\n return record\n },\n getPaginationRef: () =>\n showPagination.value\n ? { page: pagination.value.page, pageSize: Number(pagination.value.pageSize) || 10, total: pagination.value.total }\n : false,\n getShowPagination: () => showPagination.value,\n setShowPagination: (show) => { showPaginationRef.value = show },\n getRowSelection: () => effectiveProps.value.rowSelection,\n expandAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(localFullData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, true))\n },\n collapseAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(localFullData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => {\n const assignIds = (cols: ProColumn[], parentKey = ''): ProColumn[] =>\n cols.map((c, i) => {\n const key = `${c.dataIndex}`\n return {\n ...c,\n dataIndex: key,\n children: c.children ? assignIds(c.children, key) : undefined,\n }\n })\n innerColumns.value = assignIds(props.columns ?? [])\n}\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n localFullData.value = [...props.dataSource]\n if (!props.api && props.pagination !== false) {\n pagination.value.total = props.dataSource.length\n }\n }\n}\n\nconst updateContainerWidth = () => {\n if (tableWrapRef.value) containerWidth.value = tableWrapRef.value.offsetWidth || 0\n}\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedEl: Element | null = null\n\nonMounted(() => {\n syncColumns()\n emit('register', tableAction)\n loadData()\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateContainerWidth)\n resizeObserver = new ResizeObserver(updateContainerWidth)\n nextTick(() => {\n updateContainerWidth()\n observedEl = tableWrapRef.value\n if (observedEl) resizeObserver?.observe(observedEl)\n })\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateContainerWidth)\n if (resizeObserver && observedEl) {\n resizeObserver.unobserve(observedEl)\n observedEl = null\n }\n }\n})\n\nwatch(() => props.columns, syncColumns, { deep: true })\nwatch(() => props.dataSource, () => {\n if (!props.api && props.dataSource) {\n localFullData.value = [...props.dataSource]\n if (props.pagination !== false) pagination.value.total = props.dataSource.length\n }\n}, { deep: true })\nwatch(() => props.loading, (v) => { loading.value = v ?? false })\n</script>\n\n<style scoped>\n.ecp-pro-table {\n padding: 16px;\n background: #fff;\n width: 100%;\n box-sizing: border-box;\n}\n.ecp-pro-table :deep(.el-table) {\n width: 100% !important;\n}\n.ecp-pro-table__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.ecp-pro-table__title-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-pro-table__title {\n font-size: 16px;\n font-weight: 600;\n}\n.ecp-pro-table__help {\n color: #909399;\n cursor: help;\n}\n.ecp-pro-table__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ecp-pro-table__body {\n width: 100%;\n}\n.ecp-pro-table__pagination {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.ecp-pro-table__col-help {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n}\n</style>\n","export type TooltipValue = boolean | string | Record<string, unknown>\n\nexport const hasTooltipContent = (value: unknown): boolean => {\n if (Array.isArray(value)) return value.length > 0\n return value !== undefined && value !== null && String(value).trim() !== ''\n}\n\nexport const getTooltipContent = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(', ')\n }\n if (value === undefined || value === null) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const normalizeTooltipConfig = (\n tooltip: TooltipValue | null | undefined,\n fallbackValue?: unknown\n): Record<string, unknown> | null => {\n if (!tooltip) return null\n\n if (tooltip === true) {\n return {\n content: getTooltipContent(fallbackValue),\n placement: 'top',\n effect: 'dark',\n disabled: !hasTooltipContent(fallbackValue),\n }\n }\n\n if (typeof tooltip === 'string') {\n return {\n content: tooltip,\n placement: 'top',\n effect: 'dark',\n }\n }\n\n const normalized = { ...tooltip }\n const hasExplicitContent = Object.prototype.hasOwnProperty.call(normalized, 'content')\n if (!hasExplicitContent) {\n normalized.content = getTooltipContent(fallbackValue)\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'placement')) {\n normalized.placement = 'top'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'effect')) {\n normalized.effect = 'dark'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'disabled')) {\n normalized.disabled = !hasTooltipContent(normalized.content)\n }\n\n return normalized\n}\n","<template>\n <div class=\"ecp-table-action\">\n <!-- 主操作按钮组 -->\n <span\n v-for=\"(action, index) in visibleActions\"\n :key=\"`action-${index}`\"\n class=\"ecp-table-action__item\"\n >\n <!-- 气泡确认 -->\n <el-popconfirm\n v-if=\"action.popConfirm\"\n :title=\"action.popConfirm.title\"\n :confirm-button-text=\"action.popConfirm.okText || '确定'\"\n :cancel-button-text=\"action.popConfirm.cancelText || '取消'\"\n @confirm=\"handlePopConfirmConfirm(action, $event)\"\n @cancel=\"handlePopConfirmCancel(action, $event)\"\n >\n <span slot=\"reference\">\n <component\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n </span>\n </el-popconfirm>\n\n <!-- 普通按钮 -->\n <component\n v-else\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n\n <el-divider v-if=\"action.divider\" direction=\"vertical\" />\n </span>\n\n <!-- 下拉更多操作 -->\n <el-dropdown v-if=\"visibleDropDownActions.length\" trigger=\"click\" @command=\"handleDropdownCommand\">\n <span class=\"ecp-table-action__more\">\n <el-button type=\"text\" size=\"small\">\n 更多<i class=\"el-icon-arrow-down el-icon--right\" />\n </el-button>\n </span>\n <el-dropdown-menu slot=\"dropdown\">\n <el-dropdown-item\n v-for=\"(action, index) in visibleDropDownActions\"\n :key=\"`dropdown-${index}`\"\n :command=\"index\"\n :disabled=\"action.disabled\"\n :divided=\"!!action.divider\"\n >\n <span class=\"ecp-table-action__dropdown-item\">\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </el-dropdown>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { MessageBox } from 'element-ui'\nimport type { TableActionItem } from './types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst props = withDefaults(\n defineProps<{\n actions?: TableActionItem[]\n dropDownActions?: TableActionItem[]\n /** 是否阻止按钮 click 冒泡,参考 VbenAdmin stopButtonPropagation */\n stopButtonPropagation?: boolean\n }>(),\n {\n actions: () => [],\n dropDownActions: () => [],\n stopButtonPropagation: false,\n }\n)\n\nconst normalizeTooltip = (tooltip?: TableActionItem['tooltip']) => {\n return normalizeTooltipConfig(tooltip) || {}\n}\n\nconst getButtonType = (action: TableActionItem) => {\n if (action.type) return action.type\n if (action.color === 'error') return 'danger'\n if (action.color === 'success') return 'success'\n if (action.color === 'warning') return 'warning'\n return 'text'\n}\n\nconst filterVisible = (list: TableActionItem[]) =>\n list.filter((item) => {\n const { ifShow } = item\n if (typeof ifShow === 'boolean') return ifShow\n if (typeof ifShow === 'function') return ifShow(item)\n return true\n })\n\nconst visibleActions = computed(() => filterVisible(props.actions || []))\nconst visibleDropDownActions = computed(() => filterVisible(props.dropDownActions || []))\n\nconst handleClick = (action: TableActionItem, e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n action.onClick?.(e)\n}\n\nconst handleActionClick = (action: TableActionItem, e: MouseEvent) => {\n handleClick(action, e)\n}\n\nconst handlePopConfirm = (action: TableActionItem, type: 'confirm' | 'cancel', e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n if (!action.popConfirm) return\n if (type === 'confirm') {\n action.popConfirm.confirm?.()\n } else {\n action.popConfirm.cancel?.()\n }\n}\n\nconst handlePopConfirmConfirm = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'confirm', e)\n}\n\nconst handlePopConfirmCancel = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'cancel', e)\n}\n\nconst handleDropdownCommand = (index: number | string) => {\n const idx = Number(index)\n const action = visibleDropDownActions.value[idx]\n if (!action || action.disabled) return\n if (action.popConfirm) {\n const title = action.popConfirm.title\n const okText = action.popConfirm.okText || '确定'\n const cancelText = action.popConfirm.cancelText || '取消'\n MessageBox.confirm(title, '提示', {\n confirmButtonText: okText,\n cancelButtonText: cancelText,\n type: 'warning',\n })\n .then(() => action.popConfirm?.confirm?.())\n .catch(() => action.popConfirm?.cancel?.())\n return\n }\n action.onClick?.({} as MouseEvent)\n}\n</script>\n\n<style scoped>\n.ecp-table-action {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__icon {\n margin-right: 4px;\n}\n.ecp-table-action__more {\n display: inline-flex;\n align-items: center;\n}\n.ecp-table-action__dropdown-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProTableProps, TableActionType } from './types'\n\nexport type UseProTableReturn = [\n (instance: TableActionType) => void,\n TableActionType\n]\n\n/** 支持 ref/computed 的 props */\nexport type UseProTablePropsReactive = ProTableProps | Ref<ProTableProps | undefined>\n\n/**\n * 用于 ProTable 的 useProTable,支持通过 ref 调用表格方法\n * @param props ProTable 的 props 配置,传入后会通过 setProps 同步到表格(支持 ref/computed 响应式更新)\n */\nexport function useProTable(props?: UseProTablePropsReactive): UseProTableReturn {\n const tableActionRef = ref<TableActionType | null>(null)\n\n const getTableProps = (): ProTableProps | undefined =>\n (props ? unref(props as Ref<ProTableProps | undefined>) : undefined) as ProTableProps | undefined\n\n const getTableAction = (): TableActionType => {\n const action = unref(tableActionRef)\n if (!action) {\n throw new Error('ProTable instance has not been registered')\n }\n return action\n }\n\n const register = (instance: TableActionType) => {\n tableActionRef.value = instance\n const tableProps = getTableProps()\n if (tableProps && Object.keys(tableProps).length > 0) {\n instance.setProps(tableProps)\n }\n }\n\n if (props) {\n watch(\n () => getTableProps(),\n (tableProps) => {\n if (tableProps && tableActionRef.value) {\n tableActionRef.value.setProps(tableProps)\n }\n },\n { deep: true }\n )\n }\n\n const tableActions: UseProTableReturn[1] = {\n setProps: (p) => getTableAction().setProps(p),\n reload: (opt) => getTableAction().reload(opt),\n redoHeight: () => getTableAction().redoHeight(),\n setLoading: (v) => getTableAction().setLoading(v),\n getDataSource: () => getTableAction().getDataSource(),\n getRawDataSource: () => getTableAction().getRawDataSource(),\n setTableData: (data) => getTableAction().setTableData(data),\n getColumns: () => getTableAction().getColumns(),\n setColumns: (cols) => getTableAction().setColumns(cols),\n setPagination: (info) => getTableAction().setPagination(info),\n getSelectRowKeys: () => getTableAction().getSelectRowKeys(),\n getSelectRows: () => getTableAction().getSelectRows(),\n clearSelectedRowKeys: () => getTableAction().clearSelectedRowKeys(),\n setSelectedRowKeys: (keys) => getTableAction().setSelectedRowKeys(keys),\n deleteSelectRowByKey: (key) => getTableAction().deleteSelectRowByKey(key),\n updateTableData: (index, key, value) => getTableAction().updateTableData(index, key, value),\n updateTableDataRecord: (rowKey, record) => getTableAction().updateTableDataRecord(rowKey, record),\n deleteTableDataRecord: (rowKey) => getTableAction().deleteTableDataRecord(rowKey),\n insertTableDataRecord: (record, index) => getTableAction().insertTableDataRecord(record, index),\n getPaginationRef: () => getTableAction().getPaginationRef(),\n getShowPagination: () => getTableAction().getShowPagination(),\n setShowPagination: (show) => getTableAction().setShowPagination(show),\n getRowSelection: () => getTableAction().getRowSelection(),\n expandAll: () => getTableAction().expandAll?.(),\n collapseAll: () => getTableAction().collapseAll?.(),\n }\n\n return [register, tableActions]\n}\n","<template>\n <el-select v-bind=\"{ ...$attrs, value: value, placeholder, disabled, loading, clearable, filterable, multiple }\"\n @input=\"$emit('input', $event)\" @change=\"$emit('change', $event)\" @visible-change=\"onVisibleChange\">\n <el-option v-for=\"opt in options\" :key=\"String(opt.value)\" :label=\"opt.label\" :value=\"opt.value\" />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 拉取选项的接口,返回 Promise<Array<{ label, value }>> 或 { list: [] };可接收当前 params 作为参数 */\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n /** 请求参数,变化时会重新拉取 options */\n params?: Record<string, unknown>\n /** 是否懒加载:为 true 时在展开下拉时再请求数据,不在挂载时请求 */\n lazy?: boolean\n /** 接口返回列表中「标签」字段名,默认 'label' */\n labelField?: string\n /** 接口返回列表中「值」字段名,默认 'value' */\n valueField?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n filterable?: boolean\n multiple?: boolean\n }>(),\n { labelField: 'label', valueField: 'value', lazy: false }\n)\n\ndefineEmits<{ (e: 'input', value: unknown): void; (e: 'change', value: unknown): void }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\nconst rawOptions = ref<unknown[]>([])\n\nconst sortStringify = (obj: unknown): string => {\n if (obj === null || obj === undefined) return 'null'\n return JSON.stringify(sortKeys(obj))\n}\n\nconst sortKeys = (obj: unknown): unknown => {\n if (Array.isArray(obj)) return obj.map(sortKeys)\n if (obj !== null && typeof obj === 'object') {\n return Object.keys(obj as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeys((obj as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n return obj\n}\n\nconst lastFetchedParamsKey = ref<string>(sortStringify(props.params ?? null))\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) {\n const paramsKey = sortStringify(props.params ?? null)\n if (paramsKey !== lastFetchedParamsKey.value || options.value.length === 0) {\n fetchOptions()\n }\n }\n}\n\nconst fetchOptions = async () => {\n if (!props.api) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n rawOptions.value = raw\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n options.value = raw.map((item: unknown) => {\n const o = item as Record<string, unknown>\n return {\n label: String(o[labelKey] ?? o.label ?? ''),\n value: o[valueKey] ?? o.value,\n }\n })\n lastFetchedParamsKey.value = sortStringify(props.params ?? null)\n } finally {\n loading.value = false\n }\n}\n\ndefineExpose({\n options,\n rawOptions,\n loading,\n fetchOptions,\n})\n\nonMounted(() => {\n if (!props.lazy) fetchOptions()\n})\nwatch(() => props.api, () => { \n if (!props.lazy) {\n fetchOptions()\n } else {\n options.value = []\n rawOptions.value = []\n }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n const newKey = sortStringify(props.params ?? null)\n if (newKey === lastFetchedParamsKey.value) return\n if (props.lazy) {\n options.value = []\n rawOptions.value = []\n } else {\n fetchOptions()\n }\n}, { deep: true })\n</script>\n","/** 进位方式:向下取整、向上取整、四舍五入 */\nexport type FormattedNumberRounding = 'floor' | 'ceil' | 'round'\n\n/** 仅保留数字、至多一个小数点、可选前导负号 */\nexport function sanitizeNumericInput(raw: string): string {\n const t = raw.trim()\n if (!t) return ''\n let i = 0\n let res = ''\n if (t[0] === '-') {\n res = '-'\n i = 1\n }\n let dot = false\n for (; i < t.length; i++) {\n const c = t[i]\n if (c >= '0' && c <= '9') {\n res += c\n continue\n }\n if (c === '.' && !dot) {\n dot = true\n if (res === '' || res === '-') res += '0'\n res += '.'\n }\n }\n return res\n}\n\nexport function stripNumberGrouping(s: string): string {\n return s.replace(/,/g, '').trim()\n}\n\n/**\n * 对已清洗的数字串按整数位、小数位截断输入长度(inputLimit 为 true 时使用)。\n * 整数部分至多 integerDigits 位,小数部分至多 decimalPlaces 位;保留末尾仅小数点(如 `12.`)以便继续输入。\n */\nexport function applyNumericInputDigitLimits(\n sanitized: string,\n integerDigits: number,\n decimalPlaces: number\n): string {\n if (!sanitized || sanitized === '-') return sanitized\n const neg = sanitized[0] === '-'\n let body = neg ? sanitized.slice(1) : sanitized\n const dotIdx = body.indexOf('.')\n if (dotIdx === -1) {\n const maxInt = Math.max(0, integerDigits)\n body = maxInt > 0 ? body.slice(0, maxInt) : body\n return neg ? '-' + body : body\n }\n let intPart = body.slice(0, dotIdx)\n if (integerDigits > 0) {\n intPart = intPart.slice(0, integerDigits)\n }\n const afterDot = body.slice(dotIdx + 1)\n const endsWithDot = afterDot === '' && body.endsWith('.')\n if (decimalPlaces <= 0) {\n return neg ? '-' + intPart : intPart\n }\n if (endsWithDot) {\n return (neg ? '-' : '') + intPart + '.'\n }\n const decPart = afterDot.slice(0, decimalPlaces)\n return (neg ? '-' : '') + intPart + '.' + decPart\n}\n\nfunction maxAbsValue(integerDigits: number, decimalPlaces: number): number {\n const maxInt = Math.pow(10, integerDigits) - 1\n if (decimalPlaces <= 0) return maxInt\n return maxInt + (1 - Math.pow(10, -decimalPlaces))\n}\n\n/** 按整数位数上限约束绝对值 */\nexport function clampByIntegerDigits(\n value: number,\n integerDigits: number,\n decimalPlaces: number\n): number {\n const max = maxAbsValue(integerDigits, decimalPlaces)\n const sign = value < 0 ? -1 : 1\n const abs = Math.abs(value)\n if (abs <= max) return value\n return sign * max\n}\n\nexport function roundToDecimals(\n value: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n if (decimalPlaces <= 0) {\n switch (rounding) {\n case 'floor':\n return Math.floor(value)\n case 'ceil':\n return Math.ceil(value)\n default:\n return Math.round(value)\n }\n }\n const factor = Math.pow(10, decimalPlaces)\n const x = value * factor\n let y: number\n switch (rounding) {\n case 'floor':\n y = Math.floor(x)\n break\n case 'ceil':\n y = Math.ceil(x)\n break\n default:\n y = Math.round(x)\n }\n return y / factor\n}\n\n/**\n * 解析 → 按整数位夹紧 → 按小数位与进位方式舍入 → 再夹紧(防止舍入后越界)\n */\nexport function normalizeNumericValue(\n value: number,\n integerDigits: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n let v = clampByIntegerDigits(value, integerDigits, decimalPlaces)\n v = roundToDecimals(v, decimalPlaces, rounding)\n v = clampByIntegerDigits(v, integerDigits, decimalPlaces)\n return v\n}\n\n/**\n * 固定小数位数字符串(无千分位),用于表单存值以保留配置的小数位数(number 无法保留尾随 0)。\n */\nexport function toFixedDecimalString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n return value.toFixed(Math.max(0, decimalPlaces))\n}\n\n/** 千分位格式化展示(整数部分),小数部分固定 m 位 */\nexport function formatWithThousands(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n const fixed = value.toFixed(Math.max(0, decimalPlaces))\n const neg = fixed.startsWith('-')\n const body = neg ? fixed.slice(1) : fixed\n const [intPart, decPart] = body.split('.')\n const withSep = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n if (decimalPlaces <= 0 || decPart === undefined) return (neg ? '-' : '') + withSep\n return (neg ? '-' : '') + withSep + '.' + decPart\n}\n\n/** 编辑态:无千分位,去掉多余尾部 0(在 m 位精度内) */\nexport function numberToEditString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n let s = value.toFixed(Math.max(0, decimalPlaces))\n s = s.replace(/(\\.\\d*?)0+$/, '$1')\n s = s.replace(/\\.$/, '')\n return s\n}\n","<template>\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n v-bind=\"$attrs\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { FormattedNumberRounding } from '../utils/formattedNumber'\nimport {\n applyNumericInputDigitLimits,\n formatWithThousands,\n normalizeNumericValue,\n numberToEditString,\n sanitizeNumericInput,\n stripNumberGrouping,\n toFixedDecimalString,\n} from '../utils/formattedNumber'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n placeholder?: string\n disabled?: boolean\n /** 整数部分允许的最大位数,默认 5 */\n integerDigits?: number\n /** 小数保留位数,默认 6 */\n decimalPlaces?: number\n /** 进位方式,默认四舍五入 */\n rounding?: FormattedNumberRounding\n /**\n * 为 true 时在输入过程中按 integerDigits / decimalPlaces 限制可输入位数;\n * 为 false 时仅失焦后规范化,输入阶段不截断长度。\n */\n inputLimit?: boolean\n }>(),\n {\n integerDigits: 6,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst focused = ref(false)\nconst displayText = ref('')\n\nconst intN = () => Math.max(0, Math.floor(props.integerDigits ?? 6))\nconst decM = () => Math.max(0, Math.floor(props.decimalPlaces ?? 6))\n\nfunction parseExternalToNumber(v: unknown): number | null {\n if (v === null || v === undefined || v === '') return null\n if (typeof v === 'number') {\n return Number.isFinite(v) ? v : null\n }\n const s = stripNumberGrouping(String(v))\n if (s === '' || s === '-') return null\n const num = Number(s)\n return Number.isFinite(num) ? num : null\n}\n\nfunction syncDisplayFromValue() {\n if (focused.value) return\n const num = parseExternalToNumber(props.value)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = formatWithThousands(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nwatch(\n () => [props.value, props.integerDigits, props.decimalPlaces, props.rounding],\n () => syncDisplayFromValue(),\n { immediate: true, deep: true }\n)\n\nfunction emitStoredValue(normalized: number) {\n emit('input', toFixedDecimalString(normalized, decM()))\n}\n\nfunction onInput(val: string) {\n let clean = sanitizeNumericInput(val)\n if (props.inputLimit !== false) {\n clean = applyNumericInputDigitLimits(clean, intN(), decM())\n }\n displayText.value = clean\n if (clean === '' || clean === '-') return\n const num = Number(clean)\n if (!Number.isFinite(num)) return\n const normalized = normalizeNumericValue(num, intN(), decM(), props.rounding)\n emitStoredValue(normalized)\n}\n\nfunction onFocus() {\n focused.value = true\n const raw = stripNumberGrouping(displayText.value)\n const num = parseExternalToNumber(raw === '' ? props.value : raw)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = numberToEditString(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nfunction onBlur() {\n focused.value = false\n const raw = stripNumberGrouping(displayText.value)\n if (raw === '' || raw === '-') {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const parsed = Number(sanitizeNumericInput(raw))\n if (!Number.isFinite(parsed)) {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const final = normalizeNumericValue(parsed, intN(), decM(), props.rounding)\n displayText.value = formatWithThousands(final, decM())\n emitStoredValue(final)\n}\n</script>\n","<template>\n <div class=\"ecp-tree-select\" ref=\"rootRef\">\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :clearable=\"clearable\"\n readonly\n suffix-icon=\"el-icon-arrow-down\"\n class=\"ecp-tree-select__input\"\n @focus=\"openDropdown\"\n @clear=\"clearValue\"\n />\n <transition name=\"el-zoom-in-top\">\n <div v-show=\"dropdownVisible\" class=\"ecp-tree-select__dropdown\">\n <div v-if=\"filterable\" class=\"ecp-tree-select__filter-inner\">\n <el-input\n v-model=\"filterText\"\n size=\"small\"\n placeholder=\"搜索节点\"\n prefix-icon=\"el-icon-search\"\n clearable\n @click.native.stop\n />\n </div>\n <el-tree\n v-show=\"!loading\"\n ref=\"treeRef\"\n :data=\"treeData\"\n :props=\"treeProps\"\n :node-key=\"valueField\"\n :filter-node-method=\"filterable ? filterNodeMethod : undefined\"\n :highlight-current=\"true\"\n default-expand-all\n @node-click=\"onNodeClick\"\n />\n <div v-if=\"loading\" class=\"ecp-tree-select__loading\">\n <i class=\"el-icon-loading\" /> 加载中...\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, nextTick } from 'vue'\n\ninterface TreeNode {\n label?: string\n value?: unknown\n children?: TreeNode[]\n [key: string]: unknown\n}\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 树数据,直接传入时优先使用,不请求 api */\n treeData?: unknown[]\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n params?: Record<string, unknown>\n lazy?: boolean\n labelField?: string\n valueField?: string\n childrenField?: string\n filterable?: boolean\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n }>(),\n {\n labelField: 'label',\n valueField: 'value',\n childrenField: 'children',\n lazy: false,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst rootRef = ref<HTMLElement>()\nconst treeRef = ref()\nconst dropdownVisible = ref(false)\nconst loading = ref(false)\nconst filterText = ref('')\nconst treeData = ref<TreeNode[]>([])\nconst flatLabelMap = ref<Record<string, string>>({})\n\nconst treeProps = computed(() => ({\n label: props.labelField,\n children: props.childrenField,\n}))\n\nfunction normalizeNode(node: Record<string, unknown>): TreeNode {\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n const children = node[childrenKey] as unknown[]\n const out: TreeNode = {}\n out[props.labelField ?? 'label'] = node[labelKey] ?? node.label\n out[props.valueField ?? 'value'] = node[valueKey] ?? node.value\n if (Array.isArray(children) && children.length) {\n out[props.childrenField ?? 'children'] = children.map((c) => normalizeNode(c as Record<string, unknown>))\n }\n return out\n}\n\nfunction buildFlatLabelMap(nodes: TreeNode[], prefix = ''): Record<string, string> {\n const map: Record<string, string> = {}\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n for (const node of nodes) {\n const label = String(node[labelKey] ?? node.label ?? '')\n const value = node[valueKey] ?? node.value\n if (value !== undefined && value !== null) {\n map[String(value)] = prefix ? prefix + ' / ' + label : label\n }\n const children = node[childrenKey] ?? node.children\n if (Array.isArray(children) && children.length) {\n Object.assign(map, buildFlatLabelMap(children as TreeNode[], label))\n }\n }\n return map\n}\n\nfunction hasTreeDataProp() {\n const td = props.treeData\n return Array.isArray(td) && td.length > 0\n}\n\nfunction applyTreeData(nodes: TreeNode[]) {\n treeData.value = nodes\n flatLabelMap.value = buildFlatLabelMap(nodes)\n}\n\nfunction syncFromTreeDataProp() {\n const td = props.treeData\n if (!Array.isArray(td) || td.length === 0) return\n const normalized = td.map((item) => normalizeNode(item as Record<string, unknown>))\n applyTreeData(normalized)\n}\n\nconst displayText = computed(() => {\n if (props.value == null || props.value === '') return ''\n return flatLabelMap.value[String(props.value)] ?? String(props.value)\n})\n\nconst filterNodeMethod = (value: string, data: TreeNode) => {\n if (!value) return true\n const labelKey = props.labelField ?? 'label'\n const label = String(data[labelKey] ?? data.label ?? '')\n return label.toLowerCase().includes(value.toLowerCase())\n}\n\nwatch(filterText, (val) => {\n treeRef.value?.filter(val)\n})\n\nlet clickOutsideHandler: ((e: MouseEvent) => void) | null = null\n\nfunction openDropdown() {\n if (props.disabled) return\n dropdownVisible.value = true\n if (props.lazy && !hasTreeDataProp()) fetchData()\n nextTick(() => {\n clickOutsideHandler = (e: MouseEvent) => {\n if (rootRef.value && !rootRef.value.contains(e.target as Node)) {\n closeDropdown()\n }\n }\n document.addEventListener('click', clickOutsideHandler)\n })\n}\n\nfunction closeDropdown() {\n dropdownVisible.value = false\n filterText.value = ''\n if (clickOutsideHandler) {\n document.removeEventListener('click', clickOutsideHandler)\n clickOutsideHandler = null\n }\n}\n\nfunction clearValue() {\n emit('input', undefined)\n}\n\nfunction onNodeClick(data: TreeNode) {\n const valueKey = props.valueField ?? 'value'\n const val = data[valueKey] ?? data.value\n emit('input', val)\n closeDropdown()\n}\n\nasync function fetchData() {\n if (!props.api || hasTreeDataProp()) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n treeData.value = raw.map((item) => normalizeNode(item as Record<string, unknown>))\n flatLabelMap.value = buildFlatLabelMap(treeData.value)\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else if (!props.lazy) {\n fetchData()\n }\n})\n\nwatch(() => props.treeData, () => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else {\n treeData.value = []\n flatLabelMap.value = {}\n if (!props.lazy && props.api) fetchData()\n }\n}, { deep: true })\n\nwatch(() => props.api, () => {\n if (hasTreeDataProp()) return\n if (!props.lazy) fetchData()\n else { treeData.value = []; flatLabelMap.value = {} }\n}, { deep: true })\n\nwatch(() => props.params, () => {\n if (hasTreeDataProp()) return\n if (props.lazy) { treeData.value = []; flatLabelMap.value = {} }\n else fetchData()\n}, { deep: true })\n</script>\n\n<style scoped>\n.ecp-tree-select {\n position: relative;\n width: 100%;\n}\n.ecp-tree-select__filter-inner {\n margin-bottom: 8px;\n}\n.ecp-tree-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 280px;\n overflow: auto;\n background: #fff;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n margin-top: 4px;\n z-index: 1000;\n padding: 8px;\n}\n.ecp-tree-select__loading {\n padding: 24px;\n text-align: center;\n color: #909399;\n font-size: 14px;\n}\n</style>\n","<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n :label-width=\"schema.labelWidth\"\n >\n <template slot=\"label\">\n <span>\n {{ schema.label }}<span v-if=\"showColon\" class=\"ecp-pro-form-item__colon\">:</span>\n </span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <!-- 自定义 component:组件名或内联组件 -->\n <component :is=\"fieldWrapperComponent\" v-bind=\"fieldWrapperProps\">\n <component\n v-if=\"resolvedCustomComponent\"\n :is=\"resolvedCustomComponent\"\n :value=\"formModel[schema.field]\"\n @input=\"setFieldValue\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input\n v-else-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <FormattedNumberInput\n v-else-if=\"schema.component === 'formatted-number'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <ApiSelect\n v-else-if=\"schema.component === 'api-select'\"\n ref=\"apiSelectRef\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <TreeSelect\n v-else-if=\"schema.component === 'tree-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </component>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h, ref, onMounted, onUnmounted } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport FormattedNumberInput from './FormattedNumberInput.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-number',\n 'formatted-number',\n 'switch', 'cascader', 'checkbox', 'radio',\n])\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n colon?: boolean\n formActionType?: import('../types').FormActionType\n onFieldChange?: (field: string, value: unknown) => void\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\n /** 注册字段实例(由 ProForm 传入) */\n registerFieldInstance?: (field: string, instance: Record<string, unknown> | null) => void\n}>()\n\n/** ApiSelect 组件实例 ref */\nconst apiSelectRef = ref<Record<string, unknown> | null>(null)\n\nonMounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, apiSelectRef.value)\n }\n})\n\nonUnmounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, null)\n }\n})\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\nconst showColon = computed(() => props.schema.colon ?? props.colon ?? false)\n\nconst normalizedTooltip = computed(() => {\n const tooltip = props.schema.tooltip\n if (!tooltip) return null\n const resolved = typeof tooltip === 'function' ? tooltip(renderParams.value) : tooltip\n return normalizeTooltipConfig(resolved, props.formModel[props.schema.field])\n})\n\nconst fieldWrapperComponent = computed(() => normalizedTooltip.value ? 'el-tooltip' : 'span')\nconst fieldWrapperProps = computed(() => normalizedTooltip.value || {})\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst resolvedCustomComponent = computed(() => {\n const c = props.schema.component\n if (c == null) return null\n if (typeof c === 'string') {\n if (BUILT_IN_COMPONENTS.has(c)) return null\n return (props.customComponents && props.customComponents[c]) || c\n }\n return c\n})\n\nconst setFieldValue = (v: unknown) => {\n props.onFieldChange?.(props.schema.field, v)\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style scoped>\n.ecp-pro-form-item__colon {\n margin-right: 2px;\n}\n\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"currentFormModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"currentFormModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\" :colon=\"effectiveProps.colon\"\n :custom-components=\"formCustomComponents\" :on-field-change=\"handleFieldChange\"\n :register-field-instance=\"registerFieldInstance\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"currentFormModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"currentFormModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners, ApiSelectInstance } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n modelValue?: Record<string, unknown>\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n colon?: boolean\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n /** 自定义组件映射(组件名 -> 组件),供 schema.component 使用 */\n components?: Record<string, unknown>\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n colon: true,\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '查询',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n (e: 'update:modelValue', values: Record<string, unknown>): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n/** 字段名 -> 组件实例映射(用于获取 api-select 等组件的内部状态) */\nconst fieldInstanceMap = ref<Map<string, ComponentPublicInstance>>(new Map())\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProForm'), ...props, ...innerProps.value }))\nconst controlledModelValue = computed(() => effectiveProps.value.modelValue)\nconst isControlled = computed(() => controlledModelValue.value !== undefined)\nconst currentFormModel = computed<Record<string, unknown>>(() => {\n return isControlled.value\n ? (controlledModelValue.value ?? {})\n : formModel.value\n})\n/** 传给 ProFormItem 的自定义组件映射:显式合并 setSetting 与 props,避免响应式代理导致组件引用丢失 */\nconst formCustomComponents = computed(() => ({\n ...(getComponentSetting('ProForm').components as Record<string, unknown> | undefined) ?? {},\n ...(effectiveProps.value.components ?? {}),\n ...(innerProps.value.components ?? {}),\n}))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n/**\n * \n * @param baseModel \n * @param preserveExisting \n */\nconst resolveSchemaModel = (baseModel?: Record<string, unknown>, preserveExisting = true) => {\n const nextModel = preserveExisting ? { ...(baseModel ?? {}) } : {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n if (preserveExisting && Object.prototype.hasOwnProperty.call(nextModel, schema.field)) return\n if (schema.defaultValue !== undefined) {\n nextModel[schema.field] = schema.defaultValue\n return\n }\n if (initialValues && Object.prototype.hasOwnProperty.call(initialValues, schema.field)) {\n nextModel[schema.field] = initialValues[schema.field]\n }\n })\n return nextModel\n}\n\nconst applyFormModel = (nextModel: Record<string, unknown>, shouldEmit = true) => {\n formModel.value = nextModel\n if (shouldEmit) emit('update:modelValue', nextModel)\n}\n\nconst updateFormModel = (values: Record<string, unknown>) => {\n const nextModel = resolveSchemaModel({ ...currentFormModel.value, ...values })\n applyFormModel(nextModel)\n return nextModel\n}\n\nconst initForm = () => {\n const rules: Record<string, unknown[]> = {}\n innerSchemas.value.forEach((schema) => {\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n applyFormModel(resolveSchemaModel(currentFormModel.value), false)\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...currentFormModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n updateFormModel(values)\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...currentFormModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n applyFormModel(resolveSchemaModel(undefined, false))\n}\n\nconst handleFieldChange = (field: string, value: unknown) => {\n updateFormModel({ [field]: value })\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n initForm()\n }\n}\n\n/** 注册组件实例(供 ProFormItem 调用) */\nconst registerFieldInstance = (field: string, instance: Record<string, unknown> | null) => {\n if (instance) {\n fieldInstanceMap.value.set(field, instance as unknown as ComponentPublicInstance)\n } else {\n fieldInstanceMap.value.delete(field)\n }\n}\n\n/** 获取指定字段的组件实例 */\nconst getComponentInstance = (field: string): ComponentPublicInstance | null => {\n return fieldInstanceMap.value.get(field) ?? null\n}\n\n/** 获取 api-select 字段的 options,raw=true 时返回接口原始数据 */\nfunction getFieldOptions(field: string): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: true): unknown[]\nfunction getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return []\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n if (raw) {\n return apiSelectInstance?.rawOptions ?? []\n }\n return apiSelectInstance?.options ?? []\n}\n\n/** 获取 api-select 字段的加载状态 */\nconst isFieldLoading = (field: string): boolean => {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return false\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n return apiSelectInstance?.loading ?? false\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n}\n\ndefineExpose({\n ...formActionRef,\n registerFieldInstance,\n})\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => controlledModelValue.value, (value) => {\n if (!isControlled.value || value === undefined) return\n applyFormModel(resolveSchemaModel(value), false)\n}, { deep: true, immediate: true })\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style scoped>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form .ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n getComponentInstance: FormActionType['getComponentInstance']\n getFieldOptions: FormActionType['getFieldOptions']\n isFieldLoading: FormActionType['isFieldLoading']\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const getComponentInstance: FormActionType['getComponentInstance'] = (field) =>\n formAction.value?.getComponentInstance(field) ?? null\n\n function getFieldOptions(field: string): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: true): unknown[]\n function getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n if (!formAction.value) return []\n if (raw) return formAction.value.getFieldOptions(field, true)\n return formAction.value.getFieldOptions(field)\n }\n\n const isFieldLoading: FormActionType['isFieldLoading'] = (field) =>\n formAction.value?.isFieldLoading(field) ?? false\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n }\n\n return [register, result]\n}\n","<template>\n <div class=\"ecp-pro-descriptions\">\n <div v-if=\"showHeader\" class=\"ecp-pro-descriptions__header\">\n <div class=\"ecp-pro-descriptions__title-wrap\">\n <span v-if=\"effectiveProps.title\" class=\"ecp-pro-descriptions__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-descriptions__help\" />\n </el-tooltip>\n <el-tooltip v-if=\"effectiveProps.collapseOptions?.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.collapseOptions.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.collapseOptions.helpMessage\" :key=\"`collapse-${index}`\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.collapseOptions.helpMessage }}</span>\n </template>\n <i class=\"el-icon-info ecp-pro-descriptions__help\" />\n </el-tooltip>\n </div>\n <el-button\n v-if=\"showCollapseButton\"\n type=\"text\"\n class=\"ecp-pro-descriptions__toggle\"\n @click=\"expanded = !expanded\"\n >\n {{ expanded ? collapseButtonText.collapse : collapseButtonText.expand }}\n <i class=\"el-icon-arrow-down\" :class=\"expanded ? 'is-expanded' : ''\" />\n </el-button>\n </div>\n\n <div\n class=\"ecp-pro-descriptions__body\"\n :class=\"[\n `is-${effectiveProps.size}`,\n { 'is-bordered': effectiveProps.bordered, 'is-collapsed': showCollapseButton && !expanded },\n ]\"\n :style=\"bodyStyle\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"(row, rowIndex) in renderedRows\">\n <template v-for=\"item in row.items\">\n <div\n :key=\"`${rowIndex}-${item.dataIndex || item.field}`\"\n class=\"ecp-pro-descriptions__item\"\n :style=\"getItemStyle(item)\"\n >\n <div class=\"ecp-pro-descriptions__label\" :style=\"getLabelStyle(item)\">\n {{ item.label }}\n </div>\n <div class=\"ecp-pro-descriptions__content\" :style=\"getContentStyle(item)\">\n <slot\n v-if=\"$scopedSlots[item.slot || item.dataIndex]\"\n :name=\"item.slot || item.dataIndex\"\n :value=\"getItemValue(item)\"\n :record=\"effectiveData\"\n :schema=\"item\"\n />\n <DescriptionValueRenderer v-else :schema=\"item\" :value=\"getItemValue(item)\" :record=\"effectiveData\" :empty-text=\"effectiveProps.emptyText || '-'\" />\n </div>\n </div>\n </template>\n </template>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\nimport type {\n DescriptionActionType,\n DescriptionColumn,\n DescriptionProps,\n DescriptionSchema,\n} from '../types'\n\ninterface NormalizedRow {\n items: Array<DescriptionSchema & { _span: number }>\n}\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n helpMessage?: string | string[]\n size?: 'medium' | 'small'\n bordered?: boolean\n column?: DescriptionColumn\n schema?: DescriptionSchema[]\n data?: Record<string, unknown>\n emptyText?: string\n useCollapse?: boolean\n collapseOptions?: {\n canExpand?: boolean\n defaultExpand?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n helpMessage?: string | string[]\n visibleRows?: number\n }\n }>(),\n {\n size: 'medium',\n bordered: true,\n column: () => ({ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }),\n schema: () => [],\n data: () => ({}),\n emptyText: '-',\n useCollapse: false,\n collapseOptions: () => ({ canExpand: false, defaultExpand: true, expandButtonText: '展开', collapseButtonText: '收起', visibleRows: 1 }),\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: DescriptionActionType): void\n}>()\n\nconst innerProps = ref<Partial<DescriptionProps>>({})\nconst innerData = ref<Record<string, unknown>>({})\nconst innerSchema = ref<DescriptionSchema[]>([])\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\nconst expanded = ref(true)\n\nconst DescriptionValueRenderer = defineComponent({\n name: 'EcpDescriptionValueRenderer',\n props: {\n schema: { type: Object, required: true },\n value: { required: false },\n record: { type: Object, required: true },\n emptyText: { type: String, default: '-' },\n },\n setup(rendererProps) {\n return () => {\n const schema = rendererProps.schema as DescriptionSchema\n const record = rendererProps.record as Record<string, unknown>\n const value = rendererProps.value\n\n const renderTextNode = (text: string) => {\n const tooltipProps = normalizeTooltip(schema, text === rendererProps.emptyText ? value : text, record)\n const contentNode = h('span', text)\n if (!tooltipProps) return contentNode\n return h('el-tooltip', { props: tooltipProps }, [contentNode])\n }\n\n if (schema.render) {\n const rendered = schema.render(value, record)\n if (rendered == null || rendered === '') return renderTextNode(rendererProps.emptyText)\n if (typeof rendered === 'string' || typeof rendered === 'number') return renderTextNode(String(rendered))\n return rendered as never\n }\n\n if (Array.isArray(value)) {\n return renderTextNode(value.length ? value.join(', ') : rendererProps.emptyText)\n }\n\n if (value === null || value === undefined || value === '') {\n return renderTextNode(rendererProps.emptyText)\n }\n\n if (typeof value === 'object') {\n return renderTextNode(JSON.stringify(value))\n }\n\n return renderTextNode(String(value))\n }\n },\n})\n\nconst normalizeTooltip = (schema: DescriptionSchema, value: unknown, record: Record<string, unknown>) => {\n const tooltip = schema.tooltip\n if (!tooltip) return null\n\n const resolved = typeof tooltip === 'function'\n ? tooltip({ value, record, schema })\n : tooltip\n return normalizeTooltipConfig(resolved, value)\n}\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<DescriptionProps>('ProDescriptions', { ...props, ...innerProps.value }))\n\nconst breakpoints = { xxl: 1920, xl: 1200, lg: 992, md: 768, sm: 576 }\n\nconst resolveColumn = (column: DescriptionColumn | undefined, width: number) => {\n if (typeof column === 'number') return Math.max(1, column)\n const value = column ?? {}\n if (width >= breakpoints.xxl) return value.xxl ?? value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.xl) return value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.lg) return value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.md) return value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.sm) return value.sm ?? value.xs ?? 2\n return value.xs ?? 1\n}\n\nconst currentColumn = computed(() => resolveColumn(effectiveProps.value.column, windowWidth.value))\nconst effectiveData = computed(() => effectiveProps.value.data ?? innerData.value ?? {})\n\nconst visibleSchema = computed(() => {\n return (innerSchema.value.length ? innerSchema.value : effectiveProps.value.schema ?? []).filter((item) => {\n const key = item.dataIndex || item.field\n if (!key) return false\n if (typeof item.show === 'function') {\n return item.show(effectiveData.value)\n }\n return item.show !== false\n }).map((item) => ({\n ...item,\n dataIndex: item.dataIndex || item.field || '',\n }))\n})\n\nconst normalizedRows = computed<NormalizedRow[]>(() => {\n const rows: NormalizedRow[] = []\n let currentRow: NormalizedRow = { items: [] }\n let used = 0\n const totalColumn = currentColumn.value\n visibleSchema.value.forEach((item, index) => {\n const remainingItems = visibleSchema.value.length - index\n const requested = Math.max(1, Math.min(item.span ?? 1, totalColumn))\n const span = remainingItems === 1 ? totalColumn - used || totalColumn : requested\n if (used + span > totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n const normalizedSpan = remainingItems === 1 && used < totalColumn ? Math.max(1, totalColumn - used) : span\n currentRow.items.push({ ...item, _span: normalizedSpan })\n used += normalizedSpan\n if (used >= totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n })\n if (currentRow.items.length > 0) rows.push(currentRow)\n return rows\n})\n\nconst renderedRows = computed(() => {\n if (!showCollapseButton.value || expanded.value) return normalizedRows.value\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return normalizedRows.value.slice(0, visibleRows)\n})\n\nconst showCollapseButton = computed(() => {\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return !!effectiveProps.value.useCollapse && !!effectiveProps.value.collapseOptions?.canExpand && normalizedRows.value.length > visibleRows\n})\nconst showHeader = computed(() => !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || showCollapseButton.value)\nconst collapseButtonText = computed(() => ({\n expand: effectiveProps.value.collapseOptions?.expandButtonText ?? '展开',\n collapse: effectiveProps.value.collapseOptions?.collapseButtonText ?? '收起',\n}))\n\nconst bodyStyle = computed(() => ({\n gridTemplateColumns: `repeat(${currentColumn.value}, minmax(0, 1fr))`,\n}))\n\nconst getItemStyle = (item: DescriptionSchema & { _span: number }) => ({\n gridColumn: `span ${item._span}`,\n})\n\nconst getLabelStyle = (item: DescriptionSchema) => ({\n minWidth: item.labelMinWidth ? `${item.labelMinWidth}px` : undefined,\n ...(item.labelStyle ?? {}),\n})\n\nconst getContentStyle = (item: DescriptionSchema) => ({\n minWidth: item.contentMinWidth ? `${item.contentMinWidth}px` : undefined,\n ...(item.contentStyle ?? {}),\n})\n\nconst getItemValue = (item: DescriptionSchema) => effectiveData.value[item.dataIndex]\n\nconst syncSchema = () => {\n innerSchema.value = [...(effectiveProps.value.schema ?? [])]\n}\n\nconst syncData = () => {\n innerData.value = { ...(effectiveProps.value.data ?? {}) }\n}\n\nconst setProps = async (descriptionProps: Partial<DescriptionProps>) => {\n innerProps.value = { ...innerProps.value, ...descriptionProps }\n if (descriptionProps.schema) innerSchema.value = [...descriptionProps.schema]\n if (descriptionProps.data) innerData.value = { ...descriptionProps.data }\n}\n\nconst setData = async (data: Record<string, unknown>) => {\n innerData.value = { ...innerData.value, ...data }\n innerProps.value = { ...innerProps.value, data: innerData.value }\n}\n\nconst getData = () => ({ ...(effectiveProps.value.data ?? innerData.value ?? {}) })\n\nconst descriptionAction: DescriptionActionType = {\n setProps,\n setData,\n getData,\n}\n\ndefineExpose(descriptionAction)\n\nconst updateWindowWidth = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchema()\n syncData()\n expanded.value = effectiveProps.value.collapseOptions?.defaultExpand !== false\n emit('register', descriptionAction)\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateWindowWidth)\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateWindowWidth)\n }\n})\n\nwatch(() => effectiveProps.value.schema, syncSchema, { deep: true })\nwatch(() => effectiveProps.value.data, syncData, { deep: true })\nwatch(() => effectiveProps.value.collapseOptions?.defaultExpand, (value) => {\n if (value !== undefined) expanded.value = value\n})\n</script>\n\n<style scoped>\n.ecp-pro-descriptions {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ecp-pro-descriptions__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.ecp-pro-descriptions__title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ecp-pro-descriptions__title {\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n}\n\n.ecp-pro-descriptions__help,\n.ecp-pro-descriptions__toggle {\n color: #909399;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down {\n margin-left: 4px;\n transition: transform 0.2s ease;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-pro-descriptions__body {\n display: grid;\n border-top: 1px solid #ebeef5;\n border-left: 1px solid #ebeef5;\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body.is-collapsed {\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) {\n border-top: 0;\n border-left: 0;\n gap: 12px 16px;\n}\n\n.ecp-pro-descriptions__item {\n display: flex;\n min-width: 0;\n border-right: 1px solid #ebeef5;\n border-bottom: 1px solid #ebeef5;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__item {\n border-right: 0;\n border-bottom: 0;\n}\n\n.ecp-pro-descriptions__label,\n.ecp-pro-descriptions__content {\n min-width: 0;\n box-sizing: border-box;\n word-break: break-word;\n}\n\n.ecp-pro-descriptions__label {\n flex: 0 0 120px;\n padding: 12px 16px;\n color: #606266;\n background: #fafafa;\n}\n\n.ecp-pro-descriptions__content {\n flex: 1;\n padding: 12px 16px;\n color: #303133;\n background: #fff;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__label {\n flex-basis: auto;\n padding: 0;\n margin-right: 8px;\n background: transparent;\n font-weight: 500;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__content {\n padding: 0;\n background: transparent;\n}\n\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__label,\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__content {\n padding-top: 8px;\n padding-bottom: 8px;\n font-size: 13px;\n}\n\n@media (max-width: 767px) {\n .ecp-pro-descriptions__item {\n flex-direction: column;\n }\n\n .ecp-pro-descriptions__label {\n flex-basis: auto;\n }\n}\n</style>\n","import { ref, unref, watch, type Ref } from 'vue'\nimport type { DescriptionActionType, DescriptionProps } from '../types'\n\nexport type UseDescriptionPropsReactive = DescriptionProps | Ref<DescriptionProps | undefined>\n\nexport type UseDescriptionReturn = [\n (instance: DescriptionActionType) => void,\n DescriptionActionType,\n]\n\nexport function useDescription(props?: UseDescriptionPropsReactive): UseDescriptionReturn {\n const descriptionActionRef = ref<DescriptionActionType | null>(null)\n\n const getDescriptionProps = (): DescriptionProps | undefined =>\n (props ? unref(props as Ref<DescriptionProps | undefined>) : undefined) as DescriptionProps | undefined\n\n const getDescriptionAction = (): DescriptionActionType => {\n const action = unref(descriptionActionRef)\n if (!action) {\n throw new Error('ProDescriptions instance has not been registered')\n }\n return action\n }\n\n const register = (instance: DescriptionActionType) => {\n descriptionActionRef.value = instance\n const descriptionProps = getDescriptionProps()\n if (descriptionProps && Object.keys(descriptionProps).length > 0) {\n instance.setProps(descriptionProps)\n }\n }\n\n if (props) {\n watch(\n () => getDescriptionProps(),\n (descriptionProps) => {\n if (descriptionProps && descriptionActionRef.value) {\n descriptionActionRef.value.setProps(descriptionProps)\n }\n },\n { deep: true }\n )\n }\n\n const descriptionActions: DescriptionActionType = {\n setProps: (descriptionProps) => getDescriptionAction().setProps(descriptionProps),\n setData: (data) => getDescriptionAction().setData(data),\n getData: () => getDescriptionAction().getData(),\n }\n\n return [register, descriptionActions]\n}\n","<template>\n <div\n v-loading=\"effectiveProps.loading\"\n class=\"ecp-collapse-container\"\n :class=\"{\n 'is-expanded': mergedExpanded,\n 'is-ghost': effectiveProps.ghost,\n 'is-header-clickable': canToggleByHeader,\n }\"\n v-bind=\"wrapperProps\"\n >\n <div v-if=\"showHeader\" class=\"ecp-collapse-container__header\" :class=\"effectiveProps.headerClass\" :style=\"effectiveProps.headerStyle\">\n <div class=\"ecp-collapse-container__header-main\" @click=\"handleHeaderClick\">\n <div v-if=\"$slots.title || effectiveProps.title\" class=\"ecp-collapse-container__title-wrap\">\n <slot name=\"title\">\n <span class=\"ecp-collapse-container__title\">{{ effectiveProps.title }}</span>\n </slot>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-collapse-container__help\" />\n </el-tooltip>\n </div>\n </div>\n\n <div v-if=\"$slots.action || resolvedCanExpan\" class=\"ecp-collapse-container__header-extra\" @click.stop>\n <slot name=\"action\" />\n <el-button\n v-if=\"resolvedCanExpan\"\n type=\"text\"\n class=\"ecp-collapse-container__toggle\"\n @click.stop=\"toggleExpand\"\n >\n {{ mergedExpanded ? effectiveProps.collapseButtonText : effectiveProps.expandButtonText }}\n <i class=\"el-icon-arrow-down\" :class=\"{ 'is-expanded': mergedExpanded }\" />\n </el-button>\n </div>\n </div>\n \n <el-collapse-transition>\n <div\n v-show=\"mergedExpanded\"\n class=\"ecp-collapse-container__body\"\n :class=\"effectiveProps.contentClass\"\n :style=\"effectiveProps.contentStyle\"\n >\n <slot />\n </div>\n </el-collapse-transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, useSlots } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\n\ninterface CollapseContainerProps {\n title?: string\n loading?: boolean\n canExpan?: boolean\n canExpand?: boolean\n helpMessage?: string | string[]\n triggerWindowResize?: boolean\n expanded?: boolean\n defaultExpand?: boolean\n ghost?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n wrapperProps?: Record<string, unknown>\n headerClass?: string\n headerStyle?: Record<string, string | number>\n contentClass?: string\n contentStyle?: Record<string, string | number>\n}\n\nconst props = withDefaults(defineProps<CollapseContainerProps>(), {\n loading: false,\n canExpan: true,\n canExpand: undefined,\n triggerWindowResize: true,\n expanded: undefined,\n defaultExpand: true,\n ghost: false,\n expandButtonText: '展开',\n collapseButtonText: '收起',\n wrapperProps: () => ({}),\n headerClass: '',\n headerStyle: () => ({}),\n contentClass: '',\n contentStyle: () => ({}),\n})\n\nconst emit = defineEmits<{\n (e: 'update:expanded', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'collapse'): void\n (e: 'expand'): void\n}>()\n\nconst slots = useSlots()\nconst { mergeSettings } = useComponentSetting()\n\nconst innerExpanded = ref(props.expanded ?? props.defaultExpand)\n\nconst effectiveProps = computed(() => mergeSettings('CollapseContainer', { ...props }) as CollapseContainerProps)\nconst resolvedCanExpan = computed(() => effectiveProps.value.canExpand ?? effectiveProps.value.canExpan ?? true)\nconst isControlled = computed(() => effectiveProps.value.expanded !== undefined)\nconst mergedExpanded = computed(() => isControlled.value ? !!effectiveProps.value.expanded : innerExpanded.value)\nconst showHeader = computed(() => !!slots.title || !!slots.action || !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || resolvedCanExpan.value)\nconst canToggleByHeader = computed(() => resolvedCanExpan.value)\nconst wrapperProps = computed(() => {\n const incoming = effectiveProps.value.wrapperProps ?? {}\n const wrapperClass = incoming.class\n const wrapperStyle = incoming.style\n const rest = { ...incoming }\n delete rest.class\n delete rest.style\n\n return {\n ...rest,\n class: wrapperClass,\n style: wrapperStyle,\n }\n})\n\nconst triggerWindowResize = () => {\n if (!effectiveProps.value.triggerWindowResize || typeof window === 'undefined') return\n window.setTimeout(() => {\n window.dispatchEvent(new Event('resize'))\n }, 220)\n}\n\nconst setExpanded = (value: boolean) => {\n if (!isControlled.value) {\n innerExpanded.value = value\n }\n emit('update:expanded', value)\n emit('change', value)\n if (value) emit('expand')\n else emit('collapse')\n triggerWindowResize()\n}\n\nconst toggleExpand = () => {\n if (!resolvedCanExpan.value) return\n setExpanded(!mergedExpanded.value)\n}\n\nconst handleHeaderClick = () => {\n if (!canToggleByHeader.value) return\n toggleExpand()\n}\n\nwatch(() => props.expanded, (value) => {\n if (value !== undefined) {\n innerExpanded.value = value\n }\n})\n\nwatch(() => props.defaultExpand, (value) => {\n if (props.expanded === undefined) {\n innerExpanded.value = value\n }\n})\n\ndefineExpose({\n setExpanded,\n toggleExpand,\n})\n</script>\n\n<style scoped>\n.ecp-collapse-container {\n background: #fff;\n border-radius: 14px;\n border: 1px solid #e8eef8;\n box-shadow: 0 10px 24px rgba(15, 45, 94, 0.06);\n overflow: hidden;\n}\n\n.ecp-collapse-container.is-ghost {\n border-color: transparent;\n box-shadow: none;\n background: transparent;\n}\n\n.ecp-collapse-container__header {\n min-height: 56px;\n padding: 0 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n border-bottom: 1px solid #eef3fb;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__header {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container__header-main {\n min-width: 0;\n flex: 1;\n display: flex;\n align-items: center;\n}\n\n.ecp-collapse-container__title-wrap {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ecp-collapse-container__title {\n color: #1f2d3d;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ecp-collapse-container__help {\n color: #91a3b7;\n font-size: 14px;\n}\n\n.ecp-collapse-container__header-extra {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.ecp-collapse-container__toggle {\n padding: 0;\n color: #2f6fd3;\n}\n\n.ecp-collapse-container__toggle i {\n margin-left: 6px;\n transition: transform 0.2s ease;\n}\n\n.ecp-collapse-container__toggle i.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-collapse-container__body {\n padding: 20px;\n box-sizing: border-box;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__body {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container.is-header-clickable .ecp-collapse-container__header-main {\n cursor: pointer;\n}\n\n@media (max-width: 768px) {\n .ecp-collapse-container__header {\n padding: 14px 16px;\n align-items: flex-start;\n flex-direction: column;\n }\n\n .ecp-collapse-container__header-extra {\n width: 100%;\n justify-content: space-between;\n }\n\n .ecp-collapse-container__body {\n padding: 16px;\n }\n}\n</style>\n","<template>\n <div class=\"ecp-pro-table-form\">\n <el-form\n ref=\"formRef\"\n :model=\"modelValue\"\n :rules=\"mergedRules\"\n :label-width=\"labelWidth\"\n class=\"ecp-pro-table-form__form\"\n >\n <el-table\n :data=\"tableRows\"\n :border=\"bordered\"\n :row-key=\"rowKeyFn\"\n header-cell-class-name=\"ecp-pro-table-form__header-cell\"\n class=\"ecp-pro-table-form__table\"\n >\n <!-- 首列:维度 / 友商名称(可插槽自定义) -->\n <el-table-column\n v-if=\"showFirstColumnComputed\"\n :min-width=\"firstColMinWidth\"\n :fixed=\"firstColumnFixed\"\n >\n <template #header>\n <slot name=\"firstColumnHeader\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span class=\"ecp-pro-table-form__req\">*</span>{{ firstColumnTitle }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot name=\"firstColumn\" v-bind=\"firstColumnScope(slotProps)\">\n <template v-if=\"slotProps.row._type === 'fixed'\">\n <span class=\"ecp-pro-table-form__fixed-label\">{{ slotProps.row.rowLabel }}</span>\n </template>\n <el-form-item\n v-else\n :prop=\"competitorNameProp(slotProps.row._index)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <el-input\n :value=\"getCompetitorName(slotProps.row._index)\"\n :placeholder=\"competitorNamePlaceholder\"\n @input=\"setCompetitorName(slotProps.row._index, $event)\"\n />\n </el-form-item>\n </slot>\n </template>\n </el-table-column>\n\n <!-- 数据列:内置 input / formatted-number 或插槽 cell-{slotName} -->\n <el-table-column\n v-for=\"col in columns\"\n :key=\"col.key\"\n :min-width=\"col.minWidth || col.width || 120\"\n :width=\"col.width\"\n >\n <template #header>\n <slot :name=\"'header-' + col.key\" :column=\"col\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"col.required\" class=\"ecp-pro-table-form__req\">*</span>{{ col.title }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <!-- 完全自定义列 -->\n <template v-if=\"col.component === 'slot' && col.slotName\">\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n </template>\n <!-- 内置组件 -->\n <template v-else>\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getFixedMetric(slotProps.row.rowKey, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setFixedMetric(slotProps.row.rowKey, col.key, $event)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getCompetitorMetric(slotProps.row._index, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setCompetitorMetric(slotProps.row._index, col.key, $event)\"\n />\n </el-form-item>\n </template>\n </template>\n </el-table-column>\n\n <!-- 操作列:表头 / 行内均可插槽 -->\n <el-table-column v-if=\"showActionColumn\" v-bind=\"actionColumnBind\">\n <template #header>\n <slot name=\"actionHeader\">\n <span v-if=\"actionColumn?.title\" class=\"ecp-pro-table-form__action-title\">{{ actionColumn.title }}</span>\n <el-button type=\"text\" class=\"ecp-pro-table-form__add-btn\" @click=\"addCompetitor\">\n {{ addCompetitorText }}\n </el-button>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot\n name=\"action\"\n :row=\"slotProps.row\"\n :can-delete=\"canDeleteCompetitor\"\n :add-competitor=\"addCompetitor\"\n :remove-competitor=\"removeCompetitor\"\n >\n <el-button\n v-if=\"slotProps.row._type === 'competitor'\"\n type=\"text\"\n class=\"ecp-pro-table-form__del-btn\"\n :disabled=\"!canDeleteCompetitor\"\n @click=\"removeCompetitor(slotProps.row._index)\"\n >\n 删除\n </el-button>\n <el-button v-else type=\"text\" class=\"ecp-pro-table-form__del-btn\" disabled>\n 删除\n </el-button>\n </slot>\n </template>\n </el-table-column>\n </el-table>\n </el-form>\n </div>\n</template>\n\n<script lang=\"ts\">\n/**\n * Vue 2 默认 v-model 绑定 value + input;本组件使用 modelValue(与 Vue 3 一致),需显式声明 model。\n */\nexport default {\n name: 'ProTableForm',\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport FormattedNumberInput from '../ProForm/FormattedNumberInput.vue'\nimport type { ProTableFormActionColumn, ProTableFormColumn, ProTableFormFixedRow } from './types'\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: Record<string, unknown>\n columns: ProTableFormColumn[]\n fixedRows: ProTableFormFixedRow[]\n competitorsKey?: string\n competitorNameKey?: string\n firstColumnTitle?: string\n competitorNamePlaceholder?: string\n metricPlaceholder?: string\n addCompetitorText?: string\n minCompetitors?: number\n rules?: Record<string, unknown>\n labelWidth?: string\n bordered?: boolean\n firstColMinWidth?: number\n actionWidth?: number\n showFirstColumn?: boolean\n showActionColumn?: boolean\n actionColumn?: ProTableFormActionColumn\n }>(),\n {\n modelValue: () => ({}),\n competitorsKey: 'competitors',\n competitorNameKey: 'name',\n firstColumnTitle: '维度/友商',\n competitorNamePlaceholder: '请输入友商名称',\n metricPlaceholder: '请输入',\n addCompetitorText: '+新增友商',\n minCompetitors: 0,\n labelWidth: '0',\n bordered: true,\n firstColMinWidth: 160,\n actionWidth: 120,\n showFirstColumn: true,\n showActionColumn: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: Record<string, unknown>): void\n}>()\n\nconst formRef = ref<{ validate: (cb?: (valid: boolean) => void) => Promise<unknown> | void; clearValidate: (p?: string | string[]) => void } | null>(null)\n\nconst ck = () => props.competitorsKey ?? 'competitors'\nconst nk = () => props.competitorNameKey ?? 'name'\n\n/** 有固定行时必须保留首列 */\nconst showFirstColumnComputed = computed(() => {\n if (props.fixedRows.length > 0) return true\n return props.showFirstColumn !== false\n})\n\nconst firstColumnFixed = computed(() => 'left' as const)\n\nconst actionColumnBind = computed(() => {\n const ac = props.actionColumn\n return {\n width: ac?.width ?? props.actionWidth,\n minWidth: ac?.minWidth,\n align: ac?.align ?? 'center',\n fixed: ac?.fixed === undefined ? 'right' : ac.fixed,\n }\n})\n\nfunction rowKeyFn(row: TableRow) {\n return row._type === 'fixed' ? `f-${row.rowKey}` : `c-${row._index}`\n}\n\ntype TableRow =\n | { _type: 'fixed'; rowKey: string; rowLabel: string }\n | { _type: 'competitor'; _index: number }\n\nconst tableRows = computed<TableRow[]>(() => {\n const rows: TableRow[] = []\n props.fixedRows.forEach((fr) => {\n rows.push({\n _type: 'fixed',\n rowKey: fr.rowKey,\n rowLabel: fr.label,\n })\n })\n const mv = props.modelValue\n const list = (mv && typeof mv === 'object' ? (mv[ck()] as Record<string, unknown>[] | undefined) : undefined) ?? []\n list.forEach((_, i) => {\n rows.push({ _type: 'competitor', _index: i })\n })\n return rows\n})\n\nconst canDeleteCompetitor = computed(() => {\n const mv = props.modelValue\n const n = ((mv && typeof mv === 'object' ? (mv[ck()] as unknown[]) : undefined) ?? []).length\n return n > props.minCompetitors\n})\n\nfunction cloneModel(): Record<string, unknown> {\n const m = props.modelValue\n if (!m || typeof m !== 'object') {\n return {}\n }\n return JSON.parse(JSON.stringify(m)) as Record<string, unknown>\n}\n\nfunction ensureFixedBlock(rowKey: string): Record<string, unknown> {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n }\n const m = mv[rowKey]\n if (m && typeof m === 'object' && !Array.isArray(m)) return m as Record<string, unknown>\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction emitNext(next: Record<string, unknown>) {\n emit('update:modelValue', next)\n}\n\nfunction getFixedMetric(rowKey: string, key: string): unknown {\n const block = ensureFixedBlock(rowKey)\n return block[key] ?? ''\n}\n\nfunction setFixedMetric(rowKey: string, key: string, val: unknown) {\n const next = cloneModel()\n const b = { ...((next[rowKey] as Record<string, unknown>) || {}) }\n b[key] = val\n next[rowKey] = b\n emitNext(next)\n}\n\nfunction competitorList(): Record<string, unknown>[] {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n return []\n }\n const list = mv[ck()]\n if (!Array.isArray(list)) return []\n return list as Record<string, unknown>[]\n}\n\nfunction getCompetitorName(index: number): string {\n const row = competitorList()[index]\n const key = nk()\n return row ? String(row[key] ?? '') : ''\n}\n\nfunction setCompetitorName(index: number, val: string) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[nk()] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCompetitorMetric(index: number, key: string): unknown {\n const row = competitorList()[index]\n return row ? row[key] ?? '' : ''\n}\n\nfunction setCompetitorMetric(index: number, key: string, val: unknown) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[key] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCellValue(tableRow: TableRow, col: ProTableFormColumn): unknown {\n if (tableRow._type === 'fixed') {\n return getFixedMetric(tableRow.rowKey, col.key)\n }\n return getCompetitorMetric(tableRow._index, col.key)\n}\n\nfunction setCellValue(tableRow: TableRow, col: ProTableFormColumn, val: unknown) {\n if (tableRow._type === 'fixed') {\n setFixedMetric(tableRow.rowKey, col.key, val)\n } else {\n setCompetitorMetric(tableRow._index, col.key, val)\n }\n}\n\n/** 供插槽列 update-value 绑定,避免模板内箭头参数隐式 any */\nfunction slotUpdateHandler(slotProps: { row: TableRow }, col: ProTableFormColumn) {\n return (v: unknown) => setCellValue(slotProps.row, col, v)\n}\n\nfunction emptyCompetitorRow(): Record<string, unknown> {\n const o: Record<string, unknown> = { [nk()]: '' }\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction addCompetitor() {\n const next = cloneModel()\n const list = [...competitorList()]\n list.push(emptyCompetitorRow())\n next[ck()] = list\n emitNext(next)\n}\n\nfunction removeCompetitor(index: number) {\n if (!canDeleteCompetitor.value) return\n const next = cloneModel()\n const list = [...competitorList()]\n list.splice(index, 1)\n next[ck()] = list\n emitNext(next)\n}\n\nfunction fixedMetricProp(rowKey: string, key: string) {\n return `${rowKey}.${key}`\n}\n\nfunction competitorNameProp(index: number) {\n return `${ck()}.${index}.${nk()}`\n}\n\nfunction competitorMetricProp(index: number, key: string) {\n return `${ck()}.${index}.${key}`\n}\n\nfunction cellComponent(col: ProTableFormColumn) {\n return col.component === 'formatted-number' ? FormattedNumberInput : 'el-input'\n}\n\nfunction cellBind(col: ProTableFormColumn): Record<string, unknown> {\n const cp = col.componentProps || {}\n if (col.component === 'formatted-number') {\n return {\n integerDigits: 5,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n ...cp,\n }\n }\n return { ...cp }\n}\n\nfunction firstColumnScope(slotProps: { row: TableRow }) {\n const r = slotProps.row\n if (r._type === 'fixed') {\n return {\n row: r,\n rowType: 'fixed' as const,\n rowKey: r.rowKey,\n rowLabel: r.rowLabel,\n }\n }\n const idx = r._index\n return {\n row: r,\n rowType: 'competitor' as const,\n rowIndex: idx,\n value: getCompetitorName(idx),\n updateValue: (v: string) => setCompetitorName(idx, v),\n }\n}\n\nconst mergedRules = computed(() => {\n const r: Record<string, unknown[]> = {}\n const req = (title: string) => [{ required: true, message: `请输入${title}`, trigger: 'blur' }]\n\n for (const fr of props.fixedRows) {\n for (const col of props.columns) {\n if (col.rules) {\n r[`${fr.rowKey}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${fr.rowKey}.${col.key}`] = req(col.title)\n }\n }\n }\n const list = competitorList()\n list.forEach((_, i) => {\n r[`${ck()}.${i}.${nk()}`] = req('友商名称')\n for (const col of props.columns) {\n if (col.rules) {\n r[`${ck()}.${i}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${ck()}.${i}.${col.key}`] = req(col.title)\n }\n }\n })\n return { ...r, ...(props.rules || {}) }\n})\n\nfunction validate(): Promise<boolean> {\n return new Promise((resolve) => {\n const f = formRef.value\n if (!f || typeof f.validate !== 'function') {\n resolve(true)\n return\n }\n f.validate((valid: boolean) => {\n resolve(valid)\n })\n })\n}\n\nfunction clearValidate(propsArg?: string | string[]) {\n formRef.value?.clearValidate?.(propsArg)\n}\n\ndefineExpose({\n validate,\n clearValidate,\n addCompetitor,\n removeCompetitor,\n})\n</script>\n\n<style scoped>\n.ecp-pro-table-form__form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n.ecp-pro-table-form__cell-item {\n width: 100%;\n}\n.ecp-pro-table-form__cell-item :deep(.el-form-item__content) {\n margin-left: 0 !important;\n line-height: normal;\n}\n.ecp-pro-table-form__fixed-label {\n color: #303133;\n font-size: 14px;\n}\n.ecp-pro-table-form__req {\n color: #f56c6c;\n margin-right: 2px;\n}\n.ecp-pro-table-form__th-text {\n font-weight: 500;\n color: #606266;\n}\n.ecp-pro-table-form__action-title {\n margin-right: 8px;\n font-size: 13px;\n color: #606266;\n}\n.ecp-pro-table-form__add-btn {\n padding: 0;\n font-size: 14px;\n}\n.ecp-pro-table-form__del-btn {\n padding: 0;\n color: #909399;\n}\n.ecp-pro-table-form__del-btn:not(:disabled) {\n color: #409eff;\n}\n</style>\n\n<style>\n.ecp-pro-table-form .ecp-pro-table-form__header-cell {\n background: #f5f7fa !important;\n}\n</style>\n","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions, FormattedNumberInput } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport CollapseContainer from './CollapseContainer'\nimport { ProTableForm } from './ProTableForm'\nimport { useForm } from './ProForm/useForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, FormattedNumberInput, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\nexport { CollapseContainer }\nexport { ProTableForm }\nexport type {\n ProTableFormColumn,\n ProTableFormFixedRow,\n ProTableFormProps,\n ProTableFormActionColumn,\n} from './ProTableForm/types'\nexport { useComponentSetting }\nexport type { UseComponentSettingReturn } from './useComponentSetting'\nexport type { UseProTableReturn, UseProTablePropsReactive } from './ProTable/useProTable'\nexport type { UseDescriptionReturn, UseDescriptionPropsReactive } from './ProDescriptions/useDescription'\nexport * from './ProTable/types'\nexport * from './types'\nexport * from './utils/formattedNumber'\n\nconst components = [\n { name: 'ProTable', component: ProTable },\n { name: 'TableAction', component: TableAction },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions },\n { name: 'FormattedNumberInput', component: FormattedNumberInput },\n { name: 'ProDescriptions', component: ProDescriptions },\n { name: 'CollapseContainer', component: CollapseContainer },\n { name: 'ProTableForm', component: ProTableForm },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n ProTable,\n ProForm,\n ProDescriptions,\n CollapseContainer,\n TableAction,\n FormattedNumberInput,\n ProTableForm,\n}\n"],"names":["componentSettings","reactive","deepMerge","target","source","key","targetValue","sourceValue","isPlainObject","value","proto","useComponentSetting","componentName","config","current","props","globalSetting","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","$scopedSlots","useSlots","slots","tableRef","ref","tableWrapRef","containerWidth","loading","localFullData","innerData","computed","data","showPagination","page","pageSize","pagination","start","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","defaultPagination","paginationConfig","showTitleBar","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","flatColumnsMap","map","flatten","cols","allFlatColumns","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","spanMethodAdapter","param","original","available","result","minPx","maxPx","basePx","selectableRows","getDisabled","row","hasSelectableRows","isAllCurrentPageSelected","isIndeterminate","selectedCount","isRowSelected","getCheckboxDisabled","_c","getRadioDisabled","emitSelectionChange","keys","emit","handleCheckboxChange","checked","handleRadioSelect","handleSelectAll","keySet","toAdd","currentPageKeys","fetchData","opt","fs","pageField","sizeField","listField","totalField","params","processedParams","res","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","tableAction","keyList","fromProps","ordered","k","info","rows","index","fullIndex","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","assignIds","parentKey","i","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","hasTooltipContent","getTooltipContent","item","normalizeTooltipConfig","tooltip","fallbackValue","normalized","normalizeTooltip","getButtonType","action","filterVisible","ifShow","visibleActions","visibleDropDownActions","handleClick","handleActionClick","handlePopConfirm","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","rawOptions","sortStringify","obj","sortKeys","acc","lastFetchedParamsKey","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","sanitizeNumericInput","t","dot","stripNumberGrouping","applyNumericInputDigitLimits","sanitized","integerDigits","decimalPlaces","neg","body","dotIdx","maxInt","intPart","afterDot","endsWithDot","decPart","maxAbsValue","clampByIntegerDigits","max","sign","roundToDecimals","rounding","factor","y","normalizeNumericValue","toFixedDecimalString","formatWithThousands","fixed","withSep","numberToEditString","s","focused","displayText","intN","decM","parseExternalToNumber","num","syncDisplayFromValue","emitStoredValue","onInput","val","clean","onFocus","onBlur","parsed","final","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","filterNodeMethod","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","apiSelectRef","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","showColon","normalizedTooltip","resolved","fieldWrapperComponent","fieldWrapperProps","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","fieldInstanceMap","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","getComponentSetting","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","resolveSchemaModel","baseModel","preserveExisting","nextModel","initialValues","applyFormModel","shouldEmit","updateFormModel","values","initForm","rules","filterByIfShow","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","handleSubmit","handleReset","setFieldsValue","getFieldsValue","resetFields","handleFieldChange","validate","nameList","validateFields","resolve","reject","valid","scrollToField","name","el","clearValidate","updateSchema","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","registerFieldInstance","getComponentInstance","getFieldOptions","apiSelectInstance","isFieldLoading","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","submit","innerSchema","DescriptionValueRenderer","rendererProps","renderTextNode","tooltipProps","contentNode","rendered","breakpoints","resolveColumn","column","currentColumn","effectiveData","visibleSchema","normalizedRows","currentRow","used","totalColumn","remainingItems","requested","normalizedSpan","renderedRows","showCollapseButton","visibleRows","showHeader","collapseButtonText","bodyStyle","getItemStyle","getLabelStyle","getContentStyle","getItemValue","syncSchema","syncData","descriptionProps","setData","getData","descriptionAction","updateWindowWidth","useDescription","descriptionActionRef","getDescriptionProps","getDescriptionAction","innerExpanded","resolvedCanExpan","mergedExpanded","canToggleByHeader","wrapperProps","incoming","wrapperClass","wrapperStyle","rest","triggerWindowResize","setExpanded","toggleExpand","handleHeaderClick","__default__","ck","nk","showFirstColumnComputed","firstColumnFixed","actionColumnBind","ac","rowKeyFn","tableRows","fr","mv","_","canDeleteCompetitor","cloneModel","m","ensureFixedBlock","emitNext","next","getFixedMetric","setFixedMetric","b","competitorList","getCompetitorName","setCompetitorName","getCompetitorMetric","setCompetitorMetric","getCellValue","tableRow","setCellValue","slotUpdateHandler","slotProps","emptyCompetitorRow","addCompetitor","removeCompetitor","fixedMetricProp","competitorNameProp","competitorMetricProp","cellComponent","FormattedNumberInput","cellBind","firstColumnScope","mergedRules","req","f","propsArg","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","CollapseContainer","ProTableForm","install","Vue","component"],"mappings":"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"}
1
+ {"version":3,"file":"element-component-pro.es.js","sources":["../src/useComponentSetting.ts","../src/ProTable/components/CellRenderers.ts","../src/ProTable/components/TableColumnGroup.vue","../src/ProTable/ProTable.vue","../src/utils/tooltip.ts","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.vue","../src/utils/formattedNumber.ts","../src/ProForm/FormattedNumberInput.vue","../src/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/ProDescriptions/ProDescriptions.vue","../src/ProDescriptions/useDescription.ts","../src/CollapseContainer/CollapseContainer.vue","../src/ProTableForm/useProTableForm.ts","../src/ProTableForm/CellEditor.vue","../src/ProTableForm/ProTableForm.vue","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\n/**\n * 深度合并两个对象\n * - source 的值会覆盖 target 的值\n * - 对于嵌套对象,会递归合并\n * - 数组直接替换,不合并\n */\nfunction deepMerge(target: Record<string, unknown>, source?: Record<string, unknown>): Record<string, unknown> {\n if (!source) return target\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const targetValue = target[key]\n const sourceValue = source[key]\n if (key === 'components') {\n target[key] = { ...(targetValue as Record<string, unknown>), ...(sourceValue as Record<string, unknown>) }\n } else if (isPlainObject(sourceValue)) {\n if (!isPlainObject(targetValue)) {\n target[key] = { ...(sourceValue as Record<string, unknown>) }\n } else {\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n }\n } else {\n target[key] = sourceValue\n }\n }\n }\n\n return target\n}\n\n/** 判断是否为普通对象(非数组、非 null) */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string) => T\n /** 设置组件默认配置(与已有配置深度合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n /** 合并组件配置:全局配置与组件 props 合并,返回合并后的结果 */\n mergeSettings: <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>) => T\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置\n * - setSetting:设置组件默认配置(深度合并),可在应用入口或按需调用\n * - mergeSettings:合并全局配置与组件 props,props 优先级更高\n *\n * 合并优先级:组件默认值 < 全局配置 < 组件 props\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n /** 返回浅拷贝(仅外层解包),内部保持对 reactive 存储的直接引用,保证响应式追踪 */\n const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return { ...componentSettings } as T\n }\n return { ...(componentSettings[componentName] ?? {}) } as T\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n if (current) {\n componentSettings[componentName] = deepMerge({ ...current }, config)\n } else {\n componentSettings[componentName] = { ...config }\n }\n }\n\n /** 合并全局配置与组件 props,props 优先级更高 */\n const mergeSettings = <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>): T => {\n const globalSetting = componentSettings[componentName] ?? {}\n return deepMerge({ ...globalSetting }, props) as T\n }\n\n return {\n getSetting,\n setSetting,\n mergeSettings,\n }\n}\n","import { defineComponent, h } from 'vue'\nimport type { ProColumn } from '../types'\n\nexport const DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n },\n setup(p) {\n return () => {\n const col = p.column as any\n if (col?.customRender) {\n const r = col.customRender({ text: p.value, record: p.record, index: p.index })\n if (typeof r === 'string' || typeof r === 'number') return h('span', String(r))\n return r as any\n }\n if (col?.valueEnum) {\n const text = col.valueEnum?.[p.value]?.text ?? p.value\n return h('span', text == null ? '' : String(text))\n }\n return h('span', p.value == null ? '' : String(p.value))\n }\n },\n})\n\nexport const BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n customRender: { type: Function, required: false },\n valueEnum: { type: Object, required: false },\n },\n setup(p) {\n return () => {\n const slot = p.slotRender as any\n const nodes = slot?.({ column: p.column, record: p.record, index: p.index, value: p.value })\n\n const normalize = (n: any) => {\n if (n == null) return []\n if (Array.isArray(n)) return n.filter((x) => x != null && x !== false && !x.isComment)\n return [n]\n }\n const normalized = normalize(nodes)\n if (normalized.length > 0) return nodes\n\n const col = { ...(p.column as any) }\n if (p.customRender) col.customRender = p.customRender\n if (p.valueEnum) col.valueEnum = p.valueEnum\n return h(DefaultCellRenderer as any, { props: { column: col, record: p.record, index: p.index, value: p.value } })\n }\n },\n})\n","<template>\n <el-table-column\n v-if=\"column.children && column.children.length > 0\"\n :label=\"column.title\"\n :align=\"column.align || 'left'\"\n :fixed=\"column.fixed\"\n >\n <template v-for=\"child in column.children\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(child)\"\n :key=\"child.key || child.dataIndex || child.title\"\n :column=\"child\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n </el-table-column>\n <el-table-column\n v-else\n :prop=\"column.dataIndex\"\n :label=\"column.title\"\n :min-width=\"getColumnWidth(column)\"\n :fixed=\"column.fixed\"\n :align=\"column.align || 'left'\"\n :sortable=\"column.sortable\"\n :formatter=\"column.formatter\"\n :show-overflow-tooltip=\"column.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template #default=\"slotProps\">\n <slot\n v-if=\"column.dataIndex && $scopedSlots[column.dataIndex]\"\n :name=\"column.dataIndex\"\n :row=\"slotProps.row\"\n :column=\"column\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n :custom-render=\"column.customRender\"\n :value-enum=\"column.valueEnum\"\n />\n <DefaultCellRenderer\n v-else\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n </template>\n <template #header>\n <slot\n v-if=\"column.dataIndex && $scopedSlots[`header-${column.dataIndex}`]\"\n :name=\"`header-${column.dataIndex}`\"\n :column=\"column\"\n />\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"column\"\n />\n <template v-else>\n <span>{{ column.title }}</span>\n <el-tooltip v-if=\"column.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template #content>\n <span v-if=\"Array.isArray(column.helpMessage)\">\n <div v-for=\"(msg, i) in column.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ column.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n </el-table-column>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlots } from 'vue'\nimport type { ProColumn, ProTableProps } from '../types'\nimport { DefaultCellRenderer, BodyCellRenderer } from './CellRenderers'\n\nconst props = defineProps<{\n column: ProColumn\n effectiveProps: ProTableProps\n getColumnWidth: (col: ProColumn) => number | string | undefined\n}>()\n\nconst $scopedSlots = useSlots()\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n</script>\n","<template>\n <div class=\"ecp-pro-table\">\n <!-- 标题栏 -->\n <div v-if=\"showTitleBar\" class=\"ecp-pro-table__header\">\n <div class=\"ecp-pro-table__title-wrapper\">\n <span class=\"ecp-pro-table__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.titleHelpMessage\" class=\"ecp-pro-table__help\" placement=\"top\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.titleHelpMessage)\">\n <div v-for=\"(msg, i) in effectiveProps.titleHelpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.titleHelpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </div>\n <div class=\"ecp-pro-table__toolbar\">\n <slot name=\"tableTitle\" />\n <slot name=\"toolbar\" />\n <slot name=\"toolbar-right\">\n <el-button\n v-if=\"effectiveProps.tableSetting?.redo !== false\"\n type=\"text\"\n icon=\"el-icon-refresh\"\n size=\"small\"\n @click=\"handleReload\"\n >\n 刷新\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 表格主体(Element UI el-table 无 loading 属性,使用 v-loading 指令) -->\n <div ref=\"tableWrapRef\" class=\"ecp-pro-table__body\" v-loading=\"loading\">\n <el-table\n ref=\"tableRef\"\n :data=\"innerData\"\n :row-key=\"effectiveProps.rowKey\"\n :border=\"effectiveProps.bordered\"\n :stripe=\"effectiveProps.striped\"\n :size=\"effectiveProps.size\"\n :max-height=\"effectiveProps.maxHeight\"\n :height=\"effectiveProps.height\"\n :default-sort=\"effectiveProps.defaultSort\"\n :span-method=\"spanMethodAdapter\"\n :tree-props=\"effectiveProps.treeProps\"\n :default-expand-all=\"effectiveProps.defaultExpandAll\"\n :expand-row-keys=\"effectiveProps.expandRowKeys || []\"\n :lazy=\"effectiveProps.lazy\"\n :load=\"effectiveProps.load\"\n v-bind=\"effectiveProps.tableProps\"\n :row-class-name=\"effectiveProps.rowClassName\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @sort-change=\"handleSortChange\"\n @expand-change=\"handleExpandChange\"\n >\n <!-- 选择列:自定义实现,参考 VbenAdmin,支持单选/多选/禁用/跨页 -->\n <el-table-column\n v-if=\"effectiveProps.rowSelection\"\n :width=\"effectiveProps.rowSelection.width || 48\"\n :fixed=\"effectiveProps.rowSelection.fixed\"\n align=\"center\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 多选:表头全选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isAllCurrentPageSelected\"\n :indeterminate=\"isIndeterminate\"\n :disabled=\"!hasSelectableRows\"\n @change=\"handleSelectAll\"\n />\n <span v-else />\n </template>\n <template slot-scope=\"scope\">\n <!-- 多选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isRowSelected(scope.row)\"\n :disabled=\"getCheckboxDisabled(scope.row)\"\n @change=\"(val) => handleCheckboxChange(scope.row, val)\"\n @click.native.stop\n />\n <!-- 单选 -->\n <el-radio\n v-else\n :value=\"selectedRows[0]?.[rowKeyField]\"\n :label=\"scope.row[rowKeyField]\"\n :disabled=\"getRadioDisabled(scope.row)\"\n @change=\"handleRadioSelect(scope.row)\"\n @click.native.stop\n >\n <span />\n </el-radio>\n </template>\n </el-table-column>\n <!-- 序号列 -->\n <el-table-column\n v-if=\"effectiveProps.showIndexColumn\"\n type=\"index\"\n :label=\"effectiveProps.indexColumnProps?.title || '序号'\"\n :width=\"effectiveProps.indexColumnProps?.width || 60\"\n :fixed=\"effectiveProps.indexColumnProps?.fixed\"\n :align=\"effectiveProps.indexColumnProps?.align || 'center'\"\n />\n <!-- 数据列(支持多级表头) -->\n <template v-for=\"col in displayColumns\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.key || col.dataIndex || col.title\"\n :column=\"col\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n <!-- 操作列 -->\n <el-table-column\n v-if=\"effectiveProps.actionColumn\"\n :label=\"effectiveProps.actionColumn.title || '操作'\"\n :width=\"effectiveProps.actionColumn.width || 150\"\n :fixed=\"effectiveProps.actionColumn.fixed || 'right'\"\n :align=\"effectiveProps.actionColumn.align || 'center'\"\n >\n <template slot-scope=\"scope\">\n <slot\n v-if=\"$scopedSlots['action']\"\n name=\"action\"\n :record=\"scope.row\"\n :column=\"effectiveProps.actionColumn\"\n :index=\"scope.$index\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"effectiveProps.actionColumn\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"undefined\"\n :custom-render=\"effectiveProps.actionColumn.customRender\"\n :value-enum=\"effectiveProps.actionColumn.valueEnum\"\n />\n </template>\n </el-table-column>\n </el-table>\n </div>\n\n <!-- 分页 -->\n <div v-if=\"showPagination\" class=\"ecp-pro-table__pagination\">\n <el-pagination\n :current-page=\"pagination.page\"\n :page-sizes=\"pagination.pageSizes\"\n :page-size=\"pagination.pageSize\"\n :total=\"pagination.total\"\n :small=\"paginationSmall\"\n :background=\"paginationBackground\"\n :layout=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' ? effectiveProps.pagination.layout : null) || 'total, sizes, prev, pager, next, jumper'\"\n v-bind=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' && effectiveProps.pagination.props) || {}\"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// @ts-nocheck - Vue 2 el-table-column slot-scope 类型推断存在已知限制,暂用此方式消除模板内 scope 相关告警\nimport { ref, computed, watch, onMounted, onUnmounted, useSlots, nextTick } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\nimport TableColumnGroup from './components/TableColumnGroup.vue'\nimport { DefaultCellRenderer, BodyCellRenderer } from './components/CellRenderers'\n\nconst props = withDefaults(\n defineProps<{\n columns?: ProColumn[]\n dataSource?: Record<string, unknown>[]\n api?: (params: Record<string, unknown>) => Promise<{ list?: unknown[]; items?: unknown[]; total?: number }>\n rowKey?: string\n title?: string\n titleHelpMessage?: string | string[]\n bordered?: boolean\n striped?: boolean\n size?: 'medium' | 'small' | 'large'\n loading?: boolean\n maxHeight?: number | string\n height?: number | string\n ellipsis?: boolean\n showIndexColumn?: boolean\n indexColumnProps?: Partial<ProColumn>\n actionColumn?: Partial<ProColumn>\n rowSelection?: { type?: 'checkbox' | 'radio'; width?: number; fixed?: 'left' | 'right'; getCheckboxProps?: (r: Record<string, unknown>) => { disabled?: boolean }; getRadioProps?: (r: Record<string, unknown>) => { disabled?: boolean } }\n clearSelectOnPageChange?: boolean\n pagination?: false | { pageSize?: number; pageSizes?: number[]; layout?: string; small?: boolean; background?: boolean; props?: Record<string, unknown> } | Record<string, unknown>\n tableSetting?: { redo?: boolean; size?: boolean; setting?: boolean; fullScreen?: boolean }\n fetchSetting?: FetchSetting\n beforeFetch?: (params: Record<string, unknown>) => Record<string, unknown>\n afterFetch?: (data: unknown) => unknown\n immediate?: boolean\n searchInfo?: Record<string, unknown>\n defaultSort?: { prop: string; order: 'ascending' | 'descending' }\n tableProps?: Record<string, unknown>\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n spanMethod?: (params: { row: Record<string, unknown>; column: Record<string, unknown>; rowIndex: number; columnIndex: number }) => [number, number] | { rowspan: number; colspan: number }\n treeProps?: { hasChildren?: string; children?: string }\n defaultExpandAll?: boolean\n expandRowKeys?: (string | number)[]\n lazy?: boolean\n load?: (row: Record<string, unknown>, treeNode: { level: number; expanded: boolean; loaded: boolean }, resolve: (data: Record<string, unknown>[]) => void) => void\n }>(),\n {\n rowKey: 'id',\n clearSelectOnPageChange: false,\n bordered: false,\n striped: true,\n size: 'medium',\n loading: false,\n ellipsis: true,\n showIndexColumn: true,\n pagination: () => ({ pageSize: 10, pageSizes: [10, 20, 50, 100] }),\n tableSetting: () => ({ redo: true }),\n fetchSetting: () => ({\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'list',\n totalField: 'total',\n }),\n immediate: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: TableActionType): void\n (e: 'fetch-success', data: { items: unknown[]; total: number }): void\n (e: 'fetch-error', error: unknown): void\n (e: 'selection-change', data: { keys: (string | number)[]; rows: Record<string, unknown>[] }): void\n (e: 'row-click', record: Record<string, unknown>, event: Event): void\n (e: 'row-dblclick', record: Record<string, unknown>, event: Event): void\n (e: 'sort-change', sortInfo: { prop: string; order: string }): void\n (e: 'expand-change', row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]): void\n}>()\n\nconst slots = useSlots()\nconst tableRef = ref()\nconst tableWrapRef = ref()\nconst containerWidth = ref(0)\nconst loading = ref(props.loading ?? false)\nconst localFullData = ref<Record<string, unknown>[]>([])\n/** 本地模式数据;API 模式下存服务端返回的当前页数据 */\nconst innerData = computed(() => {\n const data = localFullData.value\n // 不分页时展示全量数据\n if (!showPagination.value) return data\n if (!data.length) return data\n const { page, pageSize } = pagination.value\n const start = (page - 1) * pageSize\n return data.slice(start, start + pageSize)\n})\nconst rawDataSource = ref<Record<string, unknown>>({})\nconst innerColumns = ref<ProColumn[]>([])\nconst innerProps = ref<Partial<ProTableProps>>({})\nconst selectedRows = ref<Record<string, unknown>[]>([])\nconst showPaginationRef = ref<boolean | null>(null)\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<ProTableProps>('ProTable', { ...props, ...innerProps.value }))\n\n/** 从 effectiveProps.pagination 读取分页默认值(已通过深度合并) */\nconst defaultPagination = computed(() => {\n const paginationConfig = effectiveProps.value.pagination\n if (paginationConfig && typeof paginationConfig === 'object') {\n return {\n pageSize: (paginationConfig as Record<string, unknown>).pageSize ?? 10,\n pageSizes: ((paginationConfig as Record<string, unknown>).pageSizes as number[]) ?? [10, 20, 50, 100],\n }\n }\n return { pageSize: 10, pageSizes: [10, 20, 50, 100] as number[] }\n})\n\nconst pagination = ref({\n page: 1,\n pageSize: defaultPagination.value.pageSize,\n pageSizes: defaultPagination.value.pageSizes,\n total: 0,\n})\n\nconst showTitleBar = computed(() => !!effectiveProps.value.title || !!slots.tableTitle || !!slots.toolbar)\nconst showPagination = computed(() => {\n if (showPaginationRef.value !== null) return showPaginationRef.value\n return !!props.pagination && typeof props.pagination === 'object'\n})\n\n/** 分页 small 属性:从 pagination 配置或全局设置中读取 */\nconst paginationSmall = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).small\n }\n return false\n})\n\n/** 分页 background 属性:从 pagination 配置或全局设置中读取 */\nconst paginationBackground = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).background\n }\n return false\n})\n\nconst rowKeyField = computed(() => effectiveProps.value.rowKey || 'id')\n\n/** 选中行 key 集合(用于快速判断) */\nconst selectedKeysSet = computed(() => new Set(selectedRows.value.map((r) => r[rowKeyField.value] as string | number)))\n\n/** 显示列 */\nconst displayColumns = computed(() =>{\n return innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n})\n\n/** 扁平列映射:columnId -> 原始 ProColumn(供 spanMethod 使用) */\nconst flatColumnsMap = computed(() => {\n const map = new Map<string, ProColumn>()\n const flatten = (cols: ProColumn[]) => {\n for (const col of cols) {\n if (col.children && col.children.length > 0) {\n flatten(col.children)\n } else {\n if (col.dataIndex) map.set(col.dataIndex, col)\n }\n }\n }\n flatten(displayColumns.value)\n return map\n})\n\n/** 所有可见叶子列(支持多级表头) */\nconst allFlatColumns = computed(() => Array.from(flatColumnsMap.value.values()))\n\n/** 固定列总宽度 */\nconst fixedColumnsWidth = computed(() => {\n let w = 0\n if (effectiveProps.value.rowSelection) w += Number(effectiveProps.value.rowSelection.width) || 48\n if (effectiveProps.value.showIndexColumn) w += Number(effectiveProps.value.indexColumnProps?.width) || 60\n if (effectiveProps.value.actionColumn) w += Number(effectiveProps.value.actionColumn?.width) || 150\n return w\n})\n\nconst isRatioWidth = (w: number | string | undefined) => typeof w === 'number' && w > 0\nconst totalRatio = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && isRatioWidth(c.width))\n return cols.reduce((sum, c) => sum + (typeof c.width === 'number' ? c.width : 0), 0)\n})\n\nconst fixedDataColumnsWidth = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && typeof c.width === 'string')\n return cols.reduce((sum, c) => sum + (Number(getColumnWidth(c)) || 80), 0)\n})\n\nconst parseWidthPx = (v: number | string | undefined): number | null =>\n v == null ? null : typeof v === 'number' ? v : parseInt(String(v).replace(/px$/i, ''), 10) || null\n\n/** spanMethod 适配器:给用户回调注入原始 ProColumn */\nconst spanMethodAdapter: TableProps<any>['spanMethod'] = (\n param: { row: any; column: any; rowIndex: number; columnIndex: number }\n) => {\n if (!effectiveProps.value.spanMethod) return [1, 1]\n const original = flatColumnsMap.value.get(param.column.property)\n return effectiveProps.value.spanMethod({\n ...param,\n column: original ? {...original,...param.column } : { ...param.column, dataIndex: param.column.property, title: param.column.label },\n })\n}\n\nconst getColumnWidth = (col: ProColumn): number | string | undefined => {\n const w = col.width\n if (isRatioWidth(w) && totalRatio.value > 0 && containerWidth.value > 0 && typeof w === 'number') {\n const available = containerWidth.value - fixedColumnsWidth.value - fixedDataColumnsWidth.value\n let result = Math.floor((available * w) / totalRatio.value)\n const minPx = parseWidthPx(col.minWidth) ?? 60\n const maxPx = parseWidthPx(col.maxWidth)\n result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n if (typeof w === 'string') {\n const basePx = parseWidthPx(w) ?? 80\n const minPx = parseWidthPx(col.minWidth)\n const maxPx = parseWidthPx(col.maxWidth)\n let result = basePx\n if (minPx != null) result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n return col.minWidth\n}\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n\n/** 当前页可选行(未禁用) */\nconst selectableRows = computed(() => {\n const getDisabled = effectiveProps.value.rowSelection?.getCheckboxProps\n if (!getDisabled) return innerData.value\n return innerData.value.filter((row) => !getDisabled(row)?.disabled)\n})\n\nconst hasSelectableRows = computed(() => selectableRows.value.length > 0)\n\n/** 当前页是否全选 */\nconst isAllCurrentPageSelected = computed(() => {\n if (selectableRows.value.length === 0) return false\n return selectableRows.value.every((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number))\n})\n\n/** 半选状态 */\nconst isIndeterminate = computed(() => {\n const selectedCount = selectableRows.value.filter((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number)).length\n return selectedCount > 0 && selectedCount < selectableRows.value.length\n})\n\nconst isRowSelected = (row: Record<string, unknown>) =>\n selectedKeysSet.value.has(row[rowKeyField.value] as string | number)\n\nconst getCheckboxDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getCheckboxProps?.(row)?.disabled ?? false\n\nconst getRadioDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getRadioProps?.(row)?.disabled ?? false\n\nconst emitSelectionChange = () => {\n const keys = selectedRows.value.map((r) => r[rowKeyField.value] as string | number)\n emit('selection-change', { keys, rows: selectedRows.value })\n}\n\nconst handleCheckboxChange = (row: Record<string, unknown>, checked: boolean) => {\n const key = row[rowKeyField.value] as string | number\n if (checked) {\n selectedRows.value = [...selectedRows.value.filter((r) => r[rowKeyField.value] !== key), row]\n } else {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n }\n emitSelectionChange()\n}\n\nconst handleRadioSelect = (row: Record<string, unknown>) => {\n selectedRows.value = [row]\n emitSelectionChange()\n}\n\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n const keySet = new Set(selectedRows.value.map((r) => r[rowKeyField.value]))\n const toAdd = selectableRows.value.filter((row) => !keySet.has(row[rowKeyField.value]))\n selectedRows.value = [...selectedRows.value, ...toAdd]\n } else {\n const currentPageKeys = new Set(innerData.value.map((r) => r[rowKeyField.value]))\n selectedRows.value = selectedRows.value.filter((r) => !currentPageKeys.has(r[rowKeyField.value]))\n }\n emitSelectionChange()\n}\n\nconst fetchData = async (opt?: FetchParams) => {\n if (!props.api) {\n if (props.dataSource) return\n localFullData.value = []\n return\n }\n loading.value = true\n try {\n const fs = effectiveProps.value.fetchSetting ?? {}\n const pageField = fs.pageField ?? 'page'\n const sizeField = fs.sizeField ?? 'pageSize'\n const listField = fs.listField ?? 'list'\n const totalField = fs.totalField ?? 'total'\n const params: Record<string, unknown> = {\n [pageField]: opt?.page ?? pagination.value.page,\n [sizeField]: opt?.pageSize ?? pagination.value.pageSize,\n ...props.searchInfo,\n ...opt?.searchInfo,\n }\n if (opt?.page != null) pagination.value.page = opt.page\n if (opt?.pageSize != null) pagination.value.pageSize = opt.pageSize\n const processedParams = props.beforeFetch ? props.beforeFetch(params) : params\n const res = await props.api!(processedParams)\n rawDataSource.value = (res || {}) as Record<string, unknown>\n const data = (props.afterFetch ? props.afterFetch(res) : res) as Record<string, unknown>\n const list = (data[listField] ?? data.items ?? data.list ?? []) as unknown[]\n const total = (data[totalField] ?? 0) as number\n localFullData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\n localFullData.value = []\n emit('fetch-error', e)\n } finally {\n loading.value = false\n }\n}\n\nconst handleReload = () => fetchData(undefined)\nconst handleSizeChange = (size: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.pageSize = size\n pagination.value.page = 1\n fetchData(undefined)\n}\nconst handleCurrentChange = (page: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.page = page\n fetchData(undefined)\n}\nconst handleRowClick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-click', row, event)\nconst handleRowDblclick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-dblclick', row, event)\nconst handleSortChange = ({ prop, order }: { prop: string; order: string }) => emit('sort-change', { prop, order })\nconst handleExpandChange = (row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]) => emit('expand-change', row, expanded)\n\nconst tableAction: TableActionType = {\n setProps: (p) => { innerProps.value = { ...innerProps.value, ...p } },\n reload: (opt) => fetchData(opt),\n redoHeight: () => { tableRef.value?.doLayout?.() },\n setLoading: (v) => { loading.value = v },\n /** 返回全量数据(API 模式为服务端返回的当前页数据,本地模式为原始全量数据) */\n getDataSource: () => localFullData.value,\n getRawDataSource: () => rawDataSource.value,\n /** 设置本地全量数据,同时同步 total */\n setTableData: (data) => {\n localFullData.value = data ?? []\n if (props.pagination !== false) pagination.value.total = (data ?? []).length\n },\n getColumns: () => innerColumns.value,\n setColumns: (cols) => {\n if (Array.isArray(cols) && cols.length > 0 && typeof cols[0] === 'string') {\n const keyList = cols as string[]\n const fromProps = (props.columns ?? []).filter((c) => keyList.includes((c.key ?? c.dataIndex) as string))\n const ordered = keyList.map((k) => fromProps.find((c) => (c.key ?? c.dataIndex) === k)).filter(Boolean) as ProColumn[]\n if (ordered.length) innerColumns.value = ordered\n } else {\n innerColumns.value = (cols as ProColumn[]) ?? []\n }\n },\n setPagination: (info) => {\n if (info?.page) pagination.value.page = info.page\n if (info?.pageSize) pagination.value.pageSize = info.pageSize\n if (info?.total !== undefined) pagination.value.total = info.total\n },\n getSelectRowKeys: () => selectedRows.value.map((r) => r[rowKeyField.value] as string | number),\n getSelectRows: () => selectedRows.value,\n clearSelectedRowKeys: () => { selectedRows.value = []; emitSelectionChange() },\n setSelectedRowKeys: (keys) => {\n const keySet = new Set(keys)\n const rows = localFullData.value.filter((r) => keySet.has(r[rowKeyField.value] as string | number))\n keys.forEach((k) => {\n if (!rows.some((r) => r[rowKeyField.value] === k)) {\n rows.push({ [rowKeyField.value]: k } as Record<string, unknown>)\n }\n })\n selectedRows.value = rows\n emitSelectionChange()\n },\n deleteSelectRowByKey: (key) => {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n emitSelectionChange()\n },\n /** index 为当前页索引,自动转换为全量索引 */\n updateTableData: (index, key, value) => {\n const { page, pageSize } = pagination.value\n const fullIndex = (page - 1) * pageSize + index\n if (fullIndex < 0 || fullIndex >= localFullData.value.length) return\n localFullData.value = [...localFullData.value]\n localFullData.value[fullIndex] = { ...localFullData.value[fullIndex], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = localFullData.value.findIndex((r) => r[rowKeyField.value] === rowKey)\n if (idx < 0) return\n localFullData.value = [...localFullData.value]\n localFullData.value[idx] = { ...localFullData.value[idx], ...record }\n return localFullData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n localFullData.value = localFullData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n if (props.pagination !== false) pagination.value.total = localFullData.value.length\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...localFullData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n localFullData.value = arr\n if (props.pagination !== false) pagination.value.total = localFullData.value.length\n return record\n },\n getPaginationRef: () =>\n showPagination.value\n ? { page: pagination.value.page, pageSize: Number(pagination.value.pageSize) || 10, total: pagination.value.total }\n : false,\n getShowPagination: () => showPagination.value,\n setShowPagination: (show) => { showPaginationRef.value = show },\n getRowSelection: () => effectiveProps.value.rowSelection,\n expandAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(localFullData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, true))\n },\n collapseAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(localFullData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => {\n const assignIds = (cols: ProColumn[], parentKey = ''): ProColumn[] =>\n cols.map((c, i) => {\n const key = `${c.dataIndex}`\n return {\n ...c,\n dataIndex: key,\n children: c.children ? assignIds(c.children, key) : undefined,\n }\n })\n innerColumns.value = assignIds(props.columns ?? [])\n}\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n localFullData.value = [...props.dataSource]\n if (!props.api && props.pagination !== false) {\n pagination.value.total = props.dataSource.length\n }\n }\n}\n\nconst updateContainerWidth = () => {\n if (tableWrapRef.value) containerWidth.value = tableWrapRef.value.offsetWidth || 0\n}\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedEl: Element | null = null\n\nonMounted(() => {\n syncColumns()\n emit('register', tableAction)\n loadData()\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateContainerWidth)\n resizeObserver = new ResizeObserver(updateContainerWidth)\n nextTick(() => {\n updateContainerWidth()\n observedEl = tableWrapRef.value\n if (observedEl) resizeObserver?.observe(observedEl)\n })\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateContainerWidth)\n if (resizeObserver && observedEl) {\n resizeObserver.unobserve(observedEl)\n observedEl = null\n }\n }\n})\n\nwatch(() => props.columns, syncColumns, { deep: true })\nwatch(() => props.dataSource, () => {\n if (!props.api && props.dataSource) {\n localFullData.value = [...props.dataSource]\n if (props.pagination !== false) pagination.value.total = props.dataSource.length\n }\n}, { deep: true })\nwatch(() => props.loading, (v) => { loading.value = v ?? false })\n</script>\n\n<style>\n.ecp-pro-table {\n padding: 16px;\n background: #fff;\n width: 100%;\n box-sizing: border-box;\n}\n.ecp-pro-table :deep(.el-table) {\n width: 100% !important;\n}\n.ecp-pro-table__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.ecp-pro-table__title-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-pro-table__title {\n font-size: 16px;\n font-weight: 600;\n}\n.ecp-pro-table__help {\n color: #909399;\n cursor: help;\n}\n.ecp-pro-table__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ecp-pro-table__body {\n width: 100%;\n}\n.ecp-pro-table__pagination {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.ecp-pro-table__col-help {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n}\n</style>\n","export type TooltipValue = boolean | string | Record<string, unknown>\n\nexport const hasTooltipContent = (value: unknown): boolean => {\n if (Array.isArray(value)) return value.length > 0\n return value !== undefined && value !== null && String(value).trim() !== ''\n}\n\nexport const getTooltipContent = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(', ')\n }\n if (value === undefined || value === null) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const normalizeTooltipConfig = (\n tooltip: TooltipValue | null | undefined,\n fallbackValue?: unknown\n): Record<string, unknown> | null => {\n if (!tooltip) return null\n\n if (tooltip === true) {\n return {\n content: getTooltipContent(fallbackValue),\n placement: 'top',\n effect: 'dark',\n disabled: !hasTooltipContent(fallbackValue),\n }\n }\n\n if (typeof tooltip === 'string') {\n return {\n content: tooltip,\n placement: 'top',\n effect: 'dark',\n }\n }\n\n const normalized = { ...tooltip }\n const hasExplicitContent = Object.prototype.hasOwnProperty.call(normalized, 'content')\n if (!hasExplicitContent) {\n normalized.content = getTooltipContent(fallbackValue)\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'placement')) {\n normalized.placement = 'top'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'effect')) {\n normalized.effect = 'dark'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'disabled')) {\n normalized.disabled = !hasTooltipContent(normalized.content)\n }\n\n return normalized\n}\n","<template>\n <div class=\"ecp-table-action\">\n <!-- 主操作按钮组 -->\n <span\n v-for=\"(action, index) in visibleActions\"\n :key=\"`action-${index}`\"\n class=\"ecp-table-action__item\"\n >\n <!-- 气泡确认 -->\n <el-popconfirm\n v-if=\"action.popConfirm\"\n :title=\"action.popConfirm.title\"\n :confirm-button-text=\"action.popConfirm.okText || '确定'\"\n :cancel-button-text=\"action.popConfirm.cancelText || '取消'\"\n @confirm=\"handlePopConfirmConfirm(action, $event)\"\n @cancel=\"handlePopConfirmCancel(action, $event)\"\n >\n <span slot=\"reference\">\n <component\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n </span>\n </el-popconfirm>\n\n <!-- 普通按钮 -->\n <component\n v-else\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n\n <el-divider v-if=\"action.divider\" direction=\"vertical\" />\n </span>\n\n <!-- 下拉更多操作 -->\n <el-dropdown v-if=\"visibleDropDownActions.length\" trigger=\"click\" @command=\"handleDropdownCommand\">\n <span class=\"ecp-table-action__more\">\n <el-button type=\"text\" size=\"small\">\n 更多<i class=\"el-icon-arrow-down el-icon--right\" />\n </el-button>\n </span>\n <el-dropdown-menu slot=\"dropdown\">\n <el-dropdown-item\n v-for=\"(action, index) in visibleDropDownActions\"\n :key=\"`dropdown-${index}`\"\n :command=\"index\"\n :disabled=\"action.disabled\"\n :divided=\"!!action.divider\"\n >\n <span class=\"ecp-table-action__dropdown-item\">\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </el-dropdown>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { MessageBox } from 'element-ui'\nimport type { TableActionItem } from './types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst props = withDefaults(\n defineProps<{\n actions?: TableActionItem[]\n dropDownActions?: TableActionItem[]\n /** 是否阻止按钮 click 冒泡,参考 VbenAdmin stopButtonPropagation */\n stopButtonPropagation?: boolean\n }>(),\n {\n actions: () => [],\n dropDownActions: () => [],\n stopButtonPropagation: false,\n }\n)\n\nconst normalizeTooltip = (tooltip?: TableActionItem['tooltip']) => {\n return normalizeTooltipConfig(tooltip) || {}\n}\n\nconst getButtonType = (action: TableActionItem) => {\n if (action.type) return action.type\n if (action.color === 'error') return 'danger'\n if (action.color === 'success') return 'success'\n if (action.color === 'warning') return 'warning'\n return 'text'\n}\n\nconst filterVisible = (list: TableActionItem[]) =>\n list.filter((item) => {\n const { ifShow } = item\n if (typeof ifShow === 'boolean') return ifShow\n if (typeof ifShow === 'function') return ifShow(item)\n return true\n })\n\nconst visibleActions = computed(() => filterVisible(props.actions || []))\nconst visibleDropDownActions = computed(() => filterVisible(props.dropDownActions || []))\n\nconst handleClick = (action: TableActionItem, e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n action.onClick?.(e)\n}\n\nconst handleActionClick = (action: TableActionItem, e: MouseEvent) => {\n handleClick(action, e)\n}\n\nconst handlePopConfirm = (action: TableActionItem, type: 'confirm' | 'cancel', e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n if (!action.popConfirm) return\n if (type === 'confirm') {\n action.popConfirm.confirm?.()\n } else {\n action.popConfirm.cancel?.()\n }\n}\n\nconst handlePopConfirmConfirm = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'confirm', e)\n}\n\nconst handlePopConfirmCancel = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'cancel', e)\n}\n\nconst handleDropdownCommand = (index: number | string) => {\n const idx = Number(index)\n const action = visibleDropDownActions.value[idx]\n if (!action || action.disabled) return\n if (action.popConfirm) {\n const title = action.popConfirm.title\n const okText = action.popConfirm.okText || '确定'\n const cancelText = action.popConfirm.cancelText || '取消'\n MessageBox.confirm(title, '提示', {\n confirmButtonText: okText,\n cancelButtonText: cancelText,\n type: 'warning',\n })\n .then(() => action.popConfirm?.confirm?.())\n .catch(() => action.popConfirm?.cancel?.())\n return\n }\n action.onClick?.({} as MouseEvent)\n}\n</script>\n\n<style>\n.ecp-table-action {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__icon {\n margin-right: 4px;\n}\n.ecp-table-action__more {\n display: inline-flex;\n align-items: center;\n}\n.ecp-table-action__dropdown-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProTableProps, TableActionType } from './types'\n\nexport type UseProTableReturn = [\n (instance: TableActionType) => void,\n TableActionType\n]\n\n/** 支持 ref/computed 的 props */\nexport type UseProTablePropsReactive = ProTableProps | Ref<ProTableProps | undefined>\n\n/**\n * 用于 ProTable 的 useProTable,支持通过 ref 调用表格方法\n * @param props ProTable 的 props 配置,传入后会通过 setProps 同步到表格(支持 ref/computed 响应式更新)\n */\nexport function useProTable(props?: UseProTablePropsReactive): UseProTableReturn {\n const tableActionRef = ref<TableActionType | null>(null)\n\n const getTableProps = (): ProTableProps | undefined =>\n (props ? unref(props as Ref<ProTableProps | undefined>) : undefined) as ProTableProps | undefined\n\n const getTableAction = (): TableActionType => {\n const action = unref(tableActionRef)\n if (!action) {\n throw new Error('ProTable instance has not been registered')\n }\n return action\n }\n\n const register = (instance: TableActionType) => {\n tableActionRef.value = instance\n const tableProps = getTableProps()\n if (tableProps && Object.keys(tableProps).length > 0) {\n instance.setProps(tableProps)\n }\n }\n\n if (props) {\n watch(\n () => getTableProps(),\n (tableProps) => {\n if (tableProps && tableActionRef.value) {\n tableActionRef.value.setProps(tableProps)\n }\n },\n { deep: true }\n )\n }\n\n const tableActions: UseProTableReturn[1] = {\n setProps: (p) => getTableAction().setProps(p),\n reload: (opt) => getTableAction().reload(opt),\n redoHeight: () => getTableAction().redoHeight(),\n setLoading: (v) => getTableAction().setLoading(v),\n getDataSource: () => getTableAction().getDataSource(),\n getRawDataSource: () => getTableAction().getRawDataSource(),\n setTableData: (data) => getTableAction().setTableData(data),\n getColumns: () => getTableAction().getColumns(),\n setColumns: (cols) => getTableAction().setColumns(cols),\n setPagination: (info) => getTableAction().setPagination(info),\n getSelectRowKeys: () => getTableAction().getSelectRowKeys(),\n getSelectRows: () => getTableAction().getSelectRows(),\n clearSelectedRowKeys: () => getTableAction().clearSelectedRowKeys(),\n setSelectedRowKeys: (keys) => getTableAction().setSelectedRowKeys(keys),\n deleteSelectRowByKey: (key) => getTableAction().deleteSelectRowByKey(key),\n updateTableData: (index, key, value) => getTableAction().updateTableData(index, key, value),\n updateTableDataRecord: (rowKey, record) => getTableAction().updateTableDataRecord(rowKey, record),\n deleteTableDataRecord: (rowKey) => getTableAction().deleteTableDataRecord(rowKey),\n insertTableDataRecord: (record, index) => getTableAction().insertTableDataRecord(record, index),\n getPaginationRef: () => getTableAction().getPaginationRef(),\n getShowPagination: () => getTableAction().getShowPagination(),\n setShowPagination: (show) => getTableAction().setShowPagination(show),\n getRowSelection: () => getTableAction().getRowSelection(),\n expandAll: () => getTableAction().expandAll?.(),\n collapseAll: () => getTableAction().collapseAll?.(),\n }\n\n return [register, tableActions]\n}\n","<template>\n <el-select v-bind=\"{ ...$attrs, value: value, placeholder, disabled, loading, clearable, filterable, multiple }\"\n @input=\"$emit('input', $event)\" @change=\"$emit('change', $event)\" @visible-change=\"onVisibleChange\">\n <el-option v-for=\"opt in options\" :key=\"String(opt.value)\" :label=\"opt.label\" :value=\"opt.value\" />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 拉取选项的接口,返回 Promise<Array<{ label, value }>> 或 { list: [] };可接收当前 params 作为参数 */\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n /** 请求参数,变化时会重新拉取 options */\n params?: Record<string, unknown>\n /** 是否懒加载:为 true 时在展开下拉时再请求数据,不在挂载时请求 */\n lazy?: boolean\n /** 接口返回列表中「标签」字段名,默认 'label' */\n labelField?: string\n /** 接口返回列表中「值」字段名,默认 'value' */\n valueField?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n filterable?: boolean\n multiple?: boolean\n }>(),\n { labelField: 'label', valueField: 'value', lazy: false }\n)\n\ndefineEmits<{ (e: 'input', value: unknown): void; (e: 'change', value: unknown): void }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\nconst rawOptions = ref<unknown[]>([])\n\nconst sortStringify = (obj: unknown): string => {\n if (obj === null || obj === undefined) return 'null'\n return JSON.stringify(sortKeys(obj))\n}\n\nconst sortKeys = (obj: unknown): unknown => {\n if (Array.isArray(obj)) return obj.map(sortKeys)\n if (obj !== null && typeof obj === 'object') {\n return Object.keys(obj as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeys((obj as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n return obj\n}\n\nconst lastFetchedParamsKey = ref<string>(sortStringify(props.params ?? null))\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) {\n const paramsKey = sortStringify(props.params ?? null)\n if (paramsKey !== lastFetchedParamsKey.value || options.value.length === 0) {\n fetchOptions()\n }\n }\n}\n\nconst fetchOptions = async () => {\n if (!props.api) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n rawOptions.value = raw\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n options.value = raw.map((item: unknown) => {\n const o = item as Record<string, unknown>\n return {\n label: String(o[labelKey] ?? o.label ?? ''),\n value: o[valueKey] ?? o.value,\n }\n })\n lastFetchedParamsKey.value = sortStringify(props.params ?? null)\n } finally {\n loading.value = false\n }\n}\n\ndefineExpose({\n options,\n rawOptions,\n loading,\n fetchOptions,\n})\n\nonMounted(() => {\n if (!props.lazy) fetchOptions()\n})\nwatch(() => props.api, () => { \n if (!props.lazy) {\n fetchOptions()\n } else {\n options.value = []\n rawOptions.value = []\n }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n const newKey = sortStringify(props.params ?? null)\n if (newKey === lastFetchedParamsKey.value) return\n if (props.lazy) {\n options.value = []\n rawOptions.value = []\n } else {\n fetchOptions()\n }\n}, { deep: true })\n</script>\n","/** 进位方式:向下取整、向上取整、四舍五入 */\nexport type FormattedNumberRounding = 'floor' | 'ceil' | 'round'\n\n/** 仅保留数字、至多一个小数点、可选前导负号 */\nexport function sanitizeNumericInput(raw: string): string {\n const t = raw.trim()\n if (!t) return ''\n let i = 0\n let res = ''\n if (t[0] === '-') {\n res = '-'\n i = 1\n }\n let dot = false\n for (; i < t.length; i++) {\n const c = t[i]\n if (c >= '0' && c <= '9') {\n res += c\n continue\n }\n if (c === '.' && !dot) {\n dot = true\n if (res === '' || res === '-') res += '0'\n res += '.'\n }\n }\n return res\n}\n\nexport function stripNumberGrouping(s: string): string {\n return s.replace(/,/g, '').trim()\n}\n\n/**\n * 对已清洗的数字串按整数位、小数位截断输入长度(inputLimit 为 true 时使用)。\n * 整数部分至多 integerDigits 位,小数部分至多 decimalPlaces 位;保留末尾仅小数点(如 `12.`)以便继续输入。\n */\nexport function applyNumericInputDigitLimits(\n sanitized: string,\n integerDigits: number,\n decimalPlaces: number\n): string {\n if (!sanitized || sanitized === '-') return sanitized\n const neg = sanitized[0] === '-'\n let body = neg ? sanitized.slice(1) : sanitized\n const dotIdx = body.indexOf('.')\n if (dotIdx === -1) {\n const maxInt = Math.max(0, integerDigits)\n body = maxInt > 0 ? body.slice(0, maxInt) : body\n return neg ? '-' + body : body\n }\n let intPart = body.slice(0, dotIdx)\n if (integerDigits > 0) {\n intPart = intPart.slice(0, integerDigits)\n }\n const afterDot = body.slice(dotIdx + 1)\n const endsWithDot = afterDot === '' && body.endsWith('.')\n if (decimalPlaces <= 0) {\n return neg ? '-' + intPart : intPart\n }\n if (endsWithDot) {\n return (neg ? '-' : '') + intPart + '.'\n }\n const decPart = afterDot.slice(0, decimalPlaces)\n return (neg ? '-' : '') + intPart + '.' + decPart\n}\n\nfunction maxAbsValue(integerDigits: number, decimalPlaces: number): number {\n const maxInt = Math.pow(10, integerDigits) - 1\n if (decimalPlaces <= 0) return maxInt\n return maxInt + (1 - Math.pow(10, -decimalPlaces))\n}\n\n/** 按整数位数上限约束绝对值 */\nexport function clampByIntegerDigits(\n value: number,\n integerDigits: number,\n decimalPlaces: number\n): number {\n const max = maxAbsValue(integerDigits, decimalPlaces)\n const sign = value < 0 ? -1 : 1\n const abs = Math.abs(value)\n if (abs <= max) return value\n return sign * max\n}\n\nexport function roundToDecimals(\n value: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n if (decimalPlaces <= 0) {\n switch (rounding) {\n case 'floor':\n return Math.floor(value)\n case 'ceil':\n return Math.ceil(value)\n default:\n return Math.round(value)\n }\n }\n const factor = Math.pow(10, decimalPlaces)\n const x = value * factor\n let y: number\n switch (rounding) {\n case 'floor':\n y = Math.floor(x)\n break\n case 'ceil':\n y = Math.ceil(x)\n break\n default:\n y = Math.round(x)\n }\n return y / factor\n}\n\n/**\n * 解析 → 按整数位夹紧 → 按小数位与进位方式舍入 → 再夹紧(防止舍入后越界)\n */\nexport function normalizeNumericValue(\n value: number,\n integerDigits: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n let v = clampByIntegerDigits(value, integerDigits, decimalPlaces)\n v = roundToDecimals(v, decimalPlaces, rounding)\n v = clampByIntegerDigits(v, integerDigits, decimalPlaces)\n return v\n}\n\n/**\n * 固定小数位数字符串(无千分位),用于表单存值以保留配置的小数位数(number 无法保留尾随 0)。\n */\nexport function toFixedDecimalString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n return value.toFixed(Math.max(0, decimalPlaces))\n}\n\n/** 千分位格式化展示(整数部分),小数部分固定 m 位 */\nexport function formatWithThousands(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n const fixed = value.toFixed(Math.max(0, decimalPlaces))\n const neg = fixed.startsWith('-')\n const body = neg ? fixed.slice(1) : fixed\n const [intPart, decPart] = body.split('.')\n const withSep = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n if (decimalPlaces <= 0 || decPart === undefined) return (neg ? '-' : '') + withSep\n return (neg ? '-' : '') + withSep + '.' + decPart\n}\n\n/** 编辑态:无千分位,去掉多余尾部 0(在 m 位精度内) */\nexport function numberToEditString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n let s = value.toFixed(Math.max(0, decimalPlaces))\n s = s.replace(/(\\.\\d*?)0+$/, '$1')\n s = s.replace(/\\.$/, '')\n return s\n}\n","<template>\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n v-bind=\"$attrs\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { FormattedNumberRounding } from '../utils/formattedNumber'\nimport {\n applyNumericInputDigitLimits,\n formatWithThousands,\n normalizeNumericValue,\n numberToEditString,\n sanitizeNumericInput,\n stripNumberGrouping,\n toFixedDecimalString,\n} from '../utils/formattedNumber'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n placeholder?: string\n disabled?: boolean\n /** 整数部分允许的最大位数,默认 5 */\n integerDigits?: number\n /** 小数保留位数,默认 6 */\n decimalPlaces?: number\n /** 进位方式,默认四舍五入 */\n rounding?: FormattedNumberRounding\n /**\n * 为 true 时在输入过程中按 integerDigits / decimalPlaces 限制可输入位数;\n * 为 false 时仅失焦后规范化,输入阶段不截断长度。\n */\n inputLimit?: boolean\n }>(),\n {\n integerDigits: 6,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst focused = ref(false)\nconst displayText = ref('')\n\nconst intN = () => Math.max(0, Math.floor(props.integerDigits ?? 6))\nconst decM = () => Math.max(0, Math.floor(props.decimalPlaces ?? 6))\n\nfunction parseExternalToNumber(v: unknown): number | null {\n if (v === null || v === undefined || v === '') return null\n if (typeof v === 'number') {\n return Number.isFinite(v) ? v : null\n }\n const s = stripNumberGrouping(String(v))\n if (s === '' || s === '-') return null\n const num = Number(s)\n return Number.isFinite(num) ? num : null\n}\n\nfunction syncDisplayFromValue() {\n if (focused.value) return\n const num = parseExternalToNumber(props.value)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = formatWithThousands(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nwatch(\n () => [props.value, props.integerDigits, props.decimalPlaces, props.rounding],\n () => syncDisplayFromValue(),\n { immediate: true, deep: true }\n)\n\nfunction emitStoredValue(normalized: number) {\n emit('input', toFixedDecimalString(normalized, decM()))\n}\n\nfunction onInput(val: string) {\n let clean = sanitizeNumericInput(val)\n if (props.inputLimit !== false) {\n clean = applyNumericInputDigitLimits(clean, intN(), decM())\n }\n displayText.value = clean\n if (clean === '' || clean === '-') return\n const num = Number(clean)\n if (!Number.isFinite(num)) return\n const normalized = normalizeNumericValue(num, intN(), decM(), props.rounding)\n emitStoredValue(normalized)\n}\n\nfunction onFocus() {\n focused.value = true\n const raw = stripNumberGrouping(displayText.value)\n const num = parseExternalToNumber(raw === '' ? props.value : raw)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = numberToEditString(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nfunction onBlur() {\n focused.value = false\n const raw = stripNumberGrouping(displayText.value)\n if (raw === '' || raw === '-') {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const parsed = Number(sanitizeNumericInput(raw))\n if (!Number.isFinite(parsed)) {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const final = normalizeNumericValue(parsed, intN(), decM(), props.rounding)\n displayText.value = formatWithThousands(final, decM())\n emitStoredValue(final)\n}\n</script>\n","<template>\n <div class=\"ecp-tree-select\" ref=\"rootRef\">\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :clearable=\"clearable\"\n readonly\n suffix-icon=\"el-icon-arrow-down\"\n class=\"ecp-tree-select__input\"\n @focus=\"openDropdown\"\n @clear=\"clearValue\"\n />\n <transition name=\"el-zoom-in-top\">\n <div v-show=\"dropdownVisible\" class=\"ecp-tree-select__dropdown\">\n <div v-if=\"filterable\" class=\"ecp-tree-select__filter-inner\">\n <el-input\n v-model=\"filterText\"\n size=\"small\"\n placeholder=\"搜索节点\"\n prefix-icon=\"el-icon-search\"\n clearable\n @click.native.stop\n />\n </div>\n <el-tree\n v-show=\"!loading\"\n ref=\"treeRef\"\n :data=\"treeData\"\n :props=\"treeProps\"\n :node-key=\"valueField\"\n :filter-node-method=\"filterable ? filterNodeMethod : undefined\"\n :highlight-current=\"true\"\n default-expand-all\n @node-click=\"onNodeClick\"\n />\n <div v-if=\"loading\" class=\"ecp-tree-select__loading\">\n <i class=\"el-icon-loading\" /> 加载中...\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, nextTick } from 'vue'\n\ninterface TreeNode {\n label?: string\n value?: unknown\n children?: TreeNode[]\n [key: string]: unknown\n}\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 树数据,直接传入时优先使用,不请求 api */\n treeData?: unknown[]\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n params?: Record<string, unknown>\n lazy?: boolean\n labelField?: string\n valueField?: string\n childrenField?: string\n filterable?: boolean\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n }>(),\n {\n labelField: 'label',\n valueField: 'value',\n childrenField: 'children',\n lazy: false,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst rootRef = ref<HTMLElement>()\nconst treeRef = ref()\nconst dropdownVisible = ref(false)\nconst loading = ref(false)\nconst filterText = ref('')\nconst treeData = ref<TreeNode[]>([])\nconst flatLabelMap = ref<Record<string, string>>({})\n\nconst treeProps = computed(() => ({\n label: props.labelField,\n children: props.childrenField,\n}))\n\nfunction normalizeNode(node: Record<string, unknown>): TreeNode {\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n const children = node[childrenKey] as unknown[]\n const out: TreeNode = {}\n out[props.labelField ?? 'label'] = node[labelKey] ?? node.label\n out[props.valueField ?? 'value'] = node[valueKey] ?? node.value\n if (Array.isArray(children) && children.length) {\n out[props.childrenField ?? 'children'] = children.map((c) => normalizeNode(c as Record<string, unknown>))\n }\n return out\n}\n\nfunction buildFlatLabelMap(nodes: TreeNode[], prefix = ''): Record<string, string> {\n const map: Record<string, string> = {}\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n for (const node of nodes) {\n const label = String(node[labelKey] ?? node.label ?? '')\n const value = node[valueKey] ?? node.value\n if (value !== undefined && value !== null) {\n map[String(value)] = prefix ? prefix + ' / ' + label : label\n }\n const children = node[childrenKey] ?? node.children\n if (Array.isArray(children) && children.length) {\n Object.assign(map, buildFlatLabelMap(children as TreeNode[], label))\n }\n }\n return map\n}\n\nfunction hasTreeDataProp() {\n const td = props.treeData\n return Array.isArray(td) && td.length > 0\n}\n\nfunction applyTreeData(nodes: TreeNode[]) {\n treeData.value = nodes\n flatLabelMap.value = buildFlatLabelMap(nodes)\n}\n\nfunction syncFromTreeDataProp() {\n const td = props.treeData\n if (!Array.isArray(td) || td.length === 0) return\n const normalized = td.map((item) => normalizeNode(item as Record<string, unknown>))\n applyTreeData(normalized)\n}\n\nconst displayText = computed(() => {\n if (props.value == null || props.value === '') return ''\n return flatLabelMap.value[String(props.value)] ?? String(props.value)\n})\n\nconst filterNodeMethod = (value: string, data: TreeNode) => {\n if (!value) return true\n const labelKey = props.labelField ?? 'label'\n const label = String(data[labelKey] ?? data.label ?? '')\n return label.toLowerCase().includes(value.toLowerCase())\n}\n\nwatch(filterText, (val) => {\n treeRef.value?.filter(val)\n})\n\nlet clickOutsideHandler: ((e: MouseEvent) => void) | null = null\n\nfunction openDropdown() {\n if (props.disabled) return\n dropdownVisible.value = true\n if (props.lazy && !hasTreeDataProp()) fetchData()\n nextTick(() => {\n clickOutsideHandler = (e: MouseEvent) => {\n if (rootRef.value && !rootRef.value.contains(e.target as Node)) {\n closeDropdown()\n }\n }\n document.addEventListener('click', clickOutsideHandler)\n })\n}\n\nfunction closeDropdown() {\n dropdownVisible.value = false\n filterText.value = ''\n if (clickOutsideHandler) {\n document.removeEventListener('click', clickOutsideHandler)\n clickOutsideHandler = null\n }\n}\n\nfunction clearValue() {\n emit('input', undefined)\n}\n\nfunction onNodeClick(data: TreeNode) {\n const valueKey = props.valueField ?? 'value'\n const val = data[valueKey] ?? data.value\n emit('input', val)\n closeDropdown()\n}\n\nasync function fetchData() {\n if (!props.api || hasTreeDataProp()) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n treeData.value = raw.map((item) => normalizeNode(item as Record<string, unknown>))\n flatLabelMap.value = buildFlatLabelMap(treeData.value)\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else if (!props.lazy) {\n fetchData()\n }\n})\n\nwatch(() => props.treeData, () => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else {\n treeData.value = []\n flatLabelMap.value = {}\n if (!props.lazy && props.api) fetchData()\n }\n}, { deep: true })\n\nwatch(() => props.api, () => {\n if (hasTreeDataProp()) return\n if (!props.lazy) fetchData()\n else { treeData.value = []; flatLabelMap.value = {} }\n}, { deep: true })\n\nwatch(() => props.params, () => {\n if (hasTreeDataProp()) return\n if (props.lazy) { treeData.value = []; flatLabelMap.value = {} }\n else fetchData()\n}, { deep: true })\n</script>\n\n<style>\n.ecp-tree-select {\n position: relative;\n width: 100%;\n}\n.ecp-tree-select__filter-inner {\n margin-bottom: 8px;\n}\n.ecp-tree-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 280px;\n overflow: auto;\n background: #fff;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n margin-top: 4px;\n z-index: 1000;\n padding: 8px;\n}\n.ecp-tree-select__loading {\n padding: 24px;\n text-align: center;\n color: #909399;\n font-size: 14px;\n}\n</style>\n","<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n :label-width=\"schema.labelWidth\"\n >\n <template slot=\"label\">\n <span>\n {{ schema.label }}<span v-if=\"showColon\" class=\"ecp-pro-form-item__colon\">:</span>\n </span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <!-- 自定义 component:组件名或内联组件 -->\n <component :is=\"fieldWrapperComponent\" v-bind=\"fieldWrapperProps\">\n <component\n v-if=\"resolvedCustomComponent\"\n :is=\"resolvedCustomComponent\"\n :value=\"formModel[schema.field]\"\n @input=\"setFieldValue\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input\n v-else-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <FormattedNumberInput\n v-else-if=\"schema.component === 'formatted-number'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <ApiSelect\n v-else-if=\"schema.component === 'api-select'\"\n ref=\"apiSelectRef\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <TreeSelect\n v-else-if=\"schema.component === 'tree-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </component>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h, ref, onMounted, onUnmounted } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport FormattedNumberInput from './FormattedNumberInput.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-number',\n 'formatted-number',\n 'switch', 'cascader', 'checkbox', 'radio',\n])\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n colon?: boolean\n formActionType?: import('../types').FormActionType\n onFieldChange?: (field: string, value: unknown) => void\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\n /** 注册字段实例(由 ProForm 传入) */\n registerFieldInstance?: (field: string, instance: Record<string, unknown> | null) => void\n}>()\n\n/** ApiSelect 组件实例 ref */\nconst apiSelectRef = ref<Record<string, unknown> | null>(null)\n\nonMounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, apiSelectRef.value)\n }\n})\n\nonUnmounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, null)\n }\n})\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\nconst showColon = computed(() => props.schema.colon ?? props.colon ?? false)\n\nconst normalizedTooltip = computed(() => {\n const tooltip = props.schema.tooltip\n if (!tooltip) return null\n const resolved = typeof tooltip === 'function' ? tooltip(renderParams.value) : tooltip\n return normalizeTooltipConfig(resolved, props.formModel[props.schema.field])\n})\n\nconst fieldWrapperComponent = computed(() => normalizedTooltip.value ? 'el-tooltip' : 'span')\nconst fieldWrapperProps = computed(() => normalizedTooltip.value || {})\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst resolvedCustomComponent = computed(() => {\n const c = props.schema.component\n if (c == null) return null\n if (typeof c === 'string') {\n if (BUILT_IN_COMPONENTS.has(c)) return null\n return (props.customComponents && props.customComponents[c]) || c\n }\n return c\n})\n\nconst setFieldValue = (v: unknown) => {\n props.onFieldChange?.(props.schema.field, v)\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style>\n.ecp-pro-form-item__colon {\n margin-right: 2px;\n}\n\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"currentFormModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"currentFormModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\" :colon=\"effectiveProps.colon\"\n :custom-components=\"formCustomComponents\" :on-field-change=\"handleFieldChange\"\n :register-field-instance=\"registerFieldInstance\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"currentFormModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"currentFormModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners, ApiSelectInstance } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n modelValue?: Record<string, unknown>\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n colon?: boolean\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n /** 自定义组件映射(组件名 -> 组件),供 schema.component 使用 */\n components?: Record<string, unknown>\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n colon: true,\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '查询',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n (e: 'update:modelValue', values: Record<string, unknown>): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n/** 字段名 -> 组件实例映射(用于获取 api-select 等组件的内部状态) */\nconst fieldInstanceMap = ref<Map<string, ComponentPublicInstance>>(new Map())\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProForm'), ...props, ...innerProps.value }))\nconst controlledModelValue = computed(() => effectiveProps.value.modelValue)\nconst isControlled = computed(() => controlledModelValue.value !== undefined)\nconst currentFormModel = computed<Record<string, unknown>>(() => {\n return isControlled.value\n ? (controlledModelValue.value ?? {})\n : formModel.value\n})\n/** 传给 ProFormItem 的自定义组件映射:显式合并 setSetting 与 props,避免响应式代理导致组件引用丢失 */\nconst formCustomComponents = computed(() => ({\n ...(getComponentSetting('ProForm').components as Record<string, unknown> | undefined) ?? {},\n ...(effectiveProps.value.components ?? {}),\n ...(innerProps.value.components ?? {}),\n}))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n/**\n * \n * @param baseModel \n * @param preserveExisting \n */\nconst resolveSchemaModel = (baseModel?: Record<string, unknown>, preserveExisting = true) => {\n const nextModel = preserveExisting ? { ...(baseModel ?? {}) } : {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n if (preserveExisting && Object.prototype.hasOwnProperty.call(nextModel, schema.field)) return\n if (schema.defaultValue !== undefined) {\n nextModel[schema.field] = schema.defaultValue\n return\n }\n if (initialValues && Object.prototype.hasOwnProperty.call(initialValues, schema.field)) {\n nextModel[schema.field] = initialValues[schema.field]\n }\n })\n return nextModel\n}\n\nconst applyFormModel = (nextModel: Record<string, unknown>, shouldEmit = true) => {\n formModel.value = nextModel\n if (shouldEmit) emit('update:modelValue', nextModel)\n}\n\nconst updateFormModel = (values: Record<string, unknown>) => {\n const nextModel = resolveSchemaModel({ ...currentFormModel.value, ...values })\n applyFormModel(nextModel)\n return nextModel\n}\n\nconst initForm = () => {\n const rules: Record<string, unknown[]> = {}\n innerSchemas.value.forEach((schema) => {\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n applyFormModel(resolveSchemaModel(currentFormModel.value), false)\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...currentFormModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n updateFormModel(values)\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...currentFormModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n applyFormModel(resolveSchemaModel(undefined, false))\n}\n\nconst handleFieldChange = (field: string, value: unknown) => {\n updateFormModel({ [field]: value })\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n initForm()\n }\n}\n\n/** 注册组件实例(供 ProFormItem 调用) */\nconst registerFieldInstance = (field: string, instance: Record<string, unknown> | null) => {\n if (instance) {\n fieldInstanceMap.value.set(field, instance as unknown as ComponentPublicInstance)\n } else {\n fieldInstanceMap.value.delete(field)\n }\n}\n\n/** 获取指定字段的组件实例 */\nconst getComponentInstance = (field: string): ComponentPublicInstance | null => {\n return fieldInstanceMap.value.get(field) ?? null\n}\n\n/** 获取 api-select 字段的 options,raw=true 时返回接口原始数据 */\nfunction getFieldOptions(field: string): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: true): unknown[]\nfunction getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return []\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n if (raw) {\n return apiSelectInstance?.rawOptions ?? []\n }\n return apiSelectInstance?.options ?? []\n}\n\n/** 获取 api-select 字段的加载状态 */\nconst isFieldLoading = (field: string): boolean => {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return false\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n return apiSelectInstance?.loading ?? false\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n}\n\ndefineExpose({\n ...formActionRef,\n registerFieldInstance,\n})\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => controlledModelValue.value, (value) => {\n if (!isControlled.value || value === undefined) return\n applyFormModel(resolveSchemaModel(value), false)\n}, { deep: true, immediate: true })\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form .ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n getComponentInstance: FormActionType['getComponentInstance']\n getFieldOptions: FormActionType['getFieldOptions']\n isFieldLoading: FormActionType['isFieldLoading']\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const getComponentInstance: FormActionType['getComponentInstance'] = (field) =>\n formAction.value?.getComponentInstance(field) ?? null\n\n function getFieldOptions(field: string): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: true): unknown[]\n function getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n if (!formAction.value) return []\n if (raw) return formAction.value.getFieldOptions(field, true)\n return formAction.value.getFieldOptions(field)\n }\n\n const isFieldLoading: FormActionType['isFieldLoading'] = (field) =>\n formAction.value?.isFieldLoading(field) ?? false\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n }\n\n return [register, result]\n}\n","<template>\n <div class=\"ecp-pro-descriptions\">\n <div v-if=\"showHeader\" class=\"ecp-pro-descriptions__header\">\n <div class=\"ecp-pro-descriptions__title-wrap\">\n <span v-if=\"effectiveProps.title\" class=\"ecp-pro-descriptions__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-descriptions__help\" />\n </el-tooltip>\n <el-tooltip v-if=\"effectiveProps.collapseOptions?.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.collapseOptions.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.collapseOptions.helpMessage\" :key=\"`collapse-${index}`\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.collapseOptions.helpMessage }}</span>\n </template>\n <i class=\"el-icon-info ecp-pro-descriptions__help\" />\n </el-tooltip>\n </div>\n <el-button\n v-if=\"showCollapseButton\"\n type=\"text\"\n class=\"ecp-pro-descriptions__toggle\"\n @click=\"expanded = !expanded\"\n >\n {{ expanded ? collapseButtonText.collapse : collapseButtonText.expand }}\n <i class=\"el-icon-arrow-down\" :class=\"expanded ? 'is-expanded' : ''\" />\n </el-button>\n </div>\n\n <div\n class=\"ecp-pro-descriptions__body\"\n :class=\"[\n `is-${effectiveProps.size}`,\n { 'is-bordered': effectiveProps.bordered, 'is-collapsed': showCollapseButton && !expanded },\n ]\"\n :style=\"bodyStyle\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"(row, rowIndex) in renderedRows\">\n <template v-for=\"item in row.items\">\n <div\n :key=\"`${rowIndex}-${item.dataIndex || item.field}`\"\n class=\"ecp-pro-descriptions__item\"\n :style=\"getItemStyle(item)\"\n >\n <div class=\"ecp-pro-descriptions__label\" :style=\"getLabelStyle(item)\">\n {{ item.label }}\n </div>\n <div class=\"ecp-pro-descriptions__content\" :style=\"getContentStyle(item)\">\n <slot\n v-if=\"$scopedSlots[item.slot || item.dataIndex]\"\n :name=\"item.slot || item.dataIndex\"\n :value=\"getItemValue(item)\"\n :record=\"effectiveData\"\n :schema=\"item\"\n />\n <DescriptionValueRenderer v-else :schema=\"item\" :value=\"getItemValue(item)\" :record=\"effectiveData\" :empty-text=\"effectiveProps.emptyText || '-'\" />\n </div>\n </div>\n </template>\n </template>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\nimport type {\n DescriptionActionType,\n DescriptionColumn,\n DescriptionProps,\n DescriptionSchema,\n} from '../types'\n\ninterface NormalizedRow {\n items: Array<DescriptionSchema & { _span: number }>\n}\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n helpMessage?: string | string[]\n size?: 'medium' | 'small'\n bordered?: boolean\n column?: DescriptionColumn\n schema?: DescriptionSchema[]\n data?: Record<string, unknown>\n emptyText?: string\n useCollapse?: boolean\n collapseOptions?: {\n canExpand?: boolean\n defaultExpand?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n helpMessage?: string | string[]\n visibleRows?: number\n }\n }>(),\n {\n size: 'medium',\n bordered: true,\n column: () => ({ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }),\n schema: () => [],\n data: () => ({}),\n emptyText: '-',\n useCollapse: false,\n collapseOptions: () => ({ canExpand: false, defaultExpand: true, expandButtonText: '展开', collapseButtonText: '收起', visibleRows: 1 }),\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: DescriptionActionType): void\n}>()\n\nconst innerProps = ref<Partial<DescriptionProps>>({})\nconst innerData = ref<Record<string, unknown>>({})\nconst innerSchema = ref<DescriptionSchema[]>([])\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\nconst expanded = ref(true)\n\nconst DescriptionValueRenderer = defineComponent({\n name: 'EcpDescriptionValueRenderer',\n props: {\n schema: { type: Object, required: true },\n value: { required: false },\n record: { type: Object, required: true },\n emptyText: { type: String, default: '-' },\n },\n setup(rendererProps) {\n return () => {\n const schema = rendererProps.schema as DescriptionSchema\n const record = rendererProps.record as Record<string, unknown>\n const value = rendererProps.value\n\n const renderTextNode = (text: string) => {\n const tooltipProps = normalizeTooltip(schema, text === rendererProps.emptyText ? value : text, record)\n const contentNode = h('span', text)\n if (!tooltipProps) return contentNode\n return h('el-tooltip', { props: tooltipProps }, [contentNode])\n }\n\n if (schema.render) {\n const rendered = schema.render(value, record)\n if (rendered == null || rendered === '') return renderTextNode(rendererProps.emptyText)\n if (typeof rendered === 'string' || typeof rendered === 'number') return renderTextNode(String(rendered))\n return rendered as never\n }\n\n if (Array.isArray(value)) {\n return renderTextNode(value.length ? value.join(', ') : rendererProps.emptyText)\n }\n\n if (value === null || value === undefined || value === '') {\n return renderTextNode(rendererProps.emptyText)\n }\n\n if (typeof value === 'object') {\n return renderTextNode(JSON.stringify(value))\n }\n\n return renderTextNode(String(value))\n }\n },\n})\n\nconst normalizeTooltip = (schema: DescriptionSchema, value: unknown, record: Record<string, unknown>) => {\n const tooltip = schema.tooltip\n if (!tooltip) return null\n\n const resolved = typeof tooltip === 'function'\n ? tooltip({ value, record, schema })\n : tooltip\n return normalizeTooltipConfig(resolved, value)\n}\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<DescriptionProps>('ProDescriptions', { ...props, ...innerProps.value }))\n\nconst breakpoints = { xxl: 1920, xl: 1200, lg: 992, md: 768, sm: 576 }\n\nconst resolveColumn = (column: DescriptionColumn | undefined, width: number) => {\n if (typeof column === 'number') return Math.max(1, column)\n const value = column ?? {}\n if (width >= breakpoints.xxl) return value.xxl ?? value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.xl) return value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.lg) return value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.md) return value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.sm) return value.sm ?? value.xs ?? 2\n return value.xs ?? 1\n}\n\nconst currentColumn = computed(() => resolveColumn(effectiveProps.value.column, windowWidth.value))\nconst effectiveData = computed(() => effectiveProps.value.data ?? innerData.value ?? {})\n\nconst visibleSchema = computed(() => {\n return (innerSchema.value.length ? innerSchema.value : effectiveProps.value.schema ?? []).filter((item) => {\n const key = item.dataIndex || item.field\n if (!key) return false\n if (typeof item.show === 'function') {\n return item.show(effectiveData.value)\n }\n return item.show !== false\n }).map((item) => ({\n ...item,\n dataIndex: item.dataIndex || item.field || '',\n }))\n})\n\nconst normalizedRows = computed<NormalizedRow[]>(() => {\n const rows: NormalizedRow[] = []\n let currentRow: NormalizedRow = { items: [] }\n let used = 0\n const totalColumn = currentColumn.value\n visibleSchema.value.forEach((item, index) => {\n const remainingItems = visibleSchema.value.length - index\n const requested = Math.max(1, Math.min(item.span ?? 1, totalColumn))\n const span = remainingItems === 1 ? totalColumn - used || totalColumn : requested\n if (used + span > totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n const normalizedSpan = remainingItems === 1 && used < totalColumn ? Math.max(1, totalColumn - used) : span\n currentRow.items.push({ ...item, _span: normalizedSpan })\n used += normalizedSpan\n if (used >= totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n })\n if (currentRow.items.length > 0) rows.push(currentRow)\n return rows\n})\n\nconst renderedRows = computed(() => {\n if (!showCollapseButton.value || expanded.value) return normalizedRows.value\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return normalizedRows.value.slice(0, visibleRows)\n})\n\nconst showCollapseButton = computed(() => {\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return !!effectiveProps.value.useCollapse && !!effectiveProps.value.collapseOptions?.canExpand && normalizedRows.value.length > visibleRows\n})\nconst showHeader = computed(() => !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || showCollapseButton.value)\nconst collapseButtonText = computed(() => ({\n expand: effectiveProps.value.collapseOptions?.expandButtonText ?? '展开',\n collapse: effectiveProps.value.collapseOptions?.collapseButtonText ?? '收起',\n}))\n\nconst bodyStyle = computed(() => ({\n gridTemplateColumns: `repeat(${currentColumn.value}, minmax(0, 1fr))`,\n}))\n\nconst getItemStyle = (item: DescriptionSchema & { _span: number }) => ({\n gridColumn: `span ${item._span}`,\n})\n\nconst getLabelStyle = (item: DescriptionSchema) => ({\n minWidth: item.labelMinWidth ? `${item.labelMinWidth}px` : undefined,\n ...(item.labelStyle ?? {}),\n})\n\nconst getContentStyle = (item: DescriptionSchema) => ({\n minWidth: item.contentMinWidth ? `${item.contentMinWidth}px` : undefined,\n ...(item.contentStyle ?? {}),\n})\n\nconst getItemValue = (item: DescriptionSchema) => effectiveData.value[item.dataIndex]\n\nconst syncSchema = () => {\n innerSchema.value = [...(effectiveProps.value.schema ?? [])]\n}\n\nconst syncData = () => {\n innerData.value = { ...(effectiveProps.value.data ?? {}) }\n}\n\nconst setProps = async (descriptionProps: Partial<DescriptionProps>) => {\n innerProps.value = { ...innerProps.value, ...descriptionProps }\n if (descriptionProps.schema) innerSchema.value = [...descriptionProps.schema]\n if (descriptionProps.data) innerData.value = { ...descriptionProps.data }\n}\n\nconst setData = async (data: Record<string, unknown>) => {\n innerData.value = { ...innerData.value, ...data }\n innerProps.value = { ...innerProps.value, data: innerData.value }\n}\n\nconst getData = () => ({ ...(effectiveProps.value.data ?? innerData.value ?? {}) })\n\nconst descriptionAction: DescriptionActionType = {\n setProps,\n setData,\n getData,\n}\n\ndefineExpose(descriptionAction)\n\nconst updateWindowWidth = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchema()\n syncData()\n expanded.value = effectiveProps.value.collapseOptions?.defaultExpand !== false\n emit('register', descriptionAction)\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateWindowWidth)\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateWindowWidth)\n }\n})\n\nwatch(() => effectiveProps.value.schema, syncSchema, { deep: true })\nwatch(() => effectiveProps.value.data, syncData, { deep: true })\nwatch(() => effectiveProps.value.collapseOptions?.defaultExpand, (value) => {\n if (value !== undefined) expanded.value = value\n})\n</script>\n\n<style>\n.ecp-pro-descriptions {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ecp-pro-descriptions__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.ecp-pro-descriptions__title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ecp-pro-descriptions__title {\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n}\n\n.ecp-pro-descriptions__help,\n.ecp-pro-descriptions__toggle {\n color: #909399;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down {\n margin-left: 4px;\n transition: transform 0.2s ease;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-pro-descriptions__body {\n display: grid;\n border-top: 1px solid #ebeef5;\n border-left: 1px solid #ebeef5;\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body.is-collapsed {\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) {\n border-top: 0;\n border-left: 0;\n gap: 12px 16px;\n}\n\n.ecp-pro-descriptions__item {\n display: flex;\n min-width: 0;\n border-right: 1px solid #ebeef5;\n border-bottom: 1px solid #ebeef5;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__item {\n border-right: 0;\n border-bottom: 0;\n}\n\n.ecp-pro-descriptions__label,\n.ecp-pro-descriptions__content {\n min-width: 0;\n box-sizing: border-box;\n word-break: break-word;\n}\n\n.ecp-pro-descriptions__label {\n flex: 0 0 120px;\n padding: 12px 16px;\n color: #606266;\n background: #fafafa;\n}\n\n.ecp-pro-descriptions__content {\n flex: 1;\n padding: 12px 16px;\n color: #303133;\n background: #fff;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__label {\n flex-basis: auto;\n padding: 0;\n margin-right: 8px;\n background: transparent;\n font-weight: 500;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__content {\n padding: 0;\n background: transparent;\n}\n\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__label,\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__content {\n padding-top: 8px;\n padding-bottom: 8px;\n font-size: 13px;\n}\n\n@media (max-width: 767px) {\n .ecp-pro-descriptions__item {\n flex-direction: column;\n }\n\n .ecp-pro-descriptions__label {\n flex-basis: auto;\n }\n}\n</style>\n","import { ref, unref, watch, type Ref } from 'vue'\nimport type { DescriptionActionType, DescriptionProps } from '../types'\n\nexport type UseDescriptionPropsReactive = DescriptionProps | Ref<DescriptionProps | undefined>\n\nexport type UseDescriptionReturn = [\n (instance: DescriptionActionType) => void,\n DescriptionActionType,\n]\n\nexport function useDescription(props?: UseDescriptionPropsReactive): UseDescriptionReturn {\n const descriptionActionRef = ref<DescriptionActionType | null>(null)\n\n const getDescriptionProps = (): DescriptionProps | undefined =>\n (props ? unref(props as Ref<DescriptionProps | undefined>) : undefined) as DescriptionProps | undefined\n\n const getDescriptionAction = (): DescriptionActionType => {\n const action = unref(descriptionActionRef)\n if (!action) {\n throw new Error('ProDescriptions instance has not been registered')\n }\n return action\n }\n\n const register = (instance: DescriptionActionType) => {\n descriptionActionRef.value = instance\n const descriptionProps = getDescriptionProps()\n if (descriptionProps && Object.keys(descriptionProps).length > 0) {\n instance.setProps(descriptionProps)\n }\n }\n\n if (props) {\n watch(\n () => getDescriptionProps(),\n (descriptionProps) => {\n if (descriptionProps && descriptionActionRef.value) {\n descriptionActionRef.value.setProps(descriptionProps)\n }\n },\n { deep: true }\n )\n }\n\n const descriptionActions: DescriptionActionType = {\n setProps: (descriptionProps) => getDescriptionAction().setProps(descriptionProps),\n setData: (data) => getDescriptionAction().setData(data),\n getData: () => getDescriptionAction().getData(),\n }\n\n return [register, descriptionActions]\n}\n","<template>\n <div\n v-loading=\"effectiveProps.loading\"\n class=\"ecp-collapse-container\"\n :class=\"{\n 'is-expanded': mergedExpanded,\n 'is-ghost': effectiveProps.ghost,\n 'is-header-clickable': canToggleByHeader,\n }\"\n v-bind=\"wrapperProps\"\n >\n <div v-if=\"showHeader\" class=\"ecp-collapse-container__header\" :class=\"effectiveProps.headerClass\" :style=\"effectiveProps.headerStyle\">\n <div class=\"ecp-collapse-container__header-main\" @click=\"handleHeaderClick\">\n <div v-if=\"$slots.title || effectiveProps.title\" class=\"ecp-collapse-container__title-wrap\">\n <slot name=\"title\">\n <span class=\"ecp-collapse-container__title\">{{ effectiveProps.title }}</span>\n </slot>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-collapse-container__help\" />\n </el-tooltip>\n </div>\n </div>\n\n <div v-if=\"$slots.action || resolvedCanExpan\" class=\"ecp-collapse-container__header-extra\" @click.stop>\n <slot name=\"action\" />\n <el-button\n v-if=\"resolvedCanExpan\"\n type=\"text\"\n class=\"ecp-collapse-container__toggle\"\n @click.stop=\"toggleExpand\"\n >\n {{ mergedExpanded ? effectiveProps.collapseButtonText : effectiveProps.expandButtonText }}\n <i class=\"el-icon-arrow-down\" :class=\"{ 'is-expanded': mergedExpanded }\" />\n </el-button>\n </div>\n </div>\n \n <el-collapse-transition>\n <div\n v-show=\"mergedExpanded\"\n class=\"ecp-collapse-container__body\"\n :class=\"effectiveProps.contentClass\"\n :style=\"effectiveProps.contentStyle\"\n >\n <slot />\n </div>\n </el-collapse-transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, useSlots } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\n\ninterface CollapseContainerProps {\n title?: string\n loading?: boolean\n canExpan?: boolean\n canExpand?: boolean\n helpMessage?: string | string[]\n triggerWindowResize?: boolean\n expanded?: boolean\n defaultExpand?: boolean\n ghost?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n wrapperProps?: Record<string, unknown>\n headerClass?: string\n headerStyle?: Record<string, string | number>\n contentClass?: string\n contentStyle?: Record<string, string | number>\n}\n\nconst props = withDefaults(defineProps<CollapseContainerProps>(), {\n loading: false,\n canExpan: true,\n canExpand: undefined,\n triggerWindowResize: true,\n expanded: undefined,\n defaultExpand: true,\n ghost: false,\n expandButtonText: '展开',\n collapseButtonText: '收起',\n wrapperProps: () => ({}),\n headerClass: '',\n headerStyle: () => ({}),\n contentClass: '',\n contentStyle: () => ({}),\n})\n\nconst emit = defineEmits<{\n (e: 'update:expanded', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'collapse'): void\n (e: 'expand'): void\n}>()\n\nconst slots = useSlots()\nconst { mergeSettings } = useComponentSetting()\n\nconst innerExpanded = ref(props.expanded ?? props.defaultExpand)\n\nconst effectiveProps = computed(() => mergeSettings('CollapseContainer', { ...props }) as CollapseContainerProps)\nconst resolvedCanExpan = computed(() => effectiveProps.value.canExpand ?? effectiveProps.value.canExpan ?? true)\nconst isControlled = computed(() => effectiveProps.value.expanded !== undefined)\nconst mergedExpanded = computed(() => isControlled.value ? !!effectiveProps.value.expanded : innerExpanded.value)\nconst showHeader = computed(() => !!slots.title || !!slots.action || !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || resolvedCanExpan.value)\nconst canToggleByHeader = computed(() => resolvedCanExpan.value)\nconst wrapperProps = computed(() => {\n const incoming = effectiveProps.value.wrapperProps ?? {}\n const wrapperClass = incoming.class\n const wrapperStyle = incoming.style\n const rest = { ...incoming }\n delete rest.class\n delete rest.style\n\n return {\n ...rest,\n class: wrapperClass,\n style: wrapperStyle,\n }\n})\n\nconst triggerWindowResize = () => {\n if (!effectiveProps.value.triggerWindowResize || typeof window === 'undefined') return\n window.setTimeout(() => {\n window.dispatchEvent(new Event('resize'))\n }, 220)\n}\n\nconst setExpanded = (value: boolean) => {\n if (!isControlled.value) {\n innerExpanded.value = value\n }\n emit('update:expanded', value)\n emit('change', value)\n if (value) emit('expand')\n else emit('collapse')\n triggerWindowResize()\n}\n\nconst toggleExpand = () => {\n if (!resolvedCanExpan.value) return\n setExpanded(!mergedExpanded.value)\n}\n\nconst handleHeaderClick = () => {\n if (!canToggleByHeader.value) return\n toggleExpand()\n}\n\nwatch(() => props.expanded, (value) => {\n if (value !== undefined) {\n innerExpanded.value = value\n }\n})\n\nwatch(() => props.defaultExpand, (value) => {\n if (props.expanded === undefined) {\n innerExpanded.value = value\n }\n})\n\ndefineExpose({\n setExpanded,\n toggleExpand,\n})\n</script>\n\n<style>\n.ecp-collapse-container {\n background: #fff;\n border-radius: 14px;\n border: 1px solid #e8eef8;\n box-shadow: 0 10px 24px rgba(15, 45, 94, 0.06);\n overflow: hidden;\n}\n\n.ecp-collapse-container.is-ghost {\n border-color: transparent;\n box-shadow: none;\n background: transparent;\n}\n\n.ecp-collapse-container__header {\n min-height: 56px;\n padding: 0 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n border-bottom: 1px solid #eef3fb;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__header {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container__header-main {\n min-width: 0;\n flex: 1;\n display: flex;\n align-items: center;\n}\n\n.ecp-collapse-container__title-wrap {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ecp-collapse-container__title {\n color: #1f2d3d;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ecp-collapse-container__help {\n color: #91a3b7;\n font-size: 14px;\n}\n\n.ecp-collapse-container__header-extra {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.ecp-collapse-container__toggle {\n padding: 0;\n color: #2f6fd3;\n}\n\n.ecp-collapse-container__toggle i {\n margin-left: 6px;\n transition: transform 0.2s ease;\n}\n\n.ecp-collapse-container__toggle i.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-collapse-container__body {\n padding: 20px;\n box-sizing: border-box;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__body {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container.is-header-clickable .ecp-collapse-container__header-main {\n cursor: pointer;\n}\n\n@media (max-width: 768px) {\n .ecp-collapse-container__header {\n padding: 14px 16px;\n align-items: flex-start;\n flex-direction: column;\n }\n\n .ecp-collapse-container__header-extra {\n width: 100%;\n justify-content: space-between;\n }\n\n .ecp-collapse-container__body {\n padding: 16px;\n }\n}\n</style>\n","import { computed, ref } from 'vue'\nimport type { Ref, ComputedRef } from 'vue'\nimport type {\n ProTableFormActionType,\n ProTableFormColumn,\n ProTableFormColumnChild,\n ProTableFormProps,\n FormInstance,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ProTableFormOptions {\n props: Readonly<ProTableFormProps>\n emit: (event: 'update:modelValue', value: Record<string, unknown>[]) => void\n /** 新增行事件 */\n emitAddRow?: () => void\n /** 删除行事件 */\n emitRemoveRow?: (index: number) => void\n}\n\n/** useProTableForm 返回 */\nexport interface UseProTableFormReturn {\n // --- 注册 ---\n register: (formAction: ProTableFormActionType) => void\n\n // --- el-form 绑定 ---\n currentModelValue: ComputedRef<Record<string, unknown>[]>\n formModelRef: ComputedRef<{ rows: Record<string, unknown>[] }>\n mergedRules: ComputedRef<Record<string, unknown[]>>\n\n // --- el-table 绑定 ---\n tableRows: ComputedRef<TableRow[]>\n rowKeyFn: (row: TableRow) => string\n spanMethodAdapter: (params: {\n row: TableRow\n column: { property: string; label: string }\n rowIndex: number\n columnIndex: number\n }) => [number, number] | { rowspan: number; colspan: number } | void\n allLeafColumnKeys: ComputedRef<string[]>\n\n // --- ref ---\n formRef: Ref<FormInstance | null>\n /** 获取 el-form 实例 */\n getFormRef: () => FormInstance | null\n\n // --- 单元格渲染辅助 ---\n cellComponent: (col: ProTableFormColumn | ProTableFormColumnChild) => unknown\n cellBind: (col: ProTableFormColumn | ProTableFormColumnChild) => Record<string, unknown>\n slotUpdateHandler: (slotProps: { row: TableRow }, col: ProTableFormColumn, childKey?: string) => (v: unknown) => void\n getCellProp: (tableRow: TableRow, col: ProTableFormColumn, childKey?: string) => string\n\n // --- 单元格值读写 ---\n getCellValue: (row: TableRow, col: ProTableFormColumn, childKey?: string) => unknown\n setCellValue: (tableRow: TableRow, col: ProTableFormColumn, childKey: string | undefined, val: unknown) => void\n\n // --- 行操作 ---\n handleAddRow: () => void\n handleRemoveRow: (index: number) => void\n\n // --- el-form 实例方法 ---\n validate: () => Promise<boolean>\n clearValidate: (propsArg?: string | string[]) => void\n}\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\ntype TableRow = { _index: number }\n\nexport function useProTableForm(options: ProTableFormOptions): UseProTableFormReturn {\n const { props, emit, emitAddRow, emitRemoveRow } = options\n\n // ---------------------------------------------------------------------------\n // 注册机制(与 useForm 一致)\n // ---------------------------------------------------------------------------\n\n const formActionRef = ref<ProTableFormActionType | null>(null)\n\n const register = (action: ProTableFormActionType) => {\n formActionRef.value = action\n }\n\n // ---------------------------------------------------------------------------\n // el-form ref\n // ---------------------------------------------------------------------------\n\n const formRef = ref<FormInstance | null>(null)\n\n // ---------------------------------------------------------------------------\n // 受控 / 非受控双轨(与 ProForm 一致)\n // ---------------------------------------------------------------------------\n\n const controlledModelValue = computed(() => props.modelValue)\n const isControlled = computed(() => controlledModelValue.value !== undefined)\n const currentModelValue = computed<Record<string, unknown>[]>(() => {\n return isControlled.value ? (controlledModelValue.value ?? []) : []\n })\n\n /**\n * 传给 el-form :model 的包装对象。\n * el-form 要求 model 为 Object,直接传入数组会触发 Element UI 的 prop type 校验报错。\n * 这里包装为 { rows: [...] },el-form-item 的 prop 路径相应改为 rows.${index}.${key}。\n */\n const formModelRef = computed(() => ({ rows: currentModelValue.value }))\n\n // ---------------------------------------------------------------------------\n // Table rows\n // ---------------------------------------------------------------------------\n\n const tableRows = computed<TableRow[]>(() => {\n return currentModelValue.value.map((item, i) => ({ ...item, _index: i }))\n })\n\n function rowKeyFn(row: TableRow) {\n return `r-${row._index}`\n }\n\n // ---------------------------------------------------------------------------\n // 工具函数\n // ---------------------------------------------------------------------------\n\n function cloneRows(): Record<string, unknown>[] {\n return JSON.parse(JSON.stringify(currentModelValue.value)) as Record<string, unknown>[]\n }\n\n function emptyRow(): Record<string, unknown> {\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n if (c.children && c.children.length > 0) {\n for (const child of c.children) {\n o[child.key] = ''\n }\n } else {\n o[c.key] = ''\n }\n }\n return o\n }\n\n // ---------------------------------------------------------------------------\n // Value getters / setters\n // ---------------------------------------------------------------------------\n\n function emitNext(next: Record<string, unknown>[]) {\n emit('update:modelValue', next)\n }\n\n function getCell(row: TableRow): Record<string, unknown> {\n return currentModelValue.value[row._index] ?? {}\n }\n\n function getCellValue(row: TableRow, col: ProTableFormColumn, childKey?: string): unknown {\n if (childKey) {\n const colVal = getCell(row)[col.key]\n // Support both nested ({ economy: { costReduction: '' } }) and flat ({ costReduction: '' }) models\n if (colVal && typeof colVal === 'object') {\n return (colVal as Record<string, unknown>)[childKey] ?? ''\n }\n return getCell(row)[childKey] ?? ''\n }\n return getCell(row)[col.key] ?? ''\n }\n\n function setCellValue(row: TableRow, col: ProTableFormColumn, childKey: string | undefined, val: unknown) {\n const next = cloneRows()\n const target = { ...next[row._index] }\n if (childKey) {\n const colVal = target[col.key]\n // Support both nested and flat models for grouped columns\n if (colVal && typeof colVal === 'object') {\n const nested = { ...(colVal as Record<string, unknown>) }\n nested[childKey] = val\n target[col.key] = nested\n } else {\n target[childKey] = val\n }\n } else {\n target[col.key] = val\n }\n next[row._index] = target\n emitNext(next)\n }\n\n // ---------------------------------------------------------------------------\n // Row operations\n // ---------------------------------------------------------------------------\n\n function handleAddRow() {\n emitAddRow?.()\n const next = cloneRows()\n next.push(emptyRow())\n emitNext(next)\n }\n\n function handleRemoveRow(index: number) {\n if (!canDeleteRow.value) return\n emitRemoveRow?.(index)\n const next = cloneRows()\n next.splice(index, 1)\n emitNext(next)\n }\n\n const canDeleteRow = computed(() => {\n return currentModelValue.value.length > (props.minRows ?? 0)\n })\n\n // ---------------------------------------------------------------------------\n // Prop paths\n // ---------------------------------------------------------------------------\n\n function getCellProp(tableRow: TableRow, col: ProTableFormColumn, childKey?: string): string {\n // Use the leaf key directly so the prop path matches the flat data model\n // (e.g. rows.0.costReduction, not rows.0.economy.costReduction)\n return childKey\n ? `rows.${tableRow._index}.${childKey}`\n : `rows.${tableRow._index}.${col.key}`\n }\n\n // ---------------------------------------------------------------------------\n // Validation rules\n // ---------------------------------------------------------------------------\n\n // Stable rules object — we mutate it in place and only replace the reference\n // when the top-level keys or their array identities actually change.\n const rulesResult: Record<string, unknown[]> = {}\n\n /** Signature of a rules array (compares content, not function identity) */\n function rulesSig(arr: unknown[]): string {\n return JSON.stringify(arr.map((r) => {\n if (r == null || typeof r !== 'object') return String(r)\n const o = r as Record<string, unknown>\n return {\n required: o.required,\n type: o.type,\n message: o.message,\n pattern: String(o.pattern ?? ''),\n min: o.min,\n max: o.max,\n trigger: Array.isArray(o.trigger) ? [...o.trigger] : o.trigger,\n hasValidator: typeof o.validator === 'function',\n hasAsyncValidator: typeof o.asyncValidator === 'function',\n }\n }))\n }\n\n const mergedRules = computed(() => {\n const req = (title: string): unknown[] => [\n { required: true, message: `请输入${title}`, trigger: 'change' },\n ]\n\n let anyChange = false\n\n // Build the new rules snapshot\n const newSnapshot: Record<string, unknown[]> = {}\n\n currentModelValue.value.forEach((row, i) => {\n for (const col of props.columns) {\n const process = (key: string, colOrChild: ProTableFormColumn | ProTableFormColumnChild, value: unknown) => {\n const path = `rows.${i}.${key}`\n let rules: unknown[] = []\n\n if ('dynamicRules' in colOrChild && colOrChild.dynamicRules !== undefined) {\n rules = typeof colOrChild.dynamicRules === 'function'\n ? colOrChild.dynamicRules({ row, value, column: colOrChild as never }) as unknown[]\n : (colOrChild.dynamicRules as unknown[])\n } else if ('rules' in colOrChild && colOrChild.rules !== undefined) {\n rules = colOrChild.rules as unknown[]\n } else if (colOrChild.required) {\n rules = req(colOrChild.title)\n }\n\n // Only create a new array reference if content actually changed\n const sig = rulesSig(rules)\n const prevArr = rulesResult[path]\n const prevSig = (prevArr as unknown as { __sig?: string } & unknown[])?.__sig\n const arr = (prevSig === sig && prevArr) ? prevArr : rules\n ;(arr as unknown as { __sig: string } & unknown[]).__sig = sig\n newSnapshot[path] = arr\n if (arr !== prevArr) anyChange = true\n }\n\n if (col.children && col.children.length > 0) {\n for (const child of col.children) {\n const value = getCellValue({ _index: i } as TableRow, col, child.key)\n process(child.key, child, value)\n }\n } else {\n const value = getCellValue({ _index: i } as TableRow, col)\n process(col.key, col, value)\n }\n }\n })\n\n // Check props.rules keys\n const extraRules = props.rules || {}\n for (const key of Object.keys(extraRules)) {\n const arr = extraRules[key] as unknown[]\n newSnapshot[key] = arr\n if (arr !== rulesResult[key]) anyChange = true\n }\n\n // Only replace rulesResult when something actually changed\n if (anyChange || Object.keys(newSnapshot).length !== Object.keys(rulesResult).length) {\n Object.keys(rulesResult).forEach((k) => { delete rulesResult[k] })\n Object.assign(rulesResult, newSnapshot)\n }\n\n return rulesResult as Record<string, unknown[]>\n })\n\n // ---------------------------------------------------------------------------\n // el-form 实例方法\n // ---------------------------------------------------------------------------\n\n function validate(): Promise<boolean> {\n return new Promise((resolve) => {\n const f = formRef.value\n if (!f || typeof f.validate !== 'function') {\n resolve(true)\n return\n }\n f.validate((valid: boolean) => resolve(valid))\n })\n }\n\n function clearValidate(propsArg?: string | string[]) {\n formRef.value?.clearValidate?.(propsArg)\n }\n\n // ---------------------------------------------------------------------------\n // Cell rendering helpers\n // ---------------------------------------------------------------------------\n\n function cellComponent(col: ProTableFormColumn | ProTableFormColumnChild): unknown {\n return col.component === 'formatted-number' ? 'ecp-formatted-number-input' : 'el-input'\n }\n\n function cellBind(col: ProTableFormColumn | ProTableFormColumnChild): Record<string, unknown> {\n const cp = col.componentProps || {}\n // Separate event handlers (onXxx) from regular props, so they don't get v-bound\n // as fake attrs and bypass the @update flow. Match Vue camelCase convention.\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(cp)) {\n if (/^on[A-Za-z]/.test(key) && typeof val === 'function') continue\n result[key] = val\n }\n if (col.component === 'formatted-number') {\n return { integerDigits: 5, decimalPlaces: 6, rounding: 'round', inputLimit: true, ...result }\n }\n return result\n }\n\n function slotUpdateHandler(slotProps: { row: TableRow }, col: ProTableFormColumn, childKey?: string) {\n return (v: unknown) => setCellValue(slotProps.row, col, childKey, v)\n }\n\n // ---------------------------------------------------------------------------\n // Span method\n // ---------------------------------------------------------------------------\n\n const allLeafColumnKeys = computed<string[]>(() => {\n const keys: string[] = []\n for (const col of props.columns) {\n if (col.children && col.children.length > 0) {\n for (const child of col.children) {\n keys.push(`${col.key}.${child.key}`)\n }\n } else if (!col.hideInTable) {\n keys.push(col.key)\n }\n }\n return keys\n })\n\n const spanMethodAdapter = ({\n rowIndex,\n column,\n columnIndex,\n row,\n }: {\n row: TableRow\n column: { property: string; label: string }\n rowIndex: number\n columnIndex: number\n }): [number, number] | { rowspan: number; colspan: number } | void => {\n if (!props.spanMethod) return\n const colKey = allLeafColumnKeys.value[columnIndex]\n return props.spanMethod({\n row,\n column: { ...column, property: colKey ?? column.property },\n rowIndex,\n columnIndex,\n })\n }\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n // 注册\n register,\n\n // el-form 绑定(formModelRef 包装了数组,满足 el-form :model Object 类型要求)\n formModelRef,\n currentModelValue,\n mergedRules,\n\n // el-table 绑定\n tableRows,\n rowKeyFn,\n spanMethodAdapter,\n allLeafColumnKeys,\n\n // ref\n formRef,\n getFormRef: () => formRef.value,\n\n // 单元格渲染\n cellComponent,\n cellBind,\n slotUpdateHandler,\n getCellProp,\n\n // 单元格值读写\n getCellValue,\n setCellValue,\n\n // 行操作\n handleAddRow,\n handleRemoveRow,\n\n // el-form 实例方法\n validate,\n clearValidate,\n }\n}\n","<template>\n <!-- select -->\n <el-select\n v-if=\"col.component === 'select'\"\n :value=\"value\"\n v-bind=\"cellBind\"\n :placeholder=\"placeholder\"\n v-on=\"mergedEvents('change', 'clear')\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <!-- checkbox-group -->\n <el-checkbox-group\n v-else-if=\"col.component === 'checkbox'\"\n :value=\"value\"\n v-bind=\"cellBind\"\n v-on=\"mergedEvents('change')\"\n >\n <el-checkbox\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >{{ opt.label }}</el-checkbox>\n </el-checkbox-group>\n <!-- radio-group -->\n <el-radio-group\n v-else-if=\"col.component === 'radio'\"\n :value=\"value\"\n v-bind=\"cellBind\"\n v-on=\"mergedEvents('change')\"\n >\n <el-radio\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >{{ opt.label }}</el-radio>\n </el-radio-group>\n <!-- date-range -->\n <el-date-picker\n v-else-if=\"col.component === 'date-range'\"\n :value=\"value\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n v-bind=\"cellBind\"\n :placeholder=\"placeholder\"\n v-on=\"mergedEvents('change')\"\n />\n <!-- api-select -->\n <ApiSelect\n v-else-if=\"col.component === 'api-select'\"\n :value=\"value\"\n v-bind=\"cellBind\"\n :placeholder=\"placeholder\"\n v-on=\"mergedEvents('change')\"\n />\n <!-- tree-select -->\n <TreeSelect\n v-else-if=\"col.component === 'tree-select'\"\n :value=\"value\"\n v-bind=\"cellBind\"\n :placeholder=\"placeholder\"\n v-on=\"mergedEvents('change')\"\n />\n <!-- 其余 el-* 组件(input / input-number / formatted-number / date-picker / switch / cascader) -->\n <component\n v-else\n :is=\"cellComp\"\n :value=\"value\"\n v-bind=\"cellBind\"\n :placeholder=\"placeholder\"\n v-on=\"mergedEvents('input')\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport ApiSelect from '../ProForm/ApiSelect.vue'\nimport TreeSelect from '../ProForm/TreeSelect.vue'\nimport FormattedNumberInput from '../ProForm/FormattedNumberInput.vue'\nimport type { ProTableFormColumn, ProTableFormColumnChild, ProTableFormActionType } from '../types'\n\nconst props = defineProps<{\n col: ProTableFormColumn | ProTableFormColumnChild\n value: unknown\n /** 当前行数据,用于 dynamicComponentProps 动态求值 */\n row?: Record<string, unknown>\n size?: 'medium' | 'small' | 'large'\n placeholder?: string\n /** ProTableForm 操作实例 */\n action?: ProTableFormActionType\n}>()\n\nconst emit = defineEmits<{ (e: 'update', v: unknown): void }>()\n\nconst options = computed<Array<{ label: string; value: unknown }>>(() => {\n const staticProps = typeof props.col.componentProps === 'function'\n ? {} : (props.col.componentProps ?? {})\n const opts = staticProps.options\n return Array.isArray(opts) ? opts : []\n})\n\nconst cellComp = computed(() => {\n const map: Record<string, string> = {\n 'input': 'el-input',\n 'input-number': 'el-input-number',\n 'date-picker': 'el-date-picker',\n 'switch': 'el-switch',\n 'cascader': 'el-cascader',\n }\n if (props.col.component === 'formatted-number') return FormattedNumberInput\n return map[props.col.component as string] || 'el-input'\n})\n\n/** All v-bind props, with onXxx event handlers stripped out */\nconst cellBind = computed<Record<string, unknown>>(() => {\n let staticProps: Record<string, unknown> = {}\n let dynamicProps: Record<string, unknown> = {}\n\n const cp = props.col.componentProps\n if (typeof cp === 'function') {\n dynamicProps = cp({ row: props.row ?? {}, value: props.value, column: props.col as any, action: props.action as any })\n } else {\n staticProps = cp ?? {}\n }\n\n const base: Record<string, unknown> = { size: props.size }\n for (const [key, val] of Object.entries({ ...staticProps, ...dynamicProps })) {\n if (/^on[A-Za-z]/.test(key) && typeof val === 'function') continue\n base[key] = val\n }\n if (props.col.component === 'formatted-number') {\n return { integerDigits: 5, decimalPlaces: 6, rounding: 'round', inputLimit: true, ...base }\n }\n if (['select', 'checkbox', 'radio'].includes(props.col.component as string)) {\n const { options: _opts, ...rest } = base\n void _opts\n return rest\n }\n return base\n})\n\n/**\n * Event handlers from componentProps (onXxx → xxx).\n * componentProps 中的 onChange/onInput 等会经过 v-on 绑定,\n * 不再通过 v-bind 直接作为 DOM 属性展开,避免触发 el-form 整行重校验。\n */\nconst cellEvents = computed<Record<string, (...args: unknown[]) => unknown>>(() => {\n let staticProps: Record<string, unknown> = {}\n let dynamicProps: Record<string, unknown> = {}\n\n const cp = props.col.componentProps\n if (typeof cp === 'function') {\n dynamicProps = cp({ row: props.row ?? {}, value: props.value, column: props.col as any, action: props.action as any })\n } else {\n staticProps = cp ?? {}\n }\n\n const events: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, val] of Object.entries({ ...staticProps, ...dynamicProps })) {\n if (/^on[A-Za-z]/.test(key) && typeof val === 'function') {\n const eventName = key[2].toLowerCase() + key.slice(3)\n events[eventName] = val as (...args: unknown[]) => unknown\n }\n }\n return events\n})\n\n/**\n * Merges cellEvents (from componentProps) with the internal emit bridge.\n * componentProps listeners fire first, then emit('update') updates the row value.\n * clear 事件特殊处理:用户 handler 先执行,再 emit(undefined) 清空值。\n */\nconst mergedEvents = (...internalEvents: Array<'input' | 'change' | 'clear'>) => {\n const handlers: Record<string, (...args: unknown[]) => void> = {}\n for (const internalEvent of internalEvents) {\n const userHandler = cellEvents.value[internalEvent]\n handlers[internalEvent] = (arg: unknown) => {\n if (userHandler) userHandler(arg)\n emit('update', internalEvent === 'clear' ? undefined : arg)\n }\n }\n return handlers\n}\n</script>\n","<template>\n <div class=\"ecp-pro-table-form\" v-bind=\"$attrs\">\n <el-form\n ref=\"formRef\"\n :model=\"formModelRef\"\n :rules=\"mergedRules\"\n :label-width=\"labelWidth\"\n :size=\"formSize\"\n :label-position=\"labelPosition\"\n :disabled=\"disabled\"\n v-bind=\"formProps\"\n class=\"ecp-pro-table-form__form\"\n >\n <el-table\n ref=\"tableRef\"\n :data=\"tableRows\"\n :border=\"bordered\"\n :stripe=\"stripe\"\n :size=\"size\"\n :max-height=\"maxHeight\"\n :height=\"height\"\n :row-key=\"rowKeyFn\"\n :row-class-name=\"rowClassName\"\n :default-expand-all=\"defaultExpandAll\"\n :span-method=\"spanMethodAdapter\"\n header-cell-class-name=\"ecp-pro-table-form__header-cell\"\n v-bind=\"tableProps\"\n class=\"ecp-pro-table-form__table\"\n @row-click=\"handleTableRowClick\"\n @row-dblclick=\"handleTableRowDblclick\"\n @sort-change=\"handleTableSortChange\"\n @expand-change=\"handleTableExpandChange\"\n >\n <template v-for=\"col in flatColumns\">\n <!-- 分组列:有 children -->\n <el-table-column\n v-if=\"col.children && col.children.length > 0\"\n :key=\"'col-' + col._key\"\n :label=\"col.title\"\n :min-width=\"col.minWidth || col.width || 120\"\n :width=\"col.width\"\n :align=\"col.align || 'center'\"\n :header-align=\"col.headerAlign\"\n :fixed=\"col.fixed\"\n :cell-style=\"col.cellStyle\"\n :header-cell-style=\"col.headerCellStyle\"\n :cell-class-name=\"col.cellClassName\"\n :header-cell-class-name=\"col.headerCellClassName\"\n :sortable=\"col.sortable\"\n :resizable=\"col.resizable !== false\"\n >\n <template #header>\n <slot :name=\"`header-${col.key}`\" :column=\"col\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"col.required\" class=\"ecp-pro-table-form__req\">*</span>{{ col.title }}\n </span>\n </slot>\n </template>\n <template v-for=\"child in col.children\">\n <el-table-column\n v-if=\"!child.hideInTable\"\n :key=\"'col-' + col.key + '-' + child.key\"\n :label=\"child.title\"\n :min-width=\"child.minWidth || child.width || 120\"\n :width=\"child.width\"\n :align=\"child.align || 'center'\"\n :header-align=\"child.headerAlign\"\n :fixed=\"child.fixed\"\n :cell-style=\"child.cellStyle\"\n :header-cell-style=\"child.headerCellStyle\"\n :cell-class-name=\"child.cellClassName\"\n :header-cell-class-name=\"child.headerCellClassName\"\n :sortable=\"child.sortable\"\n :resizable=\"child.resizable !== false\"\n >\n <template #header>\n <slot :name=\"`header-${child.key}`\" :column=\"child\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"child.required\" class=\"ecp-pro-table-form__req\">*</span>{{ child.title }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <!-- 渲染函数 -->\n <template v-if=\"child.render\">\n <el-form-item\n :prop=\"getCellProp(slotProps.row, col, child.key)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col, child.key)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <template v-if=\"getRender(child, slotProps.row, col, child.key).isText\">\n <span>{{ getRender(child, slotProps.row, col, child.key).value }}</span>\n </template>\n <template v-else>\n <RenderCell :render-fn=\"child.render\" :render-params=\"{ row: slotProps.row, col, childKey: child.key }\" />\n </template>\n </el-form-item>\n </template>\n <!-- 插槽列 -->\n <template v-else-if=\"child.component === 'slot' && child.slotName\">\n <el-form-item\n :prop=\"getCellProp(slotProps.row, col, child.key)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col, child.key)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"`cell-${child.slotName}`\"\n :column=\"child\"\n :row=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"getCellValue(slotProps.row, col, child.key)\"\n :update-value=\"slotUpdateHandler(slotProps, col, child.key)\"\n />\n </el-form-item>\n </template>\n <!-- 内置组件 -->\n <el-form-item\n v-else\n :prop=\"getCellProp(slotProps.row, col, child.key)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col, child.key)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <CellEditor\n :col=\"child\"\n :value=\"getCellValue(slotProps.row, col, child.key)\"\n :row=\"slotProps.row\"\n :size=\"size\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n :action=\"action\"\n @update=\"setCellValue(slotProps.row, col, child.key, $event)\"\n />\n </el-form-item>\n </template>\n </el-table-column>\n </template>\n </el-table-column>\n\n <!-- 叶子列:无 children -->\n <el-table-column\n v-else-if=\"!col.hideInTable\"\n :key=\"'leaf-' + col._key\"\n :label=\"col.title\"\n :min-width=\"col.minWidth || col.width || 120\"\n :width=\"col.width\"\n :align=\"col.align || 'center'\"\n :header-align=\"col.headerAlign\"\n :fixed=\"col.fixed\"\n :cell-style=\"col.cellStyle\"\n :header-cell-style=\"col.headerCellStyle\"\n :cell-class-name=\"col.cellClassName\"\n :header-cell-class-name=\"col.headerCellClassName\"\n :sortable=\"col.sortable\"\n :resizable=\"col.resizable !== false\"\n >\n <template #header>\n <slot :name=\"`header-${col.key}`\" :column=\"col\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"col.required\" class=\"ecp-pro-table-form__req\">*</span>{{ col.title }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <!-- 渲染函数 -->\n <template v-if=\"col.render\">\n <el-form-item\n :prop=\"getCellProp(slotProps.row, col)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <template v-if=\"getRender(col, slotProps.row, col).isText\">\n <span>{{ getRender(col, slotProps.row, col).value }}</span>\n </template>\n <template v-else>\n <RenderCell :render-fn=\"col.render\" :render-params=\"{ row: slotProps.row, col }\" />\n </template>\n </el-form-item>\n </template>\n <!-- 插槽列 -->\n <template v-else-if=\"col.component === 'slot' && col.slotName\">\n <el-form-item\n :prop=\"getCellProp(slotProps.row, col)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"`cell-${col.slotName}`\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n </template>\n <!-- 内置组件 -->\n <el-form-item\n v-else\n :prop=\"getCellProp(slotProps.row, col)\"\n :rules=\"mergedRules[getCellProp(slotProps.row, col)]\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <CellEditor\n :col=\"col\"\n :value=\"getCellValue(slotProps.row, col)\"\n :row=\"slotProps.row\"\n :size=\"size\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n :action=\"action\"\n @update=\"setCellValue(slotProps.row, col, undefined, $event)\"\n />\n </el-form-item>\n </template>\n </el-table-column>\n </template>\n\n <!-- 操作列 -->\n <slot name=\"action\" :add-row=\"handleAddRow\" :remove-row=\"handleRemoveRow\" />\n </el-table>\n </el-form>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n name: 'ProTableForm',\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useProTableForm } from './useProTableForm'\nimport { defineComponent } from 'vue'\nimport type { VNode } from 'vue'\nimport type {\n ProTableFormColumn,\n ProTableFormColumnChild,\n ProTableFormColumnRender,\n} from '../types'\nimport CellEditor from './CellEditor.vue'\n\n/** 与 useProTableForm 内部 tableRows 元素类型对齐 */\ntype TableRow = { _index: number }\n\n/** RenderCell:接收 render 函数,在 td 内渲染 VNode,完全脱离 el-table 插槽作用域 */\nconst RenderCell = defineComponent({\n name: 'RenderCell',\n props: {\n renderFn: { type: Function as unknown as () => ProTableFormColumnRender, required: true },\n renderParams: { type: Object as () => Record<string, unknown>, required: true },\n },\n setup(props) {\n return () => {\n const vnode = props.renderFn(props.renderParams as Parameters<ProTableFormColumnRender>[0])\n return Array.isArray(vnode) ? vnode : (vnode as VNode)\n }\n },\n})\n\n/** 单次执行 render,返回 { isText, value } */\nfunction execRenderOnce(\n child: ProTableFormColumn | ProTableFormColumnChild,\n row: Record<string, unknown>,\n col: ProTableFormColumn,\n colKey?: string\n): { isText: boolean; value: ReturnType<NonNullable<typeof child.render>> } {\n const value = colKey !== undefined\n ? getCellValue(row as TableRow, col, colKey)\n : getCellValue(row as TableRow, col)\n const result = child.render!({ row, value, column: child })\n const isText = isPrimitive(result)\n return { isText, value: result }\n}\n\n/** 行→列key→渲染结果的缓存,避免同一 render 在模板中被多次调用 */\nconst _renderCache = new WeakMap<object, Map<string, { isText: boolean; value: unknown }>>()\n\nfunction getRender(\n child: ProTableFormColumn | ProTableFormColumnChild,\n row: Record<string, unknown>,\n col: ProTableFormColumn,\n colKey?: string\n): { isText: boolean; value: unknown } {\n if (!_renderCache.has(row as object)) _renderCache.set(row as object, new Map())\n const cache = _renderCache.get(row as object)!\n const cacheKey = col.key + (colKey ? '.' + colKey : '')\n if (!cache.has(cacheKey)) cache.set(cacheKey, execRenderOnce(child, row, col, colKey))\n return cache.get(cacheKey)!\n}\n\n/** 是否为基础类型(string / number / boolean / null / undefined) */\nfunction isPrimitive(val: unknown): val is string | number | boolean | null | undefined {\n return val === null || typeof val in { string: 1, number: 1, boolean: 1, bigint: 1, symbol: 1 }\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: Record<string, unknown>[]\n columns: ProTableFormColumn[]\n metricPlaceholder?: string\n minRows?: number\n rules?: Record<string, unknown>\n labelWidth?: string\n bordered?: boolean\n spanMethod?: (params: {\n row: Record<string, unknown>\n column: { property: string; label: string }\n rowIndex: number\n columnIndex: number\n }) => [number, number] | { rowspan: number; colspan: number } | void\n // ─── el-form 配置 ────────────────────────────────────────────────\n formSize?: 'medium' | 'small' | 'large'\n labelPosition?: 'left' | 'right' | 'top'\n disabled?: boolean\n // ─── el-table 配置 ────────────────────────────────────────────────\n stripe?: boolean\n size?: 'medium' | 'small' | 'large'\n maxHeight?: number | string\n height?: number | string\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n expandRowKeys?: (string | number)[]\n defaultExpandAll?: boolean\n onRowClick?: (row: Record<string, unknown>, event: Event) => void\n onRowDblclick?: (row: Record<string, unknown>, event: Event) => void\n onSortChange?: (sortInfo: { prop: string; order: string }) => void\n onExpandChange?: (row: Record<string, unknown>, expanded: boolean) => void\n tableProps?: Record<string, unknown>\n formProps?: Record<string, unknown>\n }>(),\n {\n modelValue: () => [],\n metricPlaceholder: '请输入',\n minRows: 0,\n labelWidth: '0',\n bordered: true,\n stripe: false,\n size: 'medium',\n defaultExpandAll: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: Record<string, unknown>[]): void\n (e: 'add-row'): void\n (e: 'remove-row', index: number): void\n (e: 'register', action: Record<string, unknown>): void\n}>()\n\nconst {\n formModelRef,\n currentModelValue,\n mergedRules,\n tableRows,\n rowKeyFn,\n spanMethodAdapter,\n formRef,\n slotUpdateHandler,\n getCellProp,\n getCellValue,\n setCellValue,\n handleAddRow,\n handleRemoveRow,\n validate,\n clearValidate,\n} = useProTableForm({\n props,\n emit,\n emitAddRow: () => emit('add-row'),\n emitRemoveRow: (index) => emit('remove-row', index),\n})\n\nvoid formRef\n\n/** 表格行点击 */\nfunction handleTableRowClick(row: TableRow, _column: unknown, event: Event) {\n props.onRowClick?.(row as Record<string, unknown>, event)\n}\n/** 表格行双击 */\nfunction handleTableRowDblclick(row: TableRow, _column: unknown, event: Event) {\n props.onRowDblclick?.(row as Record<string, unknown>, event)\n}\n/** 表格排序变化 */\nfunction handleTableSortChange(sortInfo: { prop: string; order: string }) {\n props.onSortChange?.(sortInfo)\n}\n/** 表格展开变化 */\nfunction handleTableExpandChange(row: TableRow, expanded: boolean) {\n props.onExpandChange?.(row as Record<string, unknown>, expanded)\n}\n\n/** 将 columns 扁平化,保留 _key 用于 template v-for key */\nconst flatColumns = computed<(ProTableFormColumn & { _key: string })[]>(() => {\n return props.columns.map((col, i) => ({\n ...col,\n _key: col.key || `__col-${i}`,\n }))\n})\n\nconst tableRef = ref<{ clearSelection: () => void } | null>(null)\n\nconst action = {\n validate,\n clearValidate,\n addRow: handleAddRow,\n removeRow: handleRemoveRow,\n getRows: () => [...currentModelValue.value],\n getRowCount: () => currentModelValue.value.length,\n getTable: () => tableRef.value,\n getModelValue: () => [...currentModelValue.value],\n setModelValue: (val: Record<string, unknown>[]) => emit('update:modelValue', val),\n getFormRef: () => formRef.value,\n}\n\ndefineExpose(action)\nemit('register', action)\n</script>\n\n<style>\n.ecp-pro-table-form__form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n.ecp-pro-table-form__cell-item {\n width: 100%;\n}\n.ecp-pro-table-form__cell-item :deep(.el-form-item__content) {\n margin-left: 0 !important;\n line-height: normal;\n}\n/* .ecp-pro-table-form__cell-item :deep(.el-form-item__error) {\n display: none;\n} */\n.ecp-pro-table-form__req {\n color: #f56c6c;\n margin-right: 2px;\n}\n.ecp-pro-table-form__th-text {\n font-weight: 500;\n color: #606266;\n}\n</style>\n\n<style>\n.ecp-pro-table-form .ecp-pro-table-form__header-cell {\n background: #f5f7fa !important;\n}\n.ecp-pro-table-form__cell-item .el-form-item__error {\n position: relative;\n}\n</style>\n","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions, FormattedNumberInput } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport CollapseContainer from './CollapseContainer'\nimport { ProTableForm } from './ProTableForm'\nimport { useForm } from './ProForm/useForm'\nimport { useProTableForm } from './ProTableForm/useProTableForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, FormattedNumberInput, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\nexport { CollapseContainer }\nexport { ProTableForm, useProTableForm }\nexport type {\n ProTableFormColumn,\n ProTableFormColumnChild,\n ProTableFormProps,\n ProTableFormBuiltInComponent,\n ProTableFormActionType,\n} from './types'\nexport { useComponentSetting }\nexport type { UseComponentSettingReturn } from './useComponentSetting'\nexport type { UseProTableReturn, UseProTablePropsReactive } from './ProTable/useProTable'\nexport type { UseDescriptionReturn, UseDescriptionPropsReactive } from './ProDescriptions/useDescription'\nexport * from './ProTable/types'\nexport * from './types'\nexport * from './utils/formattedNumber'\n\nconst components = [\n { name: 'ProTable', component: ProTable },\n { name: 'TableAction', component: TableAction },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions },\n { name: 'FormattedNumberInput', component: FormattedNumberInput },\n { name: 'ProDescriptions', component: ProDescriptions },\n { name: 'CollapseContainer', component: CollapseContainer },\n { name: 'ProTableForm', component: ProTableForm },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n ProTable,\n ProForm,\n ProDescriptions,\n CollapseContainer,\n TableAction,\n FormattedNumberInput,\n ProTableForm,\n}\n"],"names":["componentSettings","reactive","deepMerge","target","source","key","targetValue","sourceValue","isPlainObject","value","proto","useComponentSetting","componentName","config","current","props","globalSetting","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","$scopedSlots","useSlots","slots","tableRef","ref","tableWrapRef","containerWidth","loading","localFullData","innerData","computed","data","showPagination","page","pageSize","pagination","start","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","defaultPagination","paginationConfig","showTitleBar","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","flatColumnsMap","map","flatten","cols","allFlatColumns","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","spanMethodAdapter","param","original","available","result","minPx","maxPx","basePx","selectableRows","getDisabled","row","hasSelectableRows","isAllCurrentPageSelected","isIndeterminate","selectedCount","isRowSelected","getCheckboxDisabled","_c","getRadioDisabled","emitSelectionChange","keys","emit","handleCheckboxChange","checked","handleRadioSelect","handleSelectAll","keySet","toAdd","currentPageKeys","fetchData","opt","fs","pageField","sizeField","listField","totalField","params","processedParams","res","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","tableAction","keyList","fromProps","ordered","k","info","rows","index","fullIndex","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","assignIds","parentKey","i","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","hasTooltipContent","getTooltipContent","item","normalizeTooltipConfig","tooltip","fallbackValue","normalized","normalizeTooltip","getButtonType","action","filterVisible","ifShow","visibleActions","visibleDropDownActions","handleClick","handleActionClick","handlePopConfirm","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","rawOptions","sortStringify","obj","sortKeys","acc","lastFetchedParamsKey","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","sanitizeNumericInput","t","dot","stripNumberGrouping","s","applyNumericInputDigitLimits","sanitized","integerDigits","decimalPlaces","neg","body","dotIdx","maxInt","intPart","afterDot","endsWithDot","decPart","maxAbsValue","clampByIntegerDigits","max","sign","roundToDecimals","rounding","factor","y","normalizeNumericValue","toFixedDecimalString","formatWithThousands","fixed","withSep","numberToEditString","focused","displayText","intN","decM","parseExternalToNumber","num","syncDisplayFromValue","emitStoredValue","onInput","val","clean","onFocus","onBlur","parsed","final","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","filterNodeMethod","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","apiSelectRef","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","showColon","normalizedTooltip","resolved","fieldWrapperComponent","fieldWrapperProps","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","fieldInstanceMap","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","getComponentSetting","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","resolveSchemaModel","baseModel","preserveExisting","nextModel","initialValues","applyFormModel","shouldEmit","updateFormModel","values","initForm","rules","filterByIfShow","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","handleSubmit","handleReset","setFieldsValue","getFieldsValue","resetFields","handleFieldChange","validate","nameList","validateFields","resolve","reject","valid","scrollToField","name","el","clearValidate","updateSchema","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","registerFieldInstance","getComponentInstance","getFieldOptions","apiSelectInstance","isFieldLoading","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","submit","innerSchema","DescriptionValueRenderer","rendererProps","renderTextNode","tooltipProps","contentNode","rendered","breakpoints","resolveColumn","column","currentColumn","effectiveData","visibleSchema","normalizedRows","currentRow","used","totalColumn","remainingItems","requested","normalizedSpan","renderedRows","showCollapseButton","visibleRows","showHeader","collapseButtonText","bodyStyle","getItemStyle","getLabelStyle","getContentStyle","getItemValue","syncSchema","syncData","descriptionProps","setData","getData","descriptionAction","updateWindowWidth","useDescription","descriptionActionRef","getDescriptionProps","getDescriptionAction","innerExpanded","resolvedCanExpan","mergedExpanded","canToggleByHeader","wrapperProps","incoming","wrapperClass","wrapperStyle","rest","triggerWindowResize","setExpanded","toggleExpand","handleHeaderClick","useProTableForm","emitAddRow","emitRemoveRow","currentModelValue","formModelRef","tableRows","rowKeyFn","cloneRows","emptyRow","child","emitNext","next","getCell","getCellValue","childKey","colVal","setCellValue","nested","handleAddRow","handleRemoveRow","canDeleteRow","getCellProp","tableRow","rulesResult","rulesSig","mergedRules","req","anyChange","newSnapshot","process","colOrChild","path","sig","prevArr","extraRules","f","propsArg","cellComponent","cellBind","slotUpdateHandler","slotProps","allLeafColumnKeys","rowIndex","columnIndex","colKey","cellComp","FormattedNumberInput","staticProps","dynamicProps","_opts","cellEvents","events","internalEvents","handlers","internalEvent","userHandler","arg","__default__","RenderCell","vnode","execRenderOnce","isPrimitive","_renderCache","getRender","cache","cacheKey","handleTableRowClick","handleTableRowDblclick","handleTableSortChange","sortInfo","handleTableExpandChange","flatColumns","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","CollapseContainer","ProTableForm","install","Vue","component"],"mappings":"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"}