@es-plus/vue3 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"es-plus.umd.cjs","sources":["../../../node_modules/element-plus/es/locale/lang/zh-cn.mjs","../src/components/es-dialog/src/render-jsx.vue","../src/config.ts","../src/components/es-table/src/column-item.vue","../src/components/es-table/src/table-btns.vue","../src/components/es-table/src/engines/use-column-adapter.ts","../src/components/es-table/src/engines/use-virtual-selection.ts","../src/components/es-table/src/engines/use-virtual-sort.ts","../src/components/es-table/src/engines/virtual-engine.vue","../src/composables/use-table-resize.ts","../src/composables/use-table-selection.ts","../src/utils/shared.ts","../src/components/es-table/src/component.vue","../src/components/es-table/index.ts","../src/composables/use-form-inputs.ts","../src/composables/use-form-layout.ts","../src/composables/use-form-request.ts","../src/components/es-dialog/src/use-dialog.ts","../src/components/es-form/src/es-form.vue","../src/components/es-form/index.ts","../src/components/es-dialog/src/component.vue","../src/components/es-dialog/index.ts","../src/components/es-crud-page/src/es-crud-page.vue","../src/components/es-crud-page/index.ts","../src/components/svg-icon/src/svg-icon.vue","../src/components/svg-icon/index.ts","../src/index.ts"],"sourcesContent":["//#region ../../packages/locale/lang/zh-cn.ts\nvar zh_cn_default = {\n\tname: \"zh-cn\",\n\tel: {\n\t\tbreadcrumb: { label: \"面包屑\" },\n\t\tcolorpicker: {\n\t\t\tconfirm: \"确定\",\n\t\t\tclear: \"清空\",\n\t\t\tdefaultLabel: \"颜色选择器\",\n\t\t\tdescription: \"当前颜色 {color},按 Enter 键选择新颜色\",\n\t\t\talphaLabel: \"选择透明度的值\",\n\t\t\talphaDescription: \"透明度 {alpha}, 当前颜色 {color}\",\n\t\t\thueLabel: \"选择色相值\",\n\t\t\thueDescription: \"色相 {hue}, 当前颜色 {color}\",\n\t\t\tsvLabel: \"选择饱和度与明度的值\",\n\t\t\tsvDescription: \"饱和度 {saturation}, 明度 {brightness}, 当前颜色 {color}\",\n\t\t\tpredefineDescription: \"选择 {value} 作为颜色\"\n\t\t},\n\t\tdatepicker: {\n\t\t\tnow: \"此刻\",\n\t\t\ttoday: \"今天\",\n\t\t\tcancel: \"取消\",\n\t\t\tclear: \"清空\",\n\t\t\tconfirm: \"确定\",\n\t\t\tdateTablePrompt: \"使用方向键与 Enter 键可选择日期\",\n\t\t\tmonthTablePrompt: \"使用方向键与 Enter 键可选择月份\",\n\t\t\tyearTablePrompt: \"使用方向键与 Enter 键可选择年份\",\n\t\t\tselectedDate: \"已选日期\",\n\t\t\tselectDate: \"选择日期\",\n\t\t\tselectTime: \"选择时间\",\n\t\t\tstartDate: \"开始日期\",\n\t\t\tstartTime: \"开始时间\",\n\t\t\tendDate: \"结束日期\",\n\t\t\tendTime: \"结束时间\",\n\t\t\tprevYear: \"前一年\",\n\t\t\tnextYear: \"后一年\",\n\t\t\tprevMonth: \"上个月\",\n\t\t\tnextMonth: \"下个月\",\n\t\t\tyear: \"年\",\n\t\t\tmonth1: \"1 月\",\n\t\t\tmonth2: \"2 月\",\n\t\t\tmonth3: \"3 月\",\n\t\t\tmonth4: \"4 月\",\n\t\t\tmonth5: \"5 月\",\n\t\t\tmonth6: \"6 月\",\n\t\t\tmonth7: \"7 月\",\n\t\t\tmonth8: \"8 月\",\n\t\t\tmonth9: \"9 月\",\n\t\t\tmonth10: \"10 月\",\n\t\t\tmonth11: \"11 月\",\n\t\t\tmonth12: \"12 月\",\n\t\t\tweeks: {\n\t\t\t\tsun: \"日\",\n\t\t\t\tmon: \"一\",\n\t\t\t\ttue: \"二\",\n\t\t\t\twed: \"三\",\n\t\t\t\tthu: \"四\",\n\t\t\t\tfri: \"五\",\n\t\t\t\tsat: \"六\"\n\t\t\t},\n\t\t\tweeksFull: {\n\t\t\t\tsun: \"星期日\",\n\t\t\t\tmon: \"星期一\",\n\t\t\t\ttue: \"星期二\",\n\t\t\t\twed: \"星期三\",\n\t\t\t\tthu: \"星期四\",\n\t\t\t\tfri: \"星期五\",\n\t\t\t\tsat: \"星期六\"\n\t\t\t},\n\t\t\tmonths: {\n\t\t\t\tjan: \"一月\",\n\t\t\t\tfeb: \"二月\",\n\t\t\t\tmar: \"三月\",\n\t\t\t\tapr: \"四月\",\n\t\t\t\tmay: \"五月\",\n\t\t\t\tjun: \"六月\",\n\t\t\t\tjul: \"七月\",\n\t\t\t\taug: \"八月\",\n\t\t\t\tsep: \"九月\",\n\t\t\t\toct: \"十月\",\n\t\t\t\tnov: \"十一月\",\n\t\t\t\tdec: \"十二月\"\n\t\t\t}\n\t\t},\n\t\tinputNumber: {\n\t\t\tdecrease: \"减少数值\",\n\t\t\tincrease: \"增加数值\"\n\t\t},\n\t\tselect: {\n\t\t\tloading: \"加载中\",\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tnoData: \"无数据\",\n\t\t\tplaceholder: \"请选择\"\n\t\t},\n\t\tmention: { loading: \"加载中\" },\n\t\tdropdown: { toggleDropdown: \"切换下拉选项\" },\n\t\tcascader: {\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tloading: \"加载中\",\n\t\t\tplaceholder: \"请选择\",\n\t\t\tnoData: \"暂无数据\"\n\t\t},\n\t\tpagination: {\n\t\t\tgoto: \"前往\",\n\t\t\tpagesize: \"条/页\",\n\t\t\ttotal: \"共 {total} 条\",\n\t\t\tpageClassifier: \"页\",\n\t\t\tpage: \"页\",\n\t\t\tprev: \"上一页\",\n\t\t\tnext: \"下一页\",\n\t\t\tcurrentPage: \"第 {pager} 页\",\n\t\t\tprevPages: \"向前 {pager} 页\",\n\t\t\tnextPages: \"向后 {pager} 页\",\n\t\t\tdeprecationWarning: \"你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档\"\n\t\t},\n\t\tdialog: { close: \"关闭此对话框\" },\n\t\tdrawer: { close: \"关闭此对话框\" },\n\t\tmessagebox: {\n\t\t\ttitle: \"提示\",\n\t\t\tconfirm: \"确定\",\n\t\t\tcancel: \"取消\",\n\t\t\terror: \"输入的数据不合法!\",\n\t\t\tclose: \"关闭此对话框\"\n\t\t},\n\t\tupload: {\n\t\t\tdeleteTip: \"按 Delete 键可删除\",\n\t\t\tdelete: \"删除\",\n\t\t\tpreview: \"查看图片\",\n\t\t\tcontinue: \"继续上传\"\n\t\t},\n\t\tslider: {\n\t\t\tdefaultLabel: \"滑块介于 {min} 至 {max}\",\n\t\t\tdefaultRangeStartLabel: \"选择起始值\",\n\t\t\tdefaultRangeEndLabel: \"选择结束值\"\n\t\t},\n\t\ttable: {\n\t\t\temptyText: \"暂无数据\",\n\t\t\tconfirmFilter: \"筛选\",\n\t\t\tresetFilter: \"重置\",\n\t\t\tclearFilter: \"全部\",\n\t\t\tsumText: \"合计\",\n\t\t\tselectAllLabel: \"选择所有行\",\n\t\t\tselectRowLabel: \"选择当前行\",\n\t\t\texpandRowLabel: \"展开当前行\",\n\t\t\tcollapseRowLabel: \"收起当前行\",\n\t\t\tsortLabel: \"按 {column} 排序\",\n\t\t\tfilterLabel: \"按 {column} 过滤\"\n\t\t},\n\t\ttag: { close: \"关闭此标签\" },\n\t\ttour: {\n\t\t\tnext: \"下一步\",\n\t\t\tprevious: \"上一步\",\n\t\t\tfinish: \"结束导览\",\n\t\t\tclose: \"关闭此对话框\"\n\t\t},\n\t\ttree: { emptyText: \"暂无数据\" },\n\t\ttransfer: {\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tnoData: \"无数据\",\n\t\t\ttitles: [\"列表 1\", \"列表 2\"],\n\t\t\tfilterPlaceholder: \"请输入搜索内容\",\n\t\t\tnoCheckedFormat: \"共 {total} 项\",\n\t\t\thasCheckedFormat: \"已选 {checked}/{total} 项\"\n\t\t},\n\t\timage: { error: \"加载失败\" },\n\t\tpageHeader: { title: \"返回\" },\n\t\tpopconfirm: {\n\t\t\tconfirmButtonText: \"确定\",\n\t\t\tcancelButtonText: \"取消\"\n\t\t},\n\t\tcarousel: {\n\t\t\tleftArrow: \"上一张幻灯片\",\n\t\t\trightArrow: \"下一张幻灯片\",\n\t\t\tindicator: \"幻灯片切换至索引 {index}\"\n\t\t},\n\t\tinputOTP: {\n\t\t\tgroupLabel: \"一次性密码输入框\",\n\t\t\tdefaultLabel: \"请输入第 {index} 位 OTP 字符\"\n\t\t}\n\t}\n};\n//#endregion\nexport { zh_cn_default as default };\n\n//# sourceMappingURL=zh-cn.mjs.map","<script >\nimport { defineComponent, h, reactive, isVNode, onMounted, onUpdated } from 'vue'\nimport { ElConfigProvider } from \"element-plus\"\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\n\nexport default defineComponent({\n name: 'RenderJsx',\n props: {\n refs: { type: [Function, Object], default: null },\n row: { type: Object, default: () => ({}) },\n render: { type: Function, default: () => {} },\n model: { type: Object, default: () => ({}) },\n instance: { type: Object, default: () => ({}) },\n components: { type: Object, default: () => ({}) },\n locale: { type: Object, default: null }\n },\n setup(props) {\n const refsObject = (props.refs && typeof props.refs === 'object') ? props.refs : reactive({})\n\n function getRawRef(vnodeRef) {\n if (!vnodeRef) return null\n if (typeof vnodeRef === 'function') return vnodeRef\n if (vnodeRef.r) {\n if (typeof vnodeRef.r === 'function') return vnodeRef.r\n if (vnodeRef.r && typeof vnodeRef.r === 'object' && 'value' in vnodeRef.r) {\n const refObj = vnodeRef.r\n return (val) => { refObj.value = val }\n }\n }\n return null\n }\n\n // Store the component VNode and user ref callback to use after mount\n let componentVNode = null\n let userRefCallback = null\n\n function flushRef() {\n if (!componentVNode) return\n const instance = componentVNode.component\n if (!instance) return\n // Use .exposed first — template refs on components with defineExpose\n // receive instance.exposed, not instance.proxy\n const comp = instance.exposed || instance.proxy\n if (!comp) return\n refsObject.currentRef = comp\n if (typeof userRefCallback === 'function') {\n userRefCallback(comp)\n }\n }\n\n onMounted(() => flushRef())\n onUpdated(() => flushRef())\n\n return () => {\n const { instance } = props\n const enhancedInstance = {\n ...instance,\n registerRef: (name, el) => {\n if (el !== null && el !== undefined) {\n refsObject[name] = el\n }\n },\n getRefs: () => refsObject\n }\n\n const renderContent = props.render(h, enhancedInstance, props.components || {}) || ''\n\n if (typeof renderContent === 'string') {\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h('span', {\n ref: (e) => { refsObject.currentRef = e }\n }, renderContent))\n }\n\n if (isVNode(renderContent)) {\n const isComponent = typeof renderContent.type !== 'string'\n if (isComponent) {\n componentVNode = renderContent\n userRefCallback = getRawRef(renderContent.ref) || getRawRef(renderContent.props?.ref)\n return renderContent\n }\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h('div', {\n ref: (e) => { refsObject.currentRef = e }\n }, [renderContent]))\n }\n\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h(renderContent, {\n ref: (e) => { refsObject.currentRef = e }\n }))\n }\n }\n})\n</script>\n","export interface EsPlusGlobalConfig {\r\n EsTable?: Record<string, unknown>\r\n EsForm?: Record<string, unknown>\r\n EsDialog?: Record<string, unknown>\r\n permission?: (value: string) => boolean\r\n t?: (key: string) => string\r\n [key: string]: unknown\r\n}\r\n\r\nlet globalConfig: EsPlusGlobalConfig = {}\r\n\r\nexport function configureEsPlus(options: EsPlusGlobalConfig): void {\r\n globalConfig = { ...globalConfig, ...options }\r\n}\r\n\r\nexport function getGlobalConfig(): EsPlusGlobalConfig {\r\n return globalConfig\r\n}\r\n","<template>\r\n <!-- 分组列处理 -->\r\n <el-table-column v-if=\"cols.groups && Array.isArray(cols.groups)\" v-bind=\"columnBindAttr(cols)\">\r\n <el-table-column\r\n v-for=\"(item, index) in cols.groups\"\r\n :key=\"item.prop || item.key || index\"\r\n v-bind=\"columnBindAttr({ ...item, columnIndex: index })\"\r\n >\r\n <template v-if=\"item.render && typeof item.render === 'function'\" #default=\"scope\">\r\n <render-dom-tb\r\n v-if=\"scope && scope.row\"\r\n :row=\"scope.row\"\r\n :index=\"scope.$index\"\r\n :data-key=\"item.key\"\r\n :render=\"item.render\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n <template v-else-if=\"item.scopedSlots && item.scopedSlots.customRender\" #default=\"scope\">\r\n <slot\r\n v-if=\"scope && scope.row\"\r\n v-bind=\"{ ...item, row: scope.row, column: scope.column, scope: scope }\"\r\n :name=\"item.scopedSlots.customRender\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n </el-table-column>\r\n\r\n <!-- 自定义渲染函数列 -->\r\n <el-table-column v-else-if=\"cols.render && typeof cols.render === 'function'\" v-bind=\"columnBindAttr(cols)\">\r\n <template #default=\"scope\">\r\n <render-dom-tb\r\n v-if=\"scope && scope.row\"\r\n :row=\"scope.row\"\r\n :index=\"scope.$index\"\r\n :data-key=\"cols.key\"\r\n :render=\"cols.render\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 作用域插槽列 -->\r\n <el-table-column v-else-if=\"cols.scopedSlots && cols.scopedSlots.customRender\" v-bind=\"columnBindAttr(cols)\">\r\n <template #default=\"scope\">\r\n <slot\r\n v-if=\"scope && scope.row\"\r\n v-bind=\"{ ...cols, row: scope.row, column: scope.column, scope: scope }\"\r\n :name=\"cols.scopedSlots.customRender\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 省略号工具提示列 -->\r\n <el-table-column v-else-if=\"cols.ellipsis && typeof cols.ellipsis === 'boolean'\" show-overflow-tooltip v-bind=\"columnBindAttr(cols)\" />\r\n\r\n <!-- 普通列 -->\r\n <el-table-column v-else v-bind=\"columnBindAttr(cols)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { h, defineComponent, inject } from 'vue'\r\nimport { ElTableColumn } from 'element-plus'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport type { TableColumn } from '../../../types'\r\n\r\nconst props = defineProps<{\r\n cols: TableColumn\r\n}>()\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\n// 函数式组件定义\r\nconst RenderDomTb = defineComponent({\r\n props: {\r\n row: { type: Object, default: () => ({}) },\r\n index: { type: Number, default: 0 },\r\n dataKey: String,\r\n render: { type: Function, required: true }\r\n },\r\n setup(props) {\r\n return () => {\r\n const { row, index, dataKey, render } = props\r\n if (!row) return h('span', '-')\r\n const value = dataKey ? row[dataKey] : null\r\n try {\r\n const renderResult = render(h, { value, row, index })\r\n if (typeof renderResult === 'string') return h('span', renderResult)\r\n return renderResult\r\n } catch (error) {\r\n return h('span', '-')\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst firstWordUpperCase = (str: string): string => {\r\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\r\n}\r\n\r\nconst columnBindAttr = (cols: TableColumn) => {\r\n const options: Record<string, unknown> = {}\r\n\r\n for (const t in cols) {\r\n if (t === 'groups' || t === 'scopedSlots' || t === 'render') continue\r\n\r\n if (t.includes('-')) {\r\n const parts = t.split('-')\r\n let camelKey = parts[0]\r\n for (let i = 1; i < parts.length; i++) {\r\n camelKey += firstWordUpperCase(parts[i])\r\n }\r\n options[camelKey] = cols[t]\r\n } else if (t === 'key') {\r\n options.prop = cols[t]\r\n options[t] = cols[t]\r\n } else if (t === 'label' && cols.labelKey && typeof esPlus.t === 'function') {\r\n options.label = (esPlus.t as (k: string) => string)(cols.labelKey)\r\n } else {\r\n options[t] = cols[t]\r\n }\r\n }\r\n\r\n if (!options.align) {\r\n options.align = 'center'\r\n }\r\n\r\n return options\r\n}\r\n</script>\r\n","<template>\r\n <div v-if=\"showContainer\" class=\"flex-float btns\">\r\n <div class=\"left-text\">\r\n {{ leftText }}\r\n </div>\r\n\r\n <div class=\"btn-container_block\">\r\n <!-- 左侧按钮组 -->\r\n <div class=\"btn-left\">\r\n <template v-for=\"(item, index) in processedBtnLeft\" :key=\"item.name\">\r\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\r\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\r\n <el-button v-else :type=\"(item.type as any)\" :size=\"(item.size as any) || 'small'\" :icon=\"(item.icon as any)\" :loading=\"(item.loading as any) || false\" v-bind=\"item\" :disabled=\"getDisabledState(item)\" @click=\"()=>(item.click as any)(instance)\">\r\n {{ item.name }}\r\n </el-button>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 右侧按钮组 -->\r\n <div class=\"btn-right\">\r\n <template v-for=\"(item, index) in processedBtnRight\" :key=\"item.name\">\r\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\r\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\r\n <el-button v-else :type=\"(item.type as any)\" :size=\"(item.size as any) || 'small'\" v-bind=\"item\" :icon=\"(item.icon as any)\" :loading=\"(item.loading as any) || false\" :disabled=\"getDisabledState(item)\" @click=\"() =>(item.click as any)(instance)\">\r\n {{ item.name }}\r\n </el-button>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, h, inject } from 'vue'\r\nimport { ElButton } from 'element-plus'\r\nimport { getGlobalConfig } from '../../../config'\r\n\r\nconst props = defineProps<{\r\n leftText?: string\r\n btnConfig?: Array<Record<string, unknown>>\r\n instance?: Record<string, unknown>\r\n}>()\r\n\r\nconst RenderDom = (props: { render: Function }) => {\r\n if (!props.render || typeof props.render !== 'function') return null\r\n try {\r\n return props.render()\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nRenderDom.props = {\r\n render: { type: Function, required: true }\r\n}\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst hasPermission = (_btnList: unknown[], pvalue?: string) => {\r\n if (!pvalue) return true\r\n const permFn = esPlus.permission\r\n if (typeof permFn === 'function') return (permFn as (v: string) => boolean)(pvalue)\r\n return true\r\n}\r\n\r\nconst processButtonConfig = (config: Array<Record<string, unknown>>) => {\r\n return config.map((item) => {\r\n const processed = { ...item }\r\n const hasPerm = hasPermission([], item.permissionValue as string)\r\n\r\n if (!hasPerm) {\r\n processed.isHide = true\r\n } else if (typeof item.isHide === 'function') {\r\n processed.isHide = item.isHide()\r\n } else {\r\n processed.isHide = item.isHide || false\r\n }\r\n\r\n return processed\r\n })\r\n}\r\n\r\nconst processedBtnLeft = computed(() => {\r\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 1)).filter((item) => !item.isHide)\r\n})\r\n\r\nconst processedBtnRight = computed(() => {\r\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 2)).filter((item) => !item.isHide)\r\n})\r\n\r\nconst showContainer = computed(() => {\r\n return props.leftText || processedBtnLeft.value.length > 0 || processedBtnRight.value.length > 0\r\n})\r\n\r\nconst getDisabledState = (item: Record<string, unknown>): boolean => {\r\n if (typeof item.disabled === 'function') {\r\n return (item.disabled as () => boolean)()\r\n }\r\n return (item.disabled as boolean) || false\r\n}\r\n\r\nconst buttonContainerStyle = (index: number) => {\r\n return {\r\n display: 'inline-block',\r\n marginLeft: index !== 0 ? '8px' : '0px'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.btns {\r\n padding: 0;\r\n padding-bottom: 5px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.left-text {\r\n color: rgb(125, 125, 125);\r\n font-size: 14px;\r\n // flex-grow: 1;\r\n}\r\n\r\n.btn-container_block {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex: 1;\r\n\r\n .btn-left {\r\n display: flex;\r\n justify-content: flex-start;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .btn-right {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .btns {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n }\r\n\r\n .btn-container_block {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 10px;\r\n\r\n .btn-left,\r\n .btn-right {\r\n width: 100%;\r\n justify-content: flex-start;\r\n }\r\n }\r\n}\r\n</style>\r\n","import { computed, h, ref, type Ref, type Slots, type VNode } from 'vue'\r\nimport { ElCheckbox, ElIcon, ElTooltip } from 'element-plus'\r\nimport type { TableColumn } from '../../../../types'\r\n\r\nexport interface VirtualColumn {\r\n key: string\r\n dataKey: string\r\n title: string\r\n width: number\r\n fixed?: true | 'left' | 'right'\r\n sortable?: boolean\r\n align?: 'left' | 'center' | 'right'\r\n cellRenderer?: (params: CellRendererParams) => any\r\n headerCellRenderer?: (params: HeaderCellRendererParams) => any\r\n}\r\n\r\ninterface CellRendererParams {\r\n cellData: unknown\r\n column: VirtualColumn\r\n columnIndex: number\r\n rowData: Record<string, unknown>\r\n rowIndex: number\r\n}\r\n\r\ninterface HeaderCellRendererParams {\r\n column: VirtualColumn\r\n columns: VirtualColumn[]\r\n columnIndex: number\r\n headerIndex: number\r\n}\r\n\r\nexport interface ColumnAdapterOptions {\r\n multiSelect?: boolean\r\n snIndex?: boolean\r\n expand?: boolean\r\n selectedKeys: Ref<Set<string>>\r\n allSelected: Ref<boolean>\r\n indeterminate: Ref<boolean>\r\n onSelectAll: (val: boolean) => void\r\n onSelectRow: (rowKey: string, val: boolean) => void\r\n rowkey: string\r\n parentSlots?: Slots\r\n t?: (key: string) => string\r\n expandedKeys?: Ref<Set<string>>\r\n onToggleExpand?: (rowKey: string) => void\r\n}\r\n\r\nconst DEFAULT_WIDTH = 150\r\n\r\nexport function useColumnAdapter(\r\n columns: Ref<TableColumn[]>,\r\n options: ColumnAdapterOptions\r\n): Ref<VirtualColumn[]> {\r\n return computed(() => {\r\n const result: VirtualColumn[] = []\r\n const hasSelectionCol = columns.value.some(c => c.type === 'selection')\r\n const hasIndexCol = columns.value.some(c => c.type === 'index')\r\n const hasExpandCol = columns.value.some(c => c.type === 'expand')\r\n\r\n // options.multiSelect 注入选择列(仅当 columns 中没有 type:'selection' 时)\r\n if (options.multiSelect && !hasSelectionCol) {\r\n result.push(createSelectionColumn(options))\r\n }\r\n\r\n // options.expand 注入展开列(仅当 columns 中没有 type:'expand' 时)\r\n if (options.expand && !hasExpandCol) {\r\n result.push(createExpandColumn(options))\r\n }\r\n\r\n // options.snIndex 注入序号列(仅当 columns 中没有 type:'index' 时)\r\n if (options.snIndex && !hasIndexCol) {\r\n result.push(createIndexColumn())\r\n }\r\n\r\n for (const col of columns.value) {\r\n if (col.type === 'selection') {\r\n result.push(createSelectionColumn(options, col))\r\n continue\r\n }\r\n if (col.type === 'index') {\r\n result.push(createIndexColumn(col))\r\n continue\r\n }\r\n if (col.type === 'expand') {\r\n result.push(createExpandColumn(options, col))\r\n continue\r\n }\r\n\r\n if (col.groups && col.groups.length > 0) {\r\n for (const child of col.groups) {\r\n result.push(adaptColumn(child, options))\r\n }\r\n } else {\r\n result.push(adaptColumn(col, options))\r\n }\r\n }\r\n\r\n return result\r\n })\r\n}\r\n\r\nfunction adaptColumn(col: TableColumn, options: ColumnAdapterOptions): VirtualColumn {\r\n const key = (col.prop || col.key || '') as string\r\n const title = col.labelKey && options.t\r\n ? options.t(col.labelKey as string)\r\n : (col.label || '') as string\r\n\r\n const width = typeof col.width === 'number'\r\n ? col.width\r\n : typeof col.width === 'string'\r\n ? parseInt(col.width, 10) || DEFAULT_WIDTH\r\n : typeof col.minWidth === 'number'\r\n ? col.minWidth\r\n : typeof col.minWidth === 'string'\r\n ? parseInt(col.minWidth, 10) || DEFAULT_WIDTH\r\n : DEFAULT_WIDTH\r\n\r\n const base: VirtualColumn = {\r\n key,\r\n dataKey: key,\r\n title,\r\n width,\r\n align: (col.align as VirtualColumn['align']) || 'center',\r\n }\r\n\r\n if (col.fixed) {\r\n base.fixed = col.fixed === true ? 'left' : col.fixed as 'left' | 'right'\r\n }\r\n\r\n if (col.sortable) {\r\n base.sortable = true\r\n }\r\n\r\n if (col.render) {\r\n base.cellRenderer = createRenderCellRenderer(col)\r\n } else if (col.scopedSlots?.customRender && options.parentSlots) {\r\n base.cellRenderer = createSlotCellRenderer(col, options.parentSlots)\r\n } else if (col.ellipsis) {\r\n base.cellRenderer = createEllipsisCellRenderer(col)\r\n } else if (col.formatter) {\r\n base.cellRenderer = createFormatterCellRenderer(col)\r\n }\r\n\r\n return base\r\n}\r\n\r\nfunction createSelectionColumn(options: ColumnAdapterOptions, col?: TableColumn): VirtualColumn {\r\n const width = typeof col?.width === 'number' ? col.width\r\n : typeof col?.width === 'string' ? parseInt(col.width, 10) || 50\r\n : 50\r\n const fixed = col?.fixed != null\r\n ? (col.fixed === true ? 'left' : col.fixed as 'left' | 'right')\r\n : 'left'\r\n return {\r\n key: '__selection__',\r\n dataKey: '__selection__',\r\n title: '',\r\n width,\r\n fixed,\r\n align: 'center',\r\n cellRenderer: ({ rowData }) => {\r\n const rowKey = String(rowData[options.rowkey] ?? '')\r\n const checked = options.selectedKeys.value.has(rowKey)\r\n return h(ElCheckbox, {\r\n modelValue: checked,\r\n 'onUpdate:modelValue': (val: boolean) => options.onSelectRow(rowKey, val),\r\n onClick: (e: Event) => e.stopPropagation(),\r\n })\r\n },\r\n headerCellRenderer: () => {\r\n return h(ElCheckbox, {\r\n modelValue: options.allSelected.value,\r\n indeterminate: options.indeterminate.value,\r\n 'onUpdate:modelValue': (val: boolean) => options.onSelectAll(val),\r\n })\r\n },\r\n }\r\n}\r\n\r\nfunction createIndexColumn(col?: TableColumn): VirtualColumn {\r\n return {\r\n key: '__index__',\r\n dataKey: '__index__',\r\n title: (col?.label as string) || '#',\r\n width: typeof col?.width === 'number' ? col.width : 60,\r\n align: 'center',\r\n cellRenderer: ({ rowIndex }) => h('span', String(rowIndex + 1)),\r\n }\r\n}\r\n\r\nfunction createExpandColumn(options: ColumnAdapterOptions, col?: TableColumn): VirtualColumn {\r\n return {\r\n key: '__expand__',\r\n dataKey: '__expand__',\r\n title: (col?.label as string) || '',\r\n width: typeof col?.width === 'number' ? col.width : 50,\r\n fixed: 'left',\r\n align: 'center',\r\n cellRenderer: ({ rowData }) => {\r\n const rowKey = String(rowData[options.rowkey] ?? '')\r\n const expanded = options.expandedKeys?.value.has(rowKey) ?? false\r\n return h('span', {\r\n class: ['es-virtual-expand-icon', expanded ? 'is-expanded' : ''],\r\n style: {\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n transition: 'transform 0.2s',\r\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\r\n },\r\n onClick: (e: Event) => {\r\n e.stopPropagation()\r\n options.onToggleExpand?.(rowKey)\r\n },\r\n }, h(ElIcon, { size: 14 }, () => h('svg', {\r\n viewBox: '0 0 1024 1024',\r\n width: '1em',\r\n height: '1em',\r\n }, h('path', {\r\n fill: 'currentColor',\r\n d: 'M384 192v640l384-320z',\r\n }))))\r\n },\r\n }\r\n}\r\n\r\nfunction createRenderCellRenderer(col: TableColumn) {\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const renderFn = col.render as (h: typeof import('vue')['h'], ctx: any) => VNode\r\n return renderFn(h, { value: cellData, row: rowData, index: rowIndex })\r\n }\r\n}\r\n\r\nfunction createSlotCellRenderer(col: TableColumn, parentSlots: Slots) {\r\n const slotName = (col.scopedSlots as any).customRender as string\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const slotFn = parentSlots[slotName]\r\n if (slotFn) {\r\n return slotFn({ row: rowData, column: col, scope: { row: rowData, $index: rowIndex }, value: cellData })\r\n }\r\n return h('span', String(cellData ?? ''))\r\n }\r\n}\r\n\r\nfunction createEllipsisCellRenderer(col: TableColumn) {\r\n return ({ cellData, rowData }: CellRendererParams) => {\r\n let text: string\r\n if (col.formatter) {\r\n const formatter = col.formatter as (row: any, column: any, cellValue: any, index: number) => string\r\n text = String(formatter(rowData, col, cellData, 0) ?? '')\r\n } else {\r\n text = String(cellData ?? '')\r\n }\r\n return h(ElTooltip, { content: text, placement: 'top', showAfter: 300 }, {\r\n default: () => h('div', {\r\n style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\r\n }, text)\r\n })\r\n }\r\n}\r\n\r\nfunction createFormatterCellRenderer(col: TableColumn) {\r\n const formatter = col.formatter as (row: any, column: any, cellValue: any, index: number) => string\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const formatted = formatter(rowData, col, cellData, rowIndex)\r\n return h('span', String(formatted ?? ''))\r\n }\r\n}\r\n","import { ref, computed, watch, type Ref } from 'vue'\r\n\r\nexport function useVirtualSelection(\r\n dataSource: Ref<Record<string, unknown>[]>,\r\n rowkey: string\r\n) {\r\n const selectedKeys = ref<Set<string>>(new Set())\r\n\r\n // O(1) — 直接比较 Set size 与数据长度\r\n const allSelected = computed(() => {\r\n if (dataSource.value.length === 0) return false\r\n return selectedKeys.value.size === dataSource.value.length\r\n })\r\n\r\n const indeterminate = computed(() => {\r\n const size = selectedKeys.value.size\r\n return size > 0 && size < dataSource.value.length\r\n })\r\n\r\n function onSelectRow(key: string, val: boolean) {\r\n const next = new Set(selectedKeys.value)\r\n if (val) {\r\n next.add(key)\r\n } else {\r\n next.delete(key)\r\n }\r\n selectedKeys.value = next\r\n }\r\n\r\n function onSelectAll(val: boolean) {\r\n if (val) {\r\n const next = new Set(selectedKeys.value)\r\n for (const row of dataSource.value) {\r\n next.add(String(row[rowkey] ?? ''))\r\n }\r\n selectedKeys.value = next\r\n } else {\r\n selectedKeys.value = new Set()\r\n }\r\n }\r\n\r\n function getSelectedRows(): Record<string, unknown>[] {\r\n const keys = selectedKeys.value\r\n if (keys.size === 0) return []\r\n const result: Record<string, unknown>[] = []\r\n for (const row of dataSource.value) {\r\n if (keys.has(String(row[rowkey] ?? ''))) {\r\n result.push(row)\r\n }\r\n if (result.length === keys.size) break\r\n }\r\n return result\r\n }\r\n\r\n function clearSelection() {\r\n selectedKeys.value = new Set()\r\n }\r\n\r\n function toggleRowSelection(row: Record<string, unknown>, selected?: boolean) {\r\n const key = String(row[rowkey] ?? '')\r\n if (selected === undefined) {\r\n onSelectRow(key, !selectedKeys.value.has(key))\r\n } else {\r\n onSelectRow(key, selected)\r\n }\r\n }\r\n\r\n function restoreSelections(keys: Set<string>) {\r\n selectedKeys.value = new Set(keys)\r\n }\r\n\r\n return {\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectRow,\r\n onSelectAll,\r\n getSelectedRows,\r\n clearSelection,\r\n toggleRowSelection,\r\n restoreSelections,\r\n }\r\n}\r\n","import { ref } from 'vue'\r\nimport type { TableColumn } from '../../../../types'\r\n\r\nexport interface SortState {\r\n key: string\r\n order: 'asc' | 'desc'\r\n}\r\n\r\nexport function useVirtualSort() {\r\n const sortState = ref<SortState | undefined>(undefined)\r\n\r\n function onColumnSort({ key, order }: { key: string | number; order: 'asc' | 'desc' }) {\r\n const k = String(key)\r\n if (sortState.value?.key === k && sortState.value?.order === order) {\r\n sortState.value = undefined\r\n } else {\r\n sortState.value = { key: k, order }\r\n }\r\n }\r\n\r\n function toSortChangePayload(columns: TableColumn[]) {\r\n const key = sortState.value?.key || ''\r\n const order = sortState.value?.order || ''\r\n const col = columns.find(c => (c.prop || c.key) === key)\r\n return {\r\n column: col || null,\r\n prop: key,\r\n order: order === 'asc'\r\n ? 'ascending'\r\n : order === 'desc'\r\n ? 'descending'\r\n : null,\r\n }\r\n }\r\n\r\n return { sortState, onColumnSort, toSortChangePayload }\r\n}\r\n","<template>\r\n <div class=\"es-virtual-table-wrapper\">\r\n <el-auto-resizer :disable-height=\"true\">\r\n <template #default=\"{ width }\">\r\n <el-table-v2\r\n ref=\"tableV2Ref\"\r\n :columns=\"(adaptedColumns as any)\"\r\n :data=\"dataSource\"\r\n :width=\"width || 800\"\r\n :height=\"tableHeight || 400\"\r\n :row-height=\"options.rowHeight || 50\"\r\n :estimated-row-height=\"options.estimatedRowHeight\"\r\n :cache=\"options.overscanCount || 2\"\r\n :row-key=\"options.rowkey || 'id'\"\r\n :sort-by=\"(sortState as any)\"\r\n :header-height=\"headerHeight\"\r\n :class=\"tableClass\"\r\n :row-class=\"rowClassName\"\r\n :row-event-handlers=\"rowEventHandlers\"\r\n @column-sort=\"handleColumnSort as any\"\r\n />\r\n </template>\r\n </el-auto-resizer>\r\n <div v-if=\"!dataSource || dataSource.length === 0\" class=\"es-virtual-table__empty\">\r\n <slot name=\"empty\">\r\n <div class=\"ant-empty ant-empty-normal\">\r\n <div class=\"ant-empty-image\">\r\n <svg class=\"ant-empty-img-simple\" width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\r\n <ellipse class=\"ant-empty-img-simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\r\n <g class=\"ant-empty-img-simple-g\" fill-rule=\"nonzero\">\r\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\r\n <path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" class=\"ant-empty-img-simple-path\" />\r\n </g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"ant-empty-description\">暂无数据</div>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, toRef, inject } from 'vue'\r\nimport { ElAutoResizer, ElTableV2 } from 'element-plus'\r\nimport type { TableColumn, TableOptions } from '../../../../types'\r\nimport { useColumnAdapter } from './use-column-adapter'\r\nimport { useVirtualSelection } from './use-virtual-selection'\r\nimport { useVirtualSort } from './use-virtual-sort'\r\nimport type { TableEngineExposed } from './types'\r\nimport { getGlobalConfig } from '../../../../config'\r\n\r\nconst props = defineProps<{\r\n columns: TableColumn[]\r\n dataSource: Record<string, unknown>[]\r\n tableHeight: number\r\n options: TableOptions\r\n parentSlots?: Record<string, (...args: any[]) => any>\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n 'sort-change': [payload: { column: any; prop: string; order: string | null }]\r\n 'selection-change': [rows: Record<string, unknown>[]]\r\n 'row-click': [row: Record<string, unknown>, event: Event]\r\n 'row-dblclick': [row: Record<string, unknown>, event: Event]\r\n 'row-contextmenu': [row: Record<string, unknown>, event: Event]\r\n 'expand-change': [row: Record<string, unknown>, expanded: boolean]\r\n}>()\r\n\r\nconst tableV2Ref = ref<InstanceType<typeof ElTableV2> | null>(null)\r\nconst headerHeight = 50\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\nconst tFn = computed(() => (esPlus.t as ((key: string) => string) | undefined) || undefined)\r\n\r\nconst rowkey = computed(() => props.options.rowkey || 'id')\r\nconst dataSourceRef = toRef(props, 'dataSource')\r\nconst columnsRef = toRef(props, 'columns')\r\n\r\nconst {\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectRow,\r\n onSelectAll,\r\n getSelectedRows,\r\n clearSelection,\r\n toggleRowSelection,\r\n} = useVirtualSelection(dataSourceRef, rowkey.value)\r\n\r\nconst { sortState, onColumnSort, toSortChangePayload } = useVirtualSort()\r\n\r\nconst expandedKeys = ref<Set<string>>(new Set())\r\n\r\nfunction onToggleExpand(key: string) {\r\n const next = new Set(expandedKeys.value)\r\n const row = props.dataSource.find(r => String(r[rowkey.value] ?? '') === key)\r\n if (next.has(key)) {\r\n next.delete(key)\r\n if (row) emit('expand-change', row, false)\r\n } else {\r\n next.add(key)\r\n if (row) emit('expand-change', row, true)\r\n }\r\n expandedKeys.value = next\r\n}\r\n\r\nlet selectionChangeTimer: ReturnType<typeof setTimeout> | null = null\r\nfunction emitSelectionChange() {\r\n if (selectionChangeTimer) clearTimeout(selectionChangeTimer)\r\n selectionChangeTimer = setTimeout(() => {\r\n emit('selection-change', getSelectedRows())\r\n }, 0)\r\n}\r\n\r\nconst adaptedColumns = useColumnAdapter(columnsRef, {\r\n multiSelect: !!props.options.multiSelect,\r\n snIndex: !!props.options.snIndex,\r\n expand: !!props.options.expand,\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectAll: (val: boolean) => {\r\n onSelectAll(val)\r\n emitSelectionChange()\r\n },\r\n onSelectRow: (key: string, val: boolean) => {\r\n onSelectRow(key, val)\r\n emitSelectionChange()\r\n },\r\n rowkey: rowkey.value,\r\n parentSlots: props.parentSlots,\r\n t: tFn.value,\r\n expandedKeys,\r\n onToggleExpand,\r\n})\r\n\r\nconst tableClass = computed(() => {\r\n const cls: string[] = ['es-virtual-table']\r\n if (props.options.border) cls.push('es-virtual-table--border')\r\n if (props.options.stripe) cls.push('es-virtual-table--stripe')\r\n if (props.options.highlightCurrentRow) cls.push('es-virtual-table--highlight')\r\n return cls.join(' ')\r\n})\r\n\r\nconst currentRowKey = ref<string>('')\r\n\r\nconst rowClassName = computed(() => {\r\n return ({ rowData, rowIndex }: { rowData: Record<string, unknown>; rowIndex: number }) => {\r\n const classes: string[] = []\r\n if (props.options.highlightCurrentRow) {\r\n const key = String(rowData[rowkey.value] ?? '')\r\n if (key === currentRowKey.value) {\r\n classes.push('current-row')\r\n }\r\n }\r\n const rowClassNameOpt = props.options.rowClassName as string | ((params: any) => string) | undefined\r\n if (typeof rowClassNameOpt === 'function') {\r\n const cls = rowClassNameOpt({ row: rowData, rowIndex })\r\n if (cls) classes.push(cls)\r\n } else if (typeof rowClassNameOpt === 'string' && rowClassNameOpt) {\r\n classes.push(rowClassNameOpt)\r\n }\r\n return classes.join(' ')\r\n }\r\n})\r\n\r\nconst rowEventHandlers = computed(() => ({\r\n onClick: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n const key = String(e.rowData[rowkey.value] ?? '')\r\n currentRowKey.value = key\r\n emit('row-click', e.rowData, e.event)\r\n },\r\n onDblclick: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n emit('row-dblclick', e.rowData, e.event)\r\n },\r\n onContextmenu: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n emit('row-contextmenu', e.rowData, e.event)\r\n },\r\n}))\r\n\r\nfunction handleColumnSort(params: { key: string | number; order: 'asc' | 'desc' }) {\r\n onColumnSort(params)\r\n const payload = toSortChangePayload(props.columns)\r\n emit('sort-change', payload)\r\n}\r\n\r\ndefineExpose<TableEngineExposed>({\r\n getTableRef: () => tableV2Ref.value,\r\n doLayout: () => {},\r\n toggleRowSelection,\r\n clearSelection,\r\n getSelectedRows,\r\n scrollToRow: (row: number) => {\r\n (tableV2Ref.value as any)?.scrollToRow?.(row)\r\n },\r\n})\r\n</script>\r\n\r\n<style>\r\n.es-virtual-table-wrapper {\r\n position: relative;\r\n width: 100%;\r\n}\r\n.es-virtual-table--border .el-table-v2 {\r\n border: 1px solid var(--el-border-color-lighter);\r\n}\r\n.es-virtual-table--border .el-table-v2 .el-table-v2__header-cell,\r\n.es-virtual-table--border .el-table-v2 .el-table-v2__row-cell {\r\n border-right: 1px solid var(--el-border-color-lighter);\r\n border-bottom: 1px solid var(--el-border-color-lighter);\r\n}\r\n.es-virtual-table--stripe .el-table-v2__row:nth-child(even) {\r\n background-color: var(--el-fill-color-lighter);\r\n}\r\n.es-virtual-table--highlight .el-table-v2__row.current-row {\r\n background-color: var(--el-color-primary-light-9) !important;\r\n}\r\n.es-virtual-table--highlight .el-table-v2__row:hover {\r\n background-color: var(--el-fill-color-light);\r\n}\r\n.es-virtual-table__empty {\r\n position: absolute;\r\n top: 50px;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #fff;\r\n z-index: 1;\r\n}\r\n.es-virtual-table__empty .ant-empty-image {\r\n height: 40px;\r\n margin-bottom: 8px;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-ellipse {\r\n fill: #f5f5f5;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-g {\r\n stroke: #d9d9d9;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-path {\r\n fill: #fafafa;\r\n}\r\n.es-virtual-table__empty .ant-empty-description {\r\n color: rgba(0, 0, 0, 0.25);\r\n font-size: 14px;\r\n}\r\n.es-virtual-expand-icon {\r\n color: var(--el-text-color-secondary);\r\n}\r\n.es-virtual-expand-icon:hover {\r\n color: var(--el-color-primary);\r\n}\r\n</style>\r\n","import { ref, nextTick, onMounted, onBeforeUnmount } from 'vue'\n\nexport function useTableResize(\n tableContainerRef: { value: HTMLElement | null },\n headBarRef: { value: HTMLElement | null },\n tbBtnRef: { value: { $el?: HTMLElement } | null },\n paginationRef: { value: HTMLElement | null },\n options: { heightType?: 'auto' | 'height'; tabHeight?: number | string }\n) {\n const tableHeight = ref(400)\n const observer = ref<ResizeObserver | null>(null)\n\n const isNegative = (num: number) => Math.sign(num) === -1\n\n const totalContainerNum = () => {\n const headBarHeight = headBarRef.value?.offsetHeight || 0\n const tbBtnHeight = tbBtnRef.value?.$el?.offsetHeight || 0\n const paginationHeight = paginationRef.value?.offsetHeight || 0\n return Math.round(paginationHeight + headBarHeight + tbBtnHeight)\n }\n\n const resizeObservers = () => {\n const element = tableContainerRef.value\n if (!element) return\n\n const containerHeight = typeof options.tabHeight === 'number'\n ? options.tabHeight\n : options.heightType === 'height'\n ? (element.parentElement?.offsetHeight || element.offsetHeight)\n : (parseInt(options.tabHeight as string, 10) || 450)\n\n const maxContainer = !isNaN(containerHeight) ? containerHeight : 450\n const minTableNum = maxContainer - totalContainerNum()\n const tabContainer = isNegative(minTableNum) ? totalContainerNum() + 300 : maxContainer\n\n const paginationHeight = paginationRef.value?.offsetHeight || 0\n const headBarHeight = headBarRef.value?.offsetHeight || 0\n const tbBtnHeight = tbBtnRef.value?.$el?.offsetHeight || 0\n\n const newHeight = Math.floor(tabContainer) - Math.round(paginationHeight + headBarHeight + tbBtnHeight)\n if (tableHeight.value !== newHeight) {\n tableHeight.value = newHeight\n }\n }\n\n const startObserver = () => {\n nextTick(() => {\n if (!tableContainerRef.value || typeof ResizeObserver === 'undefined') return\n\n observer.value = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n if (tableContainerRef.value) resizeObservers()\n })\n })\n\n // Observe the main container\n const target = options.heightType === 'height'\n ? tableContainerRef.value.parentElement || tableContainerRef.value\n : tableContainerRef.value\n observer.value.observe(target)\n\n // Observe headBarRef to detect form expand/collapse height changes\n if (headBarRef.value) {\n observer.value.observe(headBarRef.value)\n }\n })\n }\n\n const stopObserver = () => {\n if (observer.value) {\n observer.value.disconnect()\n observer.value = null\n }\n }\n\n onMounted(() => startObserver())\n onBeforeUnmount(() => stopObserver())\n\n return {\n tableHeight,\n resizeObservers,\n startObserver,\n stopObserver\n }\n}\n","import { ref, nextTick } from 'vue'\n\nexport function useTableSelection(rowkey?: string) {\n const multipleSelection = ref<Record<string, unknown>[]>([])\n const selectionsByPage = ref<Record<number, Record<string, unknown>[]>>({})\n const isInitChange = ref(false)\n\n const handleSelectionChange = (val: Record<string, unknown>[], currentPage: number) => {\n if (rowkey) {\n if (isInitChange.value) return\n selectionsByPage.value[currentPage] = val\n let allSelections: Record<string, unknown>[] = []\n const uniqueMap: Record<string, boolean> = {}\n\n Object.values(selectionsByPage.value).forEach((pageSelections) => {\n pageSelections.forEach((item) => {\n const key = item[rowkey] as string\n if (key && !uniqueMap[key]) {\n allSelections.push(item)\n uniqueMap[key] = true\n }\n })\n })\n\n multipleSelection.value = allSelections\n } else {\n multipleSelection.value = val\n }\n }\n\n const handleSelectData = (dataList: Record<string, unknown>[], tableRef: { toggleRowSelection?: (row: Record<string, unknown>, selected: boolean) => void }) => {\n if (dataList?.length && rowkey && multipleSelection.value.length) {\n const pageSelecteds: Record<string, unknown>[] = []\n dataList.forEach((row) => {\n multipleSelection.value.forEach((selectedRow) => {\n if (row[rowkey] === selectedRow[rowkey]) {\n pageSelecteds.push(row)\n }\n })\n })\n\n pageSelecteds.forEach((row) => {\n tableRef.toggleRowSelection?.(row, true)\n })\n }\n }\n\n const clearAllSelection = (tableRef: { clearSelection?: () => void }) => {\n multipleSelection.value = []\n selectionsByPage.value = {}\n tableRef.clearSelection?.()\n }\n\n const initSelection = (dataList: Record<string, unknown>[], tableRef: { toggleRowSelection?: (row: Record<string, unknown>, selected: boolean) => void; clearSelection?: () => void } | null) => {\n isInitChange.value = true\n if (!tableRef) {\n isInitChange.value = false\n return\n }\n if (rowkey) {\n nextTick(() => {\n handleSelectData(dataList, tableRef)\n isInitChange.value = false\n })\n } else {\n nextTick(() => {\n tableRef.clearSelection?.()\n isInitChange.value = false\n })\n }\n }\n\n return {\n multipleSelection,\n selectionsByPage,\n isInitChange,\n handleSelectionChange,\n handleSelectData,\n clearAllSelection,\n initSelection\n }\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && Object.prototype.toString.call(value) === '[object Object]'\n}\n\nexport const isArray = (value: unknown): value is unknown[] => {\n return Array.isArray(value)\n}\n\nexport const isFunction = (value: unknown): value is Function => {\n return typeof value === 'function'\n}\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string'\n}\n\nexport const isNumber = (value: unknown): value is number => {\n return typeof value === 'number' && !isNaN(value)\n}\n\nexport const isEmpty = (value: unknown): boolean => {\n if (value == null) return true\n if (isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n}\n\nexport const firstWordUpperCase = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport const kebabToCamel = (str: string): string => {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\nexport const toPascalCase = (str: string): string => {\n return str.replace(/(^|-)([a-z])/g, (_, __, letter) => letter.toUpperCase())\n}\n\nexport const findValueByKey = (obj: Record<string, unknown>, key: string, depth = 0): unknown => {\n if (depth > 3) return undefined\n if (!isObject(obj)) return undefined\n\n const currentValue = Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : undefined\n\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop) && isObject(obj[prop])) {\n const deepValue = findValueByKey(obj[prop] as Record<string, unknown>, key, depth + 1)\n if (deepValue !== undefined) return deepValue\n }\n }\n return currentValue\n}\n\nexport const wrapPromise = <T>(promise: Promise<T>): Promise<{ status: 'fulfilled'; value: T } | { status: 'rejected'; reason: unknown }> => {\n return promise\n .then((value) => ({ status: 'fulfilled' as const, value }))\n .catch((reason) => ({ status: 'rejected' as const, reason }))\n}\n","<template>\r\n <el-config-provider :locale=\"locale\">\r\n <div :ref=\"setTableContainer\" class=\"table_component\" :style=\"{ [heightType]: tabHeight }\">\r\n <div class=\"table_containers\">\r\n <div\r\n v-if=\"showHeaderBar\"\r\n ref=\"headBarRef\"\r\n class=\"btn-slot\"\r\n :style=\"(slotStyles.value && slotStyles.type === 'object' && slotStyles.value) as any\"\r\n :class=\"slotStyles.type === 'string' ? slotStyles.value : { slotClass: slotState && slotStyles.type !== 'object' }\"\r\n >\r\n <div class=\"headerBar\" v-if=\"hasDefaultSlot\" :style=\"{ paddingBottom: hasDefaultSlot ? '10px' : '0px' }\">\r\n <slot />\r\n </div>\r\n </div>\r\n <div v-loading=\"loadStatus\" element-loading-background=\"rgba(0, 0, 0, 0.03)\" element-loading-text=\"努力加载中...\" class=\"page-loading-con tableContainer\">\r\n <div class=\"table_inner_containers\">\r\n <table-btns\r\n ref=\"tbBtnRef\"\r\n :instance=\"{ tableRef: instance, formInstance: formInstance }\"\r\n v-if=\"(options.configBtn && (options.configBtn as any[]).length) || options.leftText\"\r\n :btn-config=\"(options.configBtn as any[])\"\r\n :left-text=\"(options.leftText as string)\"\r\n />\r\n <virtual-engine\r\n v-if=\"isVirtual\"\r\n ref=\"virtualEngineRef\"\r\n :columns=\"filteredColumns\"\r\n :data-source=\"dataSource\"\r\n :table-height=\"tableHeight\"\r\n :options=\"props.options\"\r\n :parent-slots=\"$slots\"\r\n @sort-change=\"changeTableSort\"\r\n @selection-change=\"handleVirtualSelectionChange\"\r\n />\r\n <el-table\r\n v-else\r\n class=\"el-dp_tables\"\r\n :id=\"tableId\"\r\n :key=\"tableId\"\r\n ref=\"tableRef\"\r\n style=\"width: 100%\"\r\n v-bind=\"tableBindAttrs\"\r\n :data=\"dataSource\"\r\n @sort-change=\"changeTableSort\"\r\n @selection-change=\"handleTableSelectionChange\"\r\n >\r\n <template #empty>\r\n <div class=\"ant-empty ant-empty-normal\">\r\n <div class=\"ant-empty-image\">\r\n <svg class=\"ant-empty-img-simple\" width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\r\n <ellipse class=\"ant-empty-img-simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\r\n <g class=\"ant-empty-img-simple-g\" fill-rule=\"nonzero\">\r\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\r\n <path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" class=\"ant-empty-img-simple-path\" />\r\n </g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"ant-empty-description\">暂无数据</div>\r\n </div>\r\n </template>\r\n <column-item v-for=\"(cols, index) in filteredColumns\" :key=\"cols.prop || cols.key || index\" :cols=\"{ ...cols, columnIndex: index }\">\r\n <template v-if=\"cols.scopedSlots && cols.scopedSlots.customRender\" #[cols.scopedSlots.customRender]=\"{ scope }\">\r\n <slot v-bind=\"{ ...cols, columnIndex: index, row: scope.row, column: scope.column }\" :name=\"cols.scopedSlots.customRender\" :scope=\"scope\" />\r\n </template>\r\n </column-item>\r\n </el-table>\r\n </div>\r\n <div\r\n v-if=\"showPagination\"\r\n ref=\"paginationRef\"\r\n class=\"pagination_page\"\r\n :style=\"{\r\n position: heightType === 'height' ? 'absolute' : 'static',\r\n bottom: '0px',\r\n left: '0px',\r\n zIndex: 5,\r\n background: '#fff'\r\n }\"\r\n >\r\n <el-pagination\r\n :background=\"paginationBackground\"\r\n :size=\"paginationIsSmall ? 'small' : paginationConfig.size\"\r\n :total=\"paginationConfig.total\"\r\n v-model:page-size=\"paginationConfig.pageSize\"\r\n :page-sizes=\"paginationPageSizes\"\r\n v-model:current-page=\"paginationConfig.current\"\r\n :layout=\"layout\"\r\n style=\"padding: 0; margin: 10px 0; text-align: center\"\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleIndexChange\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </el-config-provider>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport type { TableOptions } from '../../../types'\r\n\r\nconst defaultOptions: TableOptions = {\r\n multiSelect: false,\r\n expand: false,\r\n snIndex: false,\r\n loading: false,\r\n border: false,\r\n size: 'small',\r\n headerCellStyle: { background: '#f5f7fa' },\r\n highlightCurrentRow: true,\r\n cachePageSelection: true\r\n}\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, inject, getCurrentInstance, provide, toRaw, unref, h, onMounted, useAttrs } from 'vue'\r\nimport { ElTable, ElConfigProvider, ElPagination, vLoading, ElButton } from 'element-plus'\r\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\r\nimport ColumnItem from './column-item.vue'\r\nimport TableBtns from './table-btns.vue'\r\nimport VirtualEngine from './engines/virtual-engine.vue'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport { useTableResize } from '../../../composables/use-table-resize'\r\nimport { useTableSelection } from '../../../composables/use-table-selection'\r\nimport { isObject, findValueByKey } from '../../../utils/shared'\r\nimport type { TableColumn, PaginationConfig } from '../../../types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n initTabHeight?: number\r\n headBarClass?: string | Record<string, unknown>\r\n showHeaderBar?: boolean\r\n dataSource: Record<string, unknown>[]\r\n columns: TableColumn[]\r\n options?: TableOptions\r\n pagination?: PaginationConfig\r\n }>(),\r\n {\r\n initTabHeight: 400,\r\n showHeaderBar: true,\r\n dataSource: () => [],\r\n columns: () => [],\r\n options: () => ({ ...defaultOptions }),\r\n pagination: () => ({})\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:dataSource': [data: Record<string, unknown>[]]\r\n 'update:pagination': [pagination: PaginationConfig]\r\n 'pagination-current-change': [pagination: PaginationConfig]\r\n 'size-change': [pagination: PaginationConfig, size: number]\r\n 'change-table-sort': [column: Record<string, unknown>]\r\n}>()\r\n\r\nconst slots = defineSlots<{\r\n default?: () => any\r\n}>()\r\n\r\nconst locale = ref(zhCn)\r\nconst injectedLocale = inject('elLocale', null)\r\nif (injectedLocale) {\r\n locale.value = injectedLocale as any\r\n}\r\n\r\nconst instance = getCurrentInstance() as any\r\nconst $esPlusTable = inject<Record<string, unknown>>('$esPlusTable', null) ?? getGlobalConfig().EsTable ?? {}\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\n// 虚拟滚动引擎切换\r\nconst isVirtual = computed(() =>\r\n props.options.virtual === true || props.options.engine === 'virtual'\r\n)\r\nconst virtualEngineRef = ref<InstanceType<typeof VirtualEngine> | null>(null)\r\n\r\n// Refs\r\nconst tableRef = ref<any>(null)\r\nconst tbBtnRef = ref<any>(null)\r\nconst headBarRef = ref<HTMLElement | null>(null)\r\nconst paginationRef = ref<HTMLElement | null>(null)\r\nconst tableContainerRef = ref<HTMLElement | null>(null)\r\nconst tableId = ref(`table_${Math.random().toString(36).substring(2, 12)}`)\r\nconst tableData = ref<Record<string, unknown>[]>([])\r\nconst columnRowList = ref<TableColumn[]>([...props.columns])\r\n\r\nwatch(\r\n () => props.columns,\r\n (val) => {\r\n columnRowList.value = [...val]\r\n },\r\n { deep: true }\r\n)\r\nconst loadingStatus = ref(false)\r\nconst slotState = ref(false)\r\nconst showPagination = ref(false)\r\n\r\nconst setTableContainer = (el: HTMLElement | null) => {\r\n if (el) tableContainerRef.value = el\r\n}\r\n\r\n// 保留与 Form 的耦合\r\nconst bodyFormInstance = inject<(inst: unknown) => void>('bodyFormInstance', () => {})\r\nconst getVisibleShow = inject<(() => boolean) | boolean>('getVisibleShow', false)\r\n\r\nconst visibleShow = computed(() => (typeof getVisibleShow === 'function' ? getVisibleShow() : getVisibleShow))\r\n\r\nconst paginationConfig = ref<PaginationConfig>({\r\n pageSize: 10,\r\n current: 1,\r\n total: 0,\r\n pageSizes: [],\r\n size: 'small',\r\n isSmall: true,\r\n ...props.pagination\r\n})\r\n\r\nconst formInstance = ref<unknown>(null)\r\n\r\n// 计算属性\r\nconst getListEntry = computed(() => {\r\n if (props.options.entryQuery && isObject(props.options.entryQuery) && Object.keys(props.options.entryQuery).length) {\r\n return props.options.entryQuery\r\n }\r\n return {}\r\n})\r\n\r\nconst configTableField = computed(() => {\r\n if (\r\n props.options.configTableOut &&\r\n isObject(props.options.configTableOut) &&\r\n Object.keys(props.options.configTableOut).length &&\r\n checkQueryFields(props.options.configTableOut)\r\n ) {\r\n return props.options.configTableOut\r\n }\r\n\r\n if ($esPlusTable?.configQueryFieldOutput && typeof $esPlusTable.configQueryFieldOutput === 'function') {\r\n const configFields = ($esPlusTable.configQueryFieldOutput as Function)({\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n tableData: 'rows'\r\n })\r\n if (checkQueryFields(configFields)) return configFields\r\n }\r\n\r\n return {\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n tableData: 'rows'\r\n }\r\n})\r\n\r\nconst isFormInstance = computed(() => {\r\n const defaultSlots = instance?.slots?.default?.() || []\r\n const formVNode = defaultSlots.find((vnode: any) => {\r\n const type = vnode.type\r\n return type?.name === 'EsForm' || type?.displayName === 'EsForm'\r\n })\r\n if (formVNode && formVNode.props?.ref) {\r\n formInstance.value = formVNode.ctx?.refs[formVNode.props.ref]\r\n bodyFormInstance(formInstance.value)\r\n }\r\n return formVNode || {}\r\n})\r\n\r\nconst hasDefaultSlot = computed(() => !!slots.default?.())\r\nconst heightType = computed(() => (props.options.heightType || 'auto') as 'auto' | 'height' | 'maxHeight')\r\nconst tabHeight = computed(() => {\r\n if (typeof props.options.tabHeight === 'number') {\r\n return `${props.options.tabHeight}px`\r\n }\r\n if (heightType.value === 'height' && typeof props.options.height === 'number') {\r\n return `${props.options.height}px`\r\n }\r\n return '100%'\r\n})\r\n\r\nconst slotStyles = computed(() => {\r\n if (props.headBarClass) {\r\n return {\r\n type: typeof props.headBarClass === 'string' ? 'string' : 'object',\r\n value: props.headBarClass\r\n }\r\n }\r\n return { type: 'string', value: '' }\r\n})\r\n\r\nconst paginationLayoutConfig = computed(() => {\r\n const cfg = $esPlusTable?.paginationLayout\r\n if (!cfg) return null\r\n return typeof cfg === 'function' ? cfg() : cfg\r\n})\r\nconst layout = computed(() => paginationLayoutConfig.value?.layout || 'prev, pager, next, jumper, sizes, ->, total')\r\nconst paginationPageSizes = computed(() => paginationLayoutConfig.value?.pageSizes || paginationConfig.value.pageSizes)\r\nconst paginationIsSmall = computed(() => paginationLayoutConfig.value?.isSmall ?? paginationConfig.value.isSmall)\r\nconst paginationBackground = computed(() => paginationLayoutConfig.value?.background ?? true)\r\nconst loadStatus = computed(() => props.options.loading || loadingStatus.value)\r\nconst isRequestConf = computed(() => !!props.options.actionUrl || (props.options.apiParams && isObject(props.options.apiParams) && Object.keys(props.options.apiParams).length > 0))\r\nconst isHttpRequest = computed(() => !!props.options?.httpRequest && typeof props.options.httpRequest === 'function')\r\n\r\nconst filteredColumns = computed(() => {\r\n const list = columnRowList.value.filter((item) => !item.hidCol)\r\n list.forEach((el) => {\r\n if (el.prop !== 'operate' && el.key !== 'operate' && (el.prop || el.key) && !el.formatter) {\r\n el.formatter = (row: Record<string, unknown>) => {\r\n const value = row[el.prop as string] || row[el.key as string]\r\n if (value == null || value === '') {\r\n return (el.emptyPlaceholder as string) || '-'\r\n }\r\n return value as string\r\n }\r\n }\r\n\r\n if ((el.prop === 'operate' || el.key === 'operate') && el.btns && !el.render) {\r\n el.render = (_h: any, { row }: { row: Record<string, unknown> }) => {\r\n return h('div', [\r\n el.btns?.filter((btn: any) => checkPermission(btn.permissionValue))\r\n .map((btn: any) =>\r\n h(ElButton, {\r\n onClick: () => btn.clickEvent?.(row),\r\n text: true,\r\n type: btn.type || 'primary'\r\n }, () => btn.name)\r\n )\r\n ])\r\n }\r\n }\r\n })\r\n\r\n // 当所有列都设置了固定 width 且没有 minWidth 时,将最后一个非固定列的 width 转为 minWidth 以填充剩余空间\r\n const allFixedWidth = list.length > 0 && list.every((col) => col.width && !col.minWidth)\r\n if (allFixedWidth) {\r\n let flexIdx = -1\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n const col = list[i]\r\n if (!col.fixed && col.prop !== 'operate' && col.key !== 'operate') {\r\n flexIdx = i\r\n break\r\n }\r\n }\r\n if (flexIdx === -1) flexIdx = list.length - 1\r\n if (flexIdx >= 0) {\r\n const col = list[flexIdx]\r\n col.minWidth = col.width\r\n delete col.width\r\n }\r\n }\r\n\r\n return list\r\n})\r\n\r\n// es-table 内部选项键,不应传递给 el-table\r\nconst TABLE_INTERNAL_KEYS = new Set([\r\n 'multiSelect', 'expand', 'snIndex', 'loading', 'cachePageSelection',\r\n 'httpRequest', 'configTableOut', 'listenToCallBack',\r\n 'apiParams', 'actionUrl', 'heightType', 'tabHeight',\r\n 'isInitRun', 'entryQuery', 'configBtn', 'leftText', 'rowkey',\r\n 'virtual', 'engine', 'rowHeight', 'estimatedRowHeight', 'overscanCount', 'rowClassName'\r\n])\r\n\r\nconst tableAttrs = computed(() => {\r\n const merged = columnBindAttr({ ...defaultOptions, ...props.options })\r\n const { align, ...rest } = merged\r\n const result: Record<string, unknown> = {}\r\n for (const key in rest) {\r\n if (!TABLE_INTERNAL_KEYS.has(key)) {\r\n result[key] = rest[key]\r\n }\r\n }\r\n return result\r\n})\r\n\r\n// 合并 options attrs 和父级 fallthrough attrs,供 el-table 使用\r\nconst fallthroughAttrs = useAttrs()\r\nconst tableBindAttrs = computed(() => {\r\n const result: Record<string, unknown> = { ...tableAttrs.value, ...fallthroughAttrs }\r\n if (props.options.rowkey) {\r\n result.rowKey = props.options.rowkey\r\n }\r\n if (heightType.value === 'height') {\r\n result.height = tableHeight.value\r\n } else if (heightType.value === 'maxHeight') {\r\n result.maxHeight = tableHeight.value\r\n }\r\n return result\r\n})\r\n\r\n// 使用原生 ResizeObserver\r\nconst { tableHeight, resizeObservers } = useTableResize(\r\n tableContainerRef,\r\n headBarRef,\r\n tbBtnRef,\r\n paginationRef,\r\n { heightType: heightType.value as 'auto' | 'height', tabHeight: props.options.tabHeight }\r\n)\r\n\r\nwatch(\r\n visibleShow,\r\n async (val, oldVal) => {\r\n if (val && val !== oldVal) {\r\n if (props.options.actionUrl) {\r\n await httpRequestInstance()\r\n }\r\n tableRef.value?.doLayout?.()\r\n }\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.pagination,\r\n (val) => {\r\n paginationConfig.value = { ...paginationConfig.value, ...val }\r\n showPagination.value = val.total !== undefined\r\n },\r\n { deep: true, immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.dataSource,\r\n (val) => {\r\n initSelection(val, tableRef.value)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n tableData,\r\n (val) => {\r\n if (Array.isArray(val)) {\r\n emit('update:dataSource', val)\r\n }\r\n },\r\n { deep: true }\r\n)\r\n\r\n// 配置化接口请求时,挂载自动加载数据\r\nonMounted(() => {\r\n if (isRequestConf.value && props.options.isInitRun !== false) {\r\n httpRequestInstance()\r\n }\r\n})\r\n\r\n// 表格选择逻辑\r\nconst { multipleSelection, handleSelectionChange, initSelection, clearAllSelection } = useTableSelection(props.options.rowkey)\r\n\r\nconst handleTableSelectionChange = (val: Record<string, unknown>[]) => {\r\n handleSelectionChange(val, paginationConfig.value.current || 1)\r\n}\r\n\r\nconst handleVirtualSelectionChange = (rows: Record<string, unknown>[]) => {\r\n handleSelectionChange(rows, paginationConfig.value.current || 1)\r\n}\r\n\r\n// 请求逻辑\r\nconst checkQueryFields = (obj: Record<string, unknown>): boolean => {\r\n const checkListKey = ['total', 'pageSize', 'current', 'tableData']\r\n if (isObject(obj)) {\r\n return Object.keys(obj).every((it) => {\r\n return checkListKey.find((its) => its === it) && obj[it] && typeof obj[it] === 'string'\r\n })\r\n }\r\n return false\r\n}\r\n\r\nconst getListenToCallBack = (eventName: string, params: unknown) => {\r\n const eventNameList = [\r\n { eventName: 'brcb', isReturn: true },\r\n { eventName: 'qrcb', isReturn: true }\r\n ]\r\n const hasEventNameIndex = eventNameList.findIndex((it) => it.eventName === eventName)\r\n if (props.options.listenToCallBack && props.options.listenToCallBack[eventName] && hasEventNameIndex !== -1) {\r\n const callObj = eventNameList[hasEventNameIndex]\r\n if (callObj.isReturn) {\r\n return props.options.listenToCallBack[eventName](params)\r\n }\r\n }\r\n}\r\n\r\nconst formatConfigOut = (row: Record<string, unknown>, keyList: string[]) => {\r\n if (isObject(configTableField.value) && Object.keys(configTableField.value).length) {\r\n Object.entries(configTableField.value).forEach(([key, value]) => {\r\n const isKeyUsed = keyList.includes(key)\r\n if (!isKeyUsed) return\r\n\r\n const rowData = row[value as string] ?? findValueByKey(row, value as string)\r\n if (key === 'tableData') {\r\n tableData.value = Array.isArray(rowData) ? rowData : []\r\n } else {\r\n ;(paginationConfig.value as any)[key] = typeof rowData === 'number' ? rowData : parseInt(rowData as string, 10) || 0\r\n }\r\n })\r\n }\r\n}\r\n\r\nconst queryTableListMethod = (params: Record<string, unknown>, options: { success?: (res: Record<string, unknown>) => void; fail?: (err: unknown) => void } = {}) => {\r\n const { success, fail } = options\r\n const apiParams = (props.options?.apiParams || {}) as Record<string, any>\r\n const url = props.options?.actionUrl || apiParams.url || ''\r\n\r\n if (!url || !Object.keys(apiParams).length) return\r\n\r\n const formData = Object.keys(isFormInstance.value).length\r\n ? toRaw(unref((isFormInstance.value as any).props.model))\r\n : getListEntry.value || {}\r\n\r\n\r\n const fnParams = getListenToCallBack('brcb', { ...formData, ...params, ...toRaw(unref(apiParams.model || {})) })\r\n const finalParams = isObject(fnParams) ? fnParams : { ...formData, ...toRaw(unref(apiParams.model || {})), ...params }\r\n const requestOption = { ...toRaw(unref(apiParams.options || {})) }\r\n if (apiParams?.method) {\r\n requestOption.method = apiParams?.method\r\n }\r\n\r\n const requestHandler = async (requestFn: Function) => {\r\n if (loadingStatus.value) return\r\n loadingStatus.value = true\r\n console.log('formData///', finalParams)\r\n try {\r\n const res = await requestFn({\r\n url,\r\n formParams: finalParams,\r\n headers: apiParams.headers || {},\r\n ...requestOption,\r\n ...params\r\n })\r\n const responseData = getListenToCallBack('qrcb', res) || res\r\n if (isObject(res) && Object.keys(res).length && typeof success === 'function') {\r\n success(responseData as Record<string, unknown>)\r\n }\r\n } catch (e) {\r\n if (typeof fail === 'function') {\r\n fail(e)\r\n }\r\n } finally {\r\n loadingStatus.value = false\r\n }\r\n }\r\n\r\n if (props.options.httpRequest) {\r\n requestHandler(props.options.httpRequest)\r\n } else if ($esPlusTable.$httpRequest) {\r\n requestHandler($esPlusTable.$httpRequest as Function)\r\n }\r\n}\r\n\r\nconst httpRequestInstance = (model?: Record<string, unknown>) => {\r\n return new Promise((resolve, reject) => {\r\n paginationConfig.value.current = 1\r\n queryTableListMethod(\r\n { ...(model || {}), pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n if (Object.keys(props.pagination).length) {\r\n emit('update:pagination', paginationConfig.value)\r\n }\r\n resolve(res)\r\n },\r\n fail: (err) => {\r\n reject(err)\r\n }\r\n }\r\n )\r\n })\r\n}\r\n\r\nconst changePageIndexRequest = () => {\r\n queryTableListMethod(\r\n { pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n emit('update:pagination', paginationConfig.value)\r\n emit('pagination-current-change', paginationConfig.value)\r\n }\r\n }\r\n )\r\n}\r\n\r\nconst changePageSizeRequest = () => {\r\n queryTableListMethod(\r\n { pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n emit('update:pagination', paginationConfig.value)\r\n }\r\n }\r\n )\r\n}\r\n\r\nconst handleSizeChange = (size: number) => {\r\n paginationConfig.value.pageSize = size\r\n paginationConfig.value.current = 1\r\n if (isRequestConf.value) {\r\n changePageSizeRequest()\r\n } else {\r\n emit('update:pagination', paginationConfig.value)\r\n emit('size-change', paginationConfig.value, size)\r\n }\r\n}\r\n\r\nconst handleIndexChange = (val: number) => {\r\n paginationConfig.value.current = val\r\n if (isRequestConf.value) {\r\n console.log('indexPages//', val)\r\n changePageIndexRequest()\r\n } else {\r\n emit('update:pagination', paginationConfig.value)\r\n emit('pagination-current-change', paginationConfig.value)\r\n }\r\n}\r\n\r\nconst changeTableSort = (column: Record<string, unknown>) => {\r\n emit('change-table-sort', column)\r\n}\r\n\r\nconst firstWordUpperCase = (str: string): string => {\r\n return str.toLowerCase().replace(/(\\s|^)[a-z]/g, (char) => char.toUpperCase())\r\n}\r\n\r\nconst columnBindAttr = (cols: Record<string, unknown>) => {\r\n const options: Record<string, unknown> = {}\r\n for (const t in cols) {\r\n if (t === 'groups' || t === 'scopedSlots' || t === 'render') continue\r\n\r\n if (t.includes('-')) {\r\n const parts = t.split('-')\r\n let newkey = parts[0]\r\n for (let j = 1; j < parts.length; j++) {\r\n newkey += firstWordUpperCase(parts[j])\r\n }\r\n options[newkey] = cols[t]\r\n } else if (t === 'key') {\r\n options.prop = cols[t]\r\n options[t] = cols[t]\r\n } else {\r\n options[t] = cols[t]\r\n }\r\n }\r\n\r\n if (!options.align) {\r\n options.align = 'center'\r\n }\r\n\r\n return options\r\n}\r\n\r\n// 提供表格实例给子组件(保留与 Form 的耦合)\r\nprovide('getTableInstantce', () => ({\r\n ...(instance?.setupState || {}),\r\n tableRef: isVirtual.value ? virtualEngineRef : tableRef,\r\n toggleSelection: (rows: Record<string, unknown>[]) => {\r\n if (isVirtual.value) {\r\n if (rows) {\r\n rows.forEach((row) => {\r\n virtualEngineRef.value?.toggleRowSelection(row, true)\r\n })\r\n } else {\r\n virtualEngineRef.value?.clearSelection()\r\n }\r\n } else {\r\n if (rows) {\r\n rows.forEach((row) => {\r\n tableRef.value?.toggleRowSelection(row)\r\n })\r\n } else {\r\n tableRef.value?.clearSelection()\r\n }\r\n }\r\n },\r\n clearAllSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : clearAllSelection(tableRef.value),\r\n refsInstance: () => isVirtual.value ? virtualEngineRef.value?.getTableRef() : tableRef.value,\r\n httpRequestInstance\r\n}))\r\n\r\n// 暴露方法\r\ndefineExpose({\r\n httpRequestInstance,\r\n getSelectionRows: () => isVirtual.value\r\n ? virtualEngineRef.value?.getSelectedRows() ?? []\r\n : multipleSelection.value,\r\n clearSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : tableRef.value?.clearSelection?.(),\r\n clearAllSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : clearAllSelection(tableRef.value),\r\n refresh: () => isVirtual.value\r\n ? virtualEngineRef.value?.doLayout()\r\n : tableRef.value?.doLayout?.(),\r\n scrollToRow: (row: number) => virtualEngineRef.value?.scrollToRow(row),\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.el-dp_tables {\r\n height: auto;\r\n :deep(.el-table__body-wrapper) {\r\n height: auto;\r\n }\r\n}\r\n\r\n.table_component {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n overflow: hidden;\r\n}\r\n\r\n.table_containers {\r\n flex: 1;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n position: relative;\r\n}\r\n\r\n.pagination_page {\r\n width: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.btn-slot {\r\n width: 100%;\r\n\r\n .headerBar {\r\n box-sizing: border-box;\r\n background-color: #fff;\r\n border-radius: 6px;\r\n\r\n :deep(.el-form-item--small .el-form-item__label) {\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\n.tableContainer {\r\n border-radius: 0px;\r\n transition: all 1.5s;\r\n flex: 1;\r\n width: 100%;\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n\r\n .table_inner_containers {\r\n width: 100%;\r\n }\r\n\r\n :deep(.el-table__empty-block) {\r\n width: 100% !important;\r\n margin: 32px 0;\r\n font-size: 14px;\r\n line-height: 1.5715;\r\n\r\n .el-table__empty-text {\r\n width: auto !important;\r\n }\r\n\r\n .ant-empty-image {\r\n height: 40px;\r\n margin-bottom: 8px;\r\n\r\n .ant-empty-img-simple-ellipse {\r\n fill: #f5f5f5;\r\n }\r\n\r\n .ant-empty-img-simple-g {\r\n stroke: #d9d9d9;\r\n }\r\n\r\n .ant-empty-img-simple-path {\r\n fill: #fafafa;\r\n }\r\n }\r\n\r\n .ant-empty-description {\r\n line-height: 1.5715;\r\n color: rgba(0, 0, 0, 0.25);\r\n }\r\n }\r\n\r\n :deep(.el-tag) {\r\n height: 20px;\r\n padding: 0 7px;\r\n line-height: 20px;\r\n background: #fafafa;\r\n border: none;\r\n border-radius: 4px;\r\n\r\n &.el-tag--info {\r\n color: rgba(0, 0, 0, 0.85);\r\n }\r\n\r\n &.el-tag--success {\r\n color: #52c41a;\r\n background: #f6ffed;\r\n border-color: #b7eb8f;\r\n }\r\n }\r\n}\r\n</style>\r\n","import EsTable from './src/component.vue'\n\nEsTable.install = function (app: any) {\n app.component(EsTable.name, EsTable)\n}\nEsTable.isPlugin = true\nEsTable.Plugin = {\n install(app: any, options: any = {}) {\n app.provide('$esPlusTable', {\n ...(options.methods || {})\n })\n app.component(EsTable.name, { ...EsTable, methods: { ...EsTable.methods, ...(options.methods || {}) } })\n }\n}\nexport default EsTable\n","import { h } from 'vue'\r\nimport {\r\n ElInput,\r\n ElSelect,\r\n ElOption,\r\n ElDatePicker,\r\n ElTimePicker,\r\n ElSlider,\r\n ElColorPicker,\r\n ElTransfer,\r\n ElCascader,\r\n ElRadioGroup,\r\n ElRadio,\r\n ElCheckboxGroup,\r\n ElCheckbox,\r\n ElSwitch,\r\n ElRate,\r\n ElUpload\r\n} from 'element-plus'\r\nimport type { FormItemOption } from '../types'\r\n\r\n// 支持嵌套属性路径的取值和赋值\r\nexport const getNestedValue = (obj: Record<string, unknown>, path: string): unknown => {\r\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\r\n let result = obj\r\n for (const key of keys) {\r\n if (result == null) return undefined\r\n result = result[key] as Record<string, unknown>\r\n }\r\n return result\r\n}\r\n\r\nexport const setNestedValue = (obj: Record<string, unknown>, path: string, value: unknown): void => {\r\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\r\n const lastKey = keys.pop()\r\n let current: Record<string, unknown> = obj\r\n for (const key of keys) {\r\n if (current[key] == null) {\r\n current[key] = {}\r\n }\r\n current = current[key] as Record<string, unknown>\r\n }\r\n if (lastKey) {\r\n current[lastKey] = value\r\n }\r\n}\r\n\r\nexport function useFormInputs() {\r\n const formInputComponents = (item: FormItemOption) => {\r\n const formPutList = new Map([\r\n [\r\n 'Input',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElInput, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Select',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElSelect,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElOption, { key: idx, value: opt.value, label: opt.label })\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'datePicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElDatePicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'timePicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElTimePicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Slider',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElSlider, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'ColorPicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElColorPicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Transfer',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElTransfer, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Cascader',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElCascader, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n options: row.dataOptions,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Radio',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElRadioGroup,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElRadio, { key: idx, value: opt.value as any }, () => opt.label)\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'Checkbox',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElCheckboxGroup,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElCheckbox, { key: idx, value: opt.value as any }, () => opt.label)\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'Switch',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElSwitch, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Rate',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElRate, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Upload',\r\n (hFn: typeof h, _model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n const { props: uploadProps, httpRequest, triggerRender, fileRender, ...restRow } = row as FormItemOption & {\r\n props?: Record<string, unknown>\r\n httpRequest?: (options: Record<string, unknown>) => Promise<unknown>\r\n triggerRender?: (h: typeof hFn) => ReturnType<typeof hFn>\r\n fileRender?: (h: typeof hFn, file: Record<string, unknown>, onRemove: () => void) => ReturnType<typeof hFn>\r\n }\r\n\r\n let uploadInstance: { handleRemove: (file: Record<string, unknown>) => void } | null = null\r\n\r\n // 构建 ElUpload 属性\r\n const elUploadProps: Record<string, unknown> = {\r\n ...uploadProps, // props 中的配置:action, accept, listType, limit, multiple 等\r\n ...restRow.attrs, // attrs 中的配置(兼容两种方式)\r\n ref: (el: { handleRemove: (file: Record<string, unknown>) => void } | null) => {\r\n uploadInstance = el\r\n }\r\n }\r\n\r\n // 将 on 中的事件转换为 Vue 3 h() 需要的 onXxx 格式\r\n if (restRow.on) {\r\n for (const [key, handler] of Object.entries(restRow.on)) {\r\n elUploadProps[`on${key.charAt(0).toUpperCase()}${key.slice(1)}`] = handler\r\n }\r\n }\r\n\r\n // 合并 httpRequest(优先用表单项配置的,其次用 props 中的)\r\n if (httpRequest) {\r\n elUploadProps['http-request'] = httpRequest\r\n }\r\n\r\n // Vue 3 h() 的 slots 参数:通过第三个参数传递命名插槽\r\n const slots: Record<string, (...args: unknown[]) => ReturnType<typeof hFn>> = {}\r\n\r\n // #trigger / #default 插槽\r\n if (triggerRender) {\r\n const listType = elUploadProps['listType'] || elUploadProps['list-type']\r\n if (listType === 'picture-card') {\r\n slots.trigger = () => triggerRender(hFn)\r\n } else {\r\n slots.default = () => triggerRender(hFn)\r\n }\r\n }\r\n\r\n // #file 插槽:自定义文件列表项渲染\r\n if (fileRender) {\r\n slots.file = ({ file }: { file: Record<string, unknown> }) => {\r\n return fileRender(hFn, file, () => {\r\n uploadInstance?.handleRemove(file)\r\n })\r\n }\r\n }\r\n\r\n return hFn(ElUpload, elUploadProps, slots)\r\n }\r\n ]\r\n ])\r\n return formPutList.get(item.formtype) || (() => null)\r\n }\r\n\r\n return { formInputComponents }\r\n}\r\n","import { computed, ref, watch } from 'vue'\r\nimport type { FormItemOption, LayoutFormProps } from '../types'\r\n\r\nexport function useFormLayout(props: { layoutFormProps?: LayoutFormProps; formItemList: FormItemOption[] }) {\r\n const folded = ref(false)\r\n\r\n const isBtnHidden = computed(() => props.layoutFormProps?.fromLayProps?.isBtnHidden ?? false)\r\n\r\n const rowLayout = computed(() => props.layoutFormProps?.rowLayProps || { gutter: 20 })\r\n\r\n const formLayout = computed(() => props.layoutFormProps?.fromLayProps || {})\r\n\r\n const getSetOptionsStatus = computed(() => props.layoutFormProps?.setOptions)\r\n\r\n const getRowColsAlgorithm = computed(() => {\r\n let pre = 0\r\n const groupArrayList: FormItemOption[][] = []\r\n const columnRows: { statIndex: number; endIndex: number }[] = []\r\n const formItems = props.formItemList\r\n\r\n for (let i = 0; i < formItems.length; i++) {\r\n const item = formItems[i]\r\n pre += item.span || 24\r\n if (pre > 24) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i })\r\n pre = item.span || 24\r\n if (i === formItems.length - 1) {\r\n columnRows.push({ statIndex: i, endIndex: i + 1 })\r\n }\r\n } else {\r\n if (i === formItems.length - 1) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i + 1 })\r\n } else if (pre === 24) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i + 1 })\r\n pre = 0\r\n }\r\n }\r\n }\r\n\r\n columnRows.forEach((it) => {\r\n groupArrayList.push(formItems.slice(it.statIndex, it.endIndex))\r\n })\r\n\r\n const columRowIndexs = groupArrayList.map((it) => {\r\n return it.map(() => 0)\r\n })\r\n\r\n let rowColIndex = -1\r\n columRowIndexs.forEach((row) => {\r\n row.forEach((_, idx) => {\r\n row[idx] = (rowColIndex += 1)\r\n })\r\n })\r\n\r\n return {\r\n columnRow: columRowIndexs,\r\n rowNum: columRowIndexs.length,\r\n columnNodeIndex: columRowIndexs.map((it) => it[it.length - 1])\r\n }\r\n })\r\n\r\n const isFold = computed(() => {\r\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\r\n return minFoldRow > 0 && minFoldRow < getRowColsAlgorithm.value.rowNum\r\n })\r\n\r\n const getBtnColSpan = computed(() => {\r\n const { rowNum, columnRow } = getRowColsAlgorithm.value\r\n const lastColumn = columnRow[rowNum - 1] || []\r\n const btnColSpan = props.layoutFormProps?.fromLayProps?.btnColSpan || 0\r\n const totalSpan = lastColumn.reduce((sum, idx) => sum + (props.formItemList[idx]?.span || 24), 0)\r\n const hasSpan = 24 - totalSpan\r\n\r\n return !folded.value && btnColSpan <= hasSpan ? hasSpan : 24\r\n })\r\n\r\n const formItem = computed(() => {\r\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\r\n const { columnNodeIndex } = getRowColsAlgorithm.value\r\n\r\n if (folded.value) {\r\n const lastFoldIndex = columnNodeIndex[minFoldRow - 1] ?? columnNodeIndex[columnNodeIndex.length - 1] ?? 9999\r\n return props.formItemList.map((it, index) => ({\r\n ...it,\r\n isFold: index > lastFoldIndex\r\n }))\r\n }\r\n return props.formItemList.map((it) => ({ ...it, isFold: false }))\r\n })\r\n\r\n watch(\r\n isFold,\r\n (val) => {\r\n folded.value = val\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const changeFolded = () => {\r\n folded.value = !folded.value\r\n }\r\n\r\n return {\r\n folded,\r\n isBtnHidden,\r\n rowLayout,\r\n formLayout,\r\n getSetOptionsStatus,\r\n getRowColsAlgorithm,\r\n isFold,\r\n getBtnColSpan,\r\n formItem,\r\n changeFolded\r\n }\r\n}\r\n","import { nextTick, toRaw, unref } from 'vue'\r\nimport { isObject, findValueByKey, wrapPromise } from '../utils/shared'\r\nimport type { FormItemOption, ApiParams } from '../types'\r\n\r\nexport interface RequestConfig {\r\n httpRequest?: (params: Record<string, unknown>) => Promise<unknown>\r\n apiParams?: ApiParams\r\n success?: (res: Record<string, unknown>) => void\r\n fail?: (err: unknown) => void\r\n [key: string]: unknown\r\n}\r\n\r\nexport function useFormRequest(httpRequestGlobal?: (params: Record<string, unknown>) => Promise<unknown>) {\r\n const queryTableListMethod = (params: Record<string, unknown>, options: RequestConfig = {}, option?: FormItemOption) => {\r\n const { success, fail, ..._params } = options || {}\r\n if (isObject(options.apiParams) && Object.keys(options.apiParams).length && options.apiParams.url) {\r\n const initFormParams = { ...params, ...toRaw(unref(options.apiParams.model || {})) }\r\n const requestOption = { ...toRaw(unref(options.apiParams.options || {})) }\r\n if (options.apiParams.method) {\r\n requestOption.method = options.apiParams.method\r\n }\r\n\r\n const requestPayload = {\r\n url: options.apiParams.url,\r\n headers: { ...(options.apiParams.headers || {}) },\r\n formParams: initFormParams,\r\n ...requestOption\r\n }\r\n\r\n const requestFn = options.httpRequest || httpRequestGlobal\r\n if (!requestFn) return\r\n\r\n requestFn(requestPayload)\r\n .then((res) => {\r\n // 支持对象和数组两种响应格式(兼容直接返回数组的接口)\r\n if (typeof success === 'function' && res && (isObject(res) || Array.isArray(res))) {\r\n success(res as Record<string, unknown>)\r\n }\r\n })\r\n .catch((e) => {\r\n if (typeof fail === 'function') {\r\n fail(e)\r\n }\r\n })\r\n }\r\n }\r\n\r\n const checkQueryFields = (obj: Record<string, unknown>): boolean => {\r\n const checkListKey = ['total', 'pageSize', 'current', 'listData']\r\n if (isObject(obj)) {\r\n return Object.keys(obj).every((it) => {\r\n return checkListKey.find((its) => its === it) && obj[it] && typeof obj[it] === 'string'\r\n })\r\n }\r\n return false\r\n }\r\n\r\n const configFormField = (options: Record<string, unknown> = {}, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n if (isObject(options.configFormOut) && Object.keys(options.configFormOut).length && checkQueryFields(options.configFormOut as Record<string, unknown>)) {\r\n return options.configFormOut as Record<string, string>\r\n }\r\n\r\n if (typeof fieldFieldOutput === 'function') {\r\n const configFields = fieldFieldOutput({\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n listData: 'rows'\r\n })\r\n if (checkQueryFields(configFields)) {\r\n return configFields\r\n }\r\n }\r\n\r\n return {\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n listData: 'rows'\r\n }\r\n }\r\n\r\n const formatConfigOut = (row: Record<string, unknown>, keyList: string[], options: Record<string, unknown> = {}, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n const configFieldOut = configFormField(options, fieldFieldOutput)\r\n const configDataOption: Record<string, unknown> = {}\r\n\r\n // 如果 API 响应本身就是数组,直接作为 listData 使用(兼容直接返回数组的接口)\r\n if (keyList.includes('listData') && Array.isArray(row)) {\r\n configDataOption['listData'] = row\r\n return configDataOption\r\n }\r\n\r\n if (isObject(configFieldOut) && Object.keys(configFieldOut).length) {\r\n for (const [key, value] of Object.entries(configFieldOut)) {\r\n const isKeyUsed = keyList.findIndex((it) => it === key)\r\n if (isKeyUsed === -1) continue\r\n\r\n const rowValue = row[value as string]\r\n if (rowValue !== undefined && rowValue !== null) {\r\n if (key === 'listData') {\r\n configDataOption[key] = Array.isArray(rowValue) ? rowValue : []\r\n } else {\r\n configDataOption[key] = typeof rowValue === 'number' ? rowValue : parseInt(rowValue as string, 10) || 0\r\n }\r\n } else {\r\n const resultData = findValueByKey(row, value as string)\r\n if (key === 'listData') {\r\n configDataOption[key] = Array.isArray(resultData) ? resultData : []\r\n } else {\r\n configDataOption[key] = typeof resultData === 'number' ? resultData : parseInt(resultData as string, 10) || 0\r\n }\r\n }\r\n }\r\n }\r\n return configDataOption\r\n }\r\n\r\n const httpRequestFormInstance = (model: Record<string, unknown>, options: RequestConfig, rows: FormItemOption, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n return new Promise<{ data: Record<string, unknown>; configRows: Record<string, unknown> }>((resolve, reject) => {\r\n nextTick(() => {\r\n queryTableListMethod(\r\n { pageIndex: 1, pageSize: 1000, ...(model || {}) },\r\n {\r\n ...(options || {}),\r\n success: (res) => {\r\n const configRows = formatConfigOut(res, ['total', 'listData'], rows as unknown as Record<string, unknown>, fieldFieldOutput)\r\n resolve({ data: res, configRows })\r\n },\r\n fail: (err) => {\r\n reject(err)\r\n }\r\n },\r\n rows\r\n )\r\n })\r\n })\r\n }\r\n\r\n const getEveryFormQueryField = async (rowsList: FormItemOption[], fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n try {\r\n if (!Array.isArray(rowsList)) return []\r\n const apiUrlList = rowsList.filter((it) => it && it.apiParams && isObject(it.apiParams) && it.apiParams.url)\r\n const apiResult: { prop: string; listData: unknown[] }[] = []\r\n\r\n const wrappedPromises = apiUrlList.map((option) => {\r\n const { httpRequest } = option\r\n const promiseThen = httpRequestFormInstance(\r\n { ...(option.apiParams?.model || {}) },\r\n { httpRequest, apiParams: option.apiParams, ...(option.apiParams?.options || {}) },\r\n option,\r\n fieldFieldOutput\r\n )\r\n return wrapPromise(promiseThen)\r\n })\r\n\r\n const results = await Promise.all(wrappedPromises)\r\n\r\n results.forEach((item, index) => {\r\n if (item.status === 'fulfilled') {\r\n const { configRows, data } = item.value\r\n const option = apiUrlList[index]\r\n const listenToCallBack = option?.listenToCallBack as Record<string, (params: unknown) => unknown> | undefined\r\n\r\n /**\r\n * 优先使用 listenToCallBack.crtn 格式化数据\r\n * crtn 接收 API 原始响应 data,返回 [{ label, value }] 格式的选项数据\r\n * data 是 httpRequest 返回的 { data: any } 中的 data 字段\r\n */\r\n let listData: unknown[] = []\r\n if (listenToCallBack?.crtn) {\r\n listData = listenToCallBack.crtn(data) as unknown[]\r\n }\r\n\r\n // 如果 crtn 未配置或返回空,则降级使用 callOptionListFormat 或格式化后的数据\r\n const newListOptions =\r\n Array.isArray(listData) && listData.length > 0\r\n ? listData\r\n : typeof option?.callOptionListFormat === 'function'\r\n ? option.callOptionListFormat(configRows?.listData as unknown[] || option?.dataOptions || [])\r\n : undefined\r\n\r\n apiResult.push({\r\n prop: apiUrlList[index].prop,\r\n listData: Array.isArray(newListOptions) ? newListOptions : (configRows?.listData as unknown[] || apiUrlList[index]?.dataOptions || [])\r\n })\r\n }\r\n })\r\n return apiResult\r\n } catch (e) {\r\n return []\r\n }\r\n }\r\n\r\n return {\r\n queryTableListMethod,\r\n getEveryFormQueryField,\r\n formatConfigOut,\r\n configFormField\r\n }\r\n}\r\n","import { createVNode, getCurrentInstance, render } from 'vue'\r\nimport EsDialog from './component.vue'\r\nimport type { DialogOptions } from '../../../types'\r\n\r\nexport interface DialogCallable {\r\n (dialogOptions: DialogOptions): any\r\n close: () => void\r\n}\r\n\r\nexport interface DialogCallableWithDestroy extends DialogCallable {\r\n destroy: () => void\r\n}\r\n\r\nconst getAppendToElement = (appendTo?: string | HTMLElement) => {\r\n if (typeof appendTo === 'string') {\r\n return document.querySelector(appendTo) || document.body\r\n }\r\n return appendTo instanceof HTMLElement ? appendTo : document.body\r\n}\r\n\r\nconst initInstance = (Component: any, props: DialogOptions, container: HTMLElement, appContext: any) => {\r\n const vNode = createVNode(Component, props)\r\n\r\n if (appContext) {\r\n vNode.appContext = appContext\r\n\r\n if (!vNode.appContext.provides) {\r\n vNode.appContext.provides = {}\r\n }\r\n\r\n // 注入语言环境(如果父应用有提供)\r\n const injectedLocale = appContext.provides?.elLocale\r\n if (injectedLocale) {\r\n vNode.appContext.provides['elLocale'] = injectedLocale\r\n }\r\n\r\n if (!vNode.appContext.config) {\r\n vNode.appContext.config = {} as any\r\n }\r\n if (!vNode.appContext.config.globalProperties) {\r\n vNode.appContext.config.globalProperties = {}\r\n }\r\n }\r\n\r\n render(vNode, container)\r\n\r\n const target = getAppendToElement(props.appendTo)\r\n target.appendChild(container)\r\n return vNode\r\n}\r\n\r\nexport function useDialog(Component?: any, opt?: { onlyInstance?: false }): DialogCallableWithDestroy\r\nexport function useDialog(Component?: any, opt?: { onlyInstance: true }): DialogCallable\r\nexport function useDialog(Component?: any, opt: { onlyInstance?: boolean } = {}) {\r\n Component = Component || EsDialog\r\n const options = Object.assign({ onlyInstance: false }, opt)\r\n\r\n if (options.onlyInstance) {\r\n const instance = getCurrentInstance()\r\n const appContext = instance?.appContext || null\r\n const container = document.createElement('div')\r\n\r\n const close = () => {\r\n render(null, container)\r\n container.remove()\r\n }\r\n\r\n const DialogComponent = (dialogOptions: DialogOptions) => {\r\n if (dialogOptions.visible === undefined) {\r\n dialogOptions.visible = true\r\n }\r\n\r\n const originalOnClosed = dialogOptions.onClosed\r\n const originalOnSubmit = dialogOptions.onSubmit\r\n\r\n dialogOptions.onClosed = (...args: any[]) => {\r\n ;(originalOnClosed as Function)?.(...args)\r\n close()\r\n }\r\n\r\n dialogOptions.onSubmit = (closeFn = close) => {\r\n originalOnSubmit?.(closeFn)\r\n }\r\n\r\n return initInstance(Component, dialogOptions, container, appContext)\r\n }\r\n\r\n DialogComponent.close = close\r\n return DialogComponent\r\n } else {\r\n const container = document.createElement('div')\r\n container.className = 'dialog-containers'\r\n const instance = getCurrentInstance()\r\n const appContext = instance?.appContext || null\r\n let vNode: any = null\r\n\r\n const close = () => {\r\n if (vNode && vNode.component) {\r\n vNode.component.props.visible = false\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n if (vNode) {\r\n render(null, container)\r\n container.remove()\r\n vNode = null\r\n }\r\n }\r\n\r\n const DialogComponent = (dialogOptions: DialogOptions) => {\r\n if (vNode && vNode.component) {\r\n Object.assign(vNode.component.props, dialogOptions)\r\n vNode.component.props.visible = true\r\n return vNode\r\n }\r\n\r\n const mergedOptions: DialogOptions = {\r\n visible: true,\r\n width: '50%',\r\n destroyOnClose: true,\r\n ...dialogOptions\r\n }\r\n\r\n const { onClosed: originalOnClosed, onSubmit: originalOnSubmit } = mergedOptions\r\n\r\n mergedOptions.onClosed = () => {\r\n originalOnClosed?.()\r\n close()\r\n }\r\n\r\n mergedOptions.onSubmit = (closeFn = close) => {\r\n originalOnSubmit?.(closeFn)\r\n }\r\n\r\n vNode = initInstance(Component, mergedOptions, container, appContext)\r\n return vNode\r\n }\r\n\r\n DialogComponent.close = close\r\n DialogComponent.destroy = destroy\r\n return DialogComponent\r\n }\r\n}\r\n\r\nexport default useDialog\r\n","<template>\r\n <el-form :ref=\"setFormRef\" v-bind=\"formProps\" class=\"es-form\">\r\n <div class=\"flex-center\">\r\n <el-row v-bind=\"rowLayout\">\r\n <template v-for=\"(item, index) in formItem\" :key=\"item.prop\">\r\n <el-col v-show=\"!item?.isFold\" :span=\"item.span\">\r\n <el-form-item\r\n :label=\"translateLabel(item)\"\r\n v-bind=\"initFormItemOptions((item as any).formItemOptions || {})\"\r\n :prop=\"item.prop\"\r\n @click.stop=\"() => {}\"\r\n >\r\n <template v-if=\"item.formtype\">\r\n <RenderDomForm :row=\"item\" :render=\"formInputComponents(item)\" :index=\"index\" :model=\"model\" />\r\n </template>\r\n <template v-else>\r\n <RenderDomForm :row=\"item\" :render=\"item.render\" :index=\"index\" :model=\"model\" />\r\n </template>\r\n </el-form-item>\r\n </el-col>\r\n </template>\r\n\r\n <template v-if=\"!isBtnHidden\">\r\n <template v-if=\"isRenderBtn\">\r\n <RenderBtn\r\n :row=\"{ isFold: isFold, folded, getBtnColSpan, getRowColsAlgorithm, changeFolded, refsForm: formInstance }\"\r\n :form-model=\"model\"\r\n :form-item-list=\"formItem\"\r\n :render=\"(renderBtn as Function)\"\r\n />\r\n </template>\r\n <el-col v-else :span=\"btnColSpanRow ? 24 : getBtnColSpan\">\r\n <div v-if=\"btnColSpanRow && configBtn.length\" class=\"buttonOperate leftRightBtn\">\r\n <div class=\"btn-left\">\r\n <el-form-item label-width=\"0px\" class=\"btn-formItem\">\r\n <template v-for=\"(it, inx) in colRightLeftList.colLeftBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => it.click(model, refs, getTableInstant?.httpRequestInstance)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </el-form-item>\r\n </div>\r\n <div class=\"btn-right\">\r\n <el-form-item label-width=\"0px\" class=\"btn-formItem\">\r\n <template v-for=\"(it, inx) in colRightLeftList.colRightBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => clickBtn(it)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n <el-button\r\n v-if=\"isFold\"\r\n link\r\n type=\"primary\"\r\n :icon=\"getCompIcon(folded ? 'ArrowDown' : 'ArrowUp')\"\r\n style=\"padding-left: 0; border: none\"\r\n @click=\"changeFolded\"\r\n >\r\n {{ folded ? '展开' : '收起' }}\r\n </el-button>\r\n <el-dropdown placement=\"bottom-start\" v-if=\"getSetOptionsStatus\">\r\n <el-button\r\n link\r\n type=\"primary\"\r\n style=\"margin-left: 2px; margin-right: 5px; outline: none\"\r\n :icon=\"getCompIcon('Tools')\"\r\n />\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item @click=\"handleCustomerForm\">自定义查询</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleTableItemOption\">自定义表格</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleRefresh\">重置(刷新)</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </el-form-item>\r\n </div>\r\n </div>\r\n <el-form-item\r\n v-if=\"!btnColSpanRow && configBtn.length\"\r\n :label=\"' '\"\r\n :label-width=\"(formProps as any).labelBtnWidth ? (formProps as any).labelBtnWidth : (formProps as any).labelWidth\"\r\n :class=\"{ formItemCols: btnColSpanRow ? true : getBtnColSpan === 24 }\"\r\n class=\"btn-formItem\"\r\n >\r\n <div class=\"buttonOperate\" :style=\"{ 'text-align': getBtnColSpan === 24 ? 'right' : 'left' }\">\r\n <template v-if=\"configBtn.length\">\r\n <template v-for=\"(it, inx) in configBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => it?.click(model, refs, getTableInstant?.httpRequestInstance)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </template>\r\n <el-button\r\n v-if=\"isFold\"\r\n type=\"primary\"\r\n link\r\n :icon=\"getCompIcon(folded ? 'ArrowDown' : 'ArrowUp')\"\r\n style=\"padding-left: 0; border: none\"\r\n @click=\"changeFolded\"\r\n >\r\n {{ folded ? '展开' : '收起' }}\r\n </el-button>\r\n <el-dropdown placement=\"bottom-start\" v-if=\"getSetOptionsStatus\">\r\n <el-button\r\n link\r\n type=\"primary\"\r\n style=\"margin-left: 2px; margin-right: 5px; outline: none\"\r\n :icon=\"getCompIcon('Tools')\"\r\n />\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item @click=\"handleCustomerForm\">自定义查询</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleTableItemOption\">自定义表格</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleRefresh\">重置(刷新)</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </div>\r\n </el-form-item>\r\n </el-col>\r\n </template>\r\n </el-row>\r\n </div>\r\n </el-form>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nexport default { name: 'EsForm' }\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, inject, getCurrentInstance, nextTick, h, defineComponent } from 'vue'\r\nimport {\r\n ElRow,\r\n ElCol,\r\n ElFormItem,\r\n ElForm,\r\n ElButton,\r\n ElDropdownMenu,\r\n ElDropdownItem,\r\n ElDropdown,\r\n ElInput\r\n} from 'element-plus'\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport { useFormInputs } from '../../../composables/use-form-inputs'\r\nimport { useFormLayout } from '../../../composables/use-form-layout'\r\nimport { useFormRequest } from '../../../composables/use-form-request'\r\nimport { isObject } from '../../../utils/shared'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport useDialog from '../../es-dialog/src/use-dialog'\r\nimport EsTable from '../../es-table'\r\nimport type { FormItemOption, BtnConfig, LayoutFormProps } from '../../../types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n model: Record<string, unknown>\r\n formItemList: FormItemOption[]\r\n layoutFormProps?: LayoutFormProps\r\n configBtn?: BtnConfig[]\r\n renderBtn?: Function | boolean\r\n btnColSpanRow?: boolean\r\n rules?: Record<string, unknown>\r\n fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>\r\n }>(),\r\n {\r\n model: () => ({}),\r\n formItemList: () => [],\r\n layoutFormProps: () => ({}),\r\n configBtn: () => [],\r\n renderBtn: false,\r\n btnColSpanRow: true,\r\n rules: () => ({})\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: [formRef: unknown, model: Record<string, unknown>]\r\n reset: [formRef: unknown, model: Record<string, unknown>]\r\n}>()\r\n\r\nconst instance = getCurrentInstance()\r\nconst $esPlusForm = inject<Record<string, unknown>>('$esPlusForm', null) ?? getGlobalConfig().EsForm ?? {}\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\nconst translateLabel = (item: FormItemOption): string => {\r\n if (item.labelKey && typeof esPlus.t === 'function') {\r\n return (esPlus.t as (k: string) => string)(item.labelKey)\r\n }\r\n return item.label\r\n}\r\n\r\n// 保留与 Table 的耦合(同时支持 inject 和 instance.ctx 两种获取方式)\r\nconst injectedTableInstant = inject<(() => any) | null>('getTableInstantce', null)\r\nconst getTableInstant = computed(() => {\r\n if (injectedTableInstant) {\r\n return typeof injectedTableInstant === 'function' ? injectedTableInstant() : injectedTableInstant\r\n }\r\n const ctx = (instance as any)?.ctx as Record<string, any>\r\n return typeof ctx?.getTableInstantce === 'function' ? ctx?.getTableInstantce() : ctx?.getTableInstantce\r\n})\r\n\r\nconst isParentTable = computed(() => {\r\n return !!(getTableInstant.value && Object.keys(getTableInstant.value).length)\r\n})\r\n\r\n// 图标扩展\r\nconst extendedIcon = Object.fromEntries(Object.entries(ElementPlusIconsVue))\r\nconst getCompIcon = (key?: string) => (key ? extendedIcon[key] || key : undefined)\r\nconst filterOptions = (it: BtnConfig) => {\r\n const { icon, ...opt } = it as Record<string, unknown>\r\n if (!opt.size) opt.size = 'small'\r\n return opt\r\n}\r\n\r\n// Refs\r\nconst refs = ref<unknown>(null)\r\nconst formInstance = ref<Record<string, unknown>>({})\r\nconst formItemRowsList = ref<FormItemOption[]>(props.formItemList)\r\n\r\nconst setFormRef = (el: unknown) => {\r\n if (el) refs.value = el\r\n}\r\n\r\n// Composables\r\nconst { formInputComponents } = useFormInputs()\r\nconst httpRequestGlobal = ($esPlusForm?.$httpRequest as (params: Record<string, unknown>) => Promise<unknown>) || undefined\r\nconst fieldFieldOutputGlobal = (props.fieldFieldOutput || $esPlusForm?.fieldFieldOutput) as ((defaults: Record<string, string>) => Record<string, string>) | undefined\r\nconst { getEveryFormQueryField } = useFormRequest(httpRequestGlobal)\r\n\r\n// Break circular dependency: formLayoutRef is populated after useFormLayout\r\nconst formLayoutRef = ref<Record<string, unknown>>(props.layoutFormProps?.fromLayProps || {})\r\nconst formProps = computed(() => ({\r\n size: 'small' as const,\r\n ...formLayoutRef.value,\r\n model: props.model,\r\n rules: props.rules,\r\n validateOnRuleChange: false\r\n}))\r\n\r\n// 缓存已加载数据的表单项 prop,避免 computed 重新计算时重复调用接口\r\nconst loadedApiProps = ref<Set<string>>(new Set())\r\n\r\nwatch(\r\n () => props.formItemList,\r\n async (val) => {\r\n const list = Array.isArray(val) ? val : []\r\n // 只加载 isInitRun !== false 且尚未加载过数据的表单项\r\n const needLoadList = list.filter((it) => it && it.isInitRun !== false && !loadedApiProps.value.has(it.prop))\r\n if (!needLoadList.length) {\r\n // 无新表单项需要加载,保留已有的 dataOptions\r\n formItemRowsList.value = list.map((it) => {\r\n if (!it) return null\r\n const existing = formItemRowsList.value.find((old) => old && old.prop === it.prop)\r\n return existing?.dataOptions?.length ? { ...it, dataOptions: existing.dataOptions } : it\r\n }).filter((it): it is FormItemOption => !!it)\r\n return\r\n }\r\n const rows = await getEveryFormQueryField(needLoadList, fieldFieldOutputGlobal)\r\n // 标记已加载的 prop\r\n needLoadList.forEach((it) => loadedApiProps.value.add(it.prop))\r\n formItemRowsList.value = list\r\n .map((it) => {\r\n if (!it) return null\r\n const resultApiOption = rows.find((item) => item && item.prop === it.prop)\r\n const existing = formItemRowsList.value.find((old) => old && old.prop === it.prop)\r\n // 优先使用新加载的数据,其次保留已有数据\r\n if (resultApiOption) return { ...it, dataOptions: resultApiOption.listData }\r\n if (existing?.dataOptions?.length) return { ...it, dataOptions: existing.dataOptions }\r\n return it\r\n })\r\n .filter((it): it is FormItemOption => !!it)\r\n },\r\n { immediate: true, deep: true }\r\n)\r\n\r\nconst formItemListFilter = computed(() => {\r\n const list = formItemRowsList.value || []\r\n const visible = list\r\n .map((it) => (it ? { ...it, dataOptions: it.dataOptions || [] } : null))\r\n .filter((it): it is (FormItemOption & { dataOptions: Array<{ label: string; value: unknown }> }) => {\r\n if (!it) return false\r\n if (it.isHidden && typeof it.isHidden === 'function') {\r\n return !it.isHidden(props.model, it, formProps.value)\r\n }\r\n return true\r\n })\r\n\r\n const itemsWithoutSpan = visible.filter((it) => !it.span)\r\n const autoCount = itemsWithoutSpan.length\r\n let autoSpan = 6\r\n if (autoCount > 0) {\r\n const fixedTotal = visible.reduce((sum, it) => sum + (it.span || 0), 0)\r\n const remaining = 24 - (fixedTotal % 24 || (fixedTotal ? 24 : 0))\r\n if (fixedTotal === 0) {\r\n if (autoCount === 1) autoSpan = 24\r\n else if (autoCount === 2) autoSpan = 12\r\n else if (autoCount === 3) autoSpan = 8\r\n else autoSpan = 6\r\n } else {\r\n autoSpan = remaining >= autoCount ? Math.floor(remaining / autoCount) : 6\r\n if (autoSpan > 12) autoSpan = 12\r\n if (autoSpan < 4) autoSpan = 6\r\n }\r\n }\r\n\r\n return visible.map((it) => ({ ...it, span: it.span || autoSpan })) as (FormItemOption & { span: number; dataOptions: Array<{ label: string; value: unknown }> })[]\r\n})\r\n\r\nconst {\r\n folded,\r\n isBtnHidden,\r\n rowLayout,\r\n formLayout,\r\n getSetOptionsStatus,\r\n getRowColsAlgorithm,\r\n isFold,\r\n getBtnColSpan,\r\n formItem,\r\n changeFolded\r\n} = useFormLayout({\r\n layoutFormProps: props.layoutFormProps,\r\n get formItemList() { return formItemListFilter.value }\r\n})\r\n\r\nwatch(\r\n formLayout,\r\n (val) => {\r\n formLayoutRef.value = val\r\n },\r\n { immediate: true }\r\n)\r\n\r\nconst colRightLeftList = computed(() => ({\r\n colRightBtn: props.configBtn.filter((it) => it.direction === 'right' || !it.direction),\r\n colLeftBtn: props.configBtn.filter((it) => it.direction === 'left')\r\n}))\r\n\r\nconst isRenderBtn = computed(() => typeof props.renderBtn === 'function')\r\n\r\nconst clickBtn = async (it: BtnConfig) => {\r\n if (it.triggerEvent && ['query', 'rest'].includes(it.key || '')) {\r\n queryTableRequest(props.model, refs.value as any, it.key)\r\n } else {\r\n\r\n // await refs.value.validate()\r\n if (it.key === 'rest' && refs.value) {\r\n ;(refs.value as any).resetFields()\r\n }\r\n it.click?.(props.model, refs.value, getTableInstant.value?.httpRequestInstance)\r\n }\r\n}\r\n\r\nconst queryTableRequest = async (model: Record<string, unknown>, formRef: { resetFields: () => void; validate: () => Promise<boolean> } | null, key?: string) => {\r\n if (key === 'query') {\r\n if (isParentTable.value) {\r\n getTableInstant.value?.httpRequestInstance?.(model)\r\n }\r\n // else if (formRef) {\r\n // await formRef.validate()\r\n // }\r\n } else if (key === 'rest' && formRef) {\r\n if (isParentTable.value) {\r\n getTableInstant.value?.httpRequestInstance?.(model)\r\n }\r\n formRef.resetFields()\r\n }\r\n}\r\n\r\nconst initFormItemOptions = (opts: Record<string, unknown>) => {\r\n if (isParentTable.value) {\r\n const { style, ...rest } = opts\r\n return { style: { marginBottom: '10px', ...(style as Record<string, unknown>) }, ...rest }\r\n }\r\n return opts\r\n}\r\n\r\nconst confirm = () => emit('confirm', refs.value, props.model)\r\nconst reset = () => emit('reset', refs.value, props.model)\r\n\r\n// 自定义弹窗\r\nconst createDialogInstance = (() =>\r\n (instance as any)?.ctx?.dialogInstance ? (instance as any).ctx.dialogInstance() : useDialog)()\r\nconst customerForm = createDialogInstance()\r\nconst customerTable = createDialogInstance()\r\n\r\nconst handleRefresh = () => {\r\n // 保留原有逻辑\r\n}\r\n\r\nconst getFormRowsFun = () => {\r\n return {\r\n data: formItemRowsList.value.map((it) => ({\r\n ...it,\r\n label: it.label,\r\n prop: it.prop,\r\n isHidden: !!it.isHidden,\r\n width: it.width\r\n })),\r\n columns: [\r\n { type: 'selection', width: 50 },\r\n { label: '名称(列)', key: 'label' },\r\n { label: '属性(Key)', key: 'prop' },\r\n {\r\n label: '列宽',\r\n width: 180,\r\n render: (_text: unknown, row: Record<string, unknown>) => {\r\n return h('div', [\r\n h(ElInput, {\r\n size: 'small',\r\n maxlength: 3,\r\n formatter: (value: string) => value.replace(/^0|[^0-9]/g, ''),\r\n modelValue: row.width as any,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n row.width = val\r\n }\r\n }, {\r\n prepend: () => '宽度',\r\n append: () => 'px'\r\n })\r\n ])\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n\r\nconst getCustomerTableInfo = () => {\r\n return {\r\n dataSource: [],\r\n columns: [\r\n { type: 'selection', width: 50 },\r\n { label: '名称(列)', key: 'label' },\r\n { label: '属性(Key)', key: 'tableProp' },\r\n {\r\n label: '列宽',\r\n width: 180,\r\n render: (_text: unknown, row: Record<string, unknown>) => {\r\n return h('div', [\r\n h(ElInput, {\r\n size: 'small',\r\n maxlength: 3,\r\n formatter: (value: string) => value.replace(/^0|[^0-9]/g, ''),\r\n modelValue: row.width as any,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n row.width = val\r\n }\r\n }, {\r\n prepend: () => '宽度',\r\n append: () => 'px'\r\n })\r\n ])\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n\r\nconst handleCustomerForm = () => {\r\n const formRows = getFormRowsFun()\r\n customerForm({\r\n title: '自定义查询',\r\n width: '800px',\r\n isDraggable: true,\r\n render: () =>\r\n h(EsTable, {\r\n dataSource: formRows.data,\r\n columns: formRows.columns,\r\n options: {\r\n multiSelect: true,\r\n expand: false,\r\n snIndex: false,\r\n loading: false,\r\n border: true,\r\n size: 'small'\r\n },\r\n pagination: {\r\n pageSize: 10,\r\n current: 1,\r\n total: formRows.data?.length || 0\r\n }\r\n }),\r\n configBtn: [\r\n {\r\n name: '取消',\r\n icon: 'Close',\r\n click: (_instance: unknown, { close }: { close: () => void }) => close()\r\n },\r\n {\r\n name: '确认',\r\n type: 'primary',\r\n icon: 'Check',\r\n click: (_instance: unknown, { close }: { close: () => void }) => close()\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst handleTableItemOption = () => {\r\n const formRows = getCustomerTableInfo()\r\n customerTable({\r\n title: '自定义表格',\r\n width: '800px',\r\n render: () =>\r\n h(EsTable, {\r\n dataSource: formRows.dataSource,\r\n columns: formRows.columns\r\n })\r\n })\r\n}\r\n\r\n// 生命周期\r\nnextTick(() => {\r\n formInstance.value = refs.value as Record<string, unknown>\r\n ;((instance as any)?.ctx as Record<string, any>)?.bodyFormInstance?.(formInstance.value)\r\n})\r\n\r\n// 子组件定义\r\nconst RenderBtn = defineComponent({\r\n props: {\r\n row: Object,\r\n formItemList: Array,\r\n formModel: Object,\r\n render: Function,\r\n ellipsis: Boolean\r\n },\r\n setup(props) {\r\n return () => {\r\n const { formItemList, formModel, row } = props\r\n const renderContent = props.render?.(row, formModel, formItemList, h) || ''\r\n return typeof renderContent === 'string' ? h('span', renderContent) : renderContent\r\n }\r\n }\r\n})\r\n\r\nconst RenderDomForm = defineComponent({\r\n props: {\r\n row: Object,\r\n index: Number,\r\n datakey: String,\r\n render: Function,\r\n model: Object,\r\n ellipsis: Boolean\r\n },\r\n setup(props) {\r\n return () => {\r\n const { row, index, model } = props\r\n const renderContent = props.render?.(h, model, { row, index }) || ''\r\n return typeof renderContent === 'string' ? h('span', renderContent) : renderContent\r\n }\r\n }\r\n})\r\n\r\n// 暴露给外部的方法,用于手动触发指定表单项的请求\r\nconst formItmeRequestInstance = async (propsList: string[]) => {\r\n const list = formItemListFilter.value\r\n const targetItems = list.filter((it) => it && propsList.includes(it.prop))\r\n if (!targetItems.length) return\r\n\r\n const rows = await getEveryFormQueryField(targetItems, fieldFieldOutputGlobal)\r\n rows.forEach((resultApiOption) => {\r\n if (!resultApiOption) return\r\n const itemIndex = formItemRowsList.value.findIndex((it) => it && it.prop === resultApiOption.prop)\r\n if (itemIndex !== -1) {\r\n formItemRowsList.value[itemIndex] = {\r\n ...formItemRowsList.value[itemIndex],\r\n dataOptions: resultApiOption.listData as Array<{ label: string; value: unknown }>\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 暴露组件实例方法\r\nconst getFormRef = () => refs.value as { validate: () => Promise<boolean>; resetFields: () => void; clearValidate: (props?: string | string[]) => void; validateField: (props: string | string[]) => Promise<boolean>; scrollToField: (prop: string) => void }\r\n\r\ndefineExpose({\r\n formItmeRequestInstance,\r\n getFormRef,\r\n validate: () => getFormRef()?.validate(),\r\n resetFields: () => getFormRef()?.resetFields(),\r\n clearValidate: (props?: string | string[]) => getFormRef()?.clearValidate(props),\r\n validateField: (props: string | string[]) => getFormRef()?.validateField(props),\r\n scrollToField: (prop: string) => getFormRef()?.scrollToField(prop)\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.es-form {\r\n :deep(.el-form-item) {\r\n margin-bottom: 18px;\r\n }\r\n\r\n :deep(.el-form-item__label) {\r\n font-weight: 500;\r\n }\r\n\r\n .buttonOperate {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n }\r\n\r\n .leftRightBtn {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n width: 100%;\r\n\r\n .btn-left,\r\n .btn-right {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n\r\n .btn-formItem {\r\n margin-bottom: 0;\r\n }\r\n\r\n .formItemCols {\r\n width: 100%;\r\n }\r\n}\r\n</style>\r\n","import EsForm from './src/es-form.vue'\nimport useDialog from '../es-dialog/src/use-dialog'\n\nEsForm.install = function (app: any) {\n app.component(EsForm.name, EsForm)\n}\n\nEsForm.isPlugin = true\nEsForm.Plugin = {\n install(app: any, options: any = {}) {\n app.provide('$esPlusForm', {\n ...options.methods,\n useDialog: () => useDialog()\n })\n app.component(EsForm.name, { ...EsForm, methods: { ...EsForm.methods, ...(options.methods || {}), useDialog: () => useDialog() } })\n }\n}\n\nexport default EsForm\n","<template>\r\n <div class=\"dp-dialog_wrapper\">\r\n <el-dialog\r\n :class=\"['dg-dialog', initDialogCls]\"\r\n v-bind=\"filteredAttrs\"\r\n v-model=\"dialogVisible\"\r\n :draggable=\"props.isDraggable\"\r\n :width=\"props.width\"\r\n :show-close=\"false\"\r\n @close=\"beforeClose\"\r\n :fullscreen=\"(filteredAttrs?.fullscreen as boolean) ?? isFullscreen\"\r\n >\r\n <template #header>\r\n <template v-if=\"props.renderHeader\">\r\n <RenderJsx :render=\"props.renderHeader\" :instance=\"getCurrentInstanceModel\" />\r\n </template>\r\n <template v-else>\r\n <div>\r\n <span class=\"dialog-title\">{{ props.title }}</span>\r\n </div>\r\n <div class=\"btns\">\r\n <el-icon @click=\"handleFullscreen\" v-show=\"!props.hiddenFullBtn\">\r\n <FullScreen v-if=\"!isFullscreen\" />\r\n <CopyDocument v-else />\r\n </el-icon>\r\n <el-icon @click=\"handleClose\"><Close /></el-icon>\r\n </div>\r\n </template>\r\n </template>\r\n\r\n <div class=\"dialog_body_layouts\" :style=\"initDialogHeight\">\r\n <template v-if=\"props.render && typeof props.render === 'function'\">\r\n <RenderJsx\r\n :refs=\"renderBodyRefsObject\"\r\n :instance=\"getCurrentInstanceModel\"\r\n :render=\"props.render\"\r\n :components=\"{ EsTable, EsForm }\"\r\n :locale=\"locale\"\r\n />\r\n </template>\r\n </div>\r\n\r\n <template #footer v-if=\"!attrs.isHiddenFooter\">\r\n <span v-if=\"!slots.footer\" class=\"dialog-footer\">\r\n <template v-if=\"props.renderFooter && typeof props.renderFooter === 'function'\">\r\n <RenderJsx :render=\"props.renderFooter\" :instance=\"getCurrentInstanceModel\" />\r\n </template>\r\n <template v-else-if=\"props.configBtn && props.configBtn.length\">\r\n <template v-for=\"(it, inx) in configBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n size=\"small\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() : it.disabled || false\"\r\n @click=\"() => {\r\n it.click?.(renderBodyRefsObject.currentRef, {\r\n close: handleClose,\r\n getRefs: (name?: string) => {\r\n if (name) return renderBodyRefsObject[name] || null\r\n return renderBodyRefsObject\r\n },\r\n dialogInstance\r\n })\r\n }\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </template>\r\n </span>\r\n <slot v-else name=\"footer\" />\r\n </template>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, reactive, getCurrentInstance, provide, inject, useAttrs } from 'vue'\r\nimport { ElConfigProvider, ElDialog, ElButton, ElIcon } from 'element-plus'\r\nimport { FullScreen, Close, CopyDocument } from '@element-plus/icons-vue'\r\nimport RenderJsx from './render-jsx.vue'\r\nimport EsTable from '../../es-table'\r\nimport EsForm from '../../es-form'\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport type { BtnConfig } from '../../../types'\r\n\r\nconst props = defineProps<{\r\n title?: string\r\n visible?: boolean\r\n appendTo?: object | string\r\n hiddenFullBtn?: boolean\r\n width?: string | number\r\n isDraggable?: boolean\r\n confirmText?: string\r\n cancelText?: string\r\n configBtn?: BtnConfig[]\r\n maxHeight?: string | number\r\n isHiddenFooter?: boolean\r\n renderHeader?: Function\r\n renderFooter?: Function\r\n render?: Function\r\n fullscreen?: boolean\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n 'update:visible': [val: boolean]\r\n closed: [val: boolean]\r\n submit: [payload: any]\r\n}>()\r\n\r\nconst slots = defineSlots()\r\n\r\nconst instance = getCurrentInstance()\r\nconst attrs = useAttrs()\r\n\r\nconst extended = Object.fromEntries(Object.entries(ElementPlusIconsVue).map(([key]) => [key, ElementPlusIconsVue[key]]))\r\n\r\nconst lyFormInstance = ref(null)\r\nconst renderBodyRefsObject = reactive<Record<string, any>>({})\r\nconst isFullscreen = ref(false)\r\nconst dialogInstance = instance\r\nconst locale = ref(zhCn)\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\nconst injectedLocale = inject('elLocale', null)\r\nif (injectedLocale) {\r\n locale.value = injectedLocale as any\r\n}\r\n\r\nprovide('elLocale', locale.value)\r\n\r\nconst getCompIcon = (key?: string) => {\r\n return key ? extended[key] || key : undefined\r\n}\r\n\r\nconst filterOptions = (it: BtnConfig) => {\r\n const { icon, ...opt } = it as Record<string, unknown>\r\n return opt\r\n}\r\n\r\nconst closeFullscreen = () => {\r\n setTimeout(() => {\r\n if (isFullscreen.value) {\r\n isFullscreen.value = false\r\n }\r\n }, 500)\r\n}\r\n\r\nconst handleFullscreen = () => {\r\n if (attrs?.fullscreen) return\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleClose = () => {\r\n emit('closed', false)\r\n closeFullscreen()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('submit', { renderBodyRefs: renderBodyRefsObject.currentRef, lyFormInstance, dialogInstance })\r\n}\r\n\r\nconst beforeClose = () => {\r\n emit('closed', false)\r\n closeFullscreen()\r\n}\r\n\r\nconst filteredAttrs = computed(() => {\r\n const { ...rest } = attrs\r\n return rest\r\n})\r\n\r\nconst initDialogCls = computed(() => {\r\n if (!isFullscreen.value) {\r\n if (props.maxHeight) return 'dialogShadow'\r\n return 'dialogAuto'\r\n }\r\n return 'dialogFull'\r\n})\r\n\r\nconst getMaxContentHeight = () => {\r\n const viewH = window.innerHeight\r\n return Math.max(viewH - 135, 200)\r\n}\r\n\r\nconst initDialogHeight = computed(() => {\r\n const viewH = getMaxContentHeight()\r\n if (!isFullscreen.value) {\r\n if (props.maxHeight) {\r\n return { maxHeight: typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight }\r\n }\r\n return { maxHeight: viewH + 'px' }\r\n }\r\n return { height: viewH + 'px' }\r\n})\r\n\r\nconst dialogVisible = computed({\r\n get: () => props.visible || false,\r\n set: (val) => {\r\n emit('update:visible', val)\r\n if (!val) {\r\n emit('closed', val)\r\n closeFullscreen()\r\n }\r\n }\r\n})\r\n\r\nconst getCurrentInstanceModel = computed(() => ({\r\n renderBodyRefs: renderBodyRefsObject.currentRef,\r\n renderBodyRefsObject,\r\n lyFormInstance,\r\n dialogInstance,\r\n getRefs: () => renderBodyRefsObject\r\n}))\r\n\r\nprovide('bodyFormInstance', (e: any) => {\r\n lyFormInstance.value = e\r\n})\r\n\r\nif (instance) {\r\n instance.exposed = {\r\n closed: handleClose\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.dp-dialog_wrapper {\r\n :deep(.dialogAuto) {\r\n margin: 0px !important;\r\n }\r\n :deep(.el-overlay-dialog) {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n :deep(.el-dialog) {\r\n padding: 10px;\r\n\r\n .el-dialog__footer {\r\n padding-top: 0px;\r\n }\r\n\r\n .el-dialog__body {\r\n padding: 10px 0px;\r\n }\r\n\r\n .el-dialog__header {\r\n border-bottom: 1px solid #eee;\r\n display: flex;\r\n padding: 0px 0px 10px 0px;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin: 0;\r\n }\r\n }\r\n}\r\n\r\n.dialog-title {\r\n line-height: 24px;\r\n font-size: 14px;\r\n color: #303133;\r\n font-weight: bold;\r\n}\r\n\r\n.btns {\r\n display: flex;\r\n align-items: center;\r\n\r\n i {\r\n margin-right: 8px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n }\r\n}\r\n\r\n.dialog_body_layouts {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n scrollbar-width: thin;\r\n scrollbar-color: #87a2bd26 #c8d5e147;\r\n}\r\n\r\n/* 滚动条样式 */\r\n*::-webkit-scrollbar {\r\n width: 14px;\r\n height: 14px;\r\n}\r\n\r\n*::-webkit-scrollbar-button {\r\n width: 0;\r\n height: 0;\r\n display: none;\r\n}\r\n\r\n*::-webkit-scrollbar-corner {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n min-height: 12px;\r\n border: 4px solid transparent;\r\n background-clip: content-box;\r\n border-radius: 7px;\r\n background-color: #c8d5e1;\r\n\r\n &:hover {\r\n background-color: #a8bbcf;\r\n }\r\n\r\n &:active {\r\n background-color: #87a2bd;\r\n }\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-track-piece {\r\n background-color: transparent;\r\n}\r\n</style>\r\n","import EsDialog from './src/component.vue'\n\nEsDialog.install = function (app: any) {\n app.component(EsDialog.name, EsDialog)\n}\n\nexport default EsDialog\n","<template>\r\n <div class=\"es-crud-page\">\r\n <es-table\r\n ref=\"tableRef\"\r\n :columns=\"mergedColumns\"\r\n :options=\"mergedOptions\"\r\n v-model:data-source=\"tableData\"\r\n v-model:pagination=\"paginationState\"\r\n v-bind=\"$attrs\"\r\n >\r\n <es-form\r\n v-if=\"schema.formItems && schema.formItems.length\"\r\n ref=\"formRef\"\r\n :model=\"queryModel\"\r\n :form-item-list=\"schema.formItems\"\r\n :config-btn=\"mergedFormBtns\"\r\n :layout-form-props=\"formLayoutProps\"\r\n />\r\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotData\">\r\n <slot :name=\"name\" v-bind=\"slotData || {}\" />\r\n </template>\r\n </es-table>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, watch } from 'vue'\r\nimport { ElMessageBox } from 'element-plus'\r\nimport EsForm from '../../es-form/src/es-form.vue'\r\nimport EsTable from '../../es-table/src/component.vue'\r\nimport useDialog from '../../es-dialog/src/use-dialog'\r\nimport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudBtnConfig,\r\n TableBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n CrudDialogConfig,\r\n DialogActionContext\r\n} from './types'\r\nimport type { BtnConfig, TableColumn } from '../../../types'\r\n\r\ndefineOptions({ name: 'EsCrudPage' })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n schema: CrudPageSchema\r\n httpRequest?: (params: Record<string, unknown>) => Promise<unknown>\r\n autoLoad?: boolean\r\n }>(),\r\n { autoLoad: true }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'query': [model: Record<string, unknown>]\r\n 'add': []\r\n 'edit': [row: Record<string, unknown>]\r\n 'delete': [row: Record<string, unknown>]\r\n 'view': [row: Record<string, unknown>]\r\n 'export': [model: Record<string, unknown>]\r\n 'row-click': [row: Record<string, unknown>]\r\n 'btn-click': [key: string, payload?: Record<string, unknown>]\r\n 'dialog-confirm': [dialogKey: string, data: Record<string, unknown>]\r\n 'dialog-cancel': [dialogKey: string]\r\n 'dialog-open': [dialogKey: string, row?: Record<string, unknown>]\r\n}>()\r\n\r\nconst tableRef = ref<any>(null)\r\nconst formRef = ref<any>(null)\r\nconst tableData = ref<Record<string, unknown>[]>([])\r\n\r\nconst queryModel = reactive<Record<string, unknown>>({})\r\n\r\nwatch(\r\n () => props.schema.formItems,\r\n (items) => {\r\n if (items) {\r\n items.forEach((item) => {\r\n if (item.prop && !(item.prop in queryModel)) {\r\n queryModel[item.prop] = ''\r\n }\r\n })\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nconst paginationState = ref({\r\n current: 1,\r\n pageSize: 10,\r\n total: 0,\r\n ...(props.schema.pagination || {})\r\n})\r\n\r\n// ─── 向后兼容:归一化配置 ───\r\n\r\nconst normalizedDialogs = computed<Record<string, CrudDialogConfig>>(() => {\r\n if (props.schema.dialogs) return props.schema.dialogs\r\n\r\n // 旧模式:从 dialogFormItems + actions 推导\r\n if (!props.schema.dialogFormItems?.length) return {}\r\n\r\n const dialogBase = {\r\n width: props.schema.dialogOptions?.width || '600px',\r\n formItems: props.schema.dialogFormItems,\r\n ...(props.schema.dialogOptions || {})\r\n } as CrudDialogConfig\r\n\r\n const result: Record<string, CrudDialogConfig> = {}\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n\r\n if (actions.includes('add')) {\r\n result.add = { ...dialogBase, title: '新增' }\r\n }\r\n if (actions.includes('edit')) {\r\n result.edit = { ...dialogBase, title: '编辑' }\r\n }\r\n if (actions.includes('view')) {\r\n result.view = { ...dialogBase, title: '查看', isHiddenFooter: true }\r\n }\r\n\r\n return result\r\n})\r\n\r\nconst normalizedToolbarBtns = computed<CrudBtnConfig[]>(() => {\r\n if (props.schema.toolbarBtns) return props.schema.toolbarBtns\r\n\r\n // 新模式(显式配置了 dialogs 或 operationColumn):不自动生成工具栏按钮\r\n if (props.schema.dialogs || props.schema.operationColumn !== undefined) return []\r\n\r\n // 旧模式:从 actions 推导\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n const btns: CrudBtnConfig[] = []\r\n\r\n if (actions.includes('add')) {\r\n btns.push({ name: '新增', type: 'primary', key: 'add', icon: 'Plus', dialogKey: 'add' })\r\n }\r\n if (actions.includes('export')) {\r\n btns.push({ name: '导出', key: 'export', icon: 'Download', actionType: 'export' })\r\n }\r\n if (actions.includes('import')) {\r\n btns.push({ name: '导入', key: 'import', icon: 'Upload', actionType: 'import' })\r\n }\r\n\r\n return btns\r\n})\r\n\r\nconst normalizedOperationColumn = computed<OperationColumnConfig | false | undefined>(() => {\r\n if (props.schema.operationColumn !== undefined) return props.schema.operationColumn\r\n\r\n // 旧模式:从 actions 推导\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n const hasActionCol = props.schema.columns?.some((c) => c.prop === 'action' || c.prop === 'operate' || c.btns)\r\n if (hasActionCol) return undefined\r\n\r\n const rowActions = actions.filter((a) => ['edit', 'delete', 'view'].includes(a))\r\n if (rowActions.length === 0) return false\r\n\r\n const btns: RowBtnConfig[] = []\r\n if (actions.includes('view')) {\r\n btns.push({ name: '查看', type: 'primary', key: 'view', dialogKey: 'view' })\r\n }\r\n if (actions.includes('edit')) {\r\n btns.push({ name: '编辑', type: 'primary', key: 'edit', dialogKey: 'edit' })\r\n }\r\n if (actions.includes('delete')) {\r\n btns.push({ name: '删除', type: 'danger', key: 'delete', confirm: '确定删除该条数据吗?' })\r\n }\r\n\r\n return {\r\n label: '操作',\r\n width: btns.length * 80 + 20,\r\n fixed: 'right',\r\n btns\r\n }\r\n})\r\n\r\n// ─── 表单按钮合并 ───\r\n\r\nconst mergedFormBtns = computed<BtnConfig[]>(() => {\r\n if (props.schema.queryBtns) return props.schema.queryBtns\r\n\r\n const baseBtns: BtnConfig[] = [\r\n { name: '查询', type: 'primary', key: 'query', triggerEvent: true },\r\n { name: '重置', key: 'rest', triggerEvent: true },\r\n ]\r\n\r\n const toolbarBtns = normalizedToolbarBtns.value.map((btn) => {\r\n const resolvedBtn: BtnConfig = { ...btn }\r\n if (!resolvedBtn.click) {\r\n resolvedBtn.click = () => handleToolbarBtnClick(btn)\r\n }\r\n return resolvedBtn\r\n })\r\n\r\n return [...baseBtns, ...toolbarBtns]\r\n})\r\n\r\n// ─── 表格列合并 ───\r\n\r\nconst mergedColumns = computed<TableColumn[]>(() => {\r\n const cols = [...(props.schema.columns || [])]\r\n const opCol = normalizedOperationColumn.value\r\n\r\n if (opCol === false || opCol === undefined) return cols\r\n\r\n const actionBtns = opCol.btns.map((btn) => ({\r\n name: btn.name,\r\n type: btn.type,\r\n permissionValue: btn.permissionValue,\r\n clickEvent: (row: Record<string, unknown>) => handleRowBtnClick(btn, row)\r\n }))\r\n\r\n cols.push({\r\n prop: 'operate',\r\n label: opCol.label || '操作',\r\n width: opCol.width || actionBtns.length * 80 + 20,\r\n fixed: opCol.fixed || 'right',\r\n btns: actionBtns\r\n })\r\n\r\n return cols\r\n})\r\n\r\n// ─── 表格工具栏按钮 ───\r\n\r\nconst normalizedTableBtns = computed(() => {\r\n if (!props.schema.tableBtns?.length) return []\r\n return props.schema.tableBtns.map((btn: TableBtnConfig) => ({\r\n name: btn.name,\r\n type: btn.type,\r\n size: btn.size || 'small',\r\n icon: btn.icon,\r\n code: btn.code || 1,\r\n permissionValue: btn.permissionValue,\r\n loading: btn.loading,\r\n disabled: btn.disabled,\r\n click: () => handleToolbarBtnClick(btn)\r\n }))\r\n})\r\n\r\n// ─── 表格选项 ───\r\n\r\nconst mergedOptions = computed(() => {\r\n const base: Record<string, unknown> = {\r\n border: true,\r\n isInitRun: props.autoLoad,\r\n ...(props.schema.tableOptions || {})\r\n }\r\n if (props.httpRequest) {\r\n base.httpRequest = props.httpRequest\r\n }\r\n const tBtns = normalizedTableBtns.value\r\n if (tBtns.length > 0) {\r\n const existing = (base.configBtn as any[]) || []\r\n base.configBtn = [...existing, ...tBtns]\r\n }\r\n return base\r\n})\r\n\r\n// ─── 表单布局 ───\r\n\r\nconst formLayoutProps = computed(() => {\r\n const layout = props.schema.formLayout\r\n if (!layout) return undefined\r\n return {\r\n rowLayProps: { gutter: 16 },\r\n fromLayProps: {\r\n labelBtnWidth: layout.labelWidth,\r\n ...(layout.minFoldRows ? { minFoldRows: layout.minFoldRows } : {})\r\n }\r\n } as any\r\n})\r\n\r\n// ─── 工具栏按钮处理 ───\r\n\r\nasync function handleToolbarBtnClick(btn: CrudBtnConfig) {\r\n const key = btn.key || btn.actionType || ''\r\n\r\n // 确认逻辑\r\n if (btn.confirm) {\r\n const msg = typeof btn.confirm === 'string' ? btn.confirm : '确定执行此操作吗?'\r\n try {\r\n await ElMessageBox.confirm(msg, '提示', { type: 'warning' })\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n // 打开弹窗\r\n if (btn.dialogKey) {\r\n // 向后兼容:仍然 emit 对应的语义事件\r\n if (key === 'add') emit('add')\r\n openDialog(btn.dialogKey)\r\n return\r\n }\r\n\r\n // 非弹窗按钮的事件\r\n if (key === 'export' || btn.actionType === 'export') {\r\n emit('export', { ...queryModel })\r\n } else if (key === 'add') {\r\n emit('add')\r\n }\r\n\r\n emit('btn-click', key, { ...queryModel })\r\n}\r\n\r\n// ─── 行按钮处理 ───\r\n\r\nasync function handleRowBtnClick(btn: RowBtnConfig, row: Record<string, unknown>) {\r\n const key = btn.key || ''\r\n\r\n // 确认逻辑\r\n if (btn.confirm) {\r\n const msg = typeof btn.confirm === 'string' ? btn.confirm : '确定执行此操作吗?'\r\n try {\r\n await ElMessageBox.confirm(msg, '提示', { type: 'warning' })\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n // 自定义 click\r\n if (btn.click) {\r\n btn.click(row, {\r\n refresh,\r\n getSelectedRows,\r\n openDialog\r\n })\r\n return\r\n }\r\n\r\n // 打开弹窗\r\n if (btn.dialogKey) {\r\n openDialog(btn.dialogKey, row)\r\n return\r\n }\r\n\r\n // 向后兼容事件\r\n if (key === 'edit') emit('edit', row)\r\n else if (key === 'delete') emit('delete', row)\r\n else if (key === 'view') emit('view', row)\r\n\r\n emit('btn-click', key, row)\r\n}\r\n\r\n// ─── 弹窗管理 ───\r\n\r\nconst dialogInstances = new Map<string, any>()\r\n\r\nfunction openDialog(key: string, row?: Record<string, unknown>) {\r\n const dialogConfig = normalizedDialogs.value[key]\r\n if (!dialogConfig) return\r\n\r\n emit('dialog-open', key, row)\r\n\r\n const dialog = useDialog()\r\n dialogInstances.set(key, dialog)\r\n\r\n const formData = reactive<Record<string, unknown>>({})\r\n if (dialogConfig.formItems) {\r\n dialogConfig.formItems.forEach((item) => {\r\n if (item.prop) {\r\n formData[item.prop] = row?.[item.prop] ?? ''\r\n }\r\n })\r\n }\r\n\r\n const title = typeof dialogConfig.title === 'function'\r\n ? dialogConfig.title(row)\r\n : dialogConfig.title || ''\r\n\r\n dialogConfig.onOpen?.(row)\r\n\r\n const configBtn = resolveDialogBtns(key, dialogConfig, formData, row || {})\r\n\r\n dialog({\r\n title,\r\n width: dialogConfig.width || '600px',\r\n isDraggable: dialogConfig.isDraggable,\r\n maxHeight: dialogConfig.maxHeight,\r\n fullscreen: dialogConfig.fullscreen,\r\n isHiddenFooter: dialogConfig.isHiddenFooter,\r\n render: dialogConfig.render\r\n ? (h: any, inst: any) => {\r\n return dialogConfig.render!(h, {\r\n row: row || {},\r\n model: formData,\r\n registerRef: inst.registerRef,\r\n close: () => closeDialog(key),\r\n refresh\r\n })\r\n }\r\n : dialogConfig.formItems\r\n ? (h: any, { registerRef }: any) => {\r\n return h(EsForm, {\r\n ref: (el: any) => el && registerRef('dialogForm', el),\r\n model: formData,\r\n formItemList: dialogConfig.formItems,\r\n layoutFormProps: {\r\n rowLayProps: { gutter: 16 },\r\n fromLayProps: {\r\n isBtnHidden: true,\r\n ...(dialogConfig.formLayout || {})\r\n }\r\n }\r\n })\r\n }\r\n : undefined,\r\n configBtn,\r\n onClosed: () => {\r\n dialogInstances.delete(key)\r\n dialogConfig.onClose?.()\r\n }\r\n })\r\n}\r\n\r\nfunction closeDialog(key: string) {\r\n const dialog = dialogInstances.get(key)\r\n if (dialog) {\r\n dialog.close()\r\n dialogInstances.delete(key)\r\n }\r\n}\r\n\r\nfunction resolveDialogBtns(\r\n key: string,\r\n config: CrudDialogConfig,\r\n formData: Record<string, unknown>,\r\n row: Record<string, unknown>\r\n): any[] | undefined {\r\n if (config.isHiddenFooter) return undefined\r\n\r\n // 用户显式指定了 configBtn\r\n if (config.configBtn) {\r\n return config.configBtn.map((btn) => {\r\n if (btn.action === 'cancel') {\r\n return {\r\n ...btn,\r\n click: (_: any, { close }: any) => {\r\n emit('dialog-cancel', key)\r\n close()\r\n }\r\n }\r\n }\r\n if (btn.action === 'confirm') {\r\n return {\r\n ...btn,\r\n click: async (_: any, { close, getRefs }: any) => {\r\n await validateAndConfirm(key, config, formData, row, close, getRefs)\r\n }\r\n }\r\n }\r\n return btn\r\n })\r\n }\r\n\r\n // 自动生成取消 + 确定\r\n return [\r\n {\r\n name: '取消',\r\n click: (_: any, { close }: any) => {\r\n emit('dialog-cancel', key)\r\n close()\r\n }\r\n },\r\n {\r\n name: '确定',\r\n type: 'primary',\r\n click: async (_: any, { close, getRefs }: any) => {\r\n await validateAndConfirm(key, config, formData, row, close, getRefs)\r\n }\r\n }\r\n ]\r\n}\r\n\r\nasync function validateAndConfirm(\r\n key: string,\r\n config: CrudDialogConfig,\r\n formData: Record<string, unknown>,\r\n row: Record<string, unknown>,\r\n close: () => void,\r\n getRefs: (name?: string) => any\r\n) {\r\n // 如果有表单,先校验\r\n if (config.formItems?.length) {\r\n const dialogForm = getRefs('dialogForm')\r\n if (dialogForm?.validate) {\r\n await dialogForm.validate()\r\n }\r\n }\r\n\r\n const context: DialogActionContext = { close, refresh, getRefs, row }\r\n\r\n // 用户自定义 onConfirm\r\n if (config.onConfirm) {\r\n await config.onConfirm(formData, context)\r\n } else {\r\n // 向后兼容:emit btn-click 事件\r\n const legacyKey = key === 'add' ? 'add-confirm' : key === 'edit' ? 'edit-confirm' : `${key}-confirm`\r\n emit('btn-click', legacyKey, formData)\r\n close()\r\n refresh()\r\n }\r\n\r\n // 新事件\r\n emit('dialog-confirm', key, formData)\r\n}\r\n\r\n// ─── 公共方法 ───\r\n\r\nfunction refresh() {\r\n tableRef.value?.httpRequestInstance?.()\r\n}\r\n\r\nfunction getSelectedRows(): Record<string, unknown>[] {\r\n return tableRef.value?.getSelectionRows?.() || []\r\n}\r\n\r\ndefineExpose({\r\n refresh,\r\n getSelectedRows,\r\n tableRef,\r\n formRef,\r\n queryModel,\r\n openDialog,\r\n closeDialog\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.es-crud-page {\r\n width: 100%;\r\n}\r\n</style>\r\n","import EsCrudPage from './src/es-crud-page.vue'\r\n\r\nEsCrudPage.install = function (app: any) {\r\n app.component(EsCrudPage.name, EsCrudPage)\r\n}\r\n\r\nexport default EsCrudPage\r\nexport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudPageProps,\r\n CrudPageEmits,\r\n CrudPageExpose,\r\n CrudBtnConfig,\r\n TableBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n RowBtnContext,\r\n CrudDialogConfig,\r\n DialogRenderContext,\r\n DialogBtnConfig,\r\n DialogActionContext\r\n} from './src/types'\r\n","<template>\r\n <div v-if=\"isExternal\" :style=\"styleExternalIcon\" class=\"svg-external-icon svg-icon\" />\r\n <svg v-else :class=\"svgClass\" aria-hidden=\"true\">\r\n <use :xlink:href=\"iconName\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\n\r\nconst props = defineProps<{\r\n iconClass: string\r\n className?: string\r\n}>()\r\n\r\nconst isExternal = computed(() => isExternals(props.iconClass))\r\nconst iconName = computed(() => `#icon-${props.iconClass}`)\r\nconst svgClass = computed(() => {\r\n if (props.className) {\r\n return 'svg-icon ' + props.className\r\n }\r\n return 'svg-icon'\r\n})\r\nconst styleExternalIcon = computed(() => {\r\n return {\r\n mask: `url(${props.iconClass}) no-repeat 50% 50%`,\r\n '-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`\r\n }\r\n})\r\n\r\nconst isExternals = (path: string) => {\r\n return /^(https?:|mailto:|tel:|open)/.test(path)\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.svg-icon {\r\n width: 1em;\r\n height: 1em;\r\n vertical-align: -0.15em;\r\n fill: currentColor;\r\n overflow: hidden;\r\n}\r\n\r\n.svg-external-icon {\r\n background-color: currentColor;\r\n mask-size: cover !important;\r\n display: inline-block;\r\n}\r\n</style>\r\n","import SvgIcon from './src/svg-icon.vue'\n\nSvgIcon.install = function (app: any) {\n app.component(SvgIcon.name, SvgIcon)\n}\n\nexport default SvgIcon","import { version } from '../package.json'\r\nimport EsDialog from './components/es-dialog'\r\nimport useDialog from './components/es-dialog/src/use-dialog'\r\nimport EsForm from './components/es-form'\r\nimport EsTable from './components/es-table'\r\nimport EsCrudPage from './components/es-crud-page'\r\nimport SvgIcon from './components/svg-icon'\r\nimport { configureEsPlus } from './config'\r\n\r\n// 组件列表\r\nconst components = [EsDialog, EsForm, EsTable, EsCrudPage, SvgIcon]\r\n\r\n// Vue 3 插件安装函数\r\nconst install = (app: any, options: Record<string, unknown> = {}) => {\r\n // 写入模块级单例,确保自动导入模式也能获取全局配置\r\n configureEsPlus(options as any)\r\n\r\n // 自动导入模式下跳过组件全局注册,避免重复注册\r\n if (!options.skipComponentRegistration) {\r\n components.forEach((component) => {\r\n if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n }\r\n\r\n if (options.globalProperties !== false) {\r\n app.config.globalProperties.$useDialog = useDialog\r\n\r\n components.forEach((component: any) => {\r\n if (component.isPlugin && component.Plugin) {\r\n app.use(component.Plugin, options[component.name] || {})\r\n }\r\n })\r\n }\r\n\r\n app.provide('$EsPlus', {\r\n useDialog,\r\n ...options\r\n })\r\n}\r\n\r\n// 按需导出\r\nexport {\r\n EsDialog,\r\n EsForm,\r\n EsTable,\r\n EsCrudPage,\r\n SvgIcon,\r\n useDialog,\r\n configureEsPlus,\r\n install\r\n}\r\n\r\n// 类型导出\r\nexport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n RowBtnContext,\r\n CrudDialogConfig,\r\n DialogRenderContext,\r\n DialogBtnConfig,\r\n DialogActionContext\r\n} from './components/es-crud-page'\r\nexport type {\r\n FormItemOption,\r\n ApiParams,\r\n BtnConfig,\r\n LayoutFormProps,\r\n TableColumn,\r\n TableOptions,\r\n PaginationConfig,\r\n DialogOptions,\r\n EsFormInstance,\r\n EsTableInstance,\r\n EsPlusOptions\r\n} from './types'\r\n\r\n// 默认导出\r\nexport default {\r\n version,\r\n install\r\n}"],"names":["zh_cn_default","_sfc_main","defineComponent","props","refsObject","reactive","getRawRef","vnodeRef","refObj","val","componentVNode","userRefCallback","flushRef","instance","comp","onMounted","onUpdated","enhancedInstance","name","el","renderContent","h","ElConfigProvider","zhCn","e","isVNode","_a","globalConfig","configureEsPlus","options","getGlobalConfig","esPlus","inject","RenderDomTb","row","index","dataKey","render","value","renderResult","firstWordUpperCase","str","columnBindAttr","cols","t","parts","camelKey","i","__props","_createBlock","_unref","ElTableColumn","_normalizeProps","_mergeProps","_openBlock","_createElementBlock","_Fragment","item","_createSlots","_withCtx","scope","_renderSlot","_ctx","RenderDom","hasPermission","_btnList","pvalue","permFn","processButtonConfig","config","processed","processedBtnLeft","computed","processedBtnRight","showContainer","getDisabledState","buttonContainerStyle","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_hoisted_3","_hoisted_4","_renderList","_normalizeStyle","_createTextVNode","_hoisted_5","DEFAULT_WIDTH","useColumnAdapter","columns","result","hasSelectionCol","c","hasIndexCol","hasExpandCol","createSelectionColumn","createExpandColumn","createIndexColumn","col","child","adaptColumn","key","title","width","base","createRenderCellRenderer","createSlotCellRenderer","createEllipsisCellRenderer","createFormatterCellRenderer","fixed","rowData","rowKey","checked","ElCheckbox","rowIndex","expanded","ElIcon","cellData","renderFn","parentSlots","slotName","slotFn","text","formatter","ElTooltip","formatted","useVirtualSelection","dataSource","rowkey","selectedKeys","ref","allSelected","indeterminate","size","onSelectRow","next","onSelectAll","getSelectedRows","keys","clearSelection","toggleRowSelection","selected","restoreSelections","useVirtualSort","sortState","onColumnSort","order","k","_b","toSortChangePayload","headerHeight","emit","__emit","tableV2Ref","tFn","dataSourceRef","toRef","columnsRef","expandedKeys","onToggleExpand","r","selectionChangeTimer","emitSelectionChange","adaptedColumns","tableClass","cls","currentRowKey","rowClassName","classes","rowClassNameOpt","rowEventHandlers","handleColumnSort","params","payload","__expose","_createVNode","ElAutoResizer","ElTableV2","useTableResize","tableContainerRef","headBarRef","tbBtnRef","paginationRef","tableHeight","observer","isNegative","num","totalContainerNum","headBarHeight","tbBtnHeight","_c","paginationHeight","_d","resizeObservers","element","containerHeight","maxContainer","minTableNum","tabContainer","_e","newHeight","startObserver","nextTick","target","stopObserver","onBeforeUnmount","useTableSelection","multipleSelection","selectionsByPage","isInitChange","handleSelectionChange","currentPage","allSelections","uniqueMap","pageSelections","handleSelectData","dataList","tableRef","pageSelecteds","selectedRow","isObject","findValueByKey","obj","depth","currentValue","prop","deepValue","wrapPromise","promise","reason","defaultOptions","slots","_useSlots","locale","injectedLocale","getCurrentInstance","$esPlusTable","checkPermission","fn","isVirtual","virtualEngineRef","tableId","tableData","columnRowList","watch","loadingStatus","slotState","showPagination","setTableContainer","bodyFormInstance","getVisibleShow","visibleShow","paginationConfig","formInstance","getListEntry","configTableField","checkQueryFields","configFields","isFormInstance","formVNode","vnode","type","hasDefaultSlot","heightType","tabHeight","slotStyles","paginationLayoutConfig","cfg","layout","paginationPageSizes","paginationIsSmall","paginationBackground","loadStatus","isRequestConf","filteredColumns","list","_h","btn","ElButton","flexIdx","TABLE_INTERNAL_KEYS","tableAttrs","merged","align","rest","fallthroughAttrs","useAttrs","tableBindAttrs","oldVal","httpRequestInstance","initSelection","clearAllSelection","handleTableSelectionChange","handleVirtualSelectionChange","rows","checkListKey","it","its","getListenToCallBack","eventName","eventNameList","hasEventNameIndex","formatConfigOut","keyList","queryTableListMethod","success","fail","apiParams","url","formData","toRaw","unref","fnParams","finalParams","requestOption","requestHandler","requestFn","res","responseData","model","resolve","reject","err","changePageIndexRequest","changePageSizeRequest","handleSizeChange","handleIndexChange","changeTableSort","column","char","newkey","j","provide","_normalizeClass","_withDirectives","TableBtns","VirtualEngine","$slots","_cache","ColumnItem","ElPagination","$event","EsTable","app","getNestedValue","path","setNestedValue","lastKey","current","useFormInputs","hFn","ElInput","ElSelect","opt","idx","ElOption","ElDatePicker","ElTimePicker","ElSlider","ElColorPicker","ElTransfer","ElCascader","ElRadioGroup","ElRadio","ElCheckboxGroup","ElSwitch","ElRate","_model","uploadProps","httpRequest","triggerRender","fileRender","restRow","uploadInstance","elUploadProps","handler","file","ElUpload","useFormLayout","folded","isBtnHidden","rowLayout","formLayout","getSetOptionsStatus","getRowColsAlgorithm","pre","groupArrayList","columnRows","formItems","statIndex","columRowIndexs","rowColIndex","_","isFold","minFoldRow","getBtnColSpan","rowNum","columnRow","lastColumn","btnColSpan","hasSpan","sum","formItem","columnNodeIndex","lastFoldIndex","useFormRequest","httpRequestGlobal","option","_params","initFormParams","requestPayload","configFormField","fieldFieldOutput","configFieldOut","configDataOption","rowValue","resultData","httpRequestFormInstance","configRows","rowsList","apiUrlList","apiResult","wrappedPromises","promiseThen","data","listenToCallBack","listData","newListOptions","getAppendToElement","appendTo","initInstance","Component","container","appContext","vNode","createVNode","useDialog","EsDialog","close","DialogComponent","dialogOptions","originalOnClosed","originalOnSubmit","args","closeFn","destroy","mergedOptions","__default__","$esPlusForm","translateLabel","injectedTableInstant","getTableInstant","ctx","isParentTable","extendedIcon","ElementPlusIconsVue","getCompIcon","filterOptions","icon","refs","formItemRowsList","setFormRef","formInputComponents","fieldFieldOutputGlobal","getEveryFormQueryField","formLayoutRef","formProps","loadedApiProps","needLoadList","existing","old","resultApiOption","formItemListFilter","visible","autoCount","autoSpan","fixedTotal","remaining","changeFolded","colRightLeftList","isRenderBtn","clickBtn","queryTableRequest","formRef","initFormItemOptions","opts","style","createDialogInstance","customerForm","customerTable","handleRefresh","getFormRowsFun","_text","getCustomerTableInfo","handleCustomerForm","formRows","_instance","handleTableItemOption","RenderBtn","formItemList","formModel","RenderDomForm","formItmeRequestInstance","propsList","targetItems","itemIndex","getFormRef","ElForm","ElCol","_vShow","ElFormItem","inx","ElDropdown","ElDropdownMenu","ElDropdownItem","EsForm","attrs","extended","lyFormInstance","renderBodyRefsObject","isFullscreen","dialogInstance","closeFullscreen","handleFullscreen","handleClose","beforeClose","filteredAttrs","initDialogCls","getMaxContentHeight","viewH","initDialogHeight","dialogVisible","getCurrentInstanceModel","RenderJsx","CopyDocument","FullScreen","Close","queryModel","items","paginationState","normalizedDialogs","dialogBase","actions","normalizedToolbarBtns","btns","normalizedOperationColumn","a","mergedFormBtns","baseBtns","toolbarBtns","resolvedBtn","handleToolbarBtnClick","mergedColumns","opCol","actionBtns","handleRowBtnClick","normalizedTableBtns","tBtns","formLayoutProps","msg","ElMessageBox","openDialog","refresh","dialogInstances","dialogConfig","dialog","configBtn","resolveDialogBtns","inst","closeDialog","registerRef","getRefs","validateAndConfirm","dialogForm","context","legacyKey","$attrs","slotData","_guardReactiveProps","EsCrudPage","isExternal","isExternals","iconName","svgClass","styleExternalIcon","SvgIcon","components","install","component","version"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"es-plus.umd.cjs","sources":["../../../node_modules/element-plus/es/locale/lang/zh-cn.mjs","../src/components/es-dialog/src/render-jsx.vue","../src/config.ts","../src/components/es-table/src/column-item.vue","../src/components/es-table/src/table-btns.vue","../src/components/es-table/src/engines/use-column-adapter.ts","../src/components/es-table/src/engines/use-virtual-selection.ts","../src/components/es-table/src/engines/use-virtual-sort.ts","../src/components/es-table/src/engines/virtual-engine.vue","../src/composables/use-table-resize.ts","../src/composables/use-table-selection.ts","../src/utils/shared.ts","../src/components/es-table/src/component.vue","../src/components/es-table/index.ts","../src/composables/use-form-inputs.ts","../src/composables/use-form-layout.ts","../src/composables/use-form-request.ts","../src/components/es-dialog/src/use-dialog.ts","../src/components/es-form/src/es-form.vue","../src/components/es-form/index.ts","../src/components/es-dialog/src/component.vue","../src/components/es-dialog/index.ts","../src/components/es-crud-page/src/es-crud-page.vue","../src/components/es-crud-page/index.ts","../src/components/svg-icon/src/svg-icon.vue","../src/components/svg-icon/index.ts","../src/index.ts"],"sourcesContent":["//#region ../../packages/locale/lang/zh-cn.ts\nvar zh_cn_default = {\n\tname: \"zh-cn\",\n\tel: {\n\t\tbreadcrumb: { label: \"面包屑\" },\n\t\tcolorpicker: {\n\t\t\tconfirm: \"确定\",\n\t\t\tclear: \"清空\",\n\t\t\tdefaultLabel: \"颜色选择器\",\n\t\t\tdescription: \"当前颜色 {color},按 Enter 键选择新颜色\",\n\t\t\talphaLabel: \"选择透明度的值\",\n\t\t\talphaDescription: \"透明度 {alpha}, 当前颜色 {color}\",\n\t\t\thueLabel: \"选择色相值\",\n\t\t\thueDescription: \"色相 {hue}, 当前颜色 {color}\",\n\t\t\tsvLabel: \"选择饱和度与明度的值\",\n\t\t\tsvDescription: \"饱和度 {saturation}, 明度 {brightness}, 当前颜色 {color}\",\n\t\t\tpredefineDescription: \"选择 {value} 作为颜色\"\n\t\t},\n\t\tdatepicker: {\n\t\t\tnow: \"此刻\",\n\t\t\ttoday: \"今天\",\n\t\t\tcancel: \"取消\",\n\t\t\tclear: \"清空\",\n\t\t\tconfirm: \"确定\",\n\t\t\tdateTablePrompt: \"使用方向键与 Enter 键可选择日期\",\n\t\t\tmonthTablePrompt: \"使用方向键与 Enter 键可选择月份\",\n\t\t\tyearTablePrompt: \"使用方向键与 Enter 键可选择年份\",\n\t\t\tselectedDate: \"已选日期\",\n\t\t\tselectDate: \"选择日期\",\n\t\t\tselectTime: \"选择时间\",\n\t\t\tstartDate: \"开始日期\",\n\t\t\tstartTime: \"开始时间\",\n\t\t\tendDate: \"结束日期\",\n\t\t\tendTime: \"结束时间\",\n\t\t\tprevYear: \"前一年\",\n\t\t\tnextYear: \"后一年\",\n\t\t\tprevMonth: \"上个月\",\n\t\t\tnextMonth: \"下个月\",\n\t\t\tyear: \"年\",\n\t\t\tmonth1: \"1 月\",\n\t\t\tmonth2: \"2 月\",\n\t\t\tmonth3: \"3 月\",\n\t\t\tmonth4: \"4 月\",\n\t\t\tmonth5: \"5 月\",\n\t\t\tmonth6: \"6 月\",\n\t\t\tmonth7: \"7 月\",\n\t\t\tmonth8: \"8 月\",\n\t\t\tmonth9: \"9 月\",\n\t\t\tmonth10: \"10 月\",\n\t\t\tmonth11: \"11 月\",\n\t\t\tmonth12: \"12 月\",\n\t\t\tweeks: {\n\t\t\t\tsun: \"日\",\n\t\t\t\tmon: \"一\",\n\t\t\t\ttue: \"二\",\n\t\t\t\twed: \"三\",\n\t\t\t\tthu: \"四\",\n\t\t\t\tfri: \"五\",\n\t\t\t\tsat: \"六\"\n\t\t\t},\n\t\t\tweeksFull: {\n\t\t\t\tsun: \"星期日\",\n\t\t\t\tmon: \"星期一\",\n\t\t\t\ttue: \"星期二\",\n\t\t\t\twed: \"星期三\",\n\t\t\t\tthu: \"星期四\",\n\t\t\t\tfri: \"星期五\",\n\t\t\t\tsat: \"星期六\"\n\t\t\t},\n\t\t\tmonths: {\n\t\t\t\tjan: \"一月\",\n\t\t\t\tfeb: \"二月\",\n\t\t\t\tmar: \"三月\",\n\t\t\t\tapr: \"四月\",\n\t\t\t\tmay: \"五月\",\n\t\t\t\tjun: \"六月\",\n\t\t\t\tjul: \"七月\",\n\t\t\t\taug: \"八月\",\n\t\t\t\tsep: \"九月\",\n\t\t\t\toct: \"十月\",\n\t\t\t\tnov: \"十一月\",\n\t\t\t\tdec: \"十二月\"\n\t\t\t}\n\t\t},\n\t\tinputNumber: {\n\t\t\tdecrease: \"减少数值\",\n\t\t\tincrease: \"增加数值\"\n\t\t},\n\t\tselect: {\n\t\t\tloading: \"加载中\",\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tnoData: \"无数据\",\n\t\t\tplaceholder: \"请选择\"\n\t\t},\n\t\tmention: { loading: \"加载中\" },\n\t\tdropdown: { toggleDropdown: \"切换下拉选项\" },\n\t\tcascader: {\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tloading: \"加载中\",\n\t\t\tplaceholder: \"请选择\",\n\t\t\tnoData: \"暂无数据\"\n\t\t},\n\t\tpagination: {\n\t\t\tgoto: \"前往\",\n\t\t\tpagesize: \"条/页\",\n\t\t\ttotal: \"共 {total} 条\",\n\t\t\tpageClassifier: \"页\",\n\t\t\tpage: \"页\",\n\t\t\tprev: \"上一页\",\n\t\t\tnext: \"下一页\",\n\t\t\tcurrentPage: \"第 {pager} 页\",\n\t\t\tprevPages: \"向前 {pager} 页\",\n\t\t\tnextPages: \"向后 {pager} 页\",\n\t\t\tdeprecationWarning: \"你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档\"\n\t\t},\n\t\tdialog: { close: \"关闭此对话框\" },\n\t\tdrawer: { close: \"关闭此对话框\" },\n\t\tmessagebox: {\n\t\t\ttitle: \"提示\",\n\t\t\tconfirm: \"确定\",\n\t\t\tcancel: \"取消\",\n\t\t\terror: \"输入的数据不合法!\",\n\t\t\tclose: \"关闭此对话框\"\n\t\t},\n\t\tupload: {\n\t\t\tdeleteTip: \"按 Delete 键可删除\",\n\t\t\tdelete: \"删除\",\n\t\t\tpreview: \"查看图片\",\n\t\t\tcontinue: \"继续上传\"\n\t\t},\n\t\tslider: {\n\t\t\tdefaultLabel: \"滑块介于 {min} 至 {max}\",\n\t\t\tdefaultRangeStartLabel: \"选择起始值\",\n\t\t\tdefaultRangeEndLabel: \"选择结束值\"\n\t\t},\n\t\ttable: {\n\t\t\temptyText: \"暂无数据\",\n\t\t\tconfirmFilter: \"筛选\",\n\t\t\tresetFilter: \"重置\",\n\t\t\tclearFilter: \"全部\",\n\t\t\tsumText: \"合计\",\n\t\t\tselectAllLabel: \"选择所有行\",\n\t\t\tselectRowLabel: \"选择当前行\",\n\t\t\texpandRowLabel: \"展开当前行\",\n\t\t\tcollapseRowLabel: \"收起当前行\",\n\t\t\tsortLabel: \"按 {column} 排序\",\n\t\t\tfilterLabel: \"按 {column} 过滤\"\n\t\t},\n\t\ttag: { close: \"关闭此标签\" },\n\t\ttour: {\n\t\t\tnext: \"下一步\",\n\t\t\tprevious: \"上一步\",\n\t\t\tfinish: \"结束导览\",\n\t\t\tclose: \"关闭此对话框\"\n\t\t},\n\t\ttree: { emptyText: \"暂无数据\" },\n\t\ttransfer: {\n\t\t\tnoMatch: \"无匹配数据\",\n\t\t\tnoData: \"无数据\",\n\t\t\ttitles: [\"列表 1\", \"列表 2\"],\n\t\t\tfilterPlaceholder: \"请输入搜索内容\",\n\t\t\tnoCheckedFormat: \"共 {total} 项\",\n\t\t\thasCheckedFormat: \"已选 {checked}/{total} 项\"\n\t\t},\n\t\timage: { error: \"加载失败\" },\n\t\tpageHeader: { title: \"返回\" },\n\t\tpopconfirm: {\n\t\t\tconfirmButtonText: \"确定\",\n\t\t\tcancelButtonText: \"取消\"\n\t\t},\n\t\tcarousel: {\n\t\t\tleftArrow: \"上一张幻灯片\",\n\t\t\trightArrow: \"下一张幻灯片\",\n\t\t\tindicator: \"幻灯片切换至索引 {index}\"\n\t\t},\n\t\tinputOTP: {\n\t\t\tgroupLabel: \"一次性密码输入框\",\n\t\t\tdefaultLabel: \"请输入第 {index} 位 OTP 字符\"\n\t\t}\n\t}\n};\n//#endregion\nexport { zh_cn_default as default };\n\n//# sourceMappingURL=zh-cn.mjs.map","<script >\nimport { defineComponent, h, reactive, isVNode, onMounted, onUpdated } from 'vue'\nimport { ElConfigProvider } from \"element-plus\"\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\n\nexport default defineComponent({\n name: 'RenderJsx',\n props: {\n refs: { type: [Function, Object], default: null },\n row: { type: Object, default: () => ({}) },\n render: { type: Function, default: () => {} },\n model: { type: Object, default: () => ({}) },\n instance: { type: Object, default: () => ({}) },\n components: { type: Object, default: () => ({}) },\n locale: { type: Object, default: null }\n },\n setup(props) {\n const refsObject = (props.refs && typeof props.refs === 'object') ? props.refs : reactive({})\n\n function getRawRef(vnodeRef) {\n if (!vnodeRef) return null\n if (typeof vnodeRef === 'function') return vnodeRef\n if (vnodeRef.r) {\n if (typeof vnodeRef.r === 'function') return vnodeRef.r\n if (vnodeRef.r && typeof vnodeRef.r === 'object' && 'value' in vnodeRef.r) {\n const refObj = vnodeRef.r\n return (val) => { refObj.value = val }\n }\n }\n return null\n }\n\n // Store the component VNode and user ref callback to use after mount\n let componentVNode = null\n let userRefCallback = null\n\n function flushRef() {\n if (!componentVNode) return\n const instance = componentVNode.component\n if (!instance) return\n // Use .exposed first — template refs on components with defineExpose\n // receive instance.exposed, not instance.proxy\n const comp = instance.exposed || instance.proxy\n if (!comp) return\n refsObject.currentRef = comp\n if (typeof userRefCallback === 'function') {\n userRefCallback(comp)\n }\n }\n\n onMounted(() => flushRef())\n onUpdated(() => flushRef())\n\n return () => {\n const { instance } = props\n const enhancedInstance = {\n ...instance,\n registerRef: (name, el) => {\n if (el !== null && el !== undefined) {\n refsObject[name] = el\n }\n },\n getRefs: () => refsObject\n }\n\n const renderContent = props.render(h, enhancedInstance, props.components || {}) || ''\n\n if (typeof renderContent === 'string') {\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h('span', {\n ref: (e) => { refsObject.currentRef = e }\n }, renderContent))\n }\n\n if (isVNode(renderContent)) {\n const isComponent = typeof renderContent.type !== 'string'\n if (isComponent) {\n componentVNode = renderContent\n userRefCallback = getRawRef(renderContent.ref) || getRawRef(renderContent.props?.ref)\n return renderContent\n }\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h('div', {\n ref: (e) => { refsObject.currentRef = e }\n }, [renderContent]))\n }\n\n componentVNode = null\n return h(ElConfigProvider, {\n locale: props.locale || zhCn\n }, () => h(renderContent, {\n ref: (e) => { refsObject.currentRef = e }\n }))\n }\n }\n})\n</script>\n","export interface EsPlusGlobalConfig {\r\n EsTable?: Record<string, unknown>\r\n EsForm?: Record<string, unknown>\r\n EsDialog?: Record<string, unknown>\r\n permission?: (value: string) => boolean\r\n t?: (key: string) => string\r\n [key: string]: unknown\r\n}\r\n\r\nlet globalConfig: EsPlusGlobalConfig = {}\r\n\r\nexport function configureEsPlus(options: EsPlusGlobalConfig): void {\r\n globalConfig = { ...globalConfig, ...options }\r\n}\r\n\r\nexport function getGlobalConfig(): EsPlusGlobalConfig {\r\n return globalConfig\r\n}\r\n","<template>\r\n <!-- 分组列处理 -->\r\n <el-table-column v-if=\"cols.groups && Array.isArray(cols.groups)\" v-bind=\"columnBindAttr(cols)\">\r\n <el-table-column\r\n v-for=\"(item, index) in cols.groups\"\r\n :key=\"item.prop || item.key || index\"\r\n v-bind=\"columnBindAttr({ ...item, columnIndex: index })\"\r\n >\r\n <template v-if=\"item.render && typeof item.render === 'function'\" #default=\"scope\">\r\n <render-dom-tb\r\n v-if=\"scope && scope.row\"\r\n :row=\"scope.row\"\r\n :index=\"scope.$index\"\r\n :data-key=\"item.key\"\r\n :render=\"item.render\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n <template v-else-if=\"item.scopedSlots && item.scopedSlots.customRender\" #default=\"scope\">\r\n <slot\r\n v-if=\"scope && scope.row\"\r\n v-bind=\"{ ...item, row: scope.row, column: scope.column, scope: scope }\"\r\n :name=\"item.scopedSlots.customRender\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n </el-table-column>\r\n\r\n <!-- 自定义渲染函数列 -->\r\n <el-table-column v-else-if=\"cols.render && typeof cols.render === 'function'\" v-bind=\"columnBindAttr(cols)\">\r\n <template #default=\"scope\">\r\n <render-dom-tb\r\n v-if=\"scope && scope.row\"\r\n :row=\"scope.row\"\r\n :index=\"scope.$index\"\r\n :data-key=\"cols.key\"\r\n :render=\"cols.render\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 作用域插槽列 -->\r\n <el-table-column v-else-if=\"cols.scopedSlots && cols.scopedSlots.customRender\" v-bind=\"columnBindAttr(cols)\">\r\n <template #default=\"scope\">\r\n <slot\r\n v-if=\"scope && scope.row\"\r\n v-bind=\"{ ...cols, row: scope.row, column: scope.column, scope: scope }\"\r\n :name=\"cols.scopedSlots.customRender\"\r\n />\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 省略号工具提示列 -->\r\n <el-table-column v-else-if=\"cols.ellipsis && typeof cols.ellipsis === 'boolean'\" show-overflow-tooltip v-bind=\"columnBindAttr(cols)\" />\r\n\r\n <!-- 普通列 -->\r\n <el-table-column v-else v-bind=\"columnBindAttr(cols)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { h, defineComponent, inject } from 'vue'\r\nimport { ElTableColumn } from 'element-plus'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport type { TableColumn } from '../../../types'\r\n\r\nconst props = defineProps<{\r\n cols: TableColumn\r\n}>()\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\n// 函数式组件定义\r\nconst RenderDomTb = defineComponent({\r\n props: {\r\n row: { type: Object, default: () => ({}) },\r\n index: { type: Number, default: 0 },\r\n dataKey: String,\r\n render: { type: Function, required: true }\r\n },\r\n setup(props) {\r\n return () => {\r\n const { row, index, dataKey, render } = props\r\n if (!row) return h('span', '-')\r\n const value = dataKey ? row[dataKey] : null\r\n try {\r\n const renderResult = render(h, { value, row, index })\r\n if (typeof renderResult === 'string') return h('span', renderResult)\r\n return renderResult\r\n } catch (error) {\r\n return h('span', '-')\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst firstWordUpperCase = (str: string): string => {\r\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\r\n}\r\n\r\nconst columnBindAttr = (cols: TableColumn) => {\r\n const options: Record<string, unknown> = {}\r\n\r\n for (const t in cols) {\r\n if (t === 'groups' || t === 'scopedSlots' || t === 'render') continue\r\n\r\n if (t.includes('-')) {\r\n const parts = t.split('-')\r\n let camelKey = parts[0]\r\n for (let i = 1; i < parts.length; i++) {\r\n camelKey += firstWordUpperCase(parts[i])\r\n }\r\n options[camelKey] = cols[t]\r\n } else if (t === 'key') {\r\n options.prop = cols[t]\r\n options[t] = cols[t]\r\n } else if (t === 'label' && cols.labelKey && typeof esPlus.t === 'function') {\r\n options.label = (esPlus.t as (k: string) => string)(cols.labelKey)\r\n } else {\r\n options[t] = cols[t]\r\n }\r\n }\r\n\r\n if (!options.align) {\r\n options.align = 'center'\r\n }\r\n\r\n return options\r\n}\r\n</script>\r\n","<template>\r\n <div v-if=\"showContainer\" class=\"flex-float btns\">\r\n <div class=\"left-text\">\r\n {{ leftText }}\r\n </div>\r\n\r\n <div class=\"btn-container_block\">\r\n <!-- 左侧按钮组 -->\r\n <div class=\"btn-left\">\r\n <template v-for=\"(item, index) in processedBtnLeft\" :key=\"item.name\">\r\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\r\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\r\n <el-button v-else :type=\"(item.type as any)\" :size=\"(item.size as any) || 'small'\" :icon=\"(item.icon as any)\" :loading=\"(item.loading as any) || false\" v-bind=\"item\" :disabled=\"getDisabledState(item)\" @click=\"()=>(item.click as any)(instance)\">\r\n {{ item.name }}\r\n </el-button>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 右侧按钮组 -->\r\n <div class=\"btn-right\">\r\n <template v-for=\"(item, index) in processedBtnRight\" :key=\"item.name\">\r\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\r\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\r\n <el-button v-else :type=\"(item.type as any)\" :size=\"(item.size as any) || 'small'\" v-bind=\"item\" :icon=\"(item.icon as any)\" :loading=\"(item.loading as any) || false\" :disabled=\"getDisabledState(item)\" @click=\"() =>(item.click as any)(instance)\">\r\n {{ item.name }}\r\n </el-button>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, h, inject } from 'vue'\r\nimport { ElButton } from 'element-plus'\r\nimport { getGlobalConfig } from '../../../config'\r\n\r\nconst props = defineProps<{\r\n leftText?: string\r\n btnConfig?: Array<Record<string, unknown>>\r\n instance?: Record<string, unknown>\r\n}>()\r\n\r\nconst RenderDom = (props: { render: Function }) => {\r\n if (!props.render || typeof props.render !== 'function') return null\r\n try {\r\n return props.render()\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nRenderDom.props = {\r\n render: { type: Function, required: true }\r\n}\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst hasPermission = (_btnList: unknown[], pvalue?: string) => {\r\n if (!pvalue) return true\r\n const permFn = esPlus.permission\r\n if (typeof permFn === 'function') return (permFn as (v: string) => boolean)(pvalue)\r\n return true\r\n}\r\n\r\nconst processButtonConfig = (config: Array<Record<string, unknown>>) => {\r\n return config.map((item) => {\r\n const processed = { ...item }\r\n const hasPerm = hasPermission([], item.permissionValue as string)\r\n\r\n if (!hasPerm) {\r\n processed.isHide = true\r\n } else if (typeof item.isHide === 'function') {\r\n processed.isHide = item.isHide()\r\n } else {\r\n processed.isHide = item.isHide || false\r\n }\r\n\r\n return processed\r\n })\r\n}\r\n\r\nconst processedBtnLeft = computed(() => {\r\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 1)).filter((item) => !item.isHide)\r\n})\r\n\r\nconst processedBtnRight = computed(() => {\r\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 2)).filter((item) => !item.isHide)\r\n})\r\n\r\nconst showContainer = computed(() => {\r\n return props.leftText || processedBtnLeft.value.length > 0 || processedBtnRight.value.length > 0\r\n})\r\n\r\nconst getDisabledState = (item: Record<string, unknown>): boolean => {\r\n if (typeof item.disabled === 'function') {\r\n return (item.disabled as () => boolean)()\r\n }\r\n return (item.disabled as boolean) || false\r\n}\r\n\r\nconst buttonContainerStyle = (index: number) => {\r\n return {\r\n display: 'inline-block',\r\n marginLeft: index !== 0 ? '8px' : '0px'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.btns {\r\n padding: 0;\r\n padding-bottom: 5px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.left-text {\r\n color: rgb(125, 125, 125);\r\n font-size: 14px;\r\n // flex-grow: 1;\r\n}\r\n\r\n.btn-container_block {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex: 1;\r\n\r\n .btn-left {\r\n display: flex;\r\n justify-content: flex-start;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .btn-right {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .btns {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n }\r\n\r\n .btn-container_block {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 10px;\r\n\r\n .btn-left,\r\n .btn-right {\r\n width: 100%;\r\n justify-content: flex-start;\r\n }\r\n }\r\n}\r\n</style>\r\n","import { computed, h, ref, type Ref, type Slots, type VNode } from 'vue'\r\nimport { ElCheckbox, ElIcon, ElTooltip } from 'element-plus'\r\nimport type { TableColumn } from '../../../../types'\r\n\r\nexport interface VirtualColumn {\r\n key: string\r\n dataKey: string\r\n title: string\r\n width: number\r\n fixed?: true | 'left' | 'right'\r\n sortable?: boolean\r\n align?: 'left' | 'center' | 'right'\r\n cellRenderer?: (params: CellRendererParams) => any\r\n headerCellRenderer?: (params: HeaderCellRendererParams) => any\r\n}\r\n\r\ninterface CellRendererParams {\r\n cellData: unknown\r\n column: VirtualColumn\r\n columnIndex: number\r\n rowData: Record<string, unknown>\r\n rowIndex: number\r\n}\r\n\r\ninterface HeaderCellRendererParams {\r\n column: VirtualColumn\r\n columns: VirtualColumn[]\r\n columnIndex: number\r\n headerIndex: number\r\n}\r\n\r\nexport interface ColumnAdapterOptions {\r\n multiSelect?: boolean\r\n snIndex?: boolean\r\n expand?: boolean\r\n selectedKeys: Ref<Set<string>>\r\n allSelected: Ref<boolean>\r\n indeterminate: Ref<boolean>\r\n onSelectAll: (val: boolean) => void\r\n onSelectRow: (rowKey: string, val: boolean) => void\r\n rowkey: string\r\n parentSlots?: Slots\r\n t?: (key: string) => string\r\n expandedKeys?: Ref<Set<string>>\r\n onToggleExpand?: (rowKey: string) => void\r\n}\r\n\r\nconst DEFAULT_WIDTH = 150\r\n\r\nexport function useColumnAdapter(\r\n columns: Ref<TableColumn[]>,\r\n options: ColumnAdapterOptions\r\n): Ref<VirtualColumn[]> {\r\n return computed(() => {\r\n const result: VirtualColumn[] = []\r\n const hasSelectionCol = columns.value.some(c => c.type === 'selection')\r\n const hasIndexCol = columns.value.some(c => c.type === 'index')\r\n const hasExpandCol = columns.value.some(c => c.type === 'expand')\r\n\r\n // options.multiSelect 注入选择列(仅当 columns 中没有 type:'selection' 时)\r\n if (options.multiSelect && !hasSelectionCol) {\r\n result.push(createSelectionColumn(options))\r\n }\r\n\r\n // options.expand 注入展开列(仅当 columns 中没有 type:'expand' 时)\r\n if (options.expand && !hasExpandCol) {\r\n result.push(createExpandColumn(options))\r\n }\r\n\r\n // options.snIndex 注入序号列(仅当 columns 中没有 type:'index' 时)\r\n if (options.snIndex && !hasIndexCol) {\r\n result.push(createIndexColumn())\r\n }\r\n\r\n for (const col of columns.value) {\r\n if (col.type === 'selection') {\r\n result.push(createSelectionColumn(options, col))\r\n continue\r\n }\r\n if (col.type === 'index') {\r\n result.push(createIndexColumn(col))\r\n continue\r\n }\r\n if (col.type === 'expand') {\r\n result.push(createExpandColumn(options, col))\r\n continue\r\n }\r\n\r\n if (col.groups && col.groups.length > 0) {\r\n for (const child of col.groups) {\r\n result.push(adaptColumn(child, options))\r\n }\r\n } else {\r\n result.push(adaptColumn(col, options))\r\n }\r\n }\r\n\r\n return result\r\n })\r\n}\r\n\r\nfunction adaptColumn(col: TableColumn, options: ColumnAdapterOptions): VirtualColumn {\r\n const key = (col.prop || col.key || '') as string\r\n const title = col.labelKey && options.t\r\n ? options.t(col.labelKey as string)\r\n : (col.label || '') as string\r\n\r\n const width = typeof col.width === 'number'\r\n ? col.width\r\n : typeof col.width === 'string'\r\n ? parseInt(col.width, 10) || DEFAULT_WIDTH\r\n : typeof col.minWidth === 'number'\r\n ? col.minWidth\r\n : typeof col.minWidth === 'string'\r\n ? parseInt(col.minWidth, 10) || DEFAULT_WIDTH\r\n : DEFAULT_WIDTH\r\n\r\n const base: VirtualColumn = {\r\n key,\r\n dataKey: key,\r\n title,\r\n width,\r\n align: (col.align as VirtualColumn['align']) || 'center',\r\n }\r\n\r\n if (col.fixed) {\r\n base.fixed = col.fixed === true ? 'left' : col.fixed as 'left' | 'right'\r\n }\r\n\r\n if (col.sortable) {\r\n base.sortable = true\r\n }\r\n\r\n if (col.render) {\r\n base.cellRenderer = createRenderCellRenderer(col)\r\n } else if (col.scopedSlots?.customRender && options.parentSlots) {\r\n base.cellRenderer = createSlotCellRenderer(col, options.parentSlots)\r\n } else if (col.ellipsis) {\r\n base.cellRenderer = createEllipsisCellRenderer(col)\r\n } else if (col.formatter) {\r\n base.cellRenderer = createFormatterCellRenderer(col)\r\n }\r\n\r\n return base\r\n}\r\n\r\nfunction createSelectionColumn(options: ColumnAdapterOptions, col?: TableColumn): VirtualColumn {\r\n const width = typeof col?.width === 'number' ? col.width\r\n : typeof col?.width === 'string' ? parseInt(col.width, 10) || 50\r\n : 50\r\n const fixed = col?.fixed != null\r\n ? (col.fixed === true ? 'left' : col.fixed as 'left' | 'right')\r\n : 'left'\r\n return {\r\n key: '__selection__',\r\n dataKey: '__selection__',\r\n title: '',\r\n width,\r\n fixed,\r\n align: 'center',\r\n cellRenderer: ({ rowData }) => {\r\n const rowKey = String(rowData[options.rowkey] ?? '')\r\n const checked = options.selectedKeys.value.has(rowKey)\r\n return h(ElCheckbox, {\r\n modelValue: checked,\r\n 'onUpdate:modelValue': (val: boolean) => options.onSelectRow(rowKey, val),\r\n onClick: (e: Event) => e.stopPropagation(),\r\n })\r\n },\r\n headerCellRenderer: () => {\r\n return h(ElCheckbox, {\r\n modelValue: options.allSelected.value,\r\n indeterminate: options.indeterminate.value,\r\n 'onUpdate:modelValue': (val: boolean) => options.onSelectAll(val),\r\n })\r\n },\r\n }\r\n}\r\n\r\nfunction createIndexColumn(col?: TableColumn): VirtualColumn {\r\n return {\r\n key: '__index__',\r\n dataKey: '__index__',\r\n title: (col?.label as string) || '#',\r\n width: typeof col?.width === 'number' ? col.width : 60,\r\n align: 'center',\r\n cellRenderer: ({ rowIndex }) => h('span', String(rowIndex + 1)),\r\n }\r\n}\r\n\r\nfunction createExpandColumn(options: ColumnAdapterOptions, col?: TableColumn): VirtualColumn {\r\n return {\r\n key: '__expand__',\r\n dataKey: '__expand__',\r\n title: (col?.label as string) || '',\r\n width: typeof col?.width === 'number' ? col.width : 50,\r\n fixed: 'left',\r\n align: 'center',\r\n cellRenderer: ({ rowData }) => {\r\n const rowKey = String(rowData[options.rowkey] ?? '')\r\n const expanded = options.expandedKeys?.value.has(rowKey) ?? false\r\n return h('span', {\r\n class: ['es-virtual-expand-icon', expanded ? 'is-expanded' : ''],\r\n style: {\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n transition: 'transform 0.2s',\r\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\r\n },\r\n onClick: (e: Event) => {\r\n e.stopPropagation()\r\n options.onToggleExpand?.(rowKey)\r\n },\r\n }, h(ElIcon, { size: 14 }, () => h('svg', {\r\n viewBox: '0 0 1024 1024',\r\n width: '1em',\r\n height: '1em',\r\n }, h('path', {\r\n fill: 'currentColor',\r\n d: 'M384 192v640l384-320z',\r\n }))))\r\n },\r\n }\r\n}\r\n\r\nfunction createRenderCellRenderer(col: TableColumn) {\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const renderFn = col.render as (h: typeof import('vue')['h'], ctx: any) => VNode\r\n return renderFn(h, { value: cellData, row: rowData, index: rowIndex })\r\n }\r\n}\r\n\r\nfunction createSlotCellRenderer(col: TableColumn, parentSlots: Slots) {\r\n const slotName = (col.scopedSlots as any).customRender as string\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const slotFn = parentSlots[slotName]\r\n if (slotFn) {\r\n return slotFn({ row: rowData, column: col, scope: { row: rowData, $index: rowIndex }, value: cellData })\r\n }\r\n return h('span', String(cellData ?? ''))\r\n }\r\n}\r\n\r\nfunction createEllipsisCellRenderer(col: TableColumn) {\r\n return ({ cellData, rowData }: CellRendererParams) => {\r\n let text: string\r\n if (col.formatter) {\r\n const formatter = col.formatter as (row: any, column: any, cellValue: any, index: number) => string\r\n text = String(formatter(rowData, col, cellData, 0) ?? '')\r\n } else {\r\n text = String(cellData ?? '')\r\n }\r\n return h(ElTooltip, { content: text, placement: 'top', showAfter: 300 }, {\r\n default: () => h('div', {\r\n style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\r\n }, text)\r\n })\r\n }\r\n}\r\n\r\nfunction createFormatterCellRenderer(col: TableColumn) {\r\n const formatter = col.formatter as (row: any, column: any, cellValue: any, index: number) => string\r\n return ({ cellData, rowData, rowIndex }: CellRendererParams) => {\r\n const formatted = formatter(rowData, col, cellData, rowIndex)\r\n return h('span', String(formatted ?? ''))\r\n }\r\n}\r\n","import { ref, computed, watch, type Ref } from 'vue'\r\n\r\nexport function useVirtualSelection(\r\n dataSource: Ref<Record<string, unknown>[]>,\r\n rowkey: string\r\n) {\r\n const selectedKeys = ref<Set<string>>(new Set())\r\n\r\n // O(1) — 直接比较 Set size 与数据长度\r\n const allSelected = computed(() => {\r\n if (dataSource.value.length === 0) return false\r\n return selectedKeys.value.size === dataSource.value.length\r\n })\r\n\r\n const indeterminate = computed(() => {\r\n const size = selectedKeys.value.size\r\n return size > 0 && size < dataSource.value.length\r\n })\r\n\r\n function onSelectRow(key: string, val: boolean) {\r\n const next = new Set(selectedKeys.value)\r\n if (val) {\r\n next.add(key)\r\n } else {\r\n next.delete(key)\r\n }\r\n selectedKeys.value = next\r\n }\r\n\r\n function onSelectAll(val: boolean) {\r\n if (val) {\r\n const next = new Set(selectedKeys.value)\r\n for (const row of dataSource.value) {\r\n next.add(String(row[rowkey] ?? ''))\r\n }\r\n selectedKeys.value = next\r\n } else {\r\n selectedKeys.value = new Set()\r\n }\r\n }\r\n\r\n function getSelectedRows(): Record<string, unknown>[] {\r\n const keys = selectedKeys.value\r\n if (keys.size === 0) return []\r\n const result: Record<string, unknown>[] = []\r\n for (const row of dataSource.value) {\r\n if (keys.has(String(row[rowkey] ?? ''))) {\r\n result.push(row)\r\n }\r\n if (result.length === keys.size) break\r\n }\r\n return result\r\n }\r\n\r\n function clearSelection() {\r\n selectedKeys.value = new Set()\r\n }\r\n\r\n function toggleRowSelection(row: Record<string, unknown>, selected?: boolean) {\r\n const key = String(row[rowkey] ?? '')\r\n if (selected === undefined) {\r\n onSelectRow(key, !selectedKeys.value.has(key))\r\n } else {\r\n onSelectRow(key, selected)\r\n }\r\n }\r\n\r\n function restoreSelections(keys: Set<string>) {\r\n selectedKeys.value = new Set(keys)\r\n }\r\n\r\n return {\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectRow,\r\n onSelectAll,\r\n getSelectedRows,\r\n clearSelection,\r\n toggleRowSelection,\r\n restoreSelections,\r\n }\r\n}\r\n","import { ref } from 'vue'\r\nimport type { TableColumn } from '../../../../types'\r\n\r\nexport interface SortState {\r\n key: string\r\n order: 'asc' | 'desc'\r\n}\r\n\r\nexport function useVirtualSort() {\r\n const sortState = ref<SortState | undefined>(undefined)\r\n\r\n function onColumnSort({ key, order }: { key: string | number; order: 'asc' | 'desc' }) {\r\n const k = String(key)\r\n if (sortState.value?.key === k && sortState.value?.order === order) {\r\n sortState.value = undefined\r\n } else {\r\n sortState.value = { key: k, order }\r\n }\r\n }\r\n\r\n function toSortChangePayload(columns: TableColumn[]) {\r\n const key = sortState.value?.key || ''\r\n const order = sortState.value?.order || ''\r\n const col = columns.find(c => (c.prop || c.key) === key)\r\n return {\r\n column: col || null,\r\n prop: key,\r\n order: order === 'asc'\r\n ? 'ascending'\r\n : order === 'desc'\r\n ? 'descending'\r\n : null,\r\n }\r\n }\r\n\r\n return { sortState, onColumnSort, toSortChangePayload }\r\n}\r\n","<template>\r\n <div class=\"es-virtual-table-wrapper\">\r\n <el-auto-resizer :disable-height=\"true\">\r\n <template #default=\"{ width }\">\r\n <el-table-v2\r\n ref=\"tableV2Ref\"\r\n :columns=\"(adaptedColumns as any)\"\r\n :data=\"dataSource\"\r\n :width=\"width || 800\"\r\n :height=\"tableHeight || 400\"\r\n :row-height=\"options.rowHeight || 50\"\r\n :estimated-row-height=\"options.estimatedRowHeight\"\r\n :cache=\"options.overscanCount || 2\"\r\n :row-key=\"options.rowkey || 'id'\"\r\n :sort-by=\"(sortState as any)\"\r\n :header-height=\"headerHeight\"\r\n :class=\"tableClass\"\r\n :row-class=\"rowClassName\"\r\n :row-event-handlers=\"rowEventHandlers\"\r\n :fixed=\"true\"\r\n :scrollbar-always-on=\"true\"\r\n @column-sort=\"handleColumnSort as any\"\r\n />\r\n </template>\r\n </el-auto-resizer>\r\n <div v-if=\"!dataSource || dataSource.length === 0\" class=\"es-virtual-table__empty\">\r\n <slot name=\"empty\">\r\n <div class=\"ant-empty ant-empty-normal\">\r\n <div class=\"ant-empty-image\">\r\n <svg class=\"ant-empty-img-simple\" width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\r\n <ellipse class=\"ant-empty-img-simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\r\n <g class=\"ant-empty-img-simple-g\" fill-rule=\"nonzero\">\r\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\r\n <path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" class=\"ant-empty-img-simple-path\" />\r\n </g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"ant-empty-description\">暂无数据</div>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, toRef, inject } from 'vue'\r\nimport { ElAutoResizer, ElTableV2 } from 'element-plus'\r\nimport type { TableColumn, TableOptions } from '../../../../types'\r\nimport { useColumnAdapter } from './use-column-adapter'\r\nimport { useVirtualSelection } from './use-virtual-selection'\r\nimport { useVirtualSort } from './use-virtual-sort'\r\nimport type { TableEngineExposed } from './types'\r\nimport { getGlobalConfig } from '../../../../config'\r\n\r\nconst props = defineProps<{\r\n columns: TableColumn[]\r\n dataSource: Record<string, unknown>[]\r\n tableHeight: number\r\n options: TableOptions\r\n parentSlots?: Record<string, (...args: any[]) => any>\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n 'sort-change': [payload: { column: any; prop: string; order: string | null }]\r\n 'selection-change': [rows: Record<string, unknown>[]]\r\n 'row-click': [row: Record<string, unknown>, event: Event]\r\n 'row-dblclick': [row: Record<string, unknown>, event: Event]\r\n 'row-contextmenu': [row: Record<string, unknown>, event: Event]\r\n 'expand-change': [row: Record<string, unknown>, expanded: boolean]\r\n}>()\r\n\r\nconst tableV2Ref = ref<InstanceType<typeof ElTableV2> | null>(null)\r\nconst headerHeight = 50\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\nconst tFn = computed(() => (esPlus.t as ((key: string) => string) | undefined) || undefined)\r\n\r\nconst rowkey = computed(() => props.options.rowkey || 'id')\r\nconst dataSourceRef = toRef(props, 'dataSource')\r\nconst columnsRef = toRef(props, 'columns')\r\n\r\nconst {\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectRow,\r\n onSelectAll,\r\n getSelectedRows,\r\n clearSelection,\r\n toggleRowSelection,\r\n} = useVirtualSelection(dataSourceRef, rowkey.value)\r\n\r\nconst { sortState, onColumnSort, toSortChangePayload } = useVirtualSort()\r\n\r\nconst expandedKeys = ref<Set<string>>(new Set())\r\n\r\nfunction onToggleExpand(key: string) {\r\n const next = new Set(expandedKeys.value)\r\n const row = props.dataSource.find(r => String(r[rowkey.value] ?? '') === key)\r\n if (next.has(key)) {\r\n next.delete(key)\r\n if (row) emit('expand-change', row, false)\r\n } else {\r\n next.add(key)\r\n if (row) emit('expand-change', row, true)\r\n }\r\n expandedKeys.value = next\r\n}\r\n\r\nlet selectionChangeTimer: ReturnType<typeof setTimeout> | null = null\r\nfunction emitSelectionChange() {\r\n if (selectionChangeTimer) clearTimeout(selectionChangeTimer)\r\n selectionChangeTimer = setTimeout(() => {\r\n emit('selection-change', getSelectedRows())\r\n }, 0)\r\n}\r\n\r\nconst adaptedColumns = useColumnAdapter(columnsRef, {\r\n multiSelect: !!props.options.multiSelect,\r\n snIndex: !!props.options.snIndex,\r\n expand: !!props.options.expand,\r\n selectedKeys,\r\n allSelected,\r\n indeterminate,\r\n onSelectAll: (val: boolean) => {\r\n onSelectAll(val)\r\n emitSelectionChange()\r\n },\r\n onSelectRow: (key: string, val: boolean) => {\r\n onSelectRow(key, val)\r\n emitSelectionChange()\r\n },\r\n rowkey: rowkey.value,\r\n parentSlots: props.parentSlots,\r\n t: tFn.value,\r\n expandedKeys,\r\n onToggleExpand,\r\n})\r\n\r\nconst tableClass = computed(() => {\r\n const cls: string[] = ['es-virtual-table']\r\n if (props.options.border) cls.push('es-virtual-table--border')\r\n if (props.options.stripe) cls.push('es-virtual-table--stripe')\r\n if (props.options.highlightCurrentRow) cls.push('es-virtual-table--highlight')\r\n return cls.join(' ')\r\n})\r\n\r\nconst currentRowKey = ref<string>('')\r\n\r\nconst rowClassName = computed(() => {\r\n return ({ rowData, rowIndex }: { rowData: Record<string, unknown>; rowIndex: number }) => {\r\n const classes: string[] = []\r\n if (props.options.highlightCurrentRow) {\r\n const key = String(rowData[rowkey.value] ?? '')\r\n if (key === currentRowKey.value) {\r\n classes.push('current-row')\r\n }\r\n }\r\n const rowClassNameOpt = props.options.rowClassName as string | ((params: any) => string) | undefined\r\n if (typeof rowClassNameOpt === 'function') {\r\n const cls = rowClassNameOpt({ row: rowData, rowIndex })\r\n if (cls) classes.push(cls)\r\n } else if (typeof rowClassNameOpt === 'string' && rowClassNameOpt) {\r\n classes.push(rowClassNameOpt)\r\n }\r\n return classes.join(' ')\r\n }\r\n})\r\n\r\nconst rowEventHandlers = computed(() => ({\r\n onClick: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n const key = String(e.rowData[rowkey.value] ?? '')\r\n currentRowKey.value = key\r\n emit('row-click', e.rowData, e.event)\r\n },\r\n onDblclick: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n emit('row-dblclick', e.rowData, e.event)\r\n },\r\n onContextmenu: (e: { rowData: Record<string, unknown>; event: Event }) => {\r\n emit('row-contextmenu', e.rowData, e.event)\r\n },\r\n}))\r\n\r\nfunction handleColumnSort(params: { key: string | number; order: 'asc' | 'desc' }) {\r\n onColumnSort(params)\r\n const payload = toSortChangePayload(props.columns)\r\n emit('sort-change', payload)\r\n}\r\n\r\ndefineExpose<TableEngineExposed>({\r\n getTableRef: () => tableV2Ref.value,\r\n doLayout: () => {},\r\n toggleRowSelection,\r\n clearSelection,\r\n getSelectedRows,\r\n scrollToRow: (row: number) => {\r\n (tableV2Ref.value as any)?.scrollToRow?.(row)\r\n },\r\n})\r\n</script>\r\n\r\n<style>\r\n.es-virtual-table-wrapper {\r\n position: relative;\r\n width: 100%;\r\n}\r\n.es-virtual-table--border .el-table-v2 {\r\n border: 1px solid var(--el-border-color-lighter);\r\n}\r\n.es-virtual-table--border .el-table-v2 .el-table-v2__header-cell,\r\n.es-virtual-table--border .el-table-v2 .el-table-v2__row-cell {\r\n border-right: 1px solid var(--el-border-color-lighter);\r\n border-bottom: 1px solid var(--el-border-color-lighter);\r\n}\r\n.es-virtual-table--stripe .el-table-v2__row:nth-child(even) {\r\n background-color: var(--el-fill-color-lighter);\r\n}\r\n.es-virtual-table--highlight .el-table-v2__row.current-row {\r\n background-color: var(--el-color-primary-light-9) !important;\r\n}\r\n.es-virtual-table--highlight .el-table-v2__row:hover {\r\n background-color: var(--el-fill-color-light);\r\n}\r\n.es-virtual-table__empty {\r\n position: absolute;\r\n top: 50px;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #fff;\r\n z-index: 1;\r\n}\r\n.es-virtual-table__empty .ant-empty-image {\r\n height: 40px;\r\n margin-bottom: 8px;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-ellipse {\r\n fill: #f5f5f5;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-g {\r\n stroke: #d9d9d9;\r\n}\r\n.es-virtual-table__empty .ant-empty-img-simple-path {\r\n fill: #fafafa;\r\n}\r\n.es-virtual-table__empty .ant-empty-description {\r\n color: rgba(0, 0, 0, 0.25);\r\n font-size: 14px;\r\n}\r\n.es-virtual-expand-icon {\r\n color: var(--el-text-color-secondary);\r\n}\r\n.es-virtual-expand-icon:hover {\r\n color: var(--el-color-primary);\r\n}\r\n</style>\r\n","import { ref, nextTick, onMounted, onBeforeUnmount } from 'vue'\n\nexport function useTableResize(\n tableContainerRef: { value: HTMLElement | null },\n headBarRef: { value: HTMLElement | null },\n tbBtnRef: { value: { $el?: HTMLElement } | null },\n paginationRef: { value: HTMLElement | null },\n options: { heightType?: 'auto' | 'height'; tabHeight?: number | string }\n) {\n const tableHeight = ref(400)\n const observer = ref<ResizeObserver | null>(null)\n\n const isNegative = (num: number) => Math.sign(num) === -1\n\n const totalContainerNum = () => {\n const headBarHeight = headBarRef.value?.offsetHeight || 0\n const tbBtnHeight = tbBtnRef.value?.$el?.offsetHeight || 0\n const paginationHeight = paginationRef.value?.offsetHeight || 0\n return Math.round(paginationHeight + headBarHeight + tbBtnHeight)\n }\n\n const resizeObservers = () => {\n const element = tableContainerRef.value\n if (!element) return\n\n const containerHeight = typeof options.tabHeight === 'number'\n ? options.tabHeight\n : options.heightType === 'height'\n ? (element.parentElement?.offsetHeight || element.offsetHeight)\n : (parseInt(options.tabHeight as string, 10) || 450)\n\n const maxContainer = !isNaN(containerHeight) ? containerHeight : 450\n const minTableNum = maxContainer - totalContainerNum()\n const tabContainer = isNegative(minTableNum) ? totalContainerNum() + 300 : maxContainer\n\n const paginationHeight = paginationRef.value?.offsetHeight || 0\n const headBarHeight = headBarRef.value?.offsetHeight || 0\n const tbBtnHeight = tbBtnRef.value?.$el?.offsetHeight || 0\n\n const newHeight = Math.floor(tabContainer) - Math.round(paginationHeight + headBarHeight + tbBtnHeight)\n if (tableHeight.value !== newHeight) {\n tableHeight.value = newHeight\n }\n }\n\n const startObserver = () => {\n nextTick(() => {\n if (!tableContainerRef.value || typeof ResizeObserver === 'undefined') return\n\n observer.value = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n if (tableContainerRef.value) resizeObservers()\n })\n })\n\n // Observe the main container\n const target = options.heightType === 'height'\n ? tableContainerRef.value.parentElement || tableContainerRef.value\n : tableContainerRef.value\n observer.value.observe(target)\n\n // Observe headBarRef to detect form expand/collapse height changes\n if (headBarRef.value) {\n observer.value.observe(headBarRef.value)\n }\n })\n }\n\n const stopObserver = () => {\n if (observer.value) {\n observer.value.disconnect()\n observer.value = null\n }\n }\n\n onMounted(() => startObserver())\n onBeforeUnmount(() => stopObserver())\n\n return {\n tableHeight,\n resizeObservers,\n startObserver,\n stopObserver\n }\n}\n","import { ref, nextTick } from 'vue'\n\nexport function useTableSelection(rowkey?: string) {\n const multipleSelection = ref<Record<string, unknown>[]>([])\n const selectionsByPage = ref<Record<number, Record<string, unknown>[]>>({})\n const isInitChange = ref(false)\n\n const handleSelectionChange = (val: Record<string, unknown>[], currentPage: number) => {\n if (rowkey) {\n if (isInitChange.value) return\n selectionsByPage.value[currentPage] = val\n let allSelections: Record<string, unknown>[] = []\n const uniqueMap: Record<string, boolean> = {}\n\n Object.values(selectionsByPage.value).forEach((pageSelections) => {\n pageSelections.forEach((item) => {\n const key = item[rowkey] as string\n if (key && !uniqueMap[key]) {\n allSelections.push(item)\n uniqueMap[key] = true\n }\n })\n })\n\n multipleSelection.value = allSelections\n } else {\n multipleSelection.value = val\n }\n }\n\n const handleSelectData = (dataList: Record<string, unknown>[], tableRef: { toggleRowSelection?: (row: Record<string, unknown>, selected: boolean) => void }) => {\n if (dataList?.length && rowkey && multipleSelection.value.length) {\n const pageSelecteds: Record<string, unknown>[] = []\n dataList.forEach((row) => {\n multipleSelection.value.forEach((selectedRow) => {\n if (row[rowkey] === selectedRow[rowkey]) {\n pageSelecteds.push(row)\n }\n })\n })\n\n pageSelecteds.forEach((row) => {\n tableRef.toggleRowSelection?.(row, true)\n })\n }\n }\n\n const clearAllSelection = (tableRef: { clearSelection?: () => void }) => {\n multipleSelection.value = []\n selectionsByPage.value = {}\n tableRef.clearSelection?.()\n }\n\n const initSelection = (dataList: Record<string, unknown>[], tableRef: { toggleRowSelection?: (row: Record<string, unknown>, selected: boolean) => void; clearSelection?: () => void } | null) => {\n isInitChange.value = true\n if (!tableRef) {\n isInitChange.value = false\n return\n }\n if (rowkey) {\n nextTick(() => {\n handleSelectData(dataList, tableRef)\n isInitChange.value = false\n })\n } else {\n nextTick(() => {\n tableRef.clearSelection?.()\n isInitChange.value = false\n })\n }\n }\n\n return {\n multipleSelection,\n selectionsByPage,\n isInitChange,\n handleSelectionChange,\n handleSelectData,\n clearAllSelection,\n initSelection\n }\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && Object.prototype.toString.call(value) === '[object Object]'\n}\n\nexport const isArray = (value: unknown): value is unknown[] => {\n return Array.isArray(value)\n}\n\nexport const isFunction = (value: unknown): value is Function => {\n return typeof value === 'function'\n}\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string'\n}\n\nexport const isNumber = (value: unknown): value is number => {\n return typeof value === 'number' && !isNaN(value)\n}\n\nexport const isEmpty = (value: unknown): boolean => {\n if (value == null) return true\n if (isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n}\n\nexport const firstWordUpperCase = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport const kebabToCamel = (str: string): string => {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\nexport const toPascalCase = (str: string): string => {\n return str.replace(/(^|-)([a-z])/g, (_, __, letter) => letter.toUpperCase())\n}\n\nexport const findValueByKey = (obj: Record<string, unknown>, key: string, depth = 0): unknown => {\n if (depth > 3) return undefined\n if (!isObject(obj)) return undefined\n\n const currentValue = Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : undefined\n\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop) && isObject(obj[prop])) {\n const deepValue = findValueByKey(obj[prop] as Record<string, unknown>, key, depth + 1)\n if (deepValue !== undefined) return deepValue\n }\n }\n return currentValue\n}\n\nexport const wrapPromise = <T>(promise: Promise<T>): Promise<{ status: 'fulfilled'; value: T } | { status: 'rejected'; reason: unknown }> => {\n return promise\n .then((value) => ({ status: 'fulfilled' as const, value }))\n .catch((reason) => ({ status: 'rejected' as const, reason }))\n}\n","<template>\r\n <el-config-provider :locale=\"locale\">\r\n <div :ref=\"setTableContainer\" class=\"table_component\" :style=\"{ [heightType]: tabHeight }\">\r\n <div class=\"table_containers\">\r\n <div\r\n v-if=\"showHeaderBar\"\r\n ref=\"headBarRef\"\r\n class=\"btn-slot\"\r\n :style=\"(slotStyles.value && slotStyles.type === 'object' && slotStyles.value) as any\"\r\n :class=\"slotStyles.type === 'string' ? slotStyles.value : { slotClass: slotState && slotStyles.type !== 'object' }\"\r\n >\r\n <div class=\"headerBar\" v-if=\"hasDefaultSlot\" :style=\"{ paddingBottom: hasDefaultSlot ? '10px' : '0px' }\">\r\n <slot />\r\n </div>\r\n </div>\r\n <div v-loading=\"loadStatus\" element-loading-background=\"rgba(0, 0, 0, 0.03)\" element-loading-text=\"努力加载中...\" class=\"page-loading-con tableContainer\">\r\n <div class=\"table_inner_containers\">\r\n <table-btns\r\n ref=\"tbBtnRef\"\r\n :instance=\"{ tableRef: instance, formInstance: formInstance }\"\r\n v-if=\"(options.configBtn && (options.configBtn as any[]).length) || options.leftText\"\r\n :btn-config=\"(options.configBtn as any[])\"\r\n :left-text=\"(options.leftText as string)\"\r\n />\r\n <virtual-engine\r\n v-if=\"isVirtual\"\r\n ref=\"virtualEngineRef\"\r\n :columns=\"filteredColumns\"\r\n :data-source=\"dataSource\"\r\n :table-height=\"tableHeight\"\r\n :options=\"props.options\"\r\n :parent-slots=\"$slots\"\r\n @sort-change=\"changeTableSort\"\r\n @selection-change=\"handleVirtualSelectionChange\"\r\n />\r\n <el-table\r\n v-else\r\n class=\"el-dp_tables\"\r\n :id=\"tableId\"\r\n :key=\"tableId\"\r\n ref=\"tableRef\"\r\n style=\"width: 100%\"\r\n v-bind=\"tableBindAttrs\"\r\n :data=\"dataSource\"\r\n @sort-change=\"changeTableSort\"\r\n @selection-change=\"handleTableSelectionChange\"\r\n >\r\n <template #empty>\r\n <div class=\"ant-empty ant-empty-normal\">\r\n <div class=\"ant-empty-image\">\r\n <svg class=\"ant-empty-img-simple\" width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g transform=\"translate(0 1)\" fill=\"none\" fill-rule=\"evenodd\">\r\n <ellipse class=\"ant-empty-img-simple-ellipse\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" />\r\n <g class=\"ant-empty-img-simple-g\" fill-rule=\"nonzero\">\r\n <path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\" />\r\n <path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" class=\"ant-empty-img-simple-path\" />\r\n </g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"ant-empty-description\">暂无数据</div>\r\n </div>\r\n </template>\r\n <column-item v-for=\"(cols, index) in filteredColumns\" :key=\"cols.prop || cols.key || index\" :cols=\"{ ...cols, columnIndex: index }\">\r\n <template v-if=\"cols.scopedSlots && cols.scopedSlots.customRender\" #[cols.scopedSlots.customRender]=\"{ scope }\">\r\n <slot v-bind=\"{ ...cols, columnIndex: index, row: scope.row, column: scope.column }\" :name=\"cols.scopedSlots.customRender\" :scope=\"scope\" />\r\n </template>\r\n </column-item>\r\n </el-table>\r\n </div>\r\n <div\r\n v-if=\"showPagination\"\r\n ref=\"paginationRef\"\r\n class=\"pagination_page\"\r\n :style=\"{\r\n position: heightType === 'height' ? 'absolute' : 'static',\r\n bottom: '0px',\r\n left: '0px',\r\n zIndex: 5,\r\n background: '#fff'\r\n }\"\r\n >\r\n <el-pagination\r\n :background=\"paginationBackground\"\r\n :size=\"paginationIsSmall ? 'small' : paginationConfig.size\"\r\n :total=\"paginationConfig.total\"\r\n v-model:page-size=\"paginationConfig.pageSize\"\r\n :page-sizes=\"paginationPageSizes\"\r\n v-model:current-page=\"paginationConfig.current\"\r\n :layout=\"layout\"\r\n style=\"padding: 0; margin: 10px 0; text-align: center\"\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleIndexChange\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </el-config-provider>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport type { TableOptions } from '../../../types'\r\n\r\nconst defaultOptions: TableOptions = {\r\n multiSelect: false,\r\n expand: false,\r\n snIndex: false,\r\n loading: false,\r\n border: false,\r\n size: 'small',\r\n headerCellStyle: { background: '#f5f7fa' },\r\n highlightCurrentRow: true,\r\n cachePageSelection: true\r\n}\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, inject, getCurrentInstance, provide, toRaw, unref, h, onMounted, useAttrs } from 'vue'\r\nimport { ElTable, ElConfigProvider, ElPagination, vLoading, ElButton } from 'element-plus'\r\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\r\nimport ColumnItem from './column-item.vue'\r\nimport TableBtns from './table-btns.vue'\r\nimport VirtualEngine from './engines/virtual-engine.vue'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport { useTableResize } from '../../../composables/use-table-resize'\r\nimport { useTableSelection } from '../../../composables/use-table-selection'\r\nimport { isObject, findValueByKey } from '../../../utils/shared'\r\nimport type { TableColumn, PaginationConfig } from '../../../types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n initTabHeight?: number\r\n headBarClass?: string | Record<string, unknown>\r\n showHeaderBar?: boolean\r\n dataSource: Record<string, unknown>[]\r\n columns: TableColumn[]\r\n options?: TableOptions\r\n pagination?: PaginationConfig\r\n }>(),\r\n {\r\n initTabHeight: 400,\r\n showHeaderBar: true,\r\n dataSource: () => [],\r\n columns: () => [],\r\n options: () => ({ ...defaultOptions }),\r\n pagination: () => ({})\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:dataSource': [data: Record<string, unknown>[]]\r\n 'update:pagination': [pagination: PaginationConfig]\r\n 'pagination-current-change': [pagination: PaginationConfig]\r\n 'size-change': [pagination: PaginationConfig, size: number]\r\n 'change-table-sort': [column: Record<string, unknown>]\r\n}>()\r\n\r\nconst slots = defineSlots<{\r\n default?: () => any\r\n}>()\r\n\r\nconst locale = ref(zhCn)\r\nconst injectedLocale = inject('elLocale', null)\r\nif (injectedLocale) {\r\n locale.value = injectedLocale as any\r\n}\r\n\r\nconst instance = getCurrentInstance() as any\r\nconst $esPlusTable = inject<Record<string, unknown>>('$esPlusTable', null) ?? getGlobalConfig().EsTable ?? {}\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\n// 虚拟滚动引擎切换\r\nconst isVirtual = computed(() =>\r\n props.options.virtual === true || props.options.engine === 'virtual'\r\n)\r\nconst virtualEngineRef = ref<InstanceType<typeof VirtualEngine> | null>(null)\r\n\r\n// Refs\r\nconst tableRef = ref<any>(null)\r\nconst tbBtnRef = ref<any>(null)\r\nconst headBarRef = ref<HTMLElement | null>(null)\r\nconst paginationRef = ref<HTMLElement | null>(null)\r\nconst tableContainerRef = ref<HTMLElement | null>(null)\r\nconst tableId = ref(`table_${Math.random().toString(36).substring(2, 12)}`)\r\nconst tableData = ref<Record<string, unknown>[]>([])\r\nconst columnRowList = ref<TableColumn[]>([...props.columns])\r\n\r\nwatch(\r\n () => props.columns,\r\n (val) => {\r\n columnRowList.value = [...val]\r\n },\r\n { deep: true }\r\n)\r\nconst loadingStatus = ref(false)\r\nconst slotState = ref(false)\r\nconst showPagination = ref(false)\r\n\r\nconst setTableContainer = (el: HTMLElement | null) => {\r\n if (el) tableContainerRef.value = el\r\n}\r\n\r\n// 保留与 Form 的耦合\r\nconst bodyFormInstance = inject<(inst: unknown) => void>('bodyFormInstance', () => {})\r\nconst getVisibleShow = inject<(() => boolean) | boolean>('getVisibleShow', false)\r\n\r\nconst visibleShow = computed(() => (typeof getVisibleShow === 'function' ? getVisibleShow() : getVisibleShow))\r\n\r\nconst paginationConfig = ref<PaginationConfig>({\r\n pageSize: 10,\r\n current: 1,\r\n total: 0,\r\n pageSizes: [],\r\n size: 'small',\r\n isSmall: true,\r\n ...props.pagination\r\n})\r\n\r\nconst formInstance = ref<unknown>(null)\r\n\r\n// 计算属性\r\nconst getListEntry = computed(() => {\r\n if (props.options.entryQuery && isObject(props.options.entryQuery) && Object.keys(props.options.entryQuery).length) {\r\n return props.options.entryQuery\r\n }\r\n return {}\r\n})\r\n\r\nconst configTableField = computed(() => {\r\n if (\r\n props.options.configTableOut &&\r\n isObject(props.options.configTableOut) &&\r\n Object.keys(props.options.configTableOut).length &&\r\n checkQueryFields(props.options.configTableOut)\r\n ) {\r\n return props.options.configTableOut\r\n }\r\n\r\n if ($esPlusTable?.configQueryFieldOutput && typeof $esPlusTable.configQueryFieldOutput === 'function') {\r\n const configFields = ($esPlusTable.configQueryFieldOutput as Function)({\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n tableData: 'rows'\r\n })\r\n if (checkQueryFields(configFields)) return configFields\r\n }\r\n\r\n return {\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n tableData: 'rows'\r\n }\r\n})\r\n\r\nconst isFormInstance = computed(() => {\r\n const defaultSlots = instance?.slots?.default?.() || []\r\n const formVNode = defaultSlots.find((vnode: any) => {\r\n const type = vnode.type\r\n return type?.name === 'EsForm' || type?.displayName === 'EsForm'\r\n })\r\n if (formVNode && formVNode.props?.ref) {\r\n formInstance.value = formVNode.ctx?.refs[formVNode.props.ref]\r\n bodyFormInstance(formInstance.value)\r\n }\r\n return formVNode || {}\r\n})\r\n\r\nconst hasDefaultSlot = computed(() => !!slots.default?.())\r\nconst heightType = computed(() => (props.options.heightType || 'auto') as 'auto' | 'height' | 'maxHeight')\r\nconst tabHeight = computed(() => {\r\n if (typeof props.options.tabHeight === 'number') {\r\n return `${props.options.tabHeight}px`\r\n }\r\n if (heightType.value === 'height' && typeof props.options.height === 'number') {\r\n return `${props.options.height}px`\r\n }\r\n return '100%'\r\n})\r\n\r\nconst slotStyles = computed(() => {\r\n if (props.headBarClass) {\r\n return {\r\n type: typeof props.headBarClass === 'string' ? 'string' : 'object',\r\n value: props.headBarClass\r\n }\r\n }\r\n return { type: 'string', value: '' }\r\n})\r\n\r\nconst paginationLayoutConfig = computed(() => {\r\n const cfg = $esPlusTable?.paginationLayout\r\n if (!cfg) return null\r\n return typeof cfg === 'function' ? cfg() : cfg\r\n})\r\nconst layout = computed(() => paginationLayoutConfig.value?.layout || 'prev, pager, next, jumper, sizes, ->, total')\r\nconst paginationPageSizes = computed(() => paginationLayoutConfig.value?.pageSizes || paginationConfig.value.pageSizes)\r\nconst paginationIsSmall = computed(() => paginationLayoutConfig.value?.isSmall ?? paginationConfig.value.isSmall)\r\nconst paginationBackground = computed(() => paginationLayoutConfig.value?.background ?? true)\r\nconst loadStatus = computed(() => props.options.loading || loadingStatus.value)\r\nconst isRequestConf = computed(() => !!props.options.actionUrl || (props.options.apiParams && isObject(props.options.apiParams) && Object.keys(props.options.apiParams).length > 0))\r\nconst isHttpRequest = computed(() => !!props.options?.httpRequest && typeof props.options.httpRequest === 'function')\r\n\r\nconst filteredColumns = computed(() => {\r\n const list = columnRowList.value.filter((item) => !item.hidCol)\r\n list.forEach((el) => {\r\n if (el.prop !== 'operate' && el.key !== 'operate' && (el.prop || el.key) && !el.formatter) {\r\n el.formatter = (row: Record<string, unknown>) => {\r\n const value = row[el.prop as string] || row[el.key as string]\r\n if (value == null || value === '') {\r\n return (el.emptyPlaceholder as string) || '-'\r\n }\r\n return value as string\r\n }\r\n }\r\n\r\n if ((el.prop === 'operate' || el.key === 'operate') && el.btns && !el.render) {\r\n el.render = (_h: any, { row }: { row: Record<string, unknown> }) => {\r\n return h('div', [\r\n el.btns?.filter((btn: any) => checkPermission(btn.permissionValue))\r\n .map((btn: any) =>\r\n h(ElButton, {\r\n onClick: () => btn.clickEvent?.(row),\r\n text: true,\r\n type: btn.type || 'primary'\r\n }, () => btn.name)\r\n )\r\n ])\r\n }\r\n }\r\n })\r\n\r\n // 当所有列都设置了固定 width 且没有 minWidth 时,将最后一个非固定列的 width 转为 minWidth 以填充剩余空间\r\n const allFixedWidth = list.length > 0 && list.every((col) => col.width && !col.minWidth)\r\n if (allFixedWidth) {\r\n let flexIdx = -1\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n const col = list[i]\r\n if (!col.fixed && col.prop !== 'operate' && col.key !== 'operate') {\r\n flexIdx = i\r\n break\r\n }\r\n }\r\n if (flexIdx === -1) flexIdx = list.length - 1\r\n if (flexIdx >= 0) {\r\n const col = list[flexIdx]\r\n col.minWidth = col.width\r\n delete col.width\r\n }\r\n }\r\n\r\n return list\r\n})\r\n\r\n// es-table 内部选项键,不应传递给 el-table\r\nconst TABLE_INTERNAL_KEYS = new Set([\r\n 'multiSelect', 'expand', 'snIndex', 'loading', 'cachePageSelection',\r\n 'httpRequest', 'configTableOut', 'listenToCallBack',\r\n 'apiParams', 'actionUrl', 'heightType', 'tabHeight',\r\n 'isInitRun', 'entryQuery', 'configBtn', 'leftText', 'rowkey',\r\n 'virtual', 'engine', 'rowHeight', 'estimatedRowHeight', 'overscanCount', 'rowClassName'\r\n])\r\n\r\nconst tableAttrs = computed(() => {\r\n const merged = columnBindAttr({ ...defaultOptions, ...props.options })\r\n const { align, ...rest } = merged\r\n const result: Record<string, unknown> = {}\r\n for (const key in rest) {\r\n if (!TABLE_INTERNAL_KEYS.has(key)) {\r\n result[key] = rest[key]\r\n }\r\n }\r\n return result\r\n})\r\n\r\n// 合并 options attrs 和父级 fallthrough attrs,供 el-table 使用\r\nconst fallthroughAttrs = useAttrs()\r\nconst tableBindAttrs = computed(() => {\r\n const result: Record<string, unknown> = { ...tableAttrs.value, ...fallthroughAttrs }\r\n if (props.options.rowkey) {\r\n result.rowKey = props.options.rowkey\r\n }\r\n if (heightType.value === 'height') {\r\n result.height = tableHeight.value\r\n } else if (heightType.value === 'maxHeight') {\r\n result.maxHeight = tableHeight.value\r\n }\r\n return result\r\n})\r\n\r\n// 使用原生 ResizeObserver\r\nconst { tableHeight, resizeObservers } = useTableResize(\r\n tableContainerRef,\r\n headBarRef,\r\n tbBtnRef,\r\n paginationRef,\r\n { heightType: heightType.value as 'auto' | 'height', tabHeight: props.options.tabHeight }\r\n)\r\n\r\nwatch(\r\n visibleShow,\r\n async (val, oldVal) => {\r\n if (val && val !== oldVal) {\r\n if (props.options.actionUrl) {\r\n await httpRequestInstance()\r\n }\r\n tableRef.value?.doLayout?.()\r\n }\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.pagination,\r\n (val) => {\r\n paginationConfig.value = { ...paginationConfig.value, ...val }\r\n showPagination.value = val.total !== undefined\r\n },\r\n { deep: true, immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.dataSource,\r\n (val) => {\r\n initSelection(val, tableRef.value)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n tableData,\r\n (val) => {\r\n if (Array.isArray(val)) {\r\n emit('update:dataSource', val)\r\n }\r\n },\r\n { deep: true }\r\n)\r\n\r\n// 配置化接口请求时,挂载自动加载数据\r\nonMounted(() => {\r\n if (isRequestConf.value && props.options.isInitRun !== false) {\r\n httpRequestInstance()\r\n }\r\n})\r\n\r\n// 表格选择逻辑\r\nconst { multipleSelection, handleSelectionChange, initSelection, clearAllSelection } = useTableSelection(props.options.rowkey)\r\n\r\nconst handleTableSelectionChange = (val: Record<string, unknown>[]) => {\r\n handleSelectionChange(val, paginationConfig.value.current || 1)\r\n}\r\n\r\nconst handleVirtualSelectionChange = (rows: Record<string, unknown>[]) => {\r\n handleSelectionChange(rows, paginationConfig.value.current || 1)\r\n}\r\n\r\n// 请求逻辑\r\nconst checkQueryFields = (obj: Record<string, unknown>): boolean => {\r\n const checkListKey = ['total', 'pageSize', 'current', 'tableData']\r\n if (isObject(obj)) {\r\n return Object.keys(obj).every((it) => {\r\n return checkListKey.find((its) => its === it) && obj[it] && typeof obj[it] === 'string'\r\n })\r\n }\r\n return false\r\n}\r\n\r\nconst getListenToCallBack = (eventName: string, params: unknown) => {\r\n const eventNameList = [\r\n { eventName: 'brcb', isReturn: true },\r\n { eventName: 'qrcb', isReturn: true }\r\n ]\r\n const hasEventNameIndex = eventNameList.findIndex((it) => it.eventName === eventName)\r\n if (props.options.listenToCallBack && props.options.listenToCallBack[eventName] && hasEventNameIndex !== -1) {\r\n const callObj = eventNameList[hasEventNameIndex]\r\n if (callObj.isReturn) {\r\n return props.options.listenToCallBack[eventName](params)\r\n }\r\n }\r\n}\r\n\r\nconst formatConfigOut = (row: Record<string, unknown>, keyList: string[]) => {\r\n if (isObject(configTableField.value) && Object.keys(configTableField.value).length) {\r\n Object.entries(configTableField.value).forEach(([key, value]) => {\r\n const isKeyUsed = keyList.includes(key)\r\n if (!isKeyUsed) return\r\n\r\n const rowData = row[value as string] ?? findValueByKey(row, value as string)\r\n if (key === 'tableData') {\r\n tableData.value = Array.isArray(rowData) ? rowData : []\r\n } else {\r\n ;(paginationConfig.value as any)[key] = typeof rowData === 'number' ? rowData : parseInt(rowData as string, 10) || 0\r\n }\r\n })\r\n }\r\n}\r\n\r\nconst queryTableListMethod = (params: Record<string, unknown>, options: { success?: (res: Record<string, unknown>) => void; fail?: (err: unknown) => void } = {}) => {\r\n const { success, fail } = options\r\n const apiParams = (props.options?.apiParams || {}) as Record<string, any>\r\n const url = props.options?.actionUrl || apiParams.url || ''\r\n\r\n if (!url || !Object.keys(apiParams).length) return\r\n\r\n const formData = Object.keys(isFormInstance.value).length\r\n ? toRaw(unref((isFormInstance.value as any).props.model))\r\n : getListEntry.value || {}\r\n\r\n\r\n const fnParams = getListenToCallBack('brcb', { ...formData, ...params, ...toRaw(unref(apiParams.model || {})) })\r\n const finalParams = isObject(fnParams) ? fnParams : { ...formData, ...toRaw(unref(apiParams.model || {})), ...params }\r\n const requestOption = { ...toRaw(unref(apiParams.options || {})) }\r\n if (apiParams?.method) {\r\n requestOption.method = apiParams?.method\r\n }\r\n\r\n const requestHandler = async (requestFn: Function) => {\r\n if (loadingStatus.value) return\r\n loadingStatus.value = true\r\n console.log('formData///', finalParams)\r\n try {\r\n const res = await requestFn({\r\n url,\r\n formParams: finalParams,\r\n headers: apiParams.headers || {},\r\n ...requestOption,\r\n ...params\r\n })\r\n const responseData = getListenToCallBack('qrcb', res) || res\r\n if (isObject(res) && Object.keys(res).length && typeof success === 'function') {\r\n success(responseData as Record<string, unknown>)\r\n }\r\n } catch (e) {\r\n if (typeof fail === 'function') {\r\n fail(e)\r\n }\r\n } finally {\r\n loadingStatus.value = false\r\n }\r\n }\r\n\r\n if (props.options.httpRequest) {\r\n requestHandler(props.options.httpRequest)\r\n } else if ($esPlusTable.$httpRequest) {\r\n requestHandler($esPlusTable.$httpRequest as Function)\r\n }\r\n}\r\n\r\nconst httpRequestInstance = (model?: Record<string, unknown>) => {\r\n return new Promise((resolve, reject) => {\r\n paginationConfig.value.current = 1\r\n queryTableListMethod(\r\n { ...(model || {}), pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n if (Object.keys(props.pagination).length) {\r\n emit('update:pagination', paginationConfig.value)\r\n }\r\n resolve(res)\r\n },\r\n fail: (err) => {\r\n reject(err)\r\n }\r\n }\r\n )\r\n })\r\n}\r\n\r\nconst changePageIndexRequest = () => {\r\n queryTableListMethod(\r\n { pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n emit('update:pagination', paginationConfig.value)\r\n emit('pagination-current-change', paginationConfig.value)\r\n }\r\n }\r\n )\r\n}\r\n\r\nconst changePageSizeRequest = () => {\r\n queryTableListMethod(\r\n { pageIndex: paginationConfig.value.current, pageSize: paginationConfig.value.pageSize },\r\n {\r\n success: (res) => {\r\n formatConfigOut(res, ['total', 'tableData'])\r\n emit('update:pagination', paginationConfig.value)\r\n }\r\n }\r\n )\r\n}\r\n\r\nconst handleSizeChange = (size: number) => {\r\n paginationConfig.value.pageSize = size\r\n paginationConfig.value.current = 1\r\n if (isRequestConf.value) {\r\n changePageSizeRequest()\r\n } else {\r\n emit('update:pagination', paginationConfig.value)\r\n emit('size-change', paginationConfig.value, size)\r\n }\r\n}\r\n\r\nconst handleIndexChange = (val: number) => {\r\n paginationConfig.value.current = val\r\n if (isRequestConf.value) {\r\n console.log('indexPages//', val)\r\n changePageIndexRequest()\r\n } else {\r\n emit('update:pagination', paginationConfig.value)\r\n emit('pagination-current-change', paginationConfig.value)\r\n }\r\n}\r\n\r\nconst changeTableSort = (column: Record<string, unknown>) => {\r\n emit('change-table-sort', column)\r\n}\r\n\r\nconst firstWordUpperCase = (str: string): string => {\r\n return str.toLowerCase().replace(/(\\s|^)[a-z]/g, (char) => char.toUpperCase())\r\n}\r\n\r\nconst columnBindAttr = (cols: Record<string, unknown>) => {\r\n const options: Record<string, unknown> = {}\r\n for (const t in cols) {\r\n if (t === 'groups' || t === 'scopedSlots' || t === 'render') continue\r\n\r\n if (t.includes('-')) {\r\n const parts = t.split('-')\r\n let newkey = parts[0]\r\n for (let j = 1; j < parts.length; j++) {\r\n newkey += firstWordUpperCase(parts[j])\r\n }\r\n options[newkey] = cols[t]\r\n } else if (t === 'key') {\r\n options.prop = cols[t]\r\n options[t] = cols[t]\r\n } else {\r\n options[t] = cols[t]\r\n }\r\n }\r\n\r\n if (!options.align) {\r\n options.align = 'center'\r\n }\r\n\r\n return options\r\n}\r\n\r\n// 提供表格实例给子组件(保留与 Form 的耦合)\r\nprovide('getTableInstantce', () => ({\r\n ...(instance?.setupState || {}),\r\n tableRef: isVirtual.value ? virtualEngineRef : tableRef,\r\n toggleSelection: (rows: Record<string, unknown>[]) => {\r\n if (isVirtual.value) {\r\n if (rows) {\r\n rows.forEach((row) => {\r\n virtualEngineRef.value?.toggleRowSelection(row, true)\r\n })\r\n } else {\r\n virtualEngineRef.value?.clearSelection()\r\n }\r\n } else {\r\n if (rows) {\r\n rows.forEach((row) => {\r\n tableRef.value?.toggleRowSelection(row)\r\n })\r\n } else {\r\n tableRef.value?.clearSelection()\r\n }\r\n }\r\n },\r\n clearAllSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : clearAllSelection(tableRef.value),\r\n refsInstance: () => isVirtual.value ? virtualEngineRef.value?.getTableRef() : tableRef.value,\r\n httpRequestInstance\r\n}))\r\n\r\n// 暴露方法\r\ndefineExpose({\r\n httpRequestInstance,\r\n getSelectionRows: () => isVirtual.value\r\n ? virtualEngineRef.value?.getSelectedRows() ?? []\r\n : multipleSelection.value,\r\n clearSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : tableRef.value?.clearSelection?.(),\r\n clearAllSelection: () => isVirtual.value\r\n ? virtualEngineRef.value?.clearSelection()\r\n : clearAllSelection(tableRef.value),\r\n refresh: () => isVirtual.value\r\n ? virtualEngineRef.value?.doLayout()\r\n : tableRef.value?.doLayout?.(),\r\n scrollToRow: (row: number) => virtualEngineRef.value?.scrollToRow(row),\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.el-dp_tables {\r\n height: auto;\r\n :deep(.el-table__body-wrapper) {\r\n height: auto;\r\n }\r\n}\r\n\r\n.table_component {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n overflow: hidden;\r\n}\r\n\r\n.table_containers {\r\n flex: 1;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n position: relative;\r\n}\r\n\r\n.pagination_page {\r\n width: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.btn-slot {\r\n width: 100%;\r\n\r\n .headerBar {\r\n box-sizing: border-box;\r\n background-color: #fff;\r\n border-radius: 6px;\r\n\r\n :deep(.el-form-item--small .el-form-item__label) {\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\n.tableContainer {\r\n border-radius: 0px;\r\n transition: all 1.5s;\r\n flex: 1;\r\n width: 100%;\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n\r\n .table_inner_containers {\r\n width: 100%;\r\n }\r\n\r\n :deep(.el-table__empty-block) {\r\n width: 100% !important;\r\n margin: 32px 0;\r\n font-size: 14px;\r\n line-height: 1.5715;\r\n\r\n .el-table__empty-text {\r\n width: auto !important;\r\n }\r\n\r\n .ant-empty-image {\r\n height: 40px;\r\n margin-bottom: 8px;\r\n\r\n .ant-empty-img-simple-ellipse {\r\n fill: #f5f5f5;\r\n }\r\n\r\n .ant-empty-img-simple-g {\r\n stroke: #d9d9d9;\r\n }\r\n\r\n .ant-empty-img-simple-path {\r\n fill: #fafafa;\r\n }\r\n }\r\n\r\n .ant-empty-description {\r\n line-height: 1.5715;\r\n color: rgba(0, 0, 0, 0.25);\r\n }\r\n }\r\n\r\n :deep(.el-tag) {\r\n height: 20px;\r\n padding: 0 7px;\r\n line-height: 20px;\r\n background: #fafafa;\r\n border: none;\r\n border-radius: 4px;\r\n\r\n &.el-tag--info {\r\n color: rgba(0, 0, 0, 0.85);\r\n }\r\n\r\n &.el-tag--success {\r\n color: #52c41a;\r\n background: #f6ffed;\r\n border-color: #b7eb8f;\r\n }\r\n }\r\n}\r\n</style>\r\n","import EsTable from './src/component.vue'\n\nEsTable.install = function (app: any) {\n app.component(EsTable.name, EsTable)\n}\nEsTable.isPlugin = true\nEsTable.Plugin = {\n install(app: any, options: any = {}) {\n app.provide('$esPlusTable', {\n ...(options.methods || {})\n })\n app.component(EsTable.name, { ...EsTable, methods: { ...EsTable.methods, ...(options.methods || {}) } })\n }\n}\nexport default EsTable\n","import { h } from 'vue'\r\nimport {\r\n ElInput,\r\n ElSelect,\r\n ElOption,\r\n ElDatePicker,\r\n ElTimePicker,\r\n ElSlider,\r\n ElColorPicker,\r\n ElTransfer,\r\n ElCascader,\r\n ElRadioGroup,\r\n ElRadio,\r\n ElCheckboxGroup,\r\n ElCheckbox,\r\n ElSwitch,\r\n ElRate,\r\n ElUpload\r\n} from 'element-plus'\r\nimport type { FormItemOption } from '../types'\r\n\r\n// 支持嵌套属性路径的取值和赋值\r\nexport const getNestedValue = (obj: Record<string, unknown>, path: string): unknown => {\r\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\r\n let result = obj\r\n for (const key of keys) {\r\n if (result == null) return undefined\r\n result = result[key] as Record<string, unknown>\r\n }\r\n return result\r\n}\r\n\r\nexport const setNestedValue = (obj: Record<string, unknown>, path: string, value: unknown): void => {\r\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\r\n const lastKey = keys.pop()\r\n let current: Record<string, unknown> = obj\r\n for (const key of keys) {\r\n if (current[key] == null) {\r\n current[key] = {}\r\n }\r\n current = current[key] as Record<string, unknown>\r\n }\r\n if (lastKey) {\r\n current[lastKey] = value\r\n }\r\n}\r\n\r\nexport function useFormInputs() {\r\n const formInputComponents = (item: FormItemOption) => {\r\n const formPutList = new Map([\r\n [\r\n 'Input',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElInput, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Select',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElSelect,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElOption, { key: idx, value: opt.value, label: opt.label })\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'datePicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElDatePicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'timePicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElTimePicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Slider',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElSlider, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'ColorPicker',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElColorPicker, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Transfer',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElTransfer, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Cascader',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElCascader, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n options: row.dataOptions,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Radio',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElRadioGroup,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElRadio, { key: idx, value: opt.value as any }, () => opt.label)\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'Checkbox',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(\r\n ElCheckboxGroup,\r\n {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n },\r\n () =>\r\n row.dataOptions?.map((opt, idx) =>\r\n hFn(ElCheckbox, { key: idx, value: opt.value as any }, () => opt.label)\r\n )\r\n )\r\n }\r\n ],\r\n [\r\n 'Switch',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElSwitch, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Rate',\r\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n return hFn(ElRate, {\r\n modelValue: getNestedValue(model, row.prop) as any,\r\n ...row.attrs,\r\n ...row.on,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n setNestedValue(model, row.prop, val)\r\n }\r\n })\r\n }\r\n ],\r\n [\r\n 'Upload',\r\n (hFn: typeof h, _model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\r\n const { props: uploadProps, httpRequest, triggerRender, fileRender, ...restRow } = row as FormItemOption & {\r\n props?: Record<string, unknown>\r\n httpRequest?: (options: Record<string, unknown>) => Promise<unknown>\r\n triggerRender?: (h: typeof hFn) => ReturnType<typeof hFn>\r\n fileRender?: (h: typeof hFn, file: Record<string, unknown>, onRemove: () => void) => ReturnType<typeof hFn>\r\n }\r\n\r\n let uploadInstance: { handleRemove: (file: Record<string, unknown>) => void } | null = null\r\n\r\n // 构建 ElUpload 属性\r\n const elUploadProps: Record<string, unknown> = {\r\n ...uploadProps, // props 中的配置:action, accept, listType, limit, multiple 等\r\n ...restRow.attrs, // attrs 中的配置(兼容两种方式)\r\n ref: (el: { handleRemove: (file: Record<string, unknown>) => void } | null) => {\r\n uploadInstance = el\r\n }\r\n }\r\n\r\n // 将 on 中的事件转换为 Vue 3 h() 需要的 onXxx 格式\r\n if (restRow.on) {\r\n for (const [key, handler] of Object.entries(restRow.on)) {\r\n elUploadProps[`on${key.charAt(0).toUpperCase()}${key.slice(1)}`] = handler\r\n }\r\n }\r\n\r\n // 合并 httpRequest(优先用表单项配置的,其次用 props 中的)\r\n if (httpRequest) {\r\n elUploadProps['http-request'] = httpRequest\r\n }\r\n\r\n // Vue 3 h() 的 slots 参数:通过第三个参数传递命名插槽\r\n const slots: Record<string, (...args: unknown[]) => ReturnType<typeof hFn>> = {}\r\n\r\n // #trigger / #default 插槽\r\n if (triggerRender) {\r\n const listType = elUploadProps['listType'] || elUploadProps['list-type']\r\n if (listType === 'picture-card') {\r\n slots.trigger = () => triggerRender(hFn)\r\n } else {\r\n slots.default = () => triggerRender(hFn)\r\n }\r\n }\r\n\r\n // #file 插槽:自定义文件列表项渲染\r\n if (fileRender) {\r\n slots.file = ({ file }: { file: Record<string, unknown> }) => {\r\n return fileRender(hFn, file, () => {\r\n uploadInstance?.handleRemove(file)\r\n })\r\n }\r\n }\r\n\r\n return hFn(ElUpload, elUploadProps, slots)\r\n }\r\n ]\r\n ])\r\n return formPutList.get(item.formtype) || (() => null)\r\n }\r\n\r\n return { formInputComponents }\r\n}\r\n","import { computed, ref, watch } from 'vue'\r\nimport type { FormItemOption, LayoutFormProps } from '../types'\r\n\r\nexport function useFormLayout(props: { layoutFormProps?: LayoutFormProps; formItemList: FormItemOption[] }) {\r\n const folded = ref(false)\r\n\r\n const isBtnHidden = computed(() => props.layoutFormProps?.fromLayProps?.isBtnHidden ?? false)\r\n\r\n const rowLayout = computed(() => props.layoutFormProps?.rowLayProps || { gutter: 20 })\r\n\r\n const formLayout = computed(() => props.layoutFormProps?.fromLayProps || {})\r\n\r\n const getSetOptionsStatus = computed(() => props.layoutFormProps?.setOptions)\r\n\r\n const getRowColsAlgorithm = computed(() => {\r\n let pre = 0\r\n const groupArrayList: FormItemOption[][] = []\r\n const columnRows: { statIndex: number; endIndex: number }[] = []\r\n const formItems = props.formItemList\r\n\r\n for (let i = 0; i < formItems.length; i++) {\r\n const item = formItems[i]\r\n pre += item.span || 24\r\n if (pre > 24) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i })\r\n pre = item.span || 24\r\n if (i === formItems.length - 1) {\r\n columnRows.push({ statIndex: i, endIndex: i + 1 })\r\n }\r\n } else {\r\n if (i === formItems.length - 1) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i + 1 })\r\n } else if (pre === 24) {\r\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\r\n columnRows.push({ statIndex, endIndex: i + 1 })\r\n pre = 0\r\n }\r\n }\r\n }\r\n\r\n columnRows.forEach((it) => {\r\n groupArrayList.push(formItems.slice(it.statIndex, it.endIndex))\r\n })\r\n\r\n const columRowIndexs = groupArrayList.map((it) => {\r\n return it.map(() => 0)\r\n })\r\n\r\n let rowColIndex = -1\r\n columRowIndexs.forEach((row) => {\r\n row.forEach((_, idx) => {\r\n row[idx] = (rowColIndex += 1)\r\n })\r\n })\r\n\r\n return {\r\n columnRow: columRowIndexs,\r\n rowNum: columRowIndexs.length,\r\n columnNodeIndex: columRowIndexs.map((it) => it[it.length - 1])\r\n }\r\n })\r\n\r\n const isFold = computed(() => {\r\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\r\n return minFoldRow > 0 && minFoldRow < getRowColsAlgorithm.value.rowNum\r\n })\r\n\r\n const getBtnColSpan = computed(() => {\r\n const { rowNum, columnRow } = getRowColsAlgorithm.value\r\n const lastColumn = columnRow[rowNum - 1] || []\r\n const btnColSpan = props.layoutFormProps?.fromLayProps?.btnColSpan || 0\r\n const totalSpan = lastColumn.reduce((sum, idx) => sum + (props.formItemList[idx]?.span || 24), 0)\r\n const hasSpan = 24 - totalSpan\r\n\r\n return !folded.value && btnColSpan <= hasSpan ? hasSpan : 24\r\n })\r\n\r\n const formItem = computed(() => {\r\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\r\n const { columnNodeIndex } = getRowColsAlgorithm.value\r\n\r\n if (folded.value) {\r\n const lastFoldIndex = columnNodeIndex[minFoldRow - 1] ?? columnNodeIndex[columnNodeIndex.length - 1] ?? 9999\r\n return props.formItemList.map((it, index) => ({\r\n ...it,\r\n isFold: index > lastFoldIndex\r\n }))\r\n }\r\n return props.formItemList.map((it) => ({ ...it, isFold: false }))\r\n })\r\n\r\n watch(\r\n isFold,\r\n (val) => {\r\n folded.value = val\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const changeFolded = () => {\r\n folded.value = !folded.value\r\n }\r\n\r\n return {\r\n folded,\r\n isBtnHidden,\r\n rowLayout,\r\n formLayout,\r\n getSetOptionsStatus,\r\n getRowColsAlgorithm,\r\n isFold,\r\n getBtnColSpan,\r\n formItem,\r\n changeFolded\r\n }\r\n}\r\n","import { nextTick, toRaw, unref } from 'vue'\r\nimport { isObject, findValueByKey, wrapPromise } from '../utils/shared'\r\nimport type { FormItemOption, ApiParams } from '../types'\r\n\r\nexport interface RequestConfig {\r\n httpRequest?: (params: Record<string, unknown>) => Promise<unknown>\r\n apiParams?: ApiParams\r\n success?: (res: Record<string, unknown>) => void\r\n fail?: (err: unknown) => void\r\n [key: string]: unknown\r\n}\r\n\r\nexport function useFormRequest(httpRequestGlobal?: (params: Record<string, unknown>) => Promise<unknown>) {\r\n const queryTableListMethod = (params: Record<string, unknown>, options: RequestConfig = {}, option?: FormItemOption) => {\r\n const { success, fail, ..._params } = options || {}\r\n if (isObject(options.apiParams) && Object.keys(options.apiParams).length && options.apiParams.url) {\r\n const initFormParams = { ...params, ...toRaw(unref(options.apiParams.model || {})) }\r\n const requestOption = { ...toRaw(unref(options.apiParams.options || {})) }\r\n if (options.apiParams.method) {\r\n requestOption.method = options.apiParams.method\r\n }\r\n\r\n const requestPayload = {\r\n url: options.apiParams.url,\r\n headers: { ...(options.apiParams.headers || {}) },\r\n formParams: initFormParams,\r\n ...requestOption\r\n }\r\n\r\n const requestFn = options.httpRequest || httpRequestGlobal\r\n if (!requestFn) return\r\n\r\n requestFn(requestPayload)\r\n .then((res) => {\r\n // 支持对象和数组两种响应格式(兼容直接返回数组的接口)\r\n if (typeof success === 'function' && res && (isObject(res) || Array.isArray(res))) {\r\n success(res as Record<string, unknown>)\r\n }\r\n })\r\n .catch((e) => {\r\n if (typeof fail === 'function') {\r\n fail(e)\r\n }\r\n })\r\n }\r\n }\r\n\r\n const checkQueryFields = (obj: Record<string, unknown>): boolean => {\r\n const checkListKey = ['total', 'pageSize', 'current', 'listData']\r\n if (isObject(obj)) {\r\n return Object.keys(obj).every((it) => {\r\n return checkListKey.find((its) => its === it) && obj[it] && typeof obj[it] === 'string'\r\n })\r\n }\r\n return false\r\n }\r\n\r\n const configFormField = (options: Record<string, unknown> = {}, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n if (isObject(options.configFormOut) && Object.keys(options.configFormOut).length && checkQueryFields(options.configFormOut as Record<string, unknown>)) {\r\n return options.configFormOut as Record<string, string>\r\n }\r\n\r\n if (typeof fieldFieldOutput === 'function') {\r\n const configFields = fieldFieldOutput({\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n listData: 'rows'\r\n })\r\n if (checkQueryFields(configFields)) {\r\n return configFields\r\n }\r\n }\r\n\r\n return {\r\n total: 'records',\r\n pageSize: 'pageSize',\r\n current: 'pageNo',\r\n listData: 'rows'\r\n }\r\n }\r\n\r\n const formatConfigOut = (row: Record<string, unknown>, keyList: string[], options: Record<string, unknown> = {}, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n const configFieldOut = configFormField(options, fieldFieldOutput)\r\n const configDataOption: Record<string, unknown> = {}\r\n\r\n // 如果 API 响应本身就是数组,直接作为 listData 使用(兼容直接返回数组的接口)\r\n if (keyList.includes('listData') && Array.isArray(row)) {\r\n configDataOption['listData'] = row\r\n return configDataOption\r\n }\r\n\r\n if (isObject(configFieldOut) && Object.keys(configFieldOut).length) {\r\n for (const [key, value] of Object.entries(configFieldOut)) {\r\n const isKeyUsed = keyList.findIndex((it) => it === key)\r\n if (isKeyUsed === -1) continue\r\n\r\n const rowValue = row[value as string]\r\n if (rowValue !== undefined && rowValue !== null) {\r\n if (key === 'listData') {\r\n configDataOption[key] = Array.isArray(rowValue) ? rowValue : []\r\n } else {\r\n configDataOption[key] = typeof rowValue === 'number' ? rowValue : parseInt(rowValue as string, 10) || 0\r\n }\r\n } else {\r\n const resultData = findValueByKey(row, value as string)\r\n if (key === 'listData') {\r\n configDataOption[key] = Array.isArray(resultData) ? resultData : []\r\n } else {\r\n configDataOption[key] = typeof resultData === 'number' ? resultData : parseInt(resultData as string, 10) || 0\r\n }\r\n }\r\n }\r\n }\r\n return configDataOption\r\n }\r\n\r\n const httpRequestFormInstance = (model: Record<string, unknown>, options: RequestConfig, rows: FormItemOption, fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n return new Promise<{ data: Record<string, unknown>; configRows: Record<string, unknown> }>((resolve, reject) => {\r\n nextTick(() => {\r\n queryTableListMethod(\r\n { pageIndex: 1, pageSize: 1000, ...(model || {}) },\r\n {\r\n ...(options || {}),\r\n success: (res) => {\r\n const configRows = formatConfigOut(res, ['total', 'listData'], rows as unknown as Record<string, unknown>, fieldFieldOutput)\r\n resolve({ data: res, configRows })\r\n },\r\n fail: (err) => {\r\n reject(err)\r\n }\r\n },\r\n rows\r\n )\r\n })\r\n })\r\n }\r\n\r\n const getEveryFormQueryField = async (rowsList: FormItemOption[], fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>) => {\r\n try {\r\n if (!Array.isArray(rowsList)) return []\r\n const apiUrlList = rowsList.filter((it) => it && it.apiParams && isObject(it.apiParams) && it.apiParams.url)\r\n const apiResult: { prop: string; listData: unknown[] }[] = []\r\n\r\n const wrappedPromises = apiUrlList.map((option) => {\r\n const { httpRequest } = option\r\n const promiseThen = httpRequestFormInstance(\r\n { ...(option.apiParams?.model || {}) },\r\n { httpRequest, apiParams: option.apiParams, ...(option.apiParams?.options || {}) },\r\n option,\r\n fieldFieldOutput\r\n )\r\n return wrapPromise(promiseThen)\r\n })\r\n\r\n const results = await Promise.all(wrappedPromises)\r\n\r\n results.forEach((item, index) => {\r\n if (item.status === 'fulfilled') {\r\n const { configRows, data } = item.value\r\n const option = apiUrlList[index]\r\n const listenToCallBack = option?.listenToCallBack as Record<string, (params: unknown) => unknown> | undefined\r\n\r\n /**\r\n * 优先使用 listenToCallBack.crtn 格式化数据\r\n * crtn 接收 API 原始响应 data,返回 [{ label, value }] 格式的选项数据\r\n * data 是 httpRequest 返回的 { data: any } 中的 data 字段\r\n */\r\n let listData: unknown[] = []\r\n if (listenToCallBack?.crtn) {\r\n listData = listenToCallBack.crtn(data) as unknown[]\r\n }\r\n\r\n // 如果 crtn 未配置或返回空,则降级使用 callOptionListFormat 或格式化后的数据\r\n const newListOptions =\r\n Array.isArray(listData) && listData.length > 0\r\n ? listData\r\n : typeof option?.callOptionListFormat === 'function'\r\n ? option.callOptionListFormat(configRows?.listData as unknown[] || option?.dataOptions || [])\r\n : undefined\r\n\r\n apiResult.push({\r\n prop: apiUrlList[index].prop,\r\n listData: Array.isArray(newListOptions) ? newListOptions : (configRows?.listData as unknown[] || apiUrlList[index]?.dataOptions || [])\r\n })\r\n }\r\n })\r\n return apiResult\r\n } catch (e) {\r\n return []\r\n }\r\n }\r\n\r\n return {\r\n queryTableListMethod,\r\n getEveryFormQueryField,\r\n formatConfigOut,\r\n configFormField\r\n }\r\n}\r\n","import { createVNode, getCurrentInstance, render } from 'vue'\r\nimport EsDialog from './component.vue'\r\nimport type { DialogOptions } from '../../../types'\r\n\r\nexport interface DialogCallable {\r\n (dialogOptions: DialogOptions): any\r\n close: () => void\r\n}\r\n\r\nexport interface DialogCallableWithDestroy extends DialogCallable {\r\n destroy: () => void\r\n}\r\n\r\nconst getAppendToElement = (appendTo?: string | HTMLElement) => {\r\n if (typeof appendTo === 'string') {\r\n return document.querySelector(appendTo) || document.body\r\n }\r\n return appendTo instanceof HTMLElement ? appendTo : document.body\r\n}\r\n\r\nconst initInstance = (Component: any, props: DialogOptions, container: HTMLElement, appContext: any) => {\r\n const vNode = createVNode(Component, props)\r\n\r\n if (appContext) {\r\n vNode.appContext = appContext\r\n\r\n if (!vNode.appContext.provides) {\r\n vNode.appContext.provides = {}\r\n }\r\n\r\n // 注入语言环境(如果父应用有提供)\r\n const injectedLocale = appContext.provides?.elLocale\r\n if (injectedLocale) {\r\n vNode.appContext.provides['elLocale'] = injectedLocale\r\n }\r\n\r\n if (!vNode.appContext.config) {\r\n vNode.appContext.config = {} as any\r\n }\r\n if (!vNode.appContext.config.globalProperties) {\r\n vNode.appContext.config.globalProperties = {}\r\n }\r\n }\r\n\r\n render(vNode, container)\r\n\r\n const target = getAppendToElement(props.appendTo)\r\n target.appendChild(container)\r\n return vNode\r\n}\r\n\r\nexport function useDialog(Component?: any, opt?: { onlyInstance?: false }): DialogCallableWithDestroy\r\nexport function useDialog(Component?: any, opt?: { onlyInstance: true }): DialogCallable\r\nexport function useDialog(Component?: any, opt: { onlyInstance?: boolean } = {}) {\r\n Component = Component || EsDialog\r\n const options = Object.assign({ onlyInstance: false }, opt)\r\n\r\n if (options.onlyInstance) {\r\n const instance = getCurrentInstance()\r\n const appContext = instance?.appContext || null\r\n const container = document.createElement('div')\r\n\r\n const close = () => {\r\n render(null, container)\r\n container.remove()\r\n }\r\n\r\n const DialogComponent = (dialogOptions: DialogOptions) => {\r\n if (dialogOptions.visible === undefined) {\r\n dialogOptions.visible = true\r\n }\r\n\r\n const originalOnClosed = dialogOptions.onClosed\r\n const originalOnSubmit = dialogOptions.onSubmit\r\n\r\n dialogOptions.onClosed = (...args: any[]) => {\r\n ;(originalOnClosed as Function)?.(...args)\r\n close()\r\n }\r\n\r\n dialogOptions.onSubmit = (closeFn = close) => {\r\n originalOnSubmit?.(closeFn)\r\n }\r\n\r\n return initInstance(Component, dialogOptions, container, appContext)\r\n }\r\n\r\n DialogComponent.close = close\r\n return DialogComponent\r\n } else {\r\n const container = document.createElement('div')\r\n container.className = 'dialog-containers'\r\n const instance = getCurrentInstance()\r\n const appContext = instance?.appContext || null\r\n let vNode: any = null\r\n\r\n const close = () => {\r\n if (vNode && vNode.component) {\r\n vNode.component.props.visible = false\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n if (vNode) {\r\n render(null, container)\r\n container.remove()\r\n vNode = null\r\n }\r\n }\r\n\r\n const DialogComponent = (dialogOptions: DialogOptions) => {\r\n if (vNode && vNode.component) {\r\n Object.assign(vNode.component.props, dialogOptions)\r\n vNode.component.props.visible = true\r\n return vNode\r\n }\r\n\r\n const mergedOptions: DialogOptions = {\r\n visible: true,\r\n width: '50%',\r\n destroyOnClose: true,\r\n ...dialogOptions\r\n }\r\n\r\n const { onClosed: originalOnClosed, onSubmit: originalOnSubmit } = mergedOptions\r\n\r\n mergedOptions.onClosed = () => {\r\n originalOnClosed?.()\r\n close()\r\n }\r\n\r\n mergedOptions.onSubmit = (closeFn = close) => {\r\n originalOnSubmit?.(closeFn)\r\n }\r\n\r\n vNode = initInstance(Component, mergedOptions, container, appContext)\r\n return vNode\r\n }\r\n\r\n DialogComponent.close = close\r\n DialogComponent.destroy = destroy\r\n return DialogComponent\r\n }\r\n}\r\n\r\nexport default useDialog\r\n","<template>\r\n <el-form :ref=\"setFormRef\" v-bind=\"formProps\" class=\"es-form\">\r\n <div class=\"flex-center\">\r\n <el-row v-bind=\"rowLayout\">\r\n <template v-for=\"(item, index) in formItem\" :key=\"item.prop\">\r\n <el-col v-show=\"!item?.isFold\" :span=\"item.span\">\r\n <el-form-item\r\n :label=\"translateLabel(item)\"\r\n v-bind=\"initFormItemOptions((item as any).formItemOptions || {})\"\r\n :prop=\"item.prop\"\r\n @click.stop=\"() => {}\"\r\n >\r\n <template v-if=\"item.formtype\">\r\n <RenderDomForm :row=\"item\" :render=\"formInputComponents(item)\" :index=\"index\" :model=\"model\" />\r\n </template>\r\n <template v-else>\r\n <RenderDomForm :row=\"item\" :render=\"item.render\" :index=\"index\" :model=\"model\" />\r\n </template>\r\n </el-form-item>\r\n </el-col>\r\n </template>\r\n\r\n <template v-if=\"!isBtnHidden\">\r\n <template v-if=\"isRenderBtn\">\r\n <RenderBtn\r\n :row=\"{ isFold: isFold, folded, getBtnColSpan, getRowColsAlgorithm, changeFolded, refsForm: formInstance }\"\r\n :form-model=\"model\"\r\n :form-item-list=\"formItem\"\r\n :render=\"(renderBtn as Function)\"\r\n />\r\n </template>\r\n <el-col v-else :span=\"btnColSpanRow ? 24 : getBtnColSpan\">\r\n <div v-if=\"btnColSpanRow && configBtn.length\" class=\"buttonOperate leftRightBtn\">\r\n <div class=\"btn-left\">\r\n <el-form-item label-width=\"0px\" class=\"btn-formItem\">\r\n <template v-for=\"(it, inx) in colRightLeftList.colLeftBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => it.click(model, refs, getTableInstant?.httpRequestInstance)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </el-form-item>\r\n </div>\r\n <div class=\"btn-right\">\r\n <el-form-item label-width=\"0px\" class=\"btn-formItem\">\r\n <template v-for=\"(it, inx) in colRightLeftList.colRightBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => clickBtn(it)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n <el-button\r\n v-if=\"isFold\"\r\n link\r\n type=\"primary\"\r\n :icon=\"getCompIcon(folded ? 'ArrowDown' : 'ArrowUp')\"\r\n style=\"padding-left: 0; border: none\"\r\n @click=\"changeFolded\"\r\n >\r\n {{ folded ? '展开' : '收起' }}\r\n </el-button>\r\n <el-dropdown placement=\"bottom-start\" v-if=\"getSetOptionsStatus\">\r\n <el-button\r\n link\r\n type=\"primary\"\r\n style=\"margin-left: 2px; margin-right: 5px; outline: none\"\r\n :icon=\"getCompIcon('Tools')\"\r\n />\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item @click=\"handleCustomerForm\">自定义查询</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleTableItemOption\">自定义表格</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleRefresh\">重置(刷新)</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </el-form-item>\r\n </div>\r\n </div>\r\n <el-form-item\r\n v-if=\"!btnColSpanRow && configBtn.length\"\r\n :label=\"' '\"\r\n :label-width=\"(formProps as any).labelBtnWidth ? (formProps as any).labelBtnWidth : (formProps as any).labelWidth\"\r\n :class=\"{ formItemCols: btnColSpanRow ? true : getBtnColSpan === 24 }\"\r\n class=\"btn-formItem\"\r\n >\r\n <div class=\"buttonOperate\" :style=\"{ 'text-align': getBtnColSpan === 24 ? 'right' : 'left' }\">\r\n <template v-if=\"configBtn.length\">\r\n <template v-for=\"(it, inx) in configBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() || false : it.disabled || false\"\r\n @click=\"() => it?.click(model, refs, getTableInstant?.httpRequestInstance)\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </template>\r\n <el-button\r\n v-if=\"isFold\"\r\n type=\"primary\"\r\n link\r\n :icon=\"getCompIcon(folded ? 'ArrowDown' : 'ArrowUp')\"\r\n style=\"padding-left: 0; border: none\"\r\n @click=\"changeFolded\"\r\n >\r\n {{ folded ? '展开' : '收起' }}\r\n </el-button>\r\n <el-dropdown placement=\"bottom-start\" v-if=\"getSetOptionsStatus\">\r\n <el-button\r\n link\r\n type=\"primary\"\r\n style=\"margin-left: 2px; margin-right: 5px; outline: none\"\r\n :icon=\"getCompIcon('Tools')\"\r\n />\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item @click=\"handleCustomerForm\">自定义查询</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleTableItemOption\">自定义表格</el-dropdown-item>\r\n <el-dropdown-item @click=\"handleRefresh\">重置(刷新)</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </div>\r\n </el-form-item>\r\n </el-col>\r\n </template>\r\n </el-row>\r\n </div>\r\n </el-form>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nexport default { name: 'EsForm' }\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, inject, getCurrentInstance, nextTick, h, defineComponent } from 'vue'\r\nimport {\r\n ElRow,\r\n ElCol,\r\n ElFormItem,\r\n ElForm,\r\n ElButton,\r\n ElDropdownMenu,\r\n ElDropdownItem,\r\n ElDropdown,\r\n ElInput\r\n} from 'element-plus'\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport { useFormInputs } from '../../../composables/use-form-inputs'\r\nimport { useFormLayout } from '../../../composables/use-form-layout'\r\nimport { useFormRequest } from '../../../composables/use-form-request'\r\nimport { isObject } from '../../../utils/shared'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport useDialog from '../../es-dialog/src/use-dialog'\r\nimport EsTable from '../../es-table'\r\nimport type { FormItemOption, BtnConfig, LayoutFormProps } from '../../../types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n model: Record<string, unknown>\r\n formItemList: FormItemOption[]\r\n layoutFormProps?: LayoutFormProps\r\n configBtn?: BtnConfig[]\r\n renderBtn?: Function | boolean\r\n btnColSpanRow?: boolean\r\n rules?: Record<string, unknown>\r\n fieldFieldOutput?: (defaults: Record<string, string>) => Record<string, string>\r\n }>(),\r\n {\r\n model: () => ({}),\r\n formItemList: () => [],\r\n layoutFormProps: () => ({}),\r\n configBtn: () => [],\r\n renderBtn: false,\r\n btnColSpanRow: true,\r\n rules: () => ({})\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: [formRef: unknown, model: Record<string, unknown>]\r\n reset: [formRef: unknown, model: Record<string, unknown>]\r\n}>()\r\n\r\nconst instance = getCurrentInstance()\r\nconst $esPlusForm = inject<Record<string, unknown>>('$esPlusForm', null) ?? getGlobalConfig().EsForm ?? {}\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\nconst translateLabel = (item: FormItemOption): string => {\r\n if (item.labelKey && typeof esPlus.t === 'function') {\r\n return (esPlus.t as (k: string) => string)(item.labelKey)\r\n }\r\n return item.label\r\n}\r\n\r\n// 保留与 Table 的耦合(同时支持 inject 和 instance.ctx 两种获取方式)\r\nconst injectedTableInstant = inject<(() => any) | null>('getTableInstantce', null)\r\nconst getTableInstant = computed(() => {\r\n if (injectedTableInstant) {\r\n return typeof injectedTableInstant === 'function' ? injectedTableInstant() : injectedTableInstant\r\n }\r\n const ctx = (instance as any)?.ctx as Record<string, any>\r\n return typeof ctx?.getTableInstantce === 'function' ? ctx?.getTableInstantce() : ctx?.getTableInstantce\r\n})\r\n\r\nconst isParentTable = computed(() => {\r\n return !!(getTableInstant.value && Object.keys(getTableInstant.value).length)\r\n})\r\n\r\n// 图标扩展\r\nconst extendedIcon = Object.fromEntries(Object.entries(ElementPlusIconsVue))\r\nconst getCompIcon = (key?: string) => (key ? extendedIcon[key] || key : undefined)\r\nconst filterOptions = (it: BtnConfig) => {\r\n const { icon, ...opt } = it as Record<string, unknown>\r\n if (!opt.size) opt.size = 'small'\r\n return opt\r\n}\r\n\r\n// Refs\r\nconst refs = ref<unknown>(null)\r\nconst formInstance = ref<Record<string, unknown>>({})\r\nconst formItemRowsList = ref<FormItemOption[]>(props.formItemList)\r\n\r\nconst setFormRef = (el: unknown) => {\r\n if (el) refs.value = el\r\n}\r\n\r\n// Composables\r\nconst { formInputComponents } = useFormInputs()\r\nconst httpRequestGlobal = ($esPlusForm?.$httpRequest as (params: Record<string, unknown>) => Promise<unknown>) || undefined\r\nconst fieldFieldOutputGlobal = (props.fieldFieldOutput || $esPlusForm?.fieldFieldOutput) as ((defaults: Record<string, string>) => Record<string, string>) | undefined\r\nconst { getEveryFormQueryField } = useFormRequest(httpRequestGlobal)\r\n\r\n// Break circular dependency: formLayoutRef is populated after useFormLayout\r\nconst formLayoutRef = ref<Record<string, unknown>>(props.layoutFormProps?.fromLayProps || {})\r\nconst formProps = computed(() => ({\r\n size: 'small' as const,\r\n ...formLayoutRef.value,\r\n model: props.model,\r\n rules: props.rules,\r\n validateOnRuleChange: false\r\n}))\r\n\r\n// 缓存已加载数据的表单项 prop,避免 computed 重新计算时重复调用接口\r\nconst loadedApiProps = ref<Set<string>>(new Set())\r\n\r\nwatch(\r\n () => props.formItemList,\r\n async (val) => {\r\n const list = Array.isArray(val) ? val : []\r\n // 只加载 isInitRun !== false 且尚未加载过数据的表单项\r\n const needLoadList = list.filter((it) => it && it.isInitRun !== false && !loadedApiProps.value.has(it.prop))\r\n if (!needLoadList.length) {\r\n // 无新表单项需要加载,保留已有的 dataOptions\r\n formItemRowsList.value = list.map((it) => {\r\n if (!it) return null\r\n const existing = formItemRowsList.value.find((old) => old && old.prop === it.prop)\r\n return existing?.dataOptions?.length ? { ...it, dataOptions: existing.dataOptions } : it\r\n }).filter((it): it is FormItemOption => !!it)\r\n return\r\n }\r\n const rows = await getEveryFormQueryField(needLoadList, fieldFieldOutputGlobal)\r\n // 标记已加载的 prop\r\n needLoadList.forEach((it) => loadedApiProps.value.add(it.prop))\r\n formItemRowsList.value = list\r\n .map((it) => {\r\n if (!it) return null\r\n const resultApiOption = rows.find((item) => item && item.prop === it.prop)\r\n const existing = formItemRowsList.value.find((old) => old && old.prop === it.prop)\r\n // 优先使用新加载的数据,其次保留已有数据\r\n if (resultApiOption) return { ...it, dataOptions: resultApiOption.listData }\r\n if (existing?.dataOptions?.length) return { ...it, dataOptions: existing.dataOptions }\r\n return it\r\n })\r\n .filter((it): it is FormItemOption => !!it)\r\n },\r\n { immediate: true, deep: true }\r\n)\r\n\r\nconst formItemListFilter = computed(() => {\r\n const list = formItemRowsList.value || []\r\n const visible = list\r\n .map((it) => (it ? { ...it, dataOptions: it.dataOptions || [] } : null))\r\n .filter((it): it is (FormItemOption & { dataOptions: Array<{ label: string; value: unknown }> }) => {\r\n if (!it) return false\r\n if (it.isHidden && typeof it.isHidden === 'function') {\r\n return !it.isHidden(props.model, it, formProps.value)\r\n }\r\n return true\r\n })\r\n\r\n const itemsWithoutSpan = visible.filter((it) => !it.span)\r\n const autoCount = itemsWithoutSpan.length\r\n let autoSpan = 6\r\n if (autoCount > 0) {\r\n const fixedTotal = visible.reduce((sum, it) => sum + (it.span || 0), 0)\r\n const remaining = 24 - (fixedTotal % 24 || (fixedTotal ? 24 : 0))\r\n if (fixedTotal === 0) {\r\n if (autoCount === 1) autoSpan = 24\r\n else if (autoCount === 2) autoSpan = 12\r\n else if (autoCount === 3) autoSpan = 8\r\n else autoSpan = 6\r\n } else {\r\n autoSpan = remaining >= autoCount ? Math.floor(remaining / autoCount) : 6\r\n if (autoSpan > 12) autoSpan = 12\r\n if (autoSpan < 4) autoSpan = 6\r\n }\r\n }\r\n\r\n return visible.map((it) => ({ ...it, span: it.span || autoSpan })) as (FormItemOption & { span: number; dataOptions: Array<{ label: string; value: unknown }> })[]\r\n})\r\n\r\nconst {\r\n folded,\r\n isBtnHidden,\r\n rowLayout,\r\n formLayout,\r\n getSetOptionsStatus,\r\n getRowColsAlgorithm,\r\n isFold,\r\n getBtnColSpan,\r\n formItem,\r\n changeFolded\r\n} = useFormLayout({\r\n layoutFormProps: props.layoutFormProps,\r\n get formItemList() { return formItemListFilter.value }\r\n})\r\n\r\nwatch(\r\n formLayout,\r\n (val) => {\r\n formLayoutRef.value = val\r\n },\r\n { immediate: true }\r\n)\r\n\r\nconst colRightLeftList = computed(() => ({\r\n colRightBtn: props.configBtn.filter((it) => it.direction === 'right' || !it.direction),\r\n colLeftBtn: props.configBtn.filter((it) => it.direction === 'left')\r\n}))\r\n\r\nconst isRenderBtn = computed(() => typeof props.renderBtn === 'function')\r\n\r\nconst clickBtn = async (it: BtnConfig) => {\r\n if (it.triggerEvent && ['query', 'rest'].includes(it.key || '')) {\r\n queryTableRequest(props.model, refs.value as any, it.key)\r\n } else {\r\n\r\n // await refs.value.validate()\r\n if (it.key === 'rest' && refs.value) {\r\n ;(refs.value as any).resetFields()\r\n }\r\n it.click?.(props.model, refs.value, getTableInstant.value?.httpRequestInstance)\r\n }\r\n}\r\n\r\nconst queryTableRequest = async (model: Record<string, unknown>, formRef: { resetFields: () => void; validate: () => Promise<boolean> } | null, key?: string) => {\r\n if (key === 'query') {\r\n if (isParentTable.value) {\r\n getTableInstant.value?.httpRequestInstance?.(model)\r\n }\r\n // else if (formRef) {\r\n // await formRef.validate()\r\n // }\r\n } else if (key === 'rest' && formRef) {\r\n if (isParentTable.value) {\r\n getTableInstant.value?.httpRequestInstance?.(model)\r\n }\r\n formRef.resetFields()\r\n }\r\n}\r\n\r\nconst initFormItemOptions = (opts: Record<string, unknown>) => {\r\n if (isParentTable.value) {\r\n const { style, ...rest } = opts\r\n return { style: { marginBottom: '10px', ...(style as Record<string, unknown>) }, ...rest }\r\n }\r\n return opts\r\n}\r\n\r\nconst confirm = () => emit('confirm', refs.value, props.model)\r\nconst reset = () => emit('reset', refs.value, props.model)\r\n\r\n// 自定义弹窗\r\nconst createDialogInstance = (() =>\r\n (instance as any)?.ctx?.dialogInstance ? (instance as any).ctx.dialogInstance() : useDialog)()\r\nconst customerForm = createDialogInstance()\r\nconst customerTable = createDialogInstance()\r\n\r\nconst handleRefresh = () => {\r\n // 保留原有逻辑\r\n}\r\n\r\nconst getFormRowsFun = () => {\r\n return {\r\n data: formItemRowsList.value.map((it) => ({\r\n ...it,\r\n label: it.label,\r\n prop: it.prop,\r\n isHidden: !!it.isHidden,\r\n width: it.width\r\n })),\r\n columns: [\r\n { type: 'selection', width: 50 },\r\n { label: '名称(列)', key: 'label' },\r\n { label: '属性(Key)', key: 'prop' },\r\n {\r\n label: '列宽',\r\n width: 180,\r\n render: (_text: unknown, row: Record<string, unknown>) => {\r\n return h('div', [\r\n h(ElInput, {\r\n size: 'small',\r\n maxlength: 3,\r\n formatter: (value: string) => value.replace(/^0|[^0-9]/g, ''),\r\n modelValue: row.width as any,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n row.width = val\r\n }\r\n }, {\r\n prepend: () => '宽度',\r\n append: () => 'px'\r\n })\r\n ])\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n\r\nconst getCustomerTableInfo = () => {\r\n return {\r\n dataSource: [],\r\n columns: [\r\n { type: 'selection', width: 50 },\r\n { label: '名称(列)', key: 'label' },\r\n { label: '属性(Key)', key: 'tableProp' },\r\n {\r\n label: '列宽',\r\n width: 180,\r\n render: (_text: unknown, row: Record<string, unknown>) => {\r\n return h('div', [\r\n h(ElInput, {\r\n size: 'small',\r\n maxlength: 3,\r\n formatter: (value: string) => value.replace(/^0|[^0-9]/g, ''),\r\n modelValue: row.width as any,\r\n 'onUpdate:modelValue': (val: unknown) => {\r\n row.width = val\r\n }\r\n }, {\r\n prepend: () => '宽度',\r\n append: () => 'px'\r\n })\r\n ])\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n\r\nconst handleCustomerForm = () => {\r\n const formRows = getFormRowsFun()\r\n customerForm({\r\n title: '自定义查询',\r\n width: '800px',\r\n isDraggable: true,\r\n render: () =>\r\n h(EsTable, {\r\n dataSource: formRows.data,\r\n columns: formRows.columns,\r\n options: {\r\n multiSelect: true,\r\n expand: false,\r\n snIndex: false,\r\n loading: false,\r\n border: true,\r\n size: 'small'\r\n },\r\n pagination: {\r\n pageSize: 10,\r\n current: 1,\r\n total: formRows.data?.length || 0\r\n }\r\n }),\r\n configBtn: [\r\n {\r\n name: '取消',\r\n icon: 'Close',\r\n click: (_instance: unknown, { close }: { close: () => void }) => close()\r\n },\r\n {\r\n name: '确认',\r\n type: 'primary',\r\n icon: 'Check',\r\n click: (_instance: unknown, { close }: { close: () => void }) => close()\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst handleTableItemOption = () => {\r\n const formRows = getCustomerTableInfo()\r\n customerTable({\r\n title: '自定义表格',\r\n width: '800px',\r\n render: () =>\r\n h(EsTable, {\r\n dataSource: formRows.dataSource,\r\n columns: formRows.columns\r\n })\r\n })\r\n}\r\n\r\n// 生命周期\r\nnextTick(() => {\r\n formInstance.value = refs.value as Record<string, unknown>\r\n ;((instance as any)?.ctx as Record<string, any>)?.bodyFormInstance?.(formInstance.value)\r\n})\r\n\r\n// 子组件定义\r\nconst RenderBtn = defineComponent({\r\n props: {\r\n row: Object,\r\n formItemList: Array,\r\n formModel: Object,\r\n render: Function,\r\n ellipsis: Boolean\r\n },\r\n setup(props) {\r\n return () => {\r\n const { formItemList, formModel, row } = props\r\n const renderContent = props.render?.(row, formModel, formItemList, h) || ''\r\n return typeof renderContent === 'string' ? h('span', renderContent) : renderContent\r\n }\r\n }\r\n})\r\n\r\nconst RenderDomForm = defineComponent({\r\n props: {\r\n row: Object,\r\n index: Number,\r\n datakey: String,\r\n render: Function,\r\n model: Object,\r\n ellipsis: Boolean\r\n },\r\n setup(props) {\r\n return () => {\r\n const { row, index, model } = props\r\n const renderContent = props.render?.(h, model, { row, index }) || ''\r\n return typeof renderContent === 'string' ? h('span', renderContent) : renderContent\r\n }\r\n }\r\n})\r\n\r\n// 暴露给外部的方法,用于手动触发指定表单项的请求\r\nconst formItmeRequestInstance = async (propsList: string[]) => {\r\n const list = formItemListFilter.value\r\n const targetItems = list.filter((it) => it && propsList.includes(it.prop))\r\n if (!targetItems.length) return\r\n\r\n const rows = await getEveryFormQueryField(targetItems, fieldFieldOutputGlobal)\r\n rows.forEach((resultApiOption) => {\r\n if (!resultApiOption) return\r\n const itemIndex = formItemRowsList.value.findIndex((it) => it && it.prop === resultApiOption.prop)\r\n if (itemIndex !== -1) {\r\n formItemRowsList.value[itemIndex] = {\r\n ...formItemRowsList.value[itemIndex],\r\n dataOptions: resultApiOption.listData as Array<{ label: string; value: unknown }>\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 暴露组件实例方法\r\nconst getFormRef = () => refs.value as { validate: () => Promise<boolean>; resetFields: () => void; clearValidate: (props?: string | string[]) => void; validateField: (props: string | string[]) => Promise<boolean>; scrollToField: (prop: string) => void }\r\n\r\ndefineExpose({\r\n formItmeRequestInstance,\r\n getFormRef,\r\n validate: () => getFormRef()?.validate(),\r\n resetFields: () => getFormRef()?.resetFields(),\r\n clearValidate: (props?: string | string[]) => getFormRef()?.clearValidate(props),\r\n validateField: (props: string | string[]) => getFormRef()?.validateField(props),\r\n scrollToField: (prop: string) => getFormRef()?.scrollToField(prop)\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.es-form {\r\n :deep(.el-form-item) {\r\n margin-bottom: 18px;\r\n }\r\n\r\n :deep(.el-form-item__label) {\r\n font-weight: 500;\r\n }\r\n\r\n .buttonOperate {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n }\r\n\r\n .leftRightBtn {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n width: 100%;\r\n\r\n .btn-left,\r\n .btn-right {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n\r\n .btn-formItem {\r\n margin-bottom: 0;\r\n }\r\n\r\n .formItemCols {\r\n width: 100%;\r\n }\r\n}\r\n</style>\r\n","import EsForm from './src/es-form.vue'\nimport useDialog from '../es-dialog/src/use-dialog'\n\nEsForm.install = function (app: any) {\n app.component(EsForm.name, EsForm)\n}\n\nEsForm.isPlugin = true\nEsForm.Plugin = {\n install(app: any, options: any = {}) {\n app.provide('$esPlusForm', {\n ...options.methods,\n useDialog: () => useDialog()\n })\n app.component(EsForm.name, { ...EsForm, methods: { ...EsForm.methods, ...(options.methods || {}), useDialog: () => useDialog() } })\n }\n}\n\nexport default EsForm\n","<template>\r\n <div class=\"dp-dialog_wrapper\">\r\n <el-dialog\r\n :class=\"['dg-dialog', initDialogCls]\"\r\n v-bind=\"filteredAttrs\"\r\n v-model=\"dialogVisible\"\r\n :draggable=\"props.isDraggable\"\r\n :width=\"props.width\"\r\n :show-close=\"false\"\r\n @close=\"beforeClose\"\r\n :fullscreen=\"(filteredAttrs?.fullscreen as boolean) ?? isFullscreen\"\r\n >\r\n <template #header>\r\n <template v-if=\"props.renderHeader\">\r\n <RenderJsx :render=\"props.renderHeader\" :instance=\"getCurrentInstanceModel\" />\r\n </template>\r\n <template v-else>\r\n <div>\r\n <span class=\"dialog-title\">{{ props.title }}</span>\r\n </div>\r\n <div class=\"btns\">\r\n <el-icon @click=\"handleFullscreen\" v-show=\"!props.hiddenFullBtn\">\r\n <FullScreen v-if=\"!isFullscreen\" />\r\n <CopyDocument v-else />\r\n </el-icon>\r\n <el-icon @click=\"handleClose\"><Close /></el-icon>\r\n </div>\r\n </template>\r\n </template>\r\n\r\n <div class=\"dialog_body_layouts\" :style=\"initDialogHeight\">\r\n <template v-if=\"props.render && typeof props.render === 'function'\">\r\n <RenderJsx\r\n :refs=\"renderBodyRefsObject\"\r\n :instance=\"getCurrentInstanceModel\"\r\n :render=\"props.render\"\r\n :components=\"{ EsTable, EsForm }\"\r\n :locale=\"locale\"\r\n />\r\n </template>\r\n </div>\r\n\r\n <template #footer v-if=\"!attrs.isHiddenFooter\">\r\n <span v-if=\"!slots.footer\" class=\"dialog-footer\">\r\n <template v-if=\"props.renderFooter && typeof props.renderFooter === 'function'\">\r\n <RenderJsx :render=\"props.renderFooter\" :instance=\"getCurrentInstanceModel\" />\r\n </template>\r\n <template v-else-if=\"props.configBtn && props.configBtn.length\">\r\n <template v-for=\"(it, inx) in configBtn\" :key=\"it.key || inx\">\r\n <el-button\r\n v-if=\"checkPermission(it.permissionValue)\"\r\n size=\"small\"\r\n v-bind=\"filterOptions(it)\"\r\n :icon=\"getCompIcon(it.icon)\"\r\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() : it.disabled || false\"\r\n @click=\"() => {\r\n it.click?.(renderBodyRefsObject.currentRef, {\r\n close: handleClose,\r\n getRefs: (name?: string) => {\r\n if (name) return renderBodyRefsObject[name] || null\r\n return renderBodyRefsObject\r\n },\r\n dialogInstance\r\n })\r\n }\"\r\n >\r\n {{ it.name }}\r\n </el-button>\r\n </template>\r\n </template>\r\n </span>\r\n <slot v-else name=\"footer\" />\r\n </template>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, reactive, getCurrentInstance, provide, inject, useAttrs } from 'vue'\r\nimport { ElConfigProvider, ElDialog, ElButton, ElIcon } from 'element-plus'\r\nimport { FullScreen, Close, CopyDocument } from '@element-plus/icons-vue'\r\nimport RenderJsx from './render-jsx.vue'\r\nimport EsTable from '../../es-table'\r\nimport EsForm from '../../es-form'\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\r\nimport { getGlobalConfig } from '../../../config'\r\nimport type { BtnConfig } from '../../../types'\r\n\r\nconst props = defineProps<{\r\n title?: string\r\n visible?: boolean\r\n appendTo?: object | string\r\n hiddenFullBtn?: boolean\r\n width?: string | number\r\n isDraggable?: boolean\r\n confirmText?: string\r\n cancelText?: string\r\n configBtn?: BtnConfig[]\r\n maxHeight?: string | number\r\n isHiddenFooter?: boolean\r\n renderHeader?: Function\r\n renderFooter?: Function\r\n render?: Function\r\n fullscreen?: boolean\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n 'update:visible': [val: boolean]\r\n closed: [val: boolean]\r\n submit: [payload: any]\r\n}>()\r\n\r\nconst slots = defineSlots()\r\n\r\nconst instance = getCurrentInstance()\r\nconst attrs = useAttrs()\r\n\r\nconst extended = Object.fromEntries(Object.entries(ElementPlusIconsVue).map(([key]) => [key, ElementPlusIconsVue[key]]))\r\n\r\nconst lyFormInstance = ref(null)\r\nconst renderBodyRefsObject = reactive<Record<string, any>>({})\r\nconst isFullscreen = ref(false)\r\nconst dialogInstance = instance\r\nconst locale = ref(zhCn)\r\n\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', null) ?? getGlobalConfig() ?? {}\r\n\r\nconst checkPermission = (pvalue?: string): boolean => {\r\n if (!pvalue) return true\r\n const fn = esPlus.permission\r\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\r\n}\r\n\r\nconst injectedLocale = inject('elLocale', null)\r\nif (injectedLocale) {\r\n locale.value = injectedLocale as any\r\n}\r\n\r\nprovide('elLocale', locale.value)\r\n\r\nconst getCompIcon = (key?: string) => {\r\n return key ? extended[key] || key : undefined\r\n}\r\n\r\nconst filterOptions = (it: BtnConfig) => {\r\n const { icon, ...opt } = it as Record<string, unknown>\r\n return opt\r\n}\r\n\r\nconst closeFullscreen = () => {\r\n setTimeout(() => {\r\n if (isFullscreen.value) {\r\n isFullscreen.value = false\r\n }\r\n }, 500)\r\n}\r\n\r\nconst handleFullscreen = () => {\r\n if (attrs?.fullscreen) return\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleClose = () => {\r\n emit('closed', false)\r\n closeFullscreen()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('submit', { renderBodyRefs: renderBodyRefsObject.currentRef, lyFormInstance, dialogInstance })\r\n}\r\n\r\nconst beforeClose = () => {\r\n emit('closed', false)\r\n closeFullscreen()\r\n}\r\n\r\nconst filteredAttrs = computed(() => {\r\n const { ...rest } = attrs\r\n return rest\r\n})\r\n\r\nconst initDialogCls = computed(() => {\r\n if (!isFullscreen.value) {\r\n if (props.maxHeight) return 'dialogShadow'\r\n return 'dialogAuto'\r\n }\r\n return 'dialogFull'\r\n})\r\n\r\nconst getMaxContentHeight = () => {\r\n const viewH = window.innerHeight\r\n return Math.max(viewH - 135, 200)\r\n}\r\n\r\nconst initDialogHeight = computed(() => {\r\n const viewH = getMaxContentHeight()\r\n if (!isFullscreen.value) {\r\n if (props.maxHeight) {\r\n return { maxHeight: typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight }\r\n }\r\n return { maxHeight: viewH + 'px' }\r\n }\r\n return { height: viewH + 'px' }\r\n})\r\n\r\nconst dialogVisible = computed({\r\n get: () => props.visible || false,\r\n set: (val) => {\r\n emit('update:visible', val)\r\n if (!val) {\r\n emit('closed', val)\r\n closeFullscreen()\r\n }\r\n }\r\n})\r\n\r\nconst getCurrentInstanceModel = computed(() => ({\r\n renderBodyRefs: renderBodyRefsObject.currentRef,\r\n renderBodyRefsObject,\r\n lyFormInstance,\r\n dialogInstance,\r\n getRefs: () => renderBodyRefsObject\r\n}))\r\n\r\nprovide('bodyFormInstance', (e: any) => {\r\n lyFormInstance.value = e\r\n})\r\n\r\nif (instance) {\r\n instance.exposed = {\r\n closed: handleClose\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.dp-dialog_wrapper {\r\n :deep(.dialogAuto) {\r\n margin: 0px !important;\r\n }\r\n :deep(.el-overlay-dialog) {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n :deep(.el-dialog) {\r\n padding: 10px;\r\n\r\n .el-dialog__footer {\r\n padding-top: 0px;\r\n }\r\n\r\n .el-dialog__body {\r\n padding: 10px 0px;\r\n }\r\n\r\n .el-dialog__header {\r\n border-bottom: 1px solid #eee;\r\n display: flex;\r\n padding: 0px 0px 10px 0px;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin: 0;\r\n }\r\n }\r\n}\r\n\r\n.dialog-title {\r\n line-height: 24px;\r\n font-size: 14px;\r\n color: #303133;\r\n font-weight: bold;\r\n}\r\n\r\n.btns {\r\n display: flex;\r\n align-items: center;\r\n\r\n i {\r\n margin-right: 8px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n }\r\n}\r\n\r\n.dialog_body_layouts {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n scrollbar-width: thin;\r\n scrollbar-color: #87a2bd26 #c8d5e147;\r\n}\r\n\r\n/* 滚动条样式 */\r\n*::-webkit-scrollbar {\r\n width: 14px;\r\n height: 14px;\r\n}\r\n\r\n*::-webkit-scrollbar-button {\r\n width: 0;\r\n height: 0;\r\n display: none;\r\n}\r\n\r\n*::-webkit-scrollbar-corner {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n min-height: 12px;\r\n border: 4px solid transparent;\r\n background-clip: content-box;\r\n border-radius: 7px;\r\n background-color: #c8d5e1;\r\n\r\n &:hover {\r\n background-color: #a8bbcf;\r\n }\r\n\r\n &:active {\r\n background-color: #87a2bd;\r\n }\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-track-piece {\r\n background-color: transparent;\r\n}\r\n</style>\r\n","import EsDialog from './src/component.vue'\n\nEsDialog.install = function (app: any) {\n app.component(EsDialog.name, EsDialog)\n}\n\nexport default EsDialog\n","<template>\r\n <div class=\"es-crud-page\">\r\n <es-table\r\n ref=\"tableRef\"\r\n :columns=\"mergedColumns\"\r\n :options=\"mergedOptions\"\r\n v-model:data-source=\"tableData\"\r\n v-model:pagination=\"paginationState\"\r\n v-bind=\"$attrs\"\r\n >\r\n <es-form\r\n v-if=\"schema.formItems && schema.formItems.length\"\r\n ref=\"formRef\"\r\n :model=\"queryModel\"\r\n :form-item-list=\"schema.formItems\"\r\n :config-btn=\"mergedFormBtns\"\r\n :layout-form-props=\"formLayoutProps\"\r\n />\r\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotData\">\r\n <slot :name=\"name\" v-bind=\"slotData || {}\" />\r\n </template>\r\n </es-table>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, watch } from 'vue'\r\nimport { ElMessageBox } from 'element-plus'\r\nimport EsForm from '../../es-form/src/es-form.vue'\r\nimport EsTable from '../../es-table/src/component.vue'\r\nimport useDialog from '../../es-dialog/src/use-dialog'\r\nimport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudBtnConfig,\r\n TableBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n CrudDialogConfig,\r\n DialogActionContext\r\n} from './types'\r\nimport type { BtnConfig, TableColumn } from '../../../types'\r\n\r\ndefineOptions({ name: 'EsCrudPage' })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n schema: CrudPageSchema\r\n httpRequest?: (params: Record<string, unknown>) => Promise<unknown>\r\n autoLoad?: boolean\r\n }>(),\r\n { autoLoad: true }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'query': [model: Record<string, unknown>]\r\n 'add': []\r\n 'edit': [row: Record<string, unknown>]\r\n 'delete': [row: Record<string, unknown>]\r\n 'view': [row: Record<string, unknown>]\r\n 'export': [model: Record<string, unknown>]\r\n 'row-click': [row: Record<string, unknown>]\r\n 'btn-click': [key: string, payload?: Record<string, unknown>]\r\n 'dialog-confirm': [dialogKey: string, data: Record<string, unknown>]\r\n 'dialog-cancel': [dialogKey: string]\r\n 'dialog-open': [dialogKey: string, row?: Record<string, unknown>]\r\n}>()\r\n\r\nconst tableRef = ref<any>(null)\r\nconst formRef = ref<any>(null)\r\nconst tableData = ref<Record<string, unknown>[]>([])\r\n\r\nconst queryModel = reactive<Record<string, unknown>>({})\r\n\r\nwatch(\r\n () => props.schema.formItems,\r\n (items) => {\r\n if (items) {\r\n items.forEach((item) => {\r\n if (item.prop && !(item.prop in queryModel)) {\r\n queryModel[item.prop] = ''\r\n }\r\n })\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nconst paginationState = ref({\r\n current: 1,\r\n pageSize: 10,\r\n total: 0,\r\n ...(props.schema.pagination || {})\r\n})\r\n\r\n// ─── 向后兼容:归一化配置 ───\r\n\r\nconst normalizedDialogs = computed<Record<string, CrudDialogConfig>>(() => {\r\n if (props.schema.dialogs) return props.schema.dialogs\r\n\r\n // 旧模式:从 dialogFormItems + actions 推导\r\n if (!props.schema.dialogFormItems?.length) return {}\r\n\r\n const dialogBase = {\r\n width: props.schema.dialogOptions?.width || '600px',\r\n formItems: props.schema.dialogFormItems,\r\n ...(props.schema.dialogOptions || {})\r\n } as CrudDialogConfig\r\n\r\n const result: Record<string, CrudDialogConfig> = {}\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n\r\n if (actions.includes('add')) {\r\n result.add = { ...dialogBase, title: '新增' }\r\n }\r\n if (actions.includes('edit')) {\r\n result.edit = { ...dialogBase, title: '编辑' }\r\n }\r\n if (actions.includes('view')) {\r\n result.view = { ...dialogBase, title: '查看', isHiddenFooter: true }\r\n }\r\n\r\n return result\r\n})\r\n\r\nconst normalizedToolbarBtns = computed<CrudBtnConfig[]>(() => {\r\n if (props.schema.toolbarBtns) return props.schema.toolbarBtns\r\n\r\n // 新模式(显式配置了 dialogs 或 operationColumn):不自动生成工具栏按钮\r\n if (props.schema.dialogs || props.schema.operationColumn !== undefined) return []\r\n\r\n // 旧模式:从 actions 推导\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n const btns: CrudBtnConfig[] = []\r\n\r\n if (actions.includes('add')) {\r\n btns.push({ name: '新增', type: 'primary', key: 'add', icon: 'Plus', dialogKey: 'add' })\r\n }\r\n if (actions.includes('export')) {\r\n btns.push({ name: '导出', key: 'export', icon: 'Download', actionType: 'export' })\r\n }\r\n if (actions.includes('import')) {\r\n btns.push({ name: '导入', key: 'import', icon: 'Upload', actionType: 'import' })\r\n }\r\n\r\n return btns\r\n})\r\n\r\nconst normalizedOperationColumn = computed<OperationColumnConfig | false | undefined>(() => {\r\n if (props.schema.operationColumn !== undefined) return props.schema.operationColumn\r\n\r\n // 旧模式:从 actions 推导\r\n const actions = props.schema.actions || ['add', 'edit', 'delete']\r\n const hasActionCol = props.schema.columns?.some((c) => c.prop === 'action' || c.prop === 'operate' || c.btns)\r\n if (hasActionCol) return undefined\r\n\r\n const rowActions = actions.filter((a) => ['edit', 'delete', 'view'].includes(a))\r\n if (rowActions.length === 0) return false\r\n\r\n const btns: RowBtnConfig[] = []\r\n if (actions.includes('view')) {\r\n btns.push({ name: '查看', type: 'primary', key: 'view', dialogKey: 'view' })\r\n }\r\n if (actions.includes('edit')) {\r\n btns.push({ name: '编辑', type: 'primary', key: 'edit', dialogKey: 'edit' })\r\n }\r\n if (actions.includes('delete')) {\r\n btns.push({ name: '删除', type: 'danger', key: 'delete', confirm: '确定删除该条数据吗?' })\r\n }\r\n\r\n return {\r\n label: '操作',\r\n width: btns.length * 80 + 20,\r\n fixed: 'right',\r\n btns\r\n }\r\n})\r\n\r\n// ─── 表单按钮合并 ───\r\n\r\nconst mergedFormBtns = computed<BtnConfig[]>(() => {\r\n if (props.schema.queryBtns) return props.schema.queryBtns\r\n\r\n const baseBtns: BtnConfig[] = [\r\n { name: '查询', type: 'primary', key: 'query', triggerEvent: true },\r\n { name: '重置', key: 'rest', triggerEvent: true },\r\n ]\r\n\r\n const toolbarBtns = normalizedToolbarBtns.value.map((btn) => {\r\n const resolvedBtn: BtnConfig = { ...btn }\r\n if (!resolvedBtn.click) {\r\n resolvedBtn.click = () => handleToolbarBtnClick(btn)\r\n }\r\n return resolvedBtn\r\n })\r\n\r\n return [...baseBtns, ...toolbarBtns]\r\n})\r\n\r\n// ─── 表格列合并 ───\r\n\r\nconst mergedColumns = computed<TableColumn[]>(() => {\r\n const cols = [...(props.schema.columns || [])]\r\n const opCol = normalizedOperationColumn.value\r\n\r\n if (opCol === false || opCol === undefined) return cols\r\n\r\n const actionBtns = opCol.btns.map((btn) => ({\r\n name: btn.name,\r\n type: btn.type,\r\n permissionValue: btn.permissionValue,\r\n clickEvent: (row: Record<string, unknown>) => handleRowBtnClick(btn, row)\r\n }))\r\n\r\n cols.push({\r\n prop: 'operate',\r\n label: opCol.label || '操作',\r\n width: opCol.width || actionBtns.length * 80 + 20,\r\n fixed: opCol.fixed || 'right',\r\n btns: actionBtns\r\n })\r\n\r\n return cols\r\n})\r\n\r\n// ─── 表格工具栏按钮 ───\r\n\r\nconst normalizedTableBtns = computed(() => {\r\n if (!props.schema.tableBtns?.length) return []\r\n return props.schema.tableBtns.map((btn: TableBtnConfig) => ({\r\n name: btn.name,\r\n type: btn.type,\r\n size: btn.size || 'small',\r\n icon: btn.icon,\r\n code: btn.code || 1,\r\n permissionValue: btn.permissionValue,\r\n loading: btn.loading,\r\n disabled: btn.disabled,\r\n click: () => handleToolbarBtnClick(btn)\r\n }))\r\n})\r\n\r\n// ─── 表格选项 ───\r\n\r\nconst mergedOptions = computed(() => {\r\n const base: Record<string, unknown> = {\r\n border: true,\r\n isInitRun: props.autoLoad,\r\n ...(props.schema.tableOptions || {})\r\n }\r\n if (props.httpRequest) {\r\n base.httpRequest = props.httpRequest\r\n }\r\n const tBtns = normalizedTableBtns.value\r\n if (tBtns.length > 0) {\r\n const existing = (base.configBtn as any[]) || []\r\n base.configBtn = [...existing, ...tBtns]\r\n }\r\n return base\r\n})\r\n\r\n// ─── 表单布局 ───\r\n\r\nconst formLayoutProps = computed(() => {\r\n const layout = props.schema.formLayout\r\n if (!layout) return undefined\r\n return {\r\n rowLayProps: { gutter: 16 },\r\n fromLayProps: {\r\n labelBtnWidth: layout.labelWidth,\r\n ...(layout.minFoldRows ? { minFoldRows: layout.minFoldRows } : {})\r\n }\r\n } as any\r\n})\r\n\r\n// ─── 工具栏按钮处理 ───\r\n\r\nasync function handleToolbarBtnClick(btn: CrudBtnConfig) {\r\n const key = btn.key || btn.actionType || ''\r\n\r\n // 确认逻辑\r\n if (btn.confirm) {\r\n const msg = typeof btn.confirm === 'string' ? btn.confirm : '确定执行此操作吗?'\r\n try {\r\n await ElMessageBox.confirm(msg, '提示', { type: 'warning' })\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n // 打开弹窗\r\n if (btn.dialogKey) {\r\n // 向后兼容:仍然 emit 对应的语义事件\r\n if (key === 'add') emit('add')\r\n openDialog(btn.dialogKey)\r\n return\r\n }\r\n\r\n // 非弹窗按钮的事件\r\n if (key === 'export' || btn.actionType === 'export') {\r\n emit('export', { ...queryModel })\r\n } else if (key === 'add') {\r\n emit('add')\r\n }\r\n\r\n emit('btn-click', key, { ...queryModel })\r\n}\r\n\r\n// ─── 行按钮处理 ───\r\n\r\nasync function handleRowBtnClick(btn: RowBtnConfig, row: Record<string, unknown>) {\r\n const key = btn.key || ''\r\n\r\n // 确认逻辑\r\n if (btn.confirm) {\r\n const msg = typeof btn.confirm === 'string' ? btn.confirm : '确定执行此操作吗?'\r\n try {\r\n await ElMessageBox.confirm(msg, '提示', { type: 'warning' })\r\n } catch {\r\n return\r\n }\r\n }\r\n\r\n // 自定义 click\r\n if (btn.click) {\r\n btn.click(row, {\r\n refresh,\r\n getSelectedRows,\r\n openDialog\r\n })\r\n return\r\n }\r\n\r\n // 打开弹窗\r\n if (btn.dialogKey) {\r\n openDialog(btn.dialogKey, row)\r\n return\r\n }\r\n\r\n // 向后兼容事件\r\n if (key === 'edit') emit('edit', row)\r\n else if (key === 'delete') emit('delete', row)\r\n else if (key === 'view') emit('view', row)\r\n\r\n emit('btn-click', key, row)\r\n}\r\n\r\n// ─── 弹窗管理 ───\r\n\r\nconst dialogInstances = new Map<string, any>()\r\n\r\nfunction openDialog(key: string, row?: Record<string, unknown>) {\r\n const dialogConfig = normalizedDialogs.value[key]\r\n if (!dialogConfig) return\r\n\r\n emit('dialog-open', key, row)\r\n\r\n const dialog = useDialog()\r\n dialogInstances.set(key, dialog)\r\n\r\n const formData = reactive<Record<string, unknown>>({})\r\n if (dialogConfig.formItems) {\r\n dialogConfig.formItems.forEach((item) => {\r\n if (item.prop) {\r\n formData[item.prop] = row?.[item.prop] ?? ''\r\n }\r\n })\r\n }\r\n\r\n const title = typeof dialogConfig.title === 'function'\r\n ? dialogConfig.title(row)\r\n : dialogConfig.title || ''\r\n\r\n dialogConfig.onOpen?.(row)\r\n\r\n const configBtn = resolveDialogBtns(key, dialogConfig, formData, row || {})\r\n\r\n dialog({\r\n title,\r\n width: dialogConfig.width || '600px',\r\n isDraggable: dialogConfig.isDraggable,\r\n maxHeight: dialogConfig.maxHeight,\r\n fullscreen: dialogConfig.fullscreen,\r\n isHiddenFooter: dialogConfig.isHiddenFooter,\r\n render: dialogConfig.render\r\n ? (h: any, inst: any) => {\r\n return dialogConfig.render!(h, {\r\n row: row || {},\r\n model: formData,\r\n registerRef: inst.registerRef,\r\n close: () => closeDialog(key),\r\n refresh\r\n })\r\n }\r\n : dialogConfig.formItems\r\n ? (h: any, { registerRef }: any) => {\r\n return h(EsForm, {\r\n ref: (el: any) => el && registerRef('dialogForm', el),\r\n model: formData,\r\n formItemList: dialogConfig.formItems,\r\n layoutFormProps: {\r\n rowLayProps: { gutter: 16 },\r\n fromLayProps: {\r\n isBtnHidden: true,\r\n ...(dialogConfig.formLayout || {})\r\n }\r\n }\r\n })\r\n }\r\n : undefined,\r\n configBtn,\r\n onClosed: () => {\r\n dialogInstances.delete(key)\r\n dialogConfig.onClose?.()\r\n }\r\n })\r\n}\r\n\r\nfunction closeDialog(key: string) {\r\n const dialog = dialogInstances.get(key)\r\n if (dialog) {\r\n dialog.close()\r\n dialogInstances.delete(key)\r\n }\r\n}\r\n\r\nfunction resolveDialogBtns(\r\n key: string,\r\n config: CrudDialogConfig,\r\n formData: Record<string, unknown>,\r\n row: Record<string, unknown>\r\n): any[] | undefined {\r\n if (config.isHiddenFooter) return undefined\r\n\r\n // 用户显式指定了 configBtn\r\n if (config.configBtn) {\r\n return config.configBtn.map((btn) => {\r\n if (btn.action === 'cancel') {\r\n return {\r\n ...btn,\r\n click: (_: any, { close }: any) => {\r\n emit('dialog-cancel', key)\r\n close()\r\n }\r\n }\r\n }\r\n if (btn.action === 'confirm') {\r\n return {\r\n ...btn,\r\n click: async (_: any, { close, getRefs }: any) => {\r\n await validateAndConfirm(key, config, formData, row, close, getRefs)\r\n }\r\n }\r\n }\r\n return btn\r\n })\r\n }\r\n\r\n // 自动生成取消 + 确定\r\n return [\r\n {\r\n name: '取消',\r\n click: (_: any, { close }: any) => {\r\n emit('dialog-cancel', key)\r\n close()\r\n }\r\n },\r\n {\r\n name: '确定',\r\n type: 'primary',\r\n click: async (_: any, { close, getRefs }: any) => {\r\n await validateAndConfirm(key, config, formData, row, close, getRefs)\r\n }\r\n }\r\n ]\r\n}\r\n\r\nasync function validateAndConfirm(\r\n key: string,\r\n config: CrudDialogConfig,\r\n formData: Record<string, unknown>,\r\n row: Record<string, unknown>,\r\n close: () => void,\r\n getRefs: (name?: string) => any\r\n) {\r\n // 如果有表单,先校验\r\n if (config.formItems?.length) {\r\n const dialogForm = getRefs('dialogForm')\r\n if (dialogForm?.validate) {\r\n await dialogForm.validate()\r\n }\r\n }\r\n\r\n const context: DialogActionContext = { close, refresh, getRefs, row }\r\n\r\n // 用户自定义 onConfirm\r\n if (config.onConfirm) {\r\n await config.onConfirm(formData, context)\r\n } else {\r\n // 向后兼容:emit btn-click 事件\r\n const legacyKey = key === 'add' ? 'add-confirm' : key === 'edit' ? 'edit-confirm' : `${key}-confirm`\r\n emit('btn-click', legacyKey, formData)\r\n close()\r\n refresh()\r\n }\r\n\r\n // 新事件\r\n emit('dialog-confirm', key, formData)\r\n}\r\n\r\n// ─── 公共方法 ───\r\n\r\nfunction refresh() {\r\n tableRef.value?.httpRequestInstance?.()\r\n}\r\n\r\nfunction getSelectedRows(): Record<string, unknown>[] {\r\n return tableRef.value?.getSelectionRows?.() || []\r\n}\r\n\r\ndefineExpose({\r\n refresh,\r\n getSelectedRows,\r\n tableRef,\r\n formRef,\r\n queryModel,\r\n openDialog,\r\n closeDialog\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.es-crud-page {\r\n width: 100%;\r\n}\r\n</style>\r\n","import EsCrudPage from './src/es-crud-page.vue'\r\n\r\nEsCrudPage.install = function (app: any) {\r\n app.component(EsCrudPage.name, EsCrudPage)\r\n}\r\n\r\nexport default EsCrudPage\r\nexport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudPageProps,\r\n CrudPageEmits,\r\n CrudPageExpose,\r\n CrudBtnConfig,\r\n TableBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n RowBtnContext,\r\n CrudDialogConfig,\r\n DialogRenderContext,\r\n DialogBtnConfig,\r\n DialogActionContext\r\n} from './src/types'\r\n","<template>\r\n <div v-if=\"isExternal\" :style=\"styleExternalIcon\" class=\"svg-external-icon svg-icon\" />\r\n <svg v-else :class=\"svgClass\" aria-hidden=\"true\">\r\n <use :xlink:href=\"iconName\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\n\r\nconst props = defineProps<{\r\n iconClass: string\r\n className?: string\r\n}>()\r\n\r\nconst isExternal = computed(() => isExternals(props.iconClass))\r\nconst iconName = computed(() => `#icon-${props.iconClass}`)\r\nconst svgClass = computed(() => {\r\n if (props.className) {\r\n return 'svg-icon ' + props.className\r\n }\r\n return 'svg-icon'\r\n})\r\nconst styleExternalIcon = computed(() => {\r\n return {\r\n mask: `url(${props.iconClass}) no-repeat 50% 50%`,\r\n '-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`\r\n }\r\n})\r\n\r\nconst isExternals = (path: string) => {\r\n return /^(https?:|mailto:|tel:|open)/.test(path)\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.svg-icon {\r\n width: 1em;\r\n height: 1em;\r\n vertical-align: -0.15em;\r\n fill: currentColor;\r\n overflow: hidden;\r\n}\r\n\r\n.svg-external-icon {\r\n background-color: currentColor;\r\n mask-size: cover !important;\r\n display: inline-block;\r\n}\r\n</style>\r\n","import SvgIcon from './src/svg-icon.vue'\n\nSvgIcon.install = function (app: any) {\n app.component(SvgIcon.name, SvgIcon)\n}\n\nexport default SvgIcon","import { version } from '../package.json'\r\nimport EsDialog from './components/es-dialog'\r\nimport useDialog from './components/es-dialog/src/use-dialog'\r\nimport EsForm from './components/es-form'\r\nimport EsTable from './components/es-table'\r\nimport EsCrudPage from './components/es-crud-page'\r\nimport SvgIcon from './components/svg-icon'\r\nimport { configureEsPlus } from './config'\r\n\r\n// 组件列表\r\nconst components = [EsDialog, EsForm, EsTable, EsCrudPage, SvgIcon]\r\n\r\n// Vue 3 插件安装函数\r\nconst install = (app: any, options: Record<string, unknown> = {}) => {\r\n // 写入模块级单例,确保自动导入模式也能获取全局配置\r\n configureEsPlus(options as any)\r\n\r\n // 自动导入模式下跳过组件全局注册,避免重复注册\r\n if (!options.skipComponentRegistration) {\r\n components.forEach((component) => {\r\n if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n }\r\n\r\n if (options.globalProperties !== false) {\r\n app.config.globalProperties.$useDialog = useDialog\r\n\r\n components.forEach((component: any) => {\r\n if (component.isPlugin && component.Plugin) {\r\n app.use(component.Plugin, options[component.name] || {})\r\n }\r\n })\r\n }\r\n\r\n app.provide('$EsPlus', {\r\n useDialog,\r\n ...options\r\n })\r\n}\r\n\r\n// 按需导出\r\nexport {\r\n EsDialog,\r\n EsForm,\r\n EsTable,\r\n EsCrudPage,\r\n SvgIcon,\r\n useDialog,\r\n configureEsPlus,\r\n install\r\n}\r\n\r\n// 类型导出\r\nexport type {\r\n CrudPageSchema,\r\n CrudAction,\r\n CrudBtnConfig,\r\n OperationColumnConfig,\r\n RowBtnConfig,\r\n RowBtnContext,\r\n CrudDialogConfig,\r\n DialogRenderContext,\r\n DialogBtnConfig,\r\n DialogActionContext\r\n} from './components/es-crud-page'\r\nexport type {\r\n FormItemOption,\r\n ApiParams,\r\n BtnConfig,\r\n LayoutFormProps,\r\n TableColumn,\r\n TableOptions,\r\n PaginationConfig,\r\n DialogOptions,\r\n EsFormInstance,\r\n EsTableInstance,\r\n EsPlusOptions\r\n} from './types'\r\n\r\n// 默认导出\r\nexport default {\r\n version,\r\n install\r\n}"],"names":["zh_cn_default","_sfc_main","defineComponent","props","refsObject","reactive","getRawRef","vnodeRef","refObj","val","componentVNode","userRefCallback","flushRef","instance","comp","onMounted","onUpdated","enhancedInstance","name","el","renderContent","h","ElConfigProvider","zhCn","e","isVNode","_a","globalConfig","configureEsPlus","options","getGlobalConfig","esPlus","inject","RenderDomTb","row","index","dataKey","render","value","renderResult","firstWordUpperCase","str","columnBindAttr","cols","t","parts","camelKey","i","__props","_createBlock","_unref","ElTableColumn","_normalizeProps","_mergeProps","_openBlock","_createElementBlock","_Fragment","item","_createSlots","_withCtx","scope","_renderSlot","_ctx","RenderDom","hasPermission","_btnList","pvalue","permFn","processButtonConfig","config","processed","processedBtnLeft","computed","processedBtnRight","showContainer","getDisabledState","buttonContainerStyle","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_hoisted_3","_hoisted_4","_renderList","_normalizeStyle","_createTextVNode","_hoisted_5","DEFAULT_WIDTH","useColumnAdapter","columns","result","hasSelectionCol","c","hasIndexCol","hasExpandCol","createSelectionColumn","createExpandColumn","createIndexColumn","col","child","adaptColumn","key","title","width","base","createRenderCellRenderer","createSlotCellRenderer","createEllipsisCellRenderer","createFormatterCellRenderer","fixed","rowData","rowKey","checked","ElCheckbox","rowIndex","expanded","ElIcon","cellData","renderFn","parentSlots","slotName","slotFn","text","formatter","ElTooltip","formatted","useVirtualSelection","dataSource","rowkey","selectedKeys","ref","allSelected","indeterminate","size","onSelectRow","next","onSelectAll","getSelectedRows","keys","clearSelection","toggleRowSelection","selected","restoreSelections","useVirtualSort","sortState","onColumnSort","order","k","_b","toSortChangePayload","headerHeight","emit","__emit","tableV2Ref","tFn","dataSourceRef","toRef","columnsRef","expandedKeys","onToggleExpand","r","selectionChangeTimer","emitSelectionChange","adaptedColumns","tableClass","cls","currentRowKey","rowClassName","classes","rowClassNameOpt","rowEventHandlers","handleColumnSort","params","payload","__expose","_createVNode","ElAutoResizer","ElTableV2","useTableResize","tableContainerRef","headBarRef","tbBtnRef","paginationRef","tableHeight","observer","isNegative","num","totalContainerNum","headBarHeight","tbBtnHeight","_c","paginationHeight","_d","resizeObservers","element","containerHeight","maxContainer","minTableNum","tabContainer","_e","newHeight","startObserver","nextTick","target","stopObserver","onBeforeUnmount","useTableSelection","multipleSelection","selectionsByPage","isInitChange","handleSelectionChange","currentPage","allSelections","uniqueMap","pageSelections","handleSelectData","dataList","tableRef","pageSelecteds","selectedRow","isObject","findValueByKey","obj","depth","currentValue","prop","deepValue","wrapPromise","promise","reason","defaultOptions","slots","_useSlots","locale","injectedLocale","getCurrentInstance","$esPlusTable","checkPermission","fn","isVirtual","virtualEngineRef","tableId","tableData","columnRowList","watch","loadingStatus","slotState","showPagination","setTableContainer","bodyFormInstance","getVisibleShow","visibleShow","paginationConfig","formInstance","getListEntry","configTableField","checkQueryFields","configFields","isFormInstance","formVNode","vnode","type","hasDefaultSlot","heightType","tabHeight","slotStyles","paginationLayoutConfig","cfg","layout","paginationPageSizes","paginationIsSmall","paginationBackground","loadStatus","isRequestConf","filteredColumns","list","_h","btn","ElButton","flexIdx","TABLE_INTERNAL_KEYS","tableAttrs","merged","align","rest","fallthroughAttrs","useAttrs","tableBindAttrs","oldVal","httpRequestInstance","initSelection","clearAllSelection","handleTableSelectionChange","handleVirtualSelectionChange","rows","checkListKey","it","its","getListenToCallBack","eventName","eventNameList","hasEventNameIndex","formatConfigOut","keyList","queryTableListMethod","success","fail","apiParams","url","formData","toRaw","unref","fnParams","finalParams","requestOption","requestHandler","requestFn","res","responseData","model","resolve","reject","err","changePageIndexRequest","changePageSizeRequest","handleSizeChange","handleIndexChange","changeTableSort","column","char","newkey","j","provide","_normalizeClass","_withDirectives","TableBtns","VirtualEngine","$slots","_cache","ColumnItem","ElPagination","$event","EsTable","app","getNestedValue","path","setNestedValue","lastKey","current","useFormInputs","hFn","ElInput","ElSelect","opt","idx","ElOption","ElDatePicker","ElTimePicker","ElSlider","ElColorPicker","ElTransfer","ElCascader","ElRadioGroup","ElRadio","ElCheckboxGroup","ElSwitch","ElRate","_model","uploadProps","httpRequest","triggerRender","fileRender","restRow","uploadInstance","elUploadProps","handler","file","ElUpload","useFormLayout","folded","isBtnHidden","rowLayout","formLayout","getSetOptionsStatus","getRowColsAlgorithm","pre","groupArrayList","columnRows","formItems","statIndex","columRowIndexs","rowColIndex","_","isFold","minFoldRow","getBtnColSpan","rowNum","columnRow","lastColumn","btnColSpan","hasSpan","sum","formItem","columnNodeIndex","lastFoldIndex","useFormRequest","httpRequestGlobal","option","_params","initFormParams","requestPayload","configFormField","fieldFieldOutput","configFieldOut","configDataOption","rowValue","resultData","httpRequestFormInstance","configRows","rowsList","apiUrlList","apiResult","wrappedPromises","promiseThen","data","listenToCallBack","listData","newListOptions","getAppendToElement","appendTo","initInstance","Component","container","appContext","vNode","createVNode","useDialog","EsDialog","close","DialogComponent","dialogOptions","originalOnClosed","originalOnSubmit","args","closeFn","destroy","mergedOptions","__default__","$esPlusForm","translateLabel","injectedTableInstant","getTableInstant","ctx","isParentTable","extendedIcon","ElementPlusIconsVue","getCompIcon","filterOptions","icon","refs","formItemRowsList","setFormRef","formInputComponents","fieldFieldOutputGlobal","getEveryFormQueryField","formLayoutRef","formProps","loadedApiProps","needLoadList","existing","old","resultApiOption","formItemListFilter","visible","autoCount","autoSpan","fixedTotal","remaining","changeFolded","colRightLeftList","isRenderBtn","clickBtn","queryTableRequest","formRef","initFormItemOptions","opts","style","createDialogInstance","customerForm","customerTable","handleRefresh","getFormRowsFun","_text","getCustomerTableInfo","handleCustomerForm","formRows","_instance","handleTableItemOption","RenderBtn","formItemList","formModel","RenderDomForm","formItmeRequestInstance","propsList","targetItems","itemIndex","getFormRef","ElForm","ElCol","_vShow","ElFormItem","inx","ElDropdown","ElDropdownMenu","ElDropdownItem","EsForm","attrs","extended","lyFormInstance","renderBodyRefsObject","isFullscreen","dialogInstance","closeFullscreen","handleFullscreen","handleClose","beforeClose","filteredAttrs","initDialogCls","getMaxContentHeight","viewH","initDialogHeight","dialogVisible","getCurrentInstanceModel","RenderJsx","CopyDocument","FullScreen","Close","queryModel","items","paginationState","normalizedDialogs","dialogBase","actions","normalizedToolbarBtns","btns","normalizedOperationColumn","a","mergedFormBtns","baseBtns","toolbarBtns","resolvedBtn","handleToolbarBtnClick","mergedColumns","opCol","actionBtns","handleRowBtnClick","normalizedTableBtns","tBtns","formLayoutProps","msg","ElMessageBox","openDialog","refresh","dialogInstances","dialogConfig","dialog","configBtn","resolveDialogBtns","inst","closeDialog","registerRef","getRefs","validateAndConfirm","dialogForm","context","legacyKey","$attrs","slotData","_guardReactiveProps","EsCrudPage","isExternal","isExternals","iconName","svgClass","styleExternalIcon","SvgIcon","components","install","component","version"],"mappings":"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","x_google_ignoreList":[0]}