es-plus-ui 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"es-plus.umd.cjs","sources":["../node_modules/element-plus/es/locale/lang/zh-cn.mjs","../src/components/es-dialog/src/render-jsx.vue","../src/components/es-table/src/column-item.vue","../src/components/es-table/src/table-btns.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}\n};\n\n//#endregion\nexport { zh_cn_default as default };\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","<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 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', {})\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>\n <div v-if=\"showContainer\" class=\"flex-float btns\">\n <div class=\"left-text\">\n {{ leftText }}\n </div>\n\n <div class=\"btn-container_block\">\n <!-- 左侧按钮组 -->\n <div class=\"btn-left\">\n <template v-for=\"(item, index) in processedBtnLeft\" :key=\"item.name\">\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\n <el-button v-else :type=\"item.type\" :size=\"item.size || 'small'\" :icon=\"item.icon\" :loading=\"item.loading || false\" v-bind=\"item\" :disabled=\"getDisabledState(item)\" @click=\"()=>item.click(instance)\">\n {{ item.name }}\n </el-button>\n </div>\n </template>\n </div>\n\n <!-- 右侧按钮组 -->\n <div class=\"btn-right\">\n <template v-for=\"(item, index) in processedBtnRight\" :key=\"item.name\">\n <div v-if=\"!item.isHide\" :style=\"buttonContainerStyle(index)\">\n <render-dom v-if=\"item.render && typeof item.render === 'function'\" :render=\"item.render\" />\n <el-button v-else :type=\"item.type\" :size=\"item.size || 'small'\" v-bind=\"item\" :icon=\"item.icon\" :loading=\"item.loading || false\" :disabled=\"getDisabledState(item)\" @click=\"() =>item.click(instance)\">\n {{ item.name }}\n </el-button>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h, inject } from 'vue'\nimport { ElButton } from 'element-plus'\n\nconst props = defineProps<{\n leftText?: string\n btnConfig?: Array<Record<string, unknown>>\n instance?: Record<string, unknown>\n}>()\n\nconst RenderDom = (props: { render: () => unknown }) => {\n if (!props.render || typeof props.render !== 'function') return null\n try {\n return props.render()\n } catch {\n return null\n }\n}\n\nRenderDom.props = {\n render: { type: Function, required: true }\n}\n\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\n\nconst hasPermission = (_btnList: unknown[], pvalue?: string) => {\n if (!pvalue) return true\n const permFn = esPlus.permission\n if (typeof permFn === 'function') return (permFn as (v: string) => boolean)(pvalue)\n return true\n}\n\nconst processButtonConfig = (config: Array<Record<string, unknown>>) => {\n return config.map((item) => {\n const processed = { ...item }\n const hasPerm = hasPermission([], item.permissionValue as string)\n\n if (!hasPerm) {\n processed.isHide = true\n } else if (typeof item.isHide === 'function') {\n processed.isHide = item.isHide()\n } else {\n processed.isHide = item.isHide || false\n }\n\n return processed\n })\n}\n\nconst processedBtnLeft = computed(() => {\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 1)).filter((item) => !item.isHide)\n})\n\nconst processedBtnRight = computed(() => {\n return processButtonConfig((props.btnConfig || []).filter((item) => item.code === 2)).filter((item) => !item.isHide)\n})\n\nconst showContainer = computed(() => {\n return props.leftText || processedBtnLeft.value.length > 0 || processedBtnRight.value.length > 0\n})\n\nconst getDisabledState = (item: Record<string, unknown>) => {\n if (typeof item.disabled === 'function') {\n return item.disabled()\n }\n return item.disabled || false\n}\n\nconst buttonContainerStyle = (index: number) => {\n return {\n display: 'inline-block',\n marginLeft: index !== 0 ? '8px' : '0px'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.btns {\n padding: 0;\n padding-bottom: 5px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.left-text {\n color: rgb(125, 125, 125);\n font-size: 14px;\n // flex-grow: 1;\n}\n\n.btn-container_block {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex: 1;\n\n .btn-left {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .btn-right {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 768px) {\n .btns {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .btn-container_block {\n flex-direction: column;\n align-items: flex-start;\n gap: 10px;\n\n .btn-left,\n .btn-right {\n width: 100%;\n justify-content: flex-start;\n }\n }\n}\n</style>\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\"\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.length) || options.leftText\"\r\n :btn-config=\"options.configBtn\"\r\n :left-text=\"options.leftText\"\r\n />\r\n <el-table\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 { 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() || {}\r\nconst $esPlusTable = inject<Record<string, unknown>>('$esPlusTable', {})\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\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// 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')\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 || '-'\r\n }\r\n return value\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 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])\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, 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\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[key as keyof PaginationConfig] = 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 || {}\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,\r\n toggleSelection: (rows: Record<string, unknown>[]) => {\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 clearAllSelection: () => clearAllSelection(tableRef.value),\r\n refsInstance: () => tableRef.value,\r\n httpRequestInstance\r\n}))\r\n\r\n// 暴露方法\r\ndefineExpose({\r\n httpRequestInstance,\r\n getSelectionRows: () => multipleSelection.value,\r\n clearSelection: () => tableRef.value?.clearSelection?.(),\r\n clearAllSelection: () => clearAllSelection(tableRef.value),\r\n refresh: () => tableRef.value?.doLayout?.()\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'\nimport {\n ElInput,\n ElSelect,\n ElOption,\n ElDatePicker,\n ElTimePicker,\n ElSlider,\n ElColorPicker,\n ElTransfer,\n ElCascader,\n ElRadioGroup,\n ElRadio,\n ElCheckboxGroup,\n ElCheckbox,\n ElSwitch,\n ElRate,\n ElUpload\n} from 'element-plus'\nimport type { FormItemOption } from '../types'\n\n// 支持嵌套属性路径的取值和赋值\nconst getNestedValue = (obj: Record<string, unknown>, path: string): unknown => {\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\n let result = obj\n for (const key of keys) {\n if (result == null) return undefined\n result = result[key] as Record<string, unknown>\n }\n return result\n}\n\nconst setNestedValue = (obj: Record<string, unknown>, path: string, value: unknown): void => {\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\n const lastKey = keys.pop()\n let current: Record<string, unknown> = obj\n for (const key of keys) {\n if (current[key] == null) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n if (lastKey) {\n current[lastKey] = value\n }\n}\n\nexport function useFormInputs() {\n const formInputComponents = (item: FormItemOption) => {\n const formPutList = new Map([\n [\n 'Input',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElInput, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Select',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElSelect,\n {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElOption, { key: idx, value: opt.value, label: opt.label })\n )\n )\n }\n ],\n [\n 'datePicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElDatePicker, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'timePicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElTimePicker, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Slider',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElSlider, {\n modelValue: getNestedValue(model, row.prop) as number,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'ColorPicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElColorPicker, {\n modelValue: getNestedValue(model, row.prop) as string,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Transfer',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElTransfer, {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Cascader',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElCascader, {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n options: row.dataOptions,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Radio',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElRadioGroup,\n {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElRadio, { key: idx, value: opt.value }, () => opt.label)\n )\n )\n }\n ],\n [\n 'Checkbox',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElCheckboxGroup,\n {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElCheckbox, { key: idx, value: opt.value }, () => opt.label)\n )\n )\n }\n ],\n [\n 'Switch',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElSwitch, {\n modelValue: getNestedValue(model, row.prop) as boolean,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Rate',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElRate, {\n modelValue: getNestedValue(model, row.prop) as number,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Upload',\n (hFn: typeof h, _model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n const { props: uploadProps, httpRequest, triggerRender, fileRender, ...restRow } = row as FormItemOption & {\n props?: Record<string, unknown>\n httpRequest?: (options: Record<string, unknown>) => Promise<unknown>\n triggerRender?: (h: typeof hFn) => ReturnType<typeof hFn>\n fileRender?: (h: typeof hFn, file: Record<string, unknown>, onRemove: () => void) => ReturnType<typeof hFn>\n }\n\n let uploadInstance: { handleRemove: (file: Record<string, unknown>) => void } | null = null\n\n // 构建 ElUpload 属性\n const elUploadProps: Record<string, unknown> = {\n ...uploadProps, // props 中的配置:action, accept, listType, limit, multiple 等\n ...restRow.attrs, // attrs 中的配置(兼容两种方式)\n ref: (el: { handleRemove: (file: Record<string, unknown>) => void } | null) => {\n uploadInstance = el\n }\n }\n\n // 将 on 中的事件转换为 Vue 3 h() 需要的 onXxx 格式\n if (restRow.on) {\n for (const [key, handler] of Object.entries(restRow.on)) {\n elUploadProps[`on${key.charAt(0).toUpperCase()}${key.slice(1)}`] = handler\n }\n }\n\n // 合并 httpRequest(优先用表单项配置的,其次用 props 中的)\n if (httpRequest) {\n elUploadProps['http-request'] = httpRequest\n }\n\n // Vue 3 h() 的 slots 参数:通过第三个参数传递命名插槽\n const slots: Record<string, (...args: unknown[]) => ReturnType<typeof hFn>> = {}\n\n // #trigger / #default 插槽\n if (triggerRender) {\n const listType = elUploadProps['listType'] || elUploadProps['list-type']\n if (listType === 'picture-card') {\n slots.trigger = () => triggerRender(hFn)\n } else {\n slots.default = () => triggerRender(hFn)\n }\n }\n\n // #file 插槽:自定义文件列表项渲染\n if (fileRender) {\n slots.file = ({ file }: { file: Record<string, unknown> }) => {\n return fileRender(hFn, file, () => {\n uploadInstance?.handleRemove(file)\n })\n }\n }\n\n return hFn(ElUpload, elUploadProps, slots)\n }\n ]\n ])\n return formPutList.get(item.formtype) || (() => null)\n }\n\n return { formInputComponents }\n}\n","import { computed, ref, watch } from 'vue'\nimport type { FormItemOption, LayoutFormProps } from '../types'\n\nexport function useFormLayout(props: { layoutFormProps?: LayoutFormProps; formItemList: FormItemOption[] }) {\n const folded = ref(false)\n\n const isBtnHidden = computed(() => props.layoutFormProps?.fromLayProps?.isBtnHidden ?? false)\n\n const rowLayout = computed(() => props.layoutFormProps?.rowLayProps || { gutter: 20 })\n\n const formLayout = computed(() => props.layoutFormProps?.fromLayProps || {})\n\n const getSetOptionsStatus = computed(() => props.layoutFormProps?.setOptions)\n\n const getRowColsAlgorithm = computed(() => {\n let pre = 0\n const groupArrayList: FormItemOption[][] = []\n const columnRows: { statIndex: number; endIndex: number }[] = []\n const formItems = props.formItemList\n\n for (let i = 0; i < formItems.length; i++) {\n const item = formItems[i]\n pre += item.span || 6\n if (pre > 24) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i })\n pre = item.span || 6\n if (i === formItems.length - 1) {\n columnRows.push({ statIndex: i, endIndex: i + 1 })\n }\n } else {\n if (i === formItems.length - 1) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i + 1 })\n } else if (pre === 24) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i + 1 })\n pre = 0\n }\n }\n }\n\n columnRows.forEach((it) => {\n groupArrayList.push(formItems.slice(it.statIndex, it.endIndex))\n })\n\n const columRowIndexs = groupArrayList.map((it) => {\n return it.map(() => 0)\n })\n\n let rowColIndex = -1\n columRowIndexs.forEach((row) => {\n row.forEach((_, idx) => {\n row[idx] = (rowColIndex += 1)\n })\n })\n\n return {\n columnRow: columRowIndexs,\n rowNum: columRowIndexs.length,\n columnNodeIndex: columRowIndexs.map((it) => it[it.length - 1])\n }\n })\n\n const isFold = computed(() => {\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\n return minFoldRow > 0 && minFoldRow < getRowColsAlgorithm.value.rowNum\n })\n\n const getBtnColSpan = computed(() => {\n const { rowNum, columnRow } = getRowColsAlgorithm.value\n const lastColumn = columnRow[rowNum - 1] || []\n const btnColSpan = props.layoutFormProps?.fromLayProps?.btnColSpan || 0\n const totalSpan = lastColumn.reduce((sum, idx) => sum + (props.formItemList[idx]?.span || 6), 0)\n const hasSpan = 24 - totalSpan\n\n return !folded.value && btnColSpan <= hasSpan ? hasSpan : 24\n })\n\n const formItem = computed(() => {\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\n const { columnNodeIndex } = getRowColsAlgorithm.value\n\n if (folded.value) {\n const lastFoldIndex = columnNodeIndex[minFoldRow - 1] ?? columnNodeIndex[columnNodeIndex.length - 1] ?? 9999\n return props.formItemList.map((it, index) => ({\n ...it,\n isFold: index > lastFoldIndex\n }))\n }\n return props.formItemList.map((it) => ({ ...it, isFold: false }))\n })\n\n watch(\n isFold,\n (val) => {\n folded.value = val\n },\n { immediate: true }\n )\n\n const changeFolded = () => {\n folded.value = !folded.value\n }\n\n return {\n folded,\n isBtnHidden,\n rowLayout,\n formLayout,\n getSetOptionsStatus,\n getRowColsAlgorithm,\n isFold,\n getBtnColSpan,\n formItem,\n changeFolded\n }\n}\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'\nimport EsDialog from './component.vue'\nimport type { DialogOptions } from '../../../types'\n\nconst getAppendToElement = (appendTo?: string | HTMLElement) => {\n if (typeof appendTo === 'string') {\n return document.querySelector(appendTo) || document.body\n }\n return appendTo instanceof HTMLElement ? appendTo : document.body\n}\n\nconst initInstance = (Component: any, props: DialogOptions, container: HTMLElement, appContext: any) => {\n const vNode = createVNode(Component, props)\n\n if (appContext) {\n vNode.appContext = appContext\n\n if (!vNode.appContext.provides) {\n vNode.appContext.provides = {}\n }\n\n // 注入语言环境(如果父应用有提供)\n const injectedLocale = appContext.provides?.elLocale\n if (injectedLocale) {\n vNode.appContext.provides['elLocale'] = injectedLocale\n }\n\n if (!vNode.appContext.config) {\n vNode.appContext.config = {}\n }\n if (!vNode.appContext.config.globalProperties) {\n vNode.appContext.config.globalProperties = {}\n }\n }\n\n render(vNode, container)\n\n const target = getAppendToElement(props.appendTo)\n target.appendChild(container)\n return vNode\n}\n\nexport const useDialog = (Component?: any, opt: { onlyInstance?: boolean } = {}) => {\n Component = Component || EsDialog\n const options = Object.assign({ onlyInstance: false }, opt)\n\n if (options.onlyInstance) {\n const instance = getCurrentInstance()\n const appContext = instance?.appContext || null\n const container = document.createElement('div')\n\n const close = () => {\n render(null, container)\n container.remove()\n }\n\n const DialogComponent = (dialogOptions: DialogOptions) => {\n if (dialogOptions.visible === undefined) {\n dialogOptions.visible = true\n }\n\n const originalOnClosed = dialogOptions.onClosed\n const originalOnSubmit = dialogOptions.onSubmit\n\n dialogOptions.onClosed = (...args: any[]) => {\n originalOnClosed?.(...args)\n close()\n }\n\n dialogOptions.onSubmit = (closeFn = close) => {\n originalOnSubmit?.(closeFn)\n }\n\n return initInstance(Component, dialogOptions, container, appContext)\n }\n\n DialogComponent.close = close\n return DialogComponent\n } else {\n const container = document.createElement('div')\n container.className = 'dialog-containers'\n const instance = getCurrentInstance()\n const appContext = instance?.appContext || null\n let vNode: any = null\n\n const close = () => {\n if (vNode && vNode.component) {\n vNode.component.props.visible = false\n }\n }\n\n const destroy = () => {\n if (vNode) {\n render(null, container)\n container.remove()\n vNode = null\n }\n }\n\n const DialogComponent = (dialogOptions: DialogOptions) => {\n if (vNode && vNode.component) {\n Object.assign(vNode.component.props, dialogOptions)\n vNode.component.props.visible = true\n return vNode\n }\n\n const mergedOptions: DialogOptions = {\n visible: true,\n width: '50%',\n destroyOnClose: true,\n ...dialogOptions\n }\n\n const { onClosed: originalOnClosed, onSubmit: originalOnSubmit } = mergedOptions\n\n mergedOptions.onClosed = () => {\n originalOnClosed?.()\n close()\n }\n\n mergedOptions.onSubmit = (closeFn = close) => {\n originalOnSubmit?.(closeFn)\n }\n\n vNode = initInstance(Component, mergedOptions, container, appContext)\n return vNode\n }\n\n DialogComponent.close = close\n DialogComponent.destroy = destroy\n return DialogComponent\n }\n}\n\nexport default useDialog\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 || 6\">\r\n <el-form-item\r\n :label=\"translateLabel(item)\"\r\n v-bind=\"initFormItemOptions(item.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\"\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.labelBtnWidth ? formProps.labelBtnWidth : formProps.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 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', {})\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\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?.ctx as Record<string, unknown>\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 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 ...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 return list\r\n .map((it) => (it ? { ...it, span: it.span || 6, dataOptions: it.dataOptions || [] } : null))\r\n .filter((it): it is FormItemOption => {\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\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 { resetFields: () => void }, 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.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?.ctx?.dialogInstance ? instance.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,\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,\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?.ctx as Record<string, unknown>)?.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>\n <div class=\"dp-dialog_wrapper\">\n <el-dialog\n :class=\"['dg-dialog', initDialogCls]\"\n v-bind=\"filteredAttrs\"\n v-model=\"dialogVisible\"\n :draggable=\"props.isDraggable\"\n :width=\"props.width\"\n :show-close=\"false\"\n @close=\"beforeClose\"\n :fullscreen=\"filteredAttrs?.fullscreen ?? isFullscreen\"\n >\n <template #header>\n <template v-if=\"props.renderHeader\">\n <RenderJsx :render=\"props.renderHeader\" :instance=\"getCurrentInstanceModel\" />\n </template>\n <template v-else>\n <div>\n <span class=\"dialog-title\">{{ props.title }}</span>\n </div>\n <div class=\"btns\">\n <el-icon @click=\"handleFullscreen\" v-show=\"!props.hiddenFullBtn\">\n <FullScreen v-if=\"!isFullscreen\" />\n <CopyDocument v-else />\n </el-icon>\n <el-icon @click=\"handleClose\"><Close /></el-icon>\n </div>\n </template>\n </template>\n\n <div class=\"dialog_body_layouts\" :style=\"initDialogHeight\">\n <template v-if=\"props.render && typeof props.render === 'function'\">\n <RenderJsx\n :refs=\"renderBodyRefsObject\"\n :instance=\"getCurrentInstanceModel\"\n :render=\"props.render\"\n :components=\"{ EsTable, EsForm }\"\n :locale=\"locale\"\n />\n </template>\n </div>\n\n <template #footer v-if=\"!attrs.isHiddenFooter\">\n <span v-if=\"!slots.footer\" class=\"dialog-footer\">\n <template v-if=\"props.renderFooter && typeof props.renderFooter === 'function'\">\n <RenderJsx :render=\"props.renderFooter\" :instance=\"getCurrentInstanceModel\" />\n </template>\n <template v-else-if=\"props.configBtn && props.configBtn.length\">\n <template v-for=\"(it, inx) in configBtn\" :key=\"it.key || inx\">\n <el-button\n v-if=\"checkPermission(it.permissionValue)\"\n size=\"small\"\n v-bind=\"filterOptions(it)\"\n :icon=\"getCompIcon(it.icon)\"\n :disabled=\"typeof it.disabled === 'function' ? it.disabled() : it.disabled || false\"\n @click=\"() => {\n it.click?.(renderBodyRefsObject.currentRef, {\n close: handleClose,\n getRefs: (name?: string) => {\n if (name) return renderBodyRefsObject[name] || null\n return renderBodyRefsObject\n },\n dialogInstance\n })\n }\"\n >\n {{ it.name }}\n </el-button>\n </template>\n </template>\n </span>\n <slot v-else name=\"footer\" />\n </template>\n </el-dialog>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, reactive, getCurrentInstance, provide, inject, useAttrs } from 'vue'\nimport { ElConfigProvider, ElDialog, ElButton, ElIcon } from 'element-plus'\nimport { FullScreen, Close, CopyDocument } from '@element-plus/icons-vue'\nimport RenderJsx from './render-jsx.vue'\nimport EsTable from '../../es-table'\nimport EsForm from '../../es-form'\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\nimport type { BtnConfig } from '../../../types'\n\nconst props = defineProps<{\n title?: string\n visible?: boolean\n appendTo?: object | string\n hiddenFullBtn?: boolean\n width?: string | number\n isDraggable?: boolean\n confirmText?: string\n cancelText?: string\n configBtn?: BtnConfig[]\n maxHeight?: string | number\n isHiddenFooter?: boolean\n renderHeader?: Function\n renderFooter?: Function\n render?: Function\n fullscreen?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:visible': [val: boolean]\n closed: [val: boolean]\n submit: [payload: any]\n}>()\n\nconst slots = defineSlots()\n\nconst instance = getCurrentInstance()\nconst attrs = useAttrs()\n\nconst extended = Object.fromEntries(Object.entries(ElementPlusIconsVue).map(([key]) => [key, ElementPlusIconsVue[key]]))\n\nconst lyFormInstance = ref(null)\nconst renderBodyRefsObject = reactive<Record<string, any>>({})\nconst isFullscreen = ref(false)\nconst dialogInstance = instance\nconst locale = ref(zhCn)\n\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\n\nconst checkPermission = (pvalue?: string): boolean => {\n if (!pvalue) return true\n const fn = esPlus.permission\n return typeof fn === 'function' ? (fn as (v: string) => boolean)(pvalue) : true\n}\n\nconst injectedLocale = inject('elLocale', null)\nif (injectedLocale) {\n locale.value = injectedLocale as any\n}\n\nprovide('elLocale', locale.value)\n\nconst getCompIcon = (key?: string) => {\n return key ? extended[key] || key : undefined\n}\n\nconst filterOptions = (it: BtnConfig) => {\n const { icon, ...opt } = it as Record<string, unknown>\n return opt\n}\n\nconst closeFullscreen = () => {\n setTimeout(() => {\n if (isFullscreen.value) {\n isFullscreen.value = false\n }\n }, 500)\n}\n\nconst handleFullscreen = () => {\n if (attrs?.fullscreen) return\n isFullscreen.value = !isFullscreen.value\n}\n\nconst handleClose = () => {\n emit('closed', false)\n closeFullscreen()\n}\n\nconst handleConfirm = () => {\n emit('submit', { renderBodyRefs: renderBodyRefsObject.currentRef, lyFormInstance, dialogInstance })\n}\n\nconst beforeClose = () => {\n emit('closed', false)\n closeFullscreen()\n}\n\nconst filteredAttrs = computed(() => {\n const { ...rest } = attrs\n return rest\n})\n\nconst initDialogCls = computed(() => {\n if (!isFullscreen.value) {\n if (props.maxHeight) return 'dialogShadow'\n return 'dialogAuto'\n }\n return 'dialogFull'\n})\n\nconst getMaxContentHeight = () => {\n const viewH = window.innerHeight\n return Math.max(viewH - 135, 200)\n}\n\nconst initDialogHeight = computed(() => {\n const viewH = getMaxContentHeight()\n if (!isFullscreen.value) {\n if (props.maxHeight) {\n return { maxHeight: typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight }\n }\n return { maxHeight: viewH + 'px' }\n }\n return { height: viewH + 'px' }\n})\n\nconst dialogVisible = computed({\n get: () => props.visible || false,\n set: (val) => {\n emit('update:visible', val)\n if (!val) {\n emit('closed', val)\n closeFullscreen()\n }\n }\n})\n\nconst getCurrentInstanceModel = computed(() => ({\n renderBodyRefs: renderBodyRefsObject.currentRef,\n renderBodyRefsObject,\n lyFormInstance,\n dialogInstance,\n getRefs: () => renderBodyRefsObject\n}))\n\nprovide('bodyFormInstance', (e: any) => {\n lyFormInstance.value = e\n})\n\nif (instance) {\n instance.exposed = {\n closed: handleClose\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dp-dialog_wrapper {\n :deep(.dialogAuto) {\n margin: 0px !important;\n }\n :deep(.el-overlay-dialog) {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n :deep(.el-dialog) {\n padding: 10px;\n\n .el-dialog__footer {\n padding-top: 0px;\n }\n\n .el-dialog__body {\n padding: 10px 0px;\n }\n\n .el-dialog__header {\n border-bottom: 1px solid #eee;\n display: flex;\n padding: 0px 0px 10px 0px;\n align-items: center;\n justify-content: space-between;\n margin: 0;\n }\n }\n}\n\n.dialog-title {\n line-height: 24px;\n font-size: 14px;\n color: #303133;\n font-weight: bold;\n}\n\n.btns {\n display: flex;\n align-items: center;\n\n i {\n margin-right: 8px;\n font-size: 14px;\n cursor: pointer;\n\n &:last-child {\n margin-right: 0;\n }\n }\n}\n\n.dialog_body_layouts {\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: #87a2bd26 #c8d5e147;\n}\n\n/* 滚动条样式 */\n*::-webkit-scrollbar {\n width: 14px;\n height: 14px;\n}\n\n*::-webkit-scrollbar-button {\n width: 0;\n height: 0;\n display: none;\n}\n\n*::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n\n*::-webkit-scrollbar-thumb {\n min-height: 12px;\n border: 4px solid transparent;\n background-clip: content-box;\n border-radius: 7px;\n background-color: #c8d5e1;\n\n &:hover {\n background-color: #a8bbcf;\n }\n\n &:active {\n background-color: #87a2bd;\n }\n}\n\n*::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n*::-webkit-scrollbar-track-piece {\n background-color: transparent;\n}\n</style>\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>\n <div class=\"es-crud-page\">\n <es-table\n ref=\"tableRef\"\n :columns=\"mergedColumns\"\n :options=\"mergedOptions\"\n v-model:data-source=\"tableData\"\n v-model:pagination=\"paginationState\"\n v-bind=\"$attrs\"\n >\n <es-form\n v-if=\"schema.formItems && schema.formItems.length\"\n ref=\"formRef\"\n :model=\"queryModel\"\n :form-item-list=\"schema.formItems\"\n :config-btn=\"mergedQueryBtns\"\n />\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotData\">\n <slot :name=\"name\" v-bind=\"slotData || {}\" />\n </template>\n </es-table>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch } from 'vue'\nimport EsForm from '../../es-form/src/es-form.vue'\nimport EsTable from '../../es-table/src/component.vue'\nimport useDialog from '../../es-dialog/src/use-dialog'\nimport type { CrudPageSchema, CrudAction } from './types'\nimport type { BtnConfig, TableColumn } from '../../../types'\n\ndefineOptions({ name: 'EsCrudPage' })\n\nconst props = withDefaults(\n defineProps<{\n schema: CrudPageSchema\n httpRequest?: (params: Record<string, unknown>) => Promise<unknown>\n autoLoad?: boolean\n }>(),\n {\n autoLoad: true\n }\n)\n\nconst emit = defineEmits<{\n 'query': [model: Record<string, unknown>]\n 'add': []\n 'edit': [row: Record<string, unknown>]\n 'delete': [row: Record<string, unknown>]\n 'view': [row: Record<string, unknown>]\n 'export': [model: Record<string, unknown>]\n 'row-click': [row: Record<string, unknown>]\n 'btn-click': [key: string, row?: Record<string, unknown>]\n}>()\n\nconst tableRef = ref<any>(null)\nconst formRef = ref<any>(null)\nconst tableData = ref<Record<string, unknown>[]>([])\n\nconst queryModel = reactive<Record<string, unknown>>({})\n\nwatch(\n () => props.schema.formItems,\n (items) => {\n if (items) {\n items.forEach((item) => {\n if (item.prop && !(item.prop in queryModel)) {\n queryModel[item.prop] = ''\n }\n })\n }\n },\n { immediate: true }\n)\n\nconst paginationState = ref({\n current: 1,\n pageSize: 10,\n total: 0,\n ...(props.schema.pagination || {})\n})\n\nconst actions = computed<CrudAction[]>(() => props.schema.actions || ['add', 'edit', 'delete'])\n\nconst mergedQueryBtns = computed<BtnConfig[]>(() => {\n if (props.schema.queryBtns) return props.schema.queryBtns\n\n const btns: BtnConfig[] = [\n { name: '查询', type: 'primary', key: 'query', triggerEvent: true },\n { name: '重置', key: 'rest', triggerEvent: true },\n ]\n if (actions.value.includes('add')) {\n btns.push({\n name: '新增',\n type: 'primary',\n key: 'add',\n icon: 'Plus',\n click: () => handleAdd()\n })\n }\n if (actions.value.includes('export')) {\n btns.push({\n name: '导出',\n key: 'export',\n icon: 'Download',\n click: () => emit('export', { ...queryModel })\n })\n }\n return btns\n})\n\nconst mergedColumns = computed<TableColumn[]>(() => {\n const cols = [...(props.schema.columns || [])]\n\n const hasActionCol = cols.some((c) => c.prop === 'action' || c.btns)\n if (!hasActionCol && actions.value.some((a) => ['edit', 'delete', 'view'].includes(a))) {\n const actionBtns: any[] = []\n if (actions.value.includes('view')) {\n actionBtns.push({ name: '查看', type: 'primary', clickEvent: (row: any) => handleView(row) })\n }\n if (actions.value.includes('edit')) {\n actionBtns.push({ name: '编辑', type: 'primary', clickEvent: (row: any) => handleEdit(row) })\n }\n if (actions.value.includes('delete')) {\n actionBtns.push({ name: '删除', type: 'danger', clickEvent: (row: any) => handleDelete(row) })\n }\n cols.push({\n prop: 'action',\n label: '操作',\n width: actionBtns.length * 80 + 20,\n fixed: 'right',\n btns: actionBtns\n })\n }\n return cols\n})\n\nconst mergedOptions = computed(() => {\n const base: Record<string, unknown> = {\n border: true,\n isInitRun: props.autoLoad,\n ...(props.schema.tableOptions || {})\n }\n if (props.httpRequest) {\n base.httpRequest = props.httpRequest\n }\n const hasHttp = base.httpRequest && typeof base.httpRequest === 'function'\n if (hasHttp && !base.apiParams && !base.actionUrl) {\n base.apiParams = { url: '/crud-page', method: 'GET' }\n }\n return base\n})\n\nfunction handleAdd() {\n if (props.schema.dialogFormItems?.length) {\n openFormDialog('新增', {})\n }\n emit('add')\n}\n\nfunction handleEdit(row: Record<string, unknown>) {\n if (props.schema.dialogFormItems?.length) {\n openFormDialog('编辑', { ...row })\n }\n emit('edit', row)\n}\n\nfunction handleDelete(row: Record<string, unknown>) {\n emit('delete', row)\n}\n\nfunction handleView(row: Record<string, unknown>) {\n emit('view', row)\n}\n\nfunction openFormDialog(title: string, row: Record<string, unknown>) {\n const dialog = useDialog()\n const formData = reactive<Record<string, unknown>>({})\n\n props.schema.dialogFormItems?.forEach((item) => {\n if (item.prop) {\n formData[item.prop] = row[item.prop] ?? ''\n }\n })\n\n const dialogWidth = props.schema.dialogOptions?.width || '600px'\n\n dialog({\n title,\n width: dialogWidth,\n ...(props.schema.dialogOptions || {}),\n render: (h: any, { registerRef }: any) => {\n return h(EsForm, {\n ref: (el: any) => el && registerRef('dialogForm', el),\n model: formData,\n formItemList: props.schema.dialogFormItems,\n layoutFormProps: {\n rowLayProps: { gutter: 16 },\n fromLayProps: { isBtnHidden: true }\n }\n })\n },\n configBtn: [\n {\n name: '取消',\n click: (_: any, { close }: any) => close()\n },\n {\n name: '确定',\n type: 'primary',\n click: async (_: any, { close, getRefs }: any) => {\n const dialogForm = getRefs('dialogForm')\n if (dialogForm?.validate) {\n await dialogForm.validate()\n }\n emit('btn-click', title === '新增' ? 'add-confirm' : 'edit-confirm', formData)\n close()\n refresh()\n }\n }\n ]\n })\n}\n\nfunction refresh() {\n tableRef.value?.httpRequestInstance?.()\n}\n\nfunction getSelectedRows(): Record<string, unknown>[] {\n return tableRef.value?.getSelectionRows?.() || []\n}\n\ndefineExpose({\n refresh,\n getSelectedRows,\n tableRef,\n formRef,\n queryModel\n})\n</script>\n\n<style scoped>\n.es-crud-page {\n width: 100%;\n}\n</style>\n","import EsCrudPage from './src/es-crud-page.vue'\n\nEsCrudPage.install = function (app: any) {\n app.component(EsCrudPage.name, EsCrudPage)\n}\n\nexport default EsCrudPage\nexport type { CrudPageSchema, CrudAction, CrudPageProps, CrudPageEmits, CrudPageExpose } from './src/types'\n","<template>\n <div v-if=\"isExternal\" :style=\"styleExternalIcon\" class=\"svg-external-icon svg-icon\" />\n <svg v-else :class=\"svgClass\" aria-hidden=\"true\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nconst props = defineProps<{\n iconClass: string\n className?: string\n}>()\n\nconst isExternal = computed(() => isExternals(props.iconClass))\nconst iconName = computed(() => `#icon-${props.iconClass}`)\nconst svgClass = computed(() => {\n if (props.className) {\n return 'svg-icon ' + props.className\n }\n return 'svg-icon'\n})\nconst styleExternalIcon = computed(() => {\n return {\n mask: `url(${props.iconClass}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`\n }\n})\n\nconst isExternals = (path: string) => {\n return /^(https?:|mailto:|tel:|open)/.test(path)\n}\n</script>\n\n<style scoped>\n.svg-icon {\n width: 1em;\n height: 1em;\n vertical-align: -0.15em;\n fill: currentColor;\n overflow: hidden;\n}\n\n.svg-external-icon {\n background-color: currentColor;\n mask-size: cover !important;\n display: inline-block;\n}\n</style>\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'\nimport EsDialog from './components/es-dialog'\nimport useDialog from './components/es-dialog/src/use-dialog'\nimport EsForm from './components/es-form'\nimport EsTable from './components/es-table'\nimport EsCrudPage from './components/es-crud-page'\nimport SvgIcon from './components/svg-icon'\n\n// 组件列表\nconst components = [EsDialog, EsForm, EsTable, EsCrudPage, SvgIcon]\n\n// Vue 3 插件安装函数\nconst install = (app: any, options: Record<string, unknown> = {}) => {\n components.forEach((component) => {\n if (component.name) {\n app.component(component.name, component)\n }\n })\n\n if (options.globalProperties !== false) {\n app.config.globalProperties.$useDialog = useDialog\n\n components.forEach((component: any) => {\n if (component.isPlugin && component.Plugin) {\n app.use(component.Plugin, options[component.name] || {})\n }\n })\n }\n\n app.provide('$EsPlus', {\n useDialog,\n ...options\n })\n}\n\n// 按需导出\nexport {\n EsDialog,\n EsForm,\n EsTable,\n EsCrudPage,\n SvgIcon,\n useDialog,\n install\n}\n\n// 类型导出\nexport type { CrudPageSchema, CrudAction } from './components/es-crud-page'\nexport type {\n FormItemOption,\n ApiParams,\n BtnConfig,\n LayoutFormProps,\n TableColumn,\n TableOptions,\n PaginationConfig,\n DialogOptions,\n EsFormInstance,\n EsTableInstance,\n EsPlusOptions\n} from './types'\n\n// 默认导出\nexport default {\n version,\n install\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","esPlus","inject","RenderDomTb","row","index","dataKey","render","value","renderResult","firstWordUpperCase","str","columnBindAttr","cols","options","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","useTableResize","tableContainerRef","headBarRef","tbBtnRef","paginationRef","tableHeight","ref","observer","isNegative","num","totalContainerNum","headBarHeight","tbBtnHeight","_c","_b","paginationHeight","_d","resizeObservers","element","containerHeight","maxContainer","minTableNum","tabContainer","_e","newHeight","startObserver","nextTick","target","stopObserver","onBeforeUnmount","useTableSelection","rowkey","multipleSelection","selectionsByPage","isInitChange","handleSelectionChange","currentPage","allSelections","uniqueMap","pageSelections","key","handleSelectData","dataList","tableRef","pageSelecteds","selectedRow","isObject","findValueByKey","obj","depth","currentValue","prop","deepValue","wrapPromise","promise","reason","defaultOptions","emit","__emit","slots","_useSlots","locale","injectedLocale","getCurrentInstance","$esPlusTable","checkPermission","fn","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","TABLE_INTERNAL_KEYS","tableAttrs","merged","align","rest","result","fallthroughAttrs","useAttrs","tableBindAttrs","oldVal","httpRequestInstance","initSelection","clearAllSelection","handleTableSelectionChange","checkListKey","it","its","getListenToCallBack","eventName","params","eventNameList","hasEventNameIndex","formatConfigOut","keyList","rowData","queryTableListMethod","success","fail","apiParams","url","formData","toRaw","unref","fnParams","finalParams","requestOption","requestHandler","requestFn","res","responseData","model","resolve","reject","err","changePageIndexRequest","changePageSizeRequest","handleSizeChange","size","handleIndexChange","changeTableSort","column","char","newkey","j","provide","rows","__expose","_normalizeClass","_withDirectives","TableBtns","_cache","ColumnItem","_createVNode","ElPagination","$event","EsTable","app","getNestedValue","path","keys","setNestedValue","lastKey","current","useFormInputs","hFn","ElInput","ElSelect","opt","idx","ElOption","ElDatePicker","ElTimePicker","ElSlider","ElColorPicker","ElTransfer","ElCascader","ElRadioGroup","ElRadio","ElCheckboxGroup","ElCheckbox","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","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","ElIcon","CopyDocument","FullScreen","Close","queryModel","items","paginationState","actions","mergedQueryBtns","btns","handleAdd","mergedColumns","c","a","actionBtns","handleView","handleEdit","handleDelete","base","openFormDialog","title","dialog","dialogWidth","registerRef","getRefs","dialogForm","refresh","getSelectedRows","$attrs","$slots","slotData","_guardReactiveProps","EsCrudPage","isExternal","isExternals","iconName","svgClass","styleExternalIcon","SvgIcon","components","install","component","version"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"es-plus.umd.cjs","sources":["../node_modules/element-plus/es/locale/lang/zh-cn.mjs","../src/components/es-dialog/src/render-jsx.vue","../src/components/es-table/src/column-item.vue","../src/components/es-table/src/table-btns.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}\n};\n\n//#endregion\nexport { zh_cn_default as default };\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","<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 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', {})\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\" :size=\"item.size || 'small'\" :icon=\"item.icon\" :loading=\"item.loading || false\" v-bind=\"item\" :disabled=\"getDisabledState(item)\" @click=\"()=>item.click(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\" :size=\"item.size || 'small'\" v-bind=\"item\" :icon=\"item.icon\" :loading=\"item.loading || false\" :disabled=\"getDisabledState(item)\" @click=\"() =>item.click(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\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: () => unknown }) => {\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', {})\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>) => {\r\n if (typeof item.disabled === 'function') {\r\n return item.disabled()\r\n }\r\n return item.disabled || 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 { 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\"\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.length) || options.leftText\"\r\n :btn-config=\"options.configBtn\"\r\n :left-text=\"options.leftText\"\r\n />\r\n <el-table\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 { 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() || {}\r\nconst $esPlusTable = inject<Record<string, unknown>>('$esPlusTable', {})\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\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// 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')\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 || '-'\r\n }\r\n return value\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 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])\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, 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\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[key as keyof PaginationConfig] = 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 || {}\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,\r\n toggleSelection: (rows: Record<string, unknown>[]) => {\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 clearAllSelection: () => clearAllSelection(tableRef.value),\r\n refsInstance: () => tableRef.value,\r\n httpRequestInstance\r\n}))\r\n\r\n// 暴露方法\r\ndefineExpose({\r\n httpRequestInstance,\r\n getSelectionRows: () => multipleSelection.value,\r\n clearSelection: () => tableRef.value?.clearSelection?.(),\r\n clearAllSelection: () => clearAllSelection(tableRef.value),\r\n refresh: () => tableRef.value?.doLayout?.()\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'\nimport {\n ElInput,\n ElSelect,\n ElOption,\n ElDatePicker,\n ElTimePicker,\n ElSlider,\n ElColorPicker,\n ElTransfer,\n ElCascader,\n ElRadioGroup,\n ElRadio,\n ElCheckboxGroup,\n ElCheckbox,\n ElSwitch,\n ElRate,\n ElUpload\n} from 'element-plus'\nimport type { FormItemOption } from '../types'\n\n// 支持嵌套属性路径的取值和赋值\nconst getNestedValue = (obj: Record<string, unknown>, path: string): unknown => {\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\n let result = obj\n for (const key of keys) {\n if (result == null) return undefined\n result = result[key] as Record<string, unknown>\n }\n return result\n}\n\nconst setNestedValue = (obj: Record<string, unknown>, path: string, value: unknown): void => {\n const keys = path.split(/\\.|\\[|\\]/).filter(Boolean)\n const lastKey = keys.pop()\n let current: Record<string, unknown> = obj\n for (const key of keys) {\n if (current[key] == null) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n if (lastKey) {\n current[lastKey] = value\n }\n}\n\nexport function useFormInputs() {\n const formInputComponents = (item: FormItemOption) => {\n const formPutList = new Map([\n [\n 'Input',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElInput, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Select',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElSelect,\n {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElOption, { key: idx, value: opt.value, label: opt.label })\n )\n )\n }\n ],\n [\n 'datePicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElDatePicker, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'timePicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElTimePicker, {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Slider',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElSlider, {\n modelValue: getNestedValue(model, row.prop) as number,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'ColorPicker',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElColorPicker, {\n modelValue: getNestedValue(model, row.prop) as string,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Transfer',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElTransfer, {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Cascader',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElCascader, {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n options: row.dataOptions,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Radio',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElRadioGroup,\n {\n modelValue: getNestedValue(model, row.prop),\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElRadio, { key: idx, value: opt.value }, () => opt.label)\n )\n )\n }\n ],\n [\n 'Checkbox',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(\n ElCheckboxGroup,\n {\n modelValue: getNestedValue(model, row.prop) as unknown[],\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n },\n () =>\n row.dataOptions?.map((opt, idx) =>\n hFn(ElCheckbox, { key: idx, value: opt.value }, () => opt.label)\n )\n )\n }\n ],\n [\n 'Switch',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElSwitch, {\n modelValue: getNestedValue(model, row.prop) as boolean,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Rate',\n (hFn: typeof h, model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n return hFn(ElRate, {\n modelValue: getNestedValue(model, row.prop) as number,\n ...row.attrs,\n ...row.on,\n 'onUpdate:modelValue': (val: unknown) => {\n setNestedValue(model, row.prop, val)\n }\n })\n }\n ],\n [\n 'Upload',\n (hFn: typeof h, _model: Record<string, unknown>, { row }: { row: FormItemOption }) => {\n const { props: uploadProps, httpRequest, triggerRender, fileRender, ...restRow } = row as FormItemOption & {\n props?: Record<string, unknown>\n httpRequest?: (options: Record<string, unknown>) => Promise<unknown>\n triggerRender?: (h: typeof hFn) => ReturnType<typeof hFn>\n fileRender?: (h: typeof hFn, file: Record<string, unknown>, onRemove: () => void) => ReturnType<typeof hFn>\n }\n\n let uploadInstance: { handleRemove: (file: Record<string, unknown>) => void } | null = null\n\n // 构建 ElUpload 属性\n const elUploadProps: Record<string, unknown> = {\n ...uploadProps, // props 中的配置:action, accept, listType, limit, multiple 等\n ...restRow.attrs, // attrs 中的配置(兼容两种方式)\n ref: (el: { handleRemove: (file: Record<string, unknown>) => void } | null) => {\n uploadInstance = el\n }\n }\n\n // 将 on 中的事件转换为 Vue 3 h() 需要的 onXxx 格式\n if (restRow.on) {\n for (const [key, handler] of Object.entries(restRow.on)) {\n elUploadProps[`on${key.charAt(0).toUpperCase()}${key.slice(1)}`] = handler\n }\n }\n\n // 合并 httpRequest(优先用表单项配置的,其次用 props 中的)\n if (httpRequest) {\n elUploadProps['http-request'] = httpRequest\n }\n\n // Vue 3 h() 的 slots 参数:通过第三个参数传递命名插槽\n const slots: Record<string, (...args: unknown[]) => ReturnType<typeof hFn>> = {}\n\n // #trigger / #default 插槽\n if (triggerRender) {\n const listType = elUploadProps['listType'] || elUploadProps['list-type']\n if (listType === 'picture-card') {\n slots.trigger = () => triggerRender(hFn)\n } else {\n slots.default = () => triggerRender(hFn)\n }\n }\n\n // #file 插槽:自定义文件列表项渲染\n if (fileRender) {\n slots.file = ({ file }: { file: Record<string, unknown> }) => {\n return fileRender(hFn, file, () => {\n uploadInstance?.handleRemove(file)\n })\n }\n }\n\n return hFn(ElUpload, elUploadProps, slots)\n }\n ]\n ])\n return formPutList.get(item.formtype) || (() => null)\n }\n\n return { formInputComponents }\n}\n","import { computed, ref, watch } from 'vue'\nimport type { FormItemOption, LayoutFormProps } from '../types'\n\nexport function useFormLayout(props: { layoutFormProps?: LayoutFormProps; formItemList: FormItemOption[] }) {\n const folded = ref(false)\n\n const isBtnHidden = computed(() => props.layoutFormProps?.fromLayProps?.isBtnHidden ?? false)\n\n const rowLayout = computed(() => props.layoutFormProps?.rowLayProps || { gutter: 20 })\n\n const formLayout = computed(() => props.layoutFormProps?.fromLayProps || {})\n\n const getSetOptionsStatus = computed(() => props.layoutFormProps?.setOptions)\n\n const getRowColsAlgorithm = computed(() => {\n let pre = 0\n const groupArrayList: FormItemOption[][] = []\n const columnRows: { statIndex: number; endIndex: number }[] = []\n const formItems = props.formItemList\n\n for (let i = 0; i < formItems.length; i++) {\n const item = formItems[i]\n pre += item.span || 6\n if (pre > 24) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i })\n pre = item.span || 6\n if (i === formItems.length - 1) {\n columnRows.push({ statIndex: i, endIndex: i + 1 })\n }\n } else {\n if (i === formItems.length - 1) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i + 1 })\n } else if (pre === 24) {\n const statIndex = columnRows.length ? columnRows[columnRows.length - 1].endIndex : 0\n columnRows.push({ statIndex, endIndex: i + 1 })\n pre = 0\n }\n }\n }\n\n columnRows.forEach((it) => {\n groupArrayList.push(formItems.slice(it.statIndex, it.endIndex))\n })\n\n const columRowIndexs = groupArrayList.map((it) => {\n return it.map(() => 0)\n })\n\n let rowColIndex = -1\n columRowIndexs.forEach((row) => {\n row.forEach((_, idx) => {\n row[idx] = (rowColIndex += 1)\n })\n })\n\n return {\n columnRow: columRowIndexs,\n rowNum: columRowIndexs.length,\n columnNodeIndex: columRowIndexs.map((it) => it[it.length - 1])\n }\n })\n\n const isFold = computed(() => {\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\n return minFoldRow > 0 && minFoldRow < getRowColsAlgorithm.value.rowNum\n })\n\n const getBtnColSpan = computed(() => {\n const { rowNum, columnRow } = getRowColsAlgorithm.value\n const lastColumn = columnRow[rowNum - 1] || []\n const btnColSpan = props.layoutFormProps?.fromLayProps?.btnColSpan || 0\n const totalSpan = lastColumn.reduce((sum, idx) => sum + (props.formItemList[idx]?.span || 6), 0)\n const hasSpan = 24 - totalSpan\n\n return !folded.value && btnColSpan <= hasSpan ? hasSpan : 24\n })\n\n const formItem = computed(() => {\n const minFoldRow = props.layoutFormProps?.fromLayProps?.minFoldRows || 0\n const { columnNodeIndex } = getRowColsAlgorithm.value\n\n if (folded.value) {\n const lastFoldIndex = columnNodeIndex[minFoldRow - 1] ?? columnNodeIndex[columnNodeIndex.length - 1] ?? 9999\n return props.formItemList.map((it, index) => ({\n ...it,\n isFold: index > lastFoldIndex\n }))\n }\n return props.formItemList.map((it) => ({ ...it, isFold: false }))\n })\n\n watch(\n isFold,\n (val) => {\n folded.value = val\n },\n { immediate: true }\n )\n\n const changeFolded = () => {\n folded.value = !folded.value\n }\n\n return {\n folded,\n isBtnHidden,\n rowLayout,\n formLayout,\n getSetOptionsStatus,\n getRowColsAlgorithm,\n isFold,\n getBtnColSpan,\n formItem,\n changeFolded\n }\n}\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'\nimport EsDialog from './component.vue'\nimport type { DialogOptions } from '../../../types'\n\nconst getAppendToElement = (appendTo?: string | HTMLElement) => {\n if (typeof appendTo === 'string') {\n return document.querySelector(appendTo) || document.body\n }\n return appendTo instanceof HTMLElement ? appendTo : document.body\n}\n\nconst initInstance = (Component: any, props: DialogOptions, container: HTMLElement, appContext: any) => {\n const vNode = createVNode(Component, props)\n\n if (appContext) {\n vNode.appContext = appContext\n\n if (!vNode.appContext.provides) {\n vNode.appContext.provides = {}\n }\n\n // 注入语言环境(如果父应用有提供)\n const injectedLocale = appContext.provides?.elLocale\n if (injectedLocale) {\n vNode.appContext.provides['elLocale'] = injectedLocale\n }\n\n if (!vNode.appContext.config) {\n vNode.appContext.config = {}\n }\n if (!vNode.appContext.config.globalProperties) {\n vNode.appContext.config.globalProperties = {}\n }\n }\n\n render(vNode, container)\n\n const target = getAppendToElement(props.appendTo)\n target.appendChild(container)\n return vNode\n}\n\nexport const useDialog = (Component?: any, opt: { onlyInstance?: boolean } = {}) => {\n Component = Component || EsDialog\n const options = Object.assign({ onlyInstance: false }, opt)\n\n if (options.onlyInstance) {\n const instance = getCurrentInstance()\n const appContext = instance?.appContext || null\n const container = document.createElement('div')\n\n const close = () => {\n render(null, container)\n container.remove()\n }\n\n const DialogComponent = (dialogOptions: DialogOptions) => {\n if (dialogOptions.visible === undefined) {\n dialogOptions.visible = true\n }\n\n const originalOnClosed = dialogOptions.onClosed\n const originalOnSubmit = dialogOptions.onSubmit\n\n dialogOptions.onClosed = (...args: any[]) => {\n originalOnClosed?.(...args)\n close()\n }\n\n dialogOptions.onSubmit = (closeFn = close) => {\n originalOnSubmit?.(closeFn)\n }\n\n return initInstance(Component, dialogOptions, container, appContext)\n }\n\n DialogComponent.close = close\n return DialogComponent\n } else {\n const container = document.createElement('div')\n container.className = 'dialog-containers'\n const instance = getCurrentInstance()\n const appContext = instance?.appContext || null\n let vNode: any = null\n\n const close = () => {\n if (vNode && vNode.component) {\n vNode.component.props.visible = false\n }\n }\n\n const destroy = () => {\n if (vNode) {\n render(null, container)\n container.remove()\n vNode = null\n }\n }\n\n const DialogComponent = (dialogOptions: DialogOptions) => {\n if (vNode && vNode.component) {\n Object.assign(vNode.component.props, dialogOptions)\n vNode.component.props.visible = true\n return vNode\n }\n\n const mergedOptions: DialogOptions = {\n visible: true,\n width: '50%',\n destroyOnClose: true,\n ...dialogOptions\n }\n\n const { onClosed: originalOnClosed, onSubmit: originalOnSubmit } = mergedOptions\n\n mergedOptions.onClosed = () => {\n originalOnClosed?.()\n close()\n }\n\n mergedOptions.onSubmit = (closeFn = close) => {\n originalOnSubmit?.(closeFn)\n }\n\n vNode = initInstance(Component, mergedOptions, container, appContext)\n return vNode\n }\n\n DialogComponent.close = close\n DialogComponent.destroy = destroy\n return DialogComponent\n }\n}\n\nexport default useDialog\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 || 6\">\r\n <el-form-item\r\n :label=\"translateLabel(item)\"\r\n v-bind=\"initFormItemOptions(item.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\"\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.labelBtnWidth ? formProps.labelBtnWidth : formProps.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 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', {})\r\nconst esPlus = inject<Record<string, unknown>>('$EsPlus', {})\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?.ctx as Record<string, unknown>\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 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 ...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 return list\r\n .map((it) => (it ? { ...it, span: it.span || 6, dataOptions: it.dataOptions || [] } : null))\r\n .filter((it): it is FormItemOption => {\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\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 { resetFields: () => void }, 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.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?.ctx?.dialogInstance ? instance.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,\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,\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?.ctx as Record<string, unknown>)?.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 ?? 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 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', {})\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=\"mergedQueryBtns\"\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 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 { CrudPageSchema, CrudAction } 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 {\r\n autoLoad: true\r\n }\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, 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\nconst actions = computed<CrudAction[]>(() => props.schema.actions || ['add', 'edit', 'delete'])\r\n\r\nconst mergedQueryBtns = computed<BtnConfig[]>(() => {\r\n if (props.schema.queryBtns) return props.schema.queryBtns\r\n\r\n const btns: BtnConfig[] = [\r\n { name: '查询', type: 'primary', key: 'query', triggerEvent: true },\r\n { name: '重置', key: 'rest', triggerEvent: true },\r\n ]\r\n if (actions.value.includes('add')) {\r\n btns.push({\r\n name: '新增',\r\n type: 'primary',\r\n key: 'add',\r\n icon: 'Plus',\r\n click: () => handleAdd()\r\n })\r\n }\r\n if (actions.value.includes('export')) {\r\n btns.push({\r\n name: '导出',\r\n key: 'export',\r\n icon: 'Download',\r\n click: () => emit('export', { ...queryModel })\r\n })\r\n }\r\n return btns\r\n})\r\n\r\nconst mergedColumns = computed<TableColumn[]>(() => {\r\n const cols = [...(props.schema.columns || [])]\r\n\r\n const hasActionCol = cols.some((c) => c.prop === 'action' || c.btns)\r\n if (!hasActionCol && actions.value.some((a) => ['edit', 'delete', 'view'].includes(a))) {\r\n const actionBtns: any[] = []\r\n if (actions.value.includes('view')) {\r\n actionBtns.push({ name: '查看', type: 'primary', clickEvent: (row: any) => handleView(row) })\r\n }\r\n if (actions.value.includes('edit')) {\r\n actionBtns.push({ name: '编辑', type: 'primary', clickEvent: (row: any) => handleEdit(row) })\r\n }\r\n if (actions.value.includes('delete')) {\r\n actionBtns.push({ name: '删除', type: 'danger', clickEvent: (row: any) => handleDelete(row) })\r\n }\r\n cols.push({\r\n prop: 'action',\r\n label: '操作',\r\n width: actionBtns.length * 80 + 20,\r\n fixed: 'right',\r\n btns: actionBtns\r\n })\r\n }\r\n return cols\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 hasHttp = base.httpRequest && typeof base.httpRequest === 'function'\r\n if (hasHttp && !base.apiParams && !base.actionUrl) {\r\n base.apiParams = { url: '/crud-page', method: 'GET' }\r\n }\r\n return base\r\n})\r\n\r\nfunction handleAdd() {\r\n if (props.schema.dialogFormItems?.length) {\r\n openFormDialog('新增', {})\r\n }\r\n emit('add')\r\n}\r\n\r\nfunction handleEdit(row: Record<string, unknown>) {\r\n if (props.schema.dialogFormItems?.length) {\r\n openFormDialog('编辑', { ...row })\r\n }\r\n emit('edit', row)\r\n}\r\n\r\nfunction handleDelete(row: Record<string, unknown>) {\r\n emit('delete', row)\r\n}\r\n\r\nfunction handleView(row: Record<string, unknown>) {\r\n emit('view', row)\r\n}\r\n\r\nfunction openFormDialog(title: string, row: Record<string, unknown>) {\r\n const dialog = useDialog()\r\n const formData = reactive<Record<string, unknown>>({})\r\n\r\n props.schema.dialogFormItems?.forEach((item) => {\r\n if (item.prop) {\r\n formData[item.prop] = row[item.prop] ?? ''\r\n }\r\n })\r\n\r\n const dialogWidth = props.schema.dialogOptions?.width || '600px'\r\n\r\n dialog({\r\n title,\r\n width: dialogWidth,\r\n ...(props.schema.dialogOptions || {}),\r\n render: (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: props.schema.dialogFormItems,\r\n layoutFormProps: {\r\n rowLayProps: { gutter: 16 },\r\n fromLayProps: { isBtnHidden: true }\r\n }\r\n })\r\n },\r\n configBtn: [\r\n {\r\n name: '取消',\r\n click: (_: any, { close }: any) => close()\r\n },\r\n {\r\n name: '确定',\r\n type: 'primary',\r\n click: async (_: any, { close, getRefs }: any) => {\r\n const dialogForm = getRefs('dialogForm')\r\n if (dialogForm?.validate) {\r\n await dialogForm.validate()\r\n }\r\n emit('btn-click', title === '新增' ? 'add-confirm' : 'edit-confirm', formData)\r\n close()\r\n refresh()\r\n }\r\n }\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})\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 { CrudPageSchema, CrudAction, CrudPageProps, CrudPageEmits, CrudPageExpose } from './src/types'\r\n","<template>\n <div v-if=\"isExternal\" :style=\"styleExternalIcon\" class=\"svg-external-icon svg-icon\" />\n <svg v-else :class=\"svgClass\" aria-hidden=\"true\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nconst props = defineProps<{\n iconClass: string\n className?: string\n}>()\n\nconst isExternal = computed(() => isExternals(props.iconClass))\nconst iconName = computed(() => `#icon-${props.iconClass}`)\nconst svgClass = computed(() => {\n if (props.className) {\n return 'svg-icon ' + props.className\n }\n return 'svg-icon'\n})\nconst styleExternalIcon = computed(() => {\n return {\n mask: `url(${props.iconClass}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`\n }\n})\n\nconst isExternals = (path: string) => {\n return /^(https?:|mailto:|tel:|open)/.test(path)\n}\n</script>\n\n<style scoped>\n.svg-icon {\n width: 1em;\n height: 1em;\n vertical-align: -0.15em;\n fill: currentColor;\n overflow: hidden;\n}\n\n.svg-external-icon {\n background-color: currentColor;\n mask-size: cover !important;\n display: inline-block;\n}\n</style>\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\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 components.forEach((component) => {\r\n if (component.name) {\r\n app.component(component.name, component)\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 install\r\n}\r\n\r\n// 类型导出\r\nexport type { CrudPageSchema, CrudAction } 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","esPlus","inject","RenderDomTb","row","index","dataKey","render","value","renderResult","firstWordUpperCase","str","columnBindAttr","cols","options","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","useTableResize","tableContainerRef","headBarRef","tbBtnRef","paginationRef","tableHeight","ref","observer","isNegative","num","totalContainerNum","headBarHeight","tbBtnHeight","_c","_b","paginationHeight","_d","resizeObservers","element","containerHeight","maxContainer","minTableNum","tabContainer","_e","newHeight","startObserver","nextTick","target","stopObserver","onBeforeUnmount","useTableSelection","rowkey","multipleSelection","selectionsByPage","isInitChange","handleSelectionChange","currentPage","allSelections","uniqueMap","pageSelections","key","handleSelectData","dataList","tableRef","pageSelecteds","selectedRow","isObject","findValueByKey","obj","depth","currentValue","prop","deepValue","wrapPromise","promise","reason","defaultOptions","emit","__emit","slots","_useSlots","locale","injectedLocale","getCurrentInstance","$esPlusTable","checkPermission","fn","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","TABLE_INTERNAL_KEYS","tableAttrs","merged","align","rest","result","fallthroughAttrs","useAttrs","tableBindAttrs","oldVal","httpRequestInstance","initSelection","clearAllSelection","handleTableSelectionChange","checkListKey","it","its","getListenToCallBack","eventName","params","eventNameList","hasEventNameIndex","formatConfigOut","keyList","rowData","queryTableListMethod","success","fail","apiParams","url","formData","toRaw","unref","fnParams","finalParams","requestOption","requestHandler","requestFn","res","responseData","model","resolve","reject","err","changePageIndexRequest","changePageSizeRequest","handleSizeChange","size","handleIndexChange","changeTableSort","column","char","newkey","j","provide","rows","__expose","_normalizeClass","_withDirectives","TableBtns","_cache","ColumnItem","_createVNode","ElPagination","$event","EsTable","app","getNestedValue","path","keys","setNestedValue","lastKey","current","useFormInputs","hFn","ElInput","ElSelect","opt","idx","ElOption","ElDatePicker","ElTimePicker","ElSlider","ElColorPicker","ElTransfer","ElCascader","ElRadioGroup","ElRadio","ElCheckboxGroup","ElCheckbox","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","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","ElIcon","CopyDocument","FullScreen","Close","queryModel","items","paginationState","actions","mergedQueryBtns","btns","handleAdd","mergedColumns","c","a","actionBtns","handleView","handleEdit","handleDelete","base","openFormDialog","title","dialog","dialogWidth","registerRef","getRefs","dialogForm","refresh","getSelectedRows","$attrs","$slots","slotData","_guardReactiveProps","EsCrudPage","isExternal","isExternals","iconName","svgClass","styleExternalIcon","SvgIcon","components","install","component","version"],"mappings":"irBACA,IAAIA,GAAgB,CACnB,KAAM,QACN,GAAI,CACH,WAAY,CAAE,MAAO,KAAK,EAC1B,YAAa,CACZ,QAAS,KACT,MAAO,KACP,aAAc,QACd,YAAa,8BACb,WAAY,UACZ,iBAAkB,4BAClB,SAAU,QACV,eAAgB,yBAChB,QAAS,aACT,cAAe,kDACf,qBAAsB,iBACzB,EACE,WAAY,CACX,IAAK,KACL,MAAO,KACP,OAAQ,KACR,MAAO,KACP,QAAS,KACT,gBAAiB,sBACjB,iBAAkB,sBAClB,gBAAiB,sBACjB,aAAc,OACd,WAAY,OACZ,WAAY,OACZ,UAAW,OACX,UAAW,OACX,QAAS,OACT,QAAS,OACT,SAAU,MACV,SAAU,MACV,UAAW,MACX,UAAW,MACX,KAAM,IACN,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,OAAQ,MACR,QAAS,OACT,QAAS,OACT,QAAS,OACT,MAAO,CACN,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,GACT,EACG,UAAW,CACV,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,KACT,EACG,OAAQ,CACP,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,KACT,CACA,EACE,YAAa,CACZ,SAAU,OACV,SAAU,MACb,EACE,OAAQ,CACP,QAAS,MACT,QAAS,QACT,OAAQ,MACR,YAAa,KAChB,EACE,QAAS,CAAE,QAAS,KAAK,EACzB,SAAU,CAAE,eAAgB,QAAQ,EACpC,SAAU,CACT,QAAS,QACT,QAAS,MACT,YAAa,MACb,OAAQ,MACX,EACE,WAAY,CACX,KAAM,KACN,SAAU,MACV,MAAO,cACP,eAAgB,IAChB,KAAM,IACN,KAAM,MACN,KAAM,MACN,YAAa,cACb,UAAW,eACX,UAAW,eACX,mBAAoB,uCACvB,EACE,OAAQ,CAAE,MAAO,QAAQ,EACzB,OAAQ,CAAE,MAAO,QAAQ,EACzB,WAAY,CACX,MAAO,KACP,QAAS,KACT,OAAQ,KACR,MAAO,YACP,MAAO,QACV,EACE,OAAQ,CACP,UAAW,gBACX,OAAQ,KACR,QAAS,OACT,SAAU,MACb,EACE,OAAQ,CACP,aAAc,qBACd,uBAAwB,QACxB,qBAAsB,OACzB,EACE,MAAO,CACN,UAAW,OACX,cAAe,KACf,YAAa,KACb,YAAa,KACb,QAAS,KACT,eAAgB,QAChB,eAAgB,QAChB,eAAgB,QAChB,iBAAkB,QAClB,UAAW,gBACX,YAAa,eAChB,EACE,IAAK,CAAE,MAAO,OAAO,EACrB,KAAM,CACL,KAAM,MACN,SAAU,MACV,OAAQ,OACR,MAAO,QACV,EACE,KAAM,CAAE,UAAW,MAAM,EACzB,SAAU,CACT,QAAS,QACT,OAAQ,MACR,OAAQ,CAAC,OAAQ,MAAM,EACvB,kBAAmB,UACnB,gBAAiB,cACjB,iBAAkB,wBACrB,EACE,MAAO,CAAE,MAAO,MAAM,EACtB,WAAY,CAAE,MAAO,IAAI,EACzB,WAAY,CACX,kBAAmB,KACnB,iBAAkB,IACrB,EACE,SAAU,CACT,UAAW,SACX,WAAY,SACZ,UAAW,kBACd,CACA,CACA,EC3KA,MAAKC,GAAaC,EAAAA,gBAAa,CAC7B,KAAM,YACN,MAAO,CACL,KAAM,CAAE,KAAM,CAAC,SAAU,MAAM,EAAG,QAAS,MAC3C,IAAK,CAAE,KAAM,OAAQ,QAAS,KAAO,CAAA,IACrC,OAAQ,CAAE,KAAM,SAAU,QAAS,IAAM,CAAC,GAC1C,MAAO,CAAE,KAAM,OAAQ,QAAS,KAAO,CAAA,IACvC,SAAU,CAAE,KAAM,OAAQ,QAAS,KAAO,CAAA,IAC1C,WAAY,CAAE,KAAM,OAAQ,QAAS,KAAO,CAAA,IAC5C,OAAQ,CAAE,KAAM,OAAQ,QAAS,IAAG,GAEtC,MAAMC,EAAO,CACX,MAAMC,EAAcD,EAAM,MAAQ,OAAOA,EAAM,MAAS,SAAYA,EAAM,KAAOE,EAAAA,SAAS,CAAA,CAAE,EAE5F,SAASC,EAAUC,EAAU,CAC3B,GAAI,CAACA,EAAU,OAAO,KACtB,GAAI,OAAOA,GAAa,WAAY,OAAOA,EAC3C,GAAIA,EAAS,EAAG,CACd,GAAI,OAAOA,EAAS,GAAM,WAAY,OAAOA,EAAS,EACtD,GAAIA,EAAS,GAAK,OAAOA,EAAS,GAAM,UAAY,UAAWA,EAAS,EAAG,CACzE,MAAMC,EAASD,EAAS,EACxB,OAAQE,GAAQ,CAAED,EAAO,MAAQC,CAAI,CACvC,CACF,CACA,OAAO,IACT,CAGA,IAAIC,EAAiB,KACjBC,EAAkB,KAEtB,SAASC,GAAW,CAClB,GAAI,CAACF,EAAgB,OACrB,MAAMG,EAAWH,EAAe,UAChC,GAAI,CAACG,EAAU,OAGf,MAAMC,EAAOD,EAAS,SAAWA,EAAS,MACrCC,IACLV,EAAW,WAAaU,EACpB,OAAOH,GAAoB,YAC7BA,EAAgBG,CAAI,EAExB,CAEAC,OAAAA,EAAAA,UAAU,IAAMH,EAAQ,CAAE,EAC1BI,EAAAA,UAAU,IAAMJ,EAAQ,CAAE,EAEnB,IAAM,OACX,KAAM,CAAE,SAAAC,CAAO,EAAMV,EACfc,EAAmB,CACvB,GAAGJ,EACH,YAAa,CAACK,EAAMC,IAAO,CACrBA,GAAO,OACTf,EAAWc,CAAI,EAAIC,EAEvB,EACA,QAAS,IAAMf,CACjB,EAEMgB,EAAgBjB,EAAM,OAAOkB,EAAAA,EAAGJ,EAAkBd,EAAM,YAAc,CAAA,CAAE,GAAK,GAEnF,OAAI,OAAOiB,GAAkB,UAC3BV,EAAiB,KACVW,EAAAA,EAAEC,EAAAA,iBAAkB,CACzB,OAAQnB,EAAM,QAAUoB,EAC1B,EAAG,IAAMF,EAAAA,EAAE,OAAQ,CACjB,IAAMG,GAAM,CAAEpB,EAAW,WAAaoB,CAAE,CAC1C,EAAGJ,CAAa,CAAC,GAGfK,EAAAA,QAAQL,CAAa,EACH,OAAOA,EAAc,MAAS,UAEhDV,EAAiBU,EACjBT,EAAkBL,EAAUc,EAAc,GAAG,GAAKd,GAAUoB,EAAAN,EAAc,QAAd,YAAAM,EAAqB,GAAG,EAC7EN,IAETV,EAAiB,KACVW,EAAAA,EAAEC,EAAAA,iBAAkB,CACzB,OAAQnB,EAAM,QAAUoB,EAC1B,EAAG,IAAMF,EAAAA,EAAE,MAAO,CAChB,IAAMG,GAAM,CAAEpB,EAAW,WAAaoB,CAAE,CAC1C,EAAG,CAACJ,CAAa,CAAC,CAAC,IAGrBV,EAAiB,KACVW,EAAAA,EAAEC,EAAAA,iBAAkB,CACzB,OAAQnB,EAAM,QAAUoB,IACvB,IAAMF,EAAAA,EAAED,EAAe,CACxB,IAAMI,GAAM,CAAEpB,EAAW,WAAaoB,CAAE,CAC1C,CAAC,CAAC,EACJ,CACF,CACF,CAAC,kHC5BD,MAAMG,EAASC,EAAAA,OAAgC,UAAW,EAAE,EAGtDC,EAAc3B,EAAAA,gBAAgB,CAClC,MAAO,CACL,IAAK,CAAE,KAAM,OAAQ,QAAS,KAAO,CAAA,EAAC,EACtC,MAAO,CAAE,KAAM,OAAQ,QAAS,CAAA,EAChC,QAAS,OACT,OAAQ,CAAE,KAAM,SAAU,SAAU,EAAA,CAAK,EAE3C,MAAMC,EAAO,CACX,MAAO,IAAM,CACX,KAAM,CAAE,IAAA2B,EAAK,MAAAC,EAAO,QAAAC,EAAS,OAAAC,GAAW9B,EACxC,GAAI,CAAC2B,EAAK,OAAOT,IAAE,OAAQ,GAAG,EAC9B,MAAMa,EAAQF,EAAUF,EAAIE,CAAO,EAAI,KACvC,GAAI,CACF,MAAMG,EAAeF,EAAOZ,EAAAA,EAAG,CAAE,MAAAa,EAAO,IAAAJ,EAAK,MAAAC,EAAO,EACpD,OAAI,OAAOI,GAAiB,SAAiBd,EAAAA,EAAE,OAAQc,CAAY,EAC5DA,CACT,MAAgB,CACd,OAAOd,EAAAA,EAAE,OAAQ,GAAG,CACtB,CACF,CACF,CAAA,CACD,EAEKe,EAAsBC,GACnBA,EAAI,OAAO,CAAC,EAAE,cAAgBA,EAAI,MAAM,CAAC,EAAE,YAAA,EAG9CC,EAAkBC,GAAsB,CAC5C,MAAMC,EAAmC,CAAA,EAEzC,UAAWC,KAAKF,EACd,GAAI,EAAAE,IAAM,UAAYA,IAAM,eAAiBA,IAAM,UAEnD,GAAIA,EAAE,SAAS,GAAG,EAAG,CACnB,MAAMC,EAAQD,EAAE,MAAM,GAAG,EACzB,IAAIE,EAAWD,EAAM,CAAC,EACtB,QAASE,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAChCD,GAAYP,EAAmBM,EAAME,CAAC,CAAC,EAEzCJ,EAAQG,CAAQ,EAAIJ,EAAKE,CAAC,CAC5B,MAAWA,IAAM,OACfD,EAAQ,KAAOD,EAAKE,CAAC,EACrBD,EAAQC,CAAC,EAAIF,EAAKE,CAAC,GACVA,IAAM,SAAWF,EAAK,UAAY,OAAOZ,EAAO,GAAM,WAC/Da,EAAQ,MAASb,EAAO,EAA4BY,EAAK,QAAQ,EAEjEC,EAAQC,CAAC,EAAIF,EAAKE,CAAC,EAIvB,OAAKD,EAAQ,QACXA,EAAQ,MAAQ,UAGXA,CACT,eA/HyBK,EAAA,KAAK,QAAU,MAAM,QAAQA,EAAA,KAAK,MAAM,iBAA/DC,EAAAA,YAyBkBC,QAAAC,EAAAA,aAAA,EAAAC,EAAAA,eAAAC,EAAAA,WAAA,CAAA,IAAA,CAAA,EAzBwDZ,EAAeO,EAAA,IAAI,CAAA,CAAA,EAAA,mBAEzF,IAAoC,EADtCM,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAuBkBC,EAAAA,2BAtBQR,EAAA,KAAK,OAAM,CAA3BS,EAAMvB,KADhBoB,EAAAA,YAAAL,EAAAA,YAuBkBC,EAAAA,uBAvBlBG,EAAAA,WAuBkB,CArBf,IAAKI,EAAK,MAAQA,EAAK,KAAOvB,CAAA,eACvBO,EAAc,CAAA,GAAMgB,EAAI,YAAevB,CAAA,CAAK,CAAA,EAAAwB,EAAAA,YAAA,CAAA,EAAA,GAAA,CAEpCD,EAAK,QAAM,OAAWA,EAAK,QAAM,iBAAkB,UACjE,GAAAE,EAAAA,QAD0EC,GAAK,CAEvEA,GAASA,EAAM,mBADvBX,cAMEC,EAAAA,MAAAlB,CAAA,EAAA,OAJC,IAAK4B,EAAM,IACX,MAAOA,EAAM,OACb,WAAUH,EAAK,IACf,OAAQA,EAAK,MAAA,gDAEhBH,EAAAA,UAAA,EAAAC,EAAAA,mBAAqB,UAAR,GAAC,EAAA,YAEKE,EAAK,aAAeA,EAAK,YAAY,mBAAe,UACvE,GAAAE,EAAAA,QADgFC,GAAK,CAE7EA,GAASA,EAAM,IADvBC,aAIEC,SADOL,EAAK,YAAY,aAH1BJ,aAIE,uBAFaI,EAAI,IAAOG,EAAM,WAAaA,EAAM,OAAM,MAAAA,CAAA,CAAc,CAAA,GAGvEN,YAAA,EAAAC,EAAAA,mBAAqB,UAAR,GAAC,EAAA,+CAMQP,EAAA,KAAK,QAAM,OAAWA,EAAA,KAAK,QAAM,0BAA7DC,EAAAA,YAWkBC,EAAAA,MAAAC,eAAA,EAAAC,iBAAAC,EAAAA,WAAA,CAAA,IAAA,CAAA,EAXoEZ,EAAeO,EAAA,IAAI,CAAA,CAAA,EAAA,CAC5F,QAAOW,EAAAA,QAOdC,GAPqB,CAEfA,GAASA,EAAM,mBADvBX,cAMEC,EAAAA,MAAAlB,CAAA,EAAA,OAJC,IAAK4B,EAAM,IACX,MAAOA,EAAM,OACb,WAAUZ,EAAA,KAAK,IACf,OAAQA,EAAA,KAAK,MAAA,gDAEhBM,EAAAA,UAAA,EAAAC,EAAAA,mBAAqB,UAAR,GAAC,EAAA,aAKUP,EAAA,KAAK,aAAeA,OAAK,YAAY,4BAAjEC,EAAAA,YASkBC,QAAAC,EAAAA,aAAA,EAAAC,EAAAA,eAAAC,EAAAA,WAAA,CAAA,IAAA,CAAA,EATqEZ,EAAeO,EAAA,IAAI,CAAA,CAAA,EAAA,CAC7F,QAAOW,EAAAA,QAKdC,GALqB,CAEfA,GAASA,EAAM,IADvBC,EAAAA,WAIEC,SADOd,EAAA,KAAK,YAAY,aAAYI,EAAAA,eAAAC,EAAAA,WAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GADvBL,EAAA,KAAI,IAAOY,EAAM,IAAG,OAAUA,EAAM,eAAoB,CAAA,CAAA,GAGvEN,EAAAA,UAAA,EAAAC,EAAAA,mBAAqB,UAAR,GAAC,EAAA,aAKUP,EAAA,KAAK,UAAQ,OAAWA,EAAA,KAAK,UAAQ,WAAjEM,EAAAA,UAAA,EAAAL,EAAAA,YAAuIC,EAAAA,uBAAvIG,aAAuI,OAAtD,wBAAA,EAAA,EAA8BZ,EAAeO,EAAA,IAAI,CAAA,EAAA,KAAA,EAAA,kBAGlIC,EAAAA,YAAwDC,EAAAA,MAAAC,EAAAA,aAAA,EAAAC,EAAAA,eAAAC,aAAA,CAAA,IAAA,CAAA,EAAxBZ,EAAeO,EAAA,IAAI,CAAA,CAAA,EAAA,KAAA,EAAA,8OCrBrD,MAAM1C,EAAQ0C,EAMRe,EAAazD,GAAqC,CACtD,GAAI,CAACA,EAAM,QAAU,OAAOA,EAAM,QAAW,WAAY,OAAO,KAChE,GAAI,CACF,OAAOA,EAAM,OAAA,CACf,MAAQ,CACN,OAAO,IACT,CACF,EAEAyD,EAAU,MAAQ,CAChB,OAAQ,CAAE,KAAM,SAAU,SAAU,EAAA,CAAK,EAG3C,MAAMjC,EAASC,EAAAA,OAAgC,UAAW,EAAE,EAEtDiC,EAAgB,CAACC,EAAqBC,IAAoB,CAC9D,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMC,EAASrC,EAAO,WACtB,OAAI,OAAOqC,GAAW,WAAoBA,EAAkCD,CAAM,EAC3E,EACT,EAEME,EAAuBC,GACpBA,EAAO,IAAKZ,GAAS,CAC1B,MAAMa,EAAY,CAAE,GAAGb,CAAA,EAGvB,OAFgBO,EAAc,GAAIP,EAAK,eAAyB,EAIrD,OAAOA,EAAK,QAAW,WAChCa,EAAU,OAASb,EAAK,OAAA,EAExBa,EAAU,OAASb,EAAK,QAAU,GAJlCa,EAAU,OAAS,GAOdA,CACT,CAAC,EAGGC,EAAmBC,EAAAA,SAAS,IACzBJ,GAAqB9D,EAAM,WAAa,CAAA,GAAI,OAAQmD,GAASA,EAAK,OAAS,CAAC,CAAC,EAAE,OAAQA,GAAS,CAACA,EAAK,MAAM,CACpH,EAEKgB,EAAoBD,EAAAA,SAAS,IAC1BJ,GAAqB9D,EAAM,WAAa,CAAA,GAAI,OAAQmD,GAASA,EAAK,OAAS,CAAC,CAAC,EAAE,OAAQA,GAAS,CAACA,EAAK,MAAM,CACpH,EAEKiB,EAAgBF,EAAAA,SAAS,IACtBlE,EAAM,UAAYiE,EAAiB,MAAM,OAAS,GAAKE,EAAkB,MAAM,OAAS,CAChG,EAEKE,EAAoBlB,GACpB,OAAOA,EAAK,UAAa,WACpBA,EAAK,SAAA,EAEPA,EAAK,UAAY,GAGpBmB,EAAwB1C,IACrB,CACL,QAAS,eACT,WAAYA,IAAU,EAAI,MAAQ,KAAA,gBAxGzBwC,EAAA,OAAXpB,EAAAA,UAAA,EAAAC,EAAAA,mBA8BM,MA9BNsB,GA8BM,CA7BJC,EAAAA,mBAEM,MAFNC,GAEMC,EAAAA,gBADDhC,EAAA,QAAQ,EAAA,CAAA,EAGb8B,EAAAA,mBAwBM,MAxBNG,GAwBM,CAtBJH,EAAAA,mBASM,MATNI,GASM,EARJ5B,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAOWC,WAAA,KAAA2B,EAAAA,WAPuBZ,EAAA,MAAgB,CAAhCd,EAAMvB,oDAAkC,IAAAuB,EAAK,IAAA,GACjDA,EAAK,kDAAjBF,EAAAA,mBAKM,MAAA,OALoB,MAAK6B,EAAAA,eAAER,EAAqB1C,CAAK,CAAA,CAAA,GACvCuB,EAAK,QAAM,OAAWA,EAAK,QAAM,0BAAnDR,EAAAA,YAA4Fc,EAAA,OAAvB,OAAQN,EAAK,MAAA,uBAClFH,YAAA,EAAAL,cAEYC,EAAAA,kBAFZG,EAAAA,WAEY,OAFO,KAAMI,EAAK,KAAO,KAAMA,EAAK,MAAI,QAAc,KAAMA,EAAK,KAAO,QAASA,EAAK,SAAO,EAAA,eAAmBA,EAAI,CAAG,SAAUkB,EAAiBlB,CAAI,EAAI,QAAK,IAAMA,EAAK,MAAMT,EAAA,QAAQ,CAAA,sBAClM,IAAe,CAAZqC,EAAAA,gBAAAL,EAAAA,gBAAAvB,EAAK,IAAI,EAAA,CAAA,CAAA,yFAOpBqB,EAAAA,mBASM,MATNQ,GASM,EARJhC,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAOWC,WAAA,KAAA2B,EAAAA,WAPuBV,EAAA,MAAiB,CAAjChB,EAAMvB,oDAAmC,IAAAuB,EAAK,IAAA,GAClDA,EAAK,kDAAjBF,EAAAA,mBAKM,MAAA,OALoB,MAAK6B,EAAAA,eAAER,EAAqB1C,CAAK,CAAA,CAAA,GACvCuB,EAAK,QAAM,OAAWA,EAAK,QAAM,0BAAnDR,EAAAA,YAA4Fc,EAAA,OAAvB,OAAQN,EAAK,MAAA,uBAClFH,YAAA,EAAAL,cAEYC,EAAAA,kBAFZG,EAAAA,WAEY,OAFO,KAAMI,EAAK,KAAO,KAAMA,EAAK,MAAI,OAAA,eAAqBA,EAAI,CAAG,KAAMA,EAAK,KAAO,QAASA,EAAK,SAAO,GAAY,SAAUkB,EAAiBlB,CAAI,EAAI,QAAK,IAAOA,EAAK,MAAMT,EAAA,QAAQ,CAAA,sBACnM,IAAe,CAAZqC,EAAAA,gBAAAL,EAAAA,gBAAAvB,EAAK,IAAI,EAAA,CAAA,CAAA,+OCvBnB,SAAS8B,GACdC,EACAC,EACAC,EACAC,EACAhD,EACA,CACA,MAAMiD,EAAcC,EAAAA,IAAI,GAAG,EACrBC,EAAWD,EAAAA,IAA2B,IAAI,EAE1CE,EAAcC,GAAgB,KAAK,KAAKA,CAAG,IAAM,GAEjDC,EAAoB,IAAM,aAC9B,MAAMC,IAAgBrE,EAAA4D,EAAW,QAAX,YAAA5D,EAAkB,eAAgB,EAClDsE,IAAcC,GAAAC,EAAAX,EAAS,QAAT,YAAAW,EAAgB,MAAhB,YAAAD,EAAqB,eAAgB,EACnDE,IAAmBC,EAAAZ,EAAc,QAAd,YAAAY,EAAqB,eAAgB,EAC9D,OAAO,KAAK,MAAMD,EAAmBJ,EAAgBC,CAAW,CAClE,EAEMK,EAAkB,IAAM,eAC5B,MAAMC,EAAUjB,EAAkB,MAClC,GAAI,CAACiB,EAAS,OAEd,MAAMC,EAAkB,OAAO/D,EAAQ,WAAc,SACjDA,EAAQ,UACRA,EAAQ,aAAe,WACpBd,EAAA4E,EAAQ,gBAAR,YAAA5E,EAAuB,eAAgB4E,EAAQ,aAC/C,SAAS9D,EAAQ,UAAqB,EAAE,GAAK,IAE9CgE,EAAgB,MAAMD,CAAe,EAAsB,IAAlBA,EACzCE,EAAcD,EAAeV,EAAA,EAC7BY,EAAed,EAAWa,CAAW,EAAIX,EAAA,EAAsB,IAAMU,EAErEL,IAAmBD,EAAAV,EAAc,QAAd,YAAAU,EAAqB,eAAgB,EACxDH,IAAgBE,EAAAX,EAAW,QAAX,YAAAW,EAAkB,eAAgB,EAClDD,IAAcW,GAAAP,EAAAb,EAAS,QAAT,YAAAa,EAAgB,MAAhB,YAAAO,EAAqB,eAAgB,EAEnDC,EAAY,KAAK,MAAMF,CAAY,EAAI,KAAK,MAAMP,EAAmBJ,EAAgBC,CAAW,EAClGP,EAAY,QAAUmB,IACxBnB,EAAY,MAAQmB,EAExB,EAEMC,EAAgB,IAAM,CAC1BC,EAAAA,SAAS,IAAM,CACb,GAAI,CAACzB,EAAkB,OAAS,OAAO,eAAmB,IAAa,OAEvEM,EAAS,MAAQ,IAAI,eAAe,IAAM,CACxC,sBAAsB,IAAM,CACtBN,EAAkB,OAAOgB,EAAA,CAC/B,CAAC,CACH,CAAC,EAGD,MAAMU,EAASvE,EAAQ,aAAe,UAClC6C,EAAkB,MAAM,eAAiBA,EAAkB,MAE/DM,EAAS,MAAM,QAAQoB,CAAM,EAGzBzB,EAAW,OACbK,EAAS,MAAM,QAAQL,EAAW,KAAK,CAE3C,CAAC,CACH,EAEM0B,EAAe,IAAM,CACrBrB,EAAS,QACXA,EAAS,MAAM,WAAA,EACfA,EAAS,MAAQ,KAErB,EAEA5E,OAAAA,EAAAA,UAAU,IAAM8F,GAAe,EAC/BI,EAAAA,gBAAgB,IAAMD,GAAc,EAE7B,CACL,YAAAvB,EACA,gBAAAY,EACA,cAAAQ,EACA,aAAAG,CAAA,CAEJ,CClFO,SAASE,GAAkBC,EAAiB,CACjD,MAAMC,EAAoB1B,EAAAA,IAA+B,EAAE,EACrD2B,EAAmB3B,EAAAA,IAA+C,EAAE,EACpE4B,EAAe5B,EAAAA,IAAI,EAAK,EAExB6B,EAAwB,CAAC9G,EAAgC+G,IAAwB,CACrF,GAAIL,EAAQ,CACV,GAAIG,EAAa,MAAO,OACxBD,EAAiB,MAAMG,CAAW,EAAI/G,EACtC,IAAIgH,EAA2C,CAAA,EAC/C,MAAMC,EAAqC,CAAA,EAE3C,OAAO,OAAOL,EAAiB,KAAK,EAAE,QAASM,GAAmB,CAChEA,EAAe,QAASrE,GAAS,CAC/B,MAAMsE,EAAMtE,EAAK6D,CAAM,EACnBS,GAAO,CAACF,EAAUE,CAAG,IACvBH,EAAc,KAAKnE,CAAI,EACvBoE,EAAUE,CAAG,EAAI,GAErB,CAAC,CACH,CAAC,EAEDR,EAAkB,MAAQK,CAC5B,MACEL,EAAkB,MAAQ3G,CAE9B,EAEMoH,EAAmB,CAACC,EAAqCC,IAAiG,CAC9J,GAAID,GAAA,MAAAA,EAAU,QAAUX,GAAUC,EAAkB,MAAM,OAAQ,CAChE,MAAMY,EAA2C,CAAA,EACjDF,EAAS,QAAShG,GAAQ,CACxBsF,EAAkB,MAAM,QAASa,GAAgB,CAC3CnG,EAAIqF,CAAM,IAAMc,EAAYd,CAAM,GACpCa,EAAc,KAAKlG,CAAG,CAE1B,CAAC,CACH,CAAC,EAEDkG,EAAc,QAASlG,GAAQ,QAC7BJ,EAAAqG,EAAS,qBAAT,MAAArG,EAAA,KAAAqG,EAA8BjG,EAAK,GACrC,CAAC,CACH,CACF,EA2BA,MAAO,CACL,kBAAAsF,EACA,iBAAAC,EACA,aAAAC,EACA,sBAAAC,EACA,iBAAAM,EACA,kBA/ByBE,GAA8C,OACvEX,EAAkB,MAAQ,CAAA,EAC1BC,EAAiB,MAAQ,CAAA,GACzB3F,EAAAqG,EAAS,iBAAT,MAAArG,EAAA,KAAAqG,EACF,EA4BE,cA1BoB,CAACD,EAAqCC,IAAqI,CAE/L,GADAT,EAAa,MAAQ,GACjB,CAACS,EAAU,CACbT,EAAa,MAAQ,GACrB,MACF,CACIH,EACFL,EAAAA,SAAS,IAAM,CACbe,EAAiBC,EAAUC,CAAQ,EACnCT,EAAa,MAAQ,EACvB,CAAC,EAEDR,EAAAA,SAAS,IAAM,QACbpF,EAAAqG,EAAS,iBAAT,MAAArG,EAAA,KAAAqG,GACAT,EAAa,MAAQ,EACvB,CAAC,CAEL,CASE,CAEJ,CCjFO,MAAMY,EAAYhG,GAChB,OAAOA,GAAU,UAAYA,IAAU,MAAQ,OAAO,UAAU,SAAS,KAAKA,CAAK,IAAM,kBAsCrFiG,GAAiB,CAACC,EAA8BR,EAAaS,EAAQ,IAAe,CAE/F,GADIA,EAAQ,GACR,CAACH,EAASE,CAAG,EAAG,OAEpB,MAAME,EAAe,OAAO,UAAU,eAAe,KAAKF,EAAKR,CAAG,EAAIQ,EAAIR,CAAG,EAAI,OAEjF,UAAWW,KAAQH,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAKG,CAAI,GAAKL,EAASE,EAAIG,CAAI,CAAC,EAAG,CAC1E,MAAMC,EAAYL,GAAeC,EAAIG,CAAI,EAA8BX,EAAKS,EAAQ,CAAC,EACrF,GAAIG,IAAc,OAAW,OAAOA,CACtC,CAEF,OAAOF,CACT,EAEaG,GAAkBC,GACtBA,EACJ,KAAMxG,IAAW,CAAE,OAAQ,YAAsB,MAAAA,CAAA,EAAQ,EACzD,MAAOyG,IAAY,CAAE,OAAQ,WAAqB,OAAAA,GAAS,sMCmC1DC,GAA+B,CACnC,YAAa,GACb,OAAQ,GACR,QAAS,GACT,QAAS,GACT,OAAQ,GACR,KAAM,QACN,gBAAiB,CAAE,WAAY,SAAA,EAC/B,oBAAqB,GACrB,mBAAoB,EACtB,qYAcA,MAAMzI,EAAQ0C,EAoBRgG,EAAOC,EAQPC,EAAQC,EAAAA,SAAA,EAIRC,EAASvD,EAAAA,IAAInE,EAAI,EACjB2H,EAAiBtH,EAAAA,OAAO,WAAY,IAAI,EAC1CsH,IACFD,EAAO,MAAQC,GAGjB,MAAMrI,EAAWsI,EAAAA,mBAAA,GAAwB,CAAA,EACnCC,EAAexH,EAAAA,OAAgC,eAAgB,EAAE,EACjED,EAASC,EAAAA,OAAgC,UAAW,EAAE,EAEtDyH,EAAmBtF,GAA6B,CACpD,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMuF,EAAK3H,EAAO,WAClB,OAAO,OAAO2H,GAAO,WAAcA,EAA8BvF,CAAM,EAAI,EAC7E,EAGMgE,EAAWrC,EAAAA,IAAS,IAAI,EACxBH,EAAWG,EAAAA,IAAS,IAAI,EACxBJ,EAAaI,EAAAA,IAAwB,IAAI,EACzCF,EAAgBE,EAAAA,IAAwB,IAAI,EAC5CL,EAAoBK,EAAAA,IAAwB,IAAI,EAChD6D,EAAU7D,EAAAA,IAAI,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,CAAC,EAAE,EACpE8D,EAAY9D,EAAAA,IAA+B,EAAE,EAC7C+D,EAAgB/D,EAAAA,IAAmB,CAAC,GAAGvF,EAAM,OAAO,CAAC,EAE3DuJ,EAAAA,MACE,IAAMvJ,EAAM,QACXM,GAAQ,CACPgJ,EAAc,MAAQ,CAAC,GAAGhJ,CAAG,CAC/B,EACA,CAAE,KAAM,EAAA,CAAK,EAEf,MAAMkJ,EAAgBjE,EAAAA,IAAI,EAAK,EACzBkE,EAAYlE,EAAAA,IAAI,EAAK,EACrBmE,EAAiBnE,EAAAA,IAAI,EAAK,EAE1BoE,EAAqB3I,GAA2B,CAChDA,MAAsB,MAAQA,EACpC,EAGM4I,EAAmBnI,SAAgC,mBAAoB,IAAM,CAAC,CAAC,EAC/EoI,EAAiBpI,EAAAA,OAAkC,iBAAkB,EAAK,EAE1EqI,EAAc5F,EAAAA,SAAS,IAAO,OAAO2F,GAAmB,WAAaA,EAAA,EAAmBA,CAAe,EAEvGE,EAAmBxE,EAAAA,IAAsB,CAC7C,SAAU,GACV,QAAS,EACT,MAAO,EACP,UAAW,CAAA,EACX,KAAM,QACN,QAAS,GACT,GAAGvF,EAAM,UAAA,CACV,EAEKgK,EAAezE,EAAAA,IAAa,IAAI,EAGhC0E,EAAe/F,EAAAA,SAAS,IACxBlE,EAAM,QAAQ,YAAc+H,EAAS/H,EAAM,QAAQ,UAAU,GAAK,OAAO,KAAKA,EAAM,QAAQ,UAAU,EAAE,OACnGA,EAAM,QAAQ,WAEhB,CAAA,CACR,EAEKkK,EAAmBhG,EAAAA,SAAS,IAAM,CACtC,GACElE,EAAM,QAAQ,gBACd+H,EAAS/H,EAAM,QAAQ,cAAc,GACrC,OAAO,KAAKA,EAAM,QAAQ,cAAc,EAAE,QAC1CmK,GAAiBnK,EAAM,QAAQ,cAAc,EAE7C,OAAOA,EAAM,QAAQ,eAGvB,GAAIiJ,GAAA,MAAAA,EAAc,wBAA0B,OAAOA,EAAa,wBAA2B,WAAY,CACrG,MAAMmB,EAAgBnB,EAAa,uBAAoC,CACrE,MAAO,UACP,SAAU,WACV,QAAS,SACT,UAAW,MAAA,CACZ,EACD,GAAIkB,GAAiBC,CAAY,EAAG,OAAOA,CAC7C,CAEA,MAAO,CACL,MAAO,UACP,SAAU,WACV,QAAS,SACT,UAAW,MAAA,CAEf,CAAC,EAEKC,EAAiBnG,EAAAA,SAAS,IAAM,aAEpC,MAAMoG,KADevE,GAAAxE,EAAAb,GAAA,YAAAA,EAAU,QAAV,YAAAa,EAAiB,UAAjB,YAAAwE,EAAA,KAAAxE,KAAgC,CAAA,GACtB,KAAMgJ,IAAe,CAClD,MAAMC,GAAOD,GAAM,KACnB,OAAOC,IAAA,YAAAA,GAAM,QAAS,WAAYA,IAAA,YAAAA,GAAM,eAAgB,QAC1D,CAAC,EACD,OAAIF,KAAaxE,EAAAwE,EAAU,QAAV,MAAAxE,EAAiB,OAChCkE,EAAa,OAAQ/D,EAAAqE,EAAU,MAAV,YAAArE,EAAe,KAAKqE,EAAU,MAAM,KACzDV,EAAiBI,EAAa,KAAK,GAE9BM,GAAa,CAAA,CACtB,CAAC,EAEKG,GAAiBvG,EAAAA,SAAS,IAAA,OAAM,OAAC,GAAC3C,EAAAqH,EAAM,UAAN,MAAArH,EAAA,KAAAqH,IAAiB,EACnD8B,EAAaxG,EAAAA,SAAS,IAAMlE,EAAM,QAAQ,YAAc,MAAM,EAC9D2K,GAAYzG,EAAAA,SAAS,IACrB,OAAOlE,EAAM,QAAQ,WAAc,SAC9B,GAAGA,EAAM,QAAQ,SAAS,KAE/B0K,EAAW,QAAU,UAAY,OAAO1K,EAAM,QAAQ,QAAW,SAC5D,GAAGA,EAAM,QAAQ,MAAM,KAEzB,MACR,EAEK4K,GAAa1G,EAAAA,SAAS,IACtBlE,EAAM,aACD,CACL,KAAM,OAAOA,EAAM,cAAiB,SAAW,SAAW,SAC1D,MAAOA,EAAM,YAAA,EAGV,CAAE,KAAM,SAAU,MAAO,EAAA,CACjC,EAEK6K,GAAyB3G,EAAAA,SAAS,IAAM,CAC5C,MAAM4G,EAAM7B,GAAA,YAAAA,EAAc,iBAC1B,OAAK6B,EACE,OAAOA,GAAQ,WAAaA,EAAA,EAAQA,EAD1B,IAEnB,CAAC,EACKC,GAAS7G,EAAAA,SAAS,IAAA,OAAM,QAAA3C,EAAAsJ,GAAuB,QAAvB,YAAAtJ,EAA8B,SAAU,8CAA6C,EAC7GyJ,GAAsB9G,EAAAA,SAAS,WAAM,QAAA3C,EAAAsJ,GAAuB,QAAvB,YAAAtJ,EAA8B,YAAawI,EAAiB,MAAM,UAAS,EAChHkB,GAAoB/G,EAAAA,SAAS,WAAM,QAAA3C,EAAAsJ,GAAuB,QAAvB,YAAAtJ,EAA8B,UAAWwI,EAAiB,MAAM,QAAO,EAC1GmB,GAAuBhH,EAAAA,SAAS,IAAA,OAAM,QAAA3C,EAAAsJ,GAAuB,QAAvB,YAAAtJ,EAA8B,aAAc,GAAI,EACtF4J,GAAajH,EAAAA,SAAS,IAAMlE,EAAM,QAAQ,SAAWwJ,EAAc,KAAK,EACxE4B,GAAgBlH,WAAS,IAAM,CAAC,CAAClE,EAAM,QAAQ,WAAcA,EAAM,QAAQ,WAAa+H,EAAS/H,EAAM,QAAQ,SAAS,GAAK,OAAO,KAAKA,EAAM,QAAQ,SAAS,EAAE,OAAS,CAAE,EAC7JkE,WAAS,IAAA,OAAM,OAAC,GAAC3C,EAAAvB,EAAM,UAAN,MAAAuB,EAAe,cAAe,OAAOvB,EAAM,QAAQ,aAAgB,WAAU,EAEpH,MAAMqL,GAAkBnH,EAAAA,SAAS,IAAM,CACrC,MAAMoH,EAAOhC,EAAc,MAAM,OAAQnG,GAAS,CAACA,EAAK,MAAM,EAC9D,OAAAmI,EAAK,QAAStK,GAAO,CACfA,EAAG,OAAS,WAAaA,EAAG,MAAQ,YAAcA,EAAG,MAAQA,EAAG,MAAQ,CAACA,EAAG,YAC9EA,EAAG,UAAaW,GAAiC,CAC/C,MAAMI,EAAQJ,EAAIX,EAAG,IAAc,GAAKW,EAAIX,EAAG,GAAa,EAC5D,OAAIe,GAAS,MAAQA,IAAU,GACtBf,EAAG,kBAAoB,IAEzBe,CACT,IAGGf,EAAG,OAAS,WAAaA,EAAG,MAAQ,YAAcA,EAAG,MAAQ,CAACA,EAAG,SACpEA,EAAG,OAAS,CAACuK,EAAS,CAAE,IAAA5J,KAA4C,OAClE,OAAOT,EAAAA,EAAE,MAAO,EACdK,EAAAP,EAAG,OAAH,YAAAO,EAAS,OAAQiK,GAAatC,EAAgBsC,EAAI,eAAe,GAC9D,IAAKA,GACNtK,EAAAA,EAAEuK,WAAU,CACV,QAAS,IAAA,QAAM,OAAAlK,GAAAiK,EAAI,aAAJ,YAAAjK,GAAA,KAAAiK,EAAiB7J,IAChC,KAAM,GACN,KAAM6J,EAAI,MAAQ,SAAA,EACjB,IAAMA,EAAI,IAAI,EACnB,CACD,CACH,EAEJ,CAAC,EACMF,CACT,CAAC,EAGKI,OAA0B,IAAI,CAClC,cAAe,SAAU,UAAW,UAAW,qBAC/C,cAAe,iBAAkB,mBACjC,YAAa,YAAa,aAAc,YACxC,YAAa,aAAc,YAAa,WAAY,QAAA,CACrD,EAEKC,GAAazH,EAAAA,SAAS,IAAM,CAChC,MAAM0H,EAASzJ,GAAe,CAAE,GAAGsG,GAAgB,GAAGzI,EAAM,QAAS,EAC/D,CAAE,MAAA6L,EAAO,GAAGC,CAAA,EAASF,EACrBG,EAAkC,CAAA,EACxC,UAAWtE,KAAOqE,EACXJ,GAAoB,IAAIjE,CAAG,IAC9BsE,EAAOtE,CAAG,EAAIqE,EAAKrE,CAAG,GAG1B,OAAOsE,CACT,CAAC,EAGKC,GAAmBC,EAAAA,SAAA,EACnBC,GAAiBhI,EAAAA,SAAS,IAAM,CACpC,MAAM6H,EAAkC,CAAE,GAAGJ,GAAW,MAAO,GAAGK,EAAA,EAClE,OAAIhM,EAAM,QAAQ,SAChB+L,EAAO,OAAS/L,EAAM,QAAQ,QAE5B0K,EAAW,QAAU,SACvBqB,EAAO,OAASzG,GAAY,MACnBoF,EAAW,QAAU,cAC9BqB,EAAO,UAAYzG,GAAY,OAE1ByG,CACT,CAAC,EAGK,CAAE,YAAAzG,EAA6B,EAAIL,GACvCC,EACAC,EACAC,EACAC,EACA,CAAE,WAAYqF,EAAW,MAAO,UAAW1K,EAAM,QAAQ,SAAA,CAAU,EAGrEuJ,EAAAA,MACEO,EACA,MAAOxJ,EAAK6L,IAAW,SACjB7L,GAAOA,IAAQ6L,IACbnM,EAAM,QAAQ,WAChB,MAAMoM,EAAA,GAERrG,GAAAxE,EAAAqG,EAAS,QAAT,YAAArG,EAAgB,WAAhB,MAAAwE,EAAA,KAAAxE,GAEJ,CAAA,EAGFgI,EAAAA,MACE,IAAMvJ,EAAM,WACXM,GAAQ,CACPyJ,EAAiB,MAAQ,CAAE,GAAGA,EAAiB,MAAO,GAAGzJ,CAAA,EACzDoJ,EAAe,MAAQpJ,EAAI,QAAU,MACvC,EACA,CAAE,KAAM,GAAM,UAAW,EAAA,CAAK,EAGhCiJ,EAAAA,MACE,IAAMvJ,EAAM,WACXM,GAAQ,CACP+L,GAAc/L,EAAKsH,EAAS,KAAK,CACnC,EACA,CAAE,KAAM,EAAA,CAAK,EAGf2B,EAAAA,MACEF,EACC/I,GAAQ,CACH,MAAM,QAAQA,CAAG,GACnBoI,EAAK,oBAAqBpI,CAAG,CAEjC,EACA,CAAE,KAAM,EAAA,CAAK,EAIfM,EAAAA,UAAU,IAAM,CACVwK,GAAc,OAASpL,EAAM,QAAQ,YAAc,IACrDoM,EAAA,CAEJ,CAAC,EAGD,KAAM,CAAE,kBAAAnF,GAAmB,sBAAAG,GAAuB,cAAAiF,GAAe,kBAAAC,IAAsBvF,GAAkB/G,EAAM,QAAQ,MAAM,EAEvHuM,GAA8BjM,GAAmC,CACrE8G,GAAsB9G,EAAKyJ,EAAiB,MAAM,SAAW,CAAC,CAChE,EAGMI,GAAoBlC,GAA0C,CAClE,MAAMuE,EAAe,CAAC,QAAS,WAAY,UAAW,WAAW,EACjE,OAAIzE,EAASE,CAAG,EACP,OAAO,KAAKA,CAAG,EAAE,MAAOwE,GACtBD,EAAa,KAAME,GAAQA,IAAQD,CAAE,GAAKxE,EAAIwE,CAAE,GAAK,OAAOxE,EAAIwE,CAAE,GAAM,QAChF,EAEI,EACT,EAEME,EAAsB,CAACC,EAAmBC,IAAoB,CAClE,MAAMC,EAAgB,CACpB,CAAE,UAAW,OAAQ,SAAU,EAAA,EAC/B,CAAE,UAAW,OAAQ,SAAU,EAAA,CAAK,EAEhCC,EAAoBD,EAAc,UAAWL,GAAOA,EAAG,YAAcG,CAAS,EACpF,GAAI5M,EAAM,QAAQ,kBAAoBA,EAAM,QAAQ,iBAAiB4M,CAAS,GAAKG,IAAsB,IACvFD,EAAcC,CAAiB,EACnC,SACV,OAAO/M,EAAM,QAAQ,iBAAiB4M,CAAS,EAAEC,CAAM,CAG7D,EAEMG,EAAkB,CAACrL,EAA8BsL,IAAsB,CACvElF,EAASmC,EAAiB,KAAK,GAAK,OAAO,KAAKA,EAAiB,KAAK,EAAE,QAC1E,OAAO,QAAQA,EAAiB,KAAK,EAAE,QAAQ,CAAC,CAACzC,EAAK1F,CAAK,IAAM,CAE/D,GAAI,CADckL,EAAQ,SAASxF,CAAG,EACtB,OAEhB,MAAMyF,EAAUvL,EAAII,CAAe,GAAKiG,GAAerG,EAAKI,CAAe,EACvE0F,IAAQ,YACV4B,EAAU,MAAQ,MAAM,QAAQ6D,CAAO,EAAIA,EAAU,CAAA,EAErDnD,EAAiB,MAAMtC,CAA6B,EAAI,OAAOyF,GAAY,SAAWA,EAAU,SAASA,EAAmB,EAAE,GAAK,CAEvI,CAAC,CAEL,EAEMC,EAAuB,CAACN,EAAiCxK,EAA+F,CAAA,IAAO,WACnK,KAAM,CAAE,QAAA+K,EAAS,KAAAC,CAAA,EAAShL,EACpBiL,IAAY/L,GAAAvB,EAAM,UAAN,YAAAuB,GAAe,YAAa,CAAA,EACxCgM,IAAMxH,GAAA/F,EAAM,UAAN,YAAA+F,GAAe,YAAauH,EAAU,KAAO,GAEzD,GAAI,CAACC,GAAO,CAAC,OAAO,KAAKD,CAAS,EAAE,OAAQ,OAE5C,MAAME,GAAW,OAAO,KAAKnD,EAAe,KAAK,EAAE,OAC/CoD,EAAAA,MAAMC,EAAAA,MAAOrD,EAAe,MAAc,MAAM,KAAK,CAAC,EACtDJ,EAAa,OAAS,CAAA,EAGpB0D,GAAWhB,EAAoB,OAAQ,CAAE,GAAGa,GAAU,GAAGX,EAAQ,GAAGY,EAAAA,MAAMC,EAAAA,MAAMJ,EAAU,OAAS,CAAA,CAAE,CAAC,EAAG,EACzGM,GAAc7F,EAAS4F,EAAQ,EAAIA,GAAW,CAAE,GAAGH,GAAU,GAAGC,EAAAA,MAAMC,EAAAA,MAAMJ,EAAU,OAAS,CAAA,CAAE,CAAC,EAAG,GAAGT,CAAA,EACxGgB,GAAgB,CAAE,GAAGJ,QAAMC,EAAAA,MAAMJ,EAAU,SAAW,CAAA,CAAE,CAAC,CAAA,EAC3DA,GAAA,MAAAA,EAAW,SACbO,GAAc,OAASP,GAAA,YAAAA,EAAW,QAGpC,MAAMQ,GAAiB,MAAOC,IAAwB,CACpD,GAAI,CAAAvE,EAAc,MAClB,CAAAA,EAAc,MAAQ,GACxB,QAAQ,IAAI,cAAeoE,EAAW,EACpC,GAAI,CACF,MAAMI,GAAM,MAAMD,GAAU,CAC1B,IAAAR,EACA,WAAYK,GACZ,QAASN,EAAU,SAAW,CAAA,EAC9B,GAAGO,GACH,GAAGhB,CAAA,CACJ,EACKoB,GAAetB,EAAoB,OAAQqB,EAAG,GAAKA,GACrDjG,EAASiG,EAAG,GAAK,OAAO,KAAKA,EAAG,EAAE,QAAU,OAAOZ,GAAY,YACjEA,EAAQa,EAAuC,CAEnD,OAAS5M,GAAG,CACN,OAAOgM,GAAS,YAClBA,EAAKhM,EAAC,CAEV,QAAA,CACEmI,EAAc,MAAQ,EACxB,EACF,EAEIxJ,EAAM,QAAQ,YAChB8N,GAAe9N,EAAM,QAAQ,WAAW,EAC/BiJ,EAAa,cACtB6E,GAAe7E,EAAa,YAAwB,CAExD,EAEMmD,EAAuB8B,GACpB,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtCrE,EAAiB,MAAM,QAAU,EACjCoD,EACE,CAAE,GAAIe,GAAS,GAAK,UAAWnE,EAAiB,MAAM,QAAS,SAAUA,EAAiB,MAAM,QAAA,EAChG,CACE,QAAUiE,GAAQ,CAChBhB,EAAgBgB,EAAK,CAAC,QAAS,WAAW,CAAC,EACvC,OAAO,KAAKhO,EAAM,UAAU,EAAE,QAChC0I,EAAK,oBAAqBqB,EAAiB,KAAK,EAElDoE,EAAQH,CAAG,CACb,EACA,KAAOK,GAAQ,CACbD,EAAOC,CAAG,CACZ,CAAA,CACF,CAEJ,CAAC,EAGGC,EAAyB,IAAM,CACnCnB,EACE,CAAE,UAAWpD,EAAiB,MAAM,QAAS,SAAUA,EAAiB,MAAM,QAAA,EAC9E,CACE,QAAUiE,GAAQ,CAChBhB,EAAgBgB,EAAK,CAAC,QAAS,WAAW,CAAC,EAC3CtF,EAAK,oBAAqBqB,EAAiB,KAAK,EAChDrB,EAAK,4BAA6BqB,EAAiB,KAAK,CAC1D,CAAA,CACF,CAEJ,EAEMwE,EAAwB,IAAM,CAClCpB,EACE,CAAE,UAAWpD,EAAiB,MAAM,QAAS,SAAUA,EAAiB,MAAM,QAAA,EAC9E,CACE,QAAUiE,GAAQ,CAChBhB,EAAgBgB,EAAK,CAAC,QAAS,WAAW,CAAC,EAC3CtF,EAAK,oBAAqBqB,EAAiB,KAAK,CAClD,CAAA,CACF,CAEJ,EAEMyE,EAAoBC,GAAiB,CACzC1E,EAAiB,MAAM,SAAW0E,EAClC1E,EAAiB,MAAM,QAAU,EAC7BqB,GAAc,MAChBmD,EAAA,GAEA7F,EAAK,oBAAqBqB,EAAiB,KAAK,EAChDrB,EAAK,cAAeqB,EAAiB,MAAO0E,CAAI,EAEpD,EAEMC,GAAqBpO,GAAgB,CACzCyJ,EAAiB,MAAM,QAAUzJ,EAC7B8K,GAAc,OAChB,QAAQ,IAAI,eAAgB9K,CAAG,EAC/BgO,EAAA,IAEA5F,EAAK,oBAAqBqB,EAAiB,KAAK,EAChDrB,EAAK,4BAA6BqB,EAAiB,KAAK,EAE5D,EAEM4E,GAAmBC,GAAoC,CAC3DlG,EAAK,oBAAqBkG,CAAM,CAClC,EAEM3M,GAAsBC,GACnBA,EAAI,cAAc,QAAQ,eAAiB2M,GAASA,EAAK,aAAa,EAGzE1M,GAAkBC,GAAkC,CACxD,MAAMC,EAAmC,CAAA,EACzC,UAAWC,KAAKF,EACd,GAAI,EAAAE,IAAM,UAAYA,IAAM,eAAiBA,IAAM,UAEnD,GAAIA,EAAE,SAAS,GAAG,EAAG,CACnB,MAAMC,EAAQD,EAAE,MAAM,GAAG,EACzB,IAAIwM,EAASvM,EAAM,CAAC,EACpB,QAASwM,EAAI,EAAGA,EAAIxM,EAAM,OAAQwM,IAChCD,GAAU7M,GAAmBM,EAAMwM,CAAC,CAAC,EAEvC1M,EAAQyM,CAAM,EAAI1M,EAAKE,CAAC,CAC1B,MAAWA,IAAM,QACfD,EAAQ,KAAOD,EAAKE,CAAC,GACrBD,EAAQC,CAAC,EAAIF,EAAKE,CAAC,EAMvB,OAAKD,EAAQ,QACXA,EAAQ,MAAQ,UAGXA,CACT,EAGA2M,OAAAA,EAAAA,QAAQ,oBAAqB,KAAO,CAClC,IAAItO,GAAA,YAAAA,EAAU,aAAc,CAAA,EAC5B,SAAAkH,EACA,gBAAkBqH,GAAoC,OAChDA,EACFA,EAAK,QAAStN,GAAQ,QACpBJ,EAAAqG,EAAS,QAAT,MAAArG,EAAgB,mBAAmBI,EACrC,CAAC,GAEDJ,EAAAqG,EAAS,QAAT,MAAArG,EAAgB,gBAEpB,EACA,kBAAmB,IAAM+K,GAAkB1E,EAAS,KAAK,EACzD,aAAc,IAAMA,EAAS,MAC7B,oBAAAwE,CAAA,EACA,EAGF8C,EAAa,CACX,oBAAA9C,EACA,iBAAkB,IAAMnF,GAAkB,MAC1C,eAAgB,IAAA,SAAM,OAAAlB,GAAAxE,EAAAqG,EAAS,QAAT,YAAArG,EAAgB,iBAAhB,YAAAwE,EAAA,KAAAxE,IACtB,kBAAmB,IAAM+K,GAAkB1E,EAAS,KAAK,EACzD,QAAS,IAAA,SAAM,OAAA7B,GAAAxE,EAAAqG,EAAS,QAAT,YAAArG,EAAgB,WAAhB,YAAAwE,EAAA,KAAAxE,GAA2B,CAC3C,wBA9nBCoB,EAAAA,YAqFqBC,QAAAzB,EAAAA,gBAAA,EAAA,CArFA,OAAQ2H,EAAA,OAAM,mBACjC,IAmFM,CAnFNtE,EAAAA,mBAmFM,MAAA,CAnFA,IAAKmF,EAAmB,MAAM,kBAAmB,MAAK7E,EAAAA,eAAA,CAAA,CAAK4F,EAAA,KAAU,EAAGC,GAAA,KAAA,CAAS,CAAA,GACrFnG,EAAAA,mBAiFM,MAjFND,GAiFM,CA/EI7B,EAAA,6BADRO,EAAAA,mBAUM,MAAA,eARA,aAAJ,IAAIkC,EACJ,MAAKgK,EAAAA,eAAA,CAAC,WAEEvE,GAAA,MAAW,OAAI,SAAgBA,GAAA,MAAW,MAAK,CAAA,UAAgBnB,EAAA,OAAamB,GAAA,MAAW,OAAI,QAAA,CAAA,CAAA,EADlG,MAAK9F,EAAAA,eAAE8F,GAAA,MAAW,OAASA,GAAA,MAAW,OAAI,UAAiBA,GAAA,MAAW,KAAK,CAAA,GAG/CH,GAAA,qBAA7BxH,EAAAA,mBAEM,MAAA,OAFD,MAAM,YAAmC,sCAAwBwH,GAAA,MAAc,OAAA,MAAA,CAAA,GAClFlH,EAAAA,WAAQC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mEAGZ4L,EAAAA,gBAAApM,EAAAA,UAAA,EAAAC,qBAoEM,MApENwB,GAoEM,CAnEJD,EAAAA,mBAyCM,MAzCNG,GAyCM,CArCKjC,EAAA,QAAQ,WAAaA,EAAA,QAAQ,UAAU,QAAWA,EAAA,QAAQ,wBAHnEC,EAAAA,YAME0M,GAAA,eALI,WAAJ,IAAIjK,EACH,SAAQ,CAAA,SAAcxC,EAAAA,MAAAlC,CAAA,EAAQ,aAAgBsJ,EAAA,KAAA,EAE9C,aAAYtH,EAAA,QAAQ,UACpB,YAAWA,EAAA,QAAQ,QAAA,8EAEtBM,EAAAA,YAAAL,EAAAA,YAgCWC,EAAAA,iBAhCXG,EAAAA,WAgCW,CA/BT,MAAM,eACL,GAAIqG,EAAA,MACJ,IAAKA,EAAA,cACF,WAAJ,IAAIxB,EACJ,MAAA,CAAA,MAAA,MAAA,CAAA,EACQsE,GAAA,MAAc,CACrB,KAAMxJ,EAAA,WACN,aAAaiM,GACb,kBAAkBpC,EAAA,IAER,gBACT,IAaM,CAAA,GAAA+C,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAbN9K,EAAAA,mBAaM,MAAA,CAbD,MAAM,8BAA4B,CACrCA,EAAAA,mBAUM,MAAA,CAVD,MAAM,mBAAiB,CAC1BA,EAAAA,mBAQM,MAAA,CARD,MAAM,uBAAuB,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,MAAM,4BAAA,GACjFA,EAAAA,mBAMI,IAAA,CAND,UAAU,iBAAiB,KAAK,OAAO,YAAU,SAAA,GAClDA,EAAAA,mBAA+E,UAAA,CAAtE,MAAM,+BAA+B,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAA,GACzEA,EAAAA,mBAGI,IAAA,CAHD,MAAM,yBAAyB,YAAU,SAAA,GAC1CA,EAAAA,mBAA0H,OAAA,CAApH,EAAE,gHAA+G,EACvHA,EAAAA,mBAA4R,OAAA,CAAtR,EAAE,gPAAgP,MAAM,2BAAA,WAKtQA,EAAAA,mBAA6C,MAAA,CAAxC,MAAM,uBAAA,EAAwB,MAAI,CAAA,4BAG9B,IAAwC,EAArDxB,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAIcC,WAAA,KAAA2B,EAAAA,WAJuBwG,GAAA,MAAe,CAA/BjJ,EAAMR,mBAA3Be,EAAAA,YAIc4M,GAAA,CAJyC,IAAKnN,EAAK,MAAQA,EAAK,KAAOR,EAAQ,KAAI,CAAA,GAAOQ,EAAI,YAAeR,CAAA,CAAK,uBAC9GQ,EAAK,aAAeA,EAAK,YAAY,mBAAeA,EAAK,YAAY,aACnF,GAAAiB,EAAAA,QAAA,CAA4I,CADvC,MAAAC,KAAK,CAC1GC,EAAAA,WAA4IC,EAAA,OAAhDpB,EAAK,YAAY,aAA7GW,EAAAA,WAA4I,CAAA,QAAA,EAAA,EAAA,CAAA,GAAzHX,EAAI,YAAeR,EAAK,IAAO0B,EAAM,IAAG,OAAUA,EAAM,MAAA,EAAM,CAA2C,MAAAA,EAAY,EAAA,OAAA,EAAA,CAAA,wEAMxIoG,EAAA,qBADRzG,EAAAA,mBAwBM,MAAA,eAtBA,gBAAJ,IAAIoC,EACJ,MAAM,kBACL,MAAKP,EAAAA,eAAA,UAA6B4F,EAAA,QAAU,SAAA,WAAA,gEAQ7C8E,cAWE5M,EAAAA,MAAA6M,EAAAA,YAAA,EAAA,CAVC,WAAYvE,GAAA,MACZ,KAAMD,GAAA,MAAiB,QAAalB,EAAA,MAAiB,KACrD,MAAOA,EAAA,MAAiB,MACjB,YAAWA,EAAA,MAAiB,SAAjB,oBAAAuF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAA3F,EAAA,MAAiB,SAAQ2F,GAC3C,aAAY1E,GAAA,MACL,eAAcjB,EAAA,MAAiB,QAAjB,uBAAAuF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAA3F,EAAA,MAAiB,QAAO2F,GAC7C,OAAQ3E,GAAA,MACT,MAAA,CAAA,QAAA,IAAA,OAAA,SAAA,aAAA,QAAA,EACC,aAAayD,EACb,gBAAgBE,EAAA,mJAjEPvD,GAAA,KAAU,CAAA,qECblCwE,EAAQ,QAAU,SAAUC,EAAU,CACpCA,EAAI,UAAUD,EAAQ,KAAMA,CAAO,CACrC,EACAA,EAAQ,SAAW,GACnBA,EAAQ,OAAS,CACf,QAAQC,EAAUvN,EAAe,GAAI,CACnCuN,EAAI,QAAQ,eAAgB,CAC1B,GAAIvN,EAAQ,SAAW,CAAA,CAAC,CACzB,EACDuN,EAAI,UAAUD,EAAQ,KAAM,CAAE,GAAGA,EAAS,QAAS,CAAE,GAAGA,EAAQ,QAAS,GAAItN,EAAQ,SAAW,CAAA,CAAC,EAAM,CACzG,CACF,ECSA,MAAMwN,EAAiB,CAAC5H,EAA8B6H,IAA0B,CAC9E,MAAMC,EAAOD,EAAK,MAAM,UAAU,EAAE,OAAO,OAAO,EAClD,IAAI/D,EAAS9D,EACb,UAAWR,KAAOsI,EAAM,CACtB,GAAIhE,GAAU,KAAM,OACpBA,EAASA,EAAOtE,CAAG,CACrB,CACA,OAAOsE,CACT,EAEMiE,EAAiB,CAAC/H,EAA8B6H,EAAc/N,IAAyB,CAC3F,MAAMgO,EAAOD,EAAK,MAAM,UAAU,EAAE,OAAO,OAAO,EAC5CG,EAAUF,EAAK,IAAA,EACrB,IAAIG,EAAmCjI,EACvC,UAAWR,KAAOsI,EACZG,EAAQzI,CAAG,GAAK,OAClByI,EAAQzI,CAAG,EAAI,CAAA,GAEjByI,EAAUA,EAAQzI,CAAG,EAEnBwI,IACFC,EAAQD,CAAO,EAAIlO,EAEvB,EAEO,SAASoO,IAAgB,CAmP9B,MAAO,CAAE,oBAlPoBhN,OACH,IAAI,CAC1B,CACE,QACA,CAACiN,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIC,EAAAA,QAAS,CAClB,WAAYR,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,SACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EACLE,EAAAA,SACA,CACE,WAAYT,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,EAEF,IAAA,OACE,OAAAiB,EAAAI,EAAI,cAAJ,YAAAJ,EAAiB,IAAI,CAACgP,EAAKC,IACzBJ,EAAIK,EAAAA,SAAU,CAAE,IAAKD,EAAK,MAAOD,EAAI,MAAO,MAAOA,EAAI,MAAO,GAChE,CAEN,EAEF,CACE,aACA,CAACH,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIM,EAAAA,aAAc,CACvB,WAAYb,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,aACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIO,EAAAA,aAAc,CACvB,WAAYd,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,SACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIQ,EAAAA,SAAU,CACnB,WAAYf,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,cACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIS,EAAAA,cAAe,CACxB,WAAYhB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,WACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIU,EAAAA,WAAY,CACrB,WAAYjB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,WACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIW,EAAAA,WAAY,CACrB,WAAYlB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,QAASA,EAAI,YACb,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,QACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EACLY,EAAAA,aACA,CACE,WAAYnB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,EAEF,IAAA,OACE,OAAAiB,EAAAI,EAAI,cAAJ,YAAAJ,EAAiB,IAAI,CAACgP,EAAKC,IACzBJ,EAAIa,EAAAA,QAAS,CAAE,IAAKT,EAAK,MAAOD,EAAI,OAAS,IAAMA,EAAI,KAAK,GAC9D,CAEN,EAEF,CACE,WACA,CAACH,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EACLc,EAAAA,gBACA,CACE,WAAYrB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,EAEF,IAAA,OACE,OAAAiB,EAAAI,EAAI,cAAJ,YAAAJ,EAAiB,IAAI,CAACgP,EAAKC,IACzBJ,EAAIe,EAAAA,WAAY,CAAE,IAAKX,EAAK,MAAOD,EAAI,OAAS,IAAMA,EAAI,KAAK,GACjE,CAEN,EAEF,CACE,SACA,CAACH,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIgB,EAAAA,SAAU,CACnB,WAAYvB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,OACA,CAAC8P,EAAelC,EAAgC,CAAE,IAAAvM,KACzCyO,EAAIiB,EAAAA,OAAQ,CACjB,WAAYxB,EAAe3B,EAAOvM,EAAI,IAAI,EAC1C,GAAGA,EAAI,MACP,GAAGA,EAAI,GACP,sBAAwBrB,GAAiB,CACvC0P,EAAe9B,EAAOvM,EAAI,KAAMrB,CAAG,CACrC,CAAA,CACD,CACH,EAEF,CACE,SACA,CAAC8P,EAAekB,EAAiC,CAAE,IAAA3P,KAAmC,CACpF,KAAM,CAAE,MAAO4P,EAAa,YAAAC,EAAa,cAAAC,EAAe,WAAAC,EAAY,GAAGC,GAAYhQ,EAOnF,IAAIiQ,EAAmF,KAGvF,MAAMC,EAAyC,CAC7C,GAAGN,EACH,GAAGI,EAAQ,MACX,IAAM3Q,GAAyE,CAC7E4Q,EAAiB5Q,CACnB,CAAA,EAIF,GAAI2Q,EAAQ,GACV,SAAW,CAAClK,EAAKqK,CAAO,IAAK,OAAO,QAAQH,EAAQ,EAAE,EACpDE,EAAc,KAAKpK,EAAI,OAAO,CAAC,EAAE,aAAa,GAAGA,EAAI,MAAM,CAAC,CAAC,EAAE,EAAIqK,EAKnEN,IACFK,EAAc,cAAc,EAAIL,GAIlC,MAAM5I,EAAwE,CAAA,EAG9E,OAAI6I,KACeI,EAAc,UAAeA,EAAc,WAAW,KACtD,eACfjJ,EAAM,QAAU,IAAM6I,EAAcrB,CAAG,EAEvCxH,EAAM,QAAU,IAAM6I,EAAcrB,CAAG,GAKvCsB,IACF9I,EAAM,KAAO,CAAC,CAAE,KAAAmJ,KACPL,EAAWtB,EAAK2B,EAAM,IAAM,CACjCH,GAAA,MAAAA,EAAgB,aAAaG,EAC/B,CAAC,GAIE3B,EAAI4B,EAAAA,SAAUH,EAAejJ,CAAK,CAC3C,CAAA,CACF,CACD,EACkB,IAAIzF,EAAK,QAAQ,IAAM,IAAM,KAGzC,CACX,CChSO,SAAS8O,GAAcjS,EAA8E,CAC1G,MAAMkS,EAAS3M,EAAAA,IAAI,EAAK,EAElB4M,EAAcjO,EAAAA,SAAS,IAAA,SAAM,QAAA6B,GAAAxE,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,eAAvB,YAAAwE,EAAqC,cAAe,GAAK,EAEtFqM,EAAYlO,EAAAA,SAAS,WAAM,QAAA3C,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,cAAe,CAAE,OAAQ,IAAI,EAE/E8Q,EAAanO,EAAAA,SAAS,IAAA,OAAM,QAAA3C,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,eAAgB,GAAE,EAErE+Q,EAAsBpO,EAAAA,SAAS,IAAA,OAAM,OAAA3C,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,WAAU,EAEtEgR,EAAsBrO,EAAAA,SAAS,IAAM,CACzC,IAAIsO,EAAM,EACV,MAAMC,EAAqC,CAAA,EACrCC,EAAwD,CAAA,EACxDC,EAAY3S,EAAM,aAExB,QAASyC,EAAI,EAAGA,EAAIkQ,EAAU,OAAQlQ,IAAK,CACzC,MAAMU,EAAOwP,EAAUlQ,CAAC,EAExB,GADA+P,GAAOrP,EAAK,MAAQ,EAChBqP,EAAM,GAAI,CACZ,MAAMI,EAAYF,EAAW,OAASA,EAAWA,EAAW,OAAS,CAAC,EAAE,SAAW,EACnFA,EAAW,KAAK,CAAE,UAAAE,EAAW,SAAUnQ,EAAG,EAC1C+P,EAAMrP,EAAK,MAAQ,EACfV,IAAMkQ,EAAU,OAAS,GAC3BD,EAAW,KAAK,CAAE,UAAWjQ,EAAG,SAAUA,EAAI,EAAG,CAErD,SACMA,IAAMkQ,EAAU,OAAS,EAAG,CAC9B,MAAMC,EAAYF,EAAW,OAASA,EAAWA,EAAW,OAAS,CAAC,EAAE,SAAW,EACnFA,EAAW,KAAK,CAAE,UAAAE,EAAW,SAAUnQ,EAAI,EAAG,CAChD,SAAW+P,IAAQ,GAAI,CACrB,MAAMI,EAAYF,EAAW,OAASA,EAAWA,EAAW,OAAS,CAAC,EAAE,SAAW,EACnFA,EAAW,KAAK,CAAE,UAAAE,EAAW,SAAUnQ,EAAI,EAAG,EAC9C+P,EAAM,CACR,CAEJ,CAEAE,EAAW,QAASjG,GAAO,CACzBgG,EAAe,KAAKE,EAAU,MAAMlG,EAAG,UAAWA,EAAG,QAAQ,CAAC,CAChE,CAAC,EAED,MAAMoG,EAAiBJ,EAAe,IAAKhG,GAClCA,EAAG,IAAI,IAAM,CAAC,CACtB,EAED,IAAIqG,EAAc,GAClB,OAAAD,EAAe,QAASlR,GAAQ,CAC9BA,EAAI,QAAQ,CAACoR,EAAGvC,IAAQ,CACtB7O,EAAI6O,CAAG,EAAKsC,GAAe,CAC7B,CAAC,CACH,CAAC,EAEM,CACL,UAAWD,EACX,OAAQA,EAAe,OACvB,gBAAiBA,EAAe,IAAKpG,GAAOA,EAAGA,EAAG,OAAS,CAAC,CAAC,CAAA,CAEjE,CAAC,EAEKuG,EAAS9O,EAAAA,SAAS,IAAM,SAC5B,MAAM+O,IAAalN,GAAAxE,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,eAAvB,YAAAwE,EAAqC,cAAe,EACvE,OAAOkN,EAAa,GAAKA,EAAaV,EAAoB,MAAM,MAClE,CAAC,EAEKW,EAAgBhP,EAAAA,SAAS,IAAM,SACnC,KAAM,CAAE,OAAAiP,EAAQ,UAAAC,CAAA,EAAcb,EAAoB,MAC5Cc,EAAaD,EAAUD,EAAS,CAAC,GAAK,CAAA,EACtCG,IAAavN,GAAAxE,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,eAAvB,YAAAwE,EAAqC,aAAc,EAEhEwN,EAAU,GADEF,EAAW,OAAO,CAACG,EAAKhD,IAAA,OAAQ,OAAAgD,KAAOjS,EAAAvB,EAAM,aAAawQ,CAAG,IAAtB,YAAAjP,EAAyB,OAAQ,IAAI,CAAC,EAG/F,MAAO,CAAC2Q,EAAO,OAASoB,GAAcC,EAAUA,EAAU,EAC5D,CAAC,EAEKE,EAAWvP,EAAAA,SAAS,IAAM,SAC9B,MAAM+O,IAAalN,GAAAxE,EAAAvB,EAAM,kBAAN,YAAAuB,EAAuB,eAAvB,YAAAwE,EAAqC,cAAe,EACjE,CAAE,gBAAA2N,GAAoBnB,EAAoB,MAEhD,GAAIL,EAAO,MAAO,CAChB,MAAMyB,EAAgBD,EAAgBT,EAAa,CAAC,GAAKS,EAAgBA,EAAgB,OAAS,CAAC,GAAK,KACxG,OAAO1T,EAAM,aAAa,IAAI,CAACyM,EAAI7K,KAAW,CAC5C,GAAG6K,EACH,OAAQ7K,EAAQ+R,CAAA,EAChB,CACJ,CACA,OAAO3T,EAAM,aAAa,IAAKyM,IAAQ,CAAE,GAAGA,EAAI,OAAQ,EAAA,EAAQ,CAClE,CAAC,EAEDlD,OAAAA,EAAAA,MACEyJ,EACC1S,GAAQ,CACP4R,EAAO,MAAQ5R,CACjB,EACA,CAAE,UAAW,EAAA,CAAK,EAOb,CACL,OAAA4R,EACA,YAAAC,EACA,UAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,oBAAAC,EACA,OAAAS,EACA,cAAAE,EACA,SAAAO,EACA,aAdmB,IAAM,CACzBvB,EAAO,MAAQ,CAACA,EAAO,KACzB,CAYE,CAEJ,CCzGO,SAAS0B,GAAeC,EAA2E,CACxG,MAAM1G,EAAuB,CAACN,EAAiCxK,EAAyB,CAAA,EAAIyR,IAA4B,CACtH,KAAM,CAAE,QAAA1G,EAAS,KAAAC,EAAM,GAAG0G,CAAA,EAAY1R,GAAW,CAAA,EACjD,GAAI0F,EAAS1F,EAAQ,SAAS,GAAK,OAAO,KAAKA,EAAQ,SAAS,EAAE,QAAUA,EAAQ,UAAU,IAAK,CACjG,MAAM2R,EAAiB,CAAE,GAAGnH,EAAQ,GAAGY,EAAAA,MAAMC,QAAMrL,EAAQ,UAAU,OAAS,CAAA,CAAE,CAAC,CAAA,EAC3EwL,EAAgB,CAAE,GAAGJ,EAAAA,MAAMC,EAAAA,MAAMrL,EAAQ,UAAU,SAAW,CAAA,CAAE,CAAC,CAAA,EACnEA,EAAQ,UAAU,SACpBwL,EAAc,OAASxL,EAAQ,UAAU,QAG3C,MAAM4R,EAAiB,CACrB,IAAK5R,EAAQ,UAAU,IACvB,QAAS,CAAE,GAAIA,EAAQ,UAAU,SAAW,CAAA,CAAC,EAC7C,WAAY2R,EACZ,GAAGnG,CAAA,EAGCE,EAAY1L,EAAQ,aAAewR,EACzC,GAAI,CAAC9F,EAAW,OAEhBA,EAAUkG,CAAc,EACrB,KAAMjG,GAAQ,CAET,OAAOZ,GAAY,YAAcY,IAAQjG,EAASiG,CAAG,GAAK,MAAM,QAAQA,CAAG,IAC7EZ,EAAQY,CAA8B,CAE1C,CAAC,EACA,MAAO3M,GAAM,CACR,OAAOgM,GAAS,YAClBA,EAAKhM,CAAC,CAEV,CAAC,CACL,CACF,EAEM8I,EAAoBlC,GAA0C,CAClE,MAAMuE,EAAe,CAAC,QAAS,WAAY,UAAW,UAAU,EAChE,OAAIzE,EAASE,CAAG,EACP,OAAO,KAAKA,CAAG,EAAE,MAAOwE,GACtBD,EAAa,KAAME,GAAQA,IAAQD,CAAE,GAAKxE,EAAIwE,CAAE,GAAK,OAAOxE,EAAIwE,CAAE,GAAM,QAChF,EAEI,EACT,EAEMyH,EAAkB,CAAC7R,EAAmC,CAAA,EAAI8R,IAAoF,CAClJ,GAAIpM,EAAS1F,EAAQ,aAAa,GAAK,OAAO,KAAKA,EAAQ,aAAa,EAAE,QAAU8H,EAAiB9H,EAAQ,aAAwC,EACnJ,OAAOA,EAAQ,cAGjB,GAAI,OAAO8R,GAAqB,WAAY,CAC1C,MAAM/J,EAAe+J,EAAiB,CACpC,MAAO,UACP,SAAU,WACV,QAAS,SACT,SAAU,MAAA,CACX,EACD,GAAIhK,EAAiBC,CAAY,EAC/B,OAAOA,CAEX,CAEA,MAAO,CACL,MAAO,UACP,SAAU,WACV,QAAS,SACT,SAAU,MAAA,CAEd,EAEM4C,EAAkB,CAACrL,EAA8BsL,EAAmB5K,EAAmC,CAAA,EAAI8R,IAAoF,CACnM,MAAMC,EAAiBF,EAAgB7R,EAAS8R,CAAgB,EAC1DE,EAA4C,CAAA,EAGlD,GAAIpH,EAAQ,SAAS,UAAU,GAAK,MAAM,QAAQtL,CAAG,EACnD,OAAA0S,EAAiB,SAAc1S,EACxB0S,EAGT,GAAItM,EAASqM,CAAc,GAAK,OAAO,KAAKA,CAAc,EAAE,OAC1D,SAAW,CAAC3M,EAAK1F,CAAK,IAAK,OAAO,QAAQqS,CAAc,EAAG,CAEzD,GADkBnH,EAAQ,UAAWR,GAAOA,IAAOhF,CAAG,IACpC,GAAI,SAEtB,MAAM6M,EAAW3S,EAAII,CAAe,EACpC,GAA8BuS,GAAa,KACrC7M,IAAQ,WACV4M,EAAiB5M,CAAG,EAAI,MAAM,QAAQ6M,CAAQ,EAAIA,EAAW,CAAA,EAE7DD,EAAiB5M,CAAG,EAAI,OAAO6M,GAAa,SAAWA,EAAW,SAASA,EAAoB,EAAE,GAAK,MAEnG,CACL,MAAMC,EAAavM,GAAerG,EAAKI,CAAe,EAClD0F,IAAQ,WACV4M,EAAiB5M,CAAG,EAAI,MAAM,QAAQ8M,CAAU,EAAIA,EAAa,CAAA,EAEjEF,EAAiB5M,CAAG,EAAI,OAAO8M,GAAe,SAAWA,EAAa,SAASA,EAAsB,EAAE,GAAK,CAEhH,CACF,CAEF,OAAOF,CACT,EAEMG,EAA0B,CAACtG,EAAgC7L,EAAwB4M,EAAsBkF,IACtG,IAAI,QAAgF,CAAChG,EAASC,IAAW,CAC9GzH,EAAAA,SAAS,IAAM,CACbwG,EACE,CAAE,UAAW,EAAG,SAAU,IAAM,GAAIe,GAAS,EAAC,EAC9C,CACE,GAAI7L,GAAW,CAAA,EACf,QAAU2L,GAAQ,CAChB,MAAMyG,EAAazH,EAAgBgB,EAAK,CAAC,QAAS,UAAU,EAAGiB,EAA4CkF,CAAgB,EAC3HhG,EAAQ,CAAE,KAAMH,EAAK,WAAAyG,CAAA,CAAY,CACnC,EACA,KAAOpG,GAAQ,CACbD,EAAOC,CAAG,CACZ,CAAA,CAGJ,CACF,CAAC,CACH,CAAC,EA0DH,MAAO,CACL,qBAAAlB,EACA,uBAzD6B,MAAOuH,EAA4BP,IAAoF,CACpJ,GAAI,CACF,GAAI,CAAC,MAAM,QAAQO,CAAQ,QAAU,CAAA,EACrC,MAAMC,EAAaD,EAAS,OAAQjI,GAAOA,GAAMA,EAAG,WAAa1E,EAAS0E,EAAG,SAAS,GAAKA,EAAG,UAAU,GAAG,EACrGmI,EAAqD,CAAA,EAErDC,EAAkBF,EAAW,IAAKb,GAAW,SACjD,KAAM,CAAE,YAAAtC,GAAgBsC,EAClBgB,EAAcN,EAClB,CAAE,KAAIjT,EAAAuS,EAAO,YAAP,YAAAvS,EAAkB,QAAS,CAAA,CAAC,EAClC,CAAE,YAAAiQ,EAAa,UAAWsC,EAAO,UAAW,KAAI/N,EAAA+N,EAAO,YAAP,YAAA/N,EAAkB,UAAW,EAAC,EAC9E+N,EACAK,CAAA,EAEF,OAAO7L,GAAYwM,CAAW,CAChC,CAAC,EAID,OAFgB,MAAM,QAAQ,IAAID,CAAe,GAEzC,QAAQ,CAAC1R,EAAMvB,IAAU,OAC/B,GAAIuB,EAAK,SAAW,YAAa,CAC/B,KAAM,CAAE,WAAAsR,EAAY,KAAAM,CAAA,EAAS5R,EAAK,MAC5B2Q,EAASa,EAAW/S,CAAK,EACzBoT,EAAmBlB,GAAA,YAAAA,EAAQ,iBAOjC,IAAImB,EAAsB,CAAA,EACtBD,GAAA,MAAAA,EAAkB,OACpBC,EAAWD,EAAiB,KAAKD,CAAI,GAIvC,MAAMG,EACJ,MAAM,QAAQD,CAAQ,GAAKA,EAAS,OAAS,EACzCA,EACA,OAAOnB,GAAA,YAAAA,EAAQ,uBAAyB,WACtCA,EAAO,sBAAqBW,GAAA,YAAAA,EAAY,YAAyBX,GAAA,YAAAA,EAAQ,cAAe,EAAE,EAC1F,OAERc,EAAU,KAAK,CACb,KAAMD,EAAW/S,CAAK,EAAE,KACxB,SAAU,MAAM,QAAQsT,CAAc,EAAIA,GAAkBT,GAAA,YAAAA,EAAY,aAAyBlT,EAAAoT,EAAW/S,CAAK,IAAhB,YAAAL,EAAmB,cAAe,CAAA,CAAC,CACrI,CACH,CACF,CAAC,EACMqT,CACT,MAAY,CACV,MAAO,CAAA,CACT,CACF,EAKE,gBAAA5H,EACA,gBAAAkH,CAAA,CAEJ,CCnMA,MAAMiB,GAAsBC,GACtB,OAAOA,GAAa,SACf,SAAS,cAAcA,CAAQ,GAAK,SAAS,KAE/CA,aAAoB,YAAcA,EAAW,SAAS,KAGzDC,GAAe,CAACC,EAAgBtV,EAAsBuV,EAAwBC,IAAoB,OACtG,MAAMC,EAAQC,EAAAA,YAAYJ,EAAWtV,CAAK,EAE1C,GAAIwV,EAAY,CACdC,EAAM,WAAaD,EAEdC,EAAM,WAAW,WACpBA,EAAM,WAAW,SAAW,CAAA,GAI9B,MAAM1M,GAAiBxH,EAAAiU,EAAW,WAAX,YAAAjU,EAAqB,SACxCwH,IACF0M,EAAM,WAAW,SAAS,SAAc1M,GAGrC0M,EAAM,WAAW,SACpBA,EAAM,WAAW,OAAS,CAAA,GAEvBA,EAAM,WAAW,OAAO,mBAC3BA,EAAM,WAAW,OAAO,iBAAmB,CAAA,EAE/C,CAEA3T,OAAAA,EAAAA,OAAO2T,EAAOF,CAAS,EAERJ,GAAmBnV,EAAM,QAAQ,EACzC,YAAYuV,CAAS,EACrBE,CACT,EAEaE,GAAY,CAACL,EAAiB/E,EAAkC,KAAO,CAIlF,GAHA+E,EAAYA,GAAaM,GACT,OAAO,OAAO,CAAE,aAAc,EAAA,EAASrF,CAAG,EAE9C,aAAc,CACxB,MAAM7P,EAAWsI,EAAAA,mBAAA,EACXwM,GAAa9U,GAAA,YAAAA,EAAU,aAAc,KACrC6U,EAAY,SAAS,cAAc,KAAK,EAExCM,EAAQ,IAAM,CAClB/T,EAAAA,OAAO,KAAMyT,CAAS,EACtBA,EAAU,OAAA,CACZ,EAEMO,EAAmBC,GAAiC,CACpDA,EAAc,UAAY,SAC5BA,EAAc,QAAU,IAG1B,MAAMC,EAAmBD,EAAc,SACjCE,EAAmBF,EAAc,SAEvC,OAAAA,EAAc,SAAW,IAAIG,IAAgB,CAC3CF,GAAA,MAAAA,EAAmB,GAAGE,GACtBL,EAAA,CACF,EAEAE,EAAc,SAAW,CAACI,EAAUN,IAAU,CAC5CI,GAAA,MAAAA,EAAmBE,EACrB,EAEOd,GAAaC,EAAWS,EAAeR,EAAWC,CAAU,CACrE,EAEA,OAAAM,EAAgB,MAAQD,EACjBC,CACT,KAAO,CACL,MAAMP,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,oBACtB,MAAM7U,EAAWsI,EAAAA,mBAAA,EACXwM,GAAa9U,GAAA,YAAAA,EAAU,aAAc,KAC3C,IAAI+U,EAAa,KAEjB,MAAMI,EAAQ,IAAM,CACdJ,GAASA,EAAM,YACjBA,EAAM,UAAU,MAAM,QAAU,GAEpC,EAEMW,EAAU,IAAM,CAChBX,IACF3T,EAAAA,OAAO,KAAMyT,CAAS,EACtBA,EAAU,OAAA,EACVE,EAAQ,KAEZ,EAEMK,EAAmBC,GAAiC,CACxD,GAAIN,GAASA,EAAM,UACjB,cAAO,OAAOA,EAAM,UAAU,MAAOM,CAAa,EAClDN,EAAM,UAAU,MAAM,QAAU,GACzBA,EAGT,MAAMY,EAA+B,CACnC,QAAS,GACT,MAAO,MACP,eAAgB,GAChB,GAAGN,CAAA,EAGC,CAAE,SAAUC,EAAkB,SAAUC,GAAqBI,EAEnE,OAAAA,EAAc,SAAW,IAAM,CAC7BL,GAAA,MAAAA,IACAH,EAAA,CACF,EAEAQ,EAAc,SAAW,CAACF,EAAUN,IAAU,CAC5CI,GAAA,MAAAA,EAAmBE,EACrB,EAEAV,EAAQJ,GAAaC,EAAWe,EAAed,EAAWC,CAAU,EAC7DC,CACT,EAEA,OAAAK,EAAgB,MAAQD,EACxBC,EAAgB,QAAUM,EACnBN,CACT,CACF,sHCaAQ,GAAe,CAAE,KAAM,QAAA,2VAyBvB,MAAMtW,EAAQ0C,EA2BRhC,EAAWsI,EAAAA,mBAAA,EACXuN,EAAc9U,EAAAA,OAAgC,cAAe,EAAE,EAC/DD,EAASC,EAAAA,OAAgC,UAAW,EAAE,EAEtDyH,EAAmBtF,GAA6B,CACpD,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMuF,EAAK3H,EAAO,WAClB,OAAO,OAAO2H,GAAO,WAAcA,EAA8BvF,CAAM,EAAI,EAC7E,EAEM4S,EAAkBrT,GAClBA,EAAK,UAAY,OAAO3B,EAAO,GAAM,WAC/BA,EAAO,EAA4B2B,EAAK,QAAQ,EAEnDA,EAAK,MAIRsT,EAAuBhV,EAAAA,OAA2B,oBAAqB,IAAI,EAC3EiV,EAAkBxS,EAAAA,SAAS,IAAM,CACrC,GAAIuS,EACF,OAAO,OAAOA,GAAyB,WAAaA,EAAA,EAAyBA,EAE/E,MAAME,EAAMjW,GAAA,YAAAA,EAAU,IACtB,OAAO,OAAOiW,GAAA,YAAAA,EAAK,oBAAsB,WAAaA,GAAA,YAAAA,EAAK,oBAAsBA,GAAA,YAAAA,EAAK,iBACxF,CAAC,EAEKC,EAAgB1S,EAAAA,SAAS,IACtB,CAAC,EAAEwS,EAAgB,OAAS,OAAO,KAAKA,EAAgB,KAAK,EAAE,OACvE,EAGKG,EAAe,OAAO,YAAY,OAAO,QAAQC,EAAmB,CAAC,EACrEC,EAAetP,GAAkBA,EAAMoP,EAAapP,CAAG,GAAKA,EAAM,OAClEuP,EAAiBvK,GAAkB,CACvC,KAAM,CAAE,KAAAwK,EAAM,GAAG1G,CAAA,EAAQ9D,EACzB,OAAO8D,CACT,EAGM2G,EAAO3R,EAAAA,IAAa,IAAI,EACxByE,EAAezE,EAAAA,IAA6B,EAAE,EAC9C4R,EAAmB5R,EAAAA,IAAsBvF,EAAM,YAAY,EAE3DoX,EAAcpW,GAAgB,CAC9BA,MAAS,MAAQA,EACvB,EAGM,CAAE,oBAAAqW,CAAA,EAAwBlH,GAAA,EAC1B0D,GAAqB0C,GAAA,YAAAA,EAAa,eAA0E,OAC5Ge,EAA0BtX,EAAM,mBAAoBuW,GAAA,YAAAA,EAAa,kBACjE,CAAE,uBAAAgB,CAAA,EAA2B3D,GAAeC,CAAiB,EAG7D2D,EAAgBjS,EAAAA,MAA6BhE,GAAAvB,EAAM,kBAAN,YAAAuB,GAAuB,eAAgB,CAAA,CAAE,EACtFkW,EAAYvT,EAAAA,SAAS,KAAO,CAChC,GAAGsT,EAAc,MACjB,MAAOxX,EAAM,MACb,MAAOA,EAAM,MACb,qBAAsB,EAAA,EACtB,EAGI0X,EAAiBnS,EAAAA,IAAiB,IAAI,GAAK,EAEjDgE,EAAAA,MACE,IAAMvJ,EAAM,aACZ,MAAOM,GAAQ,CACb,MAAMgL,EAAO,MAAM,QAAQhL,CAAG,EAAIA,EAAM,CAAA,EAElCqX,EAAerM,EAAK,OAAQmB,GAAOA,GAAMA,EAAG,YAAc,IAAS,CAACiL,EAAe,MAAM,IAAIjL,EAAG,IAAI,CAAC,EAC3G,GAAI,CAACkL,EAAa,OAAQ,CAExBR,EAAiB,MAAQ7L,EAAK,IAAKmB,GAAO,OACxC,GAAI,CAACA,EAAI,OAAO,KAChB,MAAMmL,EAAWT,EAAiB,MAAM,KAAMU,IAAQA,IAAOA,GAAI,OAASpL,EAAG,IAAI,EACjF,OAAOlL,EAAAqW,GAAA,YAAAA,EAAU,cAAV,MAAArW,EAAuB,OAAS,CAAE,GAAGkL,EAAI,YAAamL,EAAS,WAAA,EAAgBnL,CACxF,CAAC,EAAE,OAAQA,GAA6B,CAAC,CAACA,CAAE,EAC5C,MACF,CACA,MAAMwC,EAAO,MAAMsI,EAAuBI,EAAcL,CAAsB,EAE9EK,EAAa,QAASlL,GAAOiL,EAAe,MAAM,IAAIjL,EAAG,IAAI,CAAC,EAC9D0K,EAAiB,MAAQ7L,EACtB,IAAKmB,GAAO,QACX,GAAI,CAACA,EAAI,OAAO,KAChB,MAAMqL,EAAkB7I,EAAK,KAAM9L,IAASA,IAAQA,GAAK,OAASsJ,EAAG,IAAI,EACnEmL,EAAWT,EAAiB,MAAM,KAAMU,IAAQA,IAAOA,GAAI,OAASpL,EAAG,IAAI,EAEjF,OAAIqL,EAAwB,CAAE,GAAGrL,EAAI,YAAaqL,EAAgB,QAAA,GAC9DvW,GAAAqW,GAAA,YAAAA,EAAU,cAAV,MAAArW,GAAuB,OAAe,CAAE,GAAGkL,EAAI,YAAamL,EAAS,WAAA,EAClEnL,CACT,CAAC,EACA,OAAQA,GAA6B,CAAC,CAACA,CAAE,CAC9C,EACA,CAAE,UAAW,GAAM,KAAM,EAAA,CAAK,EAGhC,MAAMsL,EAAqB7T,EAAAA,SAAS,KACrBiT,EAAiB,OAAS,CAAA,GAEpC,IAAK1K,GAAQA,EAAK,CAAE,GAAGA,EAAI,KAAMA,EAAG,MAAQ,EAAG,YAAaA,EAAG,aAAe,CAAA,CAAC,EAAM,IAAK,EAC1F,OAAQA,GACFA,EACDA,EAAG,UAAY,OAAOA,EAAG,UAAa,WACjC,CAACA,EAAG,SAASzM,EAAM,MAAOyM,EAAIgL,EAAU,KAAK,EAE/C,GAJS,EAKjB,CACJ,EAEK,CACJ,OAAAvF,EACA,YAAAC,EACA,UAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,oBAAAC,GACA,OAAAS,EACA,cAAAE,GACA,SAAAO,GACA,aAAAuE,EAAA,EACE/F,GAAc,CAChB,gBAAiBjS,EAAM,gBACvB,IAAI,cAAe,CAAE,OAAO+X,EAAmB,KAAM,CAAA,CACtD,EAEDxO,EAAAA,MACE8I,EACC/R,GAAQ,CACPkX,EAAc,MAAQlX,CACxB,EACA,CAAE,UAAW,EAAA,CAAK,EAGpB,MAAM2X,GAAmB/T,EAAAA,SAAS,KAAO,CACvC,YAAalE,EAAM,UAAU,OAAQyM,GAAOA,EAAG,YAAc,SAAW,CAACA,EAAG,SAAS,EACrF,WAAYzM,EAAM,UAAU,OAAQyM,GAAOA,EAAG,YAAc,MAAM,CAAA,EAClE,EAEIyL,GAAchU,EAAAA,SAAS,IAAM,OAAOlE,EAAM,WAAc,UAAU,EAElEmY,GAAW,MAAO1L,GAAkB,SACpCA,EAAG,cAAgB,CAAC,QAAS,MAAM,EAAE,SAASA,EAAG,KAAO,EAAE,EAC5D2L,GAAkBpY,EAAM,MAAOkX,EAAK,MAAsCzK,EAAG,GAAG,GAI3EA,EAAG,MAAQ,QAAUyK,EAAK,OAC1BA,EAAK,MAAM,YAAA,GAEhBnR,EAAA0G,EAAG,QAAH,MAAA1G,EAAA,KAAA0G,EAAWzM,EAAM,MAAOkX,EAAK,OAAO3V,EAAAmV,EAAgB,QAAhB,YAAAnV,EAAuB,qBAE/D,EAEM6W,GAAoB,MAAOlK,EAAgCmK,EAA+E5Q,IAAiB,aAC3JA,IAAQ,QACNmP,EAAc,SAChB7Q,GAAAxE,EAAAmV,EAAgB,QAAhB,YAAAnV,EAAuB,sBAAvB,MAAAwE,EAAA,KAAAxE,EAA6C2M,IAKtCzG,IAAQ,QAAU4Q,IACnBzB,EAAc,SACpB3Q,GAAAH,EAAA4Q,EAAgB,QAAhB,YAAA5Q,EAAuB,sBAAvB,MAAAG,EAAA,KAAAH,EAA6CoI,IAE/CmK,EAAQ,YAAA,EAEZ,EAEMC,GAAuBC,GAAkC,CAC7D,GAAI3B,EAAc,MAAO,CACvB,KAAM,CAAE,MAAA4B,EAAO,GAAG1M,CAAA,EAASyM,EAC3B,MAAO,CAAE,MAAO,CAAE,aAAc,OAAQ,GAAIC,CAAA,EAAqC,GAAG1M,CAAA,CACtF,CACA,OAAOyM,CACT,EAMME,IAAwB,IAAA,OAC5B,OAAAlX,EAAAb,GAAA,YAAAA,EAAU,MAAV,MAAAa,EAAe,eAAiBb,EAAS,IAAI,eAAA,EAAmBiV,KAAA,EAC5D+C,GAAeD,GAAA,EACfE,GAAgBF,GAAA,EAEhBG,GAAgB,IAAM,CAE5B,EAEMC,GAAiB,KACd,CACL,KAAM1B,EAAiB,MAAM,IAAK1K,IAAQ,CACxC,GAAGA,EACH,MAAOA,EAAG,MACV,KAAMA,EAAG,KACT,SAAU,CAAC,CAACA,EAAG,SACf,MAAOA,EAAG,KAAA,EACV,EACF,QAAS,CACP,CAAE,KAAM,YAAa,MAAO,EAAA,EAC5B,CAAE,MAAO,QAAS,IAAK,OAAA,EACvB,CAAE,MAAO,UAAW,IAAK,MAAA,EACzB,CACE,MAAO,KACP,MAAO,IACP,OAAQ,CAACqM,EAAgBnX,IAChBT,EAAAA,EAAE,MAAO,CACdA,EAAAA,EAAEmP,EAAAA,QAAS,CACT,KAAM,QACN,UAAW,EACX,UAAYtO,GAAkBA,EAAM,QAAQ,aAAc,EAAE,EAC5D,WAAYJ,EAAI,MAChB,sBAAwBrB,GAAiB,CACvCqB,EAAI,MAAQrB,CACd,CAAA,EACC,CACD,QAAS,IAAM,KACf,OAAQ,IAAM,IAAA,CACf,CAAA,CACF,CACH,CACF,CACF,GAIEyY,GAAuB,KACpB,CACL,WAAY,CAAA,EACZ,QAAS,CACP,CAAE,KAAM,YAAa,MAAO,EAAA,EAC5B,CAAE,MAAO,QAAS,IAAK,OAAA,EACvB,CAAE,MAAO,UAAW,IAAK,WAAA,EACzB,CACE,MAAO,KACP,MAAO,IACP,OAAQ,CAACD,EAAgBnX,IAChBT,EAAAA,EAAE,MAAO,CACdA,EAAAA,EAAEmP,EAAAA,QAAS,CACT,KAAM,QACN,UAAW,EACX,UAAYtO,GAAkBA,EAAM,QAAQ,aAAc,EAAE,EAC5D,WAAYJ,EAAI,MAChB,sBAAwBrB,GAAiB,CACvCqB,EAAI,MAAQrB,CACd,CAAA,EACC,CACD,QAAS,IAAM,KACf,OAAQ,IAAM,IAAA,CACf,CAAA,CACF,CACH,CACF,CACF,GAIE0Y,GAAqB,IAAM,CAC/B,MAAMC,EAAWJ,GAAA,EACjBH,GAAa,CACX,MAAO,QACP,MAAO,QACP,YAAa,GACb,OAAQ,IAAA,OACNxX,OAAAA,EAAAA,EAAEyO,EAAS,CACT,WAAYsJ,EAAS,KACrB,QAASA,EAAS,QAClB,QAAS,CACP,YAAa,GACb,OAAQ,GACR,QAAS,GACT,QAAS,GACT,OAAQ,GACR,KAAM,OAAA,EAER,WAAY,CACV,SAAU,GACV,QAAS,EACT,QAAO1X,EAAA0X,EAAS,OAAT,YAAA1X,EAAe,SAAU,CAAA,CAClC,CACD,GACH,UAAW,CACT,CACE,KAAM,KACN,KAAM,QACN,MAAO,CAAC2X,EAAoB,CAAE,MAAArD,CAAA,IAAmCA,EAAA,CAAM,EAEzE,CACE,KAAM,KACN,KAAM,UACN,KAAM,QACN,MAAO,CAACqD,EAAoB,CAAE,MAAArD,CAAA,IAAmCA,EAAA,CAAM,CACzE,CACF,CACD,CACH,EAEMsD,GAAwB,IAAM,CAClC,MAAMF,EAAWF,GAAA,EACjBJ,GAAc,CACZ,MAAO,QACP,MAAO,QACP,OAAQ,IACNzX,EAAAA,EAAEyO,EAAS,CACT,WAAYsJ,EAAS,WACrB,QAASA,EAAS,OAAA,CACnB,CAAA,CACJ,CACH,EAGAtS,EAAAA,SAAS,IAAM,SACbqD,EAAa,MAAQkN,EAAK,OACxBnR,GAAAxE,EAAAb,GAAA,YAAAA,EAAU,MAAV,YAAAa,EAA2C,mBAA3C,MAAAwE,EAAA,KAAAxE,EAA8DyI,EAAa,MAC/E,CAAC,EAGD,MAAMoP,GAAYrZ,EAAAA,gBAAgB,CAChC,MAAO,CACL,IAAK,OACL,aAAc,MACd,UAAW,OACX,OAAQ,SACR,SAAU,OAAA,EAEZ,MAAMC,EAAO,CACX,MAAO,IAAM,OACX,KAAM,CAAE,aAAAqZ,EAAc,UAAAC,EAAW,IAAA3X,CAAA,EAAQ3B,EACnCiB,IAAgBjB,EAAAA,EAAM,SAANA,YAAAA,EAAAA,KAAAA,EAAe2B,EAAK2X,EAAWD,EAAcnY,EAAAA,KAAM,GACzE,OAAO,OAAOD,GAAkB,SAAWC,EAAAA,EAAE,OAAQD,CAAa,EAAIA,CACxE,CACF,CAAA,CACD,EAEKsY,GAAgBxZ,EAAAA,gBAAgB,CACpC,MAAO,CACL,IAAK,OACL,MAAO,OACP,QAAS,OACT,OAAQ,SACR,MAAO,OACP,SAAU,OAAA,EAEZ,MAAMC,EAAO,CACX,MAAO,IAAM,OACX,KAAM,CAAE,IAAA2B,EAAK,MAAAC,EAAO,MAAAsM,CAAA,EAAUlO,EACxBiB,IAAgBjB,EAAAA,EAAM,SAANA,YAAAA,EAAAA,KAAAA,EAAekB,EAAAA,EAAGgN,EAAO,CAAE,IAAAvM,EAAK,MAAAC,CAAA,KAAY,GAClE,OAAO,OAAOX,GAAkB,SAAWC,EAAAA,EAAE,OAAQD,CAAa,EAAIA,CACxE,CACF,CAAA,CACD,EAGKuY,GAA0B,MAAOC,GAAwB,CAE7D,MAAMC,EADO3B,EAAmB,MACP,OAAQtL,GAAOA,GAAMgN,EAAU,SAAShN,EAAG,IAAI,CAAC,EACzE,GAAI,CAACiN,EAAY,OAAQ,QAEZ,MAAMnC,EAAuBmC,EAAapC,CAAsB,GACxE,QAASQ,GAAoB,CAChC,GAAI,CAACA,EAAiB,OACtB,MAAM6B,EAAYxC,EAAiB,MAAM,UAAW1K,GAAOA,GAAMA,EAAG,OAASqL,EAAgB,IAAI,EAC7F6B,IAAc,KAChBxC,EAAiB,MAAMwC,CAAS,EAAI,CAClC,GAAGxC,EAAiB,MAAMwC,CAAS,EACnC,YAAa7B,EAAgB,QAAA,EAGnC,CAAC,CACH,EAGM8B,GAAa,IAAM1C,EAAK,MAE9B,OAAAhI,EAAa,CACX,wBAAAsK,GACA,WAAAI,GACA,SAAU,IAAA,OAAM,OAAArY,EAAAqY,GAAA,IAAA,YAAArY,EAAc,YAC9B,YAAa,IAAA,OAAM,OAAAA,EAAAqY,GAAA,IAAA,YAAArY,EAAc,eACjC,cAAgBvB,GAAAA,OAA8B,OAAAuB,EAAAqY,GAAA,IAAA,YAAArY,EAAc,cAAcvB,IAC1E,cAAgBA,GAAAA,OAA6B,OAAAuB,EAAAqY,GAAA,IAAA,YAAArY,EAAc,cAAcvB,IACzE,cAAgBoI,GAAA,OAAiB,OAAA7G,EAAAqY,GAAA,IAAA,YAAArY,EAAc,cAAc6G,GAAI,CAClE,wBAtkBCzF,EAAAA,YA4IUC,EAAAA,MAAAiX,EAAAA,MAAA,EA5IV9W,EAAAA,WA4IU,CA5IA,IAAKqU,CAAA,EAAoBK,EAAA,MAAS,CAAE,MAAM,SAAA,CAAS,EAAA,mBAC3D,IA0IM,CA1INjT,EAAAA,mBA0IM,MA1IND,GA0IM,CAzIJiL,cAwIS5M,EAAAA,qDAxIOA,EAAAA,MAAAwP,CAAA,CAAS,CAAA,EAAA,mBACb,IAAiC,EAA3CpP,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAgBWC,EAAAA,SAAA,KAAA2B,aAhBuBjC,EAAAA,MAAA6Q,EAAA,EAAQ,CAAxBtQ,EAAMvB,oCACtBe,EAAAA,YAcSC,EAAAA,MAAAkX,EAAAA,KAAA,EAAA,CAfuC,IAAA3W,EAAK,KACrB,KAAMA,EAAK,MAAI,CAAA,qBAC7C,IAYe,CAZfqM,EAAAA,YAYe5M,EAAAA,oBAZfG,aAYe,CAXZ,MAAOyT,EAAerT,CAAI,CAAA,eACnBmV,GAAoBnV,EAAK,iBAAe,CAAA,CAAA,EAAA,CAC/C,KAAMA,EAAK,KACX,wBAAY,IAAA,CAAA,EAAQ,CAAA,MAAA,CAAA,CAAA,sBAErB,IAEW,CAFKA,EAAK,wBACnBR,EAAAA,YAA+FC,EAAAA,MAAA2W,EAAA,EAAA,OAA/E,IAAKpW,EAAO,OAAQP,EAAAA,MAAAyU,CAAA,EAAoBlU,CAAI,EAAI,MAAAvB,EAAe,MAAOc,EAAA,KAAA,2DAGtFC,EAAAA,YAAiFC,EAAAA,MAAA2W,EAAA,EAAA,OAAjE,IAAKpW,EAAO,OAAQA,EAAK,OAAS,MAAAvB,EAAe,MAAOc,EAAA,KAAA,kGAX7D,CAAAqX,EAAAA,MAAA,EAAA5W,GAAA,MAAAA,EAAM,OAAM,CAAA,UAiBdP,EAAAA,MAAAuP,CAAA,6CAAjBlP,EAAAA,mBAoHWC,WAAA,CAAA,IAAA,GAAA,CAnHOgV,GAAA,qBACdvV,EAAAA,YAKEC,EAAAA,MAAAwW,EAAA,EAAA,OAJC,IAAG,CAAA,OAAYxW,EAAAA,MAAAoQ,CAAA,EAAM,OAAEpQ,QAAAsP,CAAA,EAAM,cAAEtP,EAAAA,MAAAsQ,EAAA,EAAa,oBAAEtQ,EAAAA,MAAA2P,EAAA,EAAmB,aAAE3P,QAAAoV,EAAA,EAAY,SAAYhO,EAAA,KAAA,EAC3F,aAAYtH,EAAA,MACZ,iBAAgBE,EAAAA,MAAA6Q,EAAA,EAChB,OAAQ/Q,EAAA,SAAA,yEAGbC,EAAAA,YA0GSC,EAAAA,MAAAkX,EAAAA,KAAA,EAAA,OA1GO,KAAMpX,EAAA,cAAa,GAAQE,EAAAA,MAAAsQ,EAAA,CAAA,qBACzC,IAwDM,CAxDKxQ,EAAA,eAAiBA,EAAA,UAAU,QAAtCM,EAAAA,YAAAC,EAAAA,mBAwDM,MAxDNwB,GAwDM,CAvDJD,EAAAA,mBAcM,MAdNG,GAcM,CAbJ6K,cAYe5M,EAAAA,MAAAoX,EAAAA,UAAA,EAAA,CAZD,cAAY,MAAM,MAAM,cAAA,qBAC1B,IAAgD,EAA1DhX,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAUWC,EAAAA,2BAVmB+U,GAAA,MAAiB,WAAU,CAAvCxL,EAAIwN,wDAA2CxN,EAAG,KAAOwN,CAAA,GAEjE/Q,EAAgBuD,EAAG,eAAe,GAD1CzJ,EAAAA,UAAA,EAAAL,EAAAA,YAQYC,EAAAA,kBARZG,aAQY,mBANFiU,EAAcvK,CAAE,EAAA,CACvB,KAAMsK,EAAYtK,EAAG,IAAI,EACzB,SAAQ,OAASA,EAAG,UAAQ,WAAkBA,EAAG,SAAA,GAAQ,GAAcA,EAAG,UAAQ,GAClF,QAAK,IAAA,OAAQ,OAAAA,EAAG,MAAM/J,EAAA,MAAOwU,EAAA,OAAM3V,EAAAmV,EAAA,QAAA,YAAAnV,EAAiB,mBAAmB,EAAA,sBAExE,IAAa,CAAVwD,EAAAA,gBAAAL,EAAAA,gBAAA+H,EAAG,IAAI,EAAA,CAAA,CAAA,gGAKlBjI,EAAAA,mBAuCM,MAvCNI,GAuCM,CAtCJ4K,cAqCe5M,EAAAA,MAAAoX,EAAAA,UAAA,EAAA,CArCD,cAAY,MAAM,MAAM,cAAA,qBAC1B,IAAiD,EAA3DhX,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAUWC,EAAAA,2BAVmB+U,GAAA,MAAiB,YAAW,CAAxCxL,EAAIwN,wDAA4CxN,EAAG,KAAOwN,CAAA,GAElE/Q,EAAgBuD,EAAG,eAAe,GAD1CzJ,EAAAA,UAAA,EAAAL,EAAAA,YAQYC,EAAAA,kBARZG,aAQY,mBANFiU,EAAcvK,CAAE,EAAA,CACvB,KAAMsK,EAAYtK,EAAG,IAAI,EACzB,SAAQ,OAASA,EAAG,UAAQ,WAAkBA,EAAG,SAAA,GAAQ,GAAcA,EAAG,UAAQ,GAClF,QAAK,IAAQ0L,GAAS1L,CAAE,CAAA,sBAEzB,IAAa,CAAV1H,EAAAA,gBAAAL,EAAAA,gBAAA+H,EAAG,IAAI,EAAA,CAAA,CAAA,sFAIN7J,EAAAA,MAAAoQ,CAAA,iBADRrQ,EAAAA,YASYC,EAAAA,MAAA6I,EAAAA,QAAA,EAAA,OAPV,KAAA,GACA,KAAK,UACJ,KAAMsL,EAAYnU,EAAAA,MAAAsP,CAAA,EAAM,YAAA,SAAA,EACzB,MAAA,CAAA,eAAA,IAAA,OAAA,MAAA,EACC,QAAOtP,EAAAA,MAAAoV,EAAA,CAAA,qBAER,IAA0B,qCAAvBpV,QAAAsP,CAAA,EAAM,KAAA,IAAA,EAAA,CAAA,CAAA,2DAEiCtP,EAAAA,MAAA0P,CAAA,iBAA5C3P,EAAAA,YAccC,EAAAA,MAAAsX,EAAAA,UAAA,EAAA,OAdD,UAAU,cAAA,GAOV,mBACT,IAImB,CAJnB1K,EAAAA,YAImB5M,EAAAA,MAAAuX,gBAAA,EAAA,KAAA,mBAHjB,IAAsE,CAAtE3K,EAAAA,YAAsE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAAnD,QAAOpB,IAAkB,mBAAE,IAAK,CAAA,GAAA1J,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAL,QAAK,EAAA,CAAA,WACnDE,EAAAA,YAAyE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAAtD,QAAOjB,IAAqB,mBAAE,IAAK,CAAA,GAAA7J,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAL,QAAK,EAAA,CAAA,WACtDE,EAAAA,YAAkE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAA/C,QAAOxB,IAAa,mBAAE,IAAM,CAAA,GAAAtJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAN,SAAM,EAAA,CAAA,uCAVnD,IAKE,CALFE,cAKE5M,EAAAA,MAAA6I,EAAAA,QAAA,EAAA,CAJA,KAAA,GACA,KAAK,UACL,MAAA,CAAA,cAAA,MAAA,eAAA,MAAA,QAAA,MAAA,EACC,KAAMsL,EAAW,OAAA,CAAA,kGAcnBrU,EAAA,eAAiBA,EAAA,UAAU,sBADpCC,EAAAA,YA+CeC,QAAAoX,EAAAA,UAAA,EAAA,OA7CZ,MAAO,IACP,cAAavC,EAAA,MAAU,cAAgBA,EAAA,MAAU,cAAgBA,EAAA,MAAU,WAC3E,MAAKtI,EAAAA,eAAA,CAAA,CAAA,aAAkBzM,EAAA,cAAa,GAAUE,EAAAA,MAAAsQ,EAAA,QACzC,cAAc,CAAA,CAAA,qBAEpB,IAuCM,CAvCN1O,EAAAA,mBAuCM,MAAA,CAvCD,MAAM,gBAAiB,qCAAuB5B,EAAAA,MAAAsQ,EAAA,IAAa,GAAA,QAAA,MAAA,CAAA,CAAA,GAC9CxQ,EAAA,UAAU,QACxBM,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAUWC,EAAAA,SAAA,CAAA,IAAA,GAAA2B,aAVmBnC,EAAA,UAAS,CAArB+J,EAAIwN,wDAAyBxN,EAAG,KAAOwN,CAAA,GAE/C/Q,EAAgBuD,EAAG,eAAe,GAD1CzJ,EAAAA,UAAA,EAAAL,EAAAA,YAQYC,EAAAA,kBARZG,aAQY,mBANFiU,EAAcvK,CAAE,EAAA,CACvB,KAAMsK,EAAYtK,EAAG,IAAI,EACzB,SAAQ,OAASA,EAAG,UAAQ,WAAkBA,EAAG,SAAA,GAAQ,GAAcA,EAAG,UAAQ,GAClF,QAAK,IAAA,OAAQ,OAAAA,GAAA,YAAAA,EAAI,MAAM/J,EAAA,MAAOwU,EAAA,OAAM3V,EAAAmV,EAAA,QAAA,YAAAnV,EAAiB,qBAAmB,sBAEzE,IAAa,CAAVwD,EAAAA,gBAAAL,EAAAA,gBAAA+H,EAAG,IAAI,EAAA,CAAA,CAAA,kHAKR7J,EAAAA,MAAAoQ,CAAA,iBADRrQ,EAAAA,YASYC,EAAAA,MAAA6I,EAAAA,QAAA,EAAA,OAPV,KAAK,UACL,KAAA,GACC,KAAMsL,EAAYnU,EAAAA,MAAAsP,CAAA,EAAM,YAAA,SAAA,EACzB,MAAA,CAAA,eAAA,IAAA,OAAA,MAAA,EACC,QAAOtP,EAAAA,MAAAoV,EAAA,CAAA,qBAER,IAA0B,qCAAvBpV,QAAAsP,CAAA,EAAM,KAAA,IAAA,EAAA,CAAA,CAAA,2DAEiCtP,EAAAA,MAAA0P,CAAA,iBAA5C3P,EAAAA,YAccC,EAAAA,MAAAsX,EAAAA,UAAA,EAAA,OAdD,UAAU,cAAA,GAOV,mBACT,IAImB,CAJnB1K,EAAAA,YAImB5M,EAAAA,MAAAuX,gBAAA,EAAA,KAAA,mBAHjB,IAAsE,CAAtE3K,EAAAA,YAAsE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAAnD,QAAOpB,IAAkB,mBAAE,IAAK,CAAA,GAAA1J,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAL,QAAK,EAAA,CAAA,WACnDE,EAAAA,YAAyE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAAtD,QAAOjB,IAAqB,mBAAE,IAAK,CAAA,GAAA7J,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAL,QAAK,EAAA,CAAA,WACtDE,EAAAA,YAAkE5M,EAAAA,MAAAwX,EAAAA,cAAA,EAAA,CAA/C,QAAOxB,IAAa,mBAAE,IAAM,CAAA,GAAAtJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAN,SAAM,EAAA,CAAA,uCAVnD,IAKE,CALFE,cAKE5M,EAAAA,MAAA6I,EAAAA,QAAA,EAAA,CAJA,KAAA,GACA,KAAK,UACL,MAAA,CAAA,cAAA,MAAA,eAAA,MAAA,QAAA,MAAA,EACC,KAAMsL,EAAW,OAAA,CAAA,4NC1HtCsD,EAAO,QAAU,SAAUzK,EAAU,CACnCA,EAAI,UAAUyK,EAAO,KAAMA,CAAM,CACnC,EAEAA,EAAO,SAAW,GAClBA,EAAO,OAAS,CACd,QAAQzK,EAAUvN,EAAe,GAAI,CACnCuN,EAAI,QAAQ,cAAe,CACzB,GAAGvN,EAAQ,QACX,UAAW,IAAMsT,GAAA,CAAU,CAC5B,EACD/F,EAAI,UAAUyK,EAAO,KAAM,CAAE,GAAGA,EAAQ,QAAS,CAAE,GAAGA,EAAO,QAAS,GAAIhY,EAAQ,SAAW,CAAA,EAAK,UAAW,IAAMsT,GAAA,CAAU,EAAK,CACpI,CACF,khBCwEA,MAAM3V,EAAQ0C,EAkBRgG,EAAOC,EAMPC,EAAQC,EAAAA,SAAA,EAERnI,EAAWsI,EAAAA,mBAAA,EACXsR,EAAQrO,EAAAA,SAAA,EAERsO,EAAW,OAAO,YAAY,OAAO,QAAQzD,EAAmB,EAAE,IAAI,CAAC,CAACrP,CAAG,IAAM,CAACA,EAAKqP,GAAoBrP,CAAG,CAAC,CAAC,CAAC,EAEjH+S,EAAiBjV,EAAAA,IAAI,IAAI,EACzBkV,EAAuBva,EAAAA,SAA8B,EAAE,EACvDwa,EAAenV,EAAAA,IAAI,EAAK,EACxBoV,EAAiBja,EACjBoI,EAASvD,EAAAA,IAAInE,EAAI,EAEjBI,EAASC,EAAAA,OAAgC,UAAW,EAAE,EAEtDyH,EAAmBtF,GAA6B,CACpD,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMuF,EAAK3H,EAAO,WAClB,OAAO,OAAO2H,GAAO,WAAcA,EAA8BvF,CAAM,EAAI,EAC7E,EAEMmF,EAAiBtH,EAAAA,OAAO,WAAY,IAAI,EAC1CsH,IACFD,EAAO,MAAQC,GAGjBiG,UAAQ,WAAYlG,EAAO,KAAK,EAEhC,MAAMiO,EAAetP,GACZA,EAAM8S,EAAS9S,CAAG,GAAKA,EAAM,OAGhCuP,EAAiBvK,GAAkB,CACvC,KAAM,CAAE,KAAAwK,EAAM,GAAG1G,CAAA,EAAQ9D,EACzB,OAAO8D,CACT,EAEMqK,EAAkB,IAAM,CAC5B,WAAW,IAAM,CACXF,EAAa,QACfA,EAAa,MAAQ,GAEzB,EAAG,GAAG,CACR,EAEMG,EAAmB,IAAM,CACzBP,GAAA,MAAAA,EAAO,aACXI,EAAa,MAAQ,CAACA,EAAa,MACrC,EAEMI,EAAc,IAAM,CACxBpS,EAAK,SAAU,EAAK,EACpBkS,EAAA,CACF,EAMMG,EAAc,IAAM,CACxBrS,EAAK,SAAU,EAAK,EACpBkS,EAAA,CACF,EAEMI,EAAgB9W,EAAAA,SAAS,IAAM,CACnC,KAAM,CAAE,GAAG4H,CAAA,EAASwO,EACpB,OAAOxO,CACT,CAAC,EAEKmP,EAAgB/W,EAAAA,SAAS,IACxBwW,EAAa,MAIX,aAHD1a,EAAM,UAAkB,eACrB,YAGV,EAEKkb,EAAsB,IAAM,CAChC,MAAMC,EAAQ,OAAO,YACrB,OAAO,KAAK,IAAIA,EAAQ,IAAK,GAAG,CAClC,EAEMC,EAAmBlX,EAAAA,SAAS,IAAM,CACtC,MAAMiX,EAAQD,EAAA,EACd,OAAKR,EAAa,MAMX,CAAE,OAAQS,EAAQ,IAAA,EALnBnb,EAAM,UACD,CAAE,UAAW,OAAOA,EAAM,WAAc,SAAW,GAAGA,EAAM,SAAS,KAAOA,EAAM,SAAA,EAEpF,CAAE,UAAWmb,EAAQ,IAAA,CAGhC,CAAC,EAEKE,EAAgBnX,EAAAA,SAAS,CAC7B,IAAK,IAAMlE,EAAM,SAAW,GAC5B,IAAMM,GAAQ,CACZoI,EAAK,iBAAkBpI,CAAG,EACrBA,IACHoI,EAAK,SAAUpI,CAAG,EAClBsa,EAAA,EAEJ,CAAA,CACD,EAEKU,EAA0BpX,EAAAA,SAAS,KAAO,CAC9C,eAAgBuW,EAAqB,WACrC,qBAAAA,EACA,eAAAD,EACA,eAAAG,EACA,QAAS,IAAMF,CAAA,EACf,EAEFzL,OAAAA,UAAQ,mBAAqB3N,GAAW,CACtCmZ,EAAe,MAAQnZ,CACzB,CAAC,EAEGX,IACFA,EAAS,QAAU,CACjB,OAAQoa,CAAA,iBArOV,OAAA9X,YAAA,EAAAC,qBAyEM,MAzENsB,GAyEM,CAxEJiL,EAAAA,YAuEY5M,EAAAA,kBAvEZG,aAuEY,CAtET,mBAAqBkY,EAAA,KAAa,CAAA,EAC3BD,EAAA,MAAa,YACZK,EAAA,2CAAAA,EAAa,MAAA3L,GACrB,UAAW1P,EAAM,YACjB,MAAOA,EAAM,MACb,aAAY,GACZ,QAAO+a,EACP,aAAYxZ,EAAAyZ,EAAA,QAAA,YAAAzZ,EAAe,aAAcmZ,EAAA,KAAA,kBAE/B,iBACT,IAEW,CAFK1a,EAAM,4BACpB2C,EAAAA,YAA8E4Y,GAAA,OAAlE,OAAQvb,EAAM,aAAe,SAAUsb,EAAA,KAAA,gDAErDrY,EAAAA,mBAWWC,EAAAA,SAAA,CAAA,IAAA,GAAA,CAVTsB,EAAAA,mBAEM,MAAA,KAAA,CADJA,EAAAA,mBAAmD,OAAnDC,GAAmDC,EAAAA,gBAArB1E,EAAM,KAAK,EAAA,CAAA,CAAA,GAE3CwE,EAAAA,mBAMM,MANNG,GAMM,kBALJ6K,EAAAA,YAGU5M,QAAA4Y,EAAAA,MAAA,EAAA,CAHA,QAAOX,GAAgB,mBAC/B,IAAmC,CAAhBH,EAAA,qBACnB/X,cAAuBC,EAAAA,MAAA6Y,GAAAA,YAAA,EAAA,CAAA,IAAA,EAAA,kBADvB9Y,EAAAA,YAAmCC,QAAA8Y,GAAAA,UAAA,EAAA,CAAA,IAAA,EAAA,EACZ,cAFmB,CAAA3B,EAAAA,MAAA,CAAA/Z,EAAM,aAAa,CAAA,GAI/DwP,EAAAA,YAAiD5M,EAAAA,MAAA4Y,EAAAA,MAAA,EAAA,CAAvC,QAAOV,GAAW,mBAAE,IAAS,CAATtL,EAAAA,YAAS5M,EAAAA,MAAA+Y,QAAA,CAAA,CAAA,qCAK7C,IAUM,CAVNnX,EAAAA,mBAUM,MAAA,CAVD,MAAM,sBAAuB,uBAAO4W,EAAA,KAAgB,CAAA,GACvCpb,EAAM,QAAM,OAAWA,EAAM,QAAM,0BACjD2C,EAAAA,YAME4Y,GAAA,OALC,KAAMd,EACN,SAAUa,EAAA,MACV,OAAQtb,EAAM,OACd,WAAU,CAAA,QAAI4C,QAAA+M,CAAA,EAAO,OAAE/M,EAAAA,MAAAyX,CAAA,CAAA,EACvB,OAAQvR,EAAA,KAAA,sGAKUlG,EAAAA,MAAA0X,CAAA,EAAM,4BAApB,sBACT,IA2BO,CA3BM1R,EAAM,OA4BnBrF,EAAAA,WAA6BC,EAAA,OAAA,SAAA,CAAA,IAAA,GAAA,OAAA,EAAA,GA5B7BR,EAAAA,YAAAC,EAAAA,mBA2BO,OA3BP2B,GA2BO,CA1BW5E,EAAM,cAAY,OAAWA,EAAM,cAAY,0BAC7D2C,EAAAA,YAA8E4Y,GAAA,OAAlE,OAAQvb,EAAM,aAAe,SAAUsb,EAAA,KAAA,iCAEhCtb,EAAM,WAAaA,EAAM,UAAU,QACtDgD,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAoBWC,WAAA,CAAA,IAAA,CAAA,EAAA2B,EAAAA,WApBmBnC,EAAA,UAAS,CAArB+J,EAAIwN,yDAAyBxN,EAAG,KAAOwN,EAAA,GAE/C/Q,EAAgBuD,EAAG,eAAe,GAD1CzJ,EAAAA,UAAA,EAAAL,EAAAA,YAkBYC,EAAAA,kBAlBZG,aAkBY,OAhBV,KAAK,OAAA,EACG,CAAA,QAAA,IAAAiU,EAAcvK,CAAE,EAAA,CACvB,KAAMsK,EAAYtK,EAAG,IAAI,EACzB,SAAQ,OAASA,EAAG,UAAQ,WAAkBA,EAAG,SAAA,EAAaA,EAAG,UAAQ,GACzE,QAAK,IAAA,QAA6BlL,EAAAkL,EAAG,QAAH,MAAAlL,EAAA,KAAAkL,EAAWgO,EAAqB,WAAU,OAAgCK,UAA4C/Z,IAA+CA,GAAa0Z,EAAqB1Z,EAAI,GAAA,KAAwC0Z,iBAAkE7X,EAAAA,MAAA+X,CAAA,CAAA,yBAWxV,IAAa,CAAV5V,EAAAA,gBAAAL,EAAAA,gBAAA+H,EAAG,IAAI,EAAA,CAAA,CAAA,oHAKW,qHCrErCmJ,GAAS,QAAU,SAAUhG,EAAU,CACrCA,EAAI,UAAUgG,GAAS,KAAMA,EAAQ,CACvC,gRC8BA,MAAM5V,EAAQ0C,EAWRgG,EAAOC,EAWPf,EAAWrC,EAAAA,IAAS,IAAI,EACxB8S,EAAU9S,EAAAA,IAAS,IAAI,EACvB8D,EAAY9D,EAAAA,IAA+B,EAAE,EAE7CqW,EAAa1b,EAAAA,SAAkC,EAAE,EAEvDqJ,EAAAA,MACE,IAAMvJ,EAAM,OAAO,UAClB6b,GAAU,CACLA,GACFA,EAAM,QAAS1Y,GAAS,CAClBA,EAAK,MAAQ,EAAEA,EAAK,QAAQyY,KAC9BA,EAAWzY,EAAK,IAAI,EAAI,GAE5B,CAAC,CAEL,EACA,CAAE,UAAW,EAAA,CAAK,EAGpB,MAAM2Y,EAAkBvW,EAAAA,IAAI,CAC1B,QAAS,EACT,SAAU,GACV,MAAO,EACP,GAAIvF,EAAM,OAAO,YAAc,CAAA,CAAC,CACjC,EAEK+b,EAAU7X,WAAuB,IAAMlE,EAAM,OAAO,SAAW,CAAC,MAAO,OAAQ,QAAQ,CAAC,EAExFgc,EAAkB9X,EAAAA,SAAsB,IAAM,CAClD,GAAIlE,EAAM,OAAO,UAAW,OAAOA,EAAM,OAAO,UAEhD,MAAMic,EAAoB,CACxB,CAAE,KAAM,KAAM,KAAM,UAAW,IAAK,QAAS,aAAc,EAAA,EAC3D,CAAE,KAAM,KAAM,IAAK,OAAQ,aAAc,EAAA,CAAK,EAEhD,OAAIF,EAAQ,MAAM,SAAS,KAAK,GAC9BE,EAAK,KAAK,CACR,KAAM,KACN,KAAM,UACN,IAAK,MACL,KAAM,OACN,MAAO,IAAMC,EAAA,CAAU,CACxB,EAECH,EAAQ,MAAM,SAAS,QAAQ,GACjCE,EAAK,KAAK,CACR,KAAM,KACN,IAAK,SACL,KAAM,WACN,MAAO,IAAMvT,EAAK,SAAU,CAAE,GAAGkT,EAAY,CAAA,CAC9C,EAEIK,CACT,CAAC,EAEKE,EAAgBjY,EAAAA,SAAwB,IAAM,CAClD,MAAM9B,EAAO,CAAC,GAAIpC,EAAM,OAAO,SAAW,CAAA,CAAG,EAG7C,GAAI,CADiBoC,EAAK,KAAMga,GAAMA,EAAE,OAAS,UAAYA,EAAE,IAAI,GAC9CL,EAAQ,MAAM,KAAMM,GAAM,CAAC,OAAQ,SAAU,MAAM,EAAE,SAASA,CAAC,CAAC,EAAG,CACtF,MAAMC,EAAoB,CAAA,EACtBP,EAAQ,MAAM,SAAS,MAAM,GAC/BO,EAAW,KAAK,CAAE,KAAM,KAAM,KAAM,UAAW,WAAa3a,GAAa4a,EAAW5a,CAAG,CAAA,CAAG,EAExFoa,EAAQ,MAAM,SAAS,MAAM,GAC/BO,EAAW,KAAK,CAAE,KAAM,KAAM,KAAM,UAAW,WAAa3a,GAAa6a,EAAW7a,CAAG,CAAA,CAAG,EAExFoa,EAAQ,MAAM,SAAS,QAAQ,GACjCO,EAAW,KAAK,CAAE,KAAM,KAAM,KAAM,SAAU,WAAa3a,GAAa8a,EAAa9a,CAAG,CAAA,CAAG,EAE7FS,EAAK,KAAK,CACR,KAAM,SACN,MAAO,KACP,MAAOka,EAAW,OAAS,GAAK,GAChC,MAAO,QACP,KAAMA,CAAA,CACP,CACH,CACA,OAAOla,CACT,CAAC,EAEKiU,EAAgBnS,EAAAA,SAAS,IAAM,CACnC,MAAMwY,EAAgC,CACpC,OAAQ,GACR,UAAW1c,EAAM,SACjB,GAAIA,EAAM,OAAO,cAAgB,CAAA,CAAC,EAEpC,OAAIA,EAAM,cACR0c,EAAK,YAAc1c,EAAM,aAEX0c,EAAK,aAAe,OAAOA,EAAK,aAAgB,YACjD,CAACA,EAAK,WAAa,CAACA,EAAK,YACtCA,EAAK,UAAY,CAAE,IAAK,aAAc,OAAQ,KAAA,GAEzCA,CACT,CAAC,EAED,SAASR,GAAY,QACf3a,EAAAvB,EAAM,OAAO,kBAAb,MAAAuB,EAA8B,QAChCob,EAAe,KAAM,EAAE,EAEzBjU,EAAK,KAAK,CACZ,CAEA,SAAS8T,EAAW7a,EAA8B,QAC5CJ,EAAAvB,EAAM,OAAO,kBAAb,MAAAuB,EAA8B,QAChCob,EAAe,KAAM,CAAE,GAAGhb,EAAK,EAEjC+G,EAAK,OAAQ/G,CAAG,CAClB,CAEA,SAAS8a,EAAa9a,EAA8B,CAClD+G,EAAK,SAAU/G,CAAG,CACpB,CAEA,SAAS4a,EAAW5a,EAA8B,CAChD+G,EAAK,OAAQ/G,CAAG,CAClB,CAEA,SAASgb,EAAeC,EAAejb,EAA8B,SACnE,MAAMkb,EAASlH,GAAA,EACTnI,EAAWtN,EAAAA,SAAkC,EAAE,GAErDqB,EAAAvB,EAAM,OAAO,kBAAb,MAAAuB,EAA8B,QAAS4B,GAAS,CAC1CA,EAAK,OACPqK,EAASrK,EAAK,IAAI,EAAIxB,EAAIwB,EAAK,IAAI,GAAK,GAE5C,GAEA,MAAM2Z,IAAc/W,EAAA/F,EAAM,OAAO,gBAAb,YAAA+F,EAA4B,QAAS,QAEzD8W,EAAO,CACL,MAAAD,EACA,MAAOE,EACP,GAAI9c,EAAM,OAAO,eAAiB,CAAA,EAClC,OAAQ,CAACkB,EAAQ,CAAE,YAAA6b,KACV7b,EAAEmZ,EAAQ,CACf,IAAMrZ,GAAYA,GAAM+b,EAAY,aAAc/b,CAAE,EACpD,MAAOwM,EACP,aAAcxN,EAAM,OAAO,gBAC3B,gBAAiB,CACf,YAAa,CAAE,OAAQ,EAAA,EACvB,aAAc,CAAE,YAAa,EAAA,CAAK,CACpC,CACD,EAEH,UAAW,CACT,CACE,KAAM,KACN,MAAO,CAAC+S,EAAQ,CAAE,MAAA8C,CAAA,IAAiBA,EAAA,CAAM,EAE3C,CACE,KAAM,KACN,KAAM,UACN,MAAO,MAAO9C,EAAQ,CAAE,MAAA8C,EAAO,QAAAmH,KAAmB,CAChD,MAAMC,EAAaD,EAAQ,YAAY,EACnCC,GAAA,MAAAA,EAAY,UACd,MAAMA,EAAW,SAAA,EAEnBvU,EAAK,YAAakU,IAAU,KAAO,cAAgB,eAAgBpP,CAAQ,EAC3EqI,EAAA,EACAqH,EAAA,CACF,CAAA,CACF,CACF,CACD,CACH,CAEA,SAASA,GAAU,UACjBnX,GAAAxE,EAAAqG,EAAS,QAAT,YAAArG,EAAgB,sBAAhB,MAAAwE,EAAA,KAAAxE,EACF,CAEA,SAAS4b,GAA6C,SACpD,QAAOpX,GAAAxE,EAAAqG,EAAS,QAAT,YAAArG,EAAgB,mBAAhB,YAAAwE,EAAA,KAAAxE,KAAwC,CAAA,CACjD,CAEA,OAAA2N,EAAa,CACX,QAAAgO,EACA,gBAAAC,EACA,SAAAvV,EACA,QAAAyQ,EACA,WAAAuD,CAAA,CACD,UA9OC5Y,YAAA,EAAAC,qBAoBM,MApBNsB,GAoBM,CAnBJiL,EAAAA,YAkBWG,EAlBX5M,aAkBW,SAjBL,WAAJ,IAAI6E,EACH,QAASuU,EAAA,MACT,QAAS9F,EAAA,MACF,cAAahN,EAAA,2CAAAA,EAAS,MAAAqG,GACtB,WAAYoM,EAAA,2CAAAA,EAAe,MAAApM,EAAA,EAC3B0N,EAAAA,MAAM,EAAAha,cAAA,mBAEd,IAME,CALMV,EAAA,OAAO,WAAaA,SAAO,UAAU,sBAD7CC,EAAAA,YAME0X,EAAA,eAJI,UAAJ,IAAIhC,EACH,MAAOuD,EACP,iBAAgBlZ,EAAA,OAAO,UACvB,aAAYsZ,EAAA,KAAA,oGAEeqB,EAAAA,OAAM,CAAlBtK,EAAGhS,aACnB,GAAAsC,EAAAA,QAD6Cia,GAAQ,CACrD/Z,EAAAA,WAA6CC,EAAA,OAAhCzC,EAAI+B,EAAAA,eAAAya,qBAAUD,GAAQ,CAAA,CAAA,CAAA,EAAA,OAAA,EAAA,CAAA,wGChB3CE,GAAW,QAAU,SAAU5N,EAAU,CACvCA,EAAI,UAAU4N,GAAW,KAAMA,EAAU,CAC3C,gHCMA,MAAMxd,EAAQ0C,EAKR+a,EAAavZ,EAAAA,SAAS,IAAMwZ,EAAY1d,EAAM,SAAS,CAAC,EACxD2d,EAAWzZ,EAAAA,SAAS,IAAM,SAASlE,EAAM,SAAS,EAAE,EACpD4d,EAAW1Z,EAAAA,SAAS,IACpBlE,EAAM,UACD,YAAcA,EAAM,UAEtB,UACR,EACK6d,EAAoB3Z,EAAAA,SAAS,KAC1B,CACL,KAAM,OAAOlE,EAAM,SAAS,sBAC5B,eAAgB,OAAOA,EAAM,SAAS,qBAAA,EAEzC,EAEK0d,EAAe5N,GACZ,+BAA+B,KAAKA,CAAI,eA9BpC2N,EAAA,qBAAXxa,EAAAA,mBAAuF,MAAA,OAA/D,uBAAO4a,EAAA,KAAiB,EAAE,MAAM,4BAAA,0BACxD5a,EAAAA,mBAEM,MAAA,OAFO,uBAAO2a,EAAA,KAAQ,EAAE,cAAY,MAAA,GACxCpZ,qBAA8B,MAAA,CAAxB,aAAYmZ,EAAA,OAAQ,KAAA,EAAApZ,EAAA,CAAA,4CCD9BuZ,GAAQ,QAAU,SAAUlO,EAAU,CACpCA,EAAI,UAAUkO,GAAQ,KAAMA,EAAO,CACrC,ECKA,MAAMC,GAAa,CAACnI,GAAUyE,EAAQ1K,EAAS6N,GAAYM,EAAO,EAG5DE,GAAU,CAACpO,EAAUvN,EAAmC,KAAO,CACnE0b,GAAW,QAASE,GAAc,CAC5BA,EAAU,MACZrO,EAAI,UAAUqO,EAAU,KAAMA,CAAS,CAE3C,CAAC,EAEG5b,EAAQ,mBAAqB,KAC/BuN,EAAI,OAAO,iBAAiB,WAAa+F,GAEzCoI,GAAW,QAASE,GAAmB,CACjCA,EAAU,UAAYA,EAAU,QAClCrO,EAAI,IAAIqO,EAAU,OAAQ5b,EAAQ4b,EAAU,IAAI,GAAK,EAAE,CAE3D,CAAC,GAGHrO,EAAI,QAAQ,UAAW,CACrB,UAAA+F,GACA,GAAGtT,CAAA,CACJ,CACH,EA8BAT,GAAe,CACb,QAAAsc,GACA,QAAAF,EACF","x_google_ignoreList":[0]}