@aspire-ui/element-component-pro 1.0.19 → 1.0.20
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/dist/ProTable/ProTable.vue.d.ts +1 -104
- package/dist/ProTable/components/CellRenderers.d.ts +92 -0
- package/dist/ProTable/components/TableColumnGroup.vue.d.ts +39 -0
- package/dist/ProTable/types/index.d.ts +2 -0
- package/dist/element-component-pro.es.js +1095 -1044
- 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 +1 -104
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/ProTable/ProTable.vue +57 -126
- package/src/ProTable/components/CellRenderers.ts +59 -0
- package/src/ProTable/components/TableColumnGroup.vue +101 -0
- package/src/ProTable/types/index.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-component-pro.umd.js","sources":["../src/useComponentSetting.ts","../src/ProTable/ProTable.vue","../src/utils/tooltip.ts","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.vue","../src/utils/formattedNumber.ts","../src/ProForm/FormattedNumberInput.vue","../src/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/ProDescriptions/ProDescriptions.vue","../src/ProDescriptions/useDescription.ts","../src/CollapseContainer/CollapseContainer.vue","../src/ProTableForm/ProTableForm.vue","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\n/**\n * 深度合并两个对象\n * - source 的值会覆盖 target 的值\n * - 对于嵌套对象,会递归合并\n * - 数组直接替换,不合并\n */\nfunction deepMerge(target: Record<string, unknown>, source?: Record<string, unknown>): Record<string, unknown> {\n if (!source) return target\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const targetValue = target[key]\n const sourceValue = source[key]\n\n if (isPlainObject(sourceValue)) {\n if (!isPlainObject(targetValue)) {\n target[key] = { ...(sourceValue as Record<string, unknown>) }\n } else {\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n }\n } else {\n target[key] = sourceValue\n }\n }\n }\n\n return target\n}\n\n/** 判断是否为普通对象(非数组、非 null) */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string) => T\n /** 设置组件默认配置(与已有配置深度合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n /** 合并组件配置:全局配置与组件 props 合并,返回合并后的结果 */\n mergeSettings: <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>) => T\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置\n * - setSetting:设置组件默认配置(深度合并),可在应用入口或按需调用\n * - mergeSettings:合并全局配置与组件 props,props 优先级更高\n *\n * 合并优先级:组件默认值 < 全局配置 < 组件 props\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return JSON.parse(JSON.stringify(componentSettings)) as T\n }\n return JSON.parse(JSON.stringify(componentSettings[componentName] ?? {})) as T\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n if (current) {\n componentSettings[componentName] = deepMerge({ ...current }, config)\n } else {\n componentSettings[componentName] = { ...config }\n }\n }\n\n /** 合并全局配置与组件 props,props 优先级更高 */\n const mergeSettings = <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>): T => {\n const globalSetting = componentSettings[componentName] ?? {}\n return deepMerge({ ...globalSetting }, props) as T\n }\n\n return {\n getSetting,\n setSetting,\n mergeSettings,\n }\n}\n","<template>\n <div class=\"ecp-pro-table\">\n <!-- 标题栏 -->\n <div v-if=\"showTitleBar\" class=\"ecp-pro-table__header\">\n <div class=\"ecp-pro-table__title-wrapper\">\n <span class=\"ecp-pro-table__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.titleHelpMessage\" class=\"ecp-pro-table__help\" placement=\"top\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.titleHelpMessage)\">\n <div v-for=\"(msg, i) in effectiveProps.titleHelpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.titleHelpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </div>\n <div class=\"ecp-pro-table__toolbar\">\n <slot name=\"tableTitle\" />\n <slot name=\"toolbar\" />\n <slot name=\"toolbar-right\">\n <el-button\n v-if=\"effectiveProps.tableSetting?.redo !== false\"\n type=\"text\"\n icon=\"el-icon-refresh\"\n size=\"small\"\n @click=\"handleReload\"\n >\n 刷新\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 表格主体(Element UI el-table 无 loading 属性,使用 v-loading 指令) -->\n <div ref=\"tableWrapRef\" class=\"ecp-pro-table__body\" v-loading=\"loading\">\n <el-table\n ref=\"tableRef\"\n :data=\"innerData\"\n :row-key=\"effectiveProps.rowKey\"\n :border=\"effectiveProps.bordered\"\n :stripe=\"effectiveProps.striped\"\n :size=\"effectiveProps.size\"\n :max-height=\"effectiveProps.maxHeight\"\n :height=\"effectiveProps.height\"\n :default-sort=\"effectiveProps.defaultSort\"\n :span-method=\"effectiveProps.spanMethod\"\n :tree-props=\"effectiveProps.treeProps\"\n :default-expand-all=\"effectiveProps.defaultExpandAll\"\n :expand-row-keys=\"effectiveProps.expandRowKeys || []\"\n :lazy=\"effectiveProps.lazy\"\n :load=\"effectiveProps.load\"\n v-bind=\"effectiveProps.tableProps\"\n :row-class-name=\"effectiveProps.rowClassName\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @sort-change=\"handleSortChange\"\n @expand-change=\"handleExpandChange\"\n >\n <!-- 选择列:自定义实现,参考 VbenAdmin,支持单选/多选/禁用/跨页 -->\n <el-table-column\n v-if=\"effectiveProps.rowSelection\"\n :width=\"effectiveProps.rowSelection.width || 48\"\n :fixed=\"effectiveProps.rowSelection.fixed\"\n align=\"center\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 多选:表头全选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isAllCurrentPageSelected\"\n :indeterminate=\"isIndeterminate\"\n :disabled=\"!hasSelectableRows\"\n @change=\"handleSelectAll\"\n />\n <span v-else />\n </template>\n <template slot-scope=\"scope\">\n <!-- 多选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isRowSelected(scope.row)\"\n :disabled=\"getCheckboxDisabled(scope.row)\"\n @change=\"(val) => handleCheckboxChange(scope.row, val)\"\n @click.native.stop\n />\n <!-- 单选 -->\n <el-radio\n v-else\n :value=\"selectedRows[0]?.[rowKeyField]\"\n :label=\"scope.row[rowKeyField]\"\n :disabled=\"getRadioDisabled(scope.row)\"\n @change=\"handleRadioSelect(scope.row)\"\n @click.native.stop\n >\n <span />\n </el-radio>\n </template>\n </el-table-column>\n <!-- 序号列 -->\n <el-table-column\n v-if=\"effectiveProps.showIndexColumn\"\n type=\"index\"\n :label=\"effectiveProps.indexColumnProps?.title || '序号'\"\n :width=\"effectiveProps.indexColumnProps?.width || 60\"\n :fixed=\"effectiveProps.indexColumnProps?.fixed\"\n :align=\"effectiveProps.indexColumnProps?.align || 'center'\"\n />\n <!-- 数据列 -->\n <template v-for=\"col in displayColumns\">\n <el-table-column\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.dataIndex || col.key || col.title\"\n :prop=\"col.dataIndex\"\n :label=\"col.title\"\n :width=\"getColumnWidth(col)\"\n :min-width=\"isRatioWidth(col.width) ? undefined : col.minWidth\"\n :fixed=\"col.fixed\"\n :align=\"col.align || 'left'\"\n :sortable=\"col.sortable\"\n :formatter=\"col.formatter\"\n :show-overflow-tooltip=\"col.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 1. 列级自定义表头:header-[dataIndex],例如 #header-age -->\n <slot\n v-if=\"col.dataIndex && $scopedSlots[`header-${col.dataIndex}`]\"\n :name=\"`header-${col.dataIndex}`\"\n :column=\"col\"\n />\n <!-- 2. 全局表头渲染:headerCell,类似 Vben 的 headerCell 用法 -->\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"col\"\n />\n <!-- 3. 默认表头渲染:标题 + helpMessage 提示 -->\n <template v-else>\n <span>{{ col.title }}</span>\n <el-tooltip v-if=\"col.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(col.helpMessage)\">\n <div v-for=\"(msg, i) in col.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ col.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n <template slot-scope=\"scope\">\n <slot\n v-if=\"col.dataIndex && $scopedSlots[col.dataIndex]\"\n :name=\"col.dataIndex\"\n :row=\"scope.row\"\n :column=\"col\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"col\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n :custom-render=\"col.customRender\"\n :value-enum=\"col.valueEnum\"\n />\n <DefaultCellRenderer v-else :column=\"col\" :record=\"scope.row\" :index=\"scope.$index\" :value=\"scope.row[col.dataIndex]\" />\n </template>\n </el-table-column>\n </template>\n <!-- 操作列 -->\n <el-table-column\n v-if=\"effectiveProps.actionColumn\"\n :label=\"effectiveProps.actionColumn.title || '操作'\"\n :width=\"effectiveProps.actionColumn.width || 150\"\n :fixed=\"effectiveProps.actionColumn.fixed || 'right'\"\n :align=\"effectiveProps.actionColumn.align || 'center'\"\n >\n <template slot-scope=\"scope\">\n <slot\n v-if=\"$scopedSlots['action']\"\n name=\"action\"\n :record=\"scope.row\"\n :column=\"effectiveProps.actionColumn\"\n :index=\"scope.$index\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"effectiveProps.actionColumn\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"undefined\"\n :custom-render=\"effectiveProps.actionColumn.customRender\"\n :value-enum=\"effectiveProps.actionColumn.valueEnum\"\n />\n </template>\n </el-table-column>\n </el-table>\n </div>\n\n <!-- 分页 -->\n <div v-if=\"showPagination\" class=\"ecp-pro-table__pagination\">\n <el-pagination\n :current-page=\"pagination.page\"\n :page-sizes=\"pagination.pageSizes\"\n :page-size=\"pagination.pageSize\"\n :total=\"pagination.total\"\n :small=\"paginationSmall\"\n :background=\"paginationBackground\"\n :layout=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' ? effectiveProps.pagination.layout : null) || 'total, sizes, prev, pager, next, jumper'\"\n v-bind=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' && effectiveProps.pagination.props) || {}\"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// @ts-nocheck - Vue 2 el-table-column slot-scope 类型推断存在已知限制,暂用此方式消除模板内 scope 相关告警\nimport { ref, computed, watch, onMounted, onUnmounted, useSlots, nextTick, defineComponent, h } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\n\nconst DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object, required: true },\n record: { type: Object, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n },\n setup(p) {\n return () => {\n const col = p.column as any\n if (col?.customRender) {\n const r = col.customRender({ text: p.value, record: p.record, index: p.index })\n if (typeof r === 'string' || typeof r === 'number') return h('span', String(r))\n return r as any\n }\n if (col?.valueEnum) {\n const text = col.valueEnum?.[p.value]?.text ?? p.value\n return h('span', text == null ? '' : String(text))\n }\n return h('span', p.value == null ? '' : String(p.value))\n }\n },\n})\n\nconst BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object, required: true },\n record: { type: Object, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n customRender: { type: Function, required: false },\n valueEnum: { type: Object, required: false },\n },\n setup(p) {\n return () => {\n const slot = p.slotRender as any\n const nodes = slot?.({ column: p.column, record: p.record, index: p.index, value: p.value })\n\n const normalize = (n: any) => {\n if (n == null) return []\n if (Array.isArray(n)) return n.filter((x) => x != null && x !== false && !x.isComment)\n return [n]\n }\n const normalized = normalize(nodes)\n if (normalized.length > 0) return nodes\n\n // slot 未返回内容时,回退到默认渲染(对齐 vbenAdmin bodyCell 用法)\n const col = { ...(p.column as any) }\n if (p.customRender) col.customRender = p.customRender\n if (p.valueEnum) col.valueEnum = p.valueEnum\n return h(DefaultCellRenderer as any, { props: { column: col, record: p.record, index: p.index, value: p.value } })\n }\n },\n})\n\nconst props = withDefaults(\n defineProps<{\n columns?: ProColumn[]\n dataSource?: Record<string, unknown>[]\n api?: (params: Record<string, unknown>) => Promise<{ list?: unknown[]; items?: unknown[]; total?: number }>\n rowKey?: string\n title?: string\n titleHelpMessage?: string | string[]\n bordered?: boolean\n striped?: boolean\n size?: 'medium' | 'small' | 'large'\n loading?: boolean\n maxHeight?: number | string\n height?: number | string\n ellipsis?: boolean\n showIndexColumn?: boolean\n indexColumnProps?: Partial<ProColumn>\n actionColumn?: Partial<ProColumn>\n rowSelection?: { type?: 'checkbox' | 'radio'; width?: number; fixed?: 'left' | 'right'; getCheckboxProps?: (r: Record<string, unknown>) => { disabled?: boolean }; getRadioProps?: (r: Record<string, unknown>) => { disabled?: boolean } }\n clearSelectOnPageChange?: boolean\n pagination?: false | { pageSize?: number; pageSizes?: number[]; layout?: string; small?: boolean; background?: boolean; props?: Record<string, unknown> } | Record<string, unknown>\n tableSetting?: { redo?: boolean; size?: boolean; setting?: boolean; fullScreen?: boolean }\n fetchSetting?: FetchSetting\n beforeFetch?: (params: Record<string, unknown>) => Record<string, unknown>\n afterFetch?: (data: unknown) => unknown\n immediate?: boolean\n searchInfo?: Record<string, unknown>\n defaultSort?: { prop: string; order: 'ascending' | 'descending' }\n tableProps?: Record<string, unknown>\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n spanMethod?: (params: { row: Record<string, unknown>; column: Record<string, unknown>; rowIndex: number; columnIndex: number }) => [number, number] | { rowspan: number; colspan: number }\n treeProps?: { hasChildren?: string; children?: string }\n defaultExpandAll?: boolean\n expandRowKeys?: (string | number)[]\n lazy?: boolean\n load?: (row: Record<string, unknown>, treeNode: { level: number; expanded: boolean; loaded: boolean }, resolve: (data: Record<string, unknown>[]) => void) => void\n }>(),\n {\n rowKey: 'id',\n clearSelectOnPageChange: false,\n bordered: false,\n striped: true,\n size: 'medium',\n loading: false,\n ellipsis: true,\n showIndexColumn: true,\n pagination: () => ({ pageSize: 10, pageSizes: [10, 20, 50, 100] }),\n tableSetting: () => ({ redo: true }),\n fetchSetting: () => ({\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'list',\n totalField: 'total',\n }),\n immediate: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: TableActionType): void\n (e: 'fetch-success', data: { items: unknown[]; total: number }): void\n (e: 'fetch-error', error: unknown): void\n (e: 'selection-change', data: { keys: (string | number)[]; rows: Record<string, unknown>[] }): void\n (e: 'row-click', record: Record<string, unknown>, event: Event): void\n (e: 'row-dblclick', record: Record<string, unknown>, event: Event): void\n (e: 'sort-change', sortInfo: { prop: string; order: string }): void\n (e: 'expand-change', row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]): void\n}>()\n\nconst slots = useSlots()\nconst tableRef = ref()\nconst tableWrapRef = ref()\nconst containerWidth = ref(0)\nconst loading = ref(props.loading ?? false)\nconst innerData = ref<Record<string, unknown>[]>([])\nconst rawDataSource = ref<Record<string, unknown>>({})\nconst innerColumns = ref<ProColumn[]>([])\nconst innerProps = ref<Partial<ProTableProps>>({})\nconst selectedRows = ref<Record<string, unknown>[]>([])\nconst showPaginationRef = ref<boolean | null>(null)\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<ProTableProps>('ProTable', { ...props, ...innerProps.value }))\n\n/** 从 effectiveProps.pagination 读取分页默认值(已通过深度合并) */\nconst defaultPagination = computed(() => {\n const paginationConfig = effectiveProps.value.pagination\n if (paginationConfig && typeof paginationConfig === 'object') {\n return {\n pageSize: (paginationConfig as Record<string, unknown>).pageSize ?? 10,\n pageSizes: ((paginationConfig as Record<string, unknown>).pageSizes as number[]) ?? [10, 20, 50, 100],\n }\n }\n return { pageSize: 10, pageSizes: [10, 20, 50, 100] as number[] }\n})\n\nconst pagination = ref({\n page: 1,\n pageSize: defaultPagination.value.pageSize,\n pageSizes: defaultPagination.value.pageSizes,\n total: 0,\n})\n\nconst showTitleBar = computed(() => !!effectiveProps.value.title || !!slots.tableTitle || !!slots.toolbar)\nconst showPagination = computed(() => {\n if (showPaginationRef.value !== null) return showPaginationRef.value\n return !!props.pagination && typeof props.pagination === 'object'\n})\n\n/** 分页 small 属性:从 pagination 配置或全局设置中读取 */\nconst paginationSmall = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).small\n }\n return false\n})\n\n/** 分页 background 属性:从 pagination 配置或全局设置中读取 */\nconst paginationBackground = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).background\n }\n return false\n})\n\nconst rowKeyField = computed(() => effectiveProps.value.rowKey || 'id')\n\n/** 选中行 key 集合(用于快速判断) */\nconst selectedKeysSet = computed(() => new Set(selectedRows.value.map((r) => r[rowKeyField.value] as string | number)))\n\n/** 显示列 */\nconst displayColumns = computed(() =>\n innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n)\n\n/** 固定列总宽度 */\nconst fixedColumnsWidth = computed(() => {\n let w = 0\n if (effectiveProps.value.rowSelection) w += Number(effectiveProps.value.rowSelection.width) || 48\n if (effectiveProps.value.showIndexColumn) w += Number(effectiveProps.value.indexColumnProps?.width) || 60\n if (effectiveProps.value.actionColumn) w += Number(effectiveProps.value.actionColumn?.width) || 150\n return w\n})\n\nconst isRatioWidth = (w: number | string | undefined) => typeof w === 'number' && w > 0\nconst totalRatio = computed(() => {\n const cols = displayColumns.value.filter((c) => shouldShowColumn(c) && isRatioWidth(c.width))\n return cols.reduce((sum, c) => sum + (typeof c.width === 'number' ? c.width : 0), 0)\n})\n\nconst fixedDataColumnsWidth = computed(() => {\n const cols = displayColumns.value.filter((c) => shouldShowColumn(c) && typeof c.width === 'string')\n return cols.reduce((sum, c) => sum + (Number(getColumnWidth(c)) || 80), 0)\n})\n\nconst parseWidthPx = (v: number | string | undefined): number | null =>\n v == null ? null : typeof v === 'number' ? v : parseInt(String(v).replace(/px$/i, ''), 10) || null\n\nconst getColumnWidth = (col: ProColumn): number | string | undefined => {\n const w = col.width\n if (isRatioWidth(w) && totalRatio.value > 0 && containerWidth.value > 0 && typeof w === 'number') {\n const available = containerWidth.value - fixedColumnsWidth.value - fixedDataColumnsWidth.value\n let result = Math.floor((available * w) / totalRatio.value)\n const minPx = parseWidthPx(col.minWidth) ?? 60\n const maxPx = parseWidthPx(col.maxWidth)\n result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n if (typeof w === 'string') {\n const basePx = parseWidthPx(w) ?? 80\n const minPx = parseWidthPx(col.minWidth)\n const maxPx = parseWidthPx(col.maxWidth)\n let result = basePx\n if (minPx != null) result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n return col.width\n}\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n\n/** 当前页可选行(未禁用) */\nconst selectableRows = computed(() => {\n const getDisabled = effectiveProps.value.rowSelection?.getCheckboxProps\n if (!getDisabled) return innerData.value\n return innerData.value.filter((row) => !getDisabled(row)?.disabled)\n})\n\nconst hasSelectableRows = computed(() => selectableRows.value.length > 0)\n\n/** 当前页是否全选 */\nconst isAllCurrentPageSelected = computed(() => {\n if (selectableRows.value.length === 0) return false\n return selectableRows.value.every((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number))\n})\n\n/** 半选状态 */\nconst isIndeterminate = computed(() => {\n const selectedCount = selectableRows.value.filter((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number)).length\n return selectedCount > 0 && selectedCount < selectableRows.value.length\n})\n\nconst isRowSelected = (row: Record<string, unknown>) =>\n selectedKeysSet.value.has(row[rowKeyField.value] as string | number)\n\nconst getCheckboxDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getCheckboxProps?.(row)?.disabled ?? false\n\nconst getRadioDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getRadioProps?.(row)?.disabled ?? false\n\nconst emitSelectionChange = () => {\n const keys = selectedRows.value.map((r) => r[rowKeyField.value] as string | number)\n emit('selection-change', { keys, rows: selectedRows.value })\n}\n\nconst handleCheckboxChange = (row: Record<string, unknown>, checked: boolean) => {\n const key = row[rowKeyField.value] as string | number\n if (checked) {\n selectedRows.value = [...selectedRows.value.filter((r) => r[rowKeyField.value] !== key), row]\n } else {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n }\n emitSelectionChange()\n}\n\nconst handleRadioSelect = (row: Record<string, unknown>) => {\n selectedRows.value = [row]\n emitSelectionChange()\n}\n\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n const keySet = new Set(selectedRows.value.map((r) => r[rowKeyField.value]))\n const toAdd = selectableRows.value.filter((row) => !keySet.has(row[rowKeyField.value]))\n selectedRows.value = [...selectedRows.value, ...toAdd]\n } else {\n const currentPageKeys = new Set(innerData.value.map((r) => r[rowKeyField.value]))\n selectedRows.value = selectedRows.value.filter((r) => !currentPageKeys.has(r[rowKeyField.value]))\n }\n emitSelectionChange()\n}\n\nconst fetchData = async (opt?: FetchParams) => {\n if (!props.api) {\n if (props.dataSource) return\n innerData.value = []\n return\n }\n loading.value = true\n try {\n const fs = effectiveProps.value.fetchSetting ?? {}\n const pageField = fs.pageField ?? 'page'\n const sizeField = fs.sizeField ?? 'pageSize'\n const listField = fs.listField ?? 'list'\n const totalField = fs.totalField ?? 'total'\n const params: Record<string, unknown> = {\n [pageField]: opt?.page ?? pagination.value.page,\n [sizeField]: opt?.pageSize ?? pagination.value.pageSize,\n ...props.searchInfo,\n ...opt?.searchInfo,\n }\n if (opt?.page != null) pagination.value.page = opt.page\n if (opt?.pageSize != null) pagination.value.pageSize = opt.pageSize\n const processedParams = props.beforeFetch ? props.beforeFetch(params) : params\n const res = await props.api!(processedParams)\n rawDataSource.value = (res || {}) as Record<string, unknown>\n const data = (props.afterFetch ? props.afterFetch(res) : res) as Record<string, unknown>\n const list = (data[listField] ?? data.items ?? data.list ?? []) as unknown[]\n const total = (data[totalField] ?? 0) as number\n innerData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\n emit('fetch-error', e)\n } finally {\n loading.value = false\n }\n}\n\nconst handleReload = () => fetchData(undefined)\nconst handleSizeChange = (size: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.pageSize = size\n pagination.value.page = 1\n fetchData(undefined)\n}\nconst handleCurrentChange = (page: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.page = page\n fetchData(undefined)\n}\nconst handleRowClick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-click', row, event)\nconst handleRowDblclick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-dblclick', row, event)\nconst handleSortChange = ({ prop, order }: { prop: string; order: string }) => emit('sort-change', { prop, order })\nconst handleExpandChange = (row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]) => emit('expand-change', row, expanded)\n\nconst findRowIndex = (key: string | number) =>\n innerData.value.findIndex((r) => r[rowKeyField.value] === key)\n\nconst tableAction: TableActionType = {\n setProps: (p) => { innerProps.value = { ...innerProps.value, ...p } },\n reload: (opt) => fetchData(opt),\n redoHeight: () => { tableRef.value?.doLayout?.() },\n setLoading: (v) => { loading.value = v },\n getDataSource: () => innerData.value,\n getRawDataSource: () => rawDataSource.value,\n setTableData: (data) => { innerData.value = data ?? [] },\n getColumns: () => innerColumns.value,\n setColumns: (cols) => {\n if (Array.isArray(cols) && cols.length > 0 && typeof cols[0] === 'string') {\n const keyList = cols as string[]\n const fromProps = (props.columns ?? []).filter((c) => keyList.includes((c.key ?? c.dataIndex) as string))\n const ordered = keyList.map((k) => fromProps.find((c) => (c.key ?? c.dataIndex) === k)).filter(Boolean) as ProColumn[]\n if (ordered.length) innerColumns.value = ordered\n } else {\n innerColumns.value = (cols as ProColumn[]) ?? []\n }\n },\n setPagination: (info) => {\n if (info?.page) pagination.value.page = info.page\n if (info?.pageSize) pagination.value.pageSize = info.pageSize\n if (info?.total !== undefined) pagination.value.total = info.total\n },\n getSelectRowKeys: () => selectedRows.value.map((r) => r[rowKeyField.value] as string | number),\n getSelectRows: () => selectedRows.value,\n clearSelectedRowKeys: () => { selectedRows.value = []; emitSelectionChange() },\n setSelectedRowKeys: (keys) => {\n const keySet = new Set(keys)\n const rows = innerData.value.filter((r) => keySet.has(r[rowKeyField.value] as string | number))\n keys.forEach((k) => {\n if (!rows.some((r) => r[rowKeyField.value] === k)) {\n rows.push({ [rowKeyField.value]: k } as Record<string, unknown>)\n }\n })\n selectedRows.value = rows\n emitSelectionChange()\n },\n deleteSelectRowByKey: (key) => {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n emitSelectionChange()\n },\n updateTableData: (index, key, value) => {\n if (index < 0 || index >= innerData.value.length) return\n innerData.value = [...innerData.value]\n innerData.value[index] = { ...innerData.value[index], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = findRowIndex(rowKey)\n if (idx < 0) return\n innerData.value = [...innerData.value]\n innerData.value[idx] = { ...innerData.value[idx], ...record }\n return innerData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n innerData.value = innerData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...innerData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n innerData.value = arr\n return record\n },\n getPaginationRef: () =>\n showPagination.value\n ? { page: pagination.value.page, pageSize: Number(pagination.value.pageSize) || 10, total: pagination.value.total }\n : false,\n getShowPagination: () => showPagination.value,\n setShowPagination: (show) => { showPaginationRef.value = show },\n getRowSelection: () => effectiveProps.value.rowSelection,\n expandAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, true))\n },\n collapseAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => { innerColumns.value = [...(props.columns ?? [])] }\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n innerData.value = [...props.dataSource]\n if (!props.api && props.pagination !== false) {\n pagination.value.total = props.dataSource.length\n }\n }\n}\n\nconst updateContainerWidth = () => {\n if (tableWrapRef.value) containerWidth.value = tableWrapRef.value.offsetWidth || 0\n}\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedEl: Element | null = null\n\nonMounted(() => {\n syncColumns()\n emit('register', tableAction)\n loadData()\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateContainerWidth)\n resizeObserver = new ResizeObserver(updateContainerWidth)\n nextTick(() => {\n updateContainerWidth()\n observedEl = tableWrapRef.value\n if (observedEl) resizeObserver?.observe(observedEl)\n })\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateContainerWidth)\n if (resizeObserver && observedEl) {\n resizeObserver.unobserve(observedEl)\n observedEl = null\n }\n }\n})\n\nwatch(() => props.columns, syncColumns, { deep: true })\nwatch(() => props.dataSource, () => {\n if (!props.api && props.dataSource) innerData.value = [...props.dataSource]\n}, { deep: true })\nwatch(() => props.loading, (v) => { loading.value = v ?? false })\n</script>\n\n<style scoped>\n.ecp-pro-table {\n padding: 16px;\n background: #fff;\n width: 100%;\n box-sizing: border-box;\n}\n.ecp-pro-table :deep(.el-table) {\n width: 100% !important;\n}\n.ecp-pro-table__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.ecp-pro-table__title-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-pro-table__title {\n font-size: 16px;\n font-weight: 600;\n}\n.ecp-pro-table__help {\n color: #909399;\n cursor: help;\n}\n.ecp-pro-table__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ecp-pro-table__body {\n width: 100%;\n}\n.ecp-pro-table__pagination {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.ecp-pro-table__col-help {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n}\n</style>\n","export type TooltipValue = boolean | string | Record<string, unknown>\n\nexport const hasTooltipContent = (value: unknown): boolean => {\n if (Array.isArray(value)) return value.length > 0\n return value !== undefined && value !== null && String(value).trim() !== ''\n}\n\nexport const getTooltipContent = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(', ')\n }\n if (value === undefined || value === null) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const normalizeTooltipConfig = (\n tooltip: TooltipValue | null | undefined,\n fallbackValue?: unknown\n): Record<string, unknown> | null => {\n if (!tooltip) return null\n\n if (tooltip === true) {\n return {\n content: getTooltipContent(fallbackValue),\n placement: 'top',\n effect: 'dark',\n disabled: !hasTooltipContent(fallbackValue),\n }\n }\n\n if (typeof tooltip === 'string') {\n return {\n content: tooltip,\n placement: 'top',\n effect: 'dark',\n }\n }\n\n const normalized = { ...tooltip }\n const hasExplicitContent = Object.prototype.hasOwnProperty.call(normalized, 'content')\n if (!hasExplicitContent) {\n normalized.content = getTooltipContent(fallbackValue)\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'placement')) {\n normalized.placement = 'top'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'effect')) {\n normalized.effect = 'dark'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'disabled')) {\n normalized.disabled = !hasTooltipContent(normalized.content)\n }\n\n return normalized\n}\n","<template>\n <div class=\"ecp-table-action\">\n <!-- 主操作按钮组 -->\n <span\n v-for=\"(action, index) in visibleActions\"\n :key=\"`action-${index}`\"\n class=\"ecp-table-action__item\"\n >\n <!-- 气泡确认 -->\n <el-popconfirm\n v-if=\"action.popConfirm\"\n :title=\"action.popConfirm.title\"\n :confirm-button-text=\"action.popConfirm.okText || '确定'\"\n :cancel-button-text=\"action.popConfirm.cancelText || '取消'\"\n @confirm=\"handlePopConfirmConfirm(action, $event)\"\n @cancel=\"handlePopConfirmCancel(action, $event)\"\n >\n <span slot=\"reference\">\n <component\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n </span>\n </el-popconfirm>\n\n <!-- 普通按钮 -->\n <component\n v-else\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n\n <el-divider v-if=\"action.divider\" direction=\"vertical\" />\n </span>\n\n <!-- 下拉更多操作 -->\n <el-dropdown v-if=\"visibleDropDownActions.length\" trigger=\"click\" @command=\"handleDropdownCommand\">\n <span class=\"ecp-table-action__more\">\n <el-button type=\"text\" size=\"small\">\n 更多<i class=\"el-icon-arrow-down el-icon--right\" />\n </el-button>\n </span>\n <el-dropdown-menu slot=\"dropdown\">\n <el-dropdown-item\n v-for=\"(action, index) in visibleDropDownActions\"\n :key=\"`dropdown-${index}`\"\n :command=\"index\"\n :disabled=\"action.disabled\"\n :divided=\"!!action.divider\"\n >\n <span class=\"ecp-table-action__dropdown-item\">\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </el-dropdown>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { MessageBox } from 'element-ui'\nimport type { TableActionItem } from './types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst props = withDefaults(\n defineProps<{\n actions?: TableActionItem[]\n dropDownActions?: TableActionItem[]\n /** 是否阻止按钮 click 冒泡,参考 VbenAdmin stopButtonPropagation */\n stopButtonPropagation?: boolean\n }>(),\n {\n actions: () => [],\n dropDownActions: () => [],\n stopButtonPropagation: false,\n }\n)\n\nconst normalizeTooltip = (tooltip?: TableActionItem['tooltip']) => {\n return normalizeTooltipConfig(tooltip) || {}\n}\n\nconst getButtonType = (action: TableActionItem) => {\n if (action.type) return action.type\n if (action.color === 'error') return 'danger'\n if (action.color === 'success') return 'success'\n if (action.color === 'warning') return 'warning'\n return 'text'\n}\n\nconst filterVisible = (list: TableActionItem[]) =>\n list.filter((item) => {\n const { ifShow } = item\n if (typeof ifShow === 'boolean') return ifShow\n if (typeof ifShow === 'function') return ifShow(item)\n return true\n })\n\nconst visibleActions = computed(() => filterVisible(props.actions || []))\nconst visibleDropDownActions = computed(() => filterVisible(props.dropDownActions || []))\n\nconst handleClick = (action: TableActionItem, e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n action.onClick?.(e)\n}\n\nconst handleActionClick = (action: TableActionItem, e: MouseEvent) => {\n handleClick(action, e)\n}\n\nconst handlePopConfirm = (action: TableActionItem, type: 'confirm' | 'cancel', e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n if (!action.popConfirm) return\n if (type === 'confirm') {\n action.popConfirm.confirm?.()\n } else {\n action.popConfirm.cancel?.()\n }\n}\n\nconst handlePopConfirmConfirm = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'confirm', e)\n}\n\nconst handlePopConfirmCancel = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'cancel', e)\n}\n\nconst handleDropdownCommand = (index: number | string) => {\n const idx = Number(index)\n const action = visibleDropDownActions.value[idx]\n if (!action || action.disabled) return\n if (action.popConfirm) {\n const title = action.popConfirm.title\n const okText = action.popConfirm.okText || '确定'\n const cancelText = action.popConfirm.cancelText || '取消'\n MessageBox.confirm(title, '提示', {\n confirmButtonText: okText,\n cancelButtonText: cancelText,\n type: 'warning',\n })\n .then(() => action.popConfirm?.confirm?.())\n .catch(() => action.popConfirm?.cancel?.())\n return\n }\n action.onClick?.({} as MouseEvent)\n}\n</script>\n\n<style scoped>\n.ecp-table-action {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__icon {\n margin-right: 4px;\n}\n.ecp-table-action__more {\n display: inline-flex;\n align-items: center;\n}\n.ecp-table-action__dropdown-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProTableProps, TableActionType } from './types'\n\nexport type UseProTableReturn = [\n (instance: TableActionType) => void,\n TableActionType\n]\n\n/** 支持 ref/computed 的 props */\nexport type UseProTablePropsReactive = ProTableProps | Ref<ProTableProps | undefined>\n\n/**\n * 用于 ProTable 的 useProTable,支持通过 ref 调用表格方法\n * @param props ProTable 的 props 配置,传入后会通过 setProps 同步到表格(支持 ref/computed 响应式更新)\n */\nexport function useProTable(props?: UseProTablePropsReactive): UseProTableReturn {\n const tableActionRef = ref<TableActionType | null>(null)\n\n const getTableProps = (): ProTableProps | undefined =>\n (props ? unref(props as Ref<ProTableProps | undefined>) : undefined) as ProTableProps | undefined\n\n const getTableAction = (): TableActionType => {\n const action = unref(tableActionRef)\n if (!action) {\n throw new Error('ProTable instance has not been registered')\n }\n return action\n }\n\n const register = (instance: TableActionType) => {\n tableActionRef.value = instance\n const tableProps = getTableProps()\n if (tableProps && Object.keys(tableProps).length > 0) {\n instance.setProps(tableProps)\n }\n }\n\n if (props) {\n watch(\n () => getTableProps(),\n (tableProps) => {\n if (tableProps && tableActionRef.value) {\n tableActionRef.value.setProps(tableProps)\n }\n },\n { deep: true }\n )\n }\n\n const tableActions: UseProTableReturn[1] = {\n setProps: (p) => getTableAction().setProps(p),\n reload: (opt) => getTableAction().reload(opt),\n redoHeight: () => getTableAction().redoHeight(),\n setLoading: (v) => getTableAction().setLoading(v),\n getDataSource: () => getTableAction().getDataSource(),\n getRawDataSource: () => getTableAction().getRawDataSource(),\n setTableData: (data) => getTableAction().setTableData(data),\n getColumns: () => getTableAction().getColumns(),\n setColumns: (cols) => getTableAction().setColumns(cols),\n setPagination: (info) => getTableAction().setPagination(info),\n getSelectRowKeys: () => getTableAction().getSelectRowKeys(),\n getSelectRows: () => getTableAction().getSelectRows(),\n clearSelectedRowKeys: () => getTableAction().clearSelectedRowKeys(),\n setSelectedRowKeys: (keys) => getTableAction().setSelectedRowKeys(keys),\n deleteSelectRowByKey: (key) => getTableAction().deleteSelectRowByKey(key),\n updateTableData: (index, key, value) => getTableAction().updateTableData(index, key, value),\n updateTableDataRecord: (rowKey, record) => getTableAction().updateTableDataRecord(rowKey, record),\n deleteTableDataRecord: (rowKey) => getTableAction().deleteTableDataRecord(rowKey),\n insertTableDataRecord: (record, index) => getTableAction().insertTableDataRecord(record, index),\n getPaginationRef: () => getTableAction().getPaginationRef(),\n getShowPagination: () => getTableAction().getShowPagination(),\n setShowPagination: (show) => getTableAction().setShowPagination(show),\n getRowSelection: () => getTableAction().getRowSelection(),\n expandAll: () => getTableAction().expandAll?.(),\n collapseAll: () => getTableAction().collapseAll?.(),\n }\n\n return [register, tableActions]\n}\n","<template>\n <el-select v-bind=\"{ ...$attrs, value: value, placeholder, disabled, loading, clearable, filterable, multiple }\"\n @input=\"$emit('input', $event)\" @change=\"$emit('change', $event)\" @visible-change=\"onVisibleChange\">\n <el-option v-for=\"opt in options\" :key=\"String(opt.value)\" :label=\"opt.label\" :value=\"opt.value\" />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 拉取选项的接口,返回 Promise<Array<{ label, value }>> 或 { list: [] };可接收当前 params 作为参数 */\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n /** 请求参数,变化时会重新拉取 options */\n params?: Record<string, unknown>\n /** 是否懒加载:为 true 时在展开下拉时再请求数据,不在挂载时请求 */\n lazy?: boolean\n /** 接口返回列表中「标签」字段名,默认 'label' */\n labelField?: string\n /** 接口返回列表中「值」字段名,默认 'value' */\n valueField?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n filterable?: boolean\n multiple?: boolean\n }>(),\n { labelField: 'label', valueField: 'value', lazy: false }\n)\n\ndefineEmits<{ (e: 'input', value: unknown): void; (e: 'change', value: unknown): void }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\nconst rawOptions = ref<unknown[]>([])\n\nconst sortStringify = (obj: unknown): string => {\n if (obj === null || obj === undefined) return 'null'\n return JSON.stringify(sortKeys(obj))\n}\n\nconst sortKeys = (obj: unknown): unknown => {\n if (Array.isArray(obj)) return obj.map(sortKeys)\n if (obj !== null && typeof obj === 'object') {\n return Object.keys(obj as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeys((obj as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n return obj\n}\n\nconst lastFetchedParamsKey = ref<string>(sortStringify(props.params ?? null))\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) {\n const paramsKey = sortStringify(props.params ?? null)\n if (paramsKey !== lastFetchedParamsKey.value || options.value.length === 0) {\n fetchOptions()\n }\n }\n}\n\nconst fetchOptions = async () => {\n if (!props.api) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n rawOptions.value = raw\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n options.value = raw.map((item: unknown) => {\n const o = item as Record<string, unknown>\n return {\n label: String(o[labelKey] ?? o.label ?? ''),\n value: o[valueKey] ?? o.value,\n }\n })\n lastFetchedParamsKey.value = sortStringify(props.params ?? null)\n } finally {\n loading.value = false\n }\n}\n\ndefineExpose({\n options,\n rawOptions,\n loading,\n fetchOptions,\n})\n\nonMounted(() => {\n if (!props.lazy) fetchOptions()\n})\nwatch(() => props.api, () => { \n if (!props.lazy) {\n fetchOptions()\n } else {\n options.value = []\n rawOptions.value = []\n }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n const newKey = sortStringify(props.params ?? null)\n if (newKey === lastFetchedParamsKey.value) return\n if (props.lazy) {\n options.value = []\n rawOptions.value = []\n } else {\n fetchOptions()\n }\n}, { deep: true })\n</script>\n","/** 进位方式:向下取整、向上取整、四舍五入 */\nexport type FormattedNumberRounding = 'floor' | 'ceil' | 'round'\n\n/** 仅保留数字、至多一个小数点、可选前导负号 */\nexport function sanitizeNumericInput(raw: string): string {\n const t = raw.trim()\n if (!t) return ''\n let i = 0\n let res = ''\n if (t[0] === '-') {\n res = '-'\n i = 1\n }\n let dot = false\n for (; i < t.length; i++) {\n const c = t[i]\n if (c >= '0' && c <= '9') {\n res += c\n continue\n }\n if (c === '.' && !dot) {\n dot = true\n if (res === '' || res === '-') res += '0'\n res += '.'\n }\n }\n return res\n}\n\nexport function stripNumberGrouping(s: string): string {\n return s.replace(/,/g, '').trim()\n}\n\n/**\n * 对已清洗的数字串按整数位、小数位截断输入长度(inputLimit 为 true 时使用)。\n * 整数部分至多 integerDigits 位,小数部分至多 decimalPlaces 位;保留末尾仅小数点(如 `12.`)以便继续输入。\n */\nexport function applyNumericInputDigitLimits(\n sanitized: string,\n integerDigits: number,\n decimalPlaces: number\n): string {\n if (!sanitized || sanitized === '-') return sanitized\n const neg = sanitized[0] === '-'\n let body = neg ? sanitized.slice(1) : sanitized\n const dotIdx = body.indexOf('.')\n if (dotIdx === -1) {\n const maxInt = Math.max(0, integerDigits)\n body = maxInt > 0 ? body.slice(0, maxInt) : body\n return neg ? '-' + body : body\n }\n let intPart = body.slice(0, dotIdx)\n if (integerDigits > 0) {\n intPart = intPart.slice(0, integerDigits)\n }\n const afterDot = body.slice(dotIdx + 1)\n const endsWithDot = afterDot === '' && body.endsWith('.')\n if (decimalPlaces <= 0) {\n return neg ? '-' + intPart : intPart\n }\n if (endsWithDot) {\n return (neg ? '-' : '') + intPart + '.'\n }\n const decPart = afterDot.slice(0, decimalPlaces)\n return (neg ? '-' : '') + intPart + '.' + decPart\n}\n\nfunction maxAbsValue(integerDigits: number, decimalPlaces: number): number {\n const maxInt = Math.pow(10, integerDigits) - 1\n if (decimalPlaces <= 0) return maxInt\n return maxInt + (1 - Math.pow(10, -decimalPlaces))\n}\n\n/** 按整数位数上限约束绝对值 */\nexport function clampByIntegerDigits(\n value: number,\n integerDigits: number,\n decimalPlaces: number\n): number {\n const max = maxAbsValue(integerDigits, decimalPlaces)\n const sign = value < 0 ? -1 : 1\n const abs = Math.abs(value)\n if (abs <= max) return value\n return sign * max\n}\n\nexport function roundToDecimals(\n value: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n if (decimalPlaces <= 0) {\n switch (rounding) {\n case 'floor':\n return Math.floor(value)\n case 'ceil':\n return Math.ceil(value)\n default:\n return Math.round(value)\n }\n }\n const factor = Math.pow(10, decimalPlaces)\n const x = value * factor\n let y: number\n switch (rounding) {\n case 'floor':\n y = Math.floor(x)\n break\n case 'ceil':\n y = Math.ceil(x)\n break\n default:\n y = Math.round(x)\n }\n return y / factor\n}\n\n/**\n * 解析 → 按整数位夹紧 → 按小数位与进位方式舍入 → 再夹紧(防止舍入后越界)\n */\nexport function normalizeNumericValue(\n value: number,\n integerDigits: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n let v = clampByIntegerDigits(value, integerDigits, decimalPlaces)\n v = roundToDecimals(v, decimalPlaces, rounding)\n v = clampByIntegerDigits(v, integerDigits, decimalPlaces)\n return v\n}\n\n/**\n * 固定小数位数字符串(无千分位),用于表单存值以保留配置的小数位数(number 无法保留尾随 0)。\n */\nexport function toFixedDecimalString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n return value.toFixed(Math.max(0, decimalPlaces))\n}\n\n/** 千分位格式化展示(整数部分),小数部分固定 m 位 */\nexport function formatWithThousands(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n const fixed = value.toFixed(Math.max(0, decimalPlaces))\n const neg = fixed.startsWith('-')\n const body = neg ? fixed.slice(1) : fixed\n const [intPart, decPart] = body.split('.')\n const withSep = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n if (decimalPlaces <= 0 || decPart === undefined) return (neg ? '-' : '') + withSep\n return (neg ? '-' : '') + withSep + '.' + decPart\n}\n\n/** 编辑态:无千分位,去掉多余尾部 0(在 m 位精度内) */\nexport function numberToEditString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n let s = value.toFixed(Math.max(0, decimalPlaces))\n s = s.replace(/(\\.\\d*?)0+$/, '$1')\n s = s.replace(/\\.$/, '')\n return s\n}\n","<template>\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n v-bind=\"$attrs\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { FormattedNumberRounding } from '../utils/formattedNumber'\nimport {\n applyNumericInputDigitLimits,\n formatWithThousands,\n normalizeNumericValue,\n numberToEditString,\n sanitizeNumericInput,\n stripNumberGrouping,\n toFixedDecimalString,\n} from '../utils/formattedNumber'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n placeholder?: string\n disabled?: boolean\n /** 整数部分允许的最大位数,默认 5 */\n integerDigits?: number\n /** 小数保留位数,默认 6 */\n decimalPlaces?: number\n /** 进位方式,默认四舍五入 */\n rounding?: FormattedNumberRounding\n /**\n * 为 true 时在输入过程中按 integerDigits / decimalPlaces 限制可输入位数;\n * 为 false 时仅失焦后规范化,输入阶段不截断长度。\n */\n inputLimit?: boolean\n }>(),\n {\n integerDigits: 6,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst focused = ref(false)\nconst displayText = ref('')\n\nconst intN = () => Math.max(0, Math.floor(props.integerDigits ?? 6))\nconst decM = () => Math.max(0, Math.floor(props.decimalPlaces ?? 6))\n\nfunction parseExternalToNumber(v: unknown): number | null {\n if (v === null || v === undefined || v === '') return null\n if (typeof v === 'number') {\n return Number.isFinite(v) ? v : null\n }\n const s = stripNumberGrouping(String(v))\n if (s === '' || s === '-') return null\n const num = Number(s)\n return Number.isFinite(num) ? num : null\n}\n\nfunction syncDisplayFromValue() {\n if (focused.value) return\n const num = parseExternalToNumber(props.value)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = formatWithThousands(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nwatch(\n () => [props.value, props.integerDigits, props.decimalPlaces, props.rounding],\n () => syncDisplayFromValue(),\n { immediate: true, deep: true }\n)\n\nfunction emitStoredValue(normalized: number) {\n emit('input', toFixedDecimalString(normalized, decM()))\n}\n\nfunction onInput(val: string) {\n let clean = sanitizeNumericInput(val)\n if (props.inputLimit !== false) {\n clean = applyNumericInputDigitLimits(clean, intN(), decM())\n }\n displayText.value = clean\n if (clean === '' || clean === '-') return\n const num = Number(clean)\n if (!Number.isFinite(num)) return\n const normalized = normalizeNumericValue(num, intN(), decM(), props.rounding)\n emitStoredValue(normalized)\n}\n\nfunction onFocus() {\n focused.value = true\n const raw = stripNumberGrouping(displayText.value)\n const num = parseExternalToNumber(raw === '' ? props.value : raw)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = numberToEditString(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nfunction onBlur() {\n focused.value = false\n const raw = stripNumberGrouping(displayText.value)\n if (raw === '' || raw === '-') {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const parsed = Number(sanitizeNumericInput(raw))\n if (!Number.isFinite(parsed)) {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const final = normalizeNumericValue(parsed, intN(), decM(), props.rounding)\n displayText.value = formatWithThousands(final, decM())\n emitStoredValue(final)\n}\n</script>\n","<template>\n <div class=\"ecp-tree-select\" ref=\"rootRef\">\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :clearable=\"clearable\"\n readonly\n suffix-icon=\"el-icon-arrow-down\"\n class=\"ecp-tree-select__input\"\n @focus=\"openDropdown\"\n @clear=\"clearValue\"\n />\n <transition name=\"el-zoom-in-top\">\n <div v-show=\"dropdownVisible\" class=\"ecp-tree-select__dropdown\">\n <div v-if=\"filterable\" class=\"ecp-tree-select__filter-inner\">\n <el-input\n v-model=\"filterText\"\n size=\"small\"\n placeholder=\"搜索节点\"\n prefix-icon=\"el-icon-search\"\n clearable\n @click.native.stop\n />\n </div>\n <el-tree\n v-show=\"!loading\"\n ref=\"treeRef\"\n :data=\"treeData\"\n :props=\"treeProps\"\n :node-key=\"valueField\"\n :filter-node-method=\"filterable ? filterNodeMethod : undefined\"\n :highlight-current=\"true\"\n default-expand-all\n @node-click=\"onNodeClick\"\n />\n <div v-if=\"loading\" class=\"ecp-tree-select__loading\">\n <i class=\"el-icon-loading\" /> 加载中...\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, nextTick } from 'vue'\n\ninterface TreeNode {\n label?: string\n value?: unknown\n children?: TreeNode[]\n [key: string]: unknown\n}\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 树数据,直接传入时优先使用,不请求 api */\n treeData?: unknown[]\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n params?: Record<string, unknown>\n lazy?: boolean\n labelField?: string\n valueField?: string\n childrenField?: string\n filterable?: boolean\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n }>(),\n {\n labelField: 'label',\n valueField: 'value',\n childrenField: 'children',\n lazy: false,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst rootRef = ref<HTMLElement>()\nconst treeRef = ref()\nconst dropdownVisible = ref(false)\nconst loading = ref(false)\nconst filterText = ref('')\nconst treeData = ref<TreeNode[]>([])\nconst flatLabelMap = ref<Record<string, string>>({})\n\nconst treeProps = computed(() => ({\n label: props.labelField,\n children: props.childrenField,\n}))\n\nfunction normalizeNode(node: Record<string, unknown>): TreeNode {\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n const children = node[childrenKey] as unknown[]\n const out: TreeNode = {}\n out[props.labelField ?? 'label'] = node[labelKey] ?? node.label\n out[props.valueField ?? 'value'] = node[valueKey] ?? node.value\n if (Array.isArray(children) && children.length) {\n out[props.childrenField ?? 'children'] = children.map((c) => normalizeNode(c as Record<string, unknown>))\n }\n return out\n}\n\nfunction buildFlatLabelMap(nodes: TreeNode[], prefix = ''): Record<string, string> {\n const map: Record<string, string> = {}\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n for (const node of nodes) {\n const label = String(node[labelKey] ?? node.label ?? '')\n const value = node[valueKey] ?? node.value\n if (value !== undefined && value !== null) {\n map[String(value)] = prefix ? prefix + ' / ' + label : label\n }\n const children = node[childrenKey] ?? node.children\n if (Array.isArray(children) && children.length) {\n Object.assign(map, buildFlatLabelMap(children as TreeNode[], label))\n }\n }\n return map\n}\n\nfunction hasTreeDataProp() {\n const td = props.treeData\n return Array.isArray(td) && td.length > 0\n}\n\nfunction applyTreeData(nodes: TreeNode[]) {\n treeData.value = nodes\n flatLabelMap.value = buildFlatLabelMap(nodes)\n}\n\nfunction syncFromTreeDataProp() {\n const td = props.treeData\n if (!Array.isArray(td) || td.length === 0) return\n const normalized = td.map((item) => normalizeNode(item as Record<string, unknown>))\n applyTreeData(normalized)\n}\n\nconst displayText = computed(() => {\n if (props.value == null || props.value === '') return ''\n return flatLabelMap.value[String(props.value)] ?? String(props.value)\n})\n\nconst filterNodeMethod = (value: string, data: TreeNode) => {\n if (!value) return true\n const labelKey = props.labelField ?? 'label'\n const label = String(data[labelKey] ?? data.label ?? '')\n return label.toLowerCase().includes(value.toLowerCase())\n}\n\nwatch(filterText, (val) => {\n treeRef.value?.filter(val)\n})\n\nlet clickOutsideHandler: ((e: MouseEvent) => void) | null = null\n\nfunction openDropdown() {\n if (props.disabled) return\n dropdownVisible.value = true\n if (props.lazy && !hasTreeDataProp()) fetchData()\n nextTick(() => {\n clickOutsideHandler = (e: MouseEvent) => {\n if (rootRef.value && !rootRef.value.contains(e.target as Node)) {\n closeDropdown()\n }\n }\n document.addEventListener('click', clickOutsideHandler)\n })\n}\n\nfunction closeDropdown() {\n dropdownVisible.value = false\n filterText.value = ''\n if (clickOutsideHandler) {\n document.removeEventListener('click', clickOutsideHandler)\n clickOutsideHandler = null\n }\n}\n\nfunction clearValue() {\n emit('input', undefined)\n}\n\nfunction onNodeClick(data: TreeNode) {\n const valueKey = props.valueField ?? 'value'\n const val = data[valueKey] ?? data.value\n emit('input', val)\n closeDropdown()\n}\n\nasync function fetchData() {\n if (!props.api || hasTreeDataProp()) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n treeData.value = raw.map((item) => normalizeNode(item as Record<string, unknown>))\n flatLabelMap.value = buildFlatLabelMap(treeData.value)\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else if (!props.lazy) {\n fetchData()\n }\n})\n\nwatch(() => props.treeData, () => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else {\n treeData.value = []\n flatLabelMap.value = {}\n if (!props.lazy && props.api) fetchData()\n }\n}, { deep: true })\n\nwatch(() => props.api, () => {\n if (hasTreeDataProp()) return\n if (!props.lazy) fetchData()\n else { treeData.value = []; flatLabelMap.value = {} }\n}, { deep: true })\n\nwatch(() => props.params, () => {\n if (hasTreeDataProp()) return\n if (props.lazy) { treeData.value = []; flatLabelMap.value = {} }\n else fetchData()\n}, { deep: true })\n</script>\n\n<style scoped>\n.ecp-tree-select {\n position: relative;\n width: 100%;\n}\n.ecp-tree-select__filter-inner {\n margin-bottom: 8px;\n}\n.ecp-tree-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 280px;\n overflow: auto;\n background: #fff;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n margin-top: 4px;\n z-index: 1000;\n padding: 8px;\n}\n.ecp-tree-select__loading {\n padding: 24px;\n text-align: center;\n color: #909399;\n font-size: 14px;\n}\n</style>\n","<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n :label-width=\"schema.labelWidth\"\n >\n <template slot=\"label\">\n <span>\n {{ schema.label }}<span v-if=\"showColon\" class=\"ecp-pro-form-item__colon\">:</span>\n </span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <!-- 自定义 component:组件名或内联组件 -->\n <component :is=\"fieldWrapperComponent\" v-bind=\"fieldWrapperProps\">\n <component\n v-if=\"resolvedCustomComponent\"\n :is=\"resolvedCustomComponent\"\n :value=\"formModel[schema.field]\"\n @input=\"setFieldValue\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input\n v-else-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <FormattedNumberInput\n v-else-if=\"schema.component === 'formatted-number'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <ApiSelect\n v-else-if=\"schema.component === 'api-select'\"\n ref=\"apiSelectRef\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <TreeSelect\n v-else-if=\"schema.component === 'tree-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </component>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h, ref, onMounted, onUnmounted } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport FormattedNumberInput from './FormattedNumberInput.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-number',\n 'formatted-number',\n 'switch', 'cascader', 'checkbox', 'radio',\n])\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n colon?: boolean\n formActionType?: import('../types').FormActionType\n onFieldChange?: (field: string, value: unknown) => void\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\n /** 注册字段实例(由 ProForm 传入) */\n registerFieldInstance?: (field: string, instance: Record<string, unknown> | null) => void\n}>()\n\n/** ApiSelect 组件实例 ref */\nconst apiSelectRef = ref<Record<string, unknown> | null>(null)\n\nonMounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, apiSelectRef.value)\n }\n})\n\nonUnmounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, null)\n }\n})\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\nconst showColon = computed(() => props.schema.colon ?? props.colon ?? false)\n\nconst normalizedTooltip = computed(() => {\n const tooltip = props.schema.tooltip\n if (!tooltip) return null\n const resolved = typeof tooltip === 'function' ? tooltip(renderParams.value) : tooltip\n return normalizeTooltipConfig(resolved, props.formModel[props.schema.field])\n})\n\nconst fieldWrapperComponent = computed(() => normalizedTooltip.value ? 'el-tooltip' : 'span')\nconst fieldWrapperProps = computed(() => normalizedTooltip.value || {})\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst resolvedCustomComponent = computed(() => {\n const c = props.schema.component\n if (c == null) return null\n if (typeof c === 'string') {\n if (BUILT_IN_COMPONENTS.has(c)) return null\n return (props.customComponents && props.customComponents[c]) || c\n }\n return c\n})\n\nconst setFieldValue = (v: unknown) => {\n props.onFieldChange?.(props.schema.field, v)\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style scoped>\n.ecp-pro-form-item__colon {\n margin-right: 2px;\n}\n\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"currentFormModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"currentFormModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\" :colon=\"effectiveProps.colon\"\n :custom-components=\"formCustomComponents\" :on-field-change=\"handleFieldChange\"\n :register-field-instance=\"registerFieldInstance\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"currentFormModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"currentFormModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners, ApiSelectInstance } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n modelValue?: Record<string, unknown>\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n colon?: boolean\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n /** 自定义组件映射(组件名 -> 组件),供 schema.component 使用 */\n components?: Record<string, unknown>\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n colon: true,\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '查询',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n (e: 'update:modelValue', values: Record<string, unknown>): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n/** 字段名 -> 组件实例映射(用于获取 api-select 等组件的内部状态) */\nconst fieldInstanceMap = ref<Map<string, ComponentPublicInstance>>(new Map())\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProForm'), ...props, ...innerProps.value }))\nconst controlledModelValue = computed(() => effectiveProps.value.modelValue)\nconst isControlled = computed(() => controlledModelValue.value !== undefined)\nconst currentFormModel = computed<Record<string, unknown>>(() => {\n return isControlled.value\n ? (controlledModelValue.value ?? {})\n : formModel.value\n})\n/** 传给 ProFormItem 的自定义组件映射:显式合并 setSetting 与 props,避免响应式代理导致组件引用丢失 */\nconst formCustomComponents = computed(() => ({\n ...(getComponentSetting('ProForm').components as Record<string, unknown> | undefined) ?? {},\n ...(effectiveProps.value.components ?? {}),\n ...(innerProps.value.components ?? {}),\n}))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n/**\n * \n * @param baseModel \n * @param preserveExisting \n */\nconst resolveSchemaModel = (baseModel?: Record<string, unknown>, preserveExisting = true) => {\n const nextModel = preserveExisting ? { ...(baseModel ?? {}) } : {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n if (preserveExisting && Object.prototype.hasOwnProperty.call(nextModel, schema.field)) return\n if (schema.defaultValue !== undefined) {\n nextModel[schema.field] = schema.defaultValue\n return\n }\n if (initialValues && Object.prototype.hasOwnProperty.call(initialValues, schema.field)) {\n nextModel[schema.field] = initialValues[schema.field]\n }\n })\n return nextModel\n}\n\nconst applyFormModel = (nextModel: Record<string, unknown>, shouldEmit = true) => {\n formModel.value = nextModel\n if (shouldEmit) emit('update:modelValue', nextModel)\n}\n\nconst updateFormModel = (values: Record<string, unknown>) => {\n const nextModel = resolveSchemaModel({ ...currentFormModel.value, ...values })\n applyFormModel(nextModel)\n return nextModel\n}\n\nconst initForm = () => {\n const rules: Record<string, unknown[]> = {}\n innerSchemas.value.forEach((schema) => {\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n applyFormModel(resolveSchemaModel(currentFormModel.value), false)\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...currentFormModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n updateFormModel(values)\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...currentFormModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n applyFormModel(resolveSchemaModel(undefined, false))\n}\n\nconst handleFieldChange = (field: string, value: unknown) => {\n updateFormModel({ [field]: value })\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n initForm()\n }\n}\n\n/** 注册组件实例(供 ProFormItem 调用) */\nconst registerFieldInstance = (field: string, instance: Record<string, unknown> | null) => {\n if (instance) {\n fieldInstanceMap.value.set(field, instance as unknown as ComponentPublicInstance)\n } else {\n fieldInstanceMap.value.delete(field)\n }\n}\n\n/** 获取指定字段的组件实例 */\nconst getComponentInstance = (field: string): ComponentPublicInstance | null => {\n return fieldInstanceMap.value.get(field) ?? null\n}\n\n/** 获取 api-select 字段的 options,raw=true 时返回接口原始数据 */\nfunction getFieldOptions(field: string): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: true): unknown[]\nfunction getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return []\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n if (raw) {\n return apiSelectInstance?.rawOptions ?? []\n }\n return apiSelectInstance?.options ?? []\n}\n\n/** 获取 api-select 字段的加载状态 */\nconst isFieldLoading = (field: string): boolean => {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return false\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n return apiSelectInstance?.loading ?? false\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n}\n\ndefineExpose({\n ...formActionRef,\n registerFieldInstance,\n})\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => controlledModelValue.value, (value) => {\n if (!isControlled.value || value === undefined) return\n applyFormModel(resolveSchemaModel(value), false)\n}, { deep: true, immediate: true })\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style scoped>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form .ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n getComponentInstance: FormActionType['getComponentInstance']\n getFieldOptions: FormActionType['getFieldOptions']\n isFieldLoading: FormActionType['isFieldLoading']\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const getComponentInstance: FormActionType['getComponentInstance'] = (field) =>\n formAction.value?.getComponentInstance(field) ?? null\n\n function getFieldOptions(field: string): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: true): unknown[]\n function getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n if (!formAction.value) return []\n if (raw) return formAction.value.getFieldOptions(field, true)\n return formAction.value.getFieldOptions(field)\n }\n\n const isFieldLoading: FormActionType['isFieldLoading'] = (field) =>\n formAction.value?.isFieldLoading(field) ?? false\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n }\n\n return [register, result]\n}\n","<template>\n <div class=\"ecp-pro-descriptions\">\n <div v-if=\"showHeader\" class=\"ecp-pro-descriptions__header\">\n <div class=\"ecp-pro-descriptions__title-wrap\">\n <span v-if=\"effectiveProps.title\" class=\"ecp-pro-descriptions__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-descriptions__help\" />\n </el-tooltip>\n <el-tooltip v-if=\"effectiveProps.collapseOptions?.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.collapseOptions.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.collapseOptions.helpMessage\" :key=\"`collapse-${index}`\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.collapseOptions.helpMessage }}</span>\n </template>\n <i class=\"el-icon-info ecp-pro-descriptions__help\" />\n </el-tooltip>\n </div>\n <el-button\n v-if=\"showCollapseButton\"\n type=\"text\"\n class=\"ecp-pro-descriptions__toggle\"\n @click=\"expanded = !expanded\"\n >\n {{ expanded ? collapseButtonText.collapse : collapseButtonText.expand }}\n <i class=\"el-icon-arrow-down\" :class=\"expanded ? 'is-expanded' : ''\" />\n </el-button>\n </div>\n\n <div\n class=\"ecp-pro-descriptions__body\"\n :class=\"[\n `is-${effectiveProps.size}`,\n { 'is-bordered': effectiveProps.bordered, 'is-collapsed': showCollapseButton && !expanded },\n ]\"\n :style=\"bodyStyle\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"(row, rowIndex) in renderedRows\">\n <template v-for=\"item in row.items\">\n <div\n :key=\"`${rowIndex}-${item.dataIndex || item.field}`\"\n class=\"ecp-pro-descriptions__item\"\n :style=\"getItemStyle(item)\"\n >\n <div class=\"ecp-pro-descriptions__label\" :style=\"getLabelStyle(item)\">\n {{ item.label }}\n </div>\n <div class=\"ecp-pro-descriptions__content\" :style=\"getContentStyle(item)\">\n <slot\n v-if=\"$scopedSlots[item.slot || item.dataIndex]\"\n :name=\"item.slot || item.dataIndex\"\n :value=\"getItemValue(item)\"\n :record=\"effectiveData\"\n :schema=\"item\"\n />\n <DescriptionValueRenderer v-else :schema=\"item\" :value=\"getItemValue(item)\" :record=\"effectiveData\" :empty-text=\"effectiveProps.emptyText || '-'\" />\n </div>\n </div>\n </template>\n </template>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\nimport type {\n DescriptionActionType,\n DescriptionColumn,\n DescriptionProps,\n DescriptionSchema,\n} from '../types'\n\ninterface NormalizedRow {\n items: Array<DescriptionSchema & { _span: number }>\n}\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n helpMessage?: string | string[]\n size?: 'medium' | 'small'\n bordered?: boolean\n column?: DescriptionColumn\n schema?: DescriptionSchema[]\n data?: Record<string, unknown>\n emptyText?: string\n useCollapse?: boolean\n collapseOptions?: {\n canExpand?: boolean\n defaultExpand?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n helpMessage?: string | string[]\n visibleRows?: number\n }\n }>(),\n {\n size: 'medium',\n bordered: true,\n column: () => ({ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }),\n schema: () => [],\n data: () => ({}),\n emptyText: '-',\n useCollapse: false,\n collapseOptions: () => ({ canExpand: false, defaultExpand: true, expandButtonText: '展开', collapseButtonText: '收起', visibleRows: 1 }),\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: DescriptionActionType): void\n}>()\n\nconst innerProps = ref<Partial<DescriptionProps>>({})\nconst innerData = ref<Record<string, unknown>>({})\nconst innerSchema = ref<DescriptionSchema[]>([])\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\nconst expanded = ref(true)\n\nconst DescriptionValueRenderer = defineComponent({\n name: 'EcpDescriptionValueRenderer',\n props: {\n schema: { type: Object, required: true },\n value: { required: false },\n record: { type: Object, required: true },\n emptyText: { type: String, default: '-' },\n },\n setup(rendererProps) {\n return () => {\n const schema = rendererProps.schema as DescriptionSchema\n const record = rendererProps.record as Record<string, unknown>\n const value = rendererProps.value\n\n const renderTextNode = (text: string) => {\n const tooltipProps = normalizeTooltip(schema, text === rendererProps.emptyText ? value : text, record)\n const contentNode = h('span', text)\n if (!tooltipProps) return contentNode\n return h('el-tooltip', { props: tooltipProps }, [contentNode])\n }\n\n if (schema.render) {\n const rendered = schema.render(value, record)\n if (rendered == null || rendered === '') return renderTextNode(rendererProps.emptyText)\n if (typeof rendered === 'string' || typeof rendered === 'number') return renderTextNode(String(rendered))\n return rendered as never\n }\n\n if (Array.isArray(value)) {\n return renderTextNode(value.length ? value.join(', ') : rendererProps.emptyText)\n }\n\n if (value === null || value === undefined || value === '') {\n return renderTextNode(rendererProps.emptyText)\n }\n\n if (typeof value === 'object') {\n return renderTextNode(JSON.stringify(value))\n }\n\n return renderTextNode(String(value))\n }\n },\n})\n\nconst normalizeTooltip = (schema: DescriptionSchema, value: unknown, record: Record<string, unknown>) => {\n const tooltip = schema.tooltip\n if (!tooltip) return null\n\n const resolved = typeof tooltip === 'function'\n ? tooltip({ value, record, schema })\n : tooltip\n return normalizeTooltipConfig(resolved, value)\n}\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<DescriptionProps>('ProDescriptions', { ...props, ...innerProps.value }))\n\nconst breakpoints = { xxl: 1920, xl: 1200, lg: 992, md: 768, sm: 576 }\n\nconst resolveColumn = (column: DescriptionColumn | undefined, width: number) => {\n if (typeof column === 'number') return Math.max(1, column)\n const value = column ?? {}\n if (width >= breakpoints.xxl) return value.xxl ?? value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.xl) return value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.lg) return value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.md) return value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.sm) return value.sm ?? value.xs ?? 2\n return value.xs ?? 1\n}\n\nconst currentColumn = computed(() => resolveColumn(effectiveProps.value.column, windowWidth.value))\nconst effectiveData = computed(() => effectiveProps.value.data ?? innerData.value ?? {})\n\nconst visibleSchema = computed(() => {\n return (innerSchema.value.length ? innerSchema.value : effectiveProps.value.schema ?? []).filter((item) => {\n const key = item.dataIndex || item.field\n if (!key) return false\n if (typeof item.show === 'function') {\n return item.show(effectiveData.value)\n }\n return item.show !== false\n }).map((item) => ({\n ...item,\n dataIndex: item.dataIndex || item.field || '',\n }))\n})\n\nconst normalizedRows = computed<NormalizedRow[]>(() => {\n const rows: NormalizedRow[] = []\n let currentRow: NormalizedRow = { items: [] }\n let used = 0\n const totalColumn = currentColumn.value\n visibleSchema.value.forEach((item, index) => {\n const remainingItems = visibleSchema.value.length - index\n const requested = Math.max(1, Math.min(item.span ?? 1, totalColumn))\n const span = remainingItems === 1 ? totalColumn - used || totalColumn : requested\n if (used + span > totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n const normalizedSpan = remainingItems === 1 && used < totalColumn ? Math.max(1, totalColumn - used) : span\n currentRow.items.push({ ...item, _span: normalizedSpan })\n used += normalizedSpan\n if (used >= totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n })\n if (currentRow.items.length > 0) rows.push(currentRow)\n return rows\n})\n\nconst renderedRows = computed(() => {\n if (!showCollapseButton.value || expanded.value) return normalizedRows.value\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return normalizedRows.value.slice(0, visibleRows)\n})\n\nconst showCollapseButton = computed(() => {\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return !!effectiveProps.value.useCollapse && !!effectiveProps.value.collapseOptions?.canExpand && normalizedRows.value.length > visibleRows\n})\nconst showHeader = computed(() => !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || showCollapseButton.value)\nconst collapseButtonText = computed(() => ({\n expand: effectiveProps.value.collapseOptions?.expandButtonText ?? '展开',\n collapse: effectiveProps.value.collapseOptions?.collapseButtonText ?? '收起',\n}))\n\nconst bodyStyle = computed(() => ({\n gridTemplateColumns: `repeat(${currentColumn.value}, minmax(0, 1fr))`,\n}))\n\nconst getItemStyle = (item: DescriptionSchema & { _span: number }) => ({\n gridColumn: `span ${item._span}`,\n})\n\nconst getLabelStyle = (item: DescriptionSchema) => ({\n minWidth: item.labelMinWidth ? `${item.labelMinWidth}px` : undefined,\n ...(item.labelStyle ?? {}),\n})\n\nconst getContentStyle = (item: DescriptionSchema) => ({\n minWidth: item.contentMinWidth ? `${item.contentMinWidth}px` : undefined,\n ...(item.contentStyle ?? {}),\n})\n\nconst getItemValue = (item: DescriptionSchema) => effectiveData.value[item.dataIndex]\n\nconst syncSchema = () => {\n innerSchema.value = [...(effectiveProps.value.schema ?? [])]\n}\n\nconst syncData = () => {\n innerData.value = { ...(effectiveProps.value.data ?? {}) }\n}\n\nconst setProps = async (descriptionProps: Partial<DescriptionProps>) => {\n innerProps.value = { ...innerProps.value, ...descriptionProps }\n if (descriptionProps.schema) innerSchema.value = [...descriptionProps.schema]\n if (descriptionProps.data) innerData.value = { ...descriptionProps.data }\n}\n\nconst setData = async (data: Record<string, unknown>) => {\n innerData.value = { ...innerData.value, ...data }\n innerProps.value = { ...innerProps.value, data: innerData.value }\n}\n\nconst getData = () => ({ ...(effectiveProps.value.data ?? innerData.value ?? {}) })\n\nconst descriptionAction: DescriptionActionType = {\n setProps,\n setData,\n getData,\n}\n\ndefineExpose(descriptionAction)\n\nconst updateWindowWidth = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchema()\n syncData()\n expanded.value = effectiveProps.value.collapseOptions?.defaultExpand !== false\n emit('register', descriptionAction)\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateWindowWidth)\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateWindowWidth)\n }\n})\n\nwatch(() => effectiveProps.value.schema, syncSchema, { deep: true })\nwatch(() => effectiveProps.value.data, syncData, { deep: true })\nwatch(() => effectiveProps.value.collapseOptions?.defaultExpand, (value) => {\n if (value !== undefined) expanded.value = value\n})\n</script>\n\n<style scoped>\n.ecp-pro-descriptions {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ecp-pro-descriptions__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.ecp-pro-descriptions__title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ecp-pro-descriptions__title {\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n}\n\n.ecp-pro-descriptions__help,\n.ecp-pro-descriptions__toggle {\n color: #909399;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down {\n margin-left: 4px;\n transition: transform 0.2s ease;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-pro-descriptions__body {\n display: grid;\n border-top: 1px solid #ebeef5;\n border-left: 1px solid #ebeef5;\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body.is-collapsed {\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) {\n border-top: 0;\n border-left: 0;\n gap: 12px 16px;\n}\n\n.ecp-pro-descriptions__item {\n display: flex;\n min-width: 0;\n border-right: 1px solid #ebeef5;\n border-bottom: 1px solid #ebeef5;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__item {\n border-right: 0;\n border-bottom: 0;\n}\n\n.ecp-pro-descriptions__label,\n.ecp-pro-descriptions__content {\n min-width: 0;\n box-sizing: border-box;\n word-break: break-word;\n}\n\n.ecp-pro-descriptions__label {\n flex: 0 0 120px;\n padding: 12px 16px;\n color: #606266;\n background: #fafafa;\n}\n\n.ecp-pro-descriptions__content {\n flex: 1;\n padding: 12px 16px;\n color: #303133;\n background: #fff;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__label {\n flex-basis: auto;\n padding: 0;\n margin-right: 8px;\n background: transparent;\n font-weight: 500;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__content {\n padding: 0;\n background: transparent;\n}\n\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__label,\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__content {\n padding-top: 8px;\n padding-bottom: 8px;\n font-size: 13px;\n}\n\n@media (max-width: 767px) {\n .ecp-pro-descriptions__item {\n flex-direction: column;\n }\n\n .ecp-pro-descriptions__label {\n flex-basis: auto;\n }\n}\n</style>\n","import { ref, unref, watch, type Ref } from 'vue'\nimport type { DescriptionActionType, DescriptionProps } from '../types'\n\nexport type UseDescriptionPropsReactive = DescriptionProps | Ref<DescriptionProps | undefined>\n\nexport type UseDescriptionReturn = [\n (instance: DescriptionActionType) => void,\n DescriptionActionType,\n]\n\nexport function useDescription(props?: UseDescriptionPropsReactive): UseDescriptionReturn {\n const descriptionActionRef = ref<DescriptionActionType | null>(null)\n\n const getDescriptionProps = (): DescriptionProps | undefined =>\n (props ? unref(props as Ref<DescriptionProps | undefined>) : undefined) as DescriptionProps | undefined\n\n const getDescriptionAction = (): DescriptionActionType => {\n const action = unref(descriptionActionRef)\n if (!action) {\n throw new Error('ProDescriptions instance has not been registered')\n }\n return action\n }\n\n const register = (instance: DescriptionActionType) => {\n descriptionActionRef.value = instance\n const descriptionProps = getDescriptionProps()\n if (descriptionProps && Object.keys(descriptionProps).length > 0) {\n instance.setProps(descriptionProps)\n }\n }\n\n if (props) {\n watch(\n () => getDescriptionProps(),\n (descriptionProps) => {\n if (descriptionProps && descriptionActionRef.value) {\n descriptionActionRef.value.setProps(descriptionProps)\n }\n },\n { deep: true }\n )\n }\n\n const descriptionActions: DescriptionActionType = {\n setProps: (descriptionProps) => getDescriptionAction().setProps(descriptionProps),\n setData: (data) => getDescriptionAction().setData(data),\n getData: () => getDescriptionAction().getData(),\n }\n\n return [register, descriptionActions]\n}\n","<template>\n <div\n v-loading=\"effectiveProps.loading\"\n class=\"ecp-collapse-container\"\n :class=\"{\n 'is-expanded': mergedExpanded,\n 'is-ghost': effectiveProps.ghost,\n 'is-header-clickable': canToggleByHeader,\n }\"\n v-bind=\"wrapperProps\"\n >\n <div v-if=\"showHeader\" class=\"ecp-collapse-container__header\" :class=\"effectiveProps.headerClass\" :style=\"effectiveProps.headerStyle\">\n <div class=\"ecp-collapse-container__header-main\" @click=\"handleHeaderClick\">\n <div v-if=\"$slots.title || effectiveProps.title\" class=\"ecp-collapse-container__title-wrap\">\n <slot name=\"title\">\n <span class=\"ecp-collapse-container__title\">{{ effectiveProps.title }}</span>\n </slot>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-collapse-container__help\" />\n </el-tooltip>\n </div>\n </div>\n\n <div v-if=\"$slots.action || resolvedCanExpan\" class=\"ecp-collapse-container__header-extra\" @click.stop>\n <slot name=\"action\" />\n <el-button\n v-if=\"resolvedCanExpan\"\n type=\"text\"\n class=\"ecp-collapse-container__toggle\"\n @click.stop=\"toggleExpand\"\n >\n {{ mergedExpanded ? effectiveProps.collapseButtonText : effectiveProps.expandButtonText }}\n <i class=\"el-icon-arrow-down\" :class=\"{ 'is-expanded': mergedExpanded }\" />\n </el-button>\n </div>\n </div>\n \n <el-collapse-transition>\n <div\n v-show=\"mergedExpanded\"\n class=\"ecp-collapse-container__body\"\n :class=\"effectiveProps.contentClass\"\n :style=\"effectiveProps.contentStyle\"\n >\n <slot />\n </div>\n </el-collapse-transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, useSlots } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\n\ninterface CollapseContainerProps {\n title?: string\n loading?: boolean\n canExpan?: boolean\n canExpand?: boolean\n helpMessage?: string | string[]\n triggerWindowResize?: boolean\n expanded?: boolean\n defaultExpand?: boolean\n ghost?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n wrapperProps?: Record<string, unknown>\n headerClass?: string\n headerStyle?: Record<string, string | number>\n contentClass?: string\n contentStyle?: Record<string, string | number>\n}\n\nconst props = withDefaults(defineProps<CollapseContainerProps>(), {\n loading: false,\n canExpan: true,\n canExpand: undefined,\n triggerWindowResize: true,\n expanded: undefined,\n defaultExpand: true,\n ghost: false,\n expandButtonText: '展开',\n collapseButtonText: '收起',\n wrapperProps: () => ({}),\n headerClass: '',\n headerStyle: () => ({}),\n contentClass: '',\n contentStyle: () => ({}),\n})\n\nconst emit = defineEmits<{\n (e: 'update:expanded', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'collapse'): void\n (e: 'expand'): void\n}>()\n\nconst slots = useSlots()\nconst { mergeSettings } = useComponentSetting()\n\nconst innerExpanded = ref(props.expanded ?? props.defaultExpand)\n\nconst effectiveProps = computed(() => mergeSettings('CollapseContainer', { ...props }) as CollapseContainerProps)\nconst resolvedCanExpan = computed(() => effectiveProps.value.canExpand ?? effectiveProps.value.canExpan ?? true)\nconst isControlled = computed(() => effectiveProps.value.expanded !== undefined)\nconst mergedExpanded = computed(() => isControlled.value ? !!effectiveProps.value.expanded : innerExpanded.value)\nconst showHeader = computed(() => !!slots.title || !!slots.action || !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || resolvedCanExpan.value)\nconst canToggleByHeader = computed(() => resolvedCanExpan.value)\nconst wrapperProps = computed(() => {\n const incoming = effectiveProps.value.wrapperProps ?? {}\n const wrapperClass = incoming.class\n const wrapperStyle = incoming.style\n const rest = { ...incoming }\n delete rest.class\n delete rest.style\n\n return {\n ...rest,\n class: wrapperClass,\n style: wrapperStyle,\n }\n})\n\nconst triggerWindowResize = () => {\n if (!effectiveProps.value.triggerWindowResize || typeof window === 'undefined') return\n window.setTimeout(() => {\n window.dispatchEvent(new Event('resize'))\n }, 220)\n}\n\nconst setExpanded = (value: boolean) => {\n if (!isControlled.value) {\n innerExpanded.value = value\n }\n emit('update:expanded', value)\n emit('change', value)\n if (value) emit('expand')\n else emit('collapse')\n triggerWindowResize()\n}\n\nconst toggleExpand = () => {\n if (!resolvedCanExpan.value) return\n setExpanded(!mergedExpanded.value)\n}\n\nconst handleHeaderClick = () => {\n if (!canToggleByHeader.value) return\n toggleExpand()\n}\n\nwatch(() => props.expanded, (value) => {\n if (value !== undefined) {\n innerExpanded.value = value\n }\n})\n\nwatch(() => props.defaultExpand, (value) => {\n if (props.expanded === undefined) {\n innerExpanded.value = value\n }\n})\n\ndefineExpose({\n setExpanded,\n toggleExpand,\n})\n</script>\n\n<style scoped>\n.ecp-collapse-container {\n background: #fff;\n border-radius: 14px;\n border: 1px solid #e8eef8;\n box-shadow: 0 10px 24px rgba(15, 45, 94, 0.06);\n overflow: hidden;\n}\n\n.ecp-collapse-container.is-ghost {\n border-color: transparent;\n box-shadow: none;\n background: transparent;\n}\n\n.ecp-collapse-container__header {\n min-height: 56px;\n padding: 0 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n border-bottom: 1px solid #eef3fb;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__header {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container__header-main {\n min-width: 0;\n flex: 1;\n display: flex;\n align-items: center;\n}\n\n.ecp-collapse-container__title-wrap {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ecp-collapse-container__title {\n color: #1f2d3d;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ecp-collapse-container__help {\n color: #91a3b7;\n font-size: 14px;\n}\n\n.ecp-collapse-container__header-extra {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.ecp-collapse-container__toggle {\n padding: 0;\n color: #2f6fd3;\n}\n\n.ecp-collapse-container__toggle i {\n margin-left: 6px;\n transition: transform 0.2s ease;\n}\n\n.ecp-collapse-container__toggle i.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-collapse-container__body {\n padding: 20px;\n box-sizing: border-box;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__body {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container.is-header-clickable .ecp-collapse-container__header-main {\n cursor: pointer;\n}\n\n@media (max-width: 768px) {\n .ecp-collapse-container__header {\n padding: 14px 16px;\n align-items: flex-start;\n flex-direction: column;\n }\n\n .ecp-collapse-container__header-extra {\n width: 100%;\n justify-content: space-between;\n }\n\n .ecp-collapse-container__body {\n padding: 16px;\n }\n}\n</style>\n","<template>\n <div class=\"ecp-pro-table-form\">\n <el-form\n ref=\"formRef\"\n :model=\"modelValue\"\n :rules=\"mergedRules\"\n :label-width=\"labelWidth\"\n class=\"ecp-pro-table-form__form\"\n >\n <el-table\n :data=\"tableRows\"\n :border=\"bordered\"\n :row-key=\"rowKeyFn\"\n header-cell-class-name=\"ecp-pro-table-form__header-cell\"\n class=\"ecp-pro-table-form__table\"\n >\n <!-- 首列:维度 / 友商名称(可插槽自定义) -->\n <el-table-column\n v-if=\"showFirstColumnComputed\"\n :min-width=\"firstColMinWidth\"\n :fixed=\"firstColumnFixed\"\n >\n <template #header>\n <slot name=\"firstColumnHeader\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span class=\"ecp-pro-table-form__req\">*</span>{{ firstColumnTitle }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot name=\"firstColumn\" v-bind=\"firstColumnScope(slotProps)\">\n <template v-if=\"slotProps.row._type === 'fixed'\">\n <span class=\"ecp-pro-table-form__fixed-label\">{{ slotProps.row.rowLabel }}</span>\n </template>\n <el-form-item\n v-else\n :prop=\"competitorNameProp(slotProps.row._index)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <el-input\n :value=\"getCompetitorName(slotProps.row._index)\"\n :placeholder=\"competitorNamePlaceholder\"\n @input=\"setCompetitorName(slotProps.row._index, $event)\"\n />\n </el-form-item>\n </slot>\n </template>\n </el-table-column>\n\n <!-- 数据列:内置 input / formatted-number 或插槽 cell-{slotName} -->\n <el-table-column\n v-for=\"col in columns\"\n :key=\"col.key\"\n :min-width=\"col.minWidth || col.width || 120\"\n :width=\"col.width\"\n >\n <template #header>\n <slot :name=\"'header-' + col.key\" :column=\"col\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"col.required\" class=\"ecp-pro-table-form__req\">*</span>{{ col.title }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <!-- 完全自定义列 -->\n <template v-if=\"col.component === 'slot' && col.slotName\">\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n </template>\n <!-- 内置组件 -->\n <template v-else>\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getFixedMetric(slotProps.row.rowKey, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setFixedMetric(slotProps.row.rowKey, col.key, $event)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getCompetitorMetric(slotProps.row._index, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setCompetitorMetric(slotProps.row._index, col.key, $event)\"\n />\n </el-form-item>\n </template>\n </template>\n </el-table-column>\n\n <!-- 操作列:表头 / 行内均可插槽 -->\n <el-table-column v-if=\"showActionColumn\" v-bind=\"actionColumnBind\">\n <template #header>\n <slot name=\"actionHeader\">\n <span v-if=\"actionColumn?.title\" class=\"ecp-pro-table-form__action-title\">{{ actionColumn.title }}</span>\n <el-button type=\"text\" class=\"ecp-pro-table-form__add-btn\" @click=\"addCompetitor\">\n {{ addCompetitorText }}\n </el-button>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot\n name=\"action\"\n :row=\"slotProps.row\"\n :can-delete=\"canDeleteCompetitor\"\n :add-competitor=\"addCompetitor\"\n :remove-competitor=\"removeCompetitor\"\n >\n <el-button\n v-if=\"slotProps.row._type === 'competitor'\"\n type=\"text\"\n class=\"ecp-pro-table-form__del-btn\"\n :disabled=\"!canDeleteCompetitor\"\n @click=\"removeCompetitor(slotProps.row._index)\"\n >\n 删除\n </el-button>\n <el-button v-else type=\"text\" class=\"ecp-pro-table-form__del-btn\" disabled>\n 删除\n </el-button>\n </slot>\n </template>\n </el-table-column>\n </el-table>\n </el-form>\n </div>\n</template>\n\n<script lang=\"ts\">\n/**\n * Vue 2 默认 v-model 绑定 value + input;本组件使用 modelValue(与 Vue 3 一致),需显式声明 model。\n */\nexport default {\n name: 'ProTableForm',\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport FormattedNumberInput from '../ProForm/FormattedNumberInput.vue'\nimport type { ProTableFormActionColumn, ProTableFormColumn, ProTableFormFixedRow } from './types'\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: Record<string, unknown>\n columns: ProTableFormColumn[]\n fixedRows: ProTableFormFixedRow[]\n competitorsKey?: string\n competitorNameKey?: string\n firstColumnTitle?: string\n competitorNamePlaceholder?: string\n metricPlaceholder?: string\n addCompetitorText?: string\n minCompetitors?: number\n rules?: Record<string, unknown>\n labelWidth?: string\n bordered?: boolean\n firstColMinWidth?: number\n actionWidth?: number\n showFirstColumn?: boolean\n showActionColumn?: boolean\n actionColumn?: ProTableFormActionColumn\n }>(),\n {\n modelValue: () => ({}),\n competitorsKey: 'competitors',\n competitorNameKey: 'name',\n firstColumnTitle: '维度/友商',\n competitorNamePlaceholder: '请输入友商名称',\n metricPlaceholder: '请输入',\n addCompetitorText: '+新增友商',\n minCompetitors: 0,\n labelWidth: '0',\n bordered: true,\n firstColMinWidth: 160,\n actionWidth: 120,\n showFirstColumn: true,\n showActionColumn: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: Record<string, unknown>): void\n}>()\n\nconst formRef = ref<{ validate: (cb?: (valid: boolean) => void) => Promise<unknown> | void; clearValidate: (p?: string | string[]) => void } | null>(null)\n\nconst ck = () => props.competitorsKey ?? 'competitors'\nconst nk = () => props.competitorNameKey ?? 'name'\n\n/** 有固定行时必须保留首列 */\nconst showFirstColumnComputed = computed(() => {\n if (props.fixedRows.length > 0) return true\n return props.showFirstColumn !== false\n})\n\nconst firstColumnFixed = computed(() => 'left' as const)\n\nconst actionColumnBind = computed(() => {\n const ac = props.actionColumn\n return {\n width: ac?.width ?? props.actionWidth,\n minWidth: ac?.minWidth,\n align: ac?.align ?? 'center',\n fixed: ac?.fixed === undefined ? 'right' : ac.fixed,\n }\n})\n\nfunction rowKeyFn(row: TableRow) {\n return row._type === 'fixed' ? `f-${row.rowKey}` : `c-${row._index}`\n}\n\ntype TableRow =\n | { _type: 'fixed'; rowKey: string; rowLabel: string }\n | { _type: 'competitor'; _index: number }\n\nconst tableRows = computed<TableRow[]>(() => {\n const rows: TableRow[] = []\n props.fixedRows.forEach((fr) => {\n rows.push({\n _type: 'fixed',\n rowKey: fr.rowKey,\n rowLabel: fr.label,\n })\n })\n const mv = props.modelValue\n const list = (mv && typeof mv === 'object' ? (mv[ck()] as Record<string, unknown>[] | undefined) : undefined) ?? []\n list.forEach((_, i) => {\n rows.push({ _type: 'competitor', _index: i })\n })\n return rows\n})\n\nconst canDeleteCompetitor = computed(() => {\n const mv = props.modelValue\n const n = ((mv && typeof mv === 'object' ? (mv[ck()] as unknown[]) : undefined) ?? []).length\n return n > props.minCompetitors\n})\n\nfunction cloneModel(): Record<string, unknown> {\n const m = props.modelValue\n if (!m || typeof m !== 'object') {\n return {}\n }\n return JSON.parse(JSON.stringify(m)) as Record<string, unknown>\n}\n\nfunction ensureFixedBlock(rowKey: string): Record<string, unknown> {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n }\n const m = mv[rowKey]\n if (m && typeof m === 'object' && !Array.isArray(m)) return m as Record<string, unknown>\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction emitNext(next: Record<string, unknown>) {\n emit('update:modelValue', next)\n}\n\nfunction getFixedMetric(rowKey: string, key: string): unknown {\n const block = ensureFixedBlock(rowKey)\n return block[key] ?? ''\n}\n\nfunction setFixedMetric(rowKey: string, key: string, val: unknown) {\n const next = cloneModel()\n const b = { ...((next[rowKey] as Record<string, unknown>) || {}) }\n b[key] = val\n next[rowKey] = b\n emitNext(next)\n}\n\nfunction competitorList(): Record<string, unknown>[] {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n return []\n }\n const list = mv[ck()]\n if (!Array.isArray(list)) return []\n return list as Record<string, unknown>[]\n}\n\nfunction getCompetitorName(index: number): string {\n const row = competitorList()[index]\n const key = nk()\n return row ? String(row[key] ?? '') : ''\n}\n\nfunction setCompetitorName(index: number, val: string) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[nk()] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCompetitorMetric(index: number, key: string): unknown {\n const row = competitorList()[index]\n return row ? row[key] ?? '' : ''\n}\n\nfunction setCompetitorMetric(index: number, key: string, val: unknown) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[key] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCellValue(tableRow: TableRow, col: ProTableFormColumn): unknown {\n if (tableRow._type === 'fixed') {\n return getFixedMetric(tableRow.rowKey, col.key)\n }\n return getCompetitorMetric(tableRow._index, col.key)\n}\n\nfunction setCellValue(tableRow: TableRow, col: ProTableFormColumn, val: unknown) {\n if (tableRow._type === 'fixed') {\n setFixedMetric(tableRow.rowKey, col.key, val)\n } else {\n setCompetitorMetric(tableRow._index, col.key, val)\n }\n}\n\n/** 供插槽列 update-value 绑定,避免模板内箭头参数隐式 any */\nfunction slotUpdateHandler(slotProps: { row: TableRow }, col: ProTableFormColumn) {\n return (v: unknown) => setCellValue(slotProps.row, col, v)\n}\n\nfunction emptyCompetitorRow(): Record<string, unknown> {\n const o: Record<string, unknown> = { [nk()]: '' }\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction addCompetitor() {\n const next = cloneModel()\n const list = [...competitorList()]\n list.push(emptyCompetitorRow())\n next[ck()] = list\n emitNext(next)\n}\n\nfunction removeCompetitor(index: number) {\n if (!canDeleteCompetitor.value) return\n const next = cloneModel()\n const list = [...competitorList()]\n list.splice(index, 1)\n next[ck()] = list\n emitNext(next)\n}\n\nfunction fixedMetricProp(rowKey: string, key: string) {\n return `${rowKey}.${key}`\n}\n\nfunction competitorNameProp(index: number) {\n return `${ck()}.${index}.${nk()}`\n}\n\nfunction competitorMetricProp(index: number, key: string) {\n return `${ck()}.${index}.${key}`\n}\n\nfunction cellComponent(col: ProTableFormColumn) {\n return col.component === 'formatted-number' ? FormattedNumberInput : 'el-input'\n}\n\nfunction cellBind(col: ProTableFormColumn): Record<string, unknown> {\n const cp = col.componentProps || {}\n if (col.component === 'formatted-number') {\n return {\n integerDigits: 5,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n ...cp,\n }\n }\n return { ...cp }\n}\n\nfunction firstColumnScope(slotProps: { row: TableRow }) {\n const r = slotProps.row\n if (r._type === 'fixed') {\n return {\n row: r,\n rowType: 'fixed' as const,\n rowKey: r.rowKey,\n rowLabel: r.rowLabel,\n }\n }\n const idx = r._index\n return {\n row: r,\n rowType: 'competitor' as const,\n rowIndex: idx,\n value: getCompetitorName(idx),\n updateValue: (v: string) => setCompetitorName(idx, v),\n }\n}\n\nconst mergedRules = computed(() => {\n const r: Record<string, unknown[]> = {}\n const req = (title: string) => [{ required: true, message: `请输入${title}`, trigger: 'blur' }]\n\n for (const fr of props.fixedRows) {\n for (const col of props.columns) {\n if (col.rules) {\n r[`${fr.rowKey}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${fr.rowKey}.${col.key}`] = req(col.title)\n }\n }\n }\n const list = competitorList()\n list.forEach((_, i) => {\n r[`${ck()}.${i}.${nk()}`] = req('友商名称')\n for (const col of props.columns) {\n if (col.rules) {\n r[`${ck()}.${i}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${ck()}.${i}.${col.key}`] = req(col.title)\n }\n }\n })\n return { ...r, ...(props.rules || {}) }\n})\n\nfunction validate(): Promise<boolean> {\n return new Promise((resolve) => {\n const f = formRef.value\n if (!f || typeof f.validate !== 'function') {\n resolve(true)\n return\n }\n f.validate((valid: boolean) => {\n resolve(valid)\n })\n })\n}\n\nfunction clearValidate(propsArg?: string | string[]) {\n formRef.value?.clearValidate?.(propsArg)\n}\n\ndefineExpose({\n validate,\n clearValidate,\n addCompetitor,\n removeCompetitor,\n})\n</script>\n\n<style scoped>\n.ecp-pro-table-form__form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n.ecp-pro-table-form__cell-item {\n width: 100%;\n}\n.ecp-pro-table-form__cell-item :deep(.el-form-item__content) {\n margin-left: 0 !important;\n line-height: normal;\n}\n.ecp-pro-table-form__fixed-label {\n color: #303133;\n font-size: 14px;\n}\n.ecp-pro-table-form__req {\n color: #f56c6c;\n margin-right: 2px;\n}\n.ecp-pro-table-form__th-text {\n font-weight: 500;\n color: #606266;\n}\n.ecp-pro-table-form__action-title {\n margin-right: 8px;\n font-size: 13px;\n color: #606266;\n}\n.ecp-pro-table-form__add-btn {\n padding: 0;\n font-size: 14px;\n}\n.ecp-pro-table-form__del-btn {\n padding: 0;\n color: #909399;\n}\n.ecp-pro-table-form__del-btn:not(:disabled) {\n color: #409eff;\n}\n</style>\n\n<style>\n.ecp-pro-table-form .ecp-pro-table-form__header-cell {\n background: #f5f7fa !important;\n}\n</style>\n","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions, FormattedNumberInput } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport CollapseContainer from './CollapseContainer'\nimport { ProTableForm } from './ProTableForm'\nimport { useForm } from './ProForm/useForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, FormattedNumberInput, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\nexport { CollapseContainer }\nexport { ProTableForm }\nexport type {\n ProTableFormColumn,\n ProTableFormFixedRow,\n ProTableFormProps,\n ProTableFormActionColumn,\n} from './ProTableForm/types'\nexport { useComponentSetting }\nexport type { UseComponentSettingReturn } from './useComponentSetting'\nexport type { UseProTableReturn, UseProTablePropsReactive } from './ProTable/useProTable'\nexport type { UseDescriptionReturn, UseDescriptionPropsReactive } from './ProDescriptions/useDescription'\nexport * from './ProTable/types'\nexport * from './types'\nexport * from './utils/formattedNumber'\n\nconst components = [\n { name: 'ProTable', component: ProTable },\n { name: 'TableAction', component: TableAction },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions },\n { name: 'FormattedNumberInput', component: FormattedNumberInput },\n { name: 'ProDescriptions', component: ProDescriptions },\n { name: 'CollapseContainer', component: CollapseContainer },\n { name: 'ProTableForm', component: ProTableForm },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n ProTable,\n ProForm,\n ProDescriptions,\n CollapseContainer,\n TableAction,\n FormattedNumberInput,\n ProTableForm,\n}\n"],"names":["componentSettings","reactive","deepMerge","target","source","key","targetValue","sourceValue","isPlainObject","value","proto","useComponentSetting","componentName","config","current","props","globalSetting","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","computed","defaultPagination","paginationConfig","pagination","showTitleBar","showPagination","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","available","result","minPx","maxPx","basePx","selectableRows","getDisabled","row","hasSelectableRows","isAllCurrentPageSelected","isIndeterminate","selectedCount","isRowSelected","getCheckboxDisabled","_c","getRadioDisabled","emitSelectionChange","keys","emit","handleCheckboxChange","checked","handleRadioSelect","handleSelectAll","keySet","toAdd","currentPageKeys","fetchData","opt","fs","pageField","sizeField","listField","totalField","params","processedParams","res","data","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","page","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","findRowIndex","tableAction","cols","keyList","fromProps","ordered","k","info","rows","index","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","hasTooltipContent","getTooltipContent","item","normalizeTooltipConfig","tooltip","fallbackValue","normalized","normalizeTooltip","getButtonType","action","filterVisible","ifShow","visibleActions","visibleDropDownActions","handleClick","handleActionClick","handlePopConfirm","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","rawOptions","sortStringify","obj","sortKeys","acc","lastFetchedParamsKey","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","sanitizeNumericInput","t","i","dot","stripNumberGrouping","s","applyNumericInputDigitLimits","sanitized","integerDigits","decimalPlaces","neg","body","dotIdx","maxInt","intPart","afterDot","endsWithDot","decPart","maxAbsValue","clampByIntegerDigits","max","sign","roundToDecimals","rounding","factor","y","normalizeNumericValue","toFixedDecimalString","formatWithThousands","fixed","withSep","numberToEditString","focused","displayText","intN","decM","parseExternalToNumber","num","syncDisplayFromValue","emitStoredValue","onInput","val","clean","onFocus","onBlur","parsed","final","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","map","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","filterNodeMethod","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","apiSelectRef","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","showColon","normalizedTooltip","resolved","fieldWrapperComponent","fieldWrapperProps","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","fieldInstanceMap","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","getComponentSetting","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","resolveSchemaModel","baseModel","preserveExisting","nextModel","initialValues","applyFormModel","shouldEmit","updateFormModel","values","initForm","rules","filterByIfShow","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","handleSubmit","handleReset","setFieldsValue","getFieldsValue","resetFields","handleFieldChange","validate","nameList","validateFields","resolve","reject","valid","scrollToField","name","el","clearValidate","updateSchema","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","registerFieldInstance","getComponentInstance","getFieldOptions","apiSelectInstance","isFieldLoading","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","submit","innerSchema","DescriptionValueRenderer","rendererProps","renderTextNode","tooltipProps","contentNode","rendered","breakpoints","resolveColumn","column","currentColumn","effectiveData","visibleSchema","normalizedRows","currentRow","used","totalColumn","remainingItems","requested","normalizedSpan","renderedRows","showCollapseButton","visibleRows","showHeader","collapseButtonText","bodyStyle","getItemStyle","getLabelStyle","getContentStyle","getItemValue","syncSchema","syncData","descriptionProps","setData","getData","descriptionAction","updateWindowWidth","useDescription","descriptionActionRef","getDescriptionProps","getDescriptionAction","innerExpanded","resolvedCanExpan","mergedExpanded","canToggleByHeader","wrapperProps","incoming","wrapperClass","wrapperStyle","rest","triggerWindowResize","setExpanded","toggleExpand","handleHeaderClick","__default__","ck","nk","showFirstColumnComputed","firstColumnFixed","actionColumnBind","ac","rowKeyFn","tableRows","fr","mv","_","canDeleteCompetitor","cloneModel","m","ensureFixedBlock","emitNext","next","getFixedMetric","setFixedMetric","b","competitorList","getCompetitorName","setCompetitorName","getCompetitorMetric","setCompetitorMetric","getCellValue","tableRow","setCellValue","slotUpdateHandler","slotProps","emptyCompetitorRow","addCompetitor","removeCompetitor","fixedMetricProp","competitorNameProp","competitorMetricProp","cellComponent","FormattedNumberInput","cellBind","firstColumnScope","mergedRules","req","f","propsArg","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","CollapseContainer","ProTableForm","install","Vue","component"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element-component-pro.umd.js","sources":["../src/useComponentSetting.ts","../src/ProTable/components/CellRenderers.ts","../src/ProTable/components/TableColumnGroup.vue","../src/ProTable/ProTable.vue","../src/utils/tooltip.ts","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.vue","../src/utils/formattedNumber.ts","../src/ProForm/FormattedNumberInput.vue","../src/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/ProDescriptions/ProDescriptions.vue","../src/ProDescriptions/useDescription.ts","../src/CollapseContainer/CollapseContainer.vue","../src/ProTableForm/ProTableForm.vue","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\n/**\n * 深度合并两个对象\n * - source 的值会覆盖 target 的值\n * - 对于嵌套对象,会递归合并\n * - 数组直接替换,不合并\n */\nfunction deepMerge(target: Record<string, unknown>, source?: Record<string, unknown>): Record<string, unknown> {\n if (!source) return target\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const targetValue = target[key]\n const sourceValue = source[key]\n\n if (isPlainObject(sourceValue)) {\n if (!isPlainObject(targetValue)) {\n target[key] = { ...(sourceValue as Record<string, unknown>) }\n } else {\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n }\n } else {\n target[key] = sourceValue\n }\n }\n }\n\n return target\n}\n\n/** 判断是否为普通对象(非数组、非 null) */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string) => T\n /** 设置组件默认配置(与已有配置深度合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n /** 合并组件配置:全局配置与组件 props 合并,返回合并后的结果 */\n mergeSettings: <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>) => T\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置\n * - setSetting:设置组件默认配置(深度合并),可在应用入口或按需调用\n * - mergeSettings:合并全局配置与组件 props,props 优先级更高\n *\n * 合并优先级:组件默认值 < 全局配置 < 组件 props\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n const getSetting = <T extends Record<string, unknown> = Record<string, unknown>>(componentName?: string): T => {\n if (componentName === undefined) {\n return JSON.parse(JSON.stringify(componentSettings)) as T\n }\n return JSON.parse(JSON.stringify(componentSettings[componentName] ?? {})) as T\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n if (current) {\n componentSettings[componentName] = deepMerge({ ...current }, config)\n } else {\n componentSettings[componentName] = { ...config }\n }\n }\n\n /** 合并全局配置与组件 props,props 优先级更高 */\n const mergeSettings = <T extends Record<string, unknown> = Record<string, unknown>>(componentName: string, props: Record<string, unknown>): T => {\n const globalSetting = componentSettings[componentName] ?? {}\n return deepMerge({ ...globalSetting }, props) as T\n }\n\n return {\n getSetting,\n setSetting,\n mergeSettings,\n }\n}\n","import { defineComponent, h } from 'vue'\nimport type { ProColumn } from '../types'\n\nexport const DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n },\n setup(p) {\n return () => {\n const col = p.column as any\n if (col?.customRender) {\n const r = col.customRender({ text: p.value, record: p.record, index: p.index })\n if (typeof r === 'string' || typeof r === 'number') return h('span', String(r))\n return r as any\n }\n if (col?.valueEnum) {\n const text = col.valueEnum?.[p.value]?.text ?? p.value\n return h('span', text == null ? '' : String(text))\n }\n return h('span', p.value == null ? '' : String(p.value))\n }\n },\n})\n\nexport const BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object as () => ProColumn, required: true },\n record: { type: Object as () => Record<string, unknown>, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n customRender: { type: Function, required: false },\n valueEnum: { type: Object, required: false },\n },\n setup(p) {\n return () => {\n const slot = p.slotRender as any\n const nodes = slot?.({ column: p.column, record: p.record, index: p.index, value: p.value })\n\n const normalize = (n: any) => {\n if (n == null) return []\n if (Array.isArray(n)) return n.filter((x) => x != null && x !== false && !x.isComment)\n return [n]\n }\n const normalized = normalize(nodes)\n if (normalized.length > 0) return nodes\n\n const col = { ...(p.column as any) }\n if (p.customRender) col.customRender = p.customRender\n if (p.valueEnum) col.valueEnum = p.valueEnum\n return h(DefaultCellRenderer as any, { props: { column: col, record: p.record, index: p.index, value: p.value } })\n }\n },\n})\n","<template>\n <el-table-column\n v-if=\"column.children && column.children.length > 0\"\n :label=\"column.title\"\n :align=\"column.align || 'left'\"\n :fixed=\"column.fixed\"\n >\n <template v-for=\"child in column.children\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(child)\"\n :key=\"child.key || child.dataIndex || child.title\"\n :column=\"child\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n </el-table-column>\n <el-table-column\n v-else\n :prop=\"column.dataIndex\"\n :label=\"column.title\"\n :min-width=\"getColumnWidth(column)\"\n :fixed=\"column.fixed\"\n :align=\"column.align || 'left'\"\n :sortable=\"column.sortable\"\n :formatter=\"column.formatter\"\n :show-overflow-tooltip=\"column.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template #default=\"slotProps\">\n <slot\n v-if=\"column.dataIndex && $scopedSlots[column.dataIndex]\"\n :name=\"column.dataIndex\"\n :row=\"slotProps.row\"\n :column=\"column\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n :custom-render=\"column.customRender\"\n :value-enum=\"column.valueEnum\"\n />\n <DefaultCellRenderer\n v-else\n :column=\"column\"\n :record=\"slotProps.row\"\n :index=\"slotProps.$index\"\n :value=\"slotProps.row[column.dataIndex]\"\n />\n </template>\n <template #header>\n <slot\n v-if=\"column.dataIndex && $scopedSlots[`header-${column.dataIndex}`]\"\n :name=\"`header-${column.dataIndex}`\"\n :column=\"column\"\n />\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"column\"\n />\n <template v-else>\n <span>{{ column.title }}</span>\n <el-tooltip v-if=\"column.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template #content>\n <span v-if=\"Array.isArray(column.helpMessage)\">\n <div v-for=\"(msg, i) in column.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ column.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n </el-table-column>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlots } from 'vue'\nimport type { ProColumn, ProTableProps } from '../types'\nimport { DefaultCellRenderer, BodyCellRenderer } from './CellRenderers'\n\nconst props = defineProps<{\n column: ProColumn\n effectiveProps: ProTableProps\n getColumnWidth: (col: ProColumn) => number | string | undefined\n}>()\n\nconst $scopedSlots = useSlots()\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n</script>\n","<template>\n <div class=\"ecp-pro-table\">\n <!-- 标题栏 -->\n <div v-if=\"showTitleBar\" class=\"ecp-pro-table__header\">\n <div class=\"ecp-pro-table__title-wrapper\">\n <span class=\"ecp-pro-table__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.titleHelpMessage\" class=\"ecp-pro-table__help\" placement=\"top\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.titleHelpMessage)\">\n <div v-for=\"(msg, i) in effectiveProps.titleHelpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.titleHelpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </div>\n <div class=\"ecp-pro-table__toolbar\">\n <slot name=\"tableTitle\" />\n <slot name=\"toolbar\" />\n <slot name=\"toolbar-right\">\n <el-button\n v-if=\"effectiveProps.tableSetting?.redo !== false\"\n type=\"text\"\n icon=\"el-icon-refresh\"\n size=\"small\"\n @click=\"handleReload\"\n >\n 刷新\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 表格主体(Element UI el-table 无 loading 属性,使用 v-loading 指令) -->\n <div ref=\"tableWrapRef\" class=\"ecp-pro-table__body\" v-loading=\"loading\">\n <el-table\n ref=\"tableRef\"\n :data=\"innerData\"\n :row-key=\"effectiveProps.rowKey\"\n :border=\"effectiveProps.bordered\"\n :stripe=\"effectiveProps.striped\"\n :size=\"effectiveProps.size\"\n :max-height=\"effectiveProps.maxHeight\"\n :height=\"effectiveProps.height\"\n :default-sort=\"effectiveProps.defaultSort\"\n :span-method=\"spanMethodAdapter\"\n :tree-props=\"effectiveProps.treeProps\"\n :default-expand-all=\"effectiveProps.defaultExpandAll\"\n :expand-row-keys=\"effectiveProps.expandRowKeys || []\"\n :lazy=\"effectiveProps.lazy\"\n :load=\"effectiveProps.load\"\n v-bind=\"effectiveProps.tableProps\"\n :row-class-name=\"effectiveProps.rowClassName\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @sort-change=\"handleSortChange\"\n @expand-change=\"handleExpandChange\"\n >\n <!-- 选择列:自定义实现,参考 VbenAdmin,支持单选/多选/禁用/跨页 -->\n <el-table-column\n v-if=\"effectiveProps.rowSelection\"\n :width=\"effectiveProps.rowSelection.width || 48\"\n :fixed=\"effectiveProps.rowSelection.fixed\"\n align=\"center\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 多选:表头全选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isAllCurrentPageSelected\"\n :indeterminate=\"isIndeterminate\"\n :disabled=\"!hasSelectableRows\"\n @change=\"handleSelectAll\"\n />\n <span v-else />\n </template>\n <template slot-scope=\"scope\">\n <!-- 多选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isRowSelected(scope.row)\"\n :disabled=\"getCheckboxDisabled(scope.row)\"\n @change=\"(val) => handleCheckboxChange(scope.row, val)\"\n @click.native.stop\n />\n <!-- 单选 -->\n <el-radio\n v-else\n :value=\"selectedRows[0]?.[rowKeyField]\"\n :label=\"scope.row[rowKeyField]\"\n :disabled=\"getRadioDisabled(scope.row)\"\n @change=\"handleRadioSelect(scope.row)\"\n @click.native.stop\n >\n <span />\n </el-radio>\n </template>\n </el-table-column>\n <!-- 序号列 -->\n <el-table-column\n v-if=\"effectiveProps.showIndexColumn\"\n type=\"index\"\n :label=\"effectiveProps.indexColumnProps?.title || '序号'\"\n :width=\"effectiveProps.indexColumnProps?.width || 60\"\n :fixed=\"effectiveProps.indexColumnProps?.fixed\"\n :align=\"effectiveProps.indexColumnProps?.align || 'center'\"\n />\n <!-- 数据列(支持多级表头) -->\n <template v-for=\"col in displayColumns\">\n <TableColumnGroup\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.key || col.dataIndex || col.title\"\n :column=\"col\"\n :effective-props=\"effectiveProps\"\n :get-column-width=\"getColumnWidth\"\n />\n </template>\n <!-- 操作列 -->\n <el-table-column\n v-if=\"effectiveProps.actionColumn\"\n :label=\"effectiveProps.actionColumn.title || '操作'\"\n :width=\"effectiveProps.actionColumn.width || 150\"\n :fixed=\"effectiveProps.actionColumn.fixed || 'right'\"\n :align=\"effectiveProps.actionColumn.align || 'center'\"\n >\n <template slot-scope=\"scope\">\n <slot\n v-if=\"$scopedSlots['action']\"\n name=\"action\"\n :record=\"scope.row\"\n :column=\"effectiveProps.actionColumn\"\n :index=\"scope.$index\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"effectiveProps.actionColumn\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"undefined\"\n :custom-render=\"effectiveProps.actionColumn.customRender\"\n :value-enum=\"effectiveProps.actionColumn.valueEnum\"\n />\n </template>\n </el-table-column>\n </el-table>\n </div>\n\n <!-- 分页 -->\n <div v-if=\"showPagination\" class=\"ecp-pro-table__pagination\">\n <el-pagination\n :current-page=\"pagination.page\"\n :page-sizes=\"pagination.pageSizes\"\n :page-size=\"pagination.pageSize\"\n :total=\"pagination.total\"\n :small=\"paginationSmall\"\n :background=\"paginationBackground\"\n :layout=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' ? effectiveProps.pagination.layout : null) || 'total, sizes, prev, pager, next, jumper'\"\n v-bind=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' && effectiveProps.pagination.props) || {}\"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// @ts-nocheck - Vue 2 el-table-column slot-scope 类型推断存在已知限制,暂用此方式消除模板内 scope 相关告警\nimport { ref, computed, watch, onMounted, onUnmounted, useSlots, nextTick } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\nimport TableColumnGroup from './components/TableColumnGroup.vue'\nimport { DefaultCellRenderer, BodyCellRenderer } from './components/CellRenderers'\n\nconst props = withDefaults(\n defineProps<{\n columns?: ProColumn[]\n dataSource?: Record<string, unknown>[]\n api?: (params: Record<string, unknown>) => Promise<{ list?: unknown[]; items?: unknown[]; total?: number }>\n rowKey?: string\n title?: string\n titleHelpMessage?: string | string[]\n bordered?: boolean\n striped?: boolean\n size?: 'medium' | 'small' | 'large'\n loading?: boolean\n maxHeight?: number | string\n height?: number | string\n ellipsis?: boolean\n showIndexColumn?: boolean\n indexColumnProps?: Partial<ProColumn>\n actionColumn?: Partial<ProColumn>\n rowSelection?: { type?: 'checkbox' | 'radio'; width?: number; fixed?: 'left' | 'right'; getCheckboxProps?: (r: Record<string, unknown>) => { disabled?: boolean }; getRadioProps?: (r: Record<string, unknown>) => { disabled?: boolean } }\n clearSelectOnPageChange?: boolean\n pagination?: false | { pageSize?: number; pageSizes?: number[]; layout?: string; small?: boolean; background?: boolean; props?: Record<string, unknown> } | Record<string, unknown>\n tableSetting?: { redo?: boolean; size?: boolean; setting?: boolean; fullScreen?: boolean }\n fetchSetting?: FetchSetting\n beforeFetch?: (params: Record<string, unknown>) => Record<string, unknown>\n afterFetch?: (data: unknown) => unknown\n immediate?: boolean\n searchInfo?: Record<string, unknown>\n defaultSort?: { prop: string; order: 'ascending' | 'descending' }\n tableProps?: Record<string, unknown>\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n spanMethod?: (params: { row: Record<string, unknown>; column: Record<string, unknown>; rowIndex: number; columnIndex: number }) => [number, number] | { rowspan: number; colspan: number }\n treeProps?: { hasChildren?: string; children?: string }\n defaultExpandAll?: boolean\n expandRowKeys?: (string | number)[]\n lazy?: boolean\n load?: (row: Record<string, unknown>, treeNode: { level: number; expanded: boolean; loaded: boolean }, resolve: (data: Record<string, unknown>[]) => void) => void\n }>(),\n {\n rowKey: 'id',\n clearSelectOnPageChange: false,\n bordered: false,\n striped: true,\n size: 'medium',\n loading: false,\n ellipsis: true,\n showIndexColumn: true,\n pagination: () => ({ pageSize: 10, pageSizes: [10, 20, 50, 100] }),\n tableSetting: () => ({ redo: true }),\n fetchSetting: () => ({\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'list',\n totalField: 'total',\n }),\n immediate: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: TableActionType): void\n (e: 'fetch-success', data: { items: unknown[]; total: number }): void\n (e: 'fetch-error', error: unknown): void\n (e: 'selection-change', data: { keys: (string | number)[]; rows: Record<string, unknown>[] }): void\n (e: 'row-click', record: Record<string, unknown>, event: Event): void\n (e: 'row-dblclick', record: Record<string, unknown>, event: Event): void\n (e: 'sort-change', sortInfo: { prop: string; order: string }): void\n (e: 'expand-change', row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]): void\n}>()\n\nconst slots = useSlots()\nconst tableRef = ref()\nconst tableWrapRef = ref()\nconst containerWidth = ref(0)\nconst loading = ref(props.loading ?? false)\nconst innerData = ref<Record<string, unknown>[]>([])\nconst rawDataSource = ref<Record<string, unknown>>({})\nconst innerColumns = ref<ProColumn[]>([])\nconst innerProps = ref<Partial<ProTableProps>>({})\nconst selectedRows = ref<Record<string, unknown>[]>([])\nconst showPaginationRef = ref<boolean | null>(null)\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<ProTableProps>('ProTable', { ...props, ...innerProps.value }))\n\n/** 从 effectiveProps.pagination 读取分页默认值(已通过深度合并) */\nconst defaultPagination = computed(() => {\n const paginationConfig = effectiveProps.value.pagination\n if (paginationConfig && typeof paginationConfig === 'object') {\n return {\n pageSize: (paginationConfig as Record<string, unknown>).pageSize ?? 10,\n pageSizes: ((paginationConfig as Record<string, unknown>).pageSizes as number[]) ?? [10, 20, 50, 100],\n }\n }\n return { pageSize: 10, pageSizes: [10, 20, 50, 100] as number[] }\n})\n\nconst pagination = ref({\n page: 1,\n pageSize: defaultPagination.value.pageSize,\n pageSizes: defaultPagination.value.pageSizes,\n total: 0,\n})\n\nconst showTitleBar = computed(() => !!effectiveProps.value.title || !!slots.tableTitle || !!slots.toolbar)\nconst showPagination = computed(() => {\n if (showPaginationRef.value !== null) return showPaginationRef.value\n return !!props.pagination && typeof props.pagination === 'object'\n})\n\n/** 分页 small 属性:从 pagination 配置或全局设置中读取 */\nconst paginationSmall = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).small\n }\n return false\n})\n\n/** 分页 background 属性:从 pagination 配置或全局设置中读取 */\nconst paginationBackground = computed(() => {\n if (effectiveProps.value.pagination && typeof effectiveProps.value.pagination === 'object') {\n return !!(effectiveProps.value.pagination as Record<string, unknown>).background\n }\n return false\n})\n\nconst rowKeyField = computed(() => effectiveProps.value.rowKey || 'id')\n\n/** 选中行 key 集合(用于快速判断) */\nconst selectedKeysSet = computed(() => new Set(selectedRows.value.map((r) => r[rowKeyField.value] as string | number)))\n\n/** 显示列 */\nconst displayColumns = computed(() =>\n innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n)\n\n/** 扁平列映射:columnId -> 原始 ProColumn(供 spanMethod 使用) */\nconst flatColumnsMap = computed(() => {\n const map = new Map<string, ProColumn>()\n const flatten = (cols: ProColumn[]) => {\n for (const col of cols) {\n if (col.children && col.children.length > 0) {\n flatten(col.children)\n } else {\n if (col.id) map.set(col.id, col)\n }\n }\n }\n flatten(displayColumns.value)\n return map\n})\n\n/** 所有可见叶子列(支持多级表头) */\nconst allFlatColumns = computed(() => Array.from(flatColumnsMap.value.values()))\n\n/** 固定列总宽度 */\nconst fixedColumnsWidth = computed(() => {\n let w = 0\n if (effectiveProps.value.rowSelection) w += Number(effectiveProps.value.rowSelection.width) || 48\n if (effectiveProps.value.showIndexColumn) w += Number(effectiveProps.value.indexColumnProps?.width) || 60\n if (effectiveProps.value.actionColumn) w += Number(effectiveProps.value.actionColumn?.width) || 150\n return w\n})\n\nconst isRatioWidth = (w: number | string | undefined) => typeof w === 'number' && w > 0\nconst totalRatio = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && isRatioWidth(c.width))\n return cols.reduce((sum, c) => sum + (typeof c.width === 'number' ? c.width : 0), 0)\n})\n\nconst fixedDataColumnsWidth = computed(() => {\n const cols = allFlatColumns.value.filter((c) => shouldShowColumn(c) && typeof c.width === 'string')\n return cols.reduce((sum, c) => sum + (Number(getColumnWidth(c)) || 80), 0)\n})\n\nconst parseWidthPx = (v: number | string | undefined): number | null =>\n v == null ? null : typeof v === 'number' ? v : parseInt(String(v).replace(/px$/i, ''), 10) || null\n\n/** spanMethod 适配器:给用户回调注入原始 ProColumn */\nconst spanMethodAdapter: TableProps<any>['spanMethod'] = (\n param: { row: any; column: any; rowIndex: number; columnIndex: number }\n) => {\n if (!effectiveProps.value.spanMethod) return [1, 1]\n const original = flatColumnsMap.value.get(param.column.id)\n return effectiveProps.value.spanMethod({\n ...param,\n column: {...original, dataIndex: param.column.property, title: param.column.label } || { ...param.column, dataIndex: param.column.property, title: param.column.label },\n })\n}\n\nconst getColumnWidth = (col: ProColumn): number | string | undefined => {\n const w = col.width\n if (isRatioWidth(w) && totalRatio.value > 0 && containerWidth.value > 0 && typeof w === 'number') {\n const available = containerWidth.value - fixedColumnsWidth.value - fixedDataColumnsWidth.value\n let result = Math.floor((available * w) / totalRatio.value)\n const minPx = parseWidthPx(col.minWidth) ?? 60\n const maxPx = parseWidthPx(col.maxWidth)\n result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n if (typeof w === 'string') {\n const basePx = parseWidthPx(w) ?? 80\n const minPx = parseWidthPx(col.minWidth)\n const maxPx = parseWidthPx(col.maxWidth)\n let result = basePx\n if (minPx != null) result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n return col.minWidth\n}\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n\n/** 当前页可选行(未禁用) */\nconst selectableRows = computed(() => {\n const getDisabled = effectiveProps.value.rowSelection?.getCheckboxProps\n if (!getDisabled) return innerData.value\n return innerData.value.filter((row) => !getDisabled(row)?.disabled)\n})\n\nconst hasSelectableRows = computed(() => selectableRows.value.length > 0)\n\n/** 当前页是否全选 */\nconst isAllCurrentPageSelected = computed(() => {\n if (selectableRows.value.length === 0) return false\n return selectableRows.value.every((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number))\n})\n\n/** 半选状态 */\nconst isIndeterminate = computed(() => {\n const selectedCount = selectableRows.value.filter((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number)).length\n return selectedCount > 0 && selectedCount < selectableRows.value.length\n})\n\nconst isRowSelected = (row: Record<string, unknown>) =>\n selectedKeysSet.value.has(row[rowKeyField.value] as string | number)\n\nconst getCheckboxDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getCheckboxProps?.(row)?.disabled ?? false\n\nconst getRadioDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getRadioProps?.(row)?.disabled ?? false\n\nconst emitSelectionChange = () => {\n const keys = selectedRows.value.map((r) => r[rowKeyField.value] as string | number)\n emit('selection-change', { keys, rows: selectedRows.value })\n}\n\nconst handleCheckboxChange = (row: Record<string, unknown>, checked: boolean) => {\n const key = row[rowKeyField.value] as string | number\n if (checked) {\n selectedRows.value = [...selectedRows.value.filter((r) => r[rowKeyField.value] !== key), row]\n } else {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n }\n emitSelectionChange()\n}\n\nconst handleRadioSelect = (row: Record<string, unknown>) => {\n selectedRows.value = [row]\n emitSelectionChange()\n}\n\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n const keySet = new Set(selectedRows.value.map((r) => r[rowKeyField.value]))\n const toAdd = selectableRows.value.filter((row) => !keySet.has(row[rowKeyField.value]))\n selectedRows.value = [...selectedRows.value, ...toAdd]\n } else {\n const currentPageKeys = new Set(innerData.value.map((r) => r[rowKeyField.value]))\n selectedRows.value = selectedRows.value.filter((r) => !currentPageKeys.has(r[rowKeyField.value]))\n }\n emitSelectionChange()\n}\n\nconst fetchData = async (opt?: FetchParams) => {\n if (!props.api) {\n if (props.dataSource) return\n 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 = () => {\n const assignIds = (cols: ProColumn[], parentKey = ''): ProColumn[] =>\n cols.map((c, i) => {\n const key = `${parentKey}-${i}`\n return {\n ...c,\n id: c.id || key,\n children: c.children ? assignIds(c.children, key) : undefined,\n }\n })\n innerColumns.value = assignIds(props.columns ?? [])\n}\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n innerData.value = [...props.dataSource]\n if (!props.api && props.pagination !== false) {\n pagination.value.total = props.dataSource.length\n }\n }\n}\n\nconst updateContainerWidth = () => {\n if (tableWrapRef.value) containerWidth.value = tableWrapRef.value.offsetWidth || 0\n}\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedEl: Element | null = null\n\nonMounted(() => {\n syncColumns()\n emit('register', tableAction)\n loadData()\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateContainerWidth)\n resizeObserver = new ResizeObserver(updateContainerWidth)\n nextTick(() => {\n updateContainerWidth()\n observedEl = tableWrapRef.value\n if (observedEl) resizeObserver?.observe(observedEl)\n })\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateContainerWidth)\n if (resizeObserver && observedEl) {\n resizeObserver.unobserve(observedEl)\n observedEl = null\n }\n }\n})\n\nwatch(() => props.columns, syncColumns, { deep: true })\nwatch(() => props.dataSource, () => {\n if (!props.api && props.dataSource) innerData.value = [...props.dataSource]\n}, { deep: true })\nwatch(() => props.loading, (v) => { loading.value = v ?? false })\n</script>\n\n<style scoped>\n.ecp-pro-table {\n padding: 16px;\n background: #fff;\n width: 100%;\n box-sizing: border-box;\n}\n.ecp-pro-table :deep(.el-table) {\n width: 100% !important;\n}\n.ecp-pro-table__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.ecp-pro-table__title-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-pro-table__title {\n font-size: 16px;\n font-weight: 600;\n}\n.ecp-pro-table__help {\n color: #909399;\n cursor: help;\n}\n.ecp-pro-table__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ecp-pro-table__body {\n width: 100%;\n}\n.ecp-pro-table__pagination {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.ecp-pro-table__col-help {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n}\n</style>\n","export type TooltipValue = boolean | string | Record<string, unknown>\n\nexport const hasTooltipContent = (value: unknown): boolean => {\n if (Array.isArray(value)) return value.length > 0\n return value !== undefined && value !== null && String(value).trim() !== ''\n}\n\nexport const getTooltipContent = (value: unknown): string => {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(', ')\n }\n if (value === undefined || value === null) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const normalizeTooltipConfig = (\n tooltip: TooltipValue | null | undefined,\n fallbackValue?: unknown\n): Record<string, unknown> | null => {\n if (!tooltip) return null\n\n if (tooltip === true) {\n return {\n content: getTooltipContent(fallbackValue),\n placement: 'top',\n effect: 'dark',\n disabled: !hasTooltipContent(fallbackValue),\n }\n }\n\n if (typeof tooltip === 'string') {\n return {\n content: tooltip,\n placement: 'top',\n effect: 'dark',\n }\n }\n\n const normalized = { ...tooltip }\n const hasExplicitContent = Object.prototype.hasOwnProperty.call(normalized, 'content')\n if (!hasExplicitContent) {\n normalized.content = getTooltipContent(fallbackValue)\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'placement')) {\n normalized.placement = 'top'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'effect')) {\n normalized.effect = 'dark'\n }\n if (!Object.prototype.hasOwnProperty.call(normalized, 'disabled')) {\n normalized.disabled = !hasTooltipContent(normalized.content)\n }\n\n return normalized\n}\n","<template>\n <div class=\"ecp-table-action\">\n <!-- 主操作按钮组 -->\n <span\n v-for=\"(action, index) in visibleActions\"\n :key=\"`action-${index}`\"\n class=\"ecp-table-action__item\"\n >\n <!-- 气泡确认 -->\n <el-popconfirm\n v-if=\"action.popConfirm\"\n :title=\"action.popConfirm.title\"\n :confirm-button-text=\"action.popConfirm.okText || '确定'\"\n :cancel-button-text=\"action.popConfirm.cancelText || '取消'\"\n @confirm=\"handlePopConfirmConfirm(action, $event)\"\n @cancel=\"handlePopConfirmCancel(action, $event)\"\n >\n <span slot=\"reference\">\n <component\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n </span>\n </el-popconfirm>\n\n <!-- 普通按钮 -->\n <component\n v-else\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"handleActionClick(action, $event)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n\n <el-divider v-if=\"action.divider\" direction=\"vertical\" />\n </span>\n\n <!-- 下拉更多操作 -->\n <el-dropdown v-if=\"visibleDropDownActions.length\" trigger=\"click\" @command=\"handleDropdownCommand\">\n <span class=\"ecp-table-action__more\">\n <el-button type=\"text\" size=\"small\">\n 更多<i class=\"el-icon-arrow-down el-icon--right\" />\n </el-button>\n </span>\n <el-dropdown-menu slot=\"dropdown\">\n <el-dropdown-item\n v-for=\"(action, index) in visibleDropDownActions\"\n :key=\"`dropdown-${index}`\"\n :command=\"index\"\n :disabled=\"action.disabled\"\n :divided=\"!!action.divider\"\n >\n <span class=\"ecp-table-action__dropdown-item\">\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </el-dropdown>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { MessageBox } from 'element-ui'\nimport type { TableActionItem } from './types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst props = withDefaults(\n defineProps<{\n actions?: TableActionItem[]\n dropDownActions?: TableActionItem[]\n /** 是否阻止按钮 click 冒泡,参考 VbenAdmin stopButtonPropagation */\n stopButtonPropagation?: boolean\n }>(),\n {\n actions: () => [],\n dropDownActions: () => [],\n stopButtonPropagation: false,\n }\n)\n\nconst normalizeTooltip = (tooltip?: TableActionItem['tooltip']) => {\n return normalizeTooltipConfig(tooltip) || {}\n}\n\nconst getButtonType = (action: TableActionItem) => {\n if (action.type) return action.type\n if (action.color === 'error') return 'danger'\n if (action.color === 'success') return 'success'\n if (action.color === 'warning') return 'warning'\n return 'text'\n}\n\nconst filterVisible = (list: TableActionItem[]) =>\n list.filter((item) => {\n const { ifShow } = item\n if (typeof ifShow === 'boolean') return ifShow\n if (typeof ifShow === 'function') return ifShow(item)\n return true\n })\n\nconst visibleActions = computed(() => filterVisible(props.actions || []))\nconst visibleDropDownActions = computed(() => filterVisible(props.dropDownActions || []))\n\nconst handleClick = (action: TableActionItem, e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n action.onClick?.(e)\n}\n\nconst handleActionClick = (action: TableActionItem, e: MouseEvent) => {\n handleClick(action, e)\n}\n\nconst handlePopConfirm = (action: TableActionItem, type: 'confirm' | 'cancel', e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n if (!action.popConfirm) return\n if (type === 'confirm') {\n action.popConfirm.confirm?.()\n } else {\n action.popConfirm.cancel?.()\n }\n}\n\nconst handlePopConfirmConfirm = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'confirm', e)\n}\n\nconst handlePopConfirmCancel = (action: TableActionItem, e: MouseEvent) => {\n handlePopConfirm(action, 'cancel', e)\n}\n\nconst handleDropdownCommand = (index: number | string) => {\n const idx = Number(index)\n const action = visibleDropDownActions.value[idx]\n if (!action || action.disabled) return\n if (action.popConfirm) {\n const title = action.popConfirm.title\n const okText = action.popConfirm.okText || '确定'\n const cancelText = action.popConfirm.cancelText || '取消'\n MessageBox.confirm(title, '提示', {\n confirmButtonText: okText,\n cancelButtonText: cancelText,\n type: 'warning',\n })\n .then(() => action.popConfirm?.confirm?.())\n .catch(() => action.popConfirm?.cancel?.())\n return\n }\n action.onClick?.({} as MouseEvent)\n}\n</script>\n\n<style scoped>\n.ecp-table-action {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__icon {\n margin-right: 4px;\n}\n.ecp-table-action__more {\n display: inline-flex;\n align-items: center;\n}\n.ecp-table-action__dropdown-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProTableProps, TableActionType } from './types'\n\nexport type UseProTableReturn = [\n (instance: TableActionType) => void,\n TableActionType\n]\n\n/** 支持 ref/computed 的 props */\nexport type UseProTablePropsReactive = ProTableProps | Ref<ProTableProps | undefined>\n\n/**\n * 用于 ProTable 的 useProTable,支持通过 ref 调用表格方法\n * @param props ProTable 的 props 配置,传入后会通过 setProps 同步到表格(支持 ref/computed 响应式更新)\n */\nexport function useProTable(props?: UseProTablePropsReactive): UseProTableReturn {\n const tableActionRef = ref<TableActionType | null>(null)\n\n const getTableProps = (): ProTableProps | undefined =>\n (props ? unref(props as Ref<ProTableProps | undefined>) : undefined) as ProTableProps | undefined\n\n const getTableAction = (): TableActionType => {\n const action = unref(tableActionRef)\n if (!action) {\n throw new Error('ProTable instance has not been registered')\n }\n return action\n }\n\n const register = (instance: TableActionType) => {\n tableActionRef.value = instance\n const tableProps = getTableProps()\n if (tableProps && Object.keys(tableProps).length > 0) {\n instance.setProps(tableProps)\n }\n }\n\n if (props) {\n watch(\n () => getTableProps(),\n (tableProps) => {\n if (tableProps && tableActionRef.value) {\n tableActionRef.value.setProps(tableProps)\n }\n },\n { deep: true }\n )\n }\n\n const tableActions: UseProTableReturn[1] = {\n setProps: (p) => getTableAction().setProps(p),\n reload: (opt) => getTableAction().reload(opt),\n redoHeight: () => getTableAction().redoHeight(),\n setLoading: (v) => getTableAction().setLoading(v),\n getDataSource: () => getTableAction().getDataSource(),\n getRawDataSource: () => getTableAction().getRawDataSource(),\n setTableData: (data) => getTableAction().setTableData(data),\n getColumns: () => getTableAction().getColumns(),\n setColumns: (cols) => getTableAction().setColumns(cols),\n setPagination: (info) => getTableAction().setPagination(info),\n getSelectRowKeys: () => getTableAction().getSelectRowKeys(),\n getSelectRows: () => getTableAction().getSelectRows(),\n clearSelectedRowKeys: () => getTableAction().clearSelectedRowKeys(),\n setSelectedRowKeys: (keys) => getTableAction().setSelectedRowKeys(keys),\n deleteSelectRowByKey: (key) => getTableAction().deleteSelectRowByKey(key),\n updateTableData: (index, key, value) => getTableAction().updateTableData(index, key, value),\n updateTableDataRecord: (rowKey, record) => getTableAction().updateTableDataRecord(rowKey, record),\n deleteTableDataRecord: (rowKey) => getTableAction().deleteTableDataRecord(rowKey),\n insertTableDataRecord: (record, index) => getTableAction().insertTableDataRecord(record, index),\n getPaginationRef: () => getTableAction().getPaginationRef(),\n getShowPagination: () => getTableAction().getShowPagination(),\n setShowPagination: (show) => getTableAction().setShowPagination(show),\n getRowSelection: () => getTableAction().getRowSelection(),\n expandAll: () => getTableAction().expandAll?.(),\n collapseAll: () => getTableAction().collapseAll?.(),\n }\n\n return [register, tableActions]\n}\n","<template>\n <el-select v-bind=\"{ ...$attrs, value: value, placeholder, disabled, loading, clearable, filterable, multiple }\"\n @input=\"$emit('input', $event)\" @change=\"$emit('change', $event)\" @visible-change=\"onVisibleChange\">\n <el-option v-for=\"opt in options\" :key=\"String(opt.value)\" :label=\"opt.label\" :value=\"opt.value\" />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 拉取选项的接口,返回 Promise<Array<{ label, value }>> 或 { list: [] };可接收当前 params 作为参数 */\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n /** 请求参数,变化时会重新拉取 options */\n params?: Record<string, unknown>\n /** 是否懒加载:为 true 时在展开下拉时再请求数据,不在挂载时请求 */\n lazy?: boolean\n /** 接口返回列表中「标签」字段名,默认 'label' */\n labelField?: string\n /** 接口返回列表中「值」字段名,默认 'value' */\n valueField?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n filterable?: boolean\n multiple?: boolean\n }>(),\n { labelField: 'label', valueField: 'value', lazy: false }\n)\n\ndefineEmits<{ (e: 'input', value: unknown): void; (e: 'change', value: unknown): void }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\nconst rawOptions = ref<unknown[]>([])\n\nconst sortStringify = (obj: unknown): string => {\n if (obj === null || obj === undefined) return 'null'\n return JSON.stringify(sortKeys(obj))\n}\n\nconst sortKeys = (obj: unknown): unknown => {\n if (Array.isArray(obj)) return obj.map(sortKeys)\n if (obj !== null && typeof obj === 'object') {\n return Object.keys(obj as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeys((obj as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n return obj\n}\n\nconst lastFetchedParamsKey = ref<string>(sortStringify(props.params ?? null))\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) {\n const paramsKey = sortStringify(props.params ?? null)\n if (paramsKey !== lastFetchedParamsKey.value || options.value.length === 0) {\n fetchOptions()\n }\n }\n}\n\nconst fetchOptions = async () => {\n if (!props.api) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n rawOptions.value = raw\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n options.value = raw.map((item: unknown) => {\n const o = item as Record<string, unknown>\n return {\n label: String(o[labelKey] ?? o.label ?? ''),\n value: o[valueKey] ?? o.value,\n }\n })\n lastFetchedParamsKey.value = sortStringify(props.params ?? null)\n } finally {\n loading.value = false\n }\n}\n\ndefineExpose({\n options,\n rawOptions,\n loading,\n fetchOptions,\n})\n\nonMounted(() => {\n if (!props.lazy) fetchOptions()\n})\nwatch(() => props.api, () => { \n if (!props.lazy) {\n fetchOptions()\n } else {\n options.value = []\n rawOptions.value = []\n }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n const newKey = sortStringify(props.params ?? null)\n if (newKey === lastFetchedParamsKey.value) return\n if (props.lazy) {\n options.value = []\n rawOptions.value = []\n } else {\n fetchOptions()\n }\n}, { deep: true })\n</script>\n","/** 进位方式:向下取整、向上取整、四舍五入 */\nexport type FormattedNumberRounding = 'floor' | 'ceil' | 'round'\n\n/** 仅保留数字、至多一个小数点、可选前导负号 */\nexport function sanitizeNumericInput(raw: string): string {\n const t = raw.trim()\n if (!t) return ''\n let i = 0\n let res = ''\n if (t[0] === '-') {\n res = '-'\n i = 1\n }\n let dot = false\n for (; i < t.length; i++) {\n const c = t[i]\n if (c >= '0' && c <= '9') {\n res += c\n continue\n }\n if (c === '.' && !dot) {\n dot = true\n if (res === '' || res === '-') res += '0'\n res += '.'\n }\n }\n return res\n}\n\nexport function stripNumberGrouping(s: string): string {\n return s.replace(/,/g, '').trim()\n}\n\n/**\n * 对已清洗的数字串按整数位、小数位截断输入长度(inputLimit 为 true 时使用)。\n * 整数部分至多 integerDigits 位,小数部分至多 decimalPlaces 位;保留末尾仅小数点(如 `12.`)以便继续输入。\n */\nexport function applyNumericInputDigitLimits(\n sanitized: string,\n integerDigits: number,\n decimalPlaces: number\n): string {\n if (!sanitized || sanitized === '-') return sanitized\n const neg = sanitized[0] === '-'\n let body = neg ? sanitized.slice(1) : sanitized\n const dotIdx = body.indexOf('.')\n if (dotIdx === -1) {\n const maxInt = Math.max(0, integerDigits)\n body = maxInt > 0 ? body.slice(0, maxInt) : body\n return neg ? '-' + body : body\n }\n let intPart = body.slice(0, dotIdx)\n if (integerDigits > 0) {\n intPart = intPart.slice(0, integerDigits)\n }\n const afterDot = body.slice(dotIdx + 1)\n const endsWithDot = afterDot === '' && body.endsWith('.')\n if (decimalPlaces <= 0) {\n return neg ? '-' + intPart : intPart\n }\n if (endsWithDot) {\n return (neg ? '-' : '') + intPart + '.'\n }\n const decPart = afterDot.slice(0, decimalPlaces)\n return (neg ? '-' : '') + intPart + '.' + decPart\n}\n\nfunction maxAbsValue(integerDigits: number, decimalPlaces: number): number {\n const maxInt = Math.pow(10, integerDigits) - 1\n if (decimalPlaces <= 0) return maxInt\n return maxInt + (1 - Math.pow(10, -decimalPlaces))\n}\n\n/** 按整数位数上限约束绝对值 */\nexport function clampByIntegerDigits(\n value: number,\n integerDigits: number,\n decimalPlaces: number\n): number {\n const max = maxAbsValue(integerDigits, decimalPlaces)\n const sign = value < 0 ? -1 : 1\n const abs = Math.abs(value)\n if (abs <= max) return value\n return sign * max\n}\n\nexport function roundToDecimals(\n value: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n if (decimalPlaces <= 0) {\n switch (rounding) {\n case 'floor':\n return Math.floor(value)\n case 'ceil':\n return Math.ceil(value)\n default:\n return Math.round(value)\n }\n }\n const factor = Math.pow(10, decimalPlaces)\n const x = value * factor\n let y: number\n switch (rounding) {\n case 'floor':\n y = Math.floor(x)\n break\n case 'ceil':\n y = Math.ceil(x)\n break\n default:\n y = Math.round(x)\n }\n return y / factor\n}\n\n/**\n * 解析 → 按整数位夹紧 → 按小数位与进位方式舍入 → 再夹紧(防止舍入后越界)\n */\nexport function normalizeNumericValue(\n value: number,\n integerDigits: number,\n decimalPlaces: number,\n rounding: FormattedNumberRounding\n): number {\n let v = clampByIntegerDigits(value, integerDigits, decimalPlaces)\n v = roundToDecimals(v, decimalPlaces, rounding)\n v = clampByIntegerDigits(v, integerDigits, decimalPlaces)\n return v\n}\n\n/**\n * 固定小数位数字符串(无千分位),用于表单存值以保留配置的小数位数(number 无法保留尾随 0)。\n */\nexport function toFixedDecimalString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n return value.toFixed(Math.max(0, decimalPlaces))\n}\n\n/** 千分位格式化展示(整数部分),小数部分固定 m 位 */\nexport function formatWithThousands(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n const fixed = value.toFixed(Math.max(0, decimalPlaces))\n const neg = fixed.startsWith('-')\n const body = neg ? fixed.slice(1) : fixed\n const [intPart, decPart] = body.split('.')\n const withSep = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n if (decimalPlaces <= 0 || decPart === undefined) return (neg ? '-' : '') + withSep\n return (neg ? '-' : '') + withSep + '.' + decPart\n}\n\n/** 编辑态:无千分位,去掉多余尾部 0(在 m 位精度内) */\nexport function numberToEditString(value: number, decimalPlaces: number): string {\n if (Number.isNaN(value) || !Number.isFinite(value)) return ''\n let s = value.toFixed(Math.max(0, decimalPlaces))\n s = s.replace(/(\\.\\d*?)0+$/, '$1')\n s = s.replace(/\\.$/, '')\n return s\n}\n","<template>\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n v-bind=\"$attrs\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { FormattedNumberRounding } from '../utils/formattedNumber'\nimport {\n applyNumericInputDigitLimits,\n formatWithThousands,\n normalizeNumericValue,\n numberToEditString,\n sanitizeNumericInput,\n stripNumberGrouping,\n toFixedDecimalString,\n} from '../utils/formattedNumber'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n placeholder?: string\n disabled?: boolean\n /** 整数部分允许的最大位数,默认 5 */\n integerDigits?: number\n /** 小数保留位数,默认 6 */\n decimalPlaces?: number\n /** 进位方式,默认四舍五入 */\n rounding?: FormattedNumberRounding\n /**\n * 为 true 时在输入过程中按 integerDigits / decimalPlaces 限制可输入位数;\n * 为 false 时仅失焦后规范化,输入阶段不截断长度。\n */\n inputLimit?: boolean\n }>(),\n {\n integerDigits: 6,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst focused = ref(false)\nconst displayText = ref('')\n\nconst intN = () => Math.max(0, Math.floor(props.integerDigits ?? 6))\nconst decM = () => Math.max(0, Math.floor(props.decimalPlaces ?? 6))\n\nfunction parseExternalToNumber(v: unknown): number | null {\n if (v === null || v === undefined || v === '') return null\n if (typeof v === 'number') {\n return Number.isFinite(v) ? v : null\n }\n const s = stripNumberGrouping(String(v))\n if (s === '' || s === '-') return null\n const num = Number(s)\n return Number.isFinite(num) ? num : null\n}\n\nfunction syncDisplayFromValue() {\n if (focused.value) return\n const num = parseExternalToNumber(props.value)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = formatWithThousands(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nwatch(\n () => [props.value, props.integerDigits, props.decimalPlaces, props.rounding],\n () => syncDisplayFromValue(),\n { immediate: true, deep: true }\n)\n\nfunction emitStoredValue(normalized: number) {\n emit('input', toFixedDecimalString(normalized, decM()))\n}\n\nfunction onInput(val: string) {\n let clean = sanitizeNumericInput(val)\n if (props.inputLimit !== false) {\n clean = applyNumericInputDigitLimits(clean, intN(), decM())\n }\n displayText.value = clean\n if (clean === '' || clean === '-') return\n const num = Number(clean)\n if (!Number.isFinite(num)) return\n const normalized = normalizeNumericValue(num, intN(), decM(), props.rounding)\n emitStoredValue(normalized)\n}\n\nfunction onFocus() {\n focused.value = true\n const raw = stripNumberGrouping(displayText.value)\n const num = parseExternalToNumber(raw === '' ? props.value : raw)\n if (num === null) {\n displayText.value = ''\n return\n }\n displayText.value = numberToEditString(\n normalizeNumericValue(num, intN(), decM(), props.rounding),\n decM()\n )\n}\n\nfunction onBlur() {\n focused.value = false\n const raw = stripNumberGrouping(displayText.value)\n if (raw === '' || raw === '-') {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const parsed = Number(sanitizeNumericInput(raw))\n if (!Number.isFinite(parsed)) {\n displayText.value = ''\n emit('input', undefined)\n return\n }\n const final = normalizeNumericValue(parsed, intN(), decM(), props.rounding)\n displayText.value = formatWithThousands(final, decM())\n emitStoredValue(final)\n}\n</script>\n","<template>\n <div class=\"ecp-tree-select\" ref=\"rootRef\">\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :clearable=\"clearable\"\n readonly\n suffix-icon=\"el-icon-arrow-down\"\n class=\"ecp-tree-select__input\"\n @focus=\"openDropdown\"\n @clear=\"clearValue\"\n />\n <transition name=\"el-zoom-in-top\">\n <div v-show=\"dropdownVisible\" class=\"ecp-tree-select__dropdown\">\n <div v-if=\"filterable\" class=\"ecp-tree-select__filter-inner\">\n <el-input\n v-model=\"filterText\"\n size=\"small\"\n placeholder=\"搜索节点\"\n prefix-icon=\"el-icon-search\"\n clearable\n @click.native.stop\n />\n </div>\n <el-tree\n v-show=\"!loading\"\n ref=\"treeRef\"\n :data=\"treeData\"\n :props=\"treeProps\"\n :node-key=\"valueField\"\n :filter-node-method=\"filterable ? filterNodeMethod : undefined\"\n :highlight-current=\"true\"\n default-expand-all\n @node-click=\"onNodeClick\"\n />\n <div v-if=\"loading\" class=\"ecp-tree-select__loading\">\n <i class=\"el-icon-loading\" /> 加载中...\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, nextTick } from 'vue'\n\ninterface TreeNode {\n label?: string\n value?: unknown\n children?: TreeNode[]\n [key: string]: unknown\n}\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 树数据,直接传入时优先使用,不请求 api */\n treeData?: unknown[]\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n params?: Record<string, unknown>\n lazy?: boolean\n labelField?: string\n valueField?: string\n childrenField?: string\n filterable?: boolean\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n }>(),\n {\n labelField: 'label',\n valueField: 'value',\n childrenField: 'children',\n lazy: false,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst rootRef = ref<HTMLElement>()\nconst treeRef = ref()\nconst dropdownVisible = ref(false)\nconst loading = ref(false)\nconst filterText = ref('')\nconst treeData = ref<TreeNode[]>([])\nconst flatLabelMap = ref<Record<string, string>>({})\n\nconst treeProps = computed(() => ({\n label: props.labelField,\n children: props.childrenField,\n}))\n\nfunction normalizeNode(node: Record<string, unknown>): TreeNode {\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n const children = node[childrenKey] as unknown[]\n const out: TreeNode = {}\n out[props.labelField ?? 'label'] = node[labelKey] ?? node.label\n out[props.valueField ?? 'value'] = node[valueKey] ?? node.value\n if (Array.isArray(children) && children.length) {\n out[props.childrenField ?? 'children'] = children.map((c) => normalizeNode(c as Record<string, unknown>))\n }\n return out\n}\n\nfunction buildFlatLabelMap(nodes: TreeNode[], prefix = ''): Record<string, string> {\n const map: Record<string, string> = {}\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n for (const node of nodes) {\n const label = String(node[labelKey] ?? node.label ?? '')\n const value = node[valueKey] ?? node.value\n if (value !== undefined && value !== null) {\n map[String(value)] = prefix ? prefix + ' / ' + label : label\n }\n const children = node[childrenKey] ?? node.children\n if (Array.isArray(children) && children.length) {\n Object.assign(map, buildFlatLabelMap(children as TreeNode[], label))\n }\n }\n return map\n}\n\nfunction hasTreeDataProp() {\n const td = props.treeData\n return Array.isArray(td) && td.length > 0\n}\n\nfunction applyTreeData(nodes: TreeNode[]) {\n treeData.value = nodes\n flatLabelMap.value = buildFlatLabelMap(nodes)\n}\n\nfunction syncFromTreeDataProp() {\n const td = props.treeData\n if (!Array.isArray(td) || td.length === 0) return\n const normalized = td.map((item) => normalizeNode(item as Record<string, unknown>))\n applyTreeData(normalized)\n}\n\nconst displayText = computed(() => {\n if (props.value == null || props.value === '') return ''\n return flatLabelMap.value[String(props.value)] ?? String(props.value)\n})\n\nconst filterNodeMethod = (value: string, data: TreeNode) => {\n if (!value) return true\n const labelKey = props.labelField ?? 'label'\n const label = String(data[labelKey] ?? data.label ?? '')\n return label.toLowerCase().includes(value.toLowerCase())\n}\n\nwatch(filterText, (val) => {\n treeRef.value?.filter(val)\n})\n\nlet clickOutsideHandler: ((e: MouseEvent) => void) | null = null\n\nfunction openDropdown() {\n if (props.disabled) return\n dropdownVisible.value = true\n if (props.lazy && !hasTreeDataProp()) fetchData()\n nextTick(() => {\n clickOutsideHandler = (e: MouseEvent) => {\n if (rootRef.value && !rootRef.value.contains(e.target as Node)) {\n closeDropdown()\n }\n }\n document.addEventListener('click', clickOutsideHandler)\n })\n}\n\nfunction closeDropdown() {\n dropdownVisible.value = false\n filterText.value = ''\n if (clickOutsideHandler) {\n document.removeEventListener('click', clickOutsideHandler)\n clickOutsideHandler = null\n }\n}\n\nfunction clearValue() {\n emit('input', undefined)\n}\n\nfunction onNodeClick(data: TreeNode) {\n const valueKey = props.valueField ?? 'value'\n const val = data[valueKey] ?? data.value\n emit('input', val)\n closeDropdown()\n}\n\nasync function fetchData() {\n if (!props.api || hasTreeDataProp()) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n treeData.value = raw.map((item) => normalizeNode(item as Record<string, unknown>))\n flatLabelMap.value = buildFlatLabelMap(treeData.value)\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else if (!props.lazy) {\n fetchData()\n }\n})\n\nwatch(() => props.treeData, () => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else {\n treeData.value = []\n flatLabelMap.value = {}\n if (!props.lazy && props.api) fetchData()\n }\n}, { deep: true })\n\nwatch(() => props.api, () => {\n if (hasTreeDataProp()) return\n if (!props.lazy) fetchData()\n else { treeData.value = []; flatLabelMap.value = {} }\n}, { deep: true })\n\nwatch(() => props.params, () => {\n if (hasTreeDataProp()) return\n if (props.lazy) { treeData.value = []; flatLabelMap.value = {} }\n else fetchData()\n}, { deep: true })\n</script>\n\n<style scoped>\n.ecp-tree-select {\n position: relative;\n width: 100%;\n}\n.ecp-tree-select__filter-inner {\n margin-bottom: 8px;\n}\n.ecp-tree-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 280px;\n overflow: auto;\n background: #fff;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n margin-top: 4px;\n z-index: 1000;\n padding: 8px;\n}\n.ecp-tree-select__loading {\n padding: 24px;\n text-align: center;\n color: #909399;\n font-size: 14px;\n}\n</style>\n","<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n :label-width=\"schema.labelWidth\"\n >\n <template slot=\"label\">\n <span>\n {{ schema.label }}<span v-if=\"showColon\" class=\"ecp-pro-form-item__colon\">:</span>\n </span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <!-- 自定义 component:组件名或内联组件 -->\n <component :is=\"fieldWrapperComponent\" v-bind=\"fieldWrapperProps\">\n <component\n v-if=\"resolvedCustomComponent\"\n :is=\"resolvedCustomComponent\"\n :value=\"formModel[schema.field]\"\n @input=\"setFieldValue\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input\n v-else-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <FormattedNumberInput\n v-else-if=\"schema.component === 'formatted-number'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <ApiSelect\n v-else-if=\"schema.component === 'api-select'\"\n ref=\"apiSelectRef\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <TreeSelect\n v-else-if=\"schema.component === 'tree-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </component>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h, ref, onMounted, onUnmounted } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport FormattedNumberInput from './FormattedNumberInput.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-number',\n 'formatted-number',\n 'switch', 'cascader', 'checkbox', 'radio',\n])\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n colon?: boolean\n formActionType?: import('../types').FormActionType\n onFieldChange?: (field: string, value: unknown) => void\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\n /** 注册字段实例(由 ProForm 传入) */\n registerFieldInstance?: (field: string, instance: Record<string, unknown> | null) => void\n}>()\n\n/** ApiSelect 组件实例 ref */\nconst apiSelectRef = ref<Record<string, unknown> | null>(null)\n\nonMounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, apiSelectRef.value)\n }\n})\n\nonUnmounted(() => {\n if (props.schema.component === 'api-select') {\n props.registerFieldInstance?.(props.schema.field, null)\n }\n})\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\nconst showColon = computed(() => props.schema.colon ?? props.colon ?? false)\n\nconst normalizedTooltip = computed(() => {\n const tooltip = props.schema.tooltip\n if (!tooltip) return null\n const resolved = typeof tooltip === 'function' ? tooltip(renderParams.value) : tooltip\n return normalizeTooltipConfig(resolved, props.formModel[props.schema.field])\n})\n\nconst fieldWrapperComponent = computed(() => normalizedTooltip.value ? 'el-tooltip' : 'span')\nconst fieldWrapperProps = computed(() => normalizedTooltip.value || {})\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst resolvedCustomComponent = computed(() => {\n const c = props.schema.component\n if (c == null) return null\n if (typeof c === 'string') {\n if (BUILT_IN_COMPONENTS.has(c)) return null\n return (props.customComponents && props.customComponents[c]) || c\n }\n return c\n})\n\nconst setFieldValue = (v: unknown) => {\n props.onFieldChange?.(props.schema.field, v)\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style scoped>\n.ecp-pro-form-item__colon {\n margin-right: 2px;\n}\n\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"currentFormModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"currentFormModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\" :colon=\"effectiveProps.colon\"\n :custom-components=\"formCustomComponents\" :on-field-change=\"handleFieldChange\"\n :register-field-instance=\"registerFieldInstance\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"currentFormModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"currentFormModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners, ApiSelectInstance } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n modelValue?: Record<string, unknown>\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n colon?: boolean\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n /** 自定义组件映射(组件名 -> 组件),供 schema.component 使用 */\n components?: Record<string, unknown>\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n colon: true,\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '查询',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n (e: 'update:modelValue', values: Record<string, unknown>): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n/** 字段名 -> 组件实例映射(用于获取 api-select 等组件的内部状态) */\nconst fieldInstanceMap = ref<Map<string, ComponentPublicInstance>>(new Map())\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProForm'), ...props, ...innerProps.value }))\nconst controlledModelValue = computed(() => effectiveProps.value.modelValue)\nconst isControlled = computed(() => controlledModelValue.value !== undefined)\nconst currentFormModel = computed<Record<string, unknown>>(() => {\n return isControlled.value\n ? (controlledModelValue.value ?? {})\n : formModel.value\n})\n/** 传给 ProFormItem 的自定义组件映射:显式合并 setSetting 与 props,避免响应式代理导致组件引用丢失 */\nconst formCustomComponents = computed(() => ({\n ...(getComponentSetting('ProForm').components as Record<string, unknown> | undefined) ?? {},\n ...(effectiveProps.value.components ?? {}),\n ...(innerProps.value.components ?? {}),\n}))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: currentFormModel.value, model: currentFormModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n/**\n * \n * @param baseModel \n * @param preserveExisting \n */\nconst resolveSchemaModel = (baseModel?: Record<string, unknown>, preserveExisting = true) => {\n const nextModel = preserveExisting ? { ...(baseModel ?? {}) } : {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n if (preserveExisting && Object.prototype.hasOwnProperty.call(nextModel, schema.field)) return\n if (schema.defaultValue !== undefined) {\n nextModel[schema.field] = schema.defaultValue\n return\n }\n if (initialValues && Object.prototype.hasOwnProperty.call(initialValues, schema.field)) {\n nextModel[schema.field] = initialValues[schema.field]\n }\n })\n return nextModel\n}\n\nconst applyFormModel = (nextModel: Record<string, unknown>, shouldEmit = true) => {\n formModel.value = nextModel\n if (shouldEmit) emit('update:modelValue', nextModel)\n}\n\nconst updateFormModel = (values: Record<string, unknown>) => {\n const nextModel = resolveSchemaModel({ ...currentFormModel.value, ...values })\n applyFormModel(nextModel)\n return nextModel\n}\n\nconst initForm = () => {\n const rules: Record<string, unknown[]> = {}\n innerSchemas.value.forEach((schema) => {\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n applyFormModel(resolveSchemaModel(currentFormModel.value), false)\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...currentFormModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n updateFormModel(values)\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...currentFormModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n applyFormModel(resolveSchemaModel(undefined, false))\n}\n\nconst handleFieldChange = (field: string, value: unknown) => {\n updateFormModel({ [field]: value })\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n initForm()\n }\n}\n\n/** 注册组件实例(供 ProFormItem 调用) */\nconst registerFieldInstance = (field: string, instance: Record<string, unknown> | null) => {\n if (instance) {\n fieldInstanceMap.value.set(field, instance as unknown as ComponentPublicInstance)\n } else {\n fieldInstanceMap.value.delete(field)\n }\n}\n\n/** 获取指定字段的组件实例 */\nconst getComponentInstance = (field: string): ComponentPublicInstance | null => {\n return fieldInstanceMap.value.get(field) ?? null\n}\n\n/** 获取 api-select 字段的 options,raw=true 时返回接口原始数据 */\nfunction getFieldOptions(field: string): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\nfunction getFieldOptions(field: string, raw: true): unknown[]\nfunction getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return []\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n if (raw) {\n return apiSelectInstance?.rawOptions ?? []\n }\n return apiSelectInstance?.options ?? []\n}\n\n/** 获取 api-select 字段的加载状态 */\nconst isFieldLoading = (field: string): boolean => {\n const instance = fieldInstanceMap.value.get(field)\n if (!instance) return false\n const apiSelectInstance = instance as unknown as ApiSelectInstance\n return apiSelectInstance?.loading ?? false\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n}\n\ndefineExpose({\n ...formActionRef,\n registerFieldInstance,\n})\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => controlledModelValue.value, (value) => {\n if (!isControlled.value || value === undefined) return\n applyFormModel(resolveSchemaModel(value), false)\n}, { deep: true, immediate: true })\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style scoped>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form .ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n getComponentInstance: FormActionType['getComponentInstance']\n getFieldOptions: FormActionType['getFieldOptions']\n isFieldLoading: FormActionType['isFieldLoading']\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const getComponentInstance: FormActionType['getComponentInstance'] = (field) =>\n formAction.value?.getComponentInstance(field) ?? null\n\n function getFieldOptions(field: string): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: false): Array<{ label: string; value: unknown }>\n function getFieldOptions(field: string, raw: true): unknown[]\n function getFieldOptions(field: string, raw = false): Array<{ label: string; value: unknown }> | unknown[] {\n if (!formAction.value) return []\n if (raw) return formAction.value.getFieldOptions(field, true)\n return formAction.value.getFieldOptions(field)\n }\n\n const isFieldLoading: FormActionType['isFieldLoading'] = (field) =>\n formAction.value?.isFieldLoading(field) ?? false\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n getComponentInstance,\n getFieldOptions,\n isFieldLoading,\n }\n\n return [register, result]\n}\n","<template>\n <div class=\"ecp-pro-descriptions\">\n <div v-if=\"showHeader\" class=\"ecp-pro-descriptions__header\">\n <div class=\"ecp-pro-descriptions__title-wrap\">\n <span v-if=\"effectiveProps.title\" class=\"ecp-pro-descriptions__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-descriptions__help\" />\n </el-tooltip>\n <el-tooltip v-if=\"effectiveProps.collapseOptions?.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.collapseOptions.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.collapseOptions.helpMessage\" :key=\"`collapse-${index}`\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.collapseOptions.helpMessage }}</span>\n </template>\n <i class=\"el-icon-info ecp-pro-descriptions__help\" />\n </el-tooltip>\n </div>\n <el-button\n v-if=\"showCollapseButton\"\n type=\"text\"\n class=\"ecp-pro-descriptions__toggle\"\n @click=\"expanded = !expanded\"\n >\n {{ expanded ? collapseButtonText.collapse : collapseButtonText.expand }}\n <i class=\"el-icon-arrow-down\" :class=\"expanded ? 'is-expanded' : ''\" />\n </el-button>\n </div>\n\n <div\n class=\"ecp-pro-descriptions__body\"\n :class=\"[\n `is-${effectiveProps.size}`,\n { 'is-bordered': effectiveProps.bordered, 'is-collapsed': showCollapseButton && !expanded },\n ]\"\n :style=\"bodyStyle\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"(row, rowIndex) in renderedRows\">\n <template v-for=\"item in row.items\">\n <div\n :key=\"`${rowIndex}-${item.dataIndex || item.field}`\"\n class=\"ecp-pro-descriptions__item\"\n :style=\"getItemStyle(item)\"\n >\n <div class=\"ecp-pro-descriptions__label\" :style=\"getLabelStyle(item)\">\n {{ item.label }}\n </div>\n <div class=\"ecp-pro-descriptions__content\" :style=\"getContentStyle(item)\">\n <slot\n v-if=\"$scopedSlots[item.slot || item.dataIndex]\"\n :name=\"item.slot || item.dataIndex\"\n :value=\"getItemValue(item)\"\n :record=\"effectiveData\"\n :schema=\"item\"\n />\n <DescriptionValueRenderer v-else :schema=\"item\" :value=\"getItemValue(item)\" :record=\"effectiveData\" :empty-text=\"effectiveProps.emptyText || '-'\" />\n </div>\n </div>\n </template>\n </template>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport { normalizeTooltipConfig } from '../utils/tooltip'\nimport type {\n DescriptionActionType,\n DescriptionColumn,\n DescriptionProps,\n DescriptionSchema,\n} from '../types'\n\ninterface NormalizedRow {\n items: Array<DescriptionSchema & { _span: number }>\n}\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n helpMessage?: string | string[]\n size?: 'medium' | 'small'\n bordered?: boolean\n column?: DescriptionColumn\n schema?: DescriptionSchema[]\n data?: Record<string, unknown>\n emptyText?: string\n useCollapse?: boolean\n collapseOptions?: {\n canExpand?: boolean\n defaultExpand?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n helpMessage?: string | string[]\n visibleRows?: number\n }\n }>(),\n {\n size: 'medium',\n bordered: true,\n column: () => ({ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }),\n schema: () => [],\n data: () => ({}),\n emptyText: '-',\n useCollapse: false,\n collapseOptions: () => ({ canExpand: false, defaultExpand: true, expandButtonText: '展开', collapseButtonText: '收起', visibleRows: 1 }),\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: DescriptionActionType): void\n}>()\n\nconst innerProps = ref<Partial<DescriptionProps>>({})\nconst innerData = ref<Record<string, unknown>>({})\nconst innerSchema = ref<DescriptionSchema[]>([])\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\nconst expanded = ref(true)\n\nconst DescriptionValueRenderer = defineComponent({\n name: 'EcpDescriptionValueRenderer',\n props: {\n schema: { type: Object, required: true },\n value: { required: false },\n record: { type: Object, required: true },\n emptyText: { type: String, default: '-' },\n },\n setup(rendererProps) {\n return () => {\n const schema = rendererProps.schema as DescriptionSchema\n const record = rendererProps.record as Record<string, unknown>\n const value = rendererProps.value\n\n const renderTextNode = (text: string) => {\n const tooltipProps = normalizeTooltip(schema, text === rendererProps.emptyText ? value : text, record)\n const contentNode = h('span', text)\n if (!tooltipProps) return contentNode\n return h('el-tooltip', { props: tooltipProps }, [contentNode])\n }\n\n if (schema.render) {\n const rendered = schema.render(value, record)\n if (rendered == null || rendered === '') return renderTextNode(rendererProps.emptyText)\n if (typeof rendered === 'string' || typeof rendered === 'number') return renderTextNode(String(rendered))\n return rendered as never\n }\n\n if (Array.isArray(value)) {\n return renderTextNode(value.length ? value.join(', ') : rendererProps.emptyText)\n }\n\n if (value === null || value === undefined || value === '') {\n return renderTextNode(rendererProps.emptyText)\n }\n\n if (typeof value === 'object') {\n return renderTextNode(JSON.stringify(value))\n }\n\n return renderTextNode(String(value))\n }\n },\n})\n\nconst normalizeTooltip = (schema: DescriptionSchema, value: unknown, record: Record<string, unknown>) => {\n const tooltip = schema.tooltip\n if (!tooltip) return null\n\n const resolved = typeof tooltip === 'function'\n ? tooltip({ value, record, schema })\n : tooltip\n return normalizeTooltipConfig(resolved, value)\n}\n\nconst { mergeSettings } = useComponentSetting()\nconst effectiveProps = computed(() => mergeSettings<DescriptionProps>('ProDescriptions', { ...props, ...innerProps.value }))\n\nconst breakpoints = { xxl: 1920, xl: 1200, lg: 992, md: 768, sm: 576 }\n\nconst resolveColumn = (column: DescriptionColumn | undefined, width: number) => {\n if (typeof column === 'number') return Math.max(1, column)\n const value = column ?? {}\n if (width >= breakpoints.xxl) return value.xxl ?? value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.xl) return value.xl ?? value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.lg) return value.lg ?? value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.md) return value.md ?? value.sm ?? value.xs ?? 3\n if (width >= breakpoints.sm) return value.sm ?? value.xs ?? 2\n return value.xs ?? 1\n}\n\nconst currentColumn = computed(() => resolveColumn(effectiveProps.value.column, windowWidth.value))\nconst effectiveData = computed(() => effectiveProps.value.data ?? innerData.value ?? {})\n\nconst visibleSchema = computed(() => {\n return (innerSchema.value.length ? innerSchema.value : effectiveProps.value.schema ?? []).filter((item) => {\n const key = item.dataIndex || item.field\n if (!key) return false\n if (typeof item.show === 'function') {\n return item.show(effectiveData.value)\n }\n return item.show !== false\n }).map((item) => ({\n ...item,\n dataIndex: item.dataIndex || item.field || '',\n }))\n})\n\nconst normalizedRows = computed<NormalizedRow[]>(() => {\n const rows: NormalizedRow[] = []\n let currentRow: NormalizedRow = { items: [] }\n let used = 0\n const totalColumn = currentColumn.value\n visibleSchema.value.forEach((item, index) => {\n const remainingItems = visibleSchema.value.length - index\n const requested = Math.max(1, Math.min(item.span ?? 1, totalColumn))\n const span = remainingItems === 1 ? totalColumn - used || totalColumn : requested\n if (used + span > totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n const normalizedSpan = remainingItems === 1 && used < totalColumn ? Math.max(1, totalColumn - used) : span\n currentRow.items.push({ ...item, _span: normalizedSpan })\n used += normalizedSpan\n if (used >= totalColumn) {\n rows.push(currentRow)\n currentRow = { items: [] }\n used = 0\n }\n })\n if (currentRow.items.length > 0) rows.push(currentRow)\n return rows\n})\n\nconst renderedRows = computed(() => {\n if (!showCollapseButton.value || expanded.value) return normalizedRows.value\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return normalizedRows.value.slice(0, visibleRows)\n})\n\nconst showCollapseButton = computed(() => {\n const visibleRows = Math.max(1, effectiveProps.value.collapseOptions?.visibleRows ?? 1)\n return !!effectiveProps.value.useCollapse && !!effectiveProps.value.collapseOptions?.canExpand && normalizedRows.value.length > visibleRows\n})\nconst showHeader = computed(() => !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || showCollapseButton.value)\nconst collapseButtonText = computed(() => ({\n expand: effectiveProps.value.collapseOptions?.expandButtonText ?? '展开',\n collapse: effectiveProps.value.collapseOptions?.collapseButtonText ?? '收起',\n}))\n\nconst bodyStyle = computed(() => ({\n gridTemplateColumns: `repeat(${currentColumn.value}, minmax(0, 1fr))`,\n}))\n\nconst getItemStyle = (item: DescriptionSchema & { _span: number }) => ({\n gridColumn: `span ${item._span}`,\n})\n\nconst getLabelStyle = (item: DescriptionSchema) => ({\n minWidth: item.labelMinWidth ? `${item.labelMinWidth}px` : undefined,\n ...(item.labelStyle ?? {}),\n})\n\nconst getContentStyle = (item: DescriptionSchema) => ({\n minWidth: item.contentMinWidth ? `${item.contentMinWidth}px` : undefined,\n ...(item.contentStyle ?? {}),\n})\n\nconst getItemValue = (item: DescriptionSchema) => effectiveData.value[item.dataIndex]\n\nconst syncSchema = () => {\n innerSchema.value = [...(effectiveProps.value.schema ?? [])]\n}\n\nconst syncData = () => {\n innerData.value = { ...(effectiveProps.value.data ?? {}) }\n}\n\nconst setProps = async (descriptionProps: Partial<DescriptionProps>) => {\n innerProps.value = { ...innerProps.value, ...descriptionProps }\n if (descriptionProps.schema) innerSchema.value = [...descriptionProps.schema]\n if (descriptionProps.data) innerData.value = { ...descriptionProps.data }\n}\n\nconst setData = async (data: Record<string, unknown>) => {\n innerData.value = { ...innerData.value, ...data }\n innerProps.value = { ...innerProps.value, data: innerData.value }\n}\n\nconst getData = () => ({ ...(effectiveProps.value.data ?? innerData.value ?? {}) })\n\nconst descriptionAction: DescriptionActionType = {\n setProps,\n setData,\n getData,\n}\n\ndefineExpose(descriptionAction)\n\nconst updateWindowWidth = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchema()\n syncData()\n expanded.value = effectiveProps.value.collapseOptions?.defaultExpand !== false\n emit('register', descriptionAction)\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateWindowWidth)\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateWindowWidth)\n }\n})\n\nwatch(() => effectiveProps.value.schema, syncSchema, { deep: true })\nwatch(() => effectiveProps.value.data, syncData, { deep: true })\nwatch(() => effectiveProps.value.collapseOptions?.defaultExpand, (value) => {\n if (value !== undefined) expanded.value = value\n})\n</script>\n\n<style scoped>\n.ecp-pro-descriptions {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ecp-pro-descriptions__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.ecp-pro-descriptions__title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ecp-pro-descriptions__title {\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n}\n\n.ecp-pro-descriptions__help,\n.ecp-pro-descriptions__toggle {\n color: #909399;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down {\n margin-left: 4px;\n transition: transform 0.2s ease;\n}\n\n.ecp-pro-descriptions__toggle .el-icon-arrow-down.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-pro-descriptions__body {\n display: grid;\n border-top: 1px solid #ebeef5;\n border-left: 1px solid #ebeef5;\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body.is-collapsed {\n overflow: hidden;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) {\n border-top: 0;\n border-left: 0;\n gap: 12px 16px;\n}\n\n.ecp-pro-descriptions__item {\n display: flex;\n min-width: 0;\n border-right: 1px solid #ebeef5;\n border-bottom: 1px solid #ebeef5;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__item {\n border-right: 0;\n border-bottom: 0;\n}\n\n.ecp-pro-descriptions__label,\n.ecp-pro-descriptions__content {\n min-width: 0;\n box-sizing: border-box;\n word-break: break-word;\n}\n\n.ecp-pro-descriptions__label {\n flex: 0 0 120px;\n padding: 12px 16px;\n color: #606266;\n background: #fafafa;\n}\n\n.ecp-pro-descriptions__content {\n flex: 1;\n padding: 12px 16px;\n color: #303133;\n background: #fff;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__label {\n flex-basis: auto;\n padding: 0;\n margin-right: 8px;\n background: transparent;\n font-weight: 500;\n}\n\n.ecp-pro-descriptions__body:not(.is-bordered) .ecp-pro-descriptions__content {\n padding: 0;\n background: transparent;\n}\n\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__label,\n.ecp-pro-descriptions__body.is-small .ecp-pro-descriptions__content {\n padding-top: 8px;\n padding-bottom: 8px;\n font-size: 13px;\n}\n\n@media (max-width: 767px) {\n .ecp-pro-descriptions__item {\n flex-direction: column;\n }\n\n .ecp-pro-descriptions__label {\n flex-basis: auto;\n }\n}\n</style>\n","import { ref, unref, watch, type Ref } from 'vue'\nimport type { DescriptionActionType, DescriptionProps } from '../types'\n\nexport type UseDescriptionPropsReactive = DescriptionProps | Ref<DescriptionProps | undefined>\n\nexport type UseDescriptionReturn = [\n (instance: DescriptionActionType) => void,\n DescriptionActionType,\n]\n\nexport function useDescription(props?: UseDescriptionPropsReactive): UseDescriptionReturn {\n const descriptionActionRef = ref<DescriptionActionType | null>(null)\n\n const getDescriptionProps = (): DescriptionProps | undefined =>\n (props ? unref(props as Ref<DescriptionProps | undefined>) : undefined) as DescriptionProps | undefined\n\n const getDescriptionAction = (): DescriptionActionType => {\n const action = unref(descriptionActionRef)\n if (!action) {\n throw new Error('ProDescriptions instance has not been registered')\n }\n return action\n }\n\n const register = (instance: DescriptionActionType) => {\n descriptionActionRef.value = instance\n const descriptionProps = getDescriptionProps()\n if (descriptionProps && Object.keys(descriptionProps).length > 0) {\n instance.setProps(descriptionProps)\n }\n }\n\n if (props) {\n watch(\n () => getDescriptionProps(),\n (descriptionProps) => {\n if (descriptionProps && descriptionActionRef.value) {\n descriptionActionRef.value.setProps(descriptionProps)\n }\n },\n { deep: true }\n )\n }\n\n const descriptionActions: DescriptionActionType = {\n setProps: (descriptionProps) => getDescriptionAction().setProps(descriptionProps),\n setData: (data) => getDescriptionAction().setData(data),\n getData: () => getDescriptionAction().getData(),\n }\n\n return [register, descriptionActions]\n}\n","<template>\n <div\n v-loading=\"effectiveProps.loading\"\n class=\"ecp-collapse-container\"\n :class=\"{\n 'is-expanded': mergedExpanded,\n 'is-ghost': effectiveProps.ghost,\n 'is-header-clickable': canToggleByHeader,\n }\"\n v-bind=\"wrapperProps\"\n >\n <div v-if=\"showHeader\" class=\"ecp-collapse-container__header\" :class=\"effectiveProps.headerClass\" :style=\"effectiveProps.headerStyle\">\n <div class=\"ecp-collapse-container__header-main\" @click=\"handleHeaderClick\">\n <div v-if=\"$slots.title || effectiveProps.title\" class=\"ecp-collapse-container__title-wrap\">\n <slot name=\"title\">\n <span class=\"ecp-collapse-container__title\">{{ effectiveProps.title }}</span>\n </slot>\n <el-tooltip v-if=\"effectiveProps.helpMessage\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.helpMessage)\">\n <div v-for=\"(msg, index) in effectiveProps.helpMessage\" :key=\"index\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-collapse-container__help\" />\n </el-tooltip>\n </div>\n </div>\n\n <div v-if=\"$slots.action || resolvedCanExpan\" class=\"ecp-collapse-container__header-extra\" @click.stop>\n <slot name=\"action\" />\n <el-button\n v-if=\"resolvedCanExpan\"\n type=\"text\"\n class=\"ecp-collapse-container__toggle\"\n @click.stop=\"toggleExpand\"\n >\n {{ mergedExpanded ? effectiveProps.collapseButtonText : effectiveProps.expandButtonText }}\n <i class=\"el-icon-arrow-down\" :class=\"{ 'is-expanded': mergedExpanded }\" />\n </el-button>\n </div>\n </div>\n \n <el-collapse-transition>\n <div\n v-show=\"mergedExpanded\"\n class=\"ecp-collapse-container__body\"\n :class=\"effectiveProps.contentClass\"\n :style=\"effectiveProps.contentStyle\"\n >\n <slot />\n </div>\n </el-collapse-transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, useSlots } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\n\ninterface CollapseContainerProps {\n title?: string\n loading?: boolean\n canExpan?: boolean\n canExpand?: boolean\n helpMessage?: string | string[]\n triggerWindowResize?: boolean\n expanded?: boolean\n defaultExpand?: boolean\n ghost?: boolean\n expandButtonText?: string\n collapseButtonText?: string\n wrapperProps?: Record<string, unknown>\n headerClass?: string\n headerStyle?: Record<string, string | number>\n contentClass?: string\n contentStyle?: Record<string, string | number>\n}\n\nconst props = withDefaults(defineProps<CollapseContainerProps>(), {\n loading: false,\n canExpan: true,\n canExpand: undefined,\n triggerWindowResize: true,\n expanded: undefined,\n defaultExpand: true,\n ghost: false,\n expandButtonText: '展开',\n collapseButtonText: '收起',\n wrapperProps: () => ({}),\n headerClass: '',\n headerStyle: () => ({}),\n contentClass: '',\n contentStyle: () => ({}),\n})\n\nconst emit = defineEmits<{\n (e: 'update:expanded', value: boolean): void\n (e: 'change', value: boolean): void\n (e: 'collapse'): void\n (e: 'expand'): void\n}>()\n\nconst slots = useSlots()\nconst { mergeSettings } = useComponentSetting()\n\nconst innerExpanded = ref(props.expanded ?? props.defaultExpand)\n\nconst effectiveProps = computed(() => mergeSettings('CollapseContainer', { ...props }) as CollapseContainerProps)\nconst resolvedCanExpan = computed(() => effectiveProps.value.canExpand ?? effectiveProps.value.canExpan ?? true)\nconst isControlled = computed(() => effectiveProps.value.expanded !== undefined)\nconst mergedExpanded = computed(() => isControlled.value ? !!effectiveProps.value.expanded : innerExpanded.value)\nconst showHeader = computed(() => !!slots.title || !!slots.action || !!effectiveProps.value.title || !!effectiveProps.value.helpMessage || resolvedCanExpan.value)\nconst canToggleByHeader = computed(() => resolvedCanExpan.value)\nconst wrapperProps = computed(() => {\n const incoming = effectiveProps.value.wrapperProps ?? {}\n const wrapperClass = incoming.class\n const wrapperStyle = incoming.style\n const rest = { ...incoming }\n delete rest.class\n delete rest.style\n\n return {\n ...rest,\n class: wrapperClass,\n style: wrapperStyle,\n }\n})\n\nconst triggerWindowResize = () => {\n if (!effectiveProps.value.triggerWindowResize || typeof window === 'undefined') return\n window.setTimeout(() => {\n window.dispatchEvent(new Event('resize'))\n }, 220)\n}\n\nconst setExpanded = (value: boolean) => {\n if (!isControlled.value) {\n innerExpanded.value = value\n }\n emit('update:expanded', value)\n emit('change', value)\n if (value) emit('expand')\n else emit('collapse')\n triggerWindowResize()\n}\n\nconst toggleExpand = () => {\n if (!resolvedCanExpan.value) return\n setExpanded(!mergedExpanded.value)\n}\n\nconst handleHeaderClick = () => {\n if (!canToggleByHeader.value) return\n toggleExpand()\n}\n\nwatch(() => props.expanded, (value) => {\n if (value !== undefined) {\n innerExpanded.value = value\n }\n})\n\nwatch(() => props.defaultExpand, (value) => {\n if (props.expanded === undefined) {\n innerExpanded.value = value\n }\n})\n\ndefineExpose({\n setExpanded,\n toggleExpand,\n})\n</script>\n\n<style scoped>\n.ecp-collapse-container {\n background: #fff;\n border-radius: 14px;\n border: 1px solid #e8eef8;\n box-shadow: 0 10px 24px rgba(15, 45, 94, 0.06);\n overflow: hidden;\n}\n\n.ecp-collapse-container.is-ghost {\n border-color: transparent;\n box-shadow: none;\n background: transparent;\n}\n\n.ecp-collapse-container__header {\n min-height: 56px;\n padding: 0 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n border-bottom: 1px solid #eef3fb;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__header {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container__header-main {\n min-width: 0;\n flex: 1;\n display: flex;\n align-items: center;\n}\n\n.ecp-collapse-container__title-wrap {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ecp-collapse-container__title {\n color: #1f2d3d;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.ecp-collapse-container__help {\n color: #91a3b7;\n font-size: 14px;\n}\n\n.ecp-collapse-container__header-extra {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.ecp-collapse-container__toggle {\n padding: 0;\n color: #2f6fd3;\n}\n\n.ecp-collapse-container__toggle i {\n margin-left: 6px;\n transition: transform 0.2s ease;\n}\n\n.ecp-collapse-container__toggle i.is-expanded {\n transform: rotate(180deg);\n}\n\n.ecp-collapse-container__body {\n padding: 20px;\n box-sizing: border-box;\n}\n\n.ecp-collapse-container.is-ghost .ecp-collapse-container__body {\n padding-left: 0;\n padding-right: 0;\n}\n\n.ecp-collapse-container.is-header-clickable .ecp-collapse-container__header-main {\n cursor: pointer;\n}\n\n@media (max-width: 768px) {\n .ecp-collapse-container__header {\n padding: 14px 16px;\n align-items: flex-start;\n flex-direction: column;\n }\n\n .ecp-collapse-container__header-extra {\n width: 100%;\n justify-content: space-between;\n }\n\n .ecp-collapse-container__body {\n padding: 16px;\n }\n}\n</style>\n","<template>\n <div class=\"ecp-pro-table-form\">\n <el-form\n ref=\"formRef\"\n :model=\"modelValue\"\n :rules=\"mergedRules\"\n :label-width=\"labelWidth\"\n class=\"ecp-pro-table-form__form\"\n >\n <el-table\n :data=\"tableRows\"\n :border=\"bordered\"\n :row-key=\"rowKeyFn\"\n header-cell-class-name=\"ecp-pro-table-form__header-cell\"\n class=\"ecp-pro-table-form__table\"\n >\n <!-- 首列:维度 / 友商名称(可插槽自定义) -->\n <el-table-column\n v-if=\"showFirstColumnComputed\"\n :min-width=\"firstColMinWidth\"\n :fixed=\"firstColumnFixed\"\n >\n <template #header>\n <slot name=\"firstColumnHeader\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span class=\"ecp-pro-table-form__req\">*</span>{{ firstColumnTitle }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot name=\"firstColumn\" v-bind=\"firstColumnScope(slotProps)\">\n <template v-if=\"slotProps.row._type === 'fixed'\">\n <span class=\"ecp-pro-table-form__fixed-label\">{{ slotProps.row.rowLabel }}</span>\n </template>\n <el-form-item\n v-else\n :prop=\"competitorNameProp(slotProps.row._index)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <el-input\n :value=\"getCompetitorName(slotProps.row._index)\"\n :placeholder=\"competitorNamePlaceholder\"\n @input=\"setCompetitorName(slotProps.row._index, $event)\"\n />\n </el-form-item>\n </slot>\n </template>\n </el-table-column>\n\n <!-- 数据列:内置 input / formatted-number 或插槽 cell-{slotName} -->\n <el-table-column\n v-for=\"col in columns\"\n :key=\"col.key\"\n :min-width=\"col.minWidth || col.width || 120\"\n :width=\"col.width\"\n >\n <template #header>\n <slot :name=\"'header-' + col.key\" :column=\"col\">\n <span class=\"ecp-pro-table-form__th-text\">\n <span v-if=\"col.required\" class=\"ecp-pro-table-form__req\">*</span>{{ col.title }}\n </span>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <!-- 完全自定义列 -->\n <template v-if=\"col.component === 'slot' && col.slotName\">\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <slot\n :name=\"'cell-' + col.slotName\"\n :column=\"col\"\n :row=\"slotProps.row\"\n :value=\"getCellValue(slotProps.row, col)\"\n :update-value=\"slotUpdateHandler(slotProps, col)\"\n />\n </el-form-item>\n </template>\n <!-- 内置组件 -->\n <template v-else>\n <el-form-item\n v-if=\"slotProps.row._type === 'fixed'\"\n :prop=\"fixedMetricProp(slotProps.row.rowKey, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getFixedMetric(slotProps.row.rowKey, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setFixedMetric(slotProps.row.rowKey, col.key, $event)\"\n />\n </el-form-item>\n <el-form-item\n v-else\n :prop=\"competitorMetricProp(slotProps.row._index, col.key)\"\n class=\"ecp-pro-table-form__cell-item\"\n >\n <component\n :is=\"cellComponent(col)\"\n :value=\"getCompetitorMetric(slotProps.row._index, col.key)\"\n v-bind=\"cellBind(col)\"\n :placeholder=\"col.placeholder || metricPlaceholder\"\n @input=\"setCompetitorMetric(slotProps.row._index, col.key, $event)\"\n />\n </el-form-item>\n </template>\n </template>\n </el-table-column>\n\n <!-- 操作列:表头 / 行内均可插槽 -->\n <el-table-column v-if=\"showActionColumn\" v-bind=\"actionColumnBind\">\n <template #header>\n <slot name=\"actionHeader\">\n <span v-if=\"actionColumn?.title\" class=\"ecp-pro-table-form__action-title\">{{ actionColumn.title }}</span>\n <el-button type=\"text\" class=\"ecp-pro-table-form__add-btn\" @click=\"addCompetitor\">\n {{ addCompetitorText }}\n </el-button>\n </slot>\n </template>\n <template #default=\"slotProps\">\n <slot\n name=\"action\"\n :row=\"slotProps.row\"\n :can-delete=\"canDeleteCompetitor\"\n :add-competitor=\"addCompetitor\"\n :remove-competitor=\"removeCompetitor\"\n >\n <el-button\n v-if=\"slotProps.row._type === 'competitor'\"\n type=\"text\"\n class=\"ecp-pro-table-form__del-btn\"\n :disabled=\"!canDeleteCompetitor\"\n @click=\"removeCompetitor(slotProps.row._index)\"\n >\n 删除\n </el-button>\n <el-button v-else type=\"text\" class=\"ecp-pro-table-form__del-btn\" disabled>\n 删除\n </el-button>\n </slot>\n </template>\n </el-table-column>\n </el-table>\n </el-form>\n </div>\n</template>\n\n<script lang=\"ts\">\n/**\n * Vue 2 默认 v-model 绑定 value + input;本组件使用 modelValue(与 Vue 3 一致),需显式声明 model。\n */\nexport default {\n name: 'ProTableForm',\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport FormattedNumberInput from '../ProForm/FormattedNumberInput.vue'\nimport type { ProTableFormActionColumn, ProTableFormColumn, ProTableFormFixedRow } from './types'\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: Record<string, unknown>\n columns: ProTableFormColumn[]\n fixedRows: ProTableFormFixedRow[]\n competitorsKey?: string\n competitorNameKey?: string\n firstColumnTitle?: string\n competitorNamePlaceholder?: string\n metricPlaceholder?: string\n addCompetitorText?: string\n minCompetitors?: number\n rules?: Record<string, unknown>\n labelWidth?: string\n bordered?: boolean\n firstColMinWidth?: number\n actionWidth?: number\n showFirstColumn?: boolean\n showActionColumn?: boolean\n actionColumn?: ProTableFormActionColumn\n }>(),\n {\n modelValue: () => ({}),\n competitorsKey: 'competitors',\n competitorNameKey: 'name',\n firstColumnTitle: '维度/友商',\n competitorNamePlaceholder: '请输入友商名称',\n metricPlaceholder: '请输入',\n addCompetitorText: '+新增友商',\n minCompetitors: 0,\n labelWidth: '0',\n bordered: true,\n firstColMinWidth: 160,\n actionWidth: 120,\n showFirstColumn: true,\n showActionColumn: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: Record<string, unknown>): void\n}>()\n\nconst formRef = ref<{ validate: (cb?: (valid: boolean) => void) => Promise<unknown> | void; clearValidate: (p?: string | string[]) => void } | null>(null)\n\nconst ck = () => props.competitorsKey ?? 'competitors'\nconst nk = () => props.competitorNameKey ?? 'name'\n\n/** 有固定行时必须保留首列 */\nconst showFirstColumnComputed = computed(() => {\n if (props.fixedRows.length > 0) return true\n return props.showFirstColumn !== false\n})\n\nconst firstColumnFixed = computed(() => 'left' as const)\n\nconst actionColumnBind = computed(() => {\n const ac = props.actionColumn\n return {\n width: ac?.width ?? props.actionWidth,\n minWidth: ac?.minWidth,\n align: ac?.align ?? 'center',\n fixed: ac?.fixed === undefined ? 'right' : ac.fixed,\n }\n})\n\nfunction rowKeyFn(row: TableRow) {\n return row._type === 'fixed' ? `f-${row.rowKey}` : `c-${row._index}`\n}\n\ntype TableRow =\n | { _type: 'fixed'; rowKey: string; rowLabel: string }\n | { _type: 'competitor'; _index: number }\n\nconst tableRows = computed<TableRow[]>(() => {\n const rows: TableRow[] = []\n props.fixedRows.forEach((fr) => {\n rows.push({\n _type: 'fixed',\n rowKey: fr.rowKey,\n rowLabel: fr.label,\n })\n })\n const mv = props.modelValue\n const list = (mv && typeof mv === 'object' ? (mv[ck()] as Record<string, unknown>[] | undefined) : undefined) ?? []\n list.forEach((_, i) => {\n rows.push({ _type: 'competitor', _index: i })\n })\n return rows\n})\n\nconst canDeleteCompetitor = computed(() => {\n const mv = props.modelValue\n const n = ((mv && typeof mv === 'object' ? (mv[ck()] as unknown[]) : undefined) ?? []).length\n return n > props.minCompetitors\n})\n\nfunction cloneModel(): Record<string, unknown> {\n const m = props.modelValue\n if (!m || typeof m !== 'object') {\n return {}\n }\n return JSON.parse(JSON.stringify(m)) as Record<string, unknown>\n}\n\nfunction ensureFixedBlock(rowKey: string): Record<string, unknown> {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n }\n const m = mv[rowKey]\n if (m && typeof m === 'object' && !Array.isArray(m)) return m as Record<string, unknown>\n const o: Record<string, unknown> = {}\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction emitNext(next: Record<string, unknown>) {\n emit('update:modelValue', next)\n}\n\nfunction getFixedMetric(rowKey: string, key: string): unknown {\n const block = ensureFixedBlock(rowKey)\n return block[key] ?? ''\n}\n\nfunction setFixedMetric(rowKey: string, key: string, val: unknown) {\n const next = cloneModel()\n const b = { ...((next[rowKey] as Record<string, unknown>) || {}) }\n b[key] = val\n next[rowKey] = b\n emitNext(next)\n}\n\nfunction competitorList(): Record<string, unknown>[] {\n const mv = props.modelValue\n if (!mv || typeof mv !== 'object') {\n return []\n }\n const list = mv[ck()]\n if (!Array.isArray(list)) return []\n return list as Record<string, unknown>[]\n}\n\nfunction getCompetitorName(index: number): string {\n const row = competitorList()[index]\n const key = nk()\n return row ? String(row[key] ?? '') : ''\n}\n\nfunction setCompetitorName(index: number, val: string) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[nk()] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCompetitorMetric(index: number, key: string): unknown {\n const row = competitorList()[index]\n return row ? row[key] ?? '' : ''\n}\n\nfunction setCompetitorMetric(index: number, key: string, val: unknown) {\n const next = cloneModel()\n const list = [...competitorList()]\n const row = { ...(list[index] || {}) }\n row[key] = val\n list[index] = row\n next[ck()] = list\n emitNext(next)\n}\n\nfunction getCellValue(tableRow: TableRow, col: ProTableFormColumn): unknown {\n if (tableRow._type === 'fixed') {\n return getFixedMetric(tableRow.rowKey, col.key)\n }\n return getCompetitorMetric(tableRow._index, col.key)\n}\n\nfunction setCellValue(tableRow: TableRow, col: ProTableFormColumn, val: unknown) {\n if (tableRow._type === 'fixed') {\n setFixedMetric(tableRow.rowKey, col.key, val)\n } else {\n setCompetitorMetric(tableRow._index, col.key, val)\n }\n}\n\n/** 供插槽列 update-value 绑定,避免模板内箭头参数隐式 any */\nfunction slotUpdateHandler(slotProps: { row: TableRow }, col: ProTableFormColumn) {\n return (v: unknown) => setCellValue(slotProps.row, col, v)\n}\n\nfunction emptyCompetitorRow(): Record<string, unknown> {\n const o: Record<string, unknown> = { [nk()]: '' }\n for (const c of props.columns) {\n o[c.key] = ''\n }\n return o\n}\n\nfunction addCompetitor() {\n const next = cloneModel()\n const list = [...competitorList()]\n list.push(emptyCompetitorRow())\n next[ck()] = list\n emitNext(next)\n}\n\nfunction removeCompetitor(index: number) {\n if (!canDeleteCompetitor.value) return\n const next = cloneModel()\n const list = [...competitorList()]\n list.splice(index, 1)\n next[ck()] = list\n emitNext(next)\n}\n\nfunction fixedMetricProp(rowKey: string, key: string) {\n return `${rowKey}.${key}`\n}\n\nfunction competitorNameProp(index: number) {\n return `${ck()}.${index}.${nk()}`\n}\n\nfunction competitorMetricProp(index: number, key: string) {\n return `${ck()}.${index}.${key}`\n}\n\nfunction cellComponent(col: ProTableFormColumn) {\n return col.component === 'formatted-number' ? FormattedNumberInput : 'el-input'\n}\n\nfunction cellBind(col: ProTableFormColumn): Record<string, unknown> {\n const cp = col.componentProps || {}\n if (col.component === 'formatted-number') {\n return {\n integerDigits: 5,\n decimalPlaces: 6,\n rounding: 'round',\n inputLimit: true,\n ...cp,\n }\n }\n return { ...cp }\n}\n\nfunction firstColumnScope(slotProps: { row: TableRow }) {\n const r = slotProps.row\n if (r._type === 'fixed') {\n return {\n row: r,\n rowType: 'fixed' as const,\n rowKey: r.rowKey,\n rowLabel: r.rowLabel,\n }\n }\n const idx = r._index\n return {\n row: r,\n rowType: 'competitor' as const,\n rowIndex: idx,\n value: getCompetitorName(idx),\n updateValue: (v: string) => setCompetitorName(idx, v),\n }\n}\n\nconst mergedRules = computed(() => {\n const r: Record<string, unknown[]> = {}\n const req = (title: string) => [{ required: true, message: `请输入${title}`, trigger: 'blur' }]\n\n for (const fr of props.fixedRows) {\n for (const col of props.columns) {\n if (col.rules) {\n r[`${fr.rowKey}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${fr.rowKey}.${col.key}`] = req(col.title)\n }\n }\n }\n const list = competitorList()\n list.forEach((_, i) => {\n r[`${ck()}.${i}.${nk()}`] = req('友商名称')\n for (const col of props.columns) {\n if (col.rules) {\n r[`${ck()}.${i}.${col.key}`] = col.rules as unknown[]\n } else if (col.required) {\n r[`${ck()}.${i}.${col.key}`] = req(col.title)\n }\n }\n })\n return { ...r, ...(props.rules || {}) }\n})\n\nfunction validate(): Promise<boolean> {\n return new Promise((resolve) => {\n const f = formRef.value\n if (!f || typeof f.validate !== 'function') {\n resolve(true)\n return\n }\n f.validate((valid: boolean) => {\n resolve(valid)\n })\n })\n}\n\nfunction clearValidate(propsArg?: string | string[]) {\n formRef.value?.clearValidate?.(propsArg)\n}\n\ndefineExpose({\n validate,\n clearValidate,\n addCompetitor,\n removeCompetitor,\n})\n</script>\n\n<style scoped>\n.ecp-pro-table-form__form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n.ecp-pro-table-form__cell-item {\n width: 100%;\n}\n.ecp-pro-table-form__cell-item :deep(.el-form-item__content) {\n margin-left: 0 !important;\n line-height: normal;\n}\n.ecp-pro-table-form__fixed-label {\n color: #303133;\n font-size: 14px;\n}\n.ecp-pro-table-form__req {\n color: #f56c6c;\n margin-right: 2px;\n}\n.ecp-pro-table-form__th-text {\n font-weight: 500;\n color: #606266;\n}\n.ecp-pro-table-form__action-title {\n margin-right: 8px;\n font-size: 13px;\n color: #606266;\n}\n.ecp-pro-table-form__add-btn {\n padding: 0;\n font-size: 14px;\n}\n.ecp-pro-table-form__del-btn {\n padding: 0;\n color: #909399;\n}\n.ecp-pro-table-form__del-btn:not(:disabled) {\n color: #409eff;\n}\n</style>\n\n<style>\n.ecp-pro-table-form .ecp-pro-table-form__header-cell {\n background: #f5f7fa !important;\n}\n</style>\n","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions, FormattedNumberInput } from './ProForm'\nimport ProDescriptions from './ProDescriptions'\nimport CollapseContainer from './CollapseContainer'\nimport { ProTableForm } from './ProTableForm'\nimport { useForm } from './ProForm/useForm'\nimport { useDescription } from './ProDescriptions/useDescription'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, FormattedNumberInput, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { ProDescriptions, useDescription }\nexport { CollapseContainer }\nexport { ProTableForm }\nexport type {\n ProTableFormColumn,\n ProTableFormFixedRow,\n ProTableFormProps,\n ProTableFormActionColumn,\n} from './ProTableForm/types'\nexport { useComponentSetting }\nexport type { UseComponentSettingReturn } from './useComponentSetting'\nexport type { UseProTableReturn, UseProTablePropsReactive } from './ProTable/useProTable'\nexport type { UseDescriptionReturn, UseDescriptionPropsReactive } from './ProDescriptions/useDescription'\nexport * from './ProTable/types'\nexport * from './types'\nexport * from './utils/formattedNumber'\n\nconst components = [\n { name: 'ProTable', component: ProTable },\n { name: 'TableAction', component: TableAction },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions },\n { name: 'FormattedNumberInput', component: FormattedNumberInput },\n { name: 'ProDescriptions', component: ProDescriptions },\n { name: 'CollapseContainer', component: CollapseContainer },\n { name: 'ProTableForm', component: ProTableForm },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n ProTable,\n ProForm,\n ProDescriptions,\n CollapseContainer,\n TableAction,\n FormattedNumberInput,\n ProTableForm,\n}\n"],"names":["componentSettings","reactive","deepMerge","target","source","key","targetValue","sourceValue","isPlainObject","value","proto","useComponentSetting","componentName","config","current","props","globalSetting","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","$scopedSlots","useSlots","slots","tableRef","ref","tableWrapRef","containerWidth","loading","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","mergeSettings","effectiveProps","computed","defaultPagination","paginationConfig","pagination","showTitleBar","showPagination","paginationSmall","paginationBackground","rowKeyField","selectedKeysSet","displayColumns","c","flatColumnsMap","map","flatten","cols","allFlatColumns","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","spanMethodAdapter","param","original","available","result","minPx","maxPx","basePx","selectableRows","getDisabled","row","hasSelectableRows","isAllCurrentPageSelected","isIndeterminate","selectedCount","isRowSelected","getCheckboxDisabled","_c","getRadioDisabled","emitSelectionChange","keys","emit","handleCheckboxChange","checked","handleRadioSelect","handleSelectAll","keySet","toAdd","currentPageKeys","fetchData","opt","fs","pageField","sizeField","listField","totalField","params","processedParams","res","data","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","page","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","findRowIndex","tableAction","keyList","fromProps","ordered","k","info","rows","index","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","assignIds","parentKey","i","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","hasTooltipContent","getTooltipContent","item","normalizeTooltipConfig","tooltip","fallbackValue","normalized","normalizeTooltip","getButtonType","action","filterVisible","ifShow","visibleActions","visibleDropDownActions","handleClick","handleActionClick","handlePopConfirm","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","rawOptions","sortStringify","obj","sortKeys","acc","lastFetchedParamsKey","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","sanitizeNumericInput","t","dot","stripNumberGrouping","applyNumericInputDigitLimits","sanitized","integerDigits","decimalPlaces","neg","body","dotIdx","maxInt","intPart","afterDot","endsWithDot","decPart","maxAbsValue","clampByIntegerDigits","max","sign","roundToDecimals","rounding","factor","y","normalizeNumericValue","toFixedDecimalString","formatWithThousands","fixed","withSep","numberToEditString","s","focused","displayText","intN","decM","parseExternalToNumber","num","syncDisplayFromValue","emitStoredValue","onInput","val","clean","onFocus","onBlur","parsed","final","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","filterNodeMethod","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","apiSelectRef","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","showColon","normalizedTooltip","resolved","fieldWrapperComponent","fieldWrapperProps","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","fieldInstanceMap","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","getComponentSetting","controlledModelValue","isControlled","currentFormModel","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","resolveSchemaModel","baseModel","preserveExisting","nextModel","initialValues","applyFormModel","shouldEmit","updateFormModel","values","initForm","rules","filterByIfShow","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","handleSubmit","handleReset","setFieldsValue","getFieldsValue","resetFields","handleFieldChange","validate","nameList","validateFields","resolve","reject","valid","scrollToField","name","el","clearValidate","updateSchema","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","registerFieldInstance","getComponentInstance","getFieldOptions","apiSelectInstance","isFieldLoading","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","submit","innerSchema","DescriptionValueRenderer","rendererProps","renderTextNode","tooltipProps","contentNode","rendered","breakpoints","resolveColumn","column","currentColumn","effectiveData","visibleSchema","normalizedRows","currentRow","used","totalColumn","remainingItems","requested","normalizedSpan","renderedRows","showCollapseButton","visibleRows","showHeader","collapseButtonText","bodyStyle","getItemStyle","getLabelStyle","getContentStyle","getItemValue","syncSchema","syncData","descriptionProps","setData","getData","descriptionAction","updateWindowWidth","useDescription","descriptionActionRef","getDescriptionProps","getDescriptionAction","innerExpanded","resolvedCanExpan","mergedExpanded","canToggleByHeader","wrapperProps","incoming","wrapperClass","wrapperStyle","rest","triggerWindowResize","setExpanded","toggleExpand","handleHeaderClick","__default__","ck","nk","showFirstColumnComputed","firstColumnFixed","actionColumnBind","ac","rowKeyFn","tableRows","fr","mv","_","canDeleteCompetitor","cloneModel","m","ensureFixedBlock","emitNext","next","getFixedMetric","setFixedMetric","b","competitorList","getCompetitorName","setCompetitorName","getCompetitorMetric","setCompetitorMetric","getCellValue","tableRow","setCellValue","slotUpdateHandler","slotProps","emptyCompetitorRow","addCompetitor","removeCompetitor","fixedMetricProp","competitorNameProp","competitorMetricProp","cellComponent","FormattedNumberInput","cellBind","firstColumnScope","mergedRules","req","f","propsArg","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","ProDescriptions","CollapseContainer","ProTableForm","install","Vue","component"],"mappings":";gCAGA,MAAMA,GAAoBC,EAAAA,SAAkD,CAAA,CAAE,EAQ9E,SAASC,GAAUC,EAAiCC,EAA2D,CAC7G,GAAI,CAACA,EAAe,OAAAD,EAEpB,UAAWE,KAAOD,EAChB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAQC,CAAG,EAAG,CAC/C,MAAAC,EAAcH,EAAOE,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAE1BG,GAAcD,CAAW,EACtBC,GAAcF,CAAW,EAG5BH,EAAOE,CAAG,EAAIH,GACZI,EACAC,CAAA,EAJFJ,EAAOE,CAAG,EAAI,CAAE,GAAIE,CAAwC,EAQ9DJ,EAAOE,CAAG,EAAIE,CAElB,CAGK,OAAAJ,CACT,CAGA,SAASK,GAAcC,EAAkD,CACnE,GAAA,CAACA,GAAS,OAAOA,GAAU,SAAiB,MAAA,GAC1C,MAAAC,EAAQ,OAAO,eAAeD,CAAK,EAClC,OAAAC,IAAU,OAAO,WAAaA,IAAU,IACjD,CAmBO,SAASC,IAAiD,CAuBxD,MAAA,CACL,WAvB+EC,GAEtE,KAAK,MAAM,KAAK,UADrBA,IAAkB,OACaZ,GAEFA,GAAkBY,CAAa,GAAK,CAAE,CAFnB,CAAC,EAsBrD,WAjBiB,CAACA,EAAuBC,IAA0C,CAC7E,MAAAC,EAAUd,GAAkBY,CAAa,EAC3CE,EACFd,GAAkBY,CAAa,EAAIV,GAAU,CAAE,GAAGY,CAAA,EAAWD,CAAM,EAEnEb,GAAkBY,CAAa,EAAI,CAAE,GAAGC,CAAO,CACjD,EAYA,cARoB,CAA8DD,EAAuBG,IAAsC,CAC/I,MAAMC,EAAgBhB,GAAkBY,CAAa,GAAK,CAAA,EAC1D,OAAOV,GAAU,CAAE,GAAGc,GAAiBD,CAAK,CAAA,CAM5C,CAEJ,CCtFO,MAAME,GAAsBC,EAAAA,gBAAgB,CACjD,KAAM,iCACN,MAAO,CACL,OAAQ,CAAE,KAAM,OAA2B,SAAU,EAAK,EAC1D,OAAQ,CAAE,KAAM,OAAyC,SAAU,EAAK,EACxE,MAAO,CAAE,KAAM,OAAQ,SAAU,EAAK,EACtC,MAAO,CAAE,SAAU,EAAM,CAC3B,EACA,MAAMC,EAAG,CACP,MAAO,IAAM,SACX,MAAMC,EAAMD,EAAE,OACd,GAAIC,GAAA,MAAAA,EAAK,aAAc,CACrB,MAAMC,EAAID,EAAI,aAAa,CAAE,KAAMD,EAAE,MAAO,OAAQA,EAAE,OAAQ,MAAOA,EAAE,KAAO,CAAA,EAC9E,OAAI,OAAOE,GAAM,UAAY,OAAOA,GAAM,SAAiBC,EAAE,EAAA,OAAQ,OAAOD,CAAC,CAAC,EACvEA,CACT,CACA,GAAID,GAAA,MAAAA,EAAK,UAAW,CAClB,MAAMG,IAAOC,GAAAC,EAAAL,EAAI,YAAJ,YAAAK,EAAgBN,EAAE,SAAlB,YAAAK,EAA0B,OAAQL,EAAE,MACjD,OAAOG,IAAE,OAAQC,GAAQ,KAAO,GAAK,OAAOA,CAAI,CAAC,CACnD,CACO,OAAAD,IAAE,OAAQH,EAAE,OAAS,KAAO,GAAK,OAAOA,EAAE,KAAK,CAAC,CAAA,CAE3D,CACF,CAAC,EAEYO,GAAmBR,EAAAA,gBAAgB,CAC9C,KAAM,8BACN,MAAO,CACL,WAAY,CAAE,KAAM,SAAU,SAAU,EAAK,EAC7C,OAAQ,CAAE,KAAM,OAA2B,SAAU,EAAK,EAC1D,OAAQ,CAAE,KAAM,OAAyC,SAAU,EAAK,EACxE,MAAO,CAAE,KAAM,OAAQ,SAAU,EAAK,EACtC,MAAO,CAAE,SAAU,EAAM,EACzB,aAAc,CAAE,KAAM,SAAU,SAAU,EAAM,EAChD,UAAW,CAAE,KAAM,OAAQ,SAAU,EAAM,CAC7C,EACA,MAAMC,EAAG,CACP,MAAO,IAAM,CACX,MAAMQ,EAAOR,EAAE,WACTS,EAAQD,GAAA,YAAAA,EAAO,CAAE,OAAQR,EAAE,OAAQ,OAAQA,EAAE,OAAQ,MAAOA,EAAE,MAAO,MAAOA,EAAE,QAQpF,IANmBU,GACbA,GAAK,KAAa,GAClB,MAAM,QAAQA,CAAC,EAAUA,EAAE,OAAQC,GAAMA,GAAK,MAAQA,IAAM,IAAS,CAACA,EAAE,SAAS,EAC9E,CAACD,CAAC,GAEkBD,CAAK,EACnB,OAAS,EAAU,OAAAA,EAElC,MAAMR,EAAM,CAAE,GAAID,EAAE,MAAe,EACnC,OAAIA,EAAE,eAAcC,EAAI,aAAeD,EAAE,cACrCA,EAAE,YAAWC,EAAI,UAAYD,EAAE,WAC5BG,EAAAA,EAAEL,GAA4B,CAAE,MAAO,CAAE,OAAQG,EAAK,OAAQD,EAAE,OAAQ,MAAOA,EAAE,MAAO,MAAOA,EAAE,OAAS,CAAA,CAErH,CACF,CAAC,iICmCKY,EAAeC,EAAAA,mEAEKZ,GACpBA,EAAI,SAAW,GAAc,GAC7B,OAAOA,EAAI,QAAW,WAAmBA,EAAI,OAAO,CAAE,OAAQA,CAAK,CAAA,EAChE,q6HCiJHa,EAAQD,EAAAA,WACRE,EAAWC,EAAAA,MACXC,EAAeD,EAAAA,MACfE,EAAiBF,MAAI,CAAC,EACtBG,EAAUH,EAAA,IAAIpB,EAAM,SAAW,EAAK,EACpCwB,EAAYJ,MAA+B,CAAA,CAAE,EAC7CK,EAAgBL,MAA6B,CAAA,CAAE,EAC/CM,EAAeN,MAAiB,CAAA,CAAE,EAClCO,EAAaP,MAA4B,CAAA,CAAE,EAC3CQ,EAAeR,MAA+B,CAAA,CAAE,EAChDS,EAAoBT,MAAoB,IAAI,EAE5C,CAAE,cAAAU,GAAkBlC,KACpBmC,EAAiBC,EAAAA,SAAS,IAAMF,EAA6B,WAAY,CAAE,GAAG9B,EAAO,GAAG2B,EAAW,KAAM,CAAC,CAAC,EAG3GM,EAAoBD,EAAAA,SAAS,IAAM,CACjC,MAAAE,EAAmBH,EAAe,MAAM,WAC1C,OAAAG,GAAoB,OAAOA,GAAqB,SAC3C,CACL,SAAWA,EAA6C,UAAY,GACpE,UAAaA,EAA6C,WAA0B,CAAC,GAAI,GAAI,GAAI,GAAG,CAAA,EAGjG,CAAE,SAAU,GAAI,UAAW,CAAC,GAAI,GAAI,GAAI,GAAG,EAAc,CACjE,EAEKC,EAAaf,EAAAA,IAAI,CACrB,KAAM,EACN,SAAUa,EAAkB,MAAM,SAClC,UAAWA,EAAkB,MAAM,UACnC,MAAO,CAAA,CACR,EAEKG,EAAeJ,EAAA,SAAS,IAAM,CAAC,CAACD,EAAe,MAAM,OAAS,CAAC,CAACb,EAAM,YAAc,CAAC,CAACA,EAAM,OAAO,EACnGmB,EAAiBL,EAAAA,SAAS,IAC1BH,EAAkB,QAAU,KAAaA,EAAkB,MACxD,CAAC,CAAC7B,EAAM,YAAc,OAAOA,EAAM,YAAe,QAC1D,EAGKsC,EAAkBN,EAAAA,SAAS,IAC3BD,EAAe,MAAM,YAAc,OAAOA,EAAe,MAAM,YAAe,SACzE,CAAC,CAAEA,EAAe,MAAM,WAAuC,MAEjE,EACR,EAGKQ,EAAuBP,EAAAA,SAAS,IAChCD,EAAe,MAAM,YAAc,OAAOA,EAAe,MAAM,YAAe,SACzE,CAAC,CAAEA,EAAe,MAAM,WAAuC,WAEjE,EACR,EAEKS,EAAcR,EAAAA,SAAS,IAAMD,EAAe,MAAM,QAAU,IAAI,EAGhEU,EAAkBT,EAAA,SAAS,IAAM,IAAI,IAAIJ,EAAa,MAAM,IAAKtB,GAAMA,EAAEkC,EAAY,KAAK,CAAoB,CAAC,CAAC,EAGhHE,EAAiBV,EAAA,SAAS,IAC9BN,EAAa,MAAM,OAAQiB,GAAM,CAACA,EAAE,aAAe,CAACA,EAAE,aAAa,CAAA,EAI/DC,EAAiBZ,EAAAA,SAAS,IAAM,CAC9B,MAAAa,MAAU,IACVC,EAAWC,GAAsB,CACrC,UAAW1C,KAAO0C,EACZ1C,EAAI,UAAYA,EAAI,SAAS,OAAS,EACxCyC,EAAQzC,EAAI,QAAQ,EAEhBA,EAAI,IAAQwC,EAAA,IAAIxC,EAAI,GAAIA,CAAG,CAEnC,EAEF,OAAAyC,EAAQJ,EAAe,KAAK,EACrBG,CAAA,CACR,EAGKG,EAAiBhB,WAAS,IAAM,MAAM,KAAKY,EAAe,MAAM,OAAQ,CAAA,CAAC,EAGzEK,EAAoBjB,EAAAA,SAAS,IAAM,SACvC,IAAIkB,EAAI,EACR,OAAInB,EAAe,MAAM,eAAcmB,GAAK,OAAOnB,EAAe,MAAM,aAAa,KAAK,GAAK,IAC3FA,EAAe,MAAM,kBAAiBmB,GAAK,QAAOxC,EAAAqB,EAAe,MAAM,mBAArB,YAAArB,EAAuC,KAAK,GAAK,IACnGqB,EAAe,MAAM,eAAcmB,GAAK,QAAOzC,EAAAsB,EAAe,MAAM,eAArB,YAAAtB,EAAmC,KAAK,GAAK,KACzFyC,CAAA,CACR,EAEKC,EAAgBD,GAAmC,OAAOA,GAAM,UAAYA,EAAI,EAChFE,EAAapB,EAAAA,SAAS,IACbgB,EAAe,MAAM,OAAQL,GAAMU,EAAiBV,CAAC,GAAKQ,EAAaR,EAAE,KAAK,CAAC,EAChF,OAAO,CAACW,EAAKX,IAAMW,GAAO,OAAOX,EAAE,OAAU,SAAWA,EAAE,MAAQ,GAAI,CAAC,CACpF,EAEKY,EAAwBvB,EAAAA,SAAS,IACxBgB,EAAe,MAAM,OAAQL,GAAMU,EAAiBV,CAAC,GAAK,OAAOA,EAAE,OAAU,QAAQ,EACtF,OAAO,CAACW,EAAKX,IAAMW,GAAO,OAAOE,GAAeb,CAAC,CAAC,GAAK,IAAK,CAAC,CAC1E,EAEKc,EAAgBC,GACpBA,GAAK,KAAO,KAAO,OAAOA,GAAM,SAAWA,EAAI,SAAS,OAAOA,CAAC,EAAE,QAAQ,OAAQ,EAAE,EAAG,EAAE,GAAK,KAG1FC,GACJC,GACG,CACC,GAAA,CAAC7B,EAAe,MAAM,WAAmB,MAAA,CAAC,EAAG,CAAC,EAClD,MAAM8B,EAAWjB,EAAe,MAAM,IAAIgB,EAAM,OAAO,EAAE,EAClD,OAAA7B,EAAe,MAAM,WAAW,CACrC,GAAG6B,EACH,OAAQ,CAAC,GAAGC,EAAU,UAAWD,EAAM,OAAO,SAAU,MAAOA,EAAM,OAAO,KAAM,CAAA,CACnF,CAAA,EAGGJ,GAAkBnD,GAAgD,CACtE,MAAM6C,EAAI7C,EAAI,MACV,GAAA8C,EAAaD,CAAC,GAAKE,EAAW,MAAQ,GAAK9B,EAAe,MAAQ,GAAK,OAAO4B,GAAM,SAAU,CAChG,MAAMY,EAAYxC,EAAe,MAAQ2B,EAAkB,MAAQM,EAAsB,MACzF,IAAIQ,EAAS,KAAK,MAAOD,EAAYZ,EAAKE,EAAW,KAAK,EAC1D,MAAMY,EAAQP,EAAapD,EAAI,QAAQ,GAAK,GACtC4D,EAAQR,EAAapD,EAAI,QAAQ,EAC9B,OAAA0D,EAAA,KAAK,IAAIC,EAAOD,CAAM,EAC3BE,GAAS,OAAeF,EAAA,KAAK,IAAIE,EAAOF,CAAM,GAC3CA,CACT,CACI,GAAA,OAAOb,GAAM,SAAU,CACnB,MAAAgB,EAAST,EAAaP,CAAC,GAAK,GAC5Bc,EAAQP,EAAapD,EAAI,QAAQ,EACjC4D,EAAQR,EAAapD,EAAI,QAAQ,EACvC,IAAI0D,EAASG,EACb,OAAIF,GAAS,OAAeD,EAAA,KAAK,IAAIC,EAAOD,CAAM,GAC9CE,GAAS,OAAeF,EAAA,KAAK,IAAIE,EAAOF,CAAM,GAC3CA,CACT,CACA,OAAO1D,EAAI,QAAA,EAGPgD,EAAoBhD,GACpBA,EAAI,SAAW,GAAc,GAC7B,OAAOA,EAAI,QAAW,WAAmBA,EAAI,OAAO,CAAE,OAAQA,CAAK,CAAA,EAChE,GAIH8D,EAAiBnC,EAAAA,SAAS,IAAM,OAC9B,MAAAoC,GAAc1D,EAAAqB,EAAe,MAAM,eAArB,YAAArB,EAAmC,iBACvD,OAAK0D,EACE5C,EAAU,MAAM,OAAQ6C,GAAQ,OAAA,SAAC3D,EAAA0D,EAAYC,CAAG,IAAf,MAAA3D,EAAkB,UAAQ,EADzCc,EAAU,KAC+B,CACnE,EAEK8C,EAAoBtC,EAAAA,SAAS,IAAMmC,EAAe,MAAM,OAAS,CAAC,EAGlEI,EAA2BvC,EAAAA,SAAS,IACpCmC,EAAe,MAAM,SAAW,EAAU,GACvCA,EAAe,MAAM,MAAOE,GAAQ5B,EAAgB,MAAM,IAAI4B,EAAI7B,EAAY,KAAK,CAAoB,CAAC,CAChH,EAGKgC,EAAkBxC,EAAAA,SAAS,IAAM,CACrC,MAAMyC,EAAgBN,EAAe,MAAM,OAAQE,GAAQ5B,EAAgB,MAAM,IAAI4B,EAAI7B,EAAY,KAAK,CAAoB,CAAC,EAAE,OACjI,OAAOiC,EAAgB,GAAKA,EAAgBN,EAAe,MAAM,MAAA,CAClE,EAEKO,EAAiBL,GACrB5B,EAAgB,MAAM,IAAI4B,EAAI7B,EAAY,KAAK,CAAoB,EAE/DmC,EAAuBN,GAC3B,WAAA,QAAAO,GAAAnE,GAAAC,EAAAqB,EAAe,MAAM,eAArB,YAAArB,EAAmC,mBAAnC,YAAAD,EAAA,KAAAC,EAAsD2D,KAAtD,YAAAO,EAA4D,WAAY,IAEpEC,EAAoBR,GACxB,WAAA,QAAAO,GAAAnE,GAAAC,EAAAqB,EAAe,MAAM,eAArB,YAAArB,EAAmC,gBAAnC,YAAAD,EAAA,KAAAC,EAAmD2D,KAAnD,YAAAO,EAAyD,WAAY,IAEjEE,EAAsB,IAAM,CAC1B,MAAAC,EAAOnD,EAAa,MAAM,IAAKtB,GAAMA,EAAEkC,EAAY,KAAK,CAAoB,EAClFwC,EAAK,mBAAoB,CAAE,KAAAD,EAAM,KAAMnD,EAAa,MAAO,CAAA,EAGvDqD,GAAuB,CAACZ,EAA8Ba,IAAqB,CACzE,MAAA5F,EAAM+E,EAAI7B,EAAY,KAAK,EAC7B0C,EACFtD,EAAa,MAAQ,CAAC,GAAGA,EAAa,MAAM,OAAQtB,GAAMA,EAAEkC,EAAY,KAAK,IAAMlD,CAAG,EAAG+E,CAAG,EAE/EzC,EAAA,MAAQA,EAAa,MAAM,OAAQtB,GAAMA,EAAEkC,EAAY,KAAK,IAAMlD,CAAG,EAEhEwF,GAAA,EAGhBK,GAAqBd,GAAiC,CAC7CzC,EAAA,MAAQ,CAACyC,CAAG,EACLS,GAAA,EAGhBM,GAAmBF,GAAqB,CAC5C,GAAIA,EAAS,CACX,MAAMG,EAAS,IAAI,IAAIzD,EAAa,MAAM,IAAKtB,GAAMA,EAAEkC,EAAY,KAAK,CAAC,CAAC,EACpE8C,EAAQnB,EAAe,MAAM,OAAQE,GAAQ,CAACgB,EAAO,IAAIhB,EAAI7B,EAAY,KAAK,CAAC,CAAC,EACtFZ,EAAa,MAAQ,CAAC,GAAGA,EAAa,MAAO,GAAG0D,CAAK,CAAA,KAChD,CACL,MAAMC,EAAkB,IAAI,IAAI/D,EAAU,MAAM,IAAKlB,GAAMA,EAAEkC,EAAY,KAAK,CAAC,CAAC,EAChFZ,EAAa,MAAQA,EAAa,MAAM,OAAQtB,GAAM,CAACiF,EAAgB,IAAIjF,EAAEkC,EAAY,KAAK,CAAC,CAAC,CAClG,CACoBsC,GAAA,EAGhBU,GAAY,MAAOC,GAAsB,CACzC,GAAA,CAACzF,EAAM,IAAK,CACd,GAAIA,EAAM,WAAY,OACtBwB,EAAU,MAAQ,GAClB,MACF,CACAD,EAAQ,MAAQ,GACZ,GAAA,CACF,MAAMmE,EAAK3D,EAAe,MAAM,cAAgB,CAAA,EAC1C4D,EAAYD,EAAG,WAAa,OAC5BE,EAAYF,EAAG,WAAa,WAC5BG,EAAYH,EAAG,WAAa,OAC5BI,EAAaJ,EAAG,YAAc,QAC9BK,GAAkC,CACtC,CAACJ,CAAS,GAAGF,GAAA,YAAAA,EAAK,OAAQtD,EAAW,MAAM,KAC3C,CAACyD,CAAS,GAAGH,GAAA,YAAAA,EAAK,WAAYtD,EAAW,MAAM,SAC/C,GAAGnC,EAAM,WACT,GAAGyF,GAAA,YAAAA,EAAK,UAAA,GAENA,GAAA,YAAAA,EAAK,OAAQ,OAAiBtD,EAAA,MAAM,KAAOsD,EAAI,OAC/CA,GAAA,YAAAA,EAAK,WAAY,OAAiBtD,EAAA,MAAM,SAAWsD,EAAI,UAC3D,MAAMO,GAAkBhG,EAAM,YAAcA,EAAM,YAAY+F,EAAM,EAAIA,GAClEE,GAAM,MAAMjG,EAAM,IAAKgG,EAAe,EAC9BvE,EAAA,MAASwE,IAAO,GAC9B,MAAMC,GAAQlG,EAAM,WAAaA,EAAM,WAAWiG,EAAG,EAAIA,GACnDE,GAAQD,GAAKL,CAAS,GAAKK,GAAK,OAASA,GAAK,MAAQ,GACtDE,GAASF,GAAKJ,CAAU,GAAK,EACnCtE,EAAU,MAAQ2E,GAClBhE,EAAW,MAAM,MAAQiE,GACzBpB,EAAK,gBAAiB,CAAE,MAAOmB,GAAM,MAAAC,EAAO,CAAA,QACrCC,EAAG,CACVrB,EAAK,cAAeqB,CAAC,CAAA,QACrB,CACA9E,EAAQ,MAAQ,EAClB,CAAA,EAGI+E,GAAe,IAAMd,GAAU,MAAS,EACxCe,GAAoBC,GAAiB,CACrCzE,EAAe,MAAM,0BACvBH,EAAa,MAAQ,IAEvBO,EAAW,MAAM,SAAWqE,EAC5BrE,EAAW,MAAM,KAAO,EACxBqD,GAAU,MAAS,CAAA,EAEfiB,GAAuBC,GAAiB,CACxC3E,EAAe,MAAM,0BACvBH,EAAa,MAAQ,IAEvBO,EAAW,MAAM,KAAOuE,EACxBlB,GAAU,MAAS,CAAA,EAEfmB,GAAiB,CAACtC,EAA8BuC,EAAkBC,IAAiB7B,EAAK,YAAaX,EAAKwC,CAAK,EAC/GC,GAAoB,CAACzC,EAA8BuC,EAAkBC,IAAiB7B,EAAK,eAAgBX,EAAKwC,CAAK,EACrHE,GAAmB,CAAC,CAAE,KAAAC,EAAM,MAAAC,CAA6C,IAAAjC,EAAK,cAAe,CAAE,KAAAgC,EAAM,MAAAC,CAAA,CAAO,EAC5GC,GAAqB,CAAC7C,EAA8B8C,IAAkDnC,EAAK,gBAAiBX,EAAK8C,CAAQ,EAEzIC,GAAgB9H,GACpBkC,EAAU,MAAM,UAAWlB,GAAMA,EAAEkC,EAAY,KAAK,IAAMlD,CAAG,EAEzD+H,GAA+B,CACnC,SAAWjH,GAAM,CAAEuB,EAAW,MAAQ,CAAE,GAAGA,EAAW,MAAO,GAAGvB,EAAI,EACpE,OAASqF,GAAQD,GAAUC,CAAG,EAC9B,WAAY,IAAM,UAAEhF,GAAAC,EAAAS,EAAS,QAAT,YAAAT,EAAgB,WAAhB,MAAAD,EAAA,KAAAC,EAA6B,EACjD,WAAagD,GAAM,CAAEnC,EAAQ,MAAQmC,CAAE,EACvC,cAAe,IAAMlC,EAAU,MAC/B,iBAAkB,IAAMC,EAAc,MACtC,aAAeyE,GAAS,CAAY1E,EAAA,MAAQ0E,GAAQ,EAAG,EACvD,WAAY,IAAMxE,EAAa,MAC/B,WAAaqB,GAAS,CAChB,GAAA,MAAM,QAAQA,CAAI,GAAKA,EAAK,OAAS,GAAK,OAAOA,EAAK,CAAC,GAAM,SAAU,CACzE,MAAMuE,EAAUvE,EACVwE,GAAavH,EAAM,SAAW,IAAI,OAAQ2C,GAAM2E,EAAQ,SAAU3E,EAAE,KAAOA,EAAE,SAAoB,CAAC,EAClG6E,EAAUF,EAAQ,IAAKG,GAAMF,EAAU,KAAM5E,IAAOA,EAAE,KAAOA,EAAE,aAAe8E,CAAC,CAAC,EAAE,OAAO,OAAO,EAClGD,EAAQ,SAAQ9F,EAAa,MAAQ8F,EAAA,MAE5B9F,EAAA,MAASqB,GAAwB,EAElD,EACA,cAAgB2E,GAAS,CACnBA,GAAA,MAAAA,EAAM,OAAiBvF,EAAA,MAAM,KAAOuF,EAAK,MACzCA,GAAA,MAAAA,EAAM,WAAqBvF,EAAA,MAAM,SAAWuF,EAAK,WACjDA,GAAA,YAAAA,EAAM,SAAU,SAAsBvF,EAAA,MAAM,MAAQuF,EAAK,MAC/D,EACA,iBAAkB,IAAM9F,EAAa,MAAM,IAAKtB,GAAMA,EAAEkC,EAAY,KAAK,CAAoB,EAC7F,cAAe,IAAMZ,EAAa,MAClC,qBAAsB,IAAM,CAAEA,EAAa,MAAQ,GAAwBkD,GAAE,EAC7E,mBAAqBC,GAAS,CACtB,MAAAM,EAAS,IAAI,IAAIN,CAAI,EACrB4C,EAAOnG,EAAU,MAAM,OAAQlB,GAAM+E,EAAO,IAAI/E,EAAEkC,EAAY,KAAK,CAAoB,CAAC,EACzFuC,EAAA,QAAS,GAAM,CACb4C,EAAK,KAAMrH,GAAMA,EAAEkC,EAAY,KAAK,IAAM,CAAC,GAC9CmF,EAAK,KAAK,CAAE,CAACnF,EAAY,KAAK,EAAG,EAA8B,CACjE,CACD,EACDZ,EAAa,MAAQ+F,EACD7C,GACtB,EACA,qBAAuBxF,GAAQ,CAChBsC,EAAA,MAAQA,EAAa,MAAM,OAAQtB,GAAMA,EAAEkC,EAAY,KAAK,IAAMlD,CAAG,EAC9DwF,GACtB,EACA,gBAAiB,CAAC8C,EAAOtI,EAAKI,IAAU,CAClCkI,EAAQ,GAAKA,GAASpG,EAAU,MAAM,SAC1CA,EAAU,MAAQ,CAAC,GAAGA,EAAU,KAAK,EACrCA,EAAU,MAAMoG,CAAK,EAAI,CAAE,GAAGpG,EAAU,MAAMoG,CAAK,EAAG,CAACtI,CAAG,EAAGI,CAAM,EACrE,EACA,sBAAuB,CAACmI,EAAQC,IAAW,CACnC,MAAAC,EAAMX,GAAaS,CAAM,EAC/B,GAAI,EAAAE,EAAM,GACV,OAAAvG,EAAU,MAAQ,CAAC,GAAGA,EAAU,KAAK,EAC3BA,EAAA,MAAMuG,CAAG,EAAI,CAAE,GAAGvG,EAAU,MAAMuG,CAAG,EAAG,GAAGD,GAC9CtG,EAAU,MAAMuG,CAAG,CAC5B,EACA,sBAAwBF,GAAW,CACjC,MAAM9C,EAAO,MAAM,QAAQ8C,CAAM,EAAIA,EAAS,CAACA,CAAM,EAC/CxC,EAAS,IAAI,IAAIN,CAAI,EAC3BvD,EAAU,MAAQA,EAAU,MAAM,OAAQlB,GAAM,CAAC+E,EAAO,IAAI/E,EAAEkC,EAAY,KAAK,CAAoB,CAAC,CACtG,EACA,sBAAuB,CAACsF,EAAQF,IAAU,CACxC,MAAMI,EAAM,CAAC,GAAGxG,EAAU,KAAK,EAC3B,OAAAoG,GAAS,MAAQA,GAASI,EAAI,OAAQA,EAAI,KAAKF,CAAM,EAChDE,EAAA,OAAOJ,EAAO,EAAGE,CAAM,EAChCtG,EAAU,MAAQwG,EACXF,CACT,EACA,iBAAkB,IAChBzF,EAAe,MACX,CAAE,KAAMF,EAAW,MAAM,KAAM,SAAU,OAAOA,EAAW,MAAM,QAAQ,GAAK,GAAI,MAAOA,EAAW,MAAM,OAC1G,GACN,kBAAmB,IAAME,EAAe,MACxC,kBAAoB4F,GAAS,CAAEpG,EAAkB,MAAQoG,CAAK,EAC9D,gBAAiB,IAAMlG,EAAe,MAAM,aAC5C,UAAW,IAAM,OACf,MAAMmG,IAAcxH,EAAAqB,EAAe,MAAM,YAArB,YAAArB,EAAgC,WAAY,WAC1DyH,EAAeR,GAA+D,CAClF,MAAM5D,EAAoC,CAAA,EACrC,OAAA4D,EAAA,QAAStD,IAAQ,CACpBN,EAAO,KAAKM,EAAG,EACT,MAAA+D,GAAW/D,GAAI6D,CAAW,EAC5B,MAAM,QAAQE,EAAQ,GAAKA,GAAS,OAAS,GAC/CrE,EAAO,KAAK,GAAGoE,EAAYC,EAAQ,CAAC,CACtC,CACD,EACMrE,CAAA,EAEOoE,EAAY3G,EAAU,KAAK,EACnC,QAAS6C,aAAQ,OAAA5D,IAAAC,EAAAS,EAAS,QAAT,YAAAT,EAAgB,qBAAhB,YAAAD,GAAA,KAAAC,EAAqC2D,EAAK,IAAK,CAC1E,EACA,YAAa,IAAM,OACjB,MAAM6D,IAAcxH,EAAAqB,EAAe,MAAM,YAArB,YAAArB,EAAgC,WAAY,WAC1DyH,EAAeR,GAA+D,CAClF,MAAM5D,EAAoC,CAAA,EACrC,OAAA4D,EAAA,QAAStD,IAAQ,CACpBN,EAAO,KAAKM,EAAG,EACT,MAAA+D,GAAW/D,GAAI6D,CAAW,EAC5B,MAAM,QAAQE,EAAQ,GAAKA,GAAS,OAAS,GAC/CrE,EAAO,KAAK,GAAGoE,EAAYC,EAAQ,CAAC,CACtC,CACD,EACMrE,CAAA,EAEOoE,EAAY3G,EAAU,KAAK,EACnC,QAAS6C,aAAQ,OAAA5D,IAAAC,EAAAS,EAAS,QAAT,YAAAT,EAAgB,qBAAhB,YAAAD,GAAA,KAAAC,EAAqC2D,EAAK,IAAM,CAC3E,CAAA,EAGFgE,EAAahB,EAAW,EAExB,MAAMiB,GAAc,IAAM,CAClB,MAAAC,EAAY,CAACxF,EAAmByF,EAAY,KAChDzF,EAAK,IAAI,CAACJ,EAAG8F,IAAM,CACjB,MAAMnJ,EAAM,GAAGkJ,CAAS,IAAIC,CAAC,GACtB,MAAA,CACL,GAAG9F,EACH,GAAIA,EAAE,IAAMrD,EACZ,SAAUqD,EAAE,SAAW4F,EAAU5F,EAAE,SAAUrD,CAAG,EAAI,MAAA,CACtD,CACD,EACHoC,EAAa,MAAQ6G,EAAUvI,EAAM,SAAW,CAAE,CAAA,CAAA,EAG9C0I,EAAW,IAAM,CACjB1I,EAAM,KAAO+B,EAAe,MAAM,YAAc,GAClDyD,GAAU,MAAS,EACVxF,EAAM,aACfwB,EAAU,MAAQ,CAAC,GAAGxB,EAAM,UAAU,EAClC,CAACA,EAAM,KAAOA,EAAM,aAAe,KAC1BmC,EAAA,MAAM,MAAQnC,EAAM,WAAW,QAE9C,EAGI2I,EAAuB,IAAM,CAC7BtH,EAAa,QAAsBC,EAAA,MAAQD,EAAa,MAAM,aAAe,EAAA,EAGnF,IAAIuH,EAAwC,KACxCC,EAA6B,KAEjCC,OAAAA,EAAAA,UAAU,IAAM,CACFR,KACZtD,EAAK,WAAYqC,EAAW,EACnBqB,IACL,OAAO,OAAW,MACb,OAAA,iBAAiB,SAAUC,CAAoB,EACrCC,EAAA,IAAI,eAAeD,CAAoB,EACxDI,EAAAA,SAAS,IAAM,CACQJ,IACrBE,EAAaxH,EAAa,MACtBwH,IAAYD,GAAA,MAAAA,EAAgB,QAAQC,GAAU,CACnD,EACH,CACD,EAEDG,EAAAA,YAAY,IAAM,CACZ,OAAO,OAAW,MACb,OAAA,oBAAoB,SAAUL,CAAoB,EACrDC,GAAkBC,IACpBD,EAAe,UAAUC,CAAU,EACtBA,EAAA,MAEjB,CACD,EAEDI,EAAA,MAAM,IAAMjJ,EAAM,QAASsI,GAAa,CAAE,KAAM,GAAM,EAChDW,QAAA,IAAMjJ,EAAM,WAAY,IAAM,CAC9B,CAACA,EAAM,KAAOA,EAAM,aAAYwB,EAAU,MAAQ,CAAC,GAAGxB,EAAM,UAAU,EAAA,EACzE,CAAE,KAAM,EAAA,CAAM,EACjBiJ,EAAAA,MAAM,IAAMjJ,EAAM,QAAU0D,GAAM,CAAEnC,EAAQ,MAAQmC,GAAK,EAAA,CAAO,8/LC1qBnDwF,GAAqBxJ,GAC5B,MAAM,QAAQA,CAAK,EAAUA,EAAM,OAAS,EAClBA,GAAU,MAAQ,OAAOA,CAAK,EAAE,KAAW,IAAA,GAG9DyJ,GAAqBzJ,GAC5B,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAK0J,GAAS,OAAOA,CAAI,CAAC,EAAE,KAAK,IAAI,EAEzB1J,GAAU,KAAa,GAC9C,OAAOA,GAAU,SAAiB,KAAK,UAAUA,CAAK,EACnD,OAAOA,CAAK,EAGR2J,GAAyB,CACpCC,EACAC,IACmC,CACnC,GAAI,CAACD,EAAgB,OAAA,KAErB,GAAIA,IAAY,GACP,MAAA,CACL,QAASH,GAAkBI,CAAa,EACxC,UAAW,MACX,OAAQ,OACR,SAAU,CAACL,GAAkBK,CAAa,CAAA,EAI1C,GAAA,OAAOD,GAAY,SACd,MAAA,CACL,QAASA,EACT,UAAW,MACX,OAAQ,MAAA,EAIN,MAAAE,EAAa,CAAE,GAAGF,GAExB,OAD2B,OAAO,UAAU,eAAe,KAAKE,EAAY,SAAS,IAExEA,EAAA,QAAUL,GAAkBI,CAAa,GAEjD,OAAO,UAAU,eAAe,KAAKC,EAAY,WAAW,IAC/DA,EAAW,UAAY,OAEpB,OAAO,UAAU,eAAe,KAAKA,EAAY,QAAQ,IAC5DA,EAAW,OAAS,QAEjB,OAAO,UAAU,eAAe,KAAKA,EAAY,UAAU,IAC9DA,EAAW,SAAW,CAACN,GAAkBM,EAAW,OAAO,GAGtDA,CACT,kLC+CMC,EAAoBH,GACjBD,GAAuBC,CAAO,GAAK,GAGtCI,EAAiBC,GACjBA,EAAO,KAAaA,EAAO,KAC3BA,EAAO,QAAU,QAAgB,SACjCA,EAAO,QAAU,UAAkB,UACnCA,EAAO,QAAU,UAAkB,UAChC,OAGHC,EAAiBzD,GACrBA,EAAK,OAAQiD,GAAS,CACd,KAAA,CAAE,OAAAS,CAAW,EAAAT,EACnB,OAAI,OAAOS,GAAW,UAAkBA,EACpC,OAAOA,GAAW,WAAmBA,EAAOT,CAAI,EAC7C,EAAA,CACR,EAEGU,EAAiB9H,EAAAA,SAAS,IAAM4H,EAAc5J,EAAM,SAAW,CAAE,CAAA,CAAC,EAClE+J,EAAyB/H,EAAAA,SAAS,IAAM4H,EAAc5J,EAAM,iBAAmB,CAAE,CAAA,CAAC,EAElFgK,EAAc,CAACL,EAAyBtD,IAAkB,OAC1DrG,EAAM,uBACRqG,EAAE,gBAAgB,GAEpB3F,EAAAiJ,EAAO,UAAP,MAAAjJ,EAAA,KAAAiJ,EAAiBtD,EAAC,EAGd4D,EAAoB,CAACN,EAAyBtD,IAAkB,CACpE2D,EAAYL,EAAQtD,CAAC,CAAA,EAGjB6D,EAAmB,CAACP,EAAyBQ,EAA4B9D,IAAkB,aAC3FrG,EAAM,uBACRqG,EAAE,gBAAgB,EAEfsD,EAAO,aACRQ,IAAS,WACX1J,GAAAC,EAAAiJ,EAAO,YAAW,UAAlB,MAAAlJ,EAAA,KAAAC,IAEA0J,GAAAxF,EAAA+E,EAAO,YAAW,SAAlB,MAAAS,EAAA,KAAAxF,GACF,oMAG8B,CAAC+E,EAAyBtD,IAAkB,CACzD6D,EAAAP,EAAQ,UAAWtD,CAAC,CAAA,yBAGR,CAACsD,EAAyBtD,IAAkB,CACxD6D,EAAAP,EAAQ,SAAUtD,CAAC,CAAA,wBAGPuB,GAA2B,OAClD,MAAAG,EAAM,OAAOH,CAAK,EAClB+B,EAASI,EAAuB,MAAMhC,CAAG,EAC3C,GAAA,GAAC4B,GAAUA,EAAO,UACtB,IAAIA,EAAO,WAAY,CACf,MAAAU,EAAQV,EAAO,WAAW,MAC1BW,EAASX,EAAO,WAAW,QAAU,KACrCY,EAAaZ,EAAO,WAAW,YAAc,KACxCa,cAAA,QAAQH,EAAO,KAAM,CAC9B,kBAAmBC,EACnB,iBAAkBC,EAClB,KAAM,SACP,CAAA,EACE,KAAK,aAAM,OAAA9J,GAAAC,EAAAiJ,EAAO,aAAP,YAAAjJ,EAAmB,UAAnB,YAAAD,EAAA,KAAAC,GAA8B,EACzC,MAAM,IAAA,SAAM,OAAAD,GAAAC,EAAAiJ,EAAO,aAAP,YAAAjJ,EAAmB,SAAnB,YAAAD,EAAA,KAAAC,GAA6B,EAC5C,MACF,EACOA,EAAAiJ,EAAA,UAAA,MAAAjJ,EAAA,KAAAiJ,EAAU,CAAA,GAAgB,ynEC9J5B,SAASc,GAAYzK,EAAqD,CACzE,MAAA0K,EAAiBtJ,MAA4B,IAAI,EAEjDuJ,EAAgB,IACnB3K,EAAQ4K,EAAA,MAAM5K,CAAuC,EAAI,OAEtD6K,EAAiB,IAAuB,CACtC,MAAAlB,EAASiB,QAAMF,CAAc,EACnC,GAAI,CAACf,EACG,MAAA,IAAI,MAAM,2CAA2C,EAEtD,OAAAA,CAAA,EAGHmB,EAAYC,GAA8B,CAC9CL,EAAe,MAAQK,EACvB,MAAMC,EAAaL,IACfK,GAAc,OAAO,KAAKA,CAAU,EAAE,OAAS,GACjDD,EAAS,SAASC,CAAU,CAC9B,EAGF,OAAIhL,GACFiJ,EAAA,MACE,IAAM0B,EAAc,EACnBK,GAAe,CACVA,GAAcN,EAAe,OAChBA,EAAA,MAAM,SAASM,CAAU,CAE5C,EACA,CAAE,KAAM,EAAK,CAAA,EAgCV,CAACF,EA5BmC,CACzC,SAAW1K,GAAMyK,EAAe,EAAE,SAASzK,CAAC,EAC5C,OAASqF,GAAQoF,EAAe,EAAE,OAAOpF,CAAG,EAC5C,WAAY,IAAMoF,EAAe,EAAE,WAAW,EAC9C,WAAanH,GAAMmH,EAAe,EAAE,WAAWnH,CAAC,EAChD,cAAe,IAAMmH,EAAe,EAAE,cAAc,EACpD,iBAAkB,IAAMA,EAAe,EAAE,iBAAiB,EAC1D,aAAe3E,GAAS2E,EAAe,EAAE,aAAa3E,CAAI,EAC1D,WAAY,IAAM2E,EAAe,EAAE,WAAW,EAC9C,WAAa9H,GAAS8H,EAAe,EAAE,WAAW9H,CAAI,EACtD,cAAgB2E,GAASmD,EAAe,EAAE,cAAcnD,CAAI,EAC5D,iBAAkB,IAAMmD,EAAe,EAAE,iBAAiB,EAC1D,cAAe,IAAMA,EAAe,EAAE,cAAc,EACpD,qBAAsB,IAAMA,EAAe,EAAE,qBAAqB,EAClE,mBAAqB9F,GAAS8F,EAAe,EAAE,mBAAmB9F,CAAI,EACtE,qBAAuBzF,GAAQuL,EAAe,EAAE,qBAAqBvL,CAAG,EACxE,gBAAiB,CAACsI,EAAOtI,EAAKI,IAAUmL,EAAiB,EAAA,gBAAgBjD,EAAOtI,EAAKI,CAAK,EAC1F,sBAAuB,CAACmI,EAAQC,IAAW+C,IAAiB,sBAAsBhD,EAAQC,CAAM,EAChG,sBAAwBD,GAAWgD,EAAe,EAAE,sBAAsBhD,CAAM,EAChF,sBAAuB,CAACC,EAAQF,IAAUiD,IAAiB,sBAAsB/C,EAAQF,CAAK,EAC9F,iBAAkB,IAAMiD,EAAe,EAAE,iBAAiB,EAC1D,kBAAmB,IAAMA,EAAe,EAAE,kBAAkB,EAC5D,kBAAoB5C,GAAS4C,EAAe,EAAE,kBAAkB5C,CAAI,EACpE,gBAAiB,IAAM4C,EAAe,EAAE,gBAAgB,EACxD,UAAW,IAAA,SAAM,OAAApK,GAAAC,EAAAmK,EAAe,GAAE,YAAjB,YAAApK,EAAA,KAAAC,IACjB,YAAa,IAAA,SAAM,OAAAD,GAAAC,EAAAmK,EAAe,GAAE,cAAjB,YAAApK,EAAA,KAAAC,GAA+B,CAGtB,CAChC,4VC5CMa,EAAUH,MAAI,EAAK,EACnB6J,EAAU7J,MAA8C,CAAA,CAAE,EAC1D8J,EAAa9J,MAAe,CAAA,CAAE,EAE9B+J,EAAiBC,GACjBA,GAAQ,KAAkC,OACvC,KAAK,UAAUC,EAASD,CAAG,CAAC,EAG/BC,EAAYD,GACZ,MAAM,QAAQA,CAAG,EAAUA,EAAI,IAAIC,CAAQ,EAC3CD,IAAQ,MAAQ,OAAOA,GAAQ,SAC1B,OAAO,KAAKA,CAA8B,EAC9C,OACA,OAAgC,CAACE,EAAKhM,KACrCgM,EAAIhM,CAAG,EAAI+L,EAAUD,EAAgC9L,CAAG,CAAC,EAClDgM,GACN,CAAE,CAAA,EAEFF,EAGHG,EAAuBnK,EAAAA,IAAY+J,EAAcnL,EAAM,QAAU,IAAI,CAAC,EAEtEwL,EAAmBC,GAAqB,CACxCzL,EAAM,MAAQyL,IACEN,EAAcnL,EAAM,QAAU,IAAI,IAClCuL,EAAqB,OAASN,EAAQ,MAAM,SAAW,IAC1DS,GAEjB,EAGIA,EAAe,SAAY,CAC/B,GAAK1L,EAAM,IACX,CAAAuB,EAAQ,MAAQ,GACZ,GAAA,CACF,MAAM0E,EAAM,MAAMjG,EAAM,IAAIA,EAAM,MAAM,EAClC2L,EAAM,MAAM,QAAQ1F,CAAG,EACzBA,GACEA,GAAA,YAAAA,EAAiC,QACnCA,GAAA,YAAAA,EAAiC,OACnC,CAAA,EACFiF,EAAW,MAAQS,EACb,MAAAC,EAAW5L,EAAM,YAAc,QAC/B6L,EAAW7L,EAAM,YAAc,QACrCiL,EAAQ,MAAQU,EAAI,IAAKvC,GAAkB,CACzC,MAAM0C,EAAI1C,EACH,MAAA,CACL,MAAO,OAAO0C,EAAEF,CAAQ,GAAKE,EAAE,OAAS,EAAE,EAC1C,MAAOA,EAAED,CAAQ,GAAKC,EAAE,KAAA,CAC1B,CACD,EACDP,EAAqB,MAAQJ,EAAcnL,EAAM,QAAU,IAAI,CAAA,QAC/D,CACAuB,EAAQ,MAAQ,EAClB,EAAA,EAGW,OAAA8G,EAAA,CACX,QAAA4C,EACA,WAAAC,EACA,QAAA3J,EACA,aAAAmK,CAAA,CACD,EAED5C,EAAAA,UAAU,IAAM,CACT9I,EAAM,MAAmB0L,GAAA,CAC/B,EACDzC,EAAA,MAAM,IAAMjJ,EAAM,IAAK,IAAM,CACtBA,EAAM,MAGTiL,EAAQ,MAAQ,GAChBC,EAAW,MAAQ,IAHNQ,GAKjB,EAAG,CAAE,KAAM,EAAK,CAAA,EAEVzC,QAAA,IAAMjJ,EAAM,OAAQ,IAAM,CACfmL,EAAcnL,EAAM,QAAU,IAAI,IAClCuL,EAAqB,QAChCvL,EAAM,MACRiL,EAAQ,MAAQ,GAChBC,EAAW,MAAQ,IAENQ,IACf,EACC,CAAE,KAAM,EAAA,CAAM,4sBCrHV,SAASK,GAAqBJ,EAAqB,CAClD,MAAAK,EAAIL,EAAI,OACd,GAAI,CAACK,EAAU,MAAA,GACf,IAAIvD,EAAI,EACJxC,EAAM,GACN+F,EAAE,CAAC,IAAM,MACL/F,EAAA,IACFwC,EAAA,GAEN,IAAIwD,EAAM,GACH,KAAAxD,EAAIuD,EAAE,OAAQvD,IAAK,CAClB,MAAA9F,EAAIqJ,EAAEvD,CAAC,EACT,GAAA9F,GAAK,KAAOA,GAAK,IAAK,CACjBsD,GAAAtD,EACP,QACF,CACIA,IAAM,KAAO,CAACsJ,IACVA,EAAA,IACFhG,IAAQ,IAAMA,IAAQ,OAAYA,GAAA,KAC/BA,GAAA,IAEX,CACO,OAAAA,CACT,CAEO,SAASiG,GAAoB,EAAmB,CACrD,OAAO,EAAE,QAAQ,KAAM,EAAE,EAAE,KAAK,CAClC,CAMgB,SAAAC,GACdC,EACAC,EACAC,EACQ,CACJ,GAAA,CAACF,GAAaA,IAAc,IAAY,OAAAA,EACtC,MAAAG,EAAMH,EAAU,CAAC,IAAM,IAC7B,IAAII,EAAOD,EAAMH,EAAU,MAAM,CAAC,EAAIA,EAChC,MAAAK,EAASD,EAAK,QAAQ,GAAG,EAC/B,GAAIC,IAAW,GAAI,CACjB,MAAMC,EAAS,KAAK,IAAI,EAAGL,CAAa,EACxC,OAAAG,EAAOE,EAAS,EAAIF,EAAK,MAAM,EAAGE,CAAM,EAAIF,EACrCD,EAAM,IAAMC,EAAOA,CAC5B,CACA,IAAIG,EAAUH,EAAK,MAAM,EAAGC,CAAM,EAC9BJ,EAAgB,IACRM,EAAAA,EAAQ,MAAM,EAAGN,CAAa,GAE1C,MAAMO,EAAWJ,EAAK,MAAMC,EAAS,CAAC,EAChCI,EAAcD,IAAa,IAAMJ,EAAK,SAAS,GAAG,EACxD,GAAIF,GAAiB,EACZ,OAAAC,EAAM,IAAMI,EAAUA,EAE/B,GAAIE,EACM,OAAAN,EAAM,IAAM,IAAMI,EAAU,IAEtC,MAAMG,EAAUF,EAAS,MAAM,EAAGN,CAAa,EAC/C,OAAQC,EAAM,IAAM,IAAMI,EAAU,IAAMG,CAC5C,CAEA,SAASC,GAAYV,EAAuBC,EAA+B,CACzE,MAAMI,EAAS,KAAK,IAAI,GAAIL,CAAa,EAAI,EAC7C,OAAIC,GAAiB,EAAUI,EACxBA,GAAU,EAAI,KAAK,IAAI,GAAI,CAACJ,CAAa,EAClD,CAGgB,SAAAU,GACdtN,EACA2M,EACAC,EACQ,CACF,MAAAW,EAAMF,GAAYV,EAAeC,CAAa,EAC9CY,EAAOxN,EAAQ,EAAI,GAAK,EAE9B,OADY,KAAK,IAAIA,CAAK,GACfuN,EAAYvN,EAChBwN,EAAOD,CAChB,CAEgB,SAAAE,GACdzN,EACA4M,EACAc,EACQ,CACR,GAAId,GAAiB,EACnB,OAAQc,EAAU,CAChB,IAAK,QACI,OAAA,KAAK,MAAM1N,CAAK,EACzB,IAAK,OACI,OAAA,KAAK,KAAKA,CAAK,EACxB,QACS,OAAA,KAAK,MAAMA,CAAK,CAC3B,CAEF,MAAM2N,EAAS,KAAK,IAAI,GAAIf,CAAa,EACnCvL,EAAIrB,EAAQ2N,EACd,IAAAC,EACJ,OAAQF,EAAU,CAChB,IAAK,QACCE,EAAA,KAAK,MAAMvM,CAAC,EAChB,MACF,IAAK,OACCuM,EAAA,KAAK,KAAKvM,CAAC,EACf,MACF,QACMuM,EAAA,KAAK,MAAMvM,CAAC,CACpB,CACA,OAAOuM,EAAID,CACb,CAKO,SAASE,GACd7N,EACA2M,EACAC,EACAc,EACQ,CACR,IAAI1J,EAAIsJ,GAAqBtN,EAAO2M,EAAeC,CAAa,EAC5D,OAAA5I,EAAAyJ,GAAgBzJ,EAAG4I,EAAec,CAAQ,EAC1C1J,EAAAsJ,GAAqBtJ,EAAG2I,EAAeC,CAAa,EACjD5I,CACT,CAKgB,SAAA8J,GAAqB9N,EAAe4M,EAA+B,CACjF,OAAI,OAAO,MAAM5M,CAAK,GAAK,CAAC,OAAO,SAASA,CAAK,EAAU,GACpDA,EAAM,QAAQ,KAAK,IAAI,EAAG4M,CAAa,CAAC,CACjD,CAGgB,SAAAmB,GAAoB/N,EAAe4M,EAA+B,CAChF,GAAI,OAAO,MAAM5M,CAAK,GAAK,CAAC,OAAO,SAASA,CAAK,EAAU,MAAA,GAC3D,MAAMgO,EAAQhO,EAAM,QAAQ,KAAK,IAAI,EAAG4M,CAAa,CAAC,EAChDC,EAAMmB,EAAM,WAAW,GAAG,EAC1BlB,EAAOD,EAAMmB,EAAM,MAAM,CAAC,EAAIA,EAC9B,CAACf,EAASG,CAAO,EAAIN,EAAK,MAAM,GAAG,EACnCmB,EAAUhB,EAAQ,QAAQ,wBAAyB,GAAG,EACxD,OAAAL,GAAiB,GAAKQ,IAAY,QAAmBP,EAAM,IAAM,IAAMoB,GACnEpB,EAAM,IAAM,IAAMoB,EAAU,IAAMb,CAC5C,CAGgB,SAAAc,GAAmBlO,EAAe4M,EAA+B,CAC/E,GAAI,OAAO,MAAM5M,CAAK,GAAK,CAAC,OAAO,SAASA,CAAK,EAAU,MAAA,GAC3D,IAAImO,EAAInO,EAAM,QAAQ,KAAK,IAAI,EAAG4M,CAAa,CAAC,EAC5C,OAAAuB,EAAAA,EAAE,QAAQ,cAAe,IAAI,EAC7BA,EAAAA,EAAE,QAAQ,MAAO,EAAE,EAChBA,CACT,uRC3GMC,EAAU1M,MAAI,EAAK,EACnB2M,EAAc3M,MAAI,EAAE,EAEpB4M,EAAO,IAAM,KAAK,IAAI,EAAG,KAAK,MAAMhO,EAAM,eAAiB,CAAC,CAAC,EAC7DiO,EAAO,IAAM,KAAK,IAAI,EAAG,KAAK,MAAMjO,EAAM,eAAiB,CAAC,CAAC,EAEnE,SAASkO,EAAsBxK,EAA2B,CACxD,GAAIA,GAAM,MAA2BA,IAAM,GAAW,OAAA,KAClD,GAAA,OAAOA,GAAM,SACf,OAAO,OAAO,SAASA,CAAC,EAAIA,EAAI,KAElC,MAAMmK,EAAI3B,GAAoB,OAAOxI,CAAC,CAAC,EACnC,GAAAmK,IAAM,IAAMA,IAAM,IAAY,OAAA,KAC5B,MAAAM,EAAM,OAAON,CAAC,EACpB,OAAO,OAAO,SAASM,CAAG,EAAIA,EAAM,IACtC,CAEA,SAASC,GAAuB,CAC9B,GAAIN,EAAQ,MAAO,OACb,MAAAK,EAAMD,EAAsBlO,EAAM,KAAK,EAC7C,GAAImO,IAAQ,KAAM,CAChBJ,EAAY,MAAQ,GACpB,MACF,CACAA,EAAY,MAAQN,GAClBF,GAAsBY,EAAKH,EAAA,EAAQC,EAAK,EAAGjO,EAAM,QAAQ,EACzDiO,EAAK,CAAA,CAET,CAEAhF,EAAA,MACE,IAAM,CAACjJ,EAAM,MAAOA,EAAM,cAAeA,EAAM,cAAeA,EAAM,QAAQ,EAC5E,IAAMoO,EAAqB,EAC3B,CAAE,UAAW,GAAM,KAAM,EAAK,CAAA,EAGhC,SAASC,EAAgB7E,EAAoB,CAC3CxE,EAAK,QAASwI,GAAqBhE,EAAYyE,EAAA,CAAM,CAAC,CACxD,CAEA,SAASK,EAAQC,EAAa,CACxB,IAAAC,EAAQzC,GAAqBwC,CAAG,EAKhC,GAJAvO,EAAM,aAAe,KACvBwO,EAAQrC,GAA6BqC,EAAOR,EAAK,EAAGC,EAAM,CAAA,GAE5DF,EAAY,MAAQS,EAChBA,IAAU,IAAMA,IAAU,IAAK,OAC7B,MAAAL,EAAM,OAAOK,CAAK,EACpB,GAAA,CAAC,OAAO,SAASL,CAAG,EAAG,OACrB,MAAA3E,EAAa+D,GAAsBY,EAAKH,IAAQC,EAAK,EAAGjO,EAAM,QAAQ,EAC5EqO,EAAgB7E,CAAU,CAC5B,CAEA,SAASiF,GAAU,CACjBX,EAAQ,MAAQ,GACV,MAAAnC,EAAMO,GAAoB6B,EAAY,KAAK,EAC3CI,EAAMD,EAAsBvC,IAAQ,GAAK3L,EAAM,MAAQ2L,CAAG,EAChE,GAAIwC,IAAQ,KAAM,CAChBJ,EAAY,MAAQ,GACpB,MACF,CACAA,EAAY,MAAQH,GAClBL,GAAsBY,EAAKH,EAAA,EAAQC,EAAK,EAAGjO,EAAM,QAAQ,EACzDiO,EAAK,CAAA,CAET,CAEA,SAASS,GAAS,CAChBZ,EAAQ,MAAQ,GACV,MAAAnC,EAAMO,GAAoB6B,EAAY,KAAK,EAC7C,GAAApC,IAAQ,IAAMA,IAAQ,IAAK,CAC7BoC,EAAY,MAAQ,GACpB/I,EAAK,QAAS,MAAS,EACvB,MACF,CACA,MAAM2J,EAAS,OAAO5C,GAAqBJ,CAAG,CAAC,EAC/C,GAAI,CAAC,OAAO,SAASgD,CAAM,EAAG,CAC5BZ,EAAY,MAAQ,GACpB/I,EAAK,QAAS,MAAS,EACvB,MACF,CACM,MAAA4J,EAAQrB,GAAsBoB,EAAQX,IAAQC,EAAK,EAAGjO,EAAM,QAAQ,EAC1E+N,EAAY,MAAQN,GAAoBmB,EAAOX,EAAM,CAAA,EACrDI,EAAgBO,CAAK,CACvB,+zBCxDMC,EAAUzN,EAAAA,MACV0N,EAAU1N,EAAAA,MACV2N,EAAkB3N,MAAI,EAAK,EAC3BG,EAAUH,MAAI,EAAK,EACnB4N,EAAa5N,MAAI,EAAE,EACnB6N,EAAW7N,MAAgB,CAAA,CAAE,EAC7B8N,EAAe9N,MAA4B,CAAA,CAAE,EAE7C+N,EAAYnN,EAAAA,SAAS,KAAO,CAChC,MAAOhC,EAAM,WACb,SAAUA,EAAM,aAChB,EAAA,EAEF,SAASoP,EAAcC,EAAyC,CACxD,MAAAzD,EAAW5L,EAAM,YAAc,QAC/B6L,EAAW7L,EAAM,YAAc,QAC/BkI,EAAclI,EAAM,eAAiB,WACrCoI,EAAWiH,EAAKnH,CAAW,EAC3BoH,EAAgB,CAAA,EACtB,OAAAA,EAAItP,EAAM,YAAc,OAAO,EAAIqP,EAAKzD,CAAQ,GAAKyD,EAAK,MAC1DC,EAAItP,EAAM,YAAc,OAAO,EAAIqP,EAAKxD,CAAQ,GAAKwD,EAAK,MACtD,MAAM,QAAQjH,CAAQ,GAAKA,EAAS,SAClCkH,EAAAtP,EAAM,eAAiB,UAAU,EAAIoI,EAAS,IAAKzF,GAAMyM,EAAczM,CAA4B,CAAC,GAEnG2M,CACT,CAES,SAAAC,EAAkB1O,EAAmB2O,EAAS,GAA4B,CACjF,MAAM3M,EAA8B,CAAA,EAC9B+I,EAAW5L,EAAM,YAAc,QAC/B6L,EAAW7L,EAAM,YAAc,QAC/BkI,EAAclI,EAAM,eAAiB,WAC3C,UAAWqP,KAAQxO,EAAO,CACxB,MAAM4O,EAAQ,OAAOJ,EAAKzD,CAAQ,GAAKyD,EAAK,OAAS,EAAE,EACjD3P,EAAQ2P,EAAKxD,CAAQ,GAAKwD,EAAK,MACV3P,GAAU,OACnCmD,EAAI,OAAOnD,CAAK,CAAC,EAAI8P,EAASA,EAAS,MAAQC,EAAQA,GAEzD,MAAMrH,GAAWiH,EAAKnH,CAAW,GAAKmH,EAAK,SACvC,MAAM,QAAQjH,EAAQ,GAAKA,GAAS,QACtC,OAAO,OAAOvF,EAAK0M,EAAkBnH,GAAwBqH,CAAK,CAAC,CAEvE,CACO,OAAA5M,CACT,CAEA,SAAS6M,GAAkB,CACzB,MAAMC,EAAK3P,EAAM,SACjB,OAAO,MAAM,QAAQ2P,CAAE,GAAKA,EAAG,OAAS,CAC1C,CAEA,SAASC,EAAc/O,EAAmB,CACxCoO,EAAS,MAAQpO,EACJqO,EAAA,MAAQK,EAAkB1O,CAAK,CAC9C,CAEA,SAASgP,GAAuB,CAC9B,MAAMF,EAAK3P,EAAM,SACjB,GAAI,CAAC,MAAM,QAAQ2P,CAAE,GAAKA,EAAG,SAAW,EAAG,OAC3C,MAAMnG,EAAamG,EAAG,IAAKvG,GAASgG,EAAchG,CAA+B,CAAC,EAClFwG,EAAcpG,CAAU,CAC1B,CAEM,MAAAuE,EAAc/L,EAAAA,SAAS,IACvBhC,EAAM,OAAS,MAAQA,EAAM,QAAU,GAAW,GAC/CkP,EAAa,MAAM,OAAOlP,EAAM,KAAK,CAAC,GAAK,OAAOA,EAAM,KAAK,CACrE,EAEK8P,EAAmB,CAACpQ,EAAewG,IAAmB,CAC1D,GAAI,CAACxG,EAAc,MAAA,GACb,MAAAkM,EAAW5L,EAAM,YAAc,QAErC,OADc,OAAOkG,EAAK0F,CAAQ,GAAK1F,EAAK,OAAS,EAAE,EAC1C,YAAY,EAAE,SAASxG,EAAM,aAAa,CAAA,EAGnDuJ,QAAA+F,EAAaT,GAAQ,QACjB7N,EAAAoO,EAAA,QAAA,MAAApO,EAAO,OAAO6N,EAAG,CAC1B,EAED,IAAIwB,EAAwD,KAE5D,SAASC,GAAe,CAClBhQ,EAAM,WACV+O,EAAgB,MAAQ,GACpB/O,EAAM,MAAQ,CAAC0P,EAAgB,GAAalK,IAChDuD,EAAAA,SAAS,IAAM,CACbgH,EAAuB1J,GAAkB,CACnCwI,EAAQ,OAAS,CAACA,EAAQ,MAAM,SAASxI,EAAE,MAAc,GAC7C4J,GAChB,EAEO,SAAA,iBAAiB,QAASF,CAAmB,CAAA,CACvD,EACH,CAEA,SAASE,GAAgB,CACvBlB,EAAgB,MAAQ,GACxBC,EAAW,MAAQ,GACfe,IACO,SAAA,oBAAoB,QAASA,CAAmB,EACnCA,EAAA,KAE1B,CAEA,SAASG,GAAa,CACpBlL,EAAK,QAAS,MAAS,CACzB,CAEA,SAASmL,EAAYjK,EAAgB,CAC7B,MAAA2F,EAAW7L,EAAM,YAAc,QAC/BuO,EAAMrI,EAAK2F,CAAQ,GAAK3F,EAAK,MACnClB,EAAK,QAASuJ,CAAG,EACH0B,GAChB,CAEA,eAAezK,GAAY,CACrB,GAAA,GAACxF,EAAM,KAAO0P,EAAgB,GAClC,CAAAnO,EAAQ,MAAQ,GACZ,GAAA,CACF,MAAM0E,EAAM,MAAMjG,EAAM,IAAIA,EAAM,MAAM,EAClC2L,EAAM,MAAM,QAAQ1F,CAAG,EACzBA,GACEA,GAAA,YAAAA,EAAiC,QACjCA,GAAA,YAAAA,EAAiC,OACnC,CAAA,EACJgJ,EAAS,MAAQtD,EAAI,IAAKvC,GAASgG,EAAchG,CAA+B,CAAC,EACpE8F,EAAA,MAAQK,EAAkBN,EAAS,KAAK,CAAA,QACrD,CACA1N,EAAQ,MAAQ,EAClB,EACF,CAEAuH,OAAAA,EAAAA,UAAU,IAAM,CACV4G,IACmBG,IACX7P,EAAM,MACNwF,GACZ,CACD,EAEKyD,QAAA,IAAMjJ,EAAM,SAAU,IAAM,CAC5B0P,IACmBG,KAErBZ,EAAS,MAAQ,GACjBC,EAAa,MAAQ,GACjB,CAAClP,EAAM,MAAQA,EAAM,KAAewF,IAC1C,EACC,CAAE,KAAM,EAAA,CAAM,EAEXyD,QAAA,IAAMjJ,EAAM,IAAK,IAAM,CACvB0P,EAAgB,IACf1P,EAAM,MACJiP,EAAS,MAAQ,GAAIC,EAAa,MAAQ,IADtB1J,IACyB,EACnD,CAAE,KAAM,EAAA,CAAM,EAEXyD,QAAA,IAAMjJ,EAAM,OAAQ,IAAM,CAC1B0P,EAAgB,IAChB1P,EAAM,MAAQiP,EAAS,MAAQ,GAAIC,EAAa,MAAQ,IAC7C1J,IAAA,EACd,CAAE,KAAM,EAAA,CAAM,u+DCpDX4K,MAAuC,IAAI,CAC/C,QAAS,SAAU,aAAc,cAAe,cAAe,aAAc,eAC7E,mBACA,SAAU,WAAY,WAAY,OAAA,CACnC,EAiBKC,EAAejP,MAAoC,IAAI,EAE7D0H,EAAAA,UAAU,IAAM,OACV9I,EAAM,OAAO,YAAc,gBAC7BU,EAAAV,EAAM,wBAAN,MAAAU,EAAA,KAAAV,EAA8BA,EAAM,OAAO,MAAOqQ,EAAa,OACjE,CACD,EAEDrH,EAAAA,YAAY,IAAM,OACZhJ,EAAM,OAAO,YAAc,gBAC7BU,EAAAV,EAAM,wBAAN,MAAAU,EAAA,KAAAV,EAA8BA,EAAM,OAAO,MAAO,MACpD,CACD,EAED,MAAMkB,EAAQD,EAAAA,WAERqP,EAAetO,EAAAA,SAA+B,KAAO,CACzD,OAAQhC,EAAM,OACd,OAAQA,EAAM,UACd,MAAOA,EAAM,UACb,MAAOA,EAAM,OAAO,KACpB,EAAA,EAEIuQ,EAAevO,EAAAA,SAAS,IAAM,CAC5B,MAAA6H,EAAS7J,EAAM,OAAO,OAC5B,OAAI6J,IAAW,OAAkB,GAC7B,OAAOA,GAAW,UAAkBA,EACjCA,EAAOyG,EAAa,KAAK,CAAA,CACjC,EAEKE,EAAaxO,EAAAA,SAAS,IAAM,CAC1B,MAAAiG,EAAOjI,EAAM,OAAO,KAC1B,OAAIiI,IAAS,OAAkB,GAC3B,OAAOA,GAAS,UAAkBA,EAC/BA,EAAKqI,EAAa,KAAK,CAAA,CAC/B,EAEKG,EAAoBzO,EAAAA,SAAS,IAAM,CACvC,GAAIhC,EAAM,aAAqB,MAAA,GACzB,MAAA0Q,EAAM1Q,EAAM,OAAO,gBACzB,OAAI0Q,IAAQ,OAAkB,GAC1B,OAAOA,GAAQ,UAAkBA,EAC9BA,EAAIJ,EAAa,KAAK,CAAA,CAC9B,EAEKK,EAAiB3O,EAAAA,SAAS,IAAM,CAC9B,MAAA0O,EAAM1Q,EAAM,OAAO,aACzB,OAAK0Q,EACD,MAAM,QAAQA,CAAG,EAAUA,EACxBA,EAAIJ,EAAa,KAAK,EAFZtQ,EAAM,OAAO,KAED,CAC9B,EAEK4Q,EAAsC5O,EAAAA,SAAS,IAAM,CACnD,MAAA6O,EAAK7Q,EAAM,OAAO,eACxB,GAAI,CAAC6Q,EAAI,MAAO,CAAE,MAAO,CAAA,EAAI,UAAW,CAAG,CAAA,EAC3C,MAAMlF,EAAM,OAAOkF,GAAO,WACtBA,EAAG,CACD,GAAGP,EAAa,MAChB,eAAgBtQ,EAAM,cAAA,CACvB,EACD,CAAE,GAAG6Q,GACHC,EAAqC,CAAA,EACrCC,EAA6D,CAAA,EACnE,SAAW,CAACzR,EAAKI,CAAK,IAAK,OAAO,QAAQiM,CAAG,EACvC,GAAArM,EAAI,OAAS,GAAK,cAAc,KAAKA,CAAG,GAAK,OAAOI,GAAU,WAAY,CAC5E,MAAMsR,EAAY1R,EAAI,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EACpEyR,EAAUC,CAAS,EAAItR,CAAA,MAEvBoR,EAAUxR,CAAG,EAAII,EAGd,MAAA,CAAE,MAAOoR,EAAW,UAAAC,EAAU,CACtC,EAEKE,EAA0BjP,EAAAA,SAAS,IAAM4O,EAAoC,MAAM,KAAK,EACxFM,EAA8BlP,EAAAA,SAAS,IAAM4O,EAAoC,MAAM,SAAS,EAChGO,EAAYnP,WAAS,IAAMhC,EAAM,OAAO,OAASA,EAAM,OAAS,EAAK,EAErEoR,EAAoBpP,EAAAA,SAAS,IAAM,CACjC,MAAAsH,EAAUtJ,EAAM,OAAO,QAC7B,GAAI,CAACsJ,EAAgB,OAAA,KACrB,MAAM+H,EAAW,OAAO/H,GAAY,WAAaA,EAAQgH,EAAa,KAAK,EAAIhH,EAC/E,OAAOD,GAAuBgI,EAAUrR,EAAM,UAAUA,EAAM,OAAO,KAAK,CAAC,CAAA,CAC5E,EAEKsR,EAAwBtP,EAAAA,SAAS,IAAMoP,EAAkB,MAAQ,aAAe,MAAM,EACtFG,EAAoBvP,EAAAA,SAAS,IAAMoP,EAAkB,OAAS,CAAE,CAAA,EAEhEI,EAAUxP,EAAAA,SAAS,IAAM,CAAC,CAACd,EAAM,OAAO,EAExCuQ,EAAczR,GAAyF,CAC3G,MAAM0R,EAAO1R,GAAAA,YAAAA,EAAO,QACpB,OAAO,MAAM,QAAQ0R,CAAI,EAAIA,EAAO,MAAA,EAGhCC,EAA0B3P,EAAAA,SAAS,IAAM,CACvC,MAAAW,EAAI3C,EAAM,OAAO,UACvB,OAAI2C,GAAK,KAAa,KAClB,OAAOA,GAAM,SACXyN,EAAoB,IAAIzN,CAAC,EAAU,KAC/B3C,EAAM,kBAAoBA,EAAM,iBAAiB2C,CAAC,GAAMA,EAE3DA,CAAA,CACR,EAEKiP,EAAiBlO,GAAe,QACpChD,EAAAV,EAAM,gBAAN,MAAAU,EAAA,KAAAV,EAAsBA,EAAM,OAAO,MAAO0D,EAAC,EAGvCmO,EAAkB7P,EAAAA,SAAS,IAAM,CAC/B,MAAA8P,EAAW9R,EAAM,OAAO,OAC9B,OAAK8R,EACE,CACL,QAAS,CACD,MAAA/N,EAAS+N,EAASxB,EAAa,KAAK,EACtC,OAAA,MAAM,QAAQvM,CAAM,EACfxD,EAAA,EAAE,OAAQwD,CAAM,EAElBA,CACT,CAAA,EARoB,IAStB,CACD,s7RC3MK7C,EAAQD,EAAAA,WACR8Q,EAAU3Q,EAAAA,MACV4Q,EAAc5Q,EAAAA,MACd6Q,EAAgB7Q,MAAI,EAAK,EACzB8Q,EAAY9Q,MAAI,EAAI,EACpB+Q,EAAY/Q,MAA6B,CAAA,CAAE,EAC3CgR,EAAYhR,MAA+B,CAAA,CAAE,EAC7CiR,EAAejR,MAAqB,CAAA,CAAE,EACtCO,EAAaP,MAA2B,CAAA,CAAE,EAE1CkR,EAAmBlR,EAAAA,IAA8C,IAAA,GAAK,EAGtEmR,EAAc,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,KAGjDC,EAAmB,CAACC,EAAyBC,EAA6BC,IAA2B,CACzG,MAAMzP,EAAIyP,IAAU,OAAO,OAAW,IAAc,OAAO,WAAa,MAClEtS,EAAMoS,GAAY,GAClBG,EAAOF,GAAgB,GACvBG,EAAWD,EAAK,MAAQ,EAC9B,OAAI1P,GAAKqP,EAAY,GAAWlS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,MAAQwS,EACjJ3P,GAAKqP,EAAY,GAAWlS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,MAAQwS,EAC5H3P,GAAKqP,EAAY,GAAWlS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,MAAQwS,EACvG3P,GAAKqP,EAAY,GAAWlS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,MAAQwS,EAE/ExS,EAAI,IAAMuS,EAAK,IAAMvS,EAAI,MAAQwS,CAAA,EAGpC,CAAE,WAAYC,CAAoB,EAAIlT,GAAoB,EAC1DmC,EAAiBC,EAAAA,SAAS,KAAO,CAAE,GAAG8Q,EAAoB,SAAS,EAAG,GAAG9S,EAAO,GAAG2B,EAAW,OAAQ,EACtGoR,EAAuB/Q,EAAAA,SAAS,IAAMD,EAAe,MAAM,UAAU,EACrEiR,EAAehR,EAAAA,SAAS,IAAM+Q,EAAqB,QAAU,MAAS,EACtEE,EAAmBjR,EAAAA,SAAkC,IAClDgR,EAAa,MACfD,EAAqB,OAAS,GAC/BZ,EAAU,KACf,EAEKe,EAAuBlR,EAAAA,SAAS,KAAO,CAC3C,GAAI8Q,EAAoB,SAAS,EAAE,YAAsD,CAAC,EAC1F,GAAI/Q,EAAe,MAAM,YAAc,CAAC,EACxC,GAAIJ,EAAW,MAAM,YAAc,CAAC,CACpC,EAAA,EACIwR,EAA4BnR,WAAS,IAAMD,EAAe,MAAM,kBAAoB,CAAE,KAAM,EAAA,CAAI,EAGhGqR,EAAchS,EAAI,IAAA,OAAO,OAAW,IAAc,OAAO,WAAa,IAAI,EAG1EiS,EAAwB,CAC5BC,EACAZ,EACAa,EACAZ,IACG,CACH,IAAIa,EAAY,GACZ7L,EAAO,EACP8L,EAAQ,EACZ,UAAWC,KAAUJ,EAAS,CAC5B,MAAMK,EAAOnB,EAAiBkB,EAAO,SAAUhB,EAAcC,CAAK,EAClE,GAAIgB,EAAOH,EAAW,CAEpB,GADA7L,IACIA,EAAO4L,EAAU,MACrBC,EAAY,GAAKG,CAAA,MAEJH,GAAAG,EAEfF,GACF,CACO,OAAAA,CAAA,EAGHG,EAAgB5R,EAAAA,SAAS,IAAM,CAC7B,MAAAsR,EAAUjB,EAAa,MAAM,OAAQxE,GAAM2C,EAAW3C,CAAC,CAAC,EAE1D,GAAA,CAAC9L,EAAe,MAAM,mBAA2B,MAAA,GAC/C,MAAA8R,EAAQ9R,EAAe,MAAM,iBAAmB,EAChD2Q,EAAe3Q,EAAe,MAAM,aACpC+R,EAAaT,EAAsBC,EAASZ,EAAcmB,EAAOT,EAAY,KAAK,EACxF,OAAOE,EAAQ,OAASQ,CAAA,CACzB,EAEKC,EAAgB/R,EAAAA,SAAS,IACtBD,EAAe,MAAM,eAAiB,EAC9C,EAEKiS,EAAiBhS,EAAAA,SAAS,IAAM,CACpC,MAAMsR,EAAUjB,EAAa,MAAM,OAAQxE,GAClC2C,EAAW3C,CAAC,CACpB,EACD,GAAI,CAAC9L,EAAe,MAAM,oBAAsB,CAACmQ,EAAU,MAAc,OAAAoB,EACnE,MAAAO,EAAQ9R,EAAe,MAAM,iBAAmB,EAChD2Q,EAAe3Q,EAAe,MAAM,aACpC+R,EAAaT,EAAsBC,EAASZ,EAAcmB,EAAOT,EAAY,KAAK,EACjF,OAAAE,EAAQ,MAAM,EAAGQ,CAAU,CAAA,CACnC,EAEKtD,EAAckD,GAA0B,CAC5C,IAAI7J,EAAS,GACT5B,EAAO,GACP,OAAA,OAAOyL,EAAO,QAAW,aAC3B7J,EAAS6J,EAAO,OAAO,CAAE,OAAAA,EAAQ,OAAQT,EAAiB,MAAO,MAAOA,EAAiB,MAAO,MAAOS,EAAO,KAAO,CAAA,GAEnH,OAAOA,EAAO,QAAW,YAC3B7J,EAAS6J,EAAO,QAEd,OAAOA,EAAO,MAAS,aACzBzL,EAAOyL,EAAO,KAAK,CAAE,OAAAA,EAAQ,OAAQT,EAAiB,MAAO,MAAOA,EAAiB,MAAO,MAAOS,EAAO,KAAO,CAAA,GAE/G,OAAOA,EAAO,MAAS,YACzBzL,EAAOyL,EAAO,MAET7J,GAAU5B,CAAA,EAEbgM,EAAeP,GACZA,EAAO,UAAY3R,EAAe,MAAM,cAAgB,CAAA,EAE3DmS,EAAeR,GAA0BA,EAAO,MAAQA,EAAO,MAM/DS,EAAqB,CAACC,EAAqCC,EAAmB,KAAS,CACrF,MAAAC,EAAYD,EAAmB,CAAE,GAAID,GAAa,CAAA,GAAQ,GAC1DG,EAAgBxS,EAAe,MAAM,eAAiB/B,EAAM,cACrD,OAAAqS,EAAA,MAAM,QAASqB,GAAW,CACrC,GAAI,EAAAW,GAAoB,OAAO,UAAU,eAAe,KAAKC,EAAWZ,EAAO,KAAK,GAChF,IAAAA,EAAO,eAAiB,OAAW,CAC3BY,EAAAZ,EAAO,KAAK,EAAIA,EAAO,aACjC,MACF,CACIa,GAAiB,OAAO,UAAU,eAAe,KAAKA,EAAeb,EAAO,KAAK,IACnFY,EAAUZ,EAAO,KAAK,EAAIa,EAAcb,EAAO,KAAK,GACtD,CACD,EACMY,CAAA,EAGHE,EAAiB,CAACF,EAAoCG,EAAa,KAAS,CAChFtC,EAAU,MAAQmC,EACdG,GAAYzP,EAAK,oBAAqBsP,CAAS,CAAA,EAG/CI,GAAmBC,GAAoC,CACrD,MAAAL,EAAYH,EAAmB,CAAE,GAAGlB,EAAiB,MAAO,GAAG0B,EAAQ,EAC7E,OAAAH,EAAeF,CAAS,EACjBA,CAAA,EAGHM,GAAW,IAAM,CACrB,MAAMC,EAAmC,CAAA,EAC5BxC,EAAA,MAAM,QAASqB,GAAW,QACjChT,EAAAgT,EAAO,QAAP,MAAAhT,EAAc,SAAcmU,EAAAnB,EAAO,KAAK,EAAIA,EAAO,MAAA,CACxD,EACDc,EAAeL,EAAmBlB,EAAiB,KAAK,EAAG,EAAK,EAChEb,EAAU,MAAQyC,CAAA,EAGdC,EAAkBH,GAAoC,CACpD,MAAA5Q,EAAS,CAAE,GAAG4Q,GACP,OAAAtC,EAAA,MAAM,QAASqB,GAAW,CACrC,MAAM7J,EAAS6J,EAAO,OACtB,GAAI7J,IAAW,OAAW,QACV,OAAOA,GAAW,UAAYA,EAASA,EAAO,CAAE,OAAA6J,EAAQ,OAAAiB,EAAQ,MAAOA,EAAQ,MAAOjB,EAAO,KAAO,CAAA,IAC/F,OAAA3P,EAAO2P,EAAO,KAAK,CAAA,CACzC,EACM3P,CAAA,EAGHgR,EAAyBJ,GAAoC,CAC3D,MAAAK,EAAWF,EAAeH,CAAM,EAChCM,EAAWtT,EAAW,MAAM,eAClC,GAAI,EAACsT,GAAA,MAAAA,EAAU,QAAe,OAAAD,EACxB,MAAAjR,EAAS,CAAE,GAAGiR,GACX,OAAAC,EAAA,QAAQ,CAAC,CAACC,EAAO,CAACC,EAAUC,CAAM,CAAC,IAAM,CAC1C,MAAA7G,EAAMxK,EAAOmR,CAAK,EACpB,MAAM,QAAQ3G,CAAG,GAAKA,EAAI,SAAW,IACvC,OAAOxK,EAAOmR,CAAK,EACdnR,EAAmCoR,CAAQ,EAAI5G,EAAI,CAAC,EACpDxK,EAAmCqR,CAAM,EAAI7G,EAAI,CAAC,EACzD,CACD,EACMxK,CAAA,EAGHsR,EAAe,SAAY,OAC3B,GAAA,CACI,OAAA3U,EAAAqR,EAAQ,QAAR,YAAArR,EAAe,YACjBqB,EAAe,MAAM,WACjB,MAAAA,EAAe,MAAM,cAE3BkQ,EAAc,MAAQ,GACtBjN,EAAK,SAAU+P,EAAsB,CAAE,GAAG9B,EAAiB,KAAO,CAAA,CAAC,SAE9D5M,EAAG,CACF,QAAA,MAAM,0BAA2BA,CAAC,CAAA,QAC1C,CACA4L,EAAc,MAAQ,EACxB,CAAA,EAGIqD,EAAc,SAAY,OAC1BvT,EAAe,MAAM,UACjB,MAAAA,EAAe,MAAM,cAE3BrB,EAAAqR,EAAQ,QAAR,MAAArR,EAAe,cACNkU,KACT5P,EAAK,OAAO,EACRjD,EAAe,MAAM,eAAe,MAAMsT,EAAa,EAC7D,EAGIE,EAAkBZ,IACtBD,GAAgBC,CAAM,EACf,QAAQ,WAGXa,EAAiB,IAAMT,EAAsB,CAAE,GAAG9B,EAAiB,MAAO,EAE1EwC,EAAc,SAAY,QAC9B/U,EAAAqR,EAAQ,QAAR,MAAArR,EAAe,cACA8T,EAAAL,EAAmB,OAAW,EAAK,CAAC,CAAA,EAG/CuB,EAAoB,CAACR,EAAexV,IAAmB,CAC3DgV,GAAgB,CAAE,CAACQ,CAAK,EAAGxV,CAAO,CAAA,CAAA,EAG9BiW,EAAYC,GAChB,OAAA,QAAAlV,EAAAqR,EAAQ,QAAR,YAAArR,EAAe,SAASkV,KAAa,QAAQ,WAEzCC,GAAkBD,GACjB7D,EAAQ,MACR6D,GAAA,MAAAA,EAAU,OACR,QAAQ,IAAIA,EAAS,IAAK5O,GAAS,IAAI,QAAQ,CAAC8O,EAASC,IAAW,CACzEhE,EAAQ,MAAM,cAAc/K,EAAOgP,GAAoBA,EAAQF,EAAQ,MAAS,EAAIC,EAAO,IAAI,MAAM,mBAAmB,CAAC,CAAE,CAC5H,CAAA,CAAC,CAAC,EAH2BhE,EAAQ,MAAM,WADjB,QAAQ,UAO/BkE,GAAgB,MAAOC,EAAcjL,IAAmC,OAC5E,MAAMkL,GAAKzV,EAAAsR,EAAY,QAAZ,YAAAtR,EAAmB,cAAc,gBAAgBwV,CAAI,MAChE,OAAIC,GACCA,EAAA,eAAe,CAAE,UAAUlL,GAAA,YAAAA,EAAS,WAAY,SAAU,OAAOA,GAAA,YAAAA,EAAS,QAAS,SAAW,CAAA,EAE5F,QAAQ,SAAQ,EAGnBmL,GAAiBF,GAA6B,QAC1CxV,EAAAqR,EAAA,QAAA,MAAArR,EAAO,cAAcwV,EAAI,EAG7BG,GAAe,MAAOnQ,GAA4D,EACzE,MAAM,QAAQA,CAAI,EAAIA,EAAO,CAACA,CAAI,GAC1C,QAASkD,GAAS,CACf,MAAArB,EAAMsK,EAAa,MAAM,UAAWxE,GAAMA,EAAE,QAAUzE,EAAK,KAAK,EAClErB,GAAO,IAAgBsK,EAAA,MAAMtK,CAAG,EAAI,CAAE,GAAGsK,EAAa,MAAMtK,CAAG,EAAG,GAAGqB,GAAK,CAC/E,CAAA,EAGGkN,GAAsB,MAAO5C,EAAuB6C,EAAsBC,IAAoB,CAC9F,GAAAA,EAAoBnE,EAAA,MAAM,QAAQqB,CAAM,UACnC6C,EAAa,CACd,MAAAxO,EAAMsK,EAAa,MAAM,UAAWxE,GAAMA,EAAE,QAAU0I,CAAW,EACvElE,EAAa,MAAM,OAAOtK,EAAM,EAAG,EAAG2L,CAAM,CAC9C,MAAoBrB,EAAA,MAAM,KAAKqB,CAAM,EAC5BkB,IAAA,EAGL6B,GAAsB,MAAOvB,GAA6B,CAC9D,MAAMwB,EAAS,MAAM,QAAQxB,CAAK,EAAIA,EAAQ,CAACA,CAAK,EACvC7C,EAAA,MAAQA,EAAa,MAAM,OAAQxE,GAAM,CAAC6I,EAAO,SAAS7I,EAAE,KAAK,CAAC,CAAA,EAG3E8I,GAAW,MAAOC,GAAqC,CAC3DjV,EAAW,MAAQ,CAAE,GAAGA,EAAW,MAAO,GAAGiV,GACzCA,EAAU,UACZvE,EAAa,MAAQ,CAAC,GAAGuE,EAAU,OAAO,EACjChC,KACX,EAIIiC,GAAwB,CAAC3B,EAAenK,IAA6C,CACrFA,EACeuH,EAAA,MAAM,IAAI4C,EAAOnK,CAA8C,EAE/DuH,EAAA,MAAM,OAAO4C,CAAK,CACrC,EAII4B,GAAwB5B,GACrB5C,EAAiB,MAAM,IAAI4C,CAAK,GAAK,KAOrC,SAAA6B,GAAgB7B,EAAevJ,EAAM,GAA6D,CACzG,MAAMZ,EAAWuH,EAAiB,MAAM,IAAI4C,CAAK,EACjD,GAAI,CAACnK,EAAU,MAAO,GACtB,MAAMiM,EAAoBjM,EAC1B,OAAIY,GACKqL,GAAA,YAAAA,EAAmB,aAAc,IAEnCA,GAAA,YAAAA,EAAmB,UAAW,EACvC,CAGM,MAAAC,GAAkB/B,GAA2B,CACjD,MAAMnK,EAAWuH,EAAiB,MAAM,IAAI4C,CAAK,EACjD,GAAI,CAACnK,EAAiB,MAAA,GACtB,MAAMiM,EAAoBjM,EAC1B,OAAOiM,GAAA,YAAAA,EAAmB,UAAW,EAAA,EAGjCE,GAAgC,CACpC,eAAA1B,EACA,eAAAD,EACA,YAAAE,EACA,SAAAE,EACA,eAAAE,GACA,OAAQR,EACR,cAAAY,GACA,cAAAG,GACA,aAAAC,GACA,oBAAAC,GACA,oBAAAG,GACA,SAAAE,GACA,qBAAAG,GACA,gBAAAC,GACA,eAAAE,EAAA,EAGW5O,EAAA,CACX,GAAG6O,GACH,sBAAAL,EAAA,CACD,EAED,MAAMM,GAAc,IAAM,CACxB9E,EAAa,MAAQ,CAAC,GAAIrS,EAAM,SAAW,CAAG,CAAA,EACrC4U,IAAA,EAGLwC,GAAe,IAAM,CACrB,OAAO,OAAW,MAAahE,EAAY,MAAQ,OAAO,WAAA,EAGhEtK,OAAAA,EAAAA,UAAU,IAAM,CACFqO,KACZnS,EAAK,WAAYkS,EAAa,EAC1B,OAAO,OAAW,KAAoB,OAAA,iBAAiB,SAAUE,EAAY,CAAA,CAClF,EAEDpO,EAAAA,YAAY,IAAM,CACZ,OAAO,OAAW,KAAoB,OAAA,oBAAoB,SAAUoO,EAAY,CAAA,CACrF,EAEDnO,EAAAA,MAAM,IAAM8J,EAAqB,MAAQrT,GAAU,CAC7C,CAACsT,EAAa,OAAStT,IAAU,QACtB8U,EAAAL,EAAmBzU,CAAK,EAAG,EAAK,GAC9C,CAAE,KAAM,GAAM,UAAW,EAAM,CAAA,EAE5BuJ,EAAAA,MAAA,IAAM,CAACjJ,EAAM,QAASA,EAAM,aAAa,EAAGmX,GAAa,CAAE,KAAM,EAAM,CAAA,+zHC9ctE,SAASE,GAAQrX,EAA4F,CAC5G,MAAAsX,EAAalW,MAA2B,IAAI,EAC5CmW,EAAenW,EAAAA,IAA8BpB,EAAQ4K,EAAM,MAAA5K,CAAsC,EAAI,MAAS,EAE9GwX,EAAe,IAAOxX,EAAQ4K,EAAA,MAAM5K,CAAsC,EAAI,OAE9E8K,EAAYnB,GAA2B,CAC3C2N,EAAW,MAAQ3N,EACnB,MAAMiN,EAAYY,IACdZ,GAAa,OAAO,KAAKA,CAAS,EAAE,OAAS,GAC/CjN,EAAO,SAASiN,CAAS,CAC3B,EAGE5W,GACFiJ,EAAA,MACE,IAAMuO,EAAa,EAClBZ,GAAc,CACbW,EAAa,MAAQX,EACjBA,GAAaU,EAAW,OACfA,EAAA,MAAM,SAASV,CAAS,CAEvC,EACA,CAAE,KAAM,EAAK,CAAA,EAIjB,MAAMpB,EAAiB,IAAA,OAAM,QAAA9U,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,mBAAoB,CAAA,GAE7D6U,EAAiB,MAAOZ,GAAoC,OAC1D,OAAAjU,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,eAAeiU,GAAM,EAGzCc,EAAc,SAAY,OACxB,OAAA/U,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,cAAY,EAGhCiV,EAAYC,GAChB,OAAA,QAAAlV,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,SAASkV,KAAa,QAAQ,WAE5CC,EAAkBD,GACtB,OAAA,QAAAlV,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,eAAekV,KAAa,QAAQ,WAElD6B,EAAS,IAAA,OAAM,QAAA/W,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,WAAY,QAAQ,WAErDuV,EAAgB,CAACC,EAAcjL,IACnC,OAAA,QAAAvK,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,cAAcwV,EAAMjL,KAAY,QAAQ,QAAQ,GAE9DmL,EAAiBF,GAA6B,QACvCxV,EAAA4W,EAAA,QAAA,MAAA5W,EAAO,cAAcwV,EAAI,EAGhCG,EAAgBnQ,GACpB,OAAA,QAAAxF,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,aAAawF,KAAS,QAAQ,WAE5CoQ,EAAsB,CAAC5C,EAAuB6C,EAAsBC,IACxE,OAAA,QAAA9V,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,oBAAoBgT,EAAQ6C,EAAaC,KAAU,QAAQ,QAAQ,GAEjFC,EAAuBvB,GAC3B,OAAA,QAAAxU,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,oBAAoBwU,KAAU,QAAQ,WAEpDyB,EAAW,MAAOC,GAAqC,OAC3DW,EAAa,MAAQ,CAAE,GAAGA,EAAa,MAAO,GAAGX,GAC3C,OAAAlW,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,SAASkW,GAAS,EAGtCE,EAAgE5B,UACpE,QAAAxU,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,qBAAqBwU,KAAU,MAK1C,SAAA6B,EAAgB7B,EAAevJ,EAAM,GAA6D,CACzG,OAAK2L,EAAW,MACZ3L,EAAY2L,EAAW,MAAM,gBAAgBpC,EAAO,EAAI,EACrDoC,EAAW,MAAM,gBAAgBpC,CAAK,EAFf,EAGhC,CAyBO,MAAA,CAACpK,EApBsB,CAC5B,SAAAA,EACA,WAAAwM,EACA,eAAA9B,EACA,eAAAD,EACA,YAAAE,EACA,SAAAE,EACA,eAAAE,EACA,OAAA4B,EACA,cAAAxB,EACA,cAAAG,EACA,aAAAC,EACA,oBAAAC,EACA,oBAAAG,EACA,SAAAE,EACA,qBAAAG,EACA,gBAAAC,EACA,eApBwD7B,UACxD,QAAAxU,EAAA4W,EAAW,QAAX,YAAA5W,EAAkB,eAAewU,KAAU,GAmB3C,CAGsB,CAC1B,+eCXMvT,EAAaP,MAA+B,CAAA,CAAE,EAC9CI,EAAYJ,MAA6B,CAAA,CAAE,EAC3CsW,EAActW,MAAyB,CAAA,CAAE,EACzCgS,EAAchS,EAAI,IAAA,OAAO,OAAW,IAAc,OAAO,WAAa,IAAI,EAC1E+F,EAAW/F,MAAI,EAAI,EAEnBuW,EAA2BxX,EAAAA,gBAAgB,CAC/C,KAAM,8BACN,MAAO,CACL,OAAQ,CAAE,KAAM,OAAQ,SAAU,EAAK,EACvC,MAAO,CAAE,SAAU,EAAM,EACzB,OAAQ,CAAE,KAAM,OAAQ,SAAU,EAAK,EACvC,UAAW,CAAE,KAAM,OAAQ,QAAS,GAAI,CAC1C,EACA,MAAMyX,EAAe,CACnB,MAAO,IAAM,CACX,MAAMlE,EAASkE,EAAc,OACvB9P,EAAS8P,EAAc,OACvBlY,EAAQkY,EAAc,MAEtBC,EAAkBrX,GAAiB,CACjC,MAAAsX,EAAerO,EAAiBiK,EAAQlT,IAASoX,EAAc,UAAYlY,EAAQc,EAAMsH,CAAM,EAC/FiQ,EAAcxX,EAAAA,EAAE,OAAQC,CAAI,EAClC,OAAKsX,EACEvX,EAAAA,EAAE,aAAc,CAAE,MAAOuX,GAAgB,CAACC,CAAW,CAAC,EADnCA,CACmC,EAG/D,GAAIrE,EAAO,OAAQ,CACjB,MAAMsE,EAAWtE,EAAO,OAAOhU,EAAOoI,CAAM,EACxC,OAAAkQ,GAAY,MAAQA,IAAa,GAAWH,EAAeD,EAAc,SAAS,EAClF,OAAOI,GAAa,UAAY,OAAOA,GAAa,SAAiBH,EAAe,OAAOG,CAAQ,CAAC,EACjGA,CACT,CAEI,OAAA,MAAM,QAAQtY,CAAK,EACdmY,EAAenY,EAAM,OAASA,EAAM,KAAK,IAAI,EAAIkY,EAAc,SAAS,EAG7ElY,GAAU,MAA+BA,IAAU,GAC9CmY,EAAeD,EAAc,SAAS,EAItCC,EADL,OAAOnY,GAAU,SACG,KAAK,UAAUA,CAAK,EAGtB,OAAOA,CAAK,CAHW,CAGV,CAEvC,CAAA,CACD,EAEK+J,EAAmB,CAACiK,EAA2BhU,EAAgBoI,IAAoC,CACvG,MAAMwB,EAAUoK,EAAO,QACvB,GAAI,CAACpK,EAAgB,OAAA,KAEf,MAAA+H,EAAW,OAAO/H,GAAY,WAChCA,EAAQ,CAAE,MAAA5J,EAAO,OAAAoI,EAAQ,OAAA4L,EAAQ,EACjCpK,EACG,OAAAD,GAAuBgI,EAAU3R,CAAK,CAAA,EAGzC,CAAE,cAAAoC,GAAkBlC,KACpBmC,EAAiBC,EAAAA,SAAS,IAAMF,EAAgC,kBAAmB,CAAE,GAAG9B,EAAO,GAAG2B,EAAW,KAAM,CAAC,CAAC,EAErHsW,EAAc,CAAE,IAAK,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,EAE/DC,EAAgB,CAACC,EAAuCxF,IAAkB,CAC9E,GAAI,OAAOwF,GAAW,SAAiB,OAAA,KAAK,IAAI,EAAGA,CAAM,EACnD,MAAAzY,EAAQyY,GAAU,GACxB,OAAIxF,GAASsF,EAAY,IAAYvY,EAAM,KAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,EAC1GiT,GAASsF,EAAY,GAAWvY,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,EAC5FiT,GAASsF,EAAY,GAAWvY,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,EAChFiT,GAASsF,EAAY,GAAWvY,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,EACpEiT,GAASsF,EAAY,GAAWvY,EAAM,IAAMA,EAAM,IAAM,EACrDA,EAAM,IAAM,CAAA,EAGf0Y,EAAgBpW,WAAS,IAAMkW,EAAcnW,EAAe,MAAM,OAAQqR,EAAY,KAAK,CAAC,EAC5FiF,EAAgBrW,WAAS,IAAMD,EAAe,MAAM,MAAQP,EAAU,OAAS,CAAA,CAAE,EAEjF8W,EAAgBtW,EAAAA,SAAS,KACrB0V,EAAY,MAAM,OAASA,EAAY,MAAQ3V,EAAe,MAAM,QAAU,CAAA,GAAI,OAAQqH,GACpFA,EAAK,WAAaA,EAAK,MAE/B,OAAOA,EAAK,MAAS,WAChBA,EAAK,KAAKiP,EAAc,KAAK,EAE/BjP,EAAK,OAAS,GAJJ,EAKlB,EAAE,IAAKA,IAAU,CAChB,GAAGA,EACH,UAAWA,EAAK,WAAaA,EAAK,OAAS,EAC3C,EAAA,CACH,EAEKmP,EAAiBvW,EAAAA,SAA0B,IAAM,CACrD,MAAM2F,EAAwB,CAAA,EAC9B,IAAI6Q,EAA4B,CAAE,MAAO,CAAA,GACrCC,EAAO,EACX,MAAMC,EAAcN,EAAc,MAClC,OAAAE,EAAc,MAAM,QAAQ,CAAClP,EAAMxB,IAAU,CACrC,MAAA+Q,EAAiBL,EAAc,MAAM,OAAS1Q,EAC9CgR,EAAY,KAAK,IAAI,EAAG,KAAK,IAAIxP,EAAK,MAAQ,EAAGsP,CAAW,CAAC,EAC7D/E,EAAOgF,IAAmB,EAAID,EAAcD,GAAQC,EAAcE,EACpEH,EAAO9E,EAAO+E,IAChB/Q,EAAK,KAAK6Q,CAAU,EACPA,EAAA,CAAE,MAAO,CAAA,GACfC,EAAA,GAEH,MAAAI,GAAiBF,IAAmB,GAAKF,EAAOC,EAAc,KAAK,IAAI,EAAGA,EAAcD,CAAI,EAAI9E,EACtG6E,EAAW,MAAM,KAAK,CAAE,GAAGpP,EAAM,MAAOyP,GAAgB,EAChDJ,GAAAI,GACJJ,GAAQC,IACV/Q,EAAK,KAAK6Q,CAAU,EACPA,EAAA,CAAE,MAAO,CAAA,GACfC,EAAA,EACT,CACD,EACGD,EAAW,MAAM,OAAS,GAAG7Q,EAAK,KAAK6Q,CAAU,EAC9C7Q,CAAA,CACR,EAEKmR,EAAe9W,EAAAA,SAAS,IAAM,OAC9B,GAAA,CAAC+W,EAAmB,OAAS5R,EAAS,MAAO,OAAOoR,EAAe,MACjE,MAAAS,EAAc,KAAK,IAAI,IAAGtY,EAAAqB,EAAe,MAAM,kBAArB,YAAArB,EAAsC,cAAe,CAAC,EACtF,OAAO6X,EAAe,MAAM,MAAM,EAAGS,CAAW,CAAA,CACjD,EAEKD,EAAqB/W,EAAAA,SAAS,IAAM,SAClC,MAAAgX,EAAc,KAAK,IAAI,IAAGtY,EAAAqB,EAAe,MAAM,kBAArB,YAAArB,EAAsC,cAAe,CAAC,EACtF,MAAO,CAAC,CAACqB,EAAe,MAAM,aAAe,CAAC,GAACtB,EAAAsB,EAAe,MAAM,kBAArB,MAAAtB,EAAsC,YAAa8X,EAAe,MAAM,OAASS,CAAA,CACjI,EACKC,EAAajX,EAAA,SAAS,IAAM,CAAC,CAACD,EAAe,MAAM,OAAS,CAAC,CAACA,EAAe,MAAM,aAAegX,EAAmB,KAAK,EAC1HG,EAAqBlX,EAAAA,SAAS,IAAO,SAAA,OACzC,SAAQtB,EAAAqB,EAAe,MAAM,kBAArB,YAAArB,EAAsC,mBAAoB,KAClE,WAAUD,EAAAsB,EAAe,MAAM,kBAArB,YAAAtB,EAAsC,qBAAsB,IACtE,EAAA,EAEI0Y,EAAYnX,EAAAA,SAAS,KAAO,CAChC,oBAAqB,UAAUoW,EAAc,KAAK,mBAClD,EAAA,EAEIgB,EAAgBhQ,IAAiD,CACrE,WAAY,QAAQA,EAAK,KAAK,EAAA,GAG1BiQ,EAAiBjQ,IAA6B,CAClD,SAAUA,EAAK,cAAgB,GAAGA,EAAK,aAAa,KAAO,OAC3D,GAAIA,EAAK,YAAc,CAAC,CAAA,GAGpBkQ,EAAmBlQ,IAA6B,CACpD,SAAUA,EAAK,gBAAkB,GAAGA,EAAK,eAAe,KAAO,OAC/D,GAAIA,EAAK,cAAgB,CAAC,CAAA,GAGtBmQ,EAAgBnQ,GAA4BiP,EAAc,MAAMjP,EAAK,SAAS,EAE9EoQ,EAAa,IAAM,CACvB9B,EAAY,MAAQ,CAAC,GAAI3V,EAAe,MAAM,QAAU,CAAA,CAAG,CAAA,EAGvD0X,EAAW,IAAM,CACrBjY,EAAU,MAAQ,CAAE,GAAIO,EAAe,MAAM,MAAQ,CAAA,EAAI,EAGrD4U,EAAW,MAAO+C,GAAgD,CACtE/X,EAAW,MAAQ,CAAE,GAAGA,EAAW,MAAO,GAAG+X,GACzCA,EAAiB,SAAQhC,EAAY,MAAQ,CAAC,GAAGgC,EAAiB,MAAM,GACxEA,EAAiB,OAAMlY,EAAU,MAAQ,CAAE,GAAGkY,EAAiB,IAAK,EAAA,EAGpEC,EAAU,MAAOzT,GAAkC,CACvD1E,EAAU,MAAQ,CAAE,GAAGA,EAAU,MAAO,GAAG0E,GAC3CvE,EAAW,MAAQ,CAAE,GAAGA,EAAW,MAAO,KAAMH,EAAU,MAAM,EAG5DoY,EAAU,KAAO,CAAE,GAAI7X,EAAe,MAAM,MAAQP,EAAU,OAAS,CAAI,CAAA,GAE3EqY,GAA2C,CAC/C,SAAAlD,EACA,QAAAgD,EACA,QAAAC,CAAA,EAGFvR,EAAawR,EAAiB,EAE9B,MAAMC,GAAoB,IAAM,CAC1B,OAAO,OAAW,MAAa1G,EAAY,MAAQ,OAAO,WAAA,EAGhEtK,OAAAA,EAAAA,UAAU,IAAM,OACH0Q,IACFC,IACTtS,EAAS,QAAQzG,EAAAqB,EAAe,MAAM,kBAArB,YAAArB,EAAsC,iBAAkB,GACzEsE,EAAK,WAAY6U,EAAiB,EAC9B,OAAO,OAAW,KACb,OAAA,iBAAiB,SAAUC,EAAiB,CACrD,CACD,EAED9Q,EAAAA,YAAY,IAAM,CACZ,OAAO,OAAW,KACb,OAAA,oBAAoB,SAAU8Q,EAAiB,CACxD,CACD,EAEK7Q,QAAA,IAAMlH,EAAe,MAAM,OAAQyX,EAAY,CAAE,KAAM,GAAM,EAC7DvQ,QAAA,IAAMlH,EAAe,MAAM,KAAM0X,EAAU,CAAE,KAAM,GAAM,EAC/DxQ,EAAA,MAAM,IAAM,OAAA,OAAAvI,EAAAqB,EAAe,MAAM,kBAArB,YAAArB,EAAsC,eAAgBhB,GAAU,CACtEA,IAAU,SAAWyH,EAAS,MAAQzH,EAAA,CAC3C,8+FClUM,SAASqa,GAAe/Z,EAA2D,CAClF,MAAAga,EAAuB5Y,MAAkC,IAAI,EAE7D6Y,EAAsB,IACzBja,EAAQ4K,EAAA,MAAM5K,CAA0C,EAAI,OAEzDka,EAAuB,IAA6B,CAClD,MAAAvQ,EAASiB,QAAMoP,CAAoB,EACzC,GAAI,CAACrQ,EACG,MAAA,IAAI,MAAM,kDAAkD,EAE7D,OAAAA,CAAA,EAGHmB,EAAYC,GAAoC,CACpDiP,EAAqB,MAAQjP,EAC7B,MAAM2O,EAAmBO,IACrBP,GAAoB,OAAO,KAAKA,CAAgB,EAAE,OAAS,GAC7D3O,EAAS,SAAS2O,CAAgB,CACpC,EAGF,OAAI1Z,GACFiJ,EAAA,MACE,IAAMgR,EAAoB,EACzBP,GAAqB,CAChBA,GAAoBM,EAAqB,OACtBA,EAAA,MAAM,SAASN,CAAgB,CAExD,EACA,CAAE,KAAM,EAAK,CAAA,EAUV,CAAC5O,EAN0C,CAChD,SAAW4O,GAAqBQ,EAAqB,EAAE,SAASR,CAAgB,EAChF,QAAUxT,GAASgU,EAAqB,EAAE,QAAQhU,CAAI,EACtD,QAAS,IAAMgU,EAAqB,EAAE,QAAQ,CAAA,CAGZ,CACtC,spBCoDMhZ,EAAQD,EAAAA,WACR,CAAE,cAAAa,GAAkBlC,KAEpBua,EAAgB/Y,EAAAA,IAAIpB,EAAM,UAAYA,EAAM,aAAa,EAEzD+B,EAAiBC,WAAS,IAAMF,EAAc,oBAAqB,CAAE,GAAG9B,CAAO,CAAA,CAA2B,EAC1Goa,EAAmBpY,EAAAA,SAAS,IAAMD,EAAe,MAAM,WAAaA,EAAe,MAAM,UAAY,EAAI,EACzGiR,EAAehR,EAAAA,SAAS,IAAMD,EAAe,MAAM,WAAa,MAAS,EACzEsY,EAAiBrY,EAAAA,SAAS,IAAMgR,EAAa,MAAQ,CAAC,CAACjR,EAAe,MAAM,SAAWoY,EAAc,KAAK,EAC1GlB,EAAajX,WAAS,IAAM,CAAC,CAACd,EAAM,OAAS,CAAC,CAACA,EAAM,QAAU,CAAC,CAACa,EAAe,MAAM,OAAS,CAAC,CAACA,EAAe,MAAM,aAAeqY,EAAiB,KAAK,EAC3JE,EAAoBtY,EAAA,SAAS,IAAMoY,EAAiB,KAAK,EACzDG,EAAevY,EAAAA,SAAS,IAAM,CAClC,MAAMwY,EAAWzY,EAAe,MAAM,cAAgB,CAAA,EAChD0Y,EAAeD,EAAS,MACxBE,EAAeF,EAAS,MACxBG,EAAO,CAAE,GAAGH,GAClB,cAAOG,EAAK,MACZ,OAAOA,EAAK,MAEL,CACL,GAAGA,EACH,MAAOF,EACP,MAAOC,CAAA,CACT,CACD,EAEKE,EAAsB,IAAM,CAC5B,CAAC7Y,EAAe,MAAM,qBAAuB,OAAO,OAAW,KACnE,OAAO,WAAW,IAAM,CACtB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,GACvC,GAAG,CAAA,EAGF8Y,EAAenb,GAAmB,CACjCsT,EAAa,QAChBmH,EAAc,MAAQza,GAExBsF,EAAK,kBAAmBtF,CAAK,EAC7BsF,EAAK,SAAUtF,CAAK,EACTsF,EAAPtF,EAAY,SACN,UADc,EAEJkb,GAAA,EAGhBE,EAAe,IAAM,CACpBV,EAAiB,OACVS,EAAA,CAACR,EAAe,KAAK,CAAA,EAG7BU,EAAoB,IAAM,CACzBT,EAAkB,OACVQ,GAAA,EAGf7R,OAAAA,EAAAA,MAAM,IAAMjJ,EAAM,SAAWN,GAAU,CACjCA,IAAU,SACZya,EAAc,MAAQza,EACxB,CACD,EAEDuJ,EAAAA,MAAM,IAAMjJ,EAAM,cAAgBN,GAAU,CACtCM,EAAM,WAAa,SACrBma,EAAc,MAAQza,EACxB,CACD,EAEY2I,EAAA,CACX,YAAAwS,EACA,aAAAC,CAAA,CACD,s3ECLDE,GAAe,CACb,KAAM,eACN,MAAO,CACL,KAAM,aACN,MAAO,mBACT,CACF,ooBAmDMjJ,EAAU3Q,MAAqI,IAAI,EAEnJ6Z,EAAK,IAAMjb,EAAM,gBAAkB,cACnCkb,EAAK,IAAMlb,EAAM,mBAAqB,OAGtCmb,EAA0BnZ,EAAAA,SAAS,IACnChC,EAAM,UAAU,OAAS,EAAU,GAChCA,EAAM,kBAAoB,EAClC,EAEKob,EAAmBpZ,EAAAA,SAAS,IAAM,MAAe,EAEjDqZ,EAAmBrZ,EAAAA,SAAS,IAAM,CACtC,MAAMsZ,EAAKtb,EAAM,aACV,MAAA,CACL,OAAOsb,GAAA,YAAAA,EAAI,QAAStb,EAAM,YAC1B,SAAUsb,GAAA,YAAAA,EAAI,SACd,OAAOA,GAAA,YAAAA,EAAI,QAAS,SACpB,OAAOA,GAAA,YAAAA,EAAI,SAAU,OAAY,QAAUA,EAAG,KAAA,CAChD,CACD,EAED,SAASC,EAASlX,EAAe,CACxB,OAAAA,EAAI,QAAU,QAAU,KAAKA,EAAI,MAAM,GAAK,KAAKA,EAAI,MAAM,EACpE,CAMM,MAAAmX,EAAYxZ,EAAAA,SAAqB,IAAM,CAC3C,MAAM2F,EAAmB,CAAA,EACnB3H,EAAA,UAAU,QAASyb,GAAO,CAC9B9T,EAAK,KAAK,CACR,MAAO,QACP,OAAQ8T,EAAG,OACX,SAAUA,EAAG,KAAA,CACd,CAAA,CACF,EACD,MAAMC,EAAK1b,EAAM,WAEZ,QADS0b,GAAM,OAAOA,GAAO,SAAYA,EAAGT,EAAI,CAAA,EAA8C,SAAc,CAAA,GAC5G,QAAQ,CAACU,EAAGlT,IAAM,CACrBd,EAAK,KAAK,CAAE,MAAO,aAAc,OAAQc,EAAG,CAAA,CAC7C,EACMd,CAAA,CACR,EAEKiU,EAAsB5Z,EAAAA,SAAS,IAAM,CACzC,MAAM0Z,EAAK1b,EAAM,WAEjB,QADY0b,GAAM,OAAOA,GAAO,SAAYA,EAAGT,EAAI,CAAA,EAAkB,SAAc,CAAA,GAAI,OAC5Ejb,EAAM,cAAA,CAClB,EAED,SAAS6b,GAAsC,CAC7C,MAAMC,EAAI9b,EAAM,WAChB,MAAI,CAAC8b,GAAK,OAAOA,GAAM,SACd,GAEF,KAAK,MAAM,KAAK,UAAUA,CAAC,CAAC,CACrC,CAEA,SAASC,EAAiBlU,EAAyC,CACjE,MAAM6T,EAAK1b,EAAM,WACjB,GAAI,CAAC0b,GAAM,OAAOA,GAAO,SAAU,CACjC,MAAM5P,EAA6B,CAAA,EACxB,UAAAnJ,KAAK3C,EAAM,QACpB8L,EAAEnJ,EAAE,GAAG,EAAI,GAENmJ,OAAAA,CACT,CACM,MAAAgQ,EAAIJ,EAAG7T,CAAM,EACnB,GAAIiU,GAAK,OAAOA,GAAM,UAAY,CAAC,MAAM,QAAQA,CAAC,EAAU,OAAAA,EAC5D,MAAMhQ,EAA6B,CAAA,EACxB,UAAAnJ,KAAK3C,EAAM,QAClB8L,EAAAnJ,EAAE,GAAG,EAAI,GAEN,OAAAmJ,CACT,CAEA,SAASkQ,EAASC,EAA+B,CAC/CjX,EAAK,oBAAqBiX,CAAI,CAChC,CAES,SAAAC,EAAerU,EAAgBvI,EAAsB,CAErD,OADOyc,EAAiBlU,CAAM,EACxBvI,CAAG,GAAK,EACvB,CAES,SAAA6c,EAAetU,EAAgBvI,EAAaiP,EAAc,CACjE,MAAM0N,EAAOJ,IACPO,EAAI,CAAE,GAAKH,EAAKpU,CAAM,GAAiC,CAAI,CAAA,EACjEuU,EAAE9c,CAAG,EAAIiP,EACT0N,EAAKpU,CAAM,EAAIuU,EACfJ,EAASC,CAAI,CACf,CAEA,SAASI,GAA4C,CACnD,MAAMX,EAAK1b,EAAM,WACjB,GAAI,CAAC0b,GAAM,OAAOA,GAAO,SACvB,MAAO,GAEH,MAAAvV,EAAOuV,EAAGT,EAAA,CAAI,EAChB,OAAC,MAAM,QAAQ9U,CAAI,EAChBA,EAD0B,EAEnC,CAEA,SAASmW,EAAkB1U,EAAuB,CAC1C,MAAAvD,EAAMgY,IAAiBzU,CAAK,EAC5BtI,EAAM4b,IACZ,OAAO7W,EAAM,OAAOA,EAAI/E,CAAG,GAAK,EAAE,EAAI,EACxC,CAES,SAAAid,EAAkB3U,EAAe2G,EAAa,CACrD,MAAM0N,EAAOJ,IACP1V,EAAO,CAAC,GAAGkW,EAAA,CAAgB,EAC3BhY,EAAM,CAAE,GAAI8B,EAAKyB,CAAK,GAAK,CAAI,CAAA,EACjCvD,EAAA6W,GAAI,EAAI3M,EACZpI,EAAKyB,CAAK,EAAIvD,EACT4X,EAAAhB,GAAI,EAAI9U,EACb6V,EAASC,CAAI,CACf,CAES,SAAAO,EAAoB5U,EAAetI,EAAsB,CAC1D,MAAA+E,EAAMgY,IAAiBzU,CAAK,EAClC,OAAOvD,EAAMA,EAAI/E,CAAG,GAAK,GAAK,EAChC,CAES,SAAAmd,EAAoB7U,EAAetI,EAAaiP,EAAc,CACrE,MAAM0N,EAAOJ,IACP1V,EAAO,CAAC,GAAGkW,EAAA,CAAgB,EAC3BhY,EAAM,CAAE,GAAI8B,EAAKyB,CAAK,GAAK,CAAI,CAAA,EACrCvD,EAAI/E,CAAG,EAAIiP,EACXpI,EAAKyB,CAAK,EAAIvD,EACT4X,EAAAhB,GAAI,EAAI9U,EACb6V,EAASC,CAAI,CACf,CAES,SAAAS,EAAaC,EAAoBtc,EAAkC,CACtE,OAAAsc,EAAS,QAAU,QACdT,EAAeS,EAAS,OAAQtc,EAAI,GAAG,EAEzCmc,EAAoBG,EAAS,OAAQtc,EAAI,GAAG,CACrD,CAES,SAAAuc,EAAaD,EAAoBtc,EAAyBkO,EAAc,CAC3EoO,EAAS,QAAU,QACrBR,EAAeQ,EAAS,OAAQtc,EAAI,IAAKkO,CAAG,EAE5CkO,EAAoBE,EAAS,OAAQtc,EAAI,IAAKkO,CAAG,CAErD,CAGS,SAAAsO,EAAkBC,EAA8Bzc,EAAyB,CAChF,OAAQqD,GAAekZ,EAAaE,EAAU,IAAKzc,EAAKqD,CAAC,CAC3D,CAEA,SAASqZ,GAA8C,CACrD,MAAMjR,EAA6B,CAAE,CAACoP,EAAI,CAAA,EAAG,EAAG,EACrC,UAAAvY,KAAK3C,EAAM,QAClB8L,EAAAnJ,EAAE,GAAG,EAAI,GAEN,OAAAmJ,CACT,CAEA,SAASkR,GAAgB,CACvB,MAAMf,EAAOJ,IACP1V,EAAO,CAAC,GAAGkW,EAAA,CAAgB,EAC5BlW,EAAA,KAAK4W,GAAoB,EACzBd,EAAAhB,GAAI,EAAI9U,EACb6V,EAASC,CAAI,CACf,CAEA,SAASgB,EAAiBrV,EAAe,CACvC,GAAI,CAACgU,EAAoB,MAAO,OAChC,MAAMK,EAAOJ,IACP1V,EAAO,CAAC,GAAGkW,EAAA,CAAgB,EAC5BlW,EAAA,OAAOyB,EAAO,CAAC,EACfqU,EAAAhB,GAAI,EAAI9U,EACb6V,EAASC,CAAI,CACf,CAES,SAAAiB,EAAgBrV,EAAgBvI,EAAa,CAC7C,MAAA,GAAGuI,CAAM,IAAIvI,CAAG,EACzB,CAEA,SAAS6d,EAAmBvV,EAAe,CACzC,MAAO,GAAGqT,EAAG,CAAC,IAAIrT,CAAK,IAAIsT,EAAI,CAAA,EACjC,CAES,SAAAkC,EAAqBxV,EAAetI,EAAa,CACxD,MAAO,GAAG2b,GAAI,IAAIrT,CAAK,IAAItI,CAAG,EAChC,CAEA,SAAS+d,EAAchd,EAAyB,CACvC,OAAAA,EAAI,YAAc,mBAAqBid,GAAuB,UACvE,CAEA,SAASC,GAASld,EAAkD,CAC5D,MAAAwQ,EAAKxQ,EAAI,gBAAkB,GAC7B,OAAAA,EAAI,YAAc,mBACb,CACL,cAAe,EACf,cAAe,EACf,SAAU,QACV,WAAY,GACZ,GAAGwQ,CAAA,EAGA,CAAE,GAAGA,EACd,CAEA,SAAS2M,GAAiBV,EAA8B,CACtD,MAAMxc,EAAIwc,EAAU,IAChB,GAAAxc,EAAE,QAAU,QACP,MAAA,CACL,IAAKA,EACL,QAAS,QACT,OAAQA,EAAE,OACV,SAAUA,EAAE,QAAA,EAGhB,MAAMyH,EAAMzH,EAAE,OACP,MAAA,CACL,IAAKA,EACL,QAAS,aACT,SAAUyH,EACV,MAAOuU,EAAkBvU,CAAG,EAC5B,YAAcrE,GAAc6Y,EAAkBxU,EAAKrE,CAAC,CAAA,CAExD,CAEM,MAAA+Z,EAAczb,EAAAA,SAAS,IAAM,CACjC,MAAM1B,EAA+B,CAAA,EAC/Bod,EAAOrT,GAAkB,CAAC,CAAE,SAAU,GAAM,QAAS,MAAMA,CAAK,GAAI,QAAS,MAAQ,CAAA,EAEhF,UAAAoR,KAAMzb,EAAM,UACV,UAAAK,KAAOL,EAAM,QAClBK,EAAI,MACJC,EAAA,GAAGmb,EAAG,MAAM,IAAIpb,EAAI,GAAG,EAAE,EAAIA,EAAI,MAC1BA,EAAI,WACXC,EAAA,GAAGmb,EAAG,MAAM,IAAIpb,EAAI,GAAG,EAAE,EAAIqd,EAAIrd,EAAI,KAAK,GAK7C,OADQgc,IACR,QAAQ,CAACV,EAAGlT,IAAM,CACnBnI,EAAA,GAAG2a,EAAI,CAAA,IAAIxS,CAAC,IAAIyS,EAAI,CAAA,EAAE,EAAIwC,EAAI,MAAM,EAC3B,UAAArd,KAAOL,EAAM,QAClBK,EAAI,MACJC,EAAA,GAAG2a,EAAI,CAAA,IAAIxS,CAAC,IAAIpI,EAAI,GAAG,EAAE,EAAIA,EAAI,MAC1BA,EAAI,WACbC,EAAE,GAAG2a,EAAI,CAAA,IAAIxS,CAAC,IAAIpI,EAAI,GAAG,EAAE,EAAIqd,EAAIrd,EAAI,KAAK,EAEhD,CACD,EACM,CAAE,GAAGC,EAAG,GAAIN,EAAM,OAAS,CAAI,CAAA,CAAA,CACvC,EAED,SAAS2V,GAA6B,CAC7B,OAAA,IAAI,QAASG,GAAY,CAC9B,MAAM6H,EAAI5L,EAAQ,MAClB,GAAI,CAAC4L,GAAK,OAAOA,EAAE,UAAa,WAAY,CAC1C7H,EAAQ,EAAI,EACZ,MACF,CACE6H,EAAA,SAAU3H,GAAmB,CAC7BF,EAAQE,CAAK,CAAA,CACd,CAAA,CACF,CACH,CAEA,SAASI,EAAcwH,EAA8B,UAC3Cnd,GAAAC,EAAAqR,EAAA,QAAA,YAAArR,EAAO,gBAAP,MAAAD,EAAA,KAAAC,EAAuBkd,EACjC,CAEa,OAAAvV,EAAA,CACX,SAAAsN,EACA,cAAAS,EACA,cAAA4G,EACA,iBAAAC,CAAA,CACD,qrJC5dKY,GAAa,CACjB,CAAE,KAAM,WAAY,UAAWC,EAAS,EACxC,CAAE,KAAM,cAAe,UAAWC,EAAY,EAC9C,CAAE,KAAM,UAAW,UAAWC,EAAQ,EACtC,CAAE,KAAM,cAAe,UAAWC,EAAY,EAC9C,CAAE,KAAM,cAAe,UAAWC,EAAY,EAC9C,CAAE,KAAM,uBAAwB,UAAWZ,EAAqB,EAChE,CAAE,KAAM,kBAAmB,UAAWa,EAAgB,EACtD,CAAE,KAAM,oBAAqB,UAAWC,EAAkB,EAC1D,CAAE,KAAM,eAAgB,UAAWC,EAAa,CAClD,EAEO,SAASC,GAAQC,EAAqB,CAC3CV,GAAW,QAAQ,CAAC,CAAE,KAAA3H,EAAM,UAAAsI,KAAgB,CACtCD,EAAA,UAAUrI,EAAMsI,CAAS,CAAA,CAC9B,CACH,CAEe,MAAA5W,GAAA,CACb,QAAA0W,GACA,SAAAR,GACA,QAAAE,GACA,gBAAAG,GACA,kBAAAC,GACA,YAAAL,GACA,qBAAAT,GACA,aAAAe,EACF"}
|