workdesktop-ai 1.1.1 → 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.
Files changed (174) hide show
  1. package/CHANGELOG.md +43 -6
  2. package/README.md +26 -13
  3. package/dist/api-button/index.mjs +1 -1
  4. package/dist/auto-complete/index.mjs +1 -1
  5. package/dist/base.css +1 -1
  6. package/dist/checkbox-list/index.mjs +1 -1
  7. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs} +2 -2
  8. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map} +1 -1
  9. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs → AutoComplete-C6Nxatvt.mjs} +2 -2
  10. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs.map → AutoComplete-C6Nxatvt.mjs.map} +1 -1
  11. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs → CheckboxList-5AEx33r5.mjs} +2 -2
  12. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs.map → CheckboxList-5AEx33r5.mjs.map} +1 -1
  13. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs} +2 -2
  14. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map} +1 -1
  15. package/dist/chunks/{DataForm-C5MBVdei.mjs → DataForm-C6VLTSOm.mjs} +16 -16
  16. package/dist/chunks/{DataForm-C5MBVdei.mjs.map → DataForm-C6VLTSOm.mjs.map} +1 -1
  17. package/dist/chunks/{DataGrid-HUzKWuQx.mjs → DataGrid-Dd7n5JM7.mjs} +4 -4
  18. package/dist/chunks/{DataGrid-HUzKWuQx.mjs.map → DataGrid-Dd7n5JM7.mjs.map} +1 -1
  19. package/dist/chunks/{EditableGrid-C8A-nJZv.mjs → EditableGrid-CDeeVkaX.mjs} +330 -333
  20. package/dist/chunks/EditableGrid-CDeeVkaX.mjs.map +1 -0
  21. package/dist/chunks/{ImageUpload-DGehzaYa.mjs → ImageUpload-CQA9XQ7Q.mjs} +2 -2
  22. package/dist/chunks/{ImageUpload-DGehzaYa.mjs.map → ImageUpload-CQA9XQ7Q.mjs.map} +1 -1
  23. package/dist/chunks/{Panel-CrRqBTj6.mjs → Panel-BHqAeBaH.mjs} +8 -8
  24. package/dist/chunks/Panel-BHqAeBaH.mjs.map +1 -0
  25. package/dist/chunks/Path-C_oyo6Dg.mjs +200 -0
  26. package/dist/chunks/Path-C_oyo6Dg.mjs.map +1 -0
  27. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs} +2 -2
  28. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map} +1 -1
  29. package/dist/chunks/{RadioList-vE8JOuST.mjs → RadioList-BUWcP_Pk.mjs} +2 -2
  30. package/dist/chunks/{RadioList-vE8JOuST.mjs.map → RadioList-BUWcP_Pk.mjs.map} +1 -1
  31. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs} +2 -2
  32. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map} +1 -1
  33. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs → SearchPanel-DPlWWuXb.mjs} +2 -2
  34. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs.map → SearchPanel-DPlWWuXb.mjs.map} +1 -1
  35. package/dist/chunks/{Select-DAGZDXvI.mjs → Select-uvFy7_NU.mjs} +2 -2
  36. package/dist/chunks/{Select-DAGZDXvI.mjs.map → Select-uvFy7_NU.mjs.map} +1 -1
  37. package/dist/chunks/Station-DLV19USa.mjs +780 -0
  38. package/dist/chunks/Station-DLV19USa.mjs.map +1 -0
  39. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs} +2 -2
  40. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs.map} +1 -1
  41. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs} +2 -2
  42. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map} +1 -1
  43. package/dist/chunks/{Viewer-iub6TjoD.mjs → Viewer-CjLSQTrw.mjs} +2 -2
  44. package/dist/chunks/{Viewer-iub6TjoD.mjs.map → Viewer-CjLSQTrw.mjs.map} +1 -1
  45. package/dist/chunks/http-C06mNpwY.mjs +4141 -0
  46. package/dist/chunks/http-C06mNpwY.mjs.map +1 -0
  47. package/dist/chunks/station-linkage-D54-_iyL.mjs +77 -0
  48. package/dist/chunks/station-linkage-D54-_iyL.mjs.map +1 -0
  49. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs → useApiAction-DxVQWWxv.mjs} +2 -2
  50. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs.map → useApiAction-DxVQWWxv.mjs.map} +1 -1
  51. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs → useColumnSettings-BwG2V9xp.mjs} +2 -2
  52. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs.map → useColumnSettings-BwG2V9xp.mjs.map} +1 -1
  53. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs → useOptionsLoader-DEVCYhrp.mjs} +2 -2
  54. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs.map → useOptionsLoader-DEVCYhrp.mjs.map} +1 -1
  55. package/dist/confirm-button/index.mjs +1 -1
  56. package/dist/data-form/index.mjs +1 -1
  57. package/dist/data-form/style.css +1 -1
  58. package/dist/data-grid/index.mjs +1 -1
  59. package/dist/data-grid/style.css +1 -1
  60. package/dist/editable-grid/index.mjs +1 -1
  61. package/dist/editable-grid/style.css +1 -1
  62. package/dist/image-upload/index.mjs +1 -1
  63. package/dist/index.esm.js +133 -124
  64. package/dist/index.esm.js.map +1 -1
  65. package/dist/index.umd.js +705 -15
  66. package/dist/index.umd.js.map +1 -1
  67. package/dist/panel/index.mjs +1 -1
  68. package/dist/panel/style.css +1 -1
  69. package/dist/path/index.mjs +7 -0
  70. package/dist/path/index.mjs.map +1 -0
  71. package/dist/path/style.css +1 -0
  72. package/dist/prompt-button/index.mjs +1 -1
  73. package/dist/radio-list/index.mjs +1 -1
  74. package/dist/requester/index.mjs +1 -1
  75. package/dist/search-panel/index.mjs +1 -1
  76. package/dist/search-panel/style.css +1 -1
  77. package/dist/select/index.mjs +1 -1
  78. package/dist/station/index.mjs +1 -1
  79. package/dist/station/style.css +1 -1
  80. package/dist/style.css +1 -1
  81. package/dist/switch/index.mjs +1 -1
  82. package/dist/upload/index.mjs +1 -1
  83. package/dist/viewer/index.mjs +1 -1
  84. package/llms.txt +99 -9
  85. package/package.json +6 -1
  86. package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +0 -1
  87. package/dist/chunks/Panel-CrRqBTj6.mjs.map +0 -1
  88. package/dist/chunks/Station-BF_QlQ8c.mjs +0 -796
  89. package/dist/chunks/Station-BF_QlQ8c.mjs.map +0 -1
  90. package/dist/chunks/http-Bs-dM076.mjs +0 -2951
  91. package/dist/chunks/http-Bs-dM076.mjs.map +0 -1
  92. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +0 -134
  93. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +0 -169
  94. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +0 -167
  95. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +0 -186
  96. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +0 -317
  97. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +0 -180
  98. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +0 -122
  99. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +0 -66
  100. package/dist/types/src/components/buttons/useApiAction.d.ts +0 -20
  101. package/dist/types/src/components/common/props.d.ts +0 -122
  102. package/dist/types/src/components/containers/Drawer.vue.d.ts +0 -172
  103. package/dist/types/src/components/containers/Iframe.vue.d.ts +0 -81
  104. package/dist/types/src/components/containers/containerContext.d.ts +0 -15
  105. package/dist/types/src/components/containers/useContainerController.d.ts +0 -24
  106. package/dist/types/src/components/containers/useIframeContainer.d.ts +0 -20
  107. package/dist/types/src/components/core/Requester.vue.d.ts +0 -41
  108. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +0 -542
  109. package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +0 -62
  110. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +0 -586
  111. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +0 -187
  112. package/dist/types/src/components/form/FormItem.vue.d.ts +0 -62
  113. package/dist/types/src/components/form/SearchItem.vue.d.ts +0 -62
  114. package/dist/types/src/components/form/SearchPanel.vue.d.ts +0 -167
  115. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +0 -311
  116. package/dist/types/src/components/index.d.ts +0 -31
  117. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +0 -166
  118. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +0 -166
  119. package/dist/types/src/components/inputs/RadioList.vue.d.ts +0 -166
  120. package/dist/types/src/components/inputs/Select.vue.d.ts +0 -176
  121. package/dist/types/src/components/inputs/Switch.vue.d.ts +0 -116
  122. package/dist/types/src/components/inputs/useOptionsLoader.d.ts +0 -32
  123. package/dist/types/src/components/layout/Station.vue.d.ts +0 -302
  124. package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +0 -20
  125. package/dist/types/src/components/layout/types.d.ts +0 -54
  126. package/dist/types/src/components/styles/Panel.vue.d.ts +0 -94
  127. package/dist/types/src/components/styles/Tips.vue.d.ts +0 -60
  128. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +0 -176
  129. package/dist/types/src/components/upload/Upload.vue.d.ts +0 -235
  130. package/dist/types/src/entries/api-button.d.ts +0 -9
  131. package/dist/types/src/entries/auto-complete.d.ts +0 -9
  132. package/dist/types/src/entries/checkbox-list.d.ts +0 -9
  133. package/dist/types/src/entries/components-map.d.ts +0 -8
  134. package/dist/types/src/entries/confirm-button.d.ts +0 -9
  135. package/dist/types/src/entries/data-form.d.ts +0 -9
  136. package/dist/types/src/entries/data-grid.d.ts +0 -9
  137. package/dist/types/src/entries/dialog-button.d.ts +0 -9
  138. package/dist/types/src/entries/drawer-button.d.ts +0 -9
  139. package/dist/types/src/entries/drawer.d.ts +0 -9
  140. package/dist/types/src/entries/editable-grid.d.ts +0 -9
  141. package/dist/types/src/entries/form-item.d.ts +0 -9
  142. package/dist/types/src/entries/iframe.d.ts +0 -9
  143. package/dist/types/src/entries/image-upload.d.ts +0 -9
  144. package/dist/types/src/entries/panel.d.ts +0 -9
  145. package/dist/types/src/entries/prompt-button.d.ts +0 -9
  146. package/dist/types/src/entries/radio-list.d.ts +0 -9
  147. package/dist/types/src/entries/requester.d.ts +0 -9
  148. package/dist/types/src/entries/route-button.d.ts +0 -9
  149. package/dist/types/src/entries/search-item.d.ts +0 -9
  150. package/dist/types/src/entries/search-panel.d.ts +0 -9
  151. package/dist/types/src/entries/select.d.ts +0 -9
  152. package/dist/types/src/entries/station.d.ts +0 -9
  153. package/dist/types/src/entries/switch.d.ts +0 -9
  154. package/dist/types/src/entries/tips-button.d.ts +0 -9
  155. package/dist/types/src/entries/tips.d.ts +0 -9
  156. package/dist/types/src/entries/upload.d.ts +0 -9
  157. package/dist/types/src/entries/viewer.d.ts +0 -9
  158. package/dist/types/src/index.d.ts +0 -21
  159. package/dist/types/src/lib/composables/useConfig.d.ts +0 -19
  160. package/dist/types/src/lib/composables/useDataGrid.d.ts +0 -69
  161. package/dist/types/src/lib/composables/useEventBus.d.ts +0 -16
  162. package/dist/types/src/lib/composables/useGlobalState.d.ts +0 -5
  163. package/dist/types/src/lib/composables/useRequest.d.ts +0 -42
  164. package/dist/types/src/lib/configs/default-config.d.ts +0 -6
  165. package/dist/types/src/lib/core/config.d.ts +0 -28
  166. package/dist/types/src/lib/core/http.d.ts +0 -100
  167. package/dist/types/src/lib/core/linkage.d.ts +0 -48
  168. package/dist/types/src/lib/core/station-linkage.d.ts +0 -41
  169. package/dist/types/src/lib/core/theme.d.ts +0 -6
  170. package/dist/types/src/lib/core/utils.d.ts +0 -28
  171. package/dist/types/src/lib/install.d.ts +0 -11
  172. package/dist/types/src/types/config.d.ts +0 -126
  173. package/dist/types/src/types/index.d.ts +0 -4
  174. package/dist/types/vite.config.d.ts +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"DataForm-C5MBVdei.mjs","sources":["../../src/components/form/data-form/DataForm.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-data-form\">\r\n <el-form\r\n ref=\"formRef\"\r\n v-loading=\"loading\"\r\n :model=\"formModel\"\r\n :rules=\"rules\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n :inline=\"inline\"\r\n :disabled=\"loading\"\r\n v-bind=\"$attrs\"\r\n @submit.prevent\r\n >\r\n <slot :model=\"formModel\" :form=\"formRef\" />\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"withActions\" class=\"wd-data-form__footer\">\r\n <slot name=\"footer\" :submit=\"submitForm\" :reset=\"resetForm\" :loading=\"loading\">\r\n <!-- 关闭 / 保存并继续:仅在容器(drawer/dialog)或 iframe 内显示,独立使用时隐藏 -->\r\n <el-button v-if=\"inHost\" @click=\"onClose\">{{ closeText }}</el-button>\r\n <el-button v-if=\"actionConf.showReset\" @click=\"resetForm\">{{ actionConf.resetText }}</el-button>\r\n <el-button\r\n v-if=\"inHost && isCreate && keepFormButton && actionConf.showContinue\"\r\n :loading=\"loading\"\r\n @click=\"submitForm(true)\"\r\n >\r\n {{ actionConf.continueText }}\r\n </el-button>\r\n <el-button type=\"primary\" :loading=\"loading\" @click=\"submitForm(false)\">\r\n {{ actionConf.submitText }}\r\n </el-button>\r\n </slot>\r\n </div>\r\n </el-form>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, onMounted, onBeforeUnmount, watch, provide, inject, getCurrentInstance, type PropType } from 'vue'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../../lib/core/http'\r\nimport { refreshDataGrid } from '../../../lib/core/linkage'\r\nimport { deepMerge } from '../../../lib/core/utils'\r\nimport { useContainer } from '../../containers/containerContext'\r\n\r\ndefineOptions({ name: 'WdDataForm', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n /** 模式:create 新增 / edit 编辑 */\r\n mode: { type: String as PropType<'create' | 'edit'>, default: 'create' },\r\n /** 详情数据接口(edit 模式回填) */\r\n api: { type: String, default: '' },\r\n apiMethod: { type: String as PropType<'get' | 'post'>, default: 'get' },\r\n apiParam: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n /** 提交接口 */\r\n submitApi: { type: String, default: '' },\r\n submitMethod: { type: String as PropType<'post' | 'put'>, default: 'post' },\r\n /** 提交字段白名单 */\r\n submitKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 提交字段黑名单 */\r\n submitExcludeKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 是否自动请求详情 */\r\n active: { type: Boolean, default: false },\r\n /** 有未保存修改时离开确认 */\r\n confirmLeave: { type: Boolean, default: true },\r\n /** 是否显示底部操作按钮区 */\r\n withActions: { type: Boolean, default: true },\r\n /** 底部按钮文案配置 */\r\n actionConfig: {\r\n type: Object as PropType<{\r\n resetText?: string\r\n submitText?: string\r\n continueText?: string\r\n closeText?: string\r\n showReset?: boolean\r\n showContinue?: boolean\r\n }>,\r\n default: () => ({})\r\n },\r\n /** 提交后关闭抽屉 */\r\n headCloseDrawer: { type: [Boolean, String], default: true },\r\n /** 提交后刷新表格 */\r\n headRefreshDatagrid: { type: [Boolean, String], default: false },\r\n /** 显示连续操作按钮 */\r\n keepFormButton: { type: Boolean, default: true },\r\n /** 表单规则(透传 el-form rules) */\r\n rules: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n labelWidth: { type: [String, Number], default: '100px' },\r\n labelPosition: { type: String as PropType<'left' | 'right' | 'top'>, default: 'right' },\r\n inline: { type: Boolean, default: false },\r\n /** 联动分组 */\r\n filter: { type: String, default: '' },\r\n /** 外部传入的初始数据(DrawerButton data 等) */\r\n data: { type: Object as PropType<Record<string, any>>, default: undefined }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'submit-success',\r\n 'submit-fail',\r\n 'load-success',\r\n 'change',\r\n 'close',\r\n 'apiBefore',\r\n 'apiAfter'\r\n])\r\n\r\nconst formRef = ref<any>(null)\r\nconst loading = ref(false)\r\nconst formModel = reactive<Record<string, any>>({})\r\n/** 初始快照,用于修改检测与 edit 重置 */\r\nconst snapshot = ref<Record<string, any>>({})\r\n\r\nconst isCreate = computed(() => props.mode !== 'edit')\r\n\r\nconst actionConf = computed(() =>\r\n deepMerge(\r\n {\r\n resetText: '重置',\r\n submitText: '保存',\r\n continueText: '保存并继续',\r\n closeText: '关闭',\r\n showReset: true,\r\n showContinue: true\r\n },\r\n props.actionConfig || {}\r\n )\r\n)\r\n\r\nconst closeText = computed(() => actionConf.value.closeText)\r\n\r\n// 通过 provide 向子组件暴露 model;HTML 场景下插槽 v-model=\"model.xxx\"\r\n// 运行于根组件模板作用域,故同时把 model 挂到 app.config.globalProperties\r\n// (根实例 proxy 查找 setupState/data 之后回退 globalProperties)\r\nconst instance = getCurrentInstance()\r\nprovide('wdDataForm', {\r\n model: formModel,\r\n formRef\r\n})\r\n\r\n/** 回填数据到表单 */\r\nfunction fillForm(data: Record<string, any> | null | undefined) {\r\n // 清空旧值\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n if (data && typeof data === 'object') {\r\n Object.assign(formModel, JSON.parse(JSON.stringify(data)))\r\n }\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 请求详情并回填 */\r\nasync function requestApi(options?: { apiParam?: Record<string, any> }) {\r\n if (!props.api) {\r\n fillForm(props.data || {})\r\n return\r\n }\r\n loading.value = true\r\n emit('apiBefore', { type: 'load' })\r\n try {\r\n const param = { ...props.apiParam, ...(options?.apiParam || {}) }\r\n const result =\r\n props.apiMethod === 'get'\r\n ? await request.get(props.api, param)\r\n : await request.post(props.api, param)\r\n if (result.success) {\r\n fillForm(result.data || {})\r\n emit('load-success', result.data)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'load' })\r\n }\r\n}\r\n\r\n/** 取当前表单值 */\r\nfunction getFormData() {\r\n return { ...formModel }\r\n}\r\n\r\n/** 按白/黑名单过滤提交字段 */\r\nfunction pickSubmitData() {\r\n const data = getFormData()\r\n const toArr = (v: string | string[] | undefined) =>\r\n v == null ? null : Array.isArray(v) ? v : String(v).split(',').map((s) => s.trim()).filter(Boolean)\r\n\r\n const whitelist = toArr(props.submitKeys)\r\n const blacklist = toArr(props.submitExcludeKeys)\r\n\r\n let result = data\r\n if (whitelist) {\r\n result = whitelist.reduce((acc: Record<string, any>, key) => {\r\n acc[key] = data[key]\r\n return acc\r\n }, {})\r\n }\r\n if (blacklist) {\r\n result = Object.keys(result).reduce((acc: Record<string, any>, key) => {\r\n if (!blacklist.includes(key)) acc[key] = result[key]\r\n return acc\r\n }, {})\r\n }\r\n return result\r\n}\r\n\r\n/** 手动校验 */\r\nasync function validate(): Promise<boolean> {\r\n if (!formRef.value) return true\r\n try {\r\n await formRef.value.validate()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/** 提交 */\r\nasync function submitForm(continueNext = false) {\r\n const ok = await validate()\r\n if (!ok) {\r\n ElMessage.warning('请完善表单必填项')\r\n return\r\n }\r\n if (!props.submitApi) {\r\n // 无提交接口:仅抛出事件,交给父组件处理\r\n emit('submit-success', getFormData())\r\n afterSubmitSuccess(getFormData(), continueNext)\r\n return\r\n }\r\n\r\n loading.value = true\r\n emit('apiBefore', { type: 'submit' })\r\n try {\r\n const submitData = pickSubmitData()\r\n const result =\r\n props.submitMethod === 'put'\r\n ? await request.put(props.submitApi, submitData)\r\n : await request.post(props.submitApi, submitData)\r\n\r\n if (result.success) {\r\n emit('submit-success', result.data)\r\n afterSubmitSuccess(result.data, continueNext)\r\n } else {\r\n emit('submit-fail', result)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'submit' })\r\n }\r\n}\r\n\r\n/** 提交成功后的联动处理 */\r\nfunction afterSubmitSuccess(data: any, continueNext: boolean) {\r\n // 1. 刷新目标 DataGrid(声明式联动)\r\n if (props.headRefreshDatagrid) {\r\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n }\r\n // 2. 关闭抽屉 / 连续操作\r\n if (continueNext && isCreate.value) {\r\n // 保存并继续:清空表单继续新增,不关闭\r\n resetForm(true)\r\n } else if (props.headCloseDrawer) {\r\n // 容器内:请求容器关闭(提交成功不再做离开确认);独立使用:emit close\r\n if (container?.requestClose) {\r\n container.requestClose('submit')\r\n } else {\r\n emit('close', { reason: 'submit' })\r\n }\r\n }\r\n // 更新快照\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 重置:create 清空 / edit 回填原值 */\r\nfunction resetForm(clearOnly = false) {\r\n if (isCreate.value || clearOnly) {\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n formRef.value?.clearValidate?.()\r\n } else {\r\n fillForm(snapshot.value)\r\n formRef.value?.clearValidate?.()\r\n }\r\n}\r\n\r\n/** 是否有未保存修改 */\r\nfunction isDirty(): boolean {\r\n return JSON.stringify(formModel) !== JSON.stringify(snapshot.value)\r\n}\r\n\r\n/** 关闭(底部关闭按钮) */\r\nfunction onClose() {\r\n if (container?.requestClose) {\r\n // 容器内:交给容器走关闭流程(容器统一执行未保存确认,避免重复弹窗)\r\n container.requestClose('manual')\r\n return\r\n }\r\n // iframe 场景:通知父容器(wd-drawer url 模式 / wd-iframe 承载)请求关闭\r\n if (inIframe.value) {\r\n window.parent?.postMessage({ type: 'wd-container:close' }, '*')\r\n return\r\n }\r\n // 独立使用:自行确认\r\n if (props.confirmLeave && isDirty()) {\r\n ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n .then(() => emit('close', { reason: 'manual' }))\r\n .catch(() => {})\r\n return\r\n }\r\n emit('close', { reason: 'manual' })\r\n}\r\n\r\n/** 供父组件/抽屉调用的离开检查 */\r\nasync function beforeLeave(): Promise<boolean> {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n// 表单变化事件(修改检测)\r\nwatch(\r\n formModel,\r\n () => {\r\n emit('change', getFormData())\r\n },\r\n { deep: true }\r\n)\r\n\r\n// 容器上下文(被 wd-drawer 承载时存在,mode=dialog 同为该组件)\r\nconst container = useContainer()\r\nlet removeBeforeClose: (() => void) | null = null\r\n// 容器携带的数据(DrawerButton data),props.data 优先\r\nconst containerData = computed(() => props.data || container?.data)\r\n\r\n// 是否处于 iframe 子页面(被 wd-drawer url 模式 / wd-iframe 承载;跨域访问 window.top 会抛错,视为 iframe)\r\nconst inIframe = computed(() => {\r\n if (typeof window === 'undefined') return false\r\n try {\r\n return window.self !== window.top\r\n } catch {\r\n return true\r\n }\r\n})\r\n// 是否处于宿主环境(drawer/dialog 容器 或 iframe)——决定底部「关闭」「保存并继续」按钮是否显示\r\nconst inHost = computed(() => !!container || inIframe.value)\r\n\r\n// 同步数据预填(首次渲染前):props.data / 容器 data 在 setup 阶段已可用,\r\n// 提前回填可避免插槽内 el-switch / el-radio 等控件首帧绑定 undefined 触发 EP 校验警告;\r\n// api 异步详情仍在 onMounted 中拉取并覆盖\r\nif (containerData.value) {\r\n fillForm(containerData.value)\r\n}\r\n\r\nonMounted(() => {\r\n // HTML 场景:把 model 暴露给根模板作用域(v-model=\"model.xxx\")\r\n const appContext = instance?.appContext\r\n if (appContext) {\r\n appContext.config.globalProperties.model = formModel\r\n const rootProxy = appContext.app?.config?.globalProperties\r\n if (rootProxy) rootProxy.model = formModel\r\n }\r\n\r\n // 注册关闭前守卫:容器关闭时先做未保存确认(确认逻辑只走这一处,避免重复弹窗)\r\n if (container?.addBeforeClose) {\r\n removeBeforeClose = container.addBeforeClose(async () => {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n })\r\n }\r\n\r\n if (props.mode === 'edit') {\r\n if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n if (props.active && props.api) {\r\n requestApi()\r\n }\r\n } else if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n removeBeforeClose?.()\r\n // 清理全局 model(仅当仍指向本实例时)\r\n const appContext = instance?.appContext\r\n if (appContext?.config?.globalProperties?.model === formModel) {\r\n delete appContext.config.globalProperties.model\r\n }\r\n})\r\n\r\ndefineExpose({\r\n requestApi,\r\n submitForm,\r\n resetForm,\r\n validate,\r\n getFormData,\r\n isDirty,\r\n beforeLeave,\r\n fillForm,\r\n formRef\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.wd-data-form {\r\n width: 100%;\r\n}\r\n.wd-data-form__footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding-top: var(--wd-spacing-base, 12px);\r\n border-top: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n margin-top: var(--wd-spacing-base, 12px);\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","formRef","ref","loading","formModel","reactive","snapshot","isCreate","computed","actionConf","deepMerge","closeText","instance","getCurrentInstance","provide","fillForm","data","k","requestApi","options","param","result","request","getFormData","pickSubmitData","toArr","v","s","whitelist","blacklist","acc","key","validate","submitForm","continueNext","ElMessage","afterSubmitSuccess","submitData","refreshDataGrid","resetForm","container","clearOnly","_b","_a","_d","_c","isDirty","onClose","inIframe","ElMessageBox","beforeLeave","watch","useContainer","removeBeforeClose","containerData","inHost","onMounted","appContext","rootProxy","onBeforeUnmount","__expose","_openBlock","_createElementBlock","_hoisted_1","_withDirectives","_createBlock","_component_el_form","_mergeProps","$attrs","_renderSlot","_ctx","_hoisted_2","_component_el_button","_createTextVNode","_toDisplayString","_createVNode"],"mappings":"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"}
