@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.js","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.js","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]}