@aspire-ui/element-component-pro 1.0.24 → 1.0.26

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.
@@ -1 +1 @@
1
- {"version":3,"file":"element-component-pro.umd.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\n if (isPlainObject(sourceValue) || key !== 'components') {\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.umd.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 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","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')\"\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 } 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}>()\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 })\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 })\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 */\nconst mergedEvents = (internalEvent: 'input' | 'change') => {\n const userHandler = cellEvents.value[internalEvent]\n return {\n ...cellEvents.value,\n [internalEvent]: (arg: unknown) => {\n if (userHandler) userHandler(arg)\n emit('update', arg)\n },\n }\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 :validate-on-rule-change=\"false\"\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 @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 @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 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__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","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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"}