1
+ {"version":3,"file":"DataForm-C6VLTSOm.mjs","sources":["../../src/components/form/data-form/DataForm.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-data-form\">\r\n <el-form\r\n ref=\"formRef\"\r\n v-loading=\"loading\"\r\n :model=\"formModel\"\r\n :rules=\"rules\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n :inline=\"inline\"\r\n :disabled=\"loading\"\r\n v-bind=\"$attrs\"\r\n @submit.prevent\r\n >\r\n <slot :model=\"formModel\" :form=\"formRef\" />\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"withActions\" class=\"wd-data-form__footer\">\r\n <slot name=\"footer\" :submit=\"submitForm\" :reset=\"resetForm\" :loading=\"loading\">\r\n <!-- 关闭 / 保存并继续:仅在容器(drawer/dialog)或 iframe 内显示,独立使用时隐藏 -->\r\n <el-button v-if=\"inHost\" @click=\"onClose\">{{ closeText }}</el-button>\r\n <el-button v-if=\"actionConf.showReset\" @click=\"resetForm\">{{ actionConf.resetText }}</el-button>\r\n <el-button\r\n v-if=\"inHost && isCreate && keepFormButton && actionConf.showContinue\"\r\n :loading=\"loading\"\r\n @click=\"submitForm(true)\"\r\n >\r\n {{ actionConf.continueText }}\r\n </el-button>\r\n <el-button type=\"primary\" :loading=\"loading\" @click=\"submitForm(false)\">\r\n {{ actionConf.submitText }}\r\n </el-button>\r\n </slot>\r\n </div>\r\n </el-form>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, onMounted, onBeforeUnmount, watch, provide, inject, getCurrentInstance, type PropType } from 'vue'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../../lib/core/http'\r\nimport { refreshDataGrid } from '../../../lib/core/linkage'\r\nimport { deepMerge } from '../../../lib/core/utils'\r\nimport { useContainer } from '../../containers/containerContext'\r\n\r\ndefineOptions({ name: 'WdDataForm', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n /** 模式:create 新增 / edit 编辑 */\r\n mode: { type: String as PropType<'create' | 'edit'>, default: 'create' },\r\n /** 详情数据接口(edit 模式回填) */\r\n api: { type: String, default: '' },\r\n apiMethod: { type: String as PropType<'get' | 'post'>, default: 'get' },\r\n apiParam: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n /** 提交接口 */\r\n submitApi: { type: String, default: '' },\r\n submitMethod: { type: String as PropType<'post' | 'put'>, default: 'post' },\r\n /** 提交字段白名单 */\r\n submitKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 提交字段黑名单 */\r\n submitExcludeKeys: { type: [String, Array] as PropType<string | string[]>, default: undefined },\r\n /** 是否自动请求详情 */\r\n active: { type: Boolean, default: false },\r\n /** 有未保存修改时离开确认 */\r\n confirmLeave: { type: Boolean, default: true },\r\n /** 是否显示底部操作按钮区 */\r\n withActions: { type: Boolean, default: true },\r\n /** 底部按钮文案配置 */\r\n actionConfig: {\r\n type: Object as PropType<{\r\n resetText?: string\r\n submitText?: string\r\n continueText?: string\r\n closeText?: string\r\n showReset?: boolean\r\n showContinue?: boolean\r\n }>,\r\n default: () => ({})\r\n },\r\n /** 提交后关闭抽屉 */\r\n headCloseDrawer: { type: [Boolean, String], default: true },\r\n /** 提交后刷新表格 */\r\n headRefreshDatagrid: { type: [Boolean, String], default: false },\r\n /** 显示连续操作按钮 */\r\n keepFormButton: { type: Boolean, default: true },\r\n /** 表单规则(透传 el-form rules) */\r\n rules: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\r\n labelWidth: { type: [String, Number], default: '100px' },\r\n labelPosition: { type: String as PropType<'left' | 'right' | 'top'>, default: 'right' },\r\n inline: { type: Boolean, default: false },\r\n /** 联动分组 */\r\n filter: { type: String, default: '' },\r\n /** 外部传入的初始数据(DrawerButton data 等) */\r\n data: { type: Object as PropType<Record<string, any>>, default: undefined }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'submit-success',\r\n 'submit-fail',\r\n 'load-success',\r\n 'change',\r\n 'close',\r\n 'apiBefore',\r\n 'apiAfter'\r\n])\r\n\r\nconst formRef = ref<any>(null)\r\nconst loading = ref(false)\r\nconst formModel = reactive<Record<string, any>>({})\r\n/** 初始快照,用于修改检测与 edit 重置 */\r\nconst snapshot = ref<Record<string, any>>({})\r\n\r\nconst isCreate = computed(() => props.mode !== 'edit')\r\n\r\nconst actionConf = computed(() =>\r\n deepMerge(\r\n {\r\n resetText: '重置',\r\n submitText: '保存',\r\n continueText: '保存并继续',\r\n closeText: '关闭',\r\n showReset: true,\r\n showContinue: true\r\n },\r\n props.actionConfig || {}\r\n )\r\n)\r\n\r\nconst closeText = computed(() => actionConf.value.closeText)\r\n\r\n// 通过 provide 向子组件暴露 model;HTML 场景下插槽 v-model=\"model.xxx\"\r\n// 运行于根组件模板作用域,故同时把 model 挂到 app.config.globalProperties\r\n// (根实例 proxy 查找 setupState/data 之后回退 globalProperties)\r\nconst instance = getCurrentInstance()\r\nprovide('wdDataForm', {\r\n model: formModel,\r\n formRef\r\n})\r\n\r\n/** 回填数据到表单 */\r\nfunction fillForm(data: Record<string, any> | null | undefined) {\r\n // 清空旧值\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n if (data && typeof data === 'object') {\r\n Object.assign(formModel, JSON.parse(JSON.stringify(data)))\r\n }\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 请求详情并回填 */\r\nasync function requestApi(options?: { apiParam?: Record<string, any> }) {\r\n if (!props.api) {\r\n fillForm(props.data || {})\r\n return\r\n }\r\n loading.value = true\r\n emit('apiBefore', { type: 'load' })\r\n try {\r\n const param = { ...props.apiParam, ...(options?.apiParam || {}) }\r\n const result =\r\n props.apiMethod === 'get'\r\n ? await request.get(props.api, param)\r\n : await request.post(props.api, param)\r\n if (result.success) {\r\n fillForm(result.data || {})\r\n emit('load-success', result.data)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'load' })\r\n }\r\n}\r\n\r\n/** 取当前表单值 */\r\nfunction getFormData() {\r\n return { ...formModel }\r\n}\r\n\r\n/** 按白/黑名单过滤提交字段 */\r\nfunction pickSubmitData() {\r\n const data = getFormData()\r\n const toArr = (v: string | string[] | undefined) =>\r\n v == null ? null : Array.isArray(v) ? v : String(v).split(',').map((s) => s.trim()).filter(Boolean)\r\n\r\n const whitelist = toArr(props.submitKeys)\r\n const blacklist = toArr(props.submitExcludeKeys)\r\n\r\n let result = data\r\n if (whitelist) {\r\n result = whitelist.reduce((acc: Record<string, any>, key) => {\r\n acc[key] = data[key]\r\n return acc\r\n }, {})\r\n }\r\n if (blacklist) {\r\n result = Object.keys(result).reduce((acc: Record<string, any>, key) => {\r\n if (!blacklist.includes(key)) acc[key] = result[key]\r\n return acc\r\n }, {})\r\n }\r\n return result\r\n}\r\n\r\n/** 手动校验 */\r\nasync function validate(): Promise<boolean> {\r\n if (!formRef.value) return true\r\n try {\r\n await formRef.value.validate()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/** 提交 */\r\nasync function submitForm(continueNext = false) {\r\n const ok = await validate()\r\n if (!ok) {\r\n ElMessage.warning('请完善表单必填项')\r\n return\r\n }\r\n if (!props.submitApi) {\r\n // 无提交接口:仅抛出事件,交给父组件处理\r\n emit('submit-success', getFormData())\r\n afterSubmitSuccess(getFormData(), continueNext)\r\n return\r\n }\r\n\r\n loading.value = true\r\n emit('apiBefore', { type: 'submit' })\r\n try {\r\n const submitData = pickSubmitData()\r\n const result =\r\n props.submitMethod === 'put'\r\n ? await request.put(props.submitApi, submitData)\r\n : await request.post(props.submitApi, submitData)\r\n\r\n if (result.success) {\r\n emit('submit-success', result.data)\r\n afterSubmitSuccess(result.data, continueNext)\r\n } else {\r\n emit('submit-fail', result)\r\n }\r\n } finally {\r\n loading.value = false\r\n emit('apiAfter', { type: 'submit' })\r\n }\r\n}\r\n\r\n/** 提交成功后的联动处理 */\r\nfunction afterSubmitSuccess(data: any, continueNext: boolean) {\r\n // 1. 刷新目标 DataGrid(声明式联动)\r\n if (props.headRefreshDatagrid) {\r\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n }\r\n // 2. 关闭抽屉 / 连续操作\r\n if (continueNext && isCreate.value) {\r\n // 保存并继续:清空表单继续新增,不关闭\r\n resetForm(true)\r\n } else if (props.headCloseDrawer) {\r\n // 容器内:请求容器关闭(提交成功不再做离开确认);独立使用:emit close\r\n if (container?.requestClose) {\r\n container.requestClose('submit')\r\n } else {\r\n emit('close', { reason: 'submit' })\r\n }\r\n }\r\n // 更新快照\r\n snapshot.value = JSON.parse(JSON.stringify(formModel))\r\n}\r\n\r\n/** 重置:create 清空 / edit 回填原值 */\r\nfunction resetForm(clearOnly = false) {\r\n if (isCreate.value || clearOnly) {\r\n Object.keys(formModel).forEach((k) => delete formModel[k])\r\n formRef.value?.clearValidate?.()\r\n } else {\r\n fillForm(snapshot.value)\r\n formRef.value?.clearValidate?.()\r\n }\r\n}\r\n\r\n/** 是否有未保存修改 */\r\nfunction isDirty(): boolean {\r\n return JSON.stringify(formModel) !== JSON.stringify(snapshot.value)\r\n}\r\n\r\n/** 关闭(底部关闭按钮) */\r\nfunction onClose() {\r\n if (container?.requestClose) {\r\n // 容器内:交给容器走关闭流程(容器统一执行未保存确认,避免重复弹窗)\r\n container.requestClose('manual')\r\n return\r\n }\r\n // iframe 场景:通知父容器(wd-drawer url 模式 / wd-iframe 承载)请求关闭\r\n if (inIframe.value) {\r\n window.parent?.postMessage({ type: 'wd-container:close' }, '*')\r\n return\r\n }\r\n // 独立使用:自行确认\r\n if (props.confirmLeave && isDirty()) {\r\n ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n .then(() => emit('close', { reason: 'manual' }))\r\n .catch(() => {})\r\n return\r\n }\r\n emit('close', { reason: 'manual' })\r\n}\r\n\r\n/** 供父组件/抽屉调用的离开检查 */\r\nasync function beforeLeave(): Promise<boolean> {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n// 表单变化事件(修改检测)\r\nwatch(\r\n formModel,\r\n () => {\r\n emit('change', getFormData())\r\n },\r\n { deep: true }\r\n)\r\n\r\n// 容器上下文(被 wd-drawer 承载时存在,mode=dialog 同为该组件)\r\nconst container = useContainer()\r\nlet removeBeforeClose: (() => void) | null = null\r\n// 容器携带的数据(DrawerButton data),props.data 优先\r\nconst containerData = computed(() => props.data || container?.data)\r\n\r\n// 是否处于 iframe 子页面(被 wd-drawer url 模式 / wd-iframe 承载;跨域访问 window.top 会抛错,视为 iframe)\r\nconst inIframe = computed(() => {\r\n if (typeof window === 'undefined') return false\r\n try {\r\n return window.self !== window.top\r\n } catch {\r\n return true\r\n }\r\n})\r\n// 是否处于宿主环境(drawer/dialog 容器 或 iframe)——决定底部「关闭」「保存并继续」按钮是否显示\r\nconst inHost = computed(() => !!container || inIframe.value)\r\n\r\n// 同步数据预填(首次渲染前):props.data / 容器 data 在 setup 阶段已可用,\r\n// 提前回填可避免插槽内 el-switch / el-radio 等控件首帧绑定 undefined 触发 EP 校验警告;\r\n// api 异步详情仍在 onMounted 中拉取并覆盖\r\nif (containerData.value) {\r\n fillForm(containerData.value)\r\n}\r\n\r\nonMounted(() => {\r\n // HTML 场景:把 model 暴露给根模板作用域(v-model=\"model.xxx\")\r\n const appContext = instance?.appContext\r\n if (appContext) {\r\n appContext.config.globalProperties.model = formModel\r\n const rootProxy = appContext.app?.config?.globalProperties\r\n if (rootProxy) rootProxy.model = formModel\r\n }\r\n\r\n // 注册关闭前守卫:容器关闭时先做未保存确认(确认逻辑只走这一处,避免重复弹窗)\r\n if (container?.addBeforeClose) {\r\n removeBeforeClose = container.addBeforeClose(async () => {\r\n if (!props.confirmLeave || !isDirty()) return true\r\n try {\r\n await ElMessageBox.confirm('有未保存的修改,确认离开?', '提示', {\r\n confirmButtonText: '确认离开',\r\n cancelButtonText: '继续编辑',\r\n type: 'warning'\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n })\r\n }\r\n\r\n if (props.mode === 'edit') {\r\n if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n if (props.active && props.api) {\r\n requestApi()\r\n }\r\n } else if (containerData.value) {\r\n fillForm(containerData.value)\r\n }\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n removeBeforeClose?.()\r\n // 清理全局 model(仅当仍指向本实例时)\r\n const appContext = instance?.appContext\r\n if (appContext?.config?.globalProperties?.model === formModel) {\r\n delete appContext.config.globalProperties.model\r\n }\r\n})\r\n\r\ndefineExpose({\r\n requestApi,\r\n submitForm,\r\n resetForm,\r\n validate,\r\n getFormData,\r\n isDirty,\r\n beforeLeave,\r\n fillForm,\r\n formRef\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.wd-data-form {\r\n width: 100%;\r\n}\r\n.wd-data-form__footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n gap: 8px;\r\n /* 组件级令牌:皮肤可给表单 footer 加底色 / 内边距 / 圆角;\r\n 默认仅顶部留白(按钮与表单右缘对齐),皮肤给底色时应同步给 padding/radius 避免按钮贴边 */\r\n padding: var(--wd-form-footer-padding, 12px 0 0);\r\n border-top: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #e4e7ed);\r\n margin-top: var(--wd-spacing-base, 12px);\r\n border-radius: var(--wd-form-footer-radius, 0);\r\n background: var(--wd-form-footer-bg, transparent);\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","formRef","ref","loading","formModel","reactive","snapshot","isCreate","computed","actionConf","deepMerge","closeText","instance","getCurrentInstance","provide","fillForm","data","k","requestApi","options","param","result","request","getFormData","pickSubmitData","toArr","v","s","whitelist","blacklist","acc","key","validate","submitForm","continueNext","ElMessage","afterSubmitSuccess","submitData","refreshDataGrid","resetForm","container","clearOnly","_b","_a","_d","_c","isDirty","onClose","inIframe","ElMessageBox","beforeLeave","watch","useContainer","removeBeforeClose","containerData","inHost","onMounted","appContext","rootProxy","onBeforeUnmount","__expose","_openBlock","_createElementBlock","_hoisted_1","_withDirectives","_createBlock","_component_el_form","_mergeProps","$attrs","_renderSlot","_ctx","_hoisted_2","_component_el_button","_createTextVNode","_toDisplayString","_createVNode"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { defineComponent as Fe, useSlots as Ft, ref as D, computed as m, watch as N, nextTick as we, onMounted as Ot, onBeforeUnmount as Lt, resolveComponent as P, resolveDirective as It, openBlock as o, createElementBlock as y, normalizeStyle as Gt, normalizeClass as A, renderSlot as Y, unref as u, createBlock as f, withCtx as a, createVNode as n, createTextVNode as C, createCommentVNode as g, toDisplayString as M, withDirectives as Oe, Fragment as J, renderList as Q, createElementVNode as E, isRef as Nt, withModifiers as Le, resolveDynamicComponent as jt, createSlots as Ut } from "vue";
2
2
  import { Plus as Ie, Download as Ge, Refresh as Ne, ScaleToOriginal as je, Grid as Ue, Menu as We, Setting as qe, ShoppingCart as Ye, Rank as Wt } from "@element-plus/icons-vue";
3
- import { u as qt, a as Yt, o as Jt } from "./useColumnSettings-BYDQdk4o.mjs";
3
+ import { u as qt, a as Yt, o as Jt } from "./useColumnSettings-BwG2V9xp.mjs";
4
4
  import { a as Qt } from "./linkage-FbL1mcz3.mjs";
5
- import { c as Xt, a as Zt } from "./http-Bs-dM076.mjs";
5
+ import { e as Xt, a as Zt } from "./http-C06mNpwY.mjs";
6
6
  import { _ as ea } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
7
7
  const ta = {
8
8
  key: 0,
@@ -1117,8 +1117,8 @@ const ta = {
1117
1117
  ], 6);
1118
1118
  };
1119
1119
  }
