@aspire-ui/element-component-pro 1.0.15 → 1.0.17

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/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/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)) {\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 const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return JSON.parse(JSON.stringify(componentSettings)) as T\n }\n return JSON.parse(JSON.stringify(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","<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=\"effectiveProps.spanMethod\"\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 <el-table-column\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.dataIndex || col.key || col.title\"\n :prop=\"col.dataIndex\"\n :label=\"col.title\"\n :width=\"getColumnWidth(col)\"\n :min-width=\"isRatioWidth(col.width) ? undefined : col.minWidth\"\n :fixed=\"col.fixed\"\n :align=\"col.align || 'left'\"\n :sortable=\"col.sortable\"\n :formatter=\"col.formatter\"\n :show-overflow-tooltip=\"col.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 1. 列级自定义表头:header-[dataIndex],例如 #header-age -->\n <slot\n v-if=\"col.dataIndex && $scopedSlots[`header-${col.dataIndex}`]\"\n :name=\"`header-${col.dataIndex}`\"\n :column=\"col\"\n />\n <!-- 2. 全局表头渲染:headerCell,类似 Vben 的 headerCell 用法 -->\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"col\"\n />\n <!-- 3. 默认表头渲染:标题 + helpMessage 提示 -->\n <template v-else>\n <span>{{ col.title }}</span>\n <el-tooltip v-if=\"col.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(col.helpMessage)\">\n <div v-for=\"(msg, i) in col.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ col.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n <template slot-scope=\"scope\">\n <slot\n v-if=\"col.dataIndex && $scopedSlots[col.dataIndex]\"\n :name=\"col.dataIndex\"\n :row=\"scope.row\"\n :column=\"col\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"col\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n :custom-render=\"col.customRender\"\n :value-enum=\"col.valueEnum\"\n />\n <DefaultCellRenderer v-else :column=\"col\" :record=\"scope.row\" :index=\"scope.$index\" :value=\"scope.row[col.dataIndex]\" />\n </template>\n </el-table-column>\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, defineComponent, h } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\n\nconst DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object, required: true },\n record: { type: Object, 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\nconst BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object, required: true },\n record: { type: Object, 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 // slot 未返回内容时,回退到默认渲染(对齐 vbenAdmin bodyCell 用法)\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\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 innerData = ref<Record<string, unknown>[]>([])\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 innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n)\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 = displayColumns.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 = displayColumns.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\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.width\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 innerData.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 innerData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\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 findRowIndex = (key: string | number) =>\n innerData.value.findIndex((r) => r[rowKeyField.value] === key)\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 getDataSource: () => innerData.value,\n getRawDataSource: () => rawDataSource.value,\n setTableData: (data) => { innerData.value = data ?? [] },\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 = innerData.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 updateTableData: (index, key, value) => {\n if (index < 0 || index >= innerData.value.length) return\n innerData.value = [...innerData.value]\n innerData.value[index] = { ...innerData.value[index], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = findRowIndex(rowKey)\n if (idx < 0) return\n innerData.value = [...innerData.value]\n innerData.value[idx] = { ...innerData.value[idx], ...record }\n return innerData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n innerData.value = innerData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...innerData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n innerData.value = arr\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(innerData.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(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => { innerColumns.value = [...(props.columns ?? [])] }\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n innerData.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) innerData.value = [...props.dataSource]\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 cachedParams = ref<string>('')\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) {\n const paramsKey = JSON.stringify(props.params ?? {})\n if (paramsKey !== cachedParams.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 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 cachedParams.value = JSON.stringify(props.params ?? {})\n } finally {\n loading.value = false\n }\n}\n\ndefineExpose({\n options,\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 }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n if (props.lazy) {\n options.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 */\nconst getFieldOptions = (field: string): Array<{ label: string; value: unknown }> => {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return []\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n if (apiSelectInstance?.options) {\n return apiSelectInstance.options\n }\n return []\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_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}\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 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 }\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 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 { 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 { 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: '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 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","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","computed","defaultPagination","paginationConfig","pagination","showTitleBar","showPagination","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","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","data","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","page","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","findRowIndex","tableAction","cols","keyList","fromProps","ordered","k","info","rows","index","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","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","cachedParams","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","sanitizeNumericInput","t","i","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","map","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","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","__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","ProTableForm","install","Vue","component"],"mappings":"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"}
1
+ {"version":3,"file":"element-component-pro.umd.js","sources":["../src/useComponentSetting.ts","../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)) {\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 const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return JSON.parse(JSON.stringify(componentSettings)) as T\n }\n return JSON.parse(JSON.stringify(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","<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=\"effectiveProps.spanMethod\"\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 <el-table-column\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.dataIndex || col.key || col.title\"\n :prop=\"col.dataIndex\"\n :label=\"col.title\"\n :width=\"getColumnWidth(col)\"\n :min-width=\"isRatioWidth(col.width) ? undefined : col.minWidth\"\n :fixed=\"col.fixed\"\n :align=\"col.align || 'left'\"\n :sortable=\"col.sortable\"\n :formatter=\"col.formatter\"\n :show-overflow-tooltip=\"col.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 1. 列级自定义表头:header-[dataIndex],例如 #header-age -->\n <slot\n v-if=\"col.dataIndex && $scopedSlots[`header-${col.dataIndex}`]\"\n :name=\"`header-${col.dataIndex}`\"\n :column=\"col\"\n />\n <!-- 2. 全局表头渲染:headerCell,类似 Vben 的 headerCell 用法 -->\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"col\"\n />\n <!-- 3. 默认表头渲染:标题 + helpMessage 提示 -->\n <template v-else>\n <span>{{ col.title }}</span>\n <el-tooltip v-if=\"col.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(col.helpMessage)\">\n <div v-for=\"(msg, i) in col.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ col.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n <template slot-scope=\"scope\">\n <slot\n v-if=\"col.dataIndex && $scopedSlots[col.dataIndex]\"\n :name=\"col.dataIndex\"\n :row=\"scope.row\"\n :column=\"col\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"col\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n :custom-render=\"col.customRender\"\n :value-enum=\"col.valueEnum\"\n />\n <DefaultCellRenderer v-else :column=\"col\" :record=\"scope.row\" :index=\"scope.$index\" :value=\"scope.row[col.dataIndex]\" />\n </template>\n </el-table-column>\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, defineComponent, h } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\n\nconst DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object, required: true },\n record: { type: Object, 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\nconst BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object, required: true },\n record: { type: Object, 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 // slot 未返回内容时,回退到默认渲染(对齐 vbenAdmin bodyCell 用法)\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\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 innerData = ref<Record<string, unknown>[]>([])\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 innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n)\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 = displayColumns.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 = displayColumns.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\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.width\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 innerData.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 innerData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\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 findRowIndex = (key: string | number) =>\n innerData.value.findIndex((r) => r[rowKeyField.value] === key)\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 getDataSource: () => innerData.value,\n getRawDataSource: () => rawDataSource.value,\n setTableData: (data) => { innerData.value = data ?? [] },\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 = innerData.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 updateTableData: (index, key, value) => {\n if (index < 0 || index >= innerData.value.length) return\n innerData.value = [...innerData.value]\n innerData.value[index] = { ...innerData.value[index], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = findRowIndex(rowKey)\n if (idx < 0) return\n innerData.value = [...innerData.value]\n innerData.value[idx] = { ...innerData.value[idx], ...record }\n return innerData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n innerData.value = innerData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...innerData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n innerData.value = arr\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(innerData.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(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => { innerColumns.value = [...(props.columns ?? [])] }\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n innerData.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) innerData.value = [...props.dataSource]\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_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","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","computed","defaultPagination","paginationConfig","pagination","showTitleBar","showPagination","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","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","data","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","page","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","findRowIndex","tableAction","cols","keyList","fromProps","ordered","k","info","rows","index","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","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","i","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","map","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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"}