@aspire-ui/element-component-pro 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/ProForm/ProForm.vue.d.ts +7 -0
- package/dist/ProForm/ProFormItem.vue.d.ts +2 -0
- package/dist/element-component-pro.es.js +758 -723
- package/dist/element-component-pro.es.js.map +1 -1
- package/dist/element-component-pro.umd.js +2 -2
- package/dist/element-component-pro.umd.js.map +1 -1
- package/dist/index.d.ts +52 -24
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/utils/tooltip.d.ts +4 -0
- package/package.json +2 -1
- package/src/ProDescriptions/ProDescriptions.vue +24 -6
- package/src/ProForm/ProForm.vue +3 -1
- package/src/ProForm/ProFormItem.vue +144 -123
- package/src/ProTable/TableAction.vue +2 -5
- package/src/types/index.ts +7 -0
- package/src/utils/tooltip.ts +56 -0
- package/src/vite-env.d.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-component-pro.es.js","sources":["../src/useComponentSetting.ts","../src/ProTable/ProTable.vue","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.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/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: (componentName?: string) => Record<string, unknown>\n /** 设置组件默认配置(与已有配置浅合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置,用于初始化或合并 props\n * - setSetting:设置组件默认配置,可在应用入口或按需调用\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n const getSetting = (componentName?: string): Record<string, unknown> => {\n if (componentName === undefined) {\n return { ...componentSettings }\n }\n return { ...(componentSettings[componentName] ?? {}) }\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n componentSettings[componentName] = current ? { ...current, ...config } : { ...config }\n }\n\n return {\n getSetting,\n setSetting,\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 :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; 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 pagination = ref({\n page: 1,\n pageSize: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSize ?? 10) : 10,\n pageSizes: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSizes ?? [10, 20, 50, 100]) : [10, 20, 50, 100],\n total: 0,\n})\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProTable'), ...props, ...innerProps.value }))\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\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","<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'\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 if (!tooltip) return {}\n if (typeof tooltip === 'string') {\n return { content: tooltip }\n }\n return tooltip as Record<string, unknown>\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 :value=\"value\" :placeholder=\"placeholder\" :disabled=\"disabled\" :loading=\"loading\" :clearable=\"clearable\"\n :filterable=\"filterable\" :multiple=\"multiple\" v-bind=\"$attrs\" @input=\"$emit('input', $event)\"\n @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 }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) fetchOptions()\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 } finally {\n loading.value = false\n }\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","<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>{{ schema.label }}</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\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 <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 :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 </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-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 formActionType?: import('../types').FormActionType\n onFieldChange?: (field: string, value: unknown) => void\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\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)\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__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\"\n :custom-components=\"formCustomComponents\" :on-field-change=\"handleFieldChange\">\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 { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners } 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 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 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\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\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}\n\ndefineExpose(formActionRef)\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 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 if (schema.render) {\n const rendered = schema.render(value, record)\n if (rendered == null || rendered === '') return h('span', rendererProps.emptyText)\n if (typeof rendered === 'string' || typeof rendered === 'number') return h('span', String(rendered))\n return rendered as never\n }\n\n if (Array.isArray(value)) {\n return h('span', value.length ? value.join(', ') : rendererProps.emptyText)\n }\n\n if (value === null || value === undefined || value === '') {\n return h('span', rendererProps.emptyText)\n }\n\n if (typeof value === 'object') {\n return h('span', JSON.stringify(value))\n }\n\n return h('span', String(value))\n }\n },\n})\n\nconst { getSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getSetting('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","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport { useForm } from './ProForm/useForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\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'\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: 'ProDescriptions', component: ProDescriptions },\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}\n"],"names":["componentSettings","reactive","useComponentSetting","componentName","config","current","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","props","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","pagination","getComponentSetting","effectiveProps","computed","showTitleBar","showPagination","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","key","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","value","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","normalizeTooltip","tooltip","getButtonType","action","filterVisible","item","ifShow","visibleActions","visibleDropDownActions","handleClick","handleActionClick","handlePopConfirm","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","map","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","normalized","displayText","filterNodeMethod","val","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","s","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","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","innerSchema","DescriptionValueRenderer","rendererProps","rendered","getSetting","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","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","install","Vue","component"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element-component-pro.es.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/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/ProDescriptions/ProDescriptions.vue","../src/ProDescriptions/useDescription.ts","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: (componentName?: string) => Record<string, unknown>\n /** 设置组件默认配置(与已有配置浅合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置,用于初始化或合并 props\n * - setSetting:设置组件默认配置,可在应用入口或按需调用\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n const getSetting = (componentName?: string): Record<string, unknown> => {\n if (componentName === undefined) {\n return { ...componentSettings }\n }\n return { ...(componentSettings[componentName] ?? {}) }\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n componentSettings[componentName] = current ? { ...current, ...config } : { ...config }\n }\n\n return {\n getSetting,\n setSetting,\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 :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; 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 pagination = ref({\n page: 1,\n pageSize: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSize ?? 10) : 10,\n pageSizes: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSizes ?? [10, 20, 50, 100]) : [10, 20, 50, 100],\n total: 0,\n})\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProTable'), ...props, ...innerProps.value }))\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\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 :value=\"value\" :placeholder=\"placeholder\" :disabled=\"disabled\" :loading=\"loading\" :clearable=\"clearable\"\n :filterable=\"filterable\" :multiple=\"multiple\" v-bind=\"$attrs\" @input=\"$emit('input', $event)\"\n @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 }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) fetchOptions()\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 } finally {\n loading.value = false\n }\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","<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 <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 :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 } from 'vue'\nimport ApiSelect from './ApiSelect.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 '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}>()\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 <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 { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners } 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\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\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}\n\ndefineExpose(formActionRef)\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 { getSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getSetting('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","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport { useForm } from './ProForm/useForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\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'\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: 'ProDescriptions', component: ProDescriptions },\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}\n"],"names":["componentSettings","reactive","useComponentSetting","componentName","config","current","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","props","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","pagination","getComponentSetting","effectiveProps","computed","showTitleBar","showPagination","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","key","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","value","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","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","map","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","displayText","filterNodeMethod","val","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","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","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","s","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","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","innerSchema","DescriptionValueRenderer","rendererProps","renderTextNode","tooltipProps","contentNode","rendered","getSetting","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","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","install","Vue","component"],"mappings":"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"}
|