1120
- }), Ca = /* @__PURE__ */ ea(pa, [["__scopeId", "data-v-41e543b4"]]);
1120
+ }), Ca = /* @__PURE__ */ ea(pa, [["__scopeId", "data-v-477e09fc"]]);
1121
1121
  export {
1122
1122
  Ca as W
1123
1123
  };
1124
- //# sourceMappingURL=DataGrid-HUzKWuQx.mjs.map
1124
+ //# sourceMappingURL=DataGrid-Dd7n5JM7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid-HUzKWuQx.mjs","sources":["../../src/components/data/datagrid/DataGrid.vue"],"sourcesContent":["<template>\n <div\n ref=\"rootRef\"\n class=\"wd-datagrid\"\n :class=\"{\n 'wd-datagrid--auto-height': autoHeight,\n 'wd-datagrid--fixed-height': isFixedHeightMode\n }\"\n :style=\"rootStyle\"\n >\n <!-- 顶部工具栏:自定义组与内置工具组按各自 position 渲染到左/右 -->\n <div v-if=\"showTopToolbar\" class=\"wd-datagrid__toolbar\">\n <!-- 自定义工具栏组:toolbar 插槽 + 新增/导出 -->\n <div\n v-if=\"actionsAtTop\"\n class=\"wd-datagrid__toolbar-left wd-datagrid__toolbar-group\"\n :class=\"toolbarPosition === 'right' ? 'at-right' : 'at-left'\"\n >\n <!-- 补充按钮(开发者)始终位于最左;以下为内置业务按钮 -->\n <slot name=\"toolbar\" :selection=\"selection\" :list=\"list\" />\n <el-button v-if=\"toolsConf.add\" type=\"primary\" :size=\"toolBtnSize\" @click=\"emit('add')\">\n <el-icon><Plus /></el-icon>新增\n </el-button>\n <el-button v-if=\"toolsConf.export\" :size=\"toolBtnSize\" @click=\"emit('export')\">\n <el-icon><Download /></el-icon>导出\n </el-button>\n </div>\n <!-- 内置工具按钮组:刷新 / 大小 / 模式切换 / 列设置 / 购物车 -->\n <div\n v-if=\"toolsAtTop\"\n class=\"wd-datagrid__toolbar-right wd-datagrid__toolbar-group\"\n :class=\"[`is-${toolBtnMode}`, toolsPosition === 'left' ? 'at-left' : 'at-right']\"\n >\n <el-tooltip v-if=\"toolsConf.refresh\" content=\"刷新\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"refresh\">\n <el-icon><Refresh /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.size\" content=\"调整大小\" placement=\"top\">\n <el-dropdown trigger=\"click\" @command=\"onSizeChange\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\">\n <el-icon><ScaleToOriginal /></el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item command=\"large\" :disabled=\"innerSize === 'large'\">大</el-dropdown-item>\n <el-dropdown-item command=\"default\" :disabled=\"innerSize === 'default'\">默认</el-dropdown-item>\n <el-dropdown-item command=\"small\" :disabled=\"innerSize === 'small'\">小</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </el-tooltip>\n <el-tooltip v-if=\"(toolsConf.modeSwitch || modeSwitch) && $slots['card-item']\" content=\"表格/列表切换\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"toggleMode\">\n <el-icon><Grid v-if=\"viewMode === 'card'\" /><Menu v-else /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.columnSetting || dynamicColumn\" content=\"列设置\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"colSettingVisible = true\">\n <el-icon><Setting /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"withSelectionCart\" :content=\"cartConfig.buttonText || '已选数据'\" placement=\"top\">\n <el-badge :value=\"cartList.length\" :hidden=\"cartList.length === 0\" :max=\"999\">\n <el-button\n :circle=\"toolBtnMode === 'round' && !cartConfig.buttonText\"\n :size=\"toolBtnSize\"\n class=\"wd-datagrid__cart-btn\"\n :class=\"{ 'wd-datagrid__cart-btn--text': !!cartConfig.buttonText }\"\n @click=\"openCart\"\n >\n <el-icon><ShoppingCart /></el-icon>\n <span v-if=\"cartConfig.buttonText\" class=\"wd-datagrid__cart-text\">{{ cartConfig.buttonText }}</span>\n </el-button>\n </el-badge>\n </el-tooltip>\n </div>\n </div>\n\n <!-- 表格主体 -->\n <el-table\n v-if=\"viewMode === 'table'\"\n ref=\"tableRef\"\n v-loading=\"loading\"\n :data=\"list\"\n :size=\"innerSize\"\n :border=\"border\"\n :stripe=\"stripe\"\n :height=\"tableHeight\"\n :row-key=\"rowKey || undefined\"\n :tree-props=\"treeProps\"\n :default-expand-all=\"defaultExpandAll\"\n :span-method=\"rowspanMethod\"\n class=\"wd-datagrid__table\"\n @selection-change=\"onSelectionChange\"\n @sort-change=\"grid.changeSort\"\n >\n <el-table-column v-if=\"withSelection\" type=\"selection\" width=\"60\" align=\"center\" reserve-selection />\n <el-table-column v-if=\"withIndex\" type=\"index\" label=\"序号\" width=\"60\" align=\"center\" :index=\"indexMethod\" />\n\n <!-- 业务列:默认插槽内容(el-table-column),过滤隐藏列 -->\n <ColumnRenderer :vnodes=\"columnVnodes\" />\n\n <!-- 内置操作列(rowActions) -->\n <el-table-column\n v-if=\"rowActions.length\"\n label=\"操作\"\n :width=\"actionColumnWidth\"\n align=\"center\"\n fixed=\"right\"\n >\n <template #default=\"{ row }\">\n <el-button\n v-for=\"act in rowActions\"\n :key=\"act.command || act.text\"\n link\n size=\"small\"\n :type=\"(act.type as any) || 'primary'\"\n @click=\"onRowAction(row, act)\"\n >{{ act.text }}</el-button>\n </template>\n </el-table-column>\n\n <template #empty>\n <slot name=\"empty\">\n <el-empty :description=\"loading ? '加载中...' : '暂无数据'\" :image-size=\"80\" />\n </slot>\n </template>\n </el-table>\n\n <!-- 列表(卡片)模式 -->\n <div v-else class=\"wd-datagrid__cards\" v-loading=\"loading\">\n <el-empty v-if=\"!list.length\" description=\"暂无数据\" :image-size=\"80\" />\n <div v-for=\"(row, idx) in list\" :key=\"row[rowKey || 'id'] ?? idx\" class=\"wd-datagrid__card\">\n <slot name=\"card-item\" :row=\"row\" :index=\"idx\">\n <div class=\"wd-datagrid__card-title\">{{ row.name || row.title || `第 ${idx + 1} 项` }}</div>\n <div class=\"wd-datagrid__card-body\">\n <div v-for=\"(val, k) in row\" :key=\"k\" class=\"wd-datagrid__card-line\">\n <span class=\"wd-datagrid__card-label\">{{ k }}</span>\n <span class=\"wd-datagrid__card-value\">{{ val }}</span>\n </div>\n </div>\n </slot>\n </div>\n </div>\n\n <!-- 底部栏:置于底部的工具组/自定义组与分页合并同一行 -->\n <div\n v-if=\"showBottomBar\"\n class=\"wd-datagrid__pager wd-datagrid__bottom-bar\"\n :class=\"`pager-at-${pagerPos}`\"\n >\n <!-- 自定义工具栏组(底部):toolbar 插槽 + 新增/导出 -->\n <div v-if=\"actionsAtBottom\" class=\"wd-datagrid__bottom-group wd-datagrid__bottom-actions\">\n <slot name=\"toolbar\" :selection=\"selection\" :list=\"list\" />\n <el-button v-if=\"toolsConf.add\" type=\"primary\" :size=\"toolBtnSize\" @click=\"emit('add')\">\n <el-icon><Plus /></el-icon>新增\n </el-button>\n <el-button v-if=\"toolsConf.export\" :size=\"toolBtnSize\" @click=\"emit('export')\">\n <el-icon><Download /></el-icon>导出\n </el-button>\n </div>\n <!-- 内置工具按钮组(底部):刷新 / 大小 / 模式切换 / 列设置 / 购物车 -->\n <div\n v-if=\"toolsAtBottom\"\n class=\"wd-datagrid__bottom-group wd-datagrid__bottom-tools wd-datagrid__toolbar-group\"\n :class=\"`is-${toolBtnMode}`\"\n >\n <el-tooltip v-if=\"toolsConf.refresh\" content=\"刷新\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"refresh\">\n <el-icon><Refresh /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.size\" content=\"调整大小\" placement=\"top\">\n <el-dropdown trigger=\"click\" @command=\"onSizeChange\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\">\n <el-icon><ScaleToOriginal /></el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item command=\"large\" :disabled=\"innerSize === 'large'\">大</el-dropdown-item>\n <el-dropdown-item command=\"default\" :disabled=\"innerSize === 'default'\">默认</el-dropdown-item>\n <el-dropdown-item command=\"small\" :disabled=\"innerSize === 'small'\">小</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </el-tooltip>\n <el-tooltip v-if=\"(toolsConf.modeSwitch || modeSwitch) && $slots.list\" content=\"表格/列表切换\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"toggleMode\">\n <el-icon><Grid v-if=\"viewMode === 'card'\" /><Menu v-else /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.columnSetting || dynamicColumn\" content=\"列设置\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"colSettingVisible = true\">\n <el-icon><Setting /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"withSelectionCart\" :content=\"cartConfig.buttonText || '已选数据'\" placement=\"top\">\n <el-badge :value=\"cartList.length\" :hidden=\"cartList.length === 0\" :max=\"999\">\n <el-button\n :circle=\"toolBtnMode === 'round' && !cartConfig.buttonText\"\n :size=\"toolBtnSize\"\n class=\"wd-datagrid__cart-btn\"\n :class=\"{ 'wd-datagrid__cart-btn--text': !!cartConfig.buttonText }\"\n @click=\"openCart\"\n >\n <el-icon><ShoppingCart /></el-icon>\n <span v-if=\"cartConfig.buttonText\" class=\"wd-datagrid__cart-text\">{{ cartConfig.buttonText }}</span>\n </el-button>\n </el-badge>\n </el-tooltip>\n </div>\n <!-- 分页 -->\n <el-pagination\n v-if=\"withPager && viewMode === 'table'\"\n class=\"wd-datagrid__pager-main\"\n :current-page=\"currentPage\"\n :page-size=\"pageSize\"\n :total=\"total\"\n :page-sizes=\"pagerPageSizes\"\n :layout=\"pagerLayout\"\n :small=\"pagerStyle === 'simple'\"\n :hide-on-single-page=\"hideOnSinglePage\"\n :background=\"true\"\n @current-change=\"onChangeCurrentpage\"\n @size-change=\"onChangePagesize\"\n />\n </div>\n\n <!-- 列设置弹层 -->\n <el-dialog v-model=\"colSettingVisible\" title=\"列设置\" width=\"360px\" append-to-body>\n <div class=\"wd-datagrid__col-tip\">勾选控制列的显示 / 隐藏,拖拽手柄可调整列顺序</div>\n <div class=\"wd-datagrid__col-setting\">\n <div\n v-for=\"col in controllableColumns\"\n :key=\"col.key\"\n class=\"wd-datagrid__col-item\"\n :class=\"{\n 'is-dragging': draggingColKey === col.key,\n 'drag-over--before': dragOverKey === col.key && dragOverPosition === 'before',\n 'drag-over--after': dragOverKey === col.key && dragOverPosition === 'after'\n }\"\n @dragover.prevent=\"onColDragOver($event, col.key)\"\n @dragleave=\"onColDragLeave(col.key)\"\n @drop.prevent=\"onColDrop(col.key)\"\n >\n <el-checkbox\n class=\"wd-datagrid__col-checkbox\"\n :model-value=\"col.visible\"\n @update:model-value=\"(v: boolean) => setColumnVisible(col.key, v)\"\n >\n {{ col.label }}\n </el-checkbox>\n <span\n class=\"wd-datagrid__col-handle\"\n draggable=\"true\"\n title=\"拖拽调整顺序\"\n @dragstart=\"onColDragStart($event, col.key)\"\n @dragend=\"onColDragEnd\"\n >\n <el-icon><Rank /></el-icon>\n </span>\n </div>\n </div>\n <template #footer>\n <el-button @click=\"resetColumns()\">恢复默认</el-button>\n <el-button type=\"primary\" @click=\"colSettingVisible = false\">完成</el-button>\n </template>\n </el-dialog>\n\n <!-- 跨页选择「购物车」查看面板 -->\n <component\n :is=\"cartConfig.type === 'drawer' ? 'el-drawer' : 'el-dialog'\"\n v-model=\"cartVisible\"\n :title=\"String(cartConfig.title || '已选数据').replace('{count}', String(cartList.length))\"\n :width=\"cartConfig.size\"\n append-to-body\n >\n <slot name=\"cart-content\" :list=\"cartList\" :remove=\"removeCartRow\" :clear=\"clearCart\">\n <el-empty v-if=\"!cartList.length\" description=\"暂无已选数据\" :image-size=\"80\" />\n <div v-else class=\"wd-datagrid__cart-list\">\n <div v-for=\"(row, idx) in cartList\" :key=\"idx\" class=\"wd-datagrid__cart-item\">\n <span class=\"wd-datagrid__cart-name\">{{ row.name || row.title || cartKeyLabel(row) }}</span>\n <el-button v-if=\"cartConfig.showRemove !== false\" link type=\"danger\" size=\"small\" @click=\"removeCartRow(row)\">\n 移除\n </el-button>\n </div>\n </div>\n </slot>\n <template v-if=\"cartConfig.showClear !== false\" #footer>\n <el-button type=\"danger\" @click=\"clearCart\">清空</el-button>\n </template>\n </component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots, watch, nextTick, defineComponent, type VNode, type PropType } from 'vue'\nimport { Plus, Download, Refresh, Setting, ScaleToOriginal, Grid, Menu, ShoppingCart, Rank } from '@element-plus/icons-vue'\nimport { useDataGrid } from '../../../lib/composables/useDataGrid'\nimport { registerDataGrid } from '../../../lib/core/linkage'\nimport { getGlobalConfig } from '../../../lib/core/config'\nimport { safeJsonParse } from '../../../lib/core/utils'\nimport { useColumnSettings, orderColumnVnodes } from './useColumnSettings'\n\ndefineOptions({ name: 'WdDataGrid' })\n\n/**\n * 列渲染器:把默认插槽里的 el-table-column vnode 渲染进 el-table。\n * 用函数式组件透传 vnode,保留插槽上下文({ row, column, $index })。\n */\nconst ColumnRenderer = defineComponent({\n name: 'WdColumnRenderer',\n props: {\n vnodes: { type: Array as PropType<VNode[]>, default: () => [] }\n },\n render() {\n return this.vnodes\n }\n})\n\nconst props = defineProps({\n // 数据源\n api: { type: String, default: '' },\n apiMethod: { type: String as PropType<'get' | 'post' | 'put' | 'delete'>, default: 'post' },\n apiParam: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\n active: { type: Boolean, default: false },\n /** 静态数据(数组) */\n dataSource: { type: [Array, Object] as PropType<any[] | any>, default: undefined },\n // 分页 / 搜索 / 模式\n withPager: { type: Boolean, default: true },\n withSearch: { type: Boolean, default: false },\n modeSwitch: { type: Boolean, default: false },\n dynamicColumn: { type: Boolean, default: false },\n columnStorageKey: { type: String, default: '' },\n // 表格展示\n fix: { type: Boolean, default: true },\n border: { type: Boolean, default: false },\n stripe: { type: Boolean, default: false },\n /**\n * 高度模式:缺省内容自适应(数据多少就多高);\n * 'fix' —— 贴合最近一个有确定高度 / 可滚动的祖先容器(顶部取自身位置、底部贴其内容区底),\n * 数据超出在行区内滚动、表头固定;祖先无定高 / 滚动约束时退化为内容自适应;\n * 数字 / CSS 长度(如 '520px')—— 表格固定高度,行区内滚动。\n */\n height: { type: [String, Number] as PropType<string | number>, default: undefined },\n autoHeight: { type: Boolean, default: false },\n rowKey: { type: String, default: '' },\n tableSize: { type: String as PropType<'large' | 'default' | 'small'>, default: 'default' },\n pagerStyle: { type: String as PropType<'simple' | 'normal' | 'full'>, default: 'normal' },\n /** 分页在底栏的水平位置:left/center/right;缺省走全局配置 page.pager.position(默认 right) */\n pagerPosition: { type: String as PropType<'left' | 'center' | 'right'>, default: '' },\n withIndex: { type: Boolean, default: true },\n withSelection: { type: Boolean, default: false },\n // 行合并\n rowspanKey: { type: String, default: '' },\n rowspanColumn: { type: Array as PropType<string[]>, default: () => [] },\n // 树形\n treeProps: { type: Object, default: () => ({ children: 'children', hasChildren: 'hasChildren' }) },\n defaultExpandAll: { type: Boolean, default: false },\n // selection v-model\n modelValue: { type: Array as PropType<any[]>, default: () => [] },\n /**\n * 选中项返回:默认返回完整行对象数组;如果设置 selectionKey,则返回对应字段值数组\n */\n selectionKey: { type: String, default: '' },\n // tools\n tools: {\n type: Object as PropType<{\n refresh?: boolean\n columnSetting?: boolean\n modeSwitch?: boolean\n size?: boolean\n /** 显示内置「新增」按钮(点击 emit add) */\n add?: boolean\n /** 显示内置「导出」按钮(点击 emit export) */\n export?: boolean\n /** 右侧工具按钮形态:round 圆角(默认)/ square 方角 / group 按钮组 */\n mode?: 'round' | 'square' | 'group'\n /** 工具按钮尺寸:large / default(默认)/ small,与 el-button 一致 */\n buttonSize?: 'large' | 'default' | 'small'\n }>,\n default: () => ({})\n },\n /**\n * 内置工具按钮组(刷新 / 大小 / 模式切换 / 列设置 / 购物车)位置:\n * left 右上左区 / right 右上右区(默认)/ bottom 底栏(与分页同一行)\n */\n toolsPosition: {\n type: String as PropType<'left' | 'right' | 'bottom'>,\n default: 'right'\n },\n /**\n * 自定义工具栏(toolbar 插槽 + 新增/导出按钮)位置:\n * left 左上左区(默认)/ right 左上右区 / bottom 底栏(与分页同一行)\n */\n toolbarPosition: {\n type: String as PropType<'left' | 'right' | 'bottom'>,\n default: 'left'\n },\n /** 内置操作列配置(渲染行操作按钮,点击 emit row-action) */\n rowActions: {\n type: Array as PropType<Array<{ text: string; command?: string; type?: string }>>,\n default: () => []\n },\n // 跨页选择「购物车」\n withSelectionCart: { type: Boolean, default: false },\n /** 购物车去重/自动回勾的唯一键字段,缺省复用 rowKey,均未配置时退化为按行对象引用比较 */\n cartRowKey: { type: String, default: '' },\n /** 购物车按钮与查看面板配置 */\n cartConfig: {\n type: Object as PropType<{\n type?: 'dialog' | 'drawer'\n title?: string\n buttonText?: string\n size?: number | string\n showClear?: boolean\n showRemove?: boolean\n }>,\n default: () => ({\n type: 'dialog',\n title: '已选数据',\n buttonText: '',\n size: 560,\n showClear: true,\n showRemove: true\n })\n },\n // 联动\n filter: { type: String, default: '' }\n})\n\nconst emit = defineEmits([\n 'add',\n 'export',\n 'row-action',\n 'page-change',\n 'selection-change',\n 'mode-change',\n 'loaded',\n 'apiBefore',\n 'apiAfter',\n 'update:modelValue',\n 'cart-change'\n])\n\nconst slots = useSlots()\nconst tableRef = ref<any>(null)\nconst viewMode = ref<'table' | 'card'>('table')\n\n// tools 配置合并默认值\nconst toolsConf = computed(() => ({\n refresh: props.tools.refresh !== false, // 默认 true\n columnSetting: props.tools.columnSetting === true, // 默认 false\n modeSwitch: props.tools.modeSwitch !== false, // 默认 true(需配合 card-item 插槽才渲染)\n size: props.tools.size !== false, // 默认 true\n add: props.tools.add === true, // 默认 false\n export: props.tools.export === true // 默认 false\n}))\n\n// 工具按钮形态:round 圆角(默认)/ square 方角 / group 按钮组\nconst toolBtnMode = computed(() => props.tools.mode || 'round')\n// 工具按钮尺寸:large / default / small(不传时跟随表格尺寸)\nconst toolBtnSize = computed<'large' | 'default' | 'small' | undefined>(() => props.tools.buttonSize || undefined)\n\nconst hasToolbar = computed(() => !!slots.toolbar)\n// 自定义工具栏组(toolbar 插槽 + 新增/导出业务按钮)\nconst hasActions = computed(() => hasToolbar.value || toolsConf.value.add || toolsConf.value.export)\n// 内置工具按钮组(刷新/大小/模式切换/列设置/购物车);modeSwitch 还需 card-item 插槽才渲染\nconst hasToolsGroup = computed(\n () =>\n toolsConf.value.refresh ||\n toolsConf.value.size ||\n ((toolsConf.value.modeSwitch || props.modeSwitch) && !!slots['card-item']) ||\n toolsConf.value.columnSetting ||\n props.dynamicColumn ||\n props.withSelectionCart\n)\n\n// 各组当前是否处于顶部 / 底部\nconst actionsAtTop = computed(() => hasActions.value && props.toolbarPosition !== 'bottom')\nconst toolsAtTop = computed(() => hasToolsGroup.value && props.toolsPosition !== 'bottom')\nconst actionsAtBottom = computed(() => hasActions.value && props.toolbarPosition === 'bottom')\nconst toolsAtBottom = computed(() => hasToolsGroup.value && props.toolsPosition === 'bottom')\n\n// 顶部工具栏:任一组位于顶部即渲染\nconst showTopToolbar = computed(() => actionsAtTop.value || toolsAtTop.value)\n// 底栏:底部分组存在时始终渲染;否则有分页时渲染(保持原有底栏)\nconst showBottomBar = computed(\n () => actionsAtBottom.value || toolsAtBottom.value || (props.withPager && viewMode.value === 'table')\n)\n\n// 兼容旧逻辑(高度计算等场景仍按 hasTools 判断)\nconst hasTools = computed(() => hasActions.value || hasToolsGroup.value)\n\n// ---------- 跨页选择「购物车」 ----------\n/** 程序化回显勾选中(购物车回勾 / modelValue 回显),屏蔽 selection-change 对外触发,避免循环 */\nlet syncingSelection = false\n\n/** 购物车暂存(跨页累计、已去重) */\nconst cartList = ref<any[]>([])\n/** 购物车查看面板开关 */\nconst cartVisible = ref(false)\n\n/** 购物车唯一键:cartRowKey 优先,缺省复用 rowKey,均未配置时退化为行对象引用(Map/数组比较均按引用) */\nfunction cartKeyOf(row: any): unknown {\n const k = props.cartRowKey || props.rowKey\n return k ? row?.[k] : row\n}\n\n/** 面板默认展示文案:name/title 优先,否则取唯一键字段值(对象引用时返回「第 N 项」) */\nfunction cartKeyLabel(row: any): string {\n const k = props.cartRowKey || props.rowKey\n if (!k) return '已选项'\n const v = row?.[k]\n return v == null ? '' : String(v)\n}\n\n/** 把当前页勾选同步进购物车:当前页未勾选的行从购物车移除,勾选行按唯一键去重并入(同 key 以后入者为准) */\nfunction syncCartFromSelection(rows: any[]) {\n const pageKeys = new Set(list.value.map((r: any) => cartKeyOf(r)))\n const kept = cartList.value.filter((c: any) => !pageKeys.has(cartKeyOf(c)))\n const merged = [...kept]\n rows.forEach((r) => {\n const k = cartKeyOf(r)\n const idx = merged.findIndex((c) => cartKeyOf(c) === k)\n if (idx >= 0) merged[idx] = r\n else merged.push(r)\n })\n const changed =\n merged.length !== cartList.value.length ||\n merged.some((c, i) => cartKeyOf(c) !== cartKeyOf(cartList.value[i]) || c !== cartList.value[i])\n if (changed) {\n cartList.value = merged\n emit('cart-change', cartList.value)\n }\n}\n\n/** 打开购物车查看面板 */\nfunction openCart() {\n cartVisible.value = true\n}\n\n/** 移除购物车中某行;若该行在当前页,同时取消勾选(经 selection 同步移除) */\nfunction removeCartRow(row: any) {\n const k = cartKeyOf(row)\n cartList.value = cartList.value.filter((c) => cartKeyOf(c) !== k)\n emit('cart-change', cartList.value)\n const table = tableRef.value\n if (table && list.value.includes(row)) table.toggleRowSelection(row, false)\n}\n\n/** 清空购物车(计数归零,面板同步;当前页勾选一并清空) */\nfunction clearCart() {\n cartList.value = []\n emit('cart-change', cartList.value)\n tableRef.value?.clearSelection?.()\n}\n\n/** 获取购物车暂存数组(跨页累计、已去重) */\nfunction getCartList() {\n return cartList.value\n}\n\n/** 列表数据刷新后:当前页数据中已在购物车的行自动回勾(增量,不清空其他勾选) */\nfunction applyCartRestore() {\n if (!props.withSelectionCart || !props.withSelection || !list.value.length || !cartList.value.length) return\n const table = tableRef.value\n if (!table) return\n syncingSelection = true\n list.value.forEach((row: any) => {\n if (cartList.value.some((c) => cartKeyOf(c) === cartKeyOf(row))) {\n table.toggleRowSelection(row, true)\n }\n })\n nextTick(() => {\n syncingSelection = false\n })\n}\n\n// 表格尺寸持久化\nconst sizeStorageKey = props.columnStorageKey ? `wd:tablesize:${props.columnStorageKey}` : ''\nconst storedSize = sizeStorageKey ? safeJsonParse(localStorage.getItem(sizeStorageKey), null) : null\nconst innerSize = ref<'large' | 'default' | 'small'>(storedSize || props.tableSize)\nwatch(\n () => props.tableSize,\n (v) => {\n if (!storedSize) innerSize.value = v\n }\n)\nfunction onSizeChange(cmd: 'large' | 'default' | 'small') {\n innerSize.value = cmd\n if (sizeStorageKey) localStorage.setItem(sizeStorageKey, JSON.stringify(cmd))\n}\n\n// ---------- 高度模式:height='fix'(贴合最近可约束祖先,而非视口) ----------\nconst rootRef = ref<HTMLElement | null>(null)\n/** fix 模式:可占用高度(祖先内容区剩余;无约束祖先时为 0 → 内容自适应) */\nconst availFixHeight = ref(0)\n/** fix 模式:表格主体高(可占用高度扣除工具栏与分页占用,行区内滚动) */\nconst fixTableHeight = ref(0)\nconst isFixMode = computed(() => props.height === 'fix')\n\n/**\n * 固定高度模式:height 传数字 / CSS 长度(非 'fix')。\n * 此时 el-table 自身取固定高度,根容器不再以 height:100% 被内容撑高,\n * 表格也不能 flex:1 拉伸覆盖其显式高度。\n */\nconst isFixedHeightMode = computed(() => {\n if (props.autoHeight) return false\n const h = props.height\n return h != null && h !== '' && h !== 'fix'\n})\n\n/** 根容器内联高:fix 且测得可占用高度时钉死为可用高度,否则内容自适应 */\nconst rootStyle = computed(() =>\n isFixMode.value && availFixHeight.value > 0 ? { height: `${availFixHeight.value}px` } : undefined\n)\n\n/** el-table height:fix → 计算表体像素高(无约束祖先时 undefined = 内容自适应);autoHeight → '100%';显式数字/CSS 长度 → 固定高 */\nconst tableHeight = computed(() => {\n if (isFixMode.value) return fixTableHeight.value > 0 ? fixTableHeight.value : undefined\n if (props.autoHeight) return '100%'\n const h = props.height\n if (h == null || h === '') return undefined\n return h as string | number\n})\n\n/**\n * 找限制高度的祖先(fix 边界):向上取最近一个有确定高度 / 最大高度 / 纵向可滚动的容器。\n * body 与 html 不视作边界(避免退回「视口口径」),找不到则返回 null(fix 退化为内容自适应)。\n */\nfunction findFixBoundary(el: HTMLElement): HTMLElement | null {\n let node: HTMLElement | null = el.parentElement\n while (node && node !== document.body && node !== document.documentElement) {\n const style = getComputedStyle(node)\n const h = parseFloat(style.height)\n const maxH = style.maxHeight === 'none' ? 0 : parseFloat(style.maxHeight)\n const overflowY = style.overflowY\n const isScroll = overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay'\n const hasBoundedHeight = (Number.isFinite(h) && h > 0) || (Number.isFinite(maxH) && maxH > 0)\n // 可滚动容器即边界;overflow:hidden 仅在自身定高/有最大高时算边界(避免包住自动高内容层)\n if (isScroll || hasBoundedHeight) return node\n node = node.parentElement\n }\n return null\n}\n\nlet fixBoundaryEl: HTMLElement | null = null\nlet fixObserver: ResizeObserver | null = null\n\n/** fix 测量:以最近可约束祖先的内容区底为下界,网格顶到该界的距离即可用高度 */\nfunction measureFixHeight() {\n const el = rootRef.value\n if (!el || !isFixMode.value) return\n const boundary = findFixBoundary(el)\n // 祖先变化时重新挂载观察器:容器尺寸变化(含弹层出现/折叠展开)自动重算\n if (fixBoundaryEl !== boundary) {\n fixObserver?.disconnect()\n fixBoundaryEl = boundary\n if (boundary && typeof ResizeObserver !== 'undefined') {\n fixObserver = new ResizeObserver(() => measureFixHeight())\n fixObserver.observe(boundary)\n }\n }\n if (!boundary) {\n // 无约束祖先:内容自适应(不撑高)\n availFixHeight.value = 0\n fixTableHeight.value = 0\n return\n }\n const style = getComputedStyle(boundary)\n const padB = parseFloat(style.paddingBottom) || 0\n const rect = boundary.getBoundingClientRect()\n const gridTop = el.getBoundingClientRect().top\n // 内容坐标口径:内容底 = clientHeight - 下内边距(+边框顶偏移),再减网格距内容顶的偏移(祖先纵向滚动用 scrollTop 补偿)\n const avail = Math.floor(boundary.clientHeight - padB + rect.top + boundary.clientTop - gridTop - boundary.scrollTop)\n if (avail <= 0) {\n availFixHeight.value = 0\n fixTableHeight.value = 0\n return\n }\n availFixHeight.value = avail\n const toolbar = el.querySelector('.wd-datagrid__toolbar') as HTMLElement | null\n const pager = el.querySelector('.wd-datagrid__pager') as HTMLElement | null\n fixTableHeight.value = Math.max(40, avail - (toolbar?.offsetHeight ?? 0) - (pager?.offsetHeight ?? 0))\n}\nfunction onViewportResize() {\n measureFixHeight()\n}\n\n// 动态切换 height='fix' 时挂/卸 resize 监听并重算\nwatch(\n () => props.height,\n (v) => {\n if (v === 'fix') {\n window.addEventListener('resize', onViewportResize)\n nextTick(measureFixHeight)\n } else {\n window.removeEventListener('resize', onViewportResize)\n fixObserver?.disconnect()\n fixObserver = null\n fixBoundaryEl = null\n }\n }\n)\n\n// 分页档位\nconst globalCfg = getGlobalConfig()\nconst pagerPageSizes = globalCfg.page.pager.pageSizes\nconst hideOnSinglePage = globalCfg.page.pager.hideOnSinglePage\nconst pagerLayout = computed(() => {\n if (props.pagerStyle === 'simple') return 'prev, pager, next'\n if (props.pagerStyle === 'full') return 'total, sizes, prev, pager, next, jumper'\n return globalCfg.page.pager.layout\n})\n// 分页位置:prop 优先,缺省走全局配置 page.pager.position(默认 right)\nconst pagerPos = computed(() => props.pagerPosition || globalCfg.page.pager.position || 'right')\n\n// 数据控制\nconst isStatic = computed(() => Array.isArray(props.dataSource))\nconst grid = useDataGrid({\n api: isStatic.value ? '' : props.api,\n apiMethod: props.apiMethod,\n apiParam: props.apiParam,\n pageSize: globalCfg.page.pager.pageSize,\n immediate: false\n})\n\nconst { list, total, loading, currentPage, pageSize, selection } = grid\n\n// 静态数据直接渲染\nwatch(\n () => props.dataSource,\n (val) => {\n if (isStatic.value) {\n list.value = val as any[]\n total.value = (val as any[]).length\n }\n },\n { immediate: true }\n)\n\n// 动态列\nconst {\n columns: colColumns,\n controllableColumns,\n hiddenKeys,\n columnOrderMap,\n settingVisible: colSettingVisible,\n init: initColumns,\n setVisible: setColumnVisible,\n reorder: reorderColumns,\n reset: resetColumns\n} = useColumnSettings(props.columnStorageKey || undefined)\n\n// ---------- 列设置:拖拽排序 ----------\nconst draggingColKey = ref('')\nconst dragOverKey = ref('')\nconst dragOverPosition = ref<'before' | 'after'>('before')\n\nfunction onColDragStart(e: DragEvent, key: string) {\n draggingColKey.value = key\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = 'move'\n // Firefox 需要 setData 才会触发拖拽\n e.dataTransfer.setData('text/plain', key)\n }\n}\n\nfunction onColDragOver(e: DragEvent, key: string) {\n if (!draggingColKey.value || draggingColKey.value === key) return\n const el = e.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n dragOverKey.value = key\n dragOverPosition.value = e.clientY - rect.top < rect.height / 2 ? 'before' : 'after'\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n}\n\nfunction onColDragLeave(key: string) {\n if (dragOverKey.value === key) dragOverKey.value = ''\n}\n\nfunction onColDrop(key: string) {\n reorderColumns(draggingColKey.value, key, dragOverPosition.value)\n onColDragEnd()\n}\n\nfunction onColDragEnd() {\n draggingColKey.value = ''\n dragOverKey.value = ''\n}\n\nconst columnVnodes = computed<VNode[]>(() => {\n const defaultSlot = slots.default\n if (!defaultSlot) return []\n const vn = defaultSlot()\n // 首次初始化列元信息\n if (!colColumns.value.length) {\n initColumns(vn)\n }\n // 先按显隐过滤,再按列设置中的顺序重排\n return orderColumnVnodes(filterColumnVnodes(vn, hiddenKeys.value), columnOrderMap.value)\n})\n\n/** 根据隐藏列 key 过滤插槽 vnode(隐藏的列不渲染) */\nfunction filterColumnVnodes(vnodes: VNode[], hidden: Set<string>): VNode[] {\n const result: VNode[] = []\n vnodes.forEach((vnode) => {\n if (!vnode || typeof vnode !== 'object') {\n if (vnode) result.push(vnode)\n return\n }\n const p = (vnode.props || {}) as Record<string, any>\n const key = String(p.prop || p.columnKey || '')\n // selection/index 列已由组件自身渲染,跳过插槽里用户重复声明的\n if (p.type === 'selection' || p.type === 'index') return\n if (key && hidden.has(key)) return\n result.push(vnode)\n })\n return result\n}\n\n// 序号\nfunction indexMethod(index: number) {\n return (currentPage.value - 1) * pageSize.value + index + 1\n}\n\n// 行合并\nfunction rowspanMethod({ row, column, rowIndex, columnIndex }: any) {\n if (!props.rowspanKey || !props.rowspanColumn.length) return { rowspan: 1, colspan: 1 }\n const prop = column.property\n if (!props.rowspanColumn.includes(prop)) return { rowspan: 1, colspan: 1 }\n const data = list.value\n const keyVal = row[props.rowspanKey]\n // 该分组第一行计算 span\n const firstIdx = data.findIndex((r) => r[props.rowspanKey] === keyVal)\n if (rowIndex === firstIdx) {\n const span = data.filter((r) => r[props.rowspanKey] === keyVal).length\n return { rowspan: span, colspan: 1 }\n }\n return { rowspan: 0, colspan: 0 }\n}\n\n// ---------- 选中项(v-model:modelValue 双向绑定,支持 selectionKey) ----------\n/** 内部选中行(完整行对象)→ 对外值:默认行数组;设置 selectionKey 时返回该字段值数组 */\nfunction selectionValue(rows: any[]): any[] {\n if (!props.selectionKey) return rows\n return rows.map((r) => r?.[props.selectionKey])\n}\n\n/** 依据 props.modelValue 回显勾选对应行(从非空→空时清空勾选;初始/未使用 v-model 时不干预) */\nfunction applySelectionFromModel(mv?: any[], ov?: any[]) {\n if (mv === undefined) mv = props.modelValue\n // 空 → 空:跳过(未使用 v-model 或初始未设置选中,不干预用户选择)\n if ((!mv || mv.length === 0) && (!ov || ov.length === 0)) return\n const table = tableRef.value\n if (!table) return\n // 与当前内部选择一致则跳过,避免用户勾选→父回传→再次触发造成抖动\n const current = selectionValue(grid.getSelection())\n if (current.length === mv.length && mv.every((v) => current.includes(v))) return\n\n syncingSelection = true\n table.clearSelection()\n if (mv && mv.length) {\n const targets = props.selectionKey\n ? list.value.filter((r: any) => mv.includes(r?.[props.selectionKey]))\n : list.value.filter((r: any) => mv.includes(r))\n targets.forEach((r: any) => table.toggleRowSelection(r, true))\n }\n nextTick(() => {\n syncingSelection = false\n })\n}\n\n// modelValue 变化或数据刷新后,回显勾选\nwatch(\n () => props.modelValue,\n (nv, ov) => {\n applySelectionFromModel(nv as any[], ov as any[])\n },\n { deep: true }\n)\nwatch(\n () => list.value,\n () => {\n if (!syncingSelection) applySelectionFromModel()\n // 购物车:数据刷新/翻页后回勾当前页中已暂存的行\n if (props.withSelectionCart) applyCartRestore()\n }\n)\n\n// 事件\nfunction onSelectionChange(rows: any[]) {\n grid.setSelection(rows)\n if (syncingSelection) return\n // 购物车:用户勾选变化同步进暂存(跨页累计、去重;当前页未勾选的行移出)\n if (props.withSelectionCart) syncCartFromSelection(rows)\n const value = selectionValue(rows)\n emit('selection-change', value)\n emit('update:modelValue', value)\n}\n\nfunction onChangeCurrentpage(val: number) {\n grid.onChangeCurrentpage(val)\n emit('page-change', { currentPage: val, pageSize: pageSize.value })\n}\nfunction onChangePagesize(val: number) {\n grid.onChangePagesize(val)\n emit('page-change', { currentPage: currentPage.value, pageSize: val })\n}\n\nfunction toggleMode() {\n viewMode.value = viewMode.value === 'table' ? 'card' : 'table'\n emit('mode-change', viewMode.value)\n}\n\n/** 操作列宽度:按按钮数量估算 */\nconst actionColumnWidth = computed(() => {\n const w = props.rowActions.reduce((sum, act) => sum + act.text.length * 14 + 16, 20)\n return Math.max(w, 90)\n})\n\n/** 内置操作列点击:emit row-action { row, command, text } */\nfunction onRowAction(row: any, act: { text: string; command?: string; type?: string }) {\n emit('row-action', { row, command: act.command ?? act.text, text: act.text })\n}\n\n// 对外方法\nfunction requestApi(options?: { apiParam?: Record<string, any> }) {\n if (isStatic.value) return Promise.resolve()\n return grid.fetchData(options?.apiParam).then((res) => {\n emit('loaded', res)\n })\n}\nfunction refresh() {\n if (isStatic.value) return Promise.resolve()\n return grid.fetchData().then((res) => emit('loaded', res))\n}\nfunction getSelection() {\n return selectionValue(grid.getSelection())\n}\nfunction clearSelection() {\n tableRef.value?.clearSelection?.()\n grid.clearSelection()\n}\n/** 搜索面板联动:带搜索参数查询(重置到第一页) */\nfunction search(params?: Record<string, any>) {\n if (isStatic.value) return Promise.resolve()\n currentPage.value = 1\n return grid.fetchData(params).then((res) => emit('loaded', res))\n}\n/** 重置搜索并刷新 */\nfunction resetSearch() {\n return grid.reset()\n}\n\ndefineExpose({\n requestApi,\n refresh,\n onChangePagesize,\n onChangeCurrentpage,\n getSelection,\n clearSelection,\n search,\n resetSearch,\n getCartList,\n clearCart,\n tableRef\n})\n\n// 注册到联动中心\nlet unregister: (() => void) | null = null\nonMounted(() => {\n unregister = registerDataGrid({\n filter: props.filter,\n refresh: () => refresh(),\n search: (params?: Record<string, any>) => search(params),\n resetSearch: () => resetSearch()\n })\n if (props.active && !isStatic.value) {\n requestApi()\n }\n if (isFixMode.value) {\n window.addEventListener('resize', onViewportResize)\n measureFixHeight()\n }\n // 静态数据在 setup 阶段已就绪,挂载后补一次选中回显\n applySelectionFromModel()\n})\nonBeforeUnmount(() => {\n window.removeEventListener('resize', onViewportResize)\n fixObserver?.disconnect()\n fixObserver = null\n fixBoundaryEl = null\n unregister?.()\n})\n\n// api 变化自动重载\nwatch(\n () => [props.api, props.apiMethod],\n () => {\n if (props.active && !isStatic.value) requestApi()\n }\n)\n</script>\n\n<style scoped>\n.wd-datagrid {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--wd-bg-color, #fff);\n}\n.wd-datagrid--auto-height {\n height: 100%;\n}\n/*\n * 固定高度模式(height 传数字 / CSS 长度):\n * 根容器高度由「工具栏 + 固定高表格 + 分页」自然拼成,不能保持 height:100%\n * (父级无定高时 height:100% 退化为 auto,会被 flex:1 的表格反向撑高)。\n */\n.wd-datagrid--fixed-height {\n height: auto;\n}\n.wd-datagrid__toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--wd-spacing-base, 12px);\n padding: 0 0 var(--wd-spacing-base, 12px);\n flex-wrap: wrap;\n}\n/* 功能区与左区按钮紧凑排布:按钮自身间距交由容器 gap 控制 */\n.wd-datagrid__toolbar :deep(.el-button + .el-button) {\n margin-left: 0;\n}\n.wd-datagrid__toolbar :deep(.el-button .el-icon) {\n font-size: 16px;\n}\n.wd-datagrid__toolbar-group,\n.wd-datagrid__bottom-group {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}\n.wd-datagrid__toolbar-left {\n gap: 8px;\n}\n.wd-datagrid__toolbar-right {\n gap: 6px;\n margin-left: auto;\n}\n/* 顶栏分组对齐:order 决定左/右视觉次序;置右组用 margin-left:auto 右推。\n 多个置右组相邻时仅首个右推,后续组 margin 归零紧贴,避免两个 auto 平分剩余空间把第一组停在中间 */\n.wd-datagrid__toolbar-group.at-left {\n order: 1;\n margin-left: 0;\n}\n.wd-datagrid__toolbar-group.at-right {\n order: 2;\n margin-left: auto;\n}\n.wd-datagrid__toolbar-group.at-right + .at-right {\n margin-left: 0;\n}\n/* 方角模式:图标按钮为直角正方形,宽高跟随尺寸切换(带文字的购物车按钮除外) */\n.wd-datagrid__toolbar-group.is-square :deep(.el-button) {\n border-radius: 0;\n}\n.wd-datagrid__toolbar-group.is-square :deep(.el-button:not(.wd-datagrid__cart-btn--text)) {\n padding: 0;\n width: var(--el-button-size, 32px);\n}\n/* 按钮组模式:按钮粘连成组,仅首尾保留圆角 */\n.wd-datagrid__toolbar-group.is-group {\n gap: 0;\n}\n.wd-datagrid__toolbar-group.is-group > *:not(:first-child) {\n margin-left: -1px;\n}\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:not(.wd-datagrid__cart-btn--text)) {\n padding: 0;\n width: var(--el-button-size, 32px);\n}\n/* 中间按钮直角:覆盖「按钮是直接子」与「按钮被 dropdown/badge 包裹」两种结构 */\n.wd-datagrid__toolbar-group.is-group > :deep(.el-button:not(:first-child)),\n.wd-datagrid__toolbar-group.is-group > *:not(:first-child) :deep(.el-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.wd-datagrid__toolbar-group.is-group > :deep(.el-button:not(:last-child)),\n.wd-datagrid__toolbar-group.is-group > *:not(:last-child) :deep(.el-button) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n/* hover/focus 时提升层级,显示完整边框 */\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:hover),\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:focus) {\n position: relative;\n z-index: 1;\n}\n\n/* 移除对el-badge的所有自定义样式覆盖,使用Element Plus默认样式 */\n.wd-datagrid__toolbar-group :deep(.el-badge) {\n /* 不覆盖任何样式,保留默认 */\n}\n.wd-datagrid__cart-btn {\n /* 保持默认位置,不干扰badge定位 */\n}\n.wd-datagrid__table {\n flex: 1;\n min-height: 0;\n}\n/* 固定高度模式下 el-table 自带显式高度,禁止 flex:1 拉伸覆盖该高度 */\n.wd-datagrid--fixed-height .wd-datagrid__table {\n flex: none;\n}\n.wd-datagrid__pager {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wd-spacing-base, 12px);\n /* 底部组与分页合并同一行:不换行,内容过宽时横向滚动 */\n flex-wrap: nowrap;\n overflow-x: auto;\n padding-top: var(--wd-spacing-base, 12px);\n}\n/* 底部工具组与自定义组:图标按钮紧凑排布、内部不换行 */\n.wd-datagrid__bottom-group {\n gap: 6px;\n flex-wrap: nowrap;\n flex-shrink: 0;\n}\n.wd-datagrid__bottom-actions {\n gap: 8px;\n}\n.wd-datagrid__bottom-group :deep(.el-button + .el-button) {\n margin-left: 0;\n}\n.wd-datagrid__bottom-group :deep(.el-button .el-icon) {\n font-size: 16px;\n}\n/* 分页:默认 right——无任何底部组时单独靠右;有底部组时也保持推到行尾 */\n.wd-datagrid__pager-main {\n margin-left: auto;\n}\n/* 分页位置 left:分页贴左(DOM 在底部组之后,用 order 提前),后续底部组被 margin-right:auto 推到行尾 */\n.wd-datagrid__bottom-bar.pager-at-left .wd-datagrid__pager-main {\n order: -1;\n margin-left: 0;\n margin-right: auto;\n}\n/* 分页位置 center:两侧 auto margin 平分剩余空间居中(flex 中 auto margin 优先于 justify-content);有底部组时组靠左、分页在剩余空间居中 */\n.wd-datagrid__bottom-bar.pager-at-center .wd-datagrid__pager-main {\n margin-right: auto;\n}\n.wd-datagrid__cards {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n.wd-datagrid__card {\n border: 1px solid var(--wd-border-color-light, #e4e7ed);\n border-radius: var(--wd-radius-base, 4px);\n padding: var(--wd-spacing-base, 12px);\n margin-bottom: var(--wd-spacing-base, 12px);\n}\n.wd-datagrid__card-title {\n font-weight: 600;\n font-size: var(--wd-font-size-large, 16px);\n color: var(--wd-text-color-primary, #303133);\n margin-bottom: 8px;\n}\n.wd-datagrid__card-line {\n display: flex;\n font-size: var(--wd-font-size-base, 14px);\n line-height: 1.8;\n}\n.wd-datagrid__card-label {\n width: 110px;\n color: var(--wd-text-color-secondary, #909399);\n flex-shrink: 0;\n}\n.wd-datagrid__card-value {\n color: var(--wd-text-color-regular, #606266);\n word-break: break-all;\n}\n.wd-datagrid__col-tip {\n margin-bottom: 8px;\n font-size: var(--wd-font-size-small, 12px);\n color: var(--wd-text-color-secondary, #909399);\n}\n.wd-datagrid__col-setting {\n max-height: 400px;\n overflow: auto;\n}\n.wd-datagrid__col-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--wd-border-color-light, #f0f0f0);\n border-radius: 4px;\n transition: background-color 0.15s;\n}\n.wd-datagrid__col-item:hover {\n background-color: var(--wd-fill-color-light, #f5f7fa);\n}\n.wd-datagrid__col-handle {\n display: inline-flex;\n align-items: center;\n cursor: grab;\n color: var(--wd-text-color-placeholder, #a8abb2);\n touch-action: none;\n}\n.wd-datagrid__col-handle:active {\n cursor: grabbing;\n}\n.wd-datagrid__col-checkbox {\n flex: 1;\n}\n/* 正在拖拽的源行 */\n.wd-datagrid__col-item.is-dragging {\n opacity: 0.45;\n}\n/* 放置位置指示线 */\n.wd-datagrid__col-item.drag-over--before::before,\n.wd-datagrid__col-item.drag-over--after::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background-color: var(--el-color-primary, #409eff);\n pointer-events: none;\n}\n.wd-datagrid__col-item.drag-over--before::before {\n top: -1px;\n}\n.wd-datagrid__col-item.drag-over--after::after {\n bottom: -1px;\n}\n</style>\n"],"names":["ColumnRenderer","defineComponent","props","__props","emit","__emit","slots","useSlots","tableRef","ref","viewMode","toolsConf","computed","toolBtnMode","toolBtnSize","hasToolbar","hasActions","hasToolsGroup","actionsAtTop","toolsAtTop","actionsAtBottom","toolsAtBottom","showTopToolbar","showBottomBar","syncingSelection","cartList","cartVisible","cartKeyOf","row","k","cartKeyLabel","v","syncCartFromSelection","rows","pageKeys","list","r","merged","c","idx","i","openCart","removeCartRow","table","clearCart","_b","_a","getCartList","applyCartRestore","nextTick","sizeStorageKey","storedSize","safeJsonParse","innerSize","watch","onSizeChange","cmd","rootRef","availFixHeight","fixTableHeight","isFixMode","isFixedHeightMode","h","rootStyle","tableHeight","findFixBoundary","el","node","style","maxH","overflowY","isScroll","hasBoundedHeight","fixBoundaryEl","fixObserver","measureFixHeight","boundary","padB","rect","gridTop","avail","toolbar","pager","onViewportResize","globalCfg","getGlobalConfig","pagerPageSizes","hideOnSinglePage","pagerLayout","pagerPos","isStatic","grid","useDataGrid","total","loading","currentPage","pageSize","selection","val","colColumns","controllableColumns","hiddenKeys","columnOrderMap","colSettingVisible","initColumns","setColumnVisible","reorderColumns","resetColumns","useColumnSettings","draggingColKey","dragOverKey","dragOverPosition","onColDragStart","key","onColDragOver","onColDragLeave","onColDrop","onColDragEnd","columnVnodes","defaultSlot","vn","orderColumnVnodes","filterColumnVnodes","vnodes","hidden","result","vnode","p","indexMethod","index","rowspanMethod","column","rowIndex","columnIndex","prop","data","keyVal","firstIdx","selectionValue","applySelectionFromModel","mv","ov","current","nv","onSelectionChange","value","onChangeCurrentpage","onChangePagesize","toggleMode","actionColumnWidth","w","sum","act","onRowAction","requestApi","options","res","refresh","getSelection","clearSelection","search","params","resetSearch","__expose","unregister","onMounted","registerDataGrid","onBeforeUnmount","_createElementBlock","_openBlock","_hoisted_1","_normalizeClass","_renderSlot","_ctx","_unref","_createBlock","_component_el_button","_createVNode","_component_el_icon","Plus","Download","_component_el_tooltip","Refresh","_component_el_dropdown","_component_el_dropdown_menu","_component_el_dropdown_item","_cache","ScaleToOriginal","$slots","Grid","Menu","Setting","_component_el_badge","ShoppingCart","_hoisted_2","_toDisplayString","_component_el_table","_component_el_empty","_component_el_table_column","_withCtx","_Fragment","_renderList","$event","_createTextVNode","_withDirectives","_hoisted_3","_createElementVNode","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_component_el_pagination","_component_el_dialog","_hoisted_10","col","_withModifiers","_component_el_checkbox","Rank","_resolveDynamicComponent","_hoisted_13","_hoisted_14"],"mappings":"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"}
1
+ {"version":3,"file":"DataGrid-Dd7n5JM7.mjs","sources":["../../src/components/data/datagrid/DataGrid.vue"],"sourcesContent":["<template>\n <div\n ref=\"rootRef\"\n class=\"wd-datagrid\"\n :class=\"{\n 'wd-datagrid--auto-height': autoHeight,\n 'wd-datagrid--fixed-height': isFixedHeightMode\n }\"\n :style=\"rootStyle\"\n >\n <!-- 顶部工具栏:自定义组与内置工具组按各自 position 渲染到左/右 -->\n <div v-if=\"showTopToolbar\" class=\"wd-datagrid__toolbar\">\n <!-- 自定义工具栏组:toolbar 插槽 + 新增/导出 -->\n <div\n v-if=\"actionsAtTop\"\n class=\"wd-datagrid__toolbar-left wd-datagrid__toolbar-group\"\n :class=\"toolbarPosition === 'right' ? 'at-right' : 'at-left'\"\n >\n <!-- 补充按钮(开发者)始终位于最左;以下为内置业务按钮 -->\n <slot name=\"toolbar\" :selection=\"selection\" :list=\"list\" />\n <el-button v-if=\"toolsConf.add\" type=\"primary\" :size=\"toolBtnSize\" @click=\"emit('add')\">\n <el-icon><Plus /></el-icon>新增\n </el-button>\n <el-button v-if=\"toolsConf.export\" :size=\"toolBtnSize\" @click=\"emit('export')\">\n <el-icon><Download /></el-icon>导出\n </el-button>\n </div>\n <!-- 内置工具按钮组:刷新 / 大小 / 模式切换 / 列设置 / 购物车 -->\n <div\n v-if=\"toolsAtTop\"\n class=\"wd-datagrid__toolbar-right wd-datagrid__toolbar-group\"\n :class=\"[`is-${toolBtnMode}`, toolsPosition === 'left' ? 'at-left' : 'at-right']\"\n >\n <el-tooltip v-if=\"toolsConf.refresh\" content=\"刷新\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"refresh\">\n <el-icon><Refresh /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.size\" content=\"调整大小\" placement=\"top\">\n <el-dropdown trigger=\"click\" @command=\"onSizeChange\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\">\n <el-icon><ScaleToOriginal /></el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item command=\"large\" :disabled=\"innerSize === 'large'\">大</el-dropdown-item>\n <el-dropdown-item command=\"default\" :disabled=\"innerSize === 'default'\">默认</el-dropdown-item>\n <el-dropdown-item command=\"small\" :disabled=\"innerSize === 'small'\">小</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </el-tooltip>\n <el-tooltip v-if=\"(toolsConf.modeSwitch || modeSwitch) && $slots['card-item']\" content=\"表格/列表切换\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"toggleMode\">\n <el-icon><Grid v-if=\"viewMode === 'card'\" /><Menu v-else /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.columnSetting || dynamicColumn\" content=\"列设置\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"colSettingVisible = true\">\n <el-icon><Setting /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"withSelectionCart\" :content=\"cartConfig.buttonText || '已选数据'\" placement=\"top\">\n <el-badge :value=\"cartList.length\" :hidden=\"cartList.length === 0\" :max=\"999\">\n <el-button\n :circle=\"toolBtnMode === 'round' && !cartConfig.buttonText\"\n :size=\"toolBtnSize\"\n class=\"wd-datagrid__cart-btn\"\n :class=\"{ 'wd-datagrid__cart-btn--text': !!cartConfig.buttonText }\"\n @click=\"openCart\"\n >\n <el-icon><ShoppingCart /></el-icon>\n <span v-if=\"cartConfig.buttonText\" class=\"wd-datagrid__cart-text\">{{ cartConfig.buttonText }}</span>\n </el-button>\n </el-badge>\n </el-tooltip>\n </div>\n </div>\n\n <!-- 表格主体 -->\n <el-table\n v-if=\"viewMode === 'table'\"\n ref=\"tableRef\"\n v-loading=\"loading\"\n :data=\"list\"\n :size=\"innerSize\"\n :border=\"border\"\n :stripe=\"stripe\"\n :height=\"tableHeight\"\n :row-key=\"rowKey || undefined\"\n :tree-props=\"treeProps\"\n :default-expand-all=\"defaultExpandAll\"\n :span-method=\"rowspanMethod\"\n class=\"wd-datagrid__table\"\n @selection-change=\"onSelectionChange\"\n @sort-change=\"grid.changeSort\"\n >\n <el-table-column v-if=\"withSelection\" type=\"selection\" width=\"60\" align=\"center\" reserve-selection />\n <el-table-column v-if=\"withIndex\" type=\"index\" label=\"序号\" width=\"60\" align=\"center\" :index=\"indexMethod\" />\n\n <!-- 业务列:默认插槽内容(el-table-column),过滤隐藏列 -->\n <ColumnRenderer :vnodes=\"columnVnodes\" />\n\n <!-- 内置操作列(rowActions) -->\n <el-table-column\n v-if=\"rowActions.length\"\n label=\"操作\"\n :width=\"actionColumnWidth\"\n align=\"center\"\n fixed=\"right\"\n >\n <template #default=\"{ row }\">\n <el-button\n v-for=\"act in rowActions\"\n :key=\"act.command || act.text\"\n link\n size=\"small\"\n :type=\"(act.type as any) || 'primary'\"\n @click=\"onRowAction(row, act)\"\n >{{ act.text }}</el-button>\n </template>\n </el-table-column>\n\n <template #empty>\n <slot name=\"empty\">\n <el-empty :description=\"loading ? '加载中...' : '暂无数据'\" :image-size=\"80\" />\n </slot>\n </template>\n </el-table>\n\n <!-- 列表(卡片)模式 -->\n <div v-else class=\"wd-datagrid__cards\" v-loading=\"loading\">\n <el-empty v-if=\"!list.length\" description=\"暂无数据\" :image-size=\"80\" />\n <div v-for=\"(row, idx) in list\" :key=\"row[rowKey || 'id'] ?? idx\" class=\"wd-datagrid__card\">\n <slot name=\"card-item\" :row=\"row\" :index=\"idx\">\n <div class=\"wd-datagrid__card-title\">{{ row.name || row.title || `第 ${idx + 1} 项` }}</div>\n <div class=\"wd-datagrid__card-body\">\n <div v-for=\"(val, k) in row\" :key=\"k\" class=\"wd-datagrid__card-line\">\n <span class=\"wd-datagrid__card-label\">{{ k }}</span>\n <span class=\"wd-datagrid__card-value\">{{ val }}</span>\n </div>\n </div>\n </slot>\n </div>\n </div>\n\n <!-- 底部栏:置于底部的工具组/自定义组与分页合并同一行 -->\n <div\n v-if=\"showBottomBar\"\n class=\"wd-datagrid__pager wd-datagrid__bottom-bar\"\n :class=\"`pager-at-${pagerPos}`\"\n >\n <!-- 自定义工具栏组(底部):toolbar 插槽 + 新增/导出 -->\n <div v-if=\"actionsAtBottom\" class=\"wd-datagrid__bottom-group wd-datagrid__bottom-actions\">\n <slot name=\"toolbar\" :selection=\"selection\" :list=\"list\" />\n <el-button v-if=\"toolsConf.add\" type=\"primary\" :size=\"toolBtnSize\" @click=\"emit('add')\">\n <el-icon><Plus /></el-icon>新增\n </el-button>\n <el-button v-if=\"toolsConf.export\" :size=\"toolBtnSize\" @click=\"emit('export')\">\n <el-icon><Download /></el-icon>导出\n </el-button>\n </div>\n <!-- 内置工具按钮组(底部):刷新 / 大小 / 模式切换 / 列设置 / 购物车 -->\n <div\n v-if=\"toolsAtBottom\"\n class=\"wd-datagrid__bottom-group wd-datagrid__bottom-tools wd-datagrid__toolbar-group\"\n :class=\"`is-${toolBtnMode}`\"\n >\n <el-tooltip v-if=\"toolsConf.refresh\" content=\"刷新\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"refresh\">\n <el-icon><Refresh /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.size\" content=\"调整大小\" placement=\"top\">\n <el-dropdown trigger=\"click\" @command=\"onSizeChange\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\">\n <el-icon><ScaleToOriginal /></el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item command=\"large\" :disabled=\"innerSize === 'large'\">大</el-dropdown-item>\n <el-dropdown-item command=\"default\" :disabled=\"innerSize === 'default'\">默认</el-dropdown-item>\n <el-dropdown-item command=\"small\" :disabled=\"innerSize === 'small'\">小</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </el-tooltip>\n <el-tooltip v-if=\"(toolsConf.modeSwitch || modeSwitch) && $slots.list\" content=\"表格/列表切换\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"toggleMode\">\n <el-icon><Grid v-if=\"viewMode === 'card'\" /><Menu v-else /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"toolsConf.columnSetting || dynamicColumn\" content=\"列设置\" placement=\"top\">\n <el-button :circle=\"toolBtnMode === 'round'\" :size=\"toolBtnSize\" @click=\"colSettingVisible = true\">\n <el-icon><Setting /></el-icon>\n </el-button>\n </el-tooltip>\n <el-tooltip v-if=\"withSelectionCart\" :content=\"cartConfig.buttonText || '已选数据'\" placement=\"top\">\n <el-badge :value=\"cartList.length\" :hidden=\"cartList.length === 0\" :max=\"999\">\n <el-button\n :circle=\"toolBtnMode === 'round' && !cartConfig.buttonText\"\n :size=\"toolBtnSize\"\n class=\"wd-datagrid__cart-btn\"\n :class=\"{ 'wd-datagrid__cart-btn--text': !!cartConfig.buttonText }\"\n @click=\"openCart\"\n >\n <el-icon><ShoppingCart /></el-icon>\n <span v-if=\"cartConfig.buttonText\" class=\"wd-datagrid__cart-text\">{{ cartConfig.buttonText }}</span>\n </el-button>\n </el-badge>\n </el-tooltip>\n </div>\n <!-- 分页 -->\n <el-pagination\n v-if=\"withPager && viewMode === 'table'\"\n class=\"wd-datagrid__pager-main\"\n :current-page=\"currentPage\"\n :page-size=\"pageSize\"\n :total=\"total\"\n :page-sizes=\"pagerPageSizes\"\n :layout=\"pagerLayout\"\n :small=\"pagerStyle === 'simple'\"\n :hide-on-single-page=\"hideOnSinglePage\"\n :background=\"true\"\n @current-change=\"onChangeCurrentpage\"\n @size-change=\"onChangePagesize\"\n />\n </div>\n\n <!-- 列设置弹层 -->\n <el-dialog v-model=\"colSettingVisible\" title=\"列设置\" width=\"360px\" append-to-body>\n <div class=\"wd-datagrid__col-tip\">勾选控制列的显示 / 隐藏,拖拽手柄可调整列顺序</div>\n <div class=\"wd-datagrid__col-setting\">\n <div\n v-for=\"col in controllableColumns\"\n :key=\"col.key\"\n class=\"wd-datagrid__col-item\"\n :class=\"{\n 'is-dragging': draggingColKey === col.key,\n 'drag-over--before': dragOverKey === col.key && dragOverPosition === 'before',\n 'drag-over--after': dragOverKey === col.key && dragOverPosition === 'after'\n }\"\n @dragover.prevent=\"onColDragOver($event, col.key)\"\n @dragleave=\"onColDragLeave(col.key)\"\n @drop.prevent=\"onColDrop(col.key)\"\n >\n <el-checkbox\n class=\"wd-datagrid__col-checkbox\"\n :model-value=\"col.visible\"\n @update:model-value=\"(v: boolean) => setColumnVisible(col.key, v)\"\n >\n {{ col.label }}\n </el-checkbox>\n <span\n class=\"wd-datagrid__col-handle\"\n draggable=\"true\"\n title=\"拖拽调整顺序\"\n @dragstart=\"onColDragStart($event, col.key)\"\n @dragend=\"onColDragEnd\"\n >\n <el-icon><Rank /></el-icon>\n </span>\n </div>\n </div>\n <template #footer>\n <el-button @click=\"resetColumns()\">恢复默认</el-button>\n <el-button type=\"primary\" @click=\"colSettingVisible = false\">完成</el-button>\n </template>\n </el-dialog>\n\n <!-- 跨页选择「购物车」查看面板 -->\n <component\n :is=\"cartConfig.type === 'drawer' ? 'el-drawer' : 'el-dialog'\"\n v-model=\"cartVisible\"\n :title=\"String(cartConfig.title || '已选数据').replace('{count}', String(cartList.length))\"\n :width=\"cartConfig.size\"\n append-to-body\n >\n <slot name=\"cart-content\" :list=\"cartList\" :remove=\"removeCartRow\" :clear=\"clearCart\">\n <el-empty v-if=\"!cartList.length\" description=\"暂无已选数据\" :image-size=\"80\" />\n <div v-else class=\"wd-datagrid__cart-list\">\n <div v-for=\"(row, idx) in cartList\" :key=\"idx\" class=\"wd-datagrid__cart-item\">\n <span class=\"wd-datagrid__cart-name\">{{ row.name || row.title || cartKeyLabel(row) }}</span>\n <el-button v-if=\"cartConfig.showRemove !== false\" link type=\"danger\" size=\"small\" @click=\"removeCartRow(row)\">\n 移除\n </el-button>\n </div>\n </div>\n </slot>\n <template v-if=\"cartConfig.showClear !== false\" #footer>\n <el-button type=\"danger\" @click=\"clearCart\">清空</el-button>\n </template>\n </component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots, watch, nextTick, defineComponent, type VNode, type PropType } from 'vue'\nimport { Plus, Download, Refresh, Setting, ScaleToOriginal, Grid, Menu, ShoppingCart, Rank } from '@element-plus/icons-vue'\nimport { useDataGrid } from '../../../lib/composables/useDataGrid'\nimport { registerDataGrid } from '../../../lib/core/linkage'\nimport { getGlobalConfig } from '../../../lib/core/config'\nimport { safeJsonParse } from '../../../lib/core/utils'\nimport { useColumnSettings, orderColumnVnodes } from './useColumnSettings'\n\ndefineOptions({ name: 'WdDataGrid' })\n\n/**\n * 列渲染器:把默认插槽里的 el-table-column vnode 渲染进 el-table。\n * 用函数式组件透传 vnode,保留插槽上下文({ row, column, $index })。\n */\nconst ColumnRenderer = defineComponent({\n name: 'WdColumnRenderer',\n props: {\n vnodes: { type: Array as PropType<VNode[]>, default: () => [] }\n },\n render() {\n return this.vnodes\n }\n})\n\nconst props = defineProps({\n // 数据源\n api: { type: String, default: '' },\n apiMethod: { type: String as PropType<'get' | 'post' | 'put' | 'delete'>, default: 'post' },\n apiParam: { type: Object as PropType<Record<string, any>>, default: () => ({}) },\n active: { type: Boolean, default: false },\n /** 静态数据(数组) */\n dataSource: { type: [Array, Object] as PropType<any[] | any>, default: undefined },\n // 分页 / 搜索 / 模式\n withPager: { type: Boolean, default: true },\n withSearch: { type: Boolean, default: false },\n modeSwitch: { type: Boolean, default: false },\n dynamicColumn: { type: Boolean, default: false },\n columnStorageKey: { type: String, default: '' },\n // 表格展示\n fix: { type: Boolean, default: true },\n border: { type: Boolean, default: false },\n stripe: { type: Boolean, default: false },\n /**\n * 高度模式:缺省内容自适应(数据多少就多高);\n * 'fix' —— 贴合最近一个有确定高度 / 可滚动的祖先容器(顶部取自身位置、底部贴其内容区底),\n * 数据超出在行区内滚动、表头固定;祖先无定高 / 滚动约束时退化为内容自适应;\n * 数字 / CSS 长度(如 '520px')—— 表格固定高度,行区内滚动。\n */\n height: { type: [String, Number] as PropType<string | number>, default: undefined },\n autoHeight: { type: Boolean, default: false },\n rowKey: { type: String, default: '' },\n tableSize: { type: String as PropType<'large' | 'default' | 'small'>, default: 'default' },\n pagerStyle: { type: String as PropType<'simple' | 'normal' | 'full'>, default: 'normal' },\n /** 分页在底栏的水平位置:left/center/right;缺省走全局配置 page.pager.position(默认 right) */\n pagerPosition: { type: String as PropType<'left' | 'center' | 'right'>, default: '' },\n withIndex: { type: Boolean, default: true },\n withSelection: { type: Boolean, default: false },\n // 行合并\n rowspanKey: { type: String, default: '' },\n rowspanColumn: { type: Array as PropType<string[]>, default: () => [] },\n // 树形\n treeProps: { type: Object, default: () => ({ children: 'children', hasChildren: 'hasChildren' }) },\n defaultExpandAll: { type: Boolean, default: false },\n // selection v-model\n modelValue: { type: Array as PropType<any[]>, default: () => [] },\n /**\n * 选中项返回:默认返回完整行对象数组;如果设置 selectionKey,则返回对应字段值数组\n */\n selectionKey: { type: String, default: '' },\n // tools\n tools: {\n type: Object as PropType<{\n refresh?: boolean\n columnSetting?: boolean\n modeSwitch?: boolean\n size?: boolean\n /** 显示内置「新增」按钮(点击 emit add) */\n add?: boolean\n /** 显示内置「导出」按钮(点击 emit export) */\n export?: boolean\n /** 右侧工具按钮形态:round 圆角(默认)/ square 方角 / group 按钮组 */\n mode?: 'round' | 'square' | 'group'\n /** 工具按钮尺寸:large / default(默认)/ small,与 el-button 一致 */\n buttonSize?: 'large' | 'default' | 'small'\n }>,\n default: () => ({})\n },\n /**\n * 内置工具按钮组(刷新 / 大小 / 模式切换 / 列设置 / 购物车)位置:\n * left 右上左区 / right 右上右区(默认)/ bottom 底栏(与分页同一行)\n */\n toolsPosition: {\n type: String as PropType<'left' | 'right' | 'bottom'>,\n default: 'right'\n },\n /**\n * 自定义工具栏(toolbar 插槽 + 新增/导出按钮)位置:\n * left 左上左区(默认)/ right 左上右区 / bottom 底栏(与分页同一行)\n */\n toolbarPosition: {\n type: String as PropType<'left' | 'right' | 'bottom'>,\n default: 'left'\n },\n /** 内置操作列配置(渲染行操作按钮,点击 emit row-action) */\n rowActions: {\n type: Array as PropType<Array<{ text: string; command?: string; type?: string }>>,\n default: () => []\n },\n // 跨页选择「购物车」\n withSelectionCart: { type: Boolean, default: false },\n /** 购物车去重/自动回勾的唯一键字段,缺省复用 rowKey,均未配置时退化为按行对象引用比较 */\n cartRowKey: { type: String, default: '' },\n /** 购物车按钮与查看面板配置 */\n cartConfig: {\n type: Object as PropType<{\n type?: 'dialog' | 'drawer'\n title?: string\n buttonText?: string\n size?: number | string\n showClear?: boolean\n showRemove?: boolean\n }>,\n default: () => ({\n type: 'dialog',\n title: '已选数据',\n buttonText: '',\n size: 560,\n showClear: true,\n showRemove: true\n })\n },\n // 联动\n filter: { type: String, default: '' }\n})\n\nconst emit = defineEmits([\n 'add',\n 'export',\n 'row-action',\n 'page-change',\n 'selection-change',\n 'mode-change',\n 'loaded',\n 'apiBefore',\n 'apiAfter',\n 'update:modelValue',\n 'cart-change'\n])\n\nconst slots = useSlots()\nconst tableRef = ref<any>(null)\nconst viewMode = ref<'table' | 'card'>('table')\n\n// tools 配置合并默认值\nconst toolsConf = computed(() => ({\n refresh: props.tools.refresh !== false, // 默认 true\n columnSetting: props.tools.columnSetting === true, // 默认 false\n modeSwitch: props.tools.modeSwitch !== false, // 默认 true(需配合 card-item 插槽才渲染)\n size: props.tools.size !== false, // 默认 true\n add: props.tools.add === true, // 默认 false\n export: props.tools.export === true // 默认 false\n}))\n\n// 工具按钮形态:round 圆角(默认)/ square 方角 / group 按钮组\nconst toolBtnMode = computed(() => props.tools.mode || 'round')\n// 工具按钮尺寸:large / default / small(不传时跟随表格尺寸)\nconst toolBtnSize = computed<'large' | 'default' | 'small' | undefined>(() => props.tools.buttonSize || undefined)\n\nconst hasToolbar = computed(() => !!slots.toolbar)\n// 自定义工具栏组(toolbar 插槽 + 新增/导出业务按钮)\nconst hasActions = computed(() => hasToolbar.value || toolsConf.value.add || toolsConf.value.export)\n// 内置工具按钮组(刷新/大小/模式切换/列设置/购物车);modeSwitch 还需 card-item 插槽才渲染\nconst hasToolsGroup = computed(\n () =>\n toolsConf.value.refresh ||\n toolsConf.value.size ||\n ((toolsConf.value.modeSwitch || props.modeSwitch) && !!slots['card-item']) ||\n toolsConf.value.columnSetting ||\n props.dynamicColumn ||\n props.withSelectionCart\n)\n\n// 各组当前是否处于顶部 / 底部\nconst actionsAtTop = computed(() => hasActions.value && props.toolbarPosition !== 'bottom')\nconst toolsAtTop = computed(() => hasToolsGroup.value && props.toolsPosition !== 'bottom')\nconst actionsAtBottom = computed(() => hasActions.value && props.toolbarPosition === 'bottom')\nconst toolsAtBottom = computed(() => hasToolsGroup.value && props.toolsPosition === 'bottom')\n\n// 顶部工具栏:任一组位于顶部即渲染\nconst showTopToolbar = computed(() => actionsAtTop.value || toolsAtTop.value)\n// 底栏:底部分组存在时始终渲染;否则有分页时渲染(保持原有底栏)\nconst showBottomBar = computed(\n () => actionsAtBottom.value || toolsAtBottom.value || (props.withPager && viewMode.value === 'table')\n)\n\n// 兼容旧逻辑(高度计算等场景仍按 hasTools 判断)\nconst hasTools = computed(() => hasActions.value || hasToolsGroup.value)\n\n// ---------- 跨页选择「购物车」 ----------\n/** 程序化回显勾选中(购物车回勾 / modelValue 回显),屏蔽 selection-change 对外触发,避免循环 */\nlet syncingSelection = false\n\n/** 购物车暂存(跨页累计、已去重) */\nconst cartList = ref<any[]>([])\n/** 购物车查看面板开关 */\nconst cartVisible = ref(false)\n\n/** 购物车唯一键:cartRowKey 优先,缺省复用 rowKey,均未配置时退化为行对象引用(Map/数组比较均按引用) */\nfunction cartKeyOf(row: any): unknown {\n const k = props.cartRowKey || props.rowKey\n return k ? row?.[k] : row\n}\n\n/** 面板默认展示文案:name/title 优先,否则取唯一键字段值(对象引用时返回「第 N 项」) */\nfunction cartKeyLabel(row: any): string {\n const k = props.cartRowKey || props.rowKey\n if (!k) return '已选项'\n const v = row?.[k]\n return v == null ? '' : String(v)\n}\n\n/** 把当前页勾选同步进购物车:当前页未勾选的行从购物车移除,勾选行按唯一键去重并入(同 key 以后入者为准) */\nfunction syncCartFromSelection(rows: any[]) {\n const pageKeys = new Set(list.value.map((r: any) => cartKeyOf(r)))\n const kept = cartList.value.filter((c: any) => !pageKeys.has(cartKeyOf(c)))\n const merged = [...kept]\n rows.forEach((r) => {\n const k = cartKeyOf(r)\n const idx = merged.findIndex((c) => cartKeyOf(c) === k)\n if (idx >= 0) merged[idx] = r\n else merged.push(r)\n })\n const changed =\n merged.length !== cartList.value.length ||\n merged.some((c, i) => cartKeyOf(c) !== cartKeyOf(cartList.value[i]) || c !== cartList.value[i])\n if (changed) {\n cartList.value = merged\n emit('cart-change', cartList.value)\n }\n}\n\n/** 打开购物车查看面板 */\nfunction openCart() {\n cartVisible.value = true\n}\n\n/** 移除购物车中某行;若该行在当前页,同时取消勾选(经 selection 同步移除) */\nfunction removeCartRow(row: any) {\n const k = cartKeyOf(row)\n cartList.value = cartList.value.filter((c) => cartKeyOf(c) !== k)\n emit('cart-change', cartList.value)\n const table = tableRef.value\n if (table && list.value.includes(row)) table.toggleRowSelection(row, false)\n}\n\n/** 清空购物车(计数归零,面板同步;当前页勾选一并清空) */\nfunction clearCart() {\n cartList.value = []\n emit('cart-change', cartList.value)\n tableRef.value?.clearSelection?.()\n}\n\n/** 获取购物车暂存数组(跨页累计、已去重) */\nfunction getCartList() {\n return cartList.value\n}\n\n/** 列表数据刷新后:当前页数据中已在购物车的行自动回勾(增量,不清空其他勾选) */\nfunction applyCartRestore() {\n if (!props.withSelectionCart || !props.withSelection || !list.value.length || !cartList.value.length) return\n const table = tableRef.value\n if (!table) return\n syncingSelection = true\n list.value.forEach((row: any) => {\n if (cartList.value.some((c) => cartKeyOf(c) === cartKeyOf(row))) {\n table.toggleRowSelection(row, true)\n }\n })\n nextTick(() => {\n syncingSelection = false\n })\n}\n\n// 表格尺寸持久化\nconst sizeStorageKey = props.columnStorageKey ? `wd:tablesize:${props.columnStorageKey}` : ''\nconst storedSize = sizeStorageKey ? safeJsonParse(localStorage.getItem(sizeStorageKey), null) : null\nconst innerSize = ref<'large' | 'default' | 'small'>(storedSize || props.tableSize)\nwatch(\n () => props.tableSize,\n (v) => {\n if (!storedSize) innerSize.value = v\n }\n)\nfunction onSizeChange(cmd: 'large' | 'default' | 'small') {\n innerSize.value = cmd\n if (sizeStorageKey) localStorage.setItem(sizeStorageKey, JSON.stringify(cmd))\n}\n\n// ---------- 高度模式:height='fix'(贴合最近可约束祖先,而非视口) ----------\nconst rootRef = ref<HTMLElement | null>(null)\n/** fix 模式:可占用高度(祖先内容区剩余;无约束祖先时为 0 → 内容自适应) */\nconst availFixHeight = ref(0)\n/** fix 模式:表格主体高(可占用高度扣除工具栏与分页占用,行区内滚动) */\nconst fixTableHeight = ref(0)\nconst isFixMode = computed(() => props.height === 'fix')\n\n/**\n * 固定高度模式:height 传数字 / CSS 长度(非 'fix')。\n * 此时 el-table 自身取固定高度,根容器不再以 height:100% 被内容撑高,\n * 表格也不能 flex:1 拉伸覆盖其显式高度。\n */\nconst isFixedHeightMode = computed(() => {\n if (props.autoHeight) return false\n const h = props.height\n return h != null && h !== '' && h !== 'fix'\n})\n\n/** 根容器内联高:fix 且测得可占用高度时钉死为可用高度,否则内容自适应 */\nconst rootStyle = computed(() =>\n isFixMode.value && availFixHeight.value > 0 ? { height: `${availFixHeight.value}px` } : undefined\n)\n\n/** el-table height:fix → 计算表体像素高(无约束祖先时 undefined = 内容自适应);autoHeight → '100%';显式数字/CSS 长度 → 固定高 */\nconst tableHeight = computed(() => {\n if (isFixMode.value) return fixTableHeight.value > 0 ? fixTableHeight.value : undefined\n if (props.autoHeight) return '100%'\n const h = props.height\n if (h == null || h === '') return undefined\n return h as string | number\n})\n\n/**\n * 找限制高度的祖先(fix 边界):向上取最近一个有确定高度 / 最大高度 / 纵向可滚动的容器。\n * body 与 html 不视作边界(避免退回「视口口径」),找不到则返回 null(fix 退化为内容自适应)。\n */\nfunction findFixBoundary(el: HTMLElement): HTMLElement | null {\n let node: HTMLElement | null = el.parentElement\n while (node && node !== document.body && node !== document.documentElement) {\n const style = getComputedStyle(node)\n const h = parseFloat(style.height)\n const maxH = style.maxHeight === 'none' ? 0 : parseFloat(style.maxHeight)\n const overflowY = style.overflowY\n const isScroll = overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay'\n const hasBoundedHeight = (Number.isFinite(h) && h > 0) || (Number.isFinite(maxH) && maxH > 0)\n // 可滚动容器即边界;overflow:hidden 仅在自身定高/有最大高时算边界(避免包住自动高内容层)\n if (isScroll || hasBoundedHeight) return node\n node = node.parentElement\n }\n return null\n}\n\nlet fixBoundaryEl: HTMLElement | null = null\nlet fixObserver: ResizeObserver | null = null\n\n/** fix 测量:以最近可约束祖先的内容区底为下界,网格顶到该界的距离即可用高度 */\nfunction measureFixHeight() {\n const el = rootRef.value\n if (!el || !isFixMode.value) return\n const boundary = findFixBoundary(el)\n // 祖先变化时重新挂载观察器:容器尺寸变化(含弹层出现/折叠展开)自动重算\n if (fixBoundaryEl !== boundary) {\n fixObserver?.disconnect()\n fixBoundaryEl = boundary\n if (boundary && typeof ResizeObserver !== 'undefined') {\n fixObserver = new ResizeObserver(() => measureFixHeight())\n fixObserver.observe(boundary)\n }\n }\n if (!boundary) {\n // 无约束祖先:内容自适应(不撑高)\n availFixHeight.value = 0\n fixTableHeight.value = 0\n return\n }\n const style = getComputedStyle(boundary)\n const padB = parseFloat(style.paddingBottom) || 0\n const rect = boundary.getBoundingClientRect()\n const gridTop = el.getBoundingClientRect().top\n // 内容坐标口径:内容底 = clientHeight - 下内边距(+边框顶偏移),再减网格距内容顶的偏移(祖先纵向滚动用 scrollTop 补偿)\n const avail = Math.floor(boundary.clientHeight - padB + rect.top + boundary.clientTop - gridTop - boundary.scrollTop)\n if (avail <= 0) {\n availFixHeight.value = 0\n fixTableHeight.value = 0\n return\n }\n availFixHeight.value = avail\n const toolbar = el.querySelector('.wd-datagrid__toolbar') as HTMLElement | null\n const pager = el.querySelector('.wd-datagrid__pager') as HTMLElement | null\n fixTableHeight.value = Math.max(40, avail - (toolbar?.offsetHeight ?? 0) - (pager?.offsetHeight ?? 0))\n}\nfunction onViewportResize() {\n measureFixHeight()\n}\n\n// 动态切换 height='fix' 时挂/卸 resize 监听并重算\nwatch(\n () => props.height,\n (v) => {\n if (v === 'fix') {\n window.addEventListener('resize', onViewportResize)\n nextTick(measureFixHeight)\n } else {\n window.removeEventListener('resize', onViewportResize)\n fixObserver?.disconnect()\n fixObserver = null\n fixBoundaryEl = null\n }\n }\n)\n\n// 分页档位\nconst globalCfg = getGlobalConfig()\nconst pagerPageSizes = globalCfg.page.pager.pageSizes\nconst hideOnSinglePage = globalCfg.page.pager.hideOnSinglePage\nconst pagerLayout = computed(() => {\n if (props.pagerStyle === 'simple') return 'prev, pager, next'\n if (props.pagerStyle === 'full') return 'total, sizes, prev, pager, next, jumper'\n return globalCfg.page.pager.layout\n})\n// 分页位置:prop 优先,缺省走全局配置 page.pager.position(默认 right)\nconst pagerPos = computed(() => props.pagerPosition || globalCfg.page.pager.position || 'right')\n\n// 数据控制\nconst isStatic = computed(() => Array.isArray(props.dataSource))\nconst grid = useDataGrid({\n api: isStatic.value ? '' : props.api,\n apiMethod: props.apiMethod,\n apiParam: props.apiParam,\n pageSize: globalCfg.page.pager.pageSize,\n immediate: false\n})\n\nconst { list, total, loading, currentPage, pageSize, selection } = grid\n\n// 静态数据直接渲染\nwatch(\n () => props.dataSource,\n (val) => {\n if (isStatic.value) {\n list.value = val as any[]\n total.value = (val as any[]).length\n }\n },\n { immediate: true }\n)\n\n// 动态列\nconst {\n columns: colColumns,\n controllableColumns,\n hiddenKeys,\n columnOrderMap,\n settingVisible: colSettingVisible,\n init: initColumns,\n setVisible: setColumnVisible,\n reorder: reorderColumns,\n reset: resetColumns\n} = useColumnSettings(props.columnStorageKey || undefined)\n\n// ---------- 列设置:拖拽排序 ----------\nconst draggingColKey = ref('')\nconst dragOverKey = ref('')\nconst dragOverPosition = ref<'before' | 'after'>('before')\n\nfunction onColDragStart(e: DragEvent, key: string) {\n draggingColKey.value = key\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = 'move'\n // Firefox 需要 setData 才会触发拖拽\n e.dataTransfer.setData('text/plain', key)\n }\n}\n\nfunction onColDragOver(e: DragEvent, key: string) {\n if (!draggingColKey.value || draggingColKey.value === key) return\n const el = e.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n dragOverKey.value = key\n dragOverPosition.value = e.clientY - rect.top < rect.height / 2 ? 'before' : 'after'\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n}\n\nfunction onColDragLeave(key: string) {\n if (dragOverKey.value === key) dragOverKey.value = ''\n}\n\nfunction onColDrop(key: string) {\n reorderColumns(draggingColKey.value, key, dragOverPosition.value)\n onColDragEnd()\n}\n\nfunction onColDragEnd() {\n draggingColKey.value = ''\n dragOverKey.value = ''\n}\n\nconst columnVnodes = computed<VNode[]>(() => {\n const defaultSlot = slots.default\n if (!defaultSlot) return []\n const vn = defaultSlot()\n // 首次初始化列元信息\n if (!colColumns.value.length) {\n initColumns(vn)\n }\n // 先按显隐过滤,再按列设置中的顺序重排\n return orderColumnVnodes(filterColumnVnodes(vn, hiddenKeys.value), columnOrderMap.value)\n})\n\n/** 根据隐藏列 key 过滤插槽 vnode(隐藏的列不渲染) */\nfunction filterColumnVnodes(vnodes: VNode[], hidden: Set<string>): VNode[] {\n const result: VNode[] = []\n vnodes.forEach((vnode) => {\n if (!vnode || typeof vnode !== 'object') {\n if (vnode) result.push(vnode)\n return\n }\n const p = (vnode.props || {}) as Record<string, any>\n const key = String(p.prop || p.columnKey || '')\n // selection/index 列已由组件自身渲染,跳过插槽里用户重复声明的\n if (p.type === 'selection' || p.type === 'index') return\n if (key && hidden.has(key)) return\n result.push(vnode)\n })\n return result\n}\n\n// 序号\nfunction indexMethod(index: number) {\n return (currentPage.value - 1) * pageSize.value + index + 1\n}\n\n// 行合并\nfunction rowspanMethod({ row, column, rowIndex, columnIndex }: any) {\n if (!props.rowspanKey || !props.rowspanColumn.length) return { rowspan: 1, colspan: 1 }\n const prop = column.property\n if (!props.rowspanColumn.includes(prop)) return { rowspan: 1, colspan: 1 }\n const data = list.value\n const keyVal = row[props.rowspanKey]\n // 该分组第一行计算 span\n const firstIdx = data.findIndex((r) => r[props.rowspanKey] === keyVal)\n if (rowIndex === firstIdx) {\n const span = data.filter((r) => r[props.rowspanKey] === keyVal).length\n return { rowspan: span, colspan: 1 }\n }\n return { rowspan: 0, colspan: 0 }\n}\n\n// ---------- 选中项(v-model:modelValue 双向绑定,支持 selectionKey) ----------\n/** 内部选中行(完整行对象)→ 对外值:默认行数组;设置 selectionKey 时返回该字段值数组 */\nfunction selectionValue(rows: any[]): any[] {\n if (!props.selectionKey) return rows\n return rows.map((r) => r?.[props.selectionKey])\n}\n\n/** 依据 props.modelValue 回显勾选对应行(从非空→空时清空勾选;初始/未使用 v-model 时不干预) */\nfunction applySelectionFromModel(mv?: any[], ov?: any[]) {\n if (mv === undefined) mv = props.modelValue\n // 空 → 空:跳过(未使用 v-model 或初始未设置选中,不干预用户选择)\n if ((!mv || mv.length === 0) && (!ov || ov.length === 0)) return\n const table = tableRef.value\n if (!table) return\n // 与当前内部选择一致则跳过,避免用户勾选→父回传→再次触发造成抖动\n const current = selectionValue(grid.getSelection())\n if (current.length === mv.length && mv.every((v) => current.includes(v))) return\n\n syncingSelection = true\n table.clearSelection()\n if (mv && mv.length) {\n const targets = props.selectionKey\n ? list.value.filter((r: any) => mv.includes(r?.[props.selectionKey]))\n : list.value.filter((r: any) => mv.includes(r))\n targets.forEach((r: any) => table.toggleRowSelection(r, true))\n }\n nextTick(() => {\n syncingSelection = false\n })\n}\n\n// modelValue 变化或数据刷新后,回显勾选\nwatch(\n () => props.modelValue,\n (nv, ov) => {\n applySelectionFromModel(nv as any[], ov as any[])\n },\n { deep: true }\n)\nwatch(\n () => list.value,\n () => {\n if (!syncingSelection) applySelectionFromModel()\n // 购物车:数据刷新/翻页后回勾当前页中已暂存的行\n if (props.withSelectionCart) applyCartRestore()\n }\n)\n\n// 事件\nfunction onSelectionChange(rows: any[]) {\n grid.setSelection(rows)\n if (syncingSelection) return\n // 购物车:用户勾选变化同步进暂存(跨页累计、去重;当前页未勾选的行移出)\n if (props.withSelectionCart) syncCartFromSelection(rows)\n const value = selectionValue(rows)\n emit('selection-change', value)\n emit('update:modelValue', value)\n}\n\nfunction onChangeCurrentpage(val: number) {\n grid.onChangeCurrentpage(val)\n emit('page-change', { currentPage: val, pageSize: pageSize.value })\n}\nfunction onChangePagesize(val: number) {\n grid.onChangePagesize(val)\n emit('page-change', { currentPage: currentPage.value, pageSize: val })\n}\n\nfunction toggleMode() {\n viewMode.value = viewMode.value === 'table' ? 'card' : 'table'\n emit('mode-change', viewMode.value)\n}\n\n/** 操作列宽度:按按钮数量估算 */\nconst actionColumnWidth = computed(() => {\n const w = props.rowActions.reduce((sum, act) => sum + act.text.length * 14 + 16, 20)\n return Math.max(w, 90)\n})\n\n/** 内置操作列点击:emit row-action { row, command, text } */\nfunction onRowAction(row: any, act: { text: string; command?: string; type?: string }) {\n emit('row-action', { row, command: act.command ?? act.text, text: act.text })\n}\n\n// 对外方法\nfunction requestApi(options?: { apiParam?: Record<string, any> }) {\n if (isStatic.value) return Promise.resolve()\n return grid.fetchData(options?.apiParam).then((res) => {\n emit('loaded', res)\n })\n}\nfunction refresh() {\n if (isStatic.value) return Promise.resolve()\n return grid.fetchData().then((res) => emit('loaded', res))\n}\nfunction getSelection() {\n return selectionValue(grid.getSelection())\n}\nfunction clearSelection() {\n tableRef.value?.clearSelection?.()\n grid.clearSelection()\n}\n/** 搜索面板联动:带搜索参数查询(重置到第一页) */\nfunction search(params?: Record<string, any>) {\n if (isStatic.value) return Promise.resolve()\n currentPage.value = 1\n return grid.fetchData(params).then((res) => emit('loaded', res))\n}\n/** 重置搜索并刷新 */\nfunction resetSearch() {\n return grid.reset()\n}\n\ndefineExpose({\n requestApi,\n refresh,\n onChangePagesize,\n onChangeCurrentpage,\n getSelection,\n clearSelection,\n search,\n resetSearch,\n getCartList,\n clearCart,\n tableRef\n})\n\n// 注册到联动中心\nlet unregister: (() => void) | null = null\nonMounted(() => {\n unregister = registerDataGrid({\n filter: props.filter,\n refresh: () => refresh(),\n search: (params?: Record<string, any>) => search(params),\n resetSearch: () => resetSearch()\n })\n if (props.active && !isStatic.value) {\n requestApi()\n }\n if (isFixMode.value) {\n window.addEventListener('resize', onViewportResize)\n measureFixHeight()\n }\n // 静态数据在 setup 阶段已就绪,挂载后补一次选中回显\n applySelectionFromModel()\n})\nonBeforeUnmount(() => {\n window.removeEventListener('resize', onViewportResize)\n fixObserver?.disconnect()\n fixObserver = null\n fixBoundaryEl = null\n unregister?.()\n})\n\n// api 变化自动重载\nwatch(\n () => [props.api, props.apiMethod],\n () => {\n if (props.active && !isStatic.value) requestApi()\n }\n)\n</script>\n\n<style scoped>\n.wd-datagrid {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--wd-bg-color, #fff);\n}\n.wd-datagrid--auto-height {\n height: 100%;\n}\n/*\n * 固定高度模式(height 传数字 / CSS 长度):\n * 根容器高度由「工具栏 + 固定高表格 + 分页」自然拼成,不能保持 height:100%\n * (父级无定高时 height:100% 退化为 auto,会被 flex:1 的表格反向撑高)。\n */\n.wd-datagrid--fixed-height {\n height: auto;\n}\n.wd-datagrid__toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--wd-spacing-base, 12px);\n padding: 0 0 var(--wd-spacing-base, 12px);\n flex-wrap: wrap;\n}\n/* 功能区与左区按钮紧凑排布:按钮自身间距交由容器 gap 控制 */\n.wd-datagrid__toolbar :deep(.el-button + .el-button) {\n margin-left: 0;\n}\n.wd-datagrid__toolbar :deep(.el-button .el-icon) {\n font-size: 16px;\n}\n.wd-datagrid__toolbar-group,\n.wd-datagrid__bottom-group {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}\n.wd-datagrid__toolbar-left {\n gap: 8px;\n}\n.wd-datagrid__toolbar-right {\n gap: 6px;\n margin-left: auto;\n}\n/* 顶栏分组对齐:order 决定左/右视觉次序;置右组用 margin-left:auto 右推。\n 多个置右组相邻时仅首个右推,后续组 margin 归零紧贴,避免两个 auto 平分剩余空间把第一组停在中间 */\n.wd-datagrid__toolbar-group.at-left {\n order: 1;\n margin-left: 0;\n}\n.wd-datagrid__toolbar-group.at-right {\n order: 2;\n margin-left: auto;\n}\n.wd-datagrid__toolbar-group.at-right + .at-right {\n margin-left: 0;\n}\n/* 方角模式:图标按钮为直角正方形,宽高跟随尺寸切换(带文字的购物车按钮除外) */\n.wd-datagrid__toolbar-group.is-square :deep(.el-button) {\n border-radius: 0;\n}\n.wd-datagrid__toolbar-group.is-square :deep(.el-button:not(.wd-datagrid__cart-btn--text)) {\n padding: 0;\n width: var(--el-button-size, 32px);\n}\n/* 按钮组模式:按钮粘连成组,仅首尾保留圆角 */\n.wd-datagrid__toolbar-group.is-group {\n gap: 0;\n}\n.wd-datagrid__toolbar-group.is-group > *:not(:first-child) {\n margin-left: -1px;\n}\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:not(.wd-datagrid__cart-btn--text)) {\n padding: 0;\n width: var(--el-button-size, 32px);\n}\n/* 中间按钮直角:覆盖「按钮是直接子」与「按钮被 dropdown/badge 包裹」两种结构 */\n.wd-datagrid__toolbar-group.is-group > :deep(.el-button:not(:first-child)),\n.wd-datagrid__toolbar-group.is-group > *:not(:first-child) :deep(.el-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.wd-datagrid__toolbar-group.is-group > :deep(.el-button:not(:last-child)),\n.wd-datagrid__toolbar-group.is-group > *:not(:last-child) :deep(.el-button) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n/* hover/focus 时提升层级,显示完整边框 */\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:hover),\n.wd-datagrid__toolbar-group.is-group :deep(.el-button:focus) {\n position: relative;\n z-index: 1;\n}\n\n/* 移除对el-badge的所有自定义样式覆盖,使用Element Plus默认样式 */\n.wd-datagrid__toolbar-group :deep(.el-badge) {\n /* 不覆盖任何样式,保留默认 */\n}\n.wd-datagrid__cart-btn {\n /* 保持默认位置,不干扰badge定位 */\n}\n.wd-datagrid__table {\n flex: 1;\n min-height: 0;\n}\n/* 固定高度模式下 el-table 自带显式高度,禁止 flex:1 拉伸覆盖该高度 */\n.wd-datagrid--fixed-height .wd-datagrid__table {\n flex: none;\n}\n.wd-datagrid__pager {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wd-spacing-base, 12px);\n /* 底部组与分页合并同一行:不换行,内容过宽时横向滚动 */\n flex-wrap: nowrap;\n overflow-x: auto;\n padding-top: var(--wd-spacing-base, 12px);\n}\n/* 底部工具组与自定义组:图标按钮紧凑排布、内部不换行 */\n.wd-datagrid__bottom-group {\n gap: 6px;\n flex-wrap: nowrap;\n flex-shrink: 0;\n}\n.wd-datagrid__bottom-actions {\n gap: 8px;\n}\n.wd-datagrid__bottom-group :deep(.el-button + .el-button) {\n margin-left: 0;\n}\n.wd-datagrid__bottom-group :deep(.el-button .el-icon) {\n font-size: 16px;\n}\n/* 分页:默认 right——无任何底部组时单独靠右;有底部组时也保持推到行尾 */\n.wd-datagrid__pager-main {\n margin-left: auto;\n}\n/* 分页位置 left:分页贴左(DOM 在底部组之后,用 order 提前),后续底部组被 margin-right:auto 推到行尾 */\n.wd-datagrid__bottom-bar.pager-at-left .wd-datagrid__pager-main {\n order: -1;\n margin-left: 0;\n margin-right: auto;\n}\n/* 分页位置 center:两侧 auto margin 平分剩余空间居中(flex 中 auto margin 优先于 justify-content);有底部组时组靠左、分页在剩余空间居中 */\n.wd-datagrid__bottom-bar.pager-at-center .wd-datagrid__pager-main {\n margin-right: auto;\n}\n.wd-datagrid__cards {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n.wd-datagrid__card {\n /* 组件级令牌回退链:皮肤可单独定制 DataGrid 卡片 */\n background: var(--wd-datagrid-bg, transparent);\n /* 背景素材:皮肤可挂纹理/图片(须置于 background 简写之后,否则被简写重置) */\n background-image: var(--wd-datagrid-bg-image, none);\n border: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-datagrid-border-color, var(--wd-border-color-light, #e4e7ed));\n border-radius: var(--wd-datagrid-radius, var(--wd-radius-base, 4px));\n padding: var(--wd-datagrid-padding, var(--wd-spacing-base, 12px));\n margin-bottom: var(--wd-spacing-base, 12px);\n}\n.wd-datagrid__card-title {\n font-weight: 600;\n font-size: var(--wd-font-size-large, 16px);\n color: var(--wd-text-color-primary, #303133);\n margin-bottom: 8px;\n}\n.wd-datagrid__card-line {\n display: flex;\n font-size: var(--wd-font-size-base, 14px);\n line-height: 1.8;\n}\n.wd-datagrid__card-label {\n width: 110px;\n color: var(--wd-text-color-secondary, #909399);\n flex-shrink: 0;\n}\n.wd-datagrid__card-value {\n color: var(--wd-text-color-regular, #606266);\n word-break: break-all;\n}\n.wd-datagrid__col-tip {\n margin-bottom: 8px;\n font-size: var(--wd-font-size-small, 12px);\n color: var(--wd-text-color-secondary, #909399);\n}\n.wd-datagrid__col-setting {\n max-height: 400px;\n overflow: auto;\n}\n.wd-datagrid__col-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-bottom: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #f0f0f0);\n border-radius: var(--wd-radius-small, 4px);\n transition: background-color 0.15s;\n}\n.wd-datagrid__col-item:hover {\n background-color: var(--wd-fill-color-light, #f5f7fa);\n}\n.wd-datagrid__col-handle {\n display: inline-flex;\n align-items: center;\n cursor: grab;\n color: var(--wd-text-color-placeholder, #a8abb2);\n touch-action: none;\n}\n.wd-datagrid__col-handle:active {\n cursor: grabbing;\n}\n.wd-datagrid__col-checkbox {\n flex: 1;\n}\n/* 正在拖拽的源行 */\n.wd-datagrid__col-item.is-dragging {\n opacity: 0.45;\n}\n/* 放置位置指示线 */\n.wd-datagrid__col-item.drag-over--before::before,\n.wd-datagrid__col-item.drag-over--after::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background-color: var(--el-color-primary, #409eff);\n pointer-events: none;\n}\n.wd-datagrid__col-item.drag-over--before::before {\n top: -1px;\n}\n.wd-datagrid__col-item.drag-over--after::after {\n bottom: -1px;\n}\n</style>\n"],"names":["ColumnRenderer","defineComponent","props","__props","emit","__emit","slots","useSlots","tableRef","ref","viewMode","toolsConf","computed","toolBtnMode","toolBtnSize","hasToolbar","hasActions","hasToolsGroup","actionsAtTop","toolsAtTop","actionsAtBottom","toolsAtBottom","showTopToolbar","showBottomBar","syncingSelection","cartList","cartVisible","cartKeyOf","row","k","cartKeyLabel","v","syncCartFromSelection","rows","pageKeys","list","r","merged","c","idx","i","openCart","removeCartRow","table","clearCart","_b","_a","getCartList","applyCartRestore","nextTick","sizeStorageKey","storedSize","safeJsonParse","innerSize","watch","onSizeChange","cmd","rootRef","availFixHeight","fixTableHeight","isFixMode","isFixedHeightMode","h","rootStyle","tableHeight","findFixBoundary","el","node","style","maxH","overflowY","isScroll","hasBoundedHeight","fixBoundaryEl","fixObserver","measureFixHeight","boundary","padB","rect","gridTop","avail","toolbar","pager","onViewportResize","globalCfg","getGlobalConfig","pagerPageSizes","hideOnSinglePage","pagerLayout","pagerPos","isStatic","grid","useDataGrid","total","loading","currentPage","pageSize","selection","val","colColumns","controllableColumns","hiddenKeys","columnOrderMap","colSettingVisible","initColumns","setColumnVisible","reorderColumns","resetColumns","useColumnSettings","draggingColKey","dragOverKey","dragOverPosition","onColDragStart","key","onColDragOver","onColDragLeave","onColDrop","onColDragEnd","columnVnodes","defaultSlot","vn","orderColumnVnodes","filterColumnVnodes","vnodes","hidden","result","vnode","p","indexMethod","index","rowspanMethod","column","rowIndex","columnIndex","prop","data","keyVal","firstIdx","selectionValue","applySelectionFromModel","mv","ov","current","nv","onSelectionChange","value","onChangeCurrentpage","onChangePagesize","toggleMode","actionColumnWidth","w","sum","act","onRowAction","requestApi","options","res","refresh","getSelection","clearSelection","search","params","resetSearch","__expose","unregister","onMounted","registerDataGrid","onBeforeUnmount","_createElementBlock","_openBlock","_hoisted_1","_normalizeClass","_renderSlot","_ctx","_unref","_createBlock","_component_el_button","_createVNode","_component_el_icon","Plus","Download","_component_el_tooltip","Refresh","_component_el_dropdown","_component_el_dropdown_menu","_component_el_dropdown_item","_cache","ScaleToOriginal","$slots","Grid","Menu","Setting","_component_el_badge","ShoppingCart","_hoisted_2","_toDisplayString","_component_el_table","_component_el_empty","_component_el_table_column","_withCtx","_Fragment","_renderList","$event","_createTextVNode","_withDirectives","_hoisted_3","_createElementVNode","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_component_el_pagination","_component_el_dialog","_hoisted_10","col","_withModifiers","_component_el_checkbox","Rank","_resolveDynamicComponent","_hoisted_13","_hoisted_14"],"mappings":"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"}