workdesktop-ai 1.0.2 → 1.1.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 (224) hide show
  1. package/CHANGELOG.md +155 -93
  2. package/README.md +123 -25
  3. package/dist/api-button/index.mjs +7 -0
  4. package/dist/api-button/index.mjs.map +1 -0
  5. package/dist/assets/Select-CNzSyvlZ.css +1 -0
  6. package/dist/auto-complete/index.mjs +7 -0
  7. package/dist/auto-complete/index.mjs.map +1 -0
  8. package/dist/auto-complete/style.css +1 -0
  9. package/dist/base.css +1 -0
  10. package/dist/checkbox-list/index.mjs +7 -0
  11. package/dist/checkbox-list/index.mjs.map +1 -0
  12. package/dist/checkbox-list/style.css +1 -0
  13. package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs +80 -0
  14. package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map +1 -0
  15. package/dist/chunks/AutoComplete-CLV_PwcZ.mjs +80 -0
  16. package/dist/chunks/AutoComplete-CLV_PwcZ.mjs.map +1 -0
  17. package/dist/chunks/CheckboxList-Bx3Ce1q5.mjs +129 -0
  18. package/dist/chunks/CheckboxList-Bx3Ce1q5.mjs.map +1 -0
  19. package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs +99 -0
  20. package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map +1 -0
  21. package/dist/chunks/DataForm-C5MBVdei.mjs +305 -0
  22. package/dist/chunks/DataForm-C5MBVdei.mjs.map +1 -0
  23. package/dist/chunks/DataGrid-HUzKWuQx.mjs +1124 -0
  24. package/dist/chunks/DataGrid-HUzKWuQx.mjs.map +1 -0
  25. package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs +117 -0
  26. package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map +1 -0
  27. package/dist/chunks/Drawer-ucXKUecL.mjs +259 -0
  28. package/dist/chunks/Drawer-ucXKUecL.mjs.map +1 -0
  29. package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs +125 -0
  30. package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs.map +1 -0
  31. package/dist/chunks/EditableGrid-C8A-nJZv.mjs +1783 -0
  32. package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +1 -0
  33. package/dist/chunks/FormItem-C1q0opnk.mjs +79 -0
  34. package/dist/chunks/FormItem-C1q0opnk.mjs.map +1 -0
  35. package/dist/chunks/Iframe-CeSiMnvR.mjs +65 -0
  36. package/dist/chunks/Iframe-CeSiMnvR.mjs.map +1 -0
  37. package/dist/chunks/ImageUpload-DGehzaYa.mjs +193 -0
  38. package/dist/chunks/ImageUpload-DGehzaYa.mjs.map +1 -0
  39. package/dist/chunks/Panel-CrRqBTj6.mjs +115 -0
  40. package/dist/chunks/Panel-CrRqBTj6.mjs.map +1 -0
  41. package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs +118 -0
  42. package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map +1 -0
  43. package/dist/chunks/RadioList-vE8JOuST.mjs +129 -0
  44. package/dist/chunks/RadioList-vE8JOuST.mjs.map +1 -0
  45. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs +80 -0
  46. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map +1 -0
  47. package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs +73 -0
  48. package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs.map +1 -0
  49. package/dist/chunks/SearchItem-pFO57lEO.mjs +79 -0
  50. package/dist/chunks/SearchItem-pFO57lEO.mjs.map +1 -0
  51. package/dist/chunks/SearchPanel-xQ1hPaNq.mjs +158 -0
  52. package/dist/chunks/SearchPanel-xQ1hPaNq.mjs.map +1 -0
  53. package/dist/chunks/Select-DAGZDXvI.mjs +114 -0
  54. package/dist/chunks/Select-DAGZDXvI.mjs.map +1 -0
  55. package/dist/chunks/Station-BF_QlQ8c.mjs +796 -0
  56. package/dist/chunks/Station-BF_QlQ8c.mjs.map +1 -0
  57. package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs +71 -0
  58. package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map +1 -0
  59. package/dist/chunks/Tips-IWCZcR1K.mjs +63 -0
  60. package/dist/chunks/Tips-IWCZcR1K.mjs.map +1 -0
  61. package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs +51 -0
  62. package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs.map +1 -0
  63. package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs +200 -0
  64. package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map +1 -0
  65. package/dist/chunks/Viewer-iub6TjoD.mjs +381 -0
  66. package/dist/chunks/Viewer-iub6TjoD.mjs.map +1 -0
  67. package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs +10 -0
  68. package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs.map +1 -0
  69. package/dist/chunks/containerContext-BgphFDeH.mjs +13 -0
  70. package/dist/chunks/containerContext-BgphFDeH.mjs.map +1 -0
  71. package/dist/chunks/http-Bs-dM076.mjs +2951 -0
  72. package/dist/chunks/http-Bs-dM076.mjs.map +1 -0
  73. package/dist/chunks/linkage-FbL1mcz3.mjs +66 -0
  74. package/dist/chunks/linkage-FbL1mcz3.mjs.map +1 -0
  75. package/dist/chunks/props-DAytpx7D.mjs +65 -0
  76. package/dist/chunks/props-DAytpx7D.mjs.map +1 -0
  77. package/dist/chunks/useApiAction-6_vvf5Fd.mjs +30 -0
  78. package/dist/chunks/useApiAction-6_vvf5Fd.mjs.map +1 -0
  79. package/dist/chunks/useColumnSettings-BYDQdk4o.mjs +216 -0
  80. package/dist/chunks/useColumnSettings-BYDQdk4o.mjs.map +1 -0
  81. package/dist/chunks/useOptionsLoader-Bi8oqNbG.mjs +64 -0
  82. package/dist/chunks/useOptionsLoader-Bi8oqNbG.mjs.map +1 -0
  83. package/dist/confirm-button/index.mjs +7 -0
  84. package/dist/confirm-button/index.mjs.map +1 -0
  85. package/dist/data-form/index.mjs +7 -0
  86. package/dist/data-form/index.mjs.map +1 -0
  87. package/dist/data-form/style.css +1 -0
  88. package/dist/data-grid/index.mjs +7 -0
  89. package/dist/data-grid/index.mjs.map +1 -0
  90. package/dist/data-grid/style.css +1 -0
  91. package/dist/dialog-button/index.mjs +7 -0
  92. package/dist/dialog-button/index.mjs.map +1 -0
  93. package/dist/drawer/index.mjs +7 -0
  94. package/dist/drawer/index.mjs.map +1 -0
  95. package/dist/drawer/style.css +1 -0
  96. package/dist/drawer-button/index.mjs +7 -0
  97. package/dist/drawer-button/index.mjs.map +1 -0
  98. package/dist/editable-grid/index.mjs +7 -0
  99. package/dist/editable-grid/index.mjs.map +1 -0
  100. package/dist/editable-grid/style.css +1 -0
  101. package/dist/form-item/index.mjs +7 -0
  102. package/dist/form-item/index.mjs.map +1 -0
  103. package/dist/form-item/style.css +1 -0
  104. package/dist/iframe/index.mjs +7 -0
  105. package/dist/iframe/index.mjs.map +1 -0
  106. package/dist/iframe/style.css +1 -0
  107. package/dist/image-upload/index.mjs +7 -0
  108. package/dist/image-upload/index.mjs.map +1 -0
  109. package/dist/image-upload/style.css +1 -0
  110. package/dist/index.esm.js +318 -6495
  111. package/dist/index.esm.js.map +1 -1
  112. package/dist/index.umd.js +20 -9
  113. package/dist/index.umd.js.map +1 -1
  114. package/dist/panel/index.mjs +7 -0
  115. package/dist/panel/index.mjs.map +1 -0
  116. package/dist/panel/style.css +1 -0
  117. package/dist/prompt-button/index.mjs +7 -0
  118. package/dist/prompt-button/index.mjs.map +1 -0
  119. package/dist/radio-list/index.mjs +7 -0
  120. package/dist/radio-list/index.mjs.map +1 -0
  121. package/dist/radio-list/style.css +1 -0
  122. package/dist/requester/index.mjs +7 -0
  123. package/dist/requester/index.mjs.map +1 -0
  124. package/dist/route-button/index.mjs +7 -0
  125. package/dist/route-button/index.mjs.map +1 -0
  126. package/dist/search-item/index.mjs +7 -0
  127. package/dist/search-item/index.mjs.map +1 -0
  128. package/dist/search-item/style.css +1 -0
  129. package/dist/search-panel/index.mjs +7 -0
  130. package/dist/search-panel/index.mjs.map +1 -0
  131. package/dist/search-panel/style.css +1 -0
  132. package/dist/select/index.mjs +7 -0
  133. package/dist/select/index.mjs.map +1 -0
  134. package/dist/station/index.mjs +7 -0
  135. package/dist/station/index.mjs.map +1 -0
  136. package/dist/station/style.css +1 -0
  137. package/dist/style.css +1 -1
  138. package/dist/switch/index.mjs +7 -0
  139. package/dist/switch/index.mjs.map +1 -0
  140. package/dist/tips/index.mjs +7 -0
  141. package/dist/tips/index.mjs.map +1 -0
  142. package/dist/tips/style.css +1 -0
  143. package/dist/tips-button/index.mjs +7 -0
  144. package/dist/tips-button/index.mjs.map +1 -0
  145. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +35 -6
  146. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +37 -8
  147. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +89 -29
  148. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +99 -31
  149. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
  150. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +45 -14
  151. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +34 -5
  152. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +8 -15
  153. package/dist/types/src/components/common/props.d.ts +32 -2
  154. package/dist/types/src/components/containers/Drawer.vue.d.ts +61 -8
  155. package/dist/types/src/components/containers/Iframe.vue.d.ts +39 -2
  156. package/dist/types/src/components/containers/containerContext.d.ts +1 -1
  157. package/dist/types/src/components/containers/useContainerController.d.ts +5 -0
  158. package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
  159. package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
  160. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +212 -5
  161. package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +14 -0
  162. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
  163. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
  164. package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
  165. package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
  166. package/dist/types/src/components/{containers → form}/SearchPanel.vue.d.ts +17 -2
  167. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +6 -6
  168. package/dist/types/src/components/index.d.ts +10 -6
  169. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +10 -1
  170. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +28 -3
  171. package/dist/types/src/components/inputs/RadioList.vue.d.ts +28 -3
  172. package/dist/types/src/components/inputs/Select.vue.d.ts +11 -1
  173. package/dist/types/src/components/inputs/Switch.vue.d.ts +2 -2
  174. package/dist/types/src/components/inputs/useOptionsLoader.d.ts +3 -0
  175. package/dist/types/src/components/layout/Station.vue.d.ts +302 -0
  176. package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
  177. package/dist/types/src/components/layout/types.d.ts +54 -0
  178. package/dist/types/src/components/styles/Panel.vue.d.ts +58 -5
  179. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +4 -4
  180. package/dist/types/src/components/upload/Upload.vue.d.ts +1 -1
  181. package/dist/types/src/entries/api-button.d.ts +9 -0
  182. package/dist/types/src/entries/auto-complete.d.ts +9 -0
  183. package/dist/types/src/entries/checkbox-list.d.ts +9 -0
  184. package/dist/types/src/entries/components-map.d.ts +8 -0
  185. package/dist/types/src/entries/confirm-button.d.ts +9 -0
  186. package/dist/types/src/entries/data-form.d.ts +9 -0
  187. package/dist/types/src/entries/data-grid.d.ts +9 -0
  188. package/dist/types/src/entries/dialog-button.d.ts +9 -0
  189. package/dist/types/src/entries/drawer-button.d.ts +9 -0
  190. package/dist/types/src/entries/drawer.d.ts +9 -0
  191. package/dist/types/src/entries/editable-grid.d.ts +9 -0
  192. package/dist/types/src/entries/form-item.d.ts +9 -0
  193. package/dist/types/src/entries/iframe.d.ts +9 -0
  194. package/dist/types/src/entries/image-upload.d.ts +9 -0
  195. package/dist/types/src/entries/panel.d.ts +9 -0
  196. package/dist/types/src/entries/prompt-button.d.ts +9 -0
  197. package/dist/types/src/entries/radio-list.d.ts +9 -0
  198. package/dist/types/src/entries/requester.d.ts +9 -0
  199. package/dist/types/src/entries/route-button.d.ts +9 -0
  200. package/dist/types/src/entries/search-item.d.ts +9 -0
  201. package/dist/types/src/entries/search-panel.d.ts +9 -0
  202. package/dist/types/src/entries/select.d.ts +9 -0
  203. package/dist/types/src/entries/station.d.ts +9 -0
  204. package/dist/types/src/entries/switch.d.ts +9 -0
  205. package/dist/types/src/entries/tips-button.d.ts +9 -0
  206. package/dist/types/src/entries/tips.d.ts +9 -0
  207. package/dist/types/src/entries/upload.d.ts +9 -0
  208. package/dist/types/src/entries/viewer.d.ts +9 -0
  209. package/dist/types/src/index.d.ts +2 -1
  210. package/dist/types/src/lib/composables/useDataGrid.d.ts +15 -0
  211. package/dist/types/src/lib/core/http.d.ts +21 -4
  212. package/dist/types/src/lib/core/station-linkage.d.ts +41 -0
  213. package/dist/types/src/types/config.d.ts +20 -3
  214. package/dist/types/vite.config.d.ts +6 -1
  215. package/dist/upload/index.mjs +7 -0
  216. package/dist/upload/index.mjs.map +1 -0
  217. package/dist/viewer/index.mjs +7 -0
  218. package/dist/viewer/index.mjs.map +1 -0
  219. package/dist/viewer/style.css +1 -0
  220. package/llms.txt +658 -0
  221. package/package.json +200 -68
  222. package/dist/types/src/components/containers/Dialog.vue.d.ts +0 -112
  223. package/dist/types/src/components/data/editable-table/EditableTable.vue.d.ts +0 -306
  224. package/dist/types/src/components/utils/Viewer.vue.d.ts +0 -131
@@ -0,0 +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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"}
@@ -0,0 +1,117 @@
1
+ import { defineComponent as C, ref as c, resolveComponent as p, openBlock as o, createElementBlock as D, Fragment as V, createBlock as d, withCtx as a, createVNode as $, mergeProps as y, renderSlot as i, createTextVNode as b, toDisplayString as g, createSlots as B, normalizeProps as P, guardReactiveProps as N, createCommentVNode as w, nextTick as R } from "vue";
2
+ import { W as T } from "./Drawer-ucXKUecL.mjs";
3
+ import { t as W, h as j, f as A } from "./props-DAytpx7D.mjs";
4
+ const U = /* @__PURE__ */ C({
5
+ name: "WdDialogButton",
6
+ inheritAttrs: !1,
7
+ __name: "DialogButton",
8
+ props: {
9
+ ...A,
10
+ ...j,
11
+ ...W,
12
+ /** 按钮文案(也可用 #button 插槽;el-button 原生 text 走 $attrs 透传) */
13
+ label: { type: String, default: "" },
14
+ /** 弹出层标题 */
15
+ title: { type: String, default: "" },
16
+ /** iframe 地址(设置后弹层内以 iframe 加载,否则渲染默认插槽) */
17
+ url: { type: String, default: "" },
18
+ /** 传给内部表单/iframe 的数据 */
19
+ data: { type: Object, default: () => ({}) },
20
+ /** 对话框宽度 */
21
+ size: { type: [String, Number], default: "50%" },
22
+ /** el-button type */
23
+ type: { type: String, default: "primary" },
24
+ /** el-button size */
25
+ buttonSize: { type: String, default: "default" },
26
+ disabled: { type: Boolean, default: !1 }
27
+ },
28
+ emits: ["open", "close", "confirm"],
29
+ setup(t, { emit: z }) {
30
+ const n = z, s = c(!1), l = c(!1);
31
+ async function f() {
32
+ s.value = !0, await R(), l.value = !0, n("open");
33
+ }
34
+ function S() {
35
+ l.value = !1;
36
+ }
37
+ function h() {
38
+ n("close");
39
+ }
40
+ function k(e) {
41
+ n("confirm", e);
42
+ }
43
+ return (e, u) => {
44
+ const m = p("el-button"), v = p("el-tooltip");
45
+ return o(), D(V, null, [
46
+ e.tips ? (o(), d(v, {
47
+ key: 0,
48
+ content: e.tips,
49
+ effect: e.tipsType,
50
+ placement: e.placement
51
+ }, {
52
+ default: a(() => [
53
+ $(m, y({
54
+ type: t.type,
55
+ size: t.buttonSize,
56
+ disabled: t.disabled
57
+ }, e.$attrs, { onClick: f }), {
58
+ default: a(() => [
59
+ i(e.$slots, "button", {}, () => [
60
+ b(g(t.label), 1)
61
+ ])
62
+ ]),
63
+ _: 3
64
+ }, 16, ["type", "size", "disabled"])
65
+ ]),
66
+ _: 3
67
+ }, 8, ["content", "effect", "placement"])) : (o(), d(m, y({
68
+ key: 1,
69
+ type: t.type,
70
+ size: t.buttonSize,
71
+ disabled: t.disabled
72
+ }, e.$attrs, { onClick: f }), {
73
+ default: a(() => [
74
+ i(e.$slots, "button", {}, () => [
75
+ b(g(t.label), 1)
76
+ ])
77
+ ]),
78
+ _: 3
79
+ }, 16, ["type", "size", "disabled"])),
80
+ s.value ? (o(), d(T, {
81
+ key: 2,
82
+ modelValue: l.value,
83
+ "onUpdate:modelValue": u[0] || (u[0] = (r) => l.value = r),
84
+ mode: "dialog",
85
+ title: t.title,
86
+ size: t.size,
87
+ url: t.url,
88
+ data: t.data,
89
+ filter: e.filter,
90
+ "head-refresh-datagrid": e.headRefreshDatagrid,
91
+ onClose: h,
92
+ onConfirm: k
93
+ }, B({
94
+ default: a(() => [
95
+ i(e.$slots, "default", {
96
+ data: t.data,
97
+ close: S
98
+ })
99
+ ]),
100
+ _: 2
101
+ }, [
102
+ e.$slots.footer ? {
103
+ name: "footer",
104
+ fn: a((r) => [
105
+ i(e.$slots, "footer", P(N(r)))
106
+ ]),
107
+ key: "0"
108
+ } : void 0
109
+ ]), 1032, ["modelValue", "title", "size", "url", "data", "filter", "head-refresh-datagrid"])) : w("", !0)
110
+ ], 64);
111
+ };
112
+ }
113
+ });
114
+ export {
115
+ U as _
116
+ };
117
+ //# sourceMappingURL=DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs","sources":["../../src/components/buttons/DialogButton.vue"],"sourcesContent":["<template>\r\n <el-tooltip\r\n v-if=\"tips\"\r\n :content=\"tips\"\r\n :effect=\"tipsType\"\r\n :placement=\"placement\"\r\n >\r\n <el-button :type=\"type\" :size=\"buttonSize\" :disabled=\"disabled\" v-bind=\"$attrs\" @click=\"openDialog\">\r\n <slot name=\"button\">{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else :type=\"type\" :size=\"buttonSize\" :disabled=\"disabled\" v-bind=\"$attrs\" @click=\"openDialog\">\r\n <slot name=\"button\">{{ label }}</slot>\r\n </el-button>\r\n\r\n <wd-drawer\r\n v-if=\"rendered\"\r\n v-model=\"dialogVisible\"\r\n mode=\"dialog\"\r\n :title=\"title\"\r\n :size=\"size\"\r\n :url=\"url\"\r\n :data=\"data\"\r\n :filter=\"filter\"\r\n :head-refresh-datagrid=\"headRefreshDatagrid\"\r\n @close=\"onClose\"\r\n @confirm=\"onConfirm\"\r\n >\r\n <slot :data=\"data\" :close=\"closeDialog\" />\r\n <template v-if=\"$slots.footer\" #footer=\"footerProps\">\r\n <slot name=\"footer\" v-bind=\"footerProps\" />\r\n </template>\r\n </wd-drawer>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, nextTick, type PropType } from 'vue'\r\nimport WdDrawer from '../containers/Drawer.vue'\r\nimport { filterProp, headRefreshDatagridProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdDialogButton', inheritAttrs: false })\r\n\r\ndefineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...tipsProp,\r\n /** 按钮文案(也可用 #button 插槽;el-button 原生 text 走 $attrs 透传) */\r\n label: { type: String, default: '' },\r\n /** 弹出层标题 */\r\n title: { type: String, default: '' },\r\n /** iframe 地址(设置后弹层内以 iframe 加载,否则渲染默认插槽) */\r\n url: { type: String, default: '' },\r\n /** 传给内部表单/iframe 的数据 */\r\n data: { type: Object, default: () => ({}) },\r\n /** 对话框宽度 */\r\n size: { type: [String, Number], default: '50%' },\r\n /** el-button type */\r\n type: { type: String, default: 'primary' },\r\n /** el-button size */\r\n buttonSize: { type: String, default: 'default' },\r\n disabled: { type: Boolean, default: false },\r\n})\r\n\r\nconst emit = defineEmits(['open', 'close', 'confirm'])\r\n\r\n/** 内容懒挂载:首次打开才渲染弹层内容,避免内部 DataForm 提前请求 */\r\nconst rendered = ref(false)\r\nconst dialogVisible = ref(false)\r\n\r\nasync function openDialog() {\r\n rendered.value = true\r\n await nextTick()\r\n dialogVisible.value = true\r\n emit('open')\r\n}\r\n\r\nfunction closeDialog() {\r\n dialogVisible.value = false\r\n}\r\n\r\nfunction onClose() {\r\n emit('close')\r\n}\r\n\r\nfunction onConfirm(payload: any) {\r\n emit('confirm', payload)\r\n}\r\n</script>\r\n"],"names":["emit","__emit","rendered","ref","dialogVisible","openDialog","nextTick","closeDialog","onClose","onConfirm","payload","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","__props","$attrs","_renderSlot","_ctx","_openBlock","WdDrawer","$event","filter","headRefreshDatagrid","$slots","_withCtx","footerProps"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,UAAMA,IAAOC,GAGPC,IAAWC,EAAI,EAAK,GACpBC,IAAgBD,EAAI,EAAK;AAE/B,mBAAeE,IAAa;AAC1B,MAAAH,EAAS,QAAQ,IACjB,MAAMI,EAAA,GACNF,EAAc,QAAQ,IACtBJ,EAAK,MAAM;AAAA,IACb;AAEA,aAASO,IAAc;AACrB,MAAAH,EAAc,QAAQ;AAAA,IACxB;AAEA,aAASI,IAAU;AACjB,MAAAR,EAAK,OAAO;AAAA,IACd;AAEA,aAASS,EAAUC,GAAc;AAC/B,MAAAV,EAAK,WAAWU,CAAO;AAAA,IACzB;;;;QApFUC,EAAAA,aADRC,EASaC,GAAA;AAAA;UAPV,SAASF,EAAAA;AAAAA,UACT,QAAQG,EAAAA;AAAAA,UACR,WAAWC,EAAAA;AAAAA,QAAAA;qBAEZ,MAEY;AAAA,YAFZC,EAEYC,GAFZC,EAEY;AAAA,cAFA,MAAMC,EAAA;AAAA,cAAO,MAAMA,EAAA;AAAA,cAAa,UAAUA,EAAA;AAAA,YAAA,GAAkBC,EAAAA,QAAM,EAAG,SAAOf,EAAA,CAAU,GAAA;AAAA,yBAChG,MAAsC;AAAA,gBAAtCgB,EAAsCC,wBAAtC,MAAsC;AAAA,sBAAfH,EAAA,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;sDAGhCI,KAAAX,EAEYK,GAFZC,EAEY;AAAA;UAFO,MAAMC,EAAA;AAAA,UAAO,MAAMA,EAAA;AAAA,UAAa,UAAUA,EAAA;AAAA,QAAA,GAAkBC,EAAAA,QAAM,EAAG,SAAOf,EAAA,CAAU,GAAA;AAAA,qBACvG,MAAsC;AAAA,YAAtCgB,EAAsCC,wBAAtC,MAAsC;AAAA,kBAAfH,EAAA,KAAK,GAAA,CAAA;AAAA,YAAA;;;;QAItBjB,EAAA,cADRU,EAiBYY,GAAA;AAAA;sBAfDpB,EAAA;AAAA,wDAAAA,EAAa,QAAAqB;AAAA,UACtB,MAAK;AAAA,UACJ,OAAON,EAAA;AAAA,UACP,MAAMA,EAAA;AAAA,UACN,KAAKA,EAAA;AAAA,UACL,MAAMA,EAAA;AAAA,UACN,QAAQO,EAAAA;AAAAA,UACR,yBAAuBC,EAAAA;AAAAA,UACvB,SAAAnB;AAAA,UACA,WAAAC;AAAA,QAAA;qBAED,MAA0C;AAAA,YAA1CY,EAA0CC,EAAA,QAAA,WAAA;AAAA,cAAnC,MAAMH,EAAA;AAAA,cAAO,OAAOZ;AAAA,YAAA;;;;UACXqB,EAAAA,OAAO;kBAAS;AAAA,YAC9B,IAAAC,EAAA,CADsCC,MAAW;AAAA,cACjDT,EAA2CC,wBAAfQ,CAAW,CAAA,CAAA;AAAA,YAAA;;;;;;;;"}
@@ -0,0 +1,259 @@
1
+ import { ref as $, watch as I, computed as M, onMounted as G, onBeforeUnmount as A, defineComponent as x, resolveComponent as E, openBlock as V, createBlock as L, mergeProps as U, unref as f, isRef as P, createSlots as T, withCtx as B, createElementBlock as W, renderSlot as R } from "vue";
2
+ import { ElMessageBox as K } from "element-plus";
3
+ import { r as N } from "./linkage-FbL1mcz3.mjs";
4
+ import { p as F } from "./containerContext-BgphFDeH.mjs";
5
+ import { h as H, f as J } from "./props-DAytpx7D.mjs";
6
+ import { _ as Q } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
7
+ function X(l) {
8
+ const { props: o, emit: a } = l, t = $(!!o.modelValue);
9
+ I(
10
+ () => o.modelValue,
11
+ (e) => {
12
+ e !== t.value && (t.value = !!e);
13
+ }
14
+ ), I(t, (e) => {
15
+ o.modelValue !== e && a("update:modelValue", e);
16
+ });
17
+ const v = /* @__PURE__ */ new Set();
18
+ function i(e) {
19
+ t.value = e, a("update:modelValue", e);
20
+ }
21
+ function h() {
22
+ i(!0), a("open"), u(), a("open");
23
+ }
24
+ async function c(e = "request") {
25
+ e !== "submit" && !await C() || (i(!1), y(e));
26
+ }
27
+ function w(e) {
28
+ return v.add(e), () => v.delete(e);
29
+ }
30
+ async function C() {
31
+ for (const e of v)
32
+ if (!await e()) return !1;
33
+ return !0;
34
+ }
35
+ async function _(e) {
36
+ if (await C()) {
37
+ if (o.confirmMessage)
38
+ try {
39
+ await K.confirm(o.confirmMessage, "提示", {
40
+ confirmButtonText: "确定",
41
+ cancelButtonText: "取消",
42
+ type: "warning"
43
+ });
44
+ } catch {
45
+ return;
46
+ }
47
+ e(), y("manual");
48
+ }
49
+ }
50
+ function b() {
51
+ a("close");
52
+ }
53
+ function y(e) {
54
+ a("confirm", { reason: e }), o.headRefreshDatagrid && N(o.headRefreshDatagrid, o.filter);
55
+ }
56
+ let d = null;
57
+ const m = M(() => {
58
+ if (o.origin) return o.origin;
59
+ if (!o.url) return window.location.origin;
60
+ try {
61
+ return new URL(o.url).origin;
62
+ } catch {
63
+ return window.location.origin;
64
+ }
65
+ });
66
+ function r(e) {
67
+ return m.value === "*" || e === m.value;
68
+ }
69
+ function s(e) {
70
+ d = e;
71
+ }
72
+ function p(e, n) {
73
+ if (!(d != null && d.contentWindow)) return;
74
+ const k = { type: e, payload: n };
75
+ d.contentWindow.postMessage(k, m.value);
76
+ }
77
+ function u() {
78
+ o.url && p("wd-container:init", { data: o.data });
79
+ }
80
+ function g(e) {
81
+ var k;
82
+ if (!r(e.origin)) return;
83
+ const n = e.data;
84
+ if (!(!n || typeof n != "object" || !n.type))
85
+ switch (a("iframe-message", n), n.type) {
86
+ case "wd-container:submit-success":
87
+ a("iframe-submit-success", n.payload), c("submit");
88
+ break;
89
+ case "wd-container:close":
90
+ c("manual");
91
+ break;
92
+ case "wd-container:dirty":
93
+ a("iframe-dirty", n.payload), (k = n.payload) != null && k.dirty && w(async () => new Promise((j) => {
94
+ const O = Math.random().toString(36).slice(2), z = (S) => {
95
+ var D, q;
96
+ r(S.origin) && ((D = S.data) == null ? void 0 : D.type) === "wd-container:dirty-confirm-response" && ((q = S.data) == null ? void 0 : q.requestId) === O && (window.removeEventListener("message", z), j(!!S.data.payload.allowClose));
97
+ };
98
+ window.addEventListener("message", z), p("wd-container:dirty-confirm", { requestId: O });
99
+ }));
100
+ break;
101
+ case "wd-container:ready":
102
+ a("iframe-ready", n.payload), u();
103
+ break;
104
+ }
105
+ }
106
+ return G(() => {
107
+ window.addEventListener("message", g);
108
+ }), A(() => {
109
+ window.removeEventListener("message", g);
110
+ }), F({
111
+ data: o.data,
112
+ requestClose: c,
113
+ addBeforeClose: w
114
+ }), {
115
+ visible: t,
116
+ open: h,
117
+ requestClose: c,
118
+ addBeforeClose: w,
119
+ handleBeforeClose: _,
120
+ onClosed: b,
121
+ // iframe 桥接暴露
122
+ setIframeRef: s,
123
+ sendToIframe: p,
124
+ targetOrigin: m
125
+ };
126
+ }
127
+ const Y = ["src"], Z = ["src"], ee = /* @__PURE__ */ x({
128
+ name: "WdDrawer",
129
+ inheritAttrs: !1,
130
+ __name: "Drawer",
131
+ props: {
132
+ ...J,
133
+ ...H,
134
+ modelValue: { type: Boolean, default: void 0 },
135
+ title: { type: String, default: "" },
136
+ /** iframe 地址(设置后容器内以 iframe 加载) */
137
+ url: { type: String, default: "" },
138
+ /** 安全校验:允许的消息来源 origin */
139
+ origin: { type: String, default: "" },
140
+ /** 弹出形式:drawer 抽屉(默认)/ dialog 对话框 */
141
+ mode: { type: String, default: "drawer" },
142
+ /** 尺寸(抽屉宽度/高度,对话框宽度;数字按 px) */
143
+ size: { type: [String, Number], default: "50%" },
144
+ /** 抽屉弹出方向 rtl/ltr/ttb/btt(仅 mode=drawer 生效) */
145
+ direction: { type: String, default: "rtl" },
146
+ /** 关闭前确认文案(设置后关闭弹确认) */
147
+ confirmMessage: { type: String, default: "" },
148
+ /** 容器携带数据(传给内部表单) */
149
+ data: { type: Object, default: void 0 },
150
+ /** 每次打开时重新加载 iframe 内容(url 模式生效;默认 false 保留上次内容) */
151
+ reloadOnOpen: { type: Boolean, default: !1 }
152
+ },
153
+ emits: [
154
+ "update:modelValue",
155
+ "open",
156
+ "close",
157
+ "confirm",
158
+ // iframe 联动事件(子页面 postMessage 透传)
159
+ "iframe-message",
160
+ "iframe-ready",
161
+ "iframe-dirty",
162
+ "iframe-submit-success"
163
+ ],
164
+ setup(l, { expose: o, emit: a }) {
165
+ const t = l, v = a, {
166
+ visible: i,
167
+ requestClose: h,
168
+ handleBeforeClose: c,
169
+ onClosed: w,
170
+ setIframeRef: C,
171
+ sendToIframe: _
172
+ } = X({ props: t, emit: v }), b = $(null), y = $(0);
173
+ I(
174
+ () => i.value,
175
+ (r) => {
176
+ r && t.reloadOnOpen && t.url && (y.value += 1);
177
+ }
178
+ ), I(b, (r) => {
179
+ C(r);
180
+ });
181
+ const d = M(() => typeof t.size == "number" ? `${t.size}px` : t.size), m = M(() => {
182
+ if (!t.url) return "";
183
+ if (!t.data) return t.url;
184
+ const r = new URLSearchParams(
185
+ Object.entries(t.data).reduce((s, [p, u]) => (u != null && (s[p] = String(u)), s), {})
186
+ ).toString();
187
+ return r ? t.url + (t.url.includes("?") ? "&" : "?") + r : t.url;
188
+ });
189
+ return o({
190
+ open: () => i.value = !0,
191
+ /** 向 iframe 内发送指令(如 wd-container:submit 触发表单提交) */
192
+ sendToIframe: _
193
+ }), (r, s) => {
194
+ const p = E("el-drawer"), u = E("el-dialog");
195
+ return l.mode === "drawer" ? (V(), L(p, U({
196
+ key: 0,
197
+ modelValue: f(i),
198
+ "onUpdate:modelValue": s[0] || (s[0] = (g) => P(i) ? i.value = g : null),
199
+ "append-to-body": "",
200
+ title: l.title,
201
+ size: d.value,
202
+ direction: l.direction,
203
+ "before-close": f(c)
204
+ }, r.$attrs, { onClosed: f(w) }), T({
205
+ default: B(() => [
206
+ l.url ? (V(), W("iframe", {
207
+ ref_key: "iframeRef",
208
+ ref: b,
209
+ key: y.value,
210
+ src: m.value,
211
+ class: "wd-container__iframe wd-container__iframe--drawer",
212
+ frameborder: "0"
213
+ }, null, 8, Y)) : R(r.$slots, "default", {}, void 0, !0, 1)
214
+ ]),
215
+ _: 2
216
+ }, [
217
+ r.$slots.footer ? {
218
+ name: "footer",
219
+ fn: B(() => [
220
+ R(r.$slots, "footer", { close: f(h) }, void 0, !0)
221
+ ]),
222
+ key: "0"
223
+ } : void 0
224
+ ]), 1040, ["modelValue", "title", "size", "direction", "before-close", "onClosed"])) : (V(), L(u, U({
225
+ key: 1,
226
+ modelValue: f(i),
227
+ "onUpdate:modelValue": s[1] || (s[1] = (g) => P(i) ? i.value = g : null),
228
+ "append-to-body": "",
229
+ title: l.title,
230
+ width: d.value,
231
+ "before-close": f(c)
232
+ }, r.$attrs, { onClosed: f(w) }), T({
233
+ default: B(() => [
234
+ l.url ? (V(), W("iframe", {
235
+ ref_key: "iframeRef",
236
+ ref: b,
237
+ key: y.value,
238
+ src: m.value,
239
+ class: "wd-container__iframe wd-container__iframe--dialog",
240
+ frameborder: "0"
241
+ }, null, 8, Z)) : R(r.$slots, "default", {}, void 0, !0, 1)
242
+ ]),
243
+ _: 2
244
+ }, [
245
+ r.$slots.footer ? {
246
+ name: "footer",
247
+ fn: B(() => [
248
+ R(r.$slots, "footer", { close: f(h) }, void 0, !0)
249
+ ]),
250
+ key: "0"
251
+ } : void 0
252
+ ]), 1040, ["modelValue", "title", "width", "before-close", "onClosed"]));
253
+ };
254
+ }
255
+ }), le = /* @__PURE__ */ Q(ee, [["__scopeId", "data-v-b1f4d89e"]]);
256
+ export {
257
+ le as W
258
+ };
259
+ //# sourceMappingURL=Drawer-ucXKUecL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer-ucXKUecL.mjs","sources":["../../src/components/containers/useContainerController.ts","../../src/components/containers/Drawer.vue"],"sourcesContent":["/**\r\n * 容器组件(Dialog/Drawer)共享逻辑:\r\n * 显隐、iframe/内容渲染、关闭前拦截(confirmMessage + 内容注册的 beforeClose 守卫)、关闭后联动刷新\r\n */\r\nimport { ref, watch, provide, onMounted, onBeforeUnmount, computed } from 'vue'\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { provideContainer, type ContainerContext } from './containerContext'\r\n\r\ntype BridgeMessage = {\r\n type: string\r\n payload?: any\r\n}\r\n\r\nexport function useContainerController(options: {\r\n props: {\r\n modelValue?: boolean\r\n url?: string\r\n title?: string\r\n confirmMessage?: string\r\n headRefreshDatagrid?: boolean | string\r\n filter?: string\r\n data?: Record<string, any>\r\n origin?: string\r\n [key: string]: any\r\n }\r\n emit: (event: any, ...args: any[]) => void\r\n}) {\r\n const { props, emit } = options\r\n const visible = ref(!!props.modelValue)\r\n\r\n // 受控模式:外部 v-model 变化时同步显隐。\r\n // 容器可能「挂载后再置 true」(如 DrawerButton 懒挂载两段式打开),必须监听后续变化,\r\n // 否则 modelValue 只在挂载时生效一次,弹层永远无法打开。\r\n watch(\r\n () => props.modelValue,\r\n (val) => {\r\n if (val !== visible.value) visible.value = !!val\r\n }\r\n )\r\n\r\n // 反向同步:弹层被 X/遮罩/ESC 关闭后(el-dialog/drawer 内部把 visible 置 false,不经过 syncVisible),\r\n // 需把实际状态回写外部,否则父级 v-model 仍为 true,下次打开会失效。\r\n watch(visible, (val) => {\r\n if (props.modelValue !== val) emit('update:modelValue', val)\r\n })\r\n\r\n /** 关闭前守卫集合(内部 DataForm 的 confirmLeave 等,含 iframe 上报) */\r\n const beforeCloseGuards = new Set<() => Promise<boolean>>()\r\n\r\n function syncVisible(val: boolean) {\r\n visible.value = val\r\n emit('update:modelValue', val)\r\n }\r\n\r\n function open() {\r\n syncVisible(true)\r\n emit('open')\r\n sendInitToIframe()\r\n emit('open')\r\n }\r\n\r\n /**\r\n * 供内部内容主动请求关闭(DataForm headCloseDrawer)\r\n * @param reason 'submit'=提交成功,直接关闭;其余先走过渡守卫(未保存确认)\r\n */\r\n async function requestClose(reason = 'request') {\r\n if (reason !== 'submit') {\r\n const allowed = await runGuards()\r\n if (!allowed) return\r\n }\r\n syncVisible(false)\r\n afterClosed(reason)\r\n }\r\n\r\n function addBeforeClose(guard: () => Promise<boolean>) {\r\n beforeCloseGuards.add(guard)\r\n return () => beforeCloseGuards.delete(guard)\r\n }\r\n\r\n /** 执行全部内容守卫,任一返回 false 则中止 */\r\n async function runGuards(): Promise<boolean> {\r\n for (const guard of beforeCloseGuards) {\r\n const ok = await guard()\r\n if (!ok) return false\r\n }\r\n return true\r\n }\r\n\r\n /** el-dialog/el-drawer 关闭拦截入口(X 按钮 / 遮罩 / ESC) */\r\n async function handleBeforeClose(done: () => void) {\r\n // 1. 内容守卫(DataForm 未保存确认,含 iframe)\r\n const allowed = await runGuards()\r\n if (!allowed) return\r\n // 2. 容器自身确认\r\n if (props.confirmMessage) {\r\n try {\r\n await ElMessageBox.confirm(props.confirmMessage, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return\r\n }\r\n }\r\n done()\r\n afterClosed('manual')\r\n }\r\n\r\n function onClosed() {\r\n emit('close')\r\n }\r\n\r\n function afterClosed(reason: string) {\r\n emit('confirm', { reason })\r\n // 关闭后声明式联动刷新 DataGrid\r\n if (props.headRefreshDatagrid) {\r\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n }\r\n }\r\n\r\n // ================= iframe 跨上下文桥接 =================\r\n let iframeRef: HTMLIFrameElement | null = null\r\n const targetOrigin = computed(() => {\r\n if (props.origin) return props.origin\r\n if (!props.url) return window.location.origin\r\n try {\r\n return new URL(props.url).origin\r\n } catch {\r\n return window.location.origin\r\n }\r\n })\r\n\r\n /** 消息来源校验:targetOrigin='*' 时放行(与 postMessage 通配语义一致) */\r\n function isAllowedOrigin(eventOrigin: string) {\r\n return targetOrigin.value === '*' || eventOrigin === targetOrigin.value\r\n }\r\n\r\n function setIframeRef(el: HTMLIFrameElement | null) {\r\n iframeRef = el\r\n }\r\n\r\n function sendToIframe(type: string, payload?: any) {\r\n if (!iframeRef?.contentWindow) return\r\n const msg: BridgeMessage = { type, payload }\r\n iframeRef.contentWindow.postMessage(msg, targetOrigin.value)\r\n }\r\n\r\n /** 发送初始化数据给 iframe(代替 query 参数,支持复杂对象) */\r\n function sendInitToIframe() {\r\n if (!props.url) return\r\n sendToIframe('wd-container:init', { data: props.data })\r\n }\r\n\r\n /**\r\n * 处理 iframe 发来的消息:\r\n * 1. 以 emit 透传给外部(iframe-message 原始透传 + iframe-xxx 语义化事件)\r\n * 2. 保留默认联动行为(提交成功自动关闭、脏状态自动注册守卫、就绪自动下发数据)\r\n */\r\n function onBridgeMessage(event: MessageEvent) {\r\n // 安全校验:来源必须匹配目标 origin(* 通配放行)\r\n if (!isAllowedOrigin(event.origin)) return\r\n const data = event.data\r\n if (!data || typeof data !== 'object' || !data.type) return\r\n\r\n // 透传原始消息,外部可用 @iframe-message 统一监听\r\n emit('iframe-message', data)\r\n\r\n switch (data.type) {\r\n // 提交成功:关闭容器并刷新\r\n case 'wd-container:submit-success':\r\n emit('iframe-submit-success', data.payload)\r\n requestClose('submit')\r\n break\r\n // 子页面主动请求关闭(DataForm「关闭」按钮 / 业务主动触发)\r\n case 'wd-container:close':\r\n requestClose('manual')\r\n break\r\n // 注册/注销未保存守卫\r\n case 'wd-container:dirty':\r\n emit('iframe-dirty', data.payload)\r\n if (data.payload?.dirty) {\r\n addBeforeClose(async () => {\r\n return new Promise((resolve) => {\r\n const requestId = Math.random().toString(36).slice(2)\r\n const handler = (e: MessageEvent) => {\r\n if (!isAllowedOrigin(e.origin)) return\r\n if (e.data?.type === 'wd-container:dirty-confirm-response' && e.data?.requestId === requestId) {\r\n window.removeEventListener('message', handler)\r\n resolve(!!e.data.payload.allowClose)\r\n }\r\n }\r\n window.addEventListener('message', handler)\r\n sendToIframe('wd-container:dirty-confirm', { requestId })\r\n })\r\n })\r\n }\r\n break\r\n case 'wd-container:ready':\r\n emit('iframe-ready', data.payload)\r\n sendInitToIframe()\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n onMounted(() => {\r\n window.addEventListener('message', onBridgeMessage)\r\n })\r\n\r\n onBeforeUnmount(() => {\r\n window.removeEventListener('message', onBridgeMessage)\r\n })\r\n\r\n // 向内部内容(非 iframe 的 Vue 插槽内容)提供容器上下文\r\n provideContainer({\r\n data: props.data,\r\n requestClose,\r\n addBeforeClose\r\n } as ContainerContext)\r\n\r\n return {\r\n visible,\r\n open,\r\n requestClose,\r\n addBeforeClose,\r\n handleBeforeClose,\r\n onClosed,\r\n // iframe 桥接暴露\r\n setIframeRef,\r\n sendToIframe,\r\n targetOrigin\r\n }\r\n}\r\n","<template>\r\n <el-drawer\r\n v-if=\"mode === 'drawer'\"\r\n v-model=\"visible\"\r\n append-to-body\r\n :title=\"title\"\r\n :size=\"resolvedSize\"\r\n :direction=\"direction\"\r\n :before-close=\"handleBeforeClose\"\r\n v-bind=\"$attrs\"\r\n @closed=\"onClosed\"\r\n >\r\n <iframe\r\n v-if=\"url\"\r\n ref=\"iframeRef\"\r\n :key=\"iframeKey\"\r\n :src=\"resolvedUrl\"\r\n class=\"wd-container__iframe wd-container__iframe--drawer\"\r\n frameborder=\"0\"\r\n />\r\n <slot v-else />\r\n <template v-if=\"$slots.footer\" #footer>\r\n <slot name=\"footer\" :close=\"requestClose\" />\r\n </template>\r\n </el-drawer>\r\n\r\n <el-dialog\r\n v-else\r\n v-model=\"visible\"\r\n append-to-body\r\n :title=\"title\"\r\n :width=\"resolvedSize\"\r\n :before-close=\"handleBeforeClose\"\r\n v-bind=\"$attrs\"\r\n @closed=\"onClosed\"\r\n >\r\n <iframe\r\n v-if=\"url\"\r\n ref=\"iframeRef\"\r\n :key=\"iframeKey\"\r\n :src=\"resolvedUrl\"\r\n class=\"wd-container__iframe wd-container__iframe--dialog\"\r\n frameborder=\"0\"\r\n />\r\n <slot v-else />\r\n <template v-if=\"$slots.footer\" #footer>\r\n <slot name=\"footer\" :close=\"requestClose\" />\r\n </template>\r\n </el-dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch, onMounted, type PropType } from 'vue'\r\nimport { useContainerController } from './useContainerController'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdDrawer', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n modelValue: { type: Boolean, default: undefined },\r\n title: { type: String, default: '' },\r\n /** iframe 地址(设置后容器内以 iframe 加载) */\r\n url: { type: String, default: '' },\r\n /** 安全校验:允许的消息来源 origin */\r\n origin: { type: String, default: '' },\r\n /** 弹出形式:drawer 抽屉(默认)/ dialog 对话框 */\r\n mode: { type: String as PropType<'drawer' | 'dialog'>, default: 'drawer' },\r\n /** 尺寸(抽屉宽度/高度,对话框宽度;数字按 px) */\r\n size: { type: [String, Number], default: '50%' },\r\n /** 抽屉弹出方向 rtl/ltr/ttb/btt(仅 mode=drawer 生效) */\r\n direction: { type: String as PropType<'rtl' | 'ltr' | 'ttb' | 'btt'>, default: 'rtl' },\r\n /** 关闭前确认文案(设置后关闭弹确认) */\r\n confirmMessage: { type: String, default: '' },\r\n /** 容器携带数据(传给内部表单) */\r\n data: { type: Object as PropType<Record<string, any>>, default: undefined },\r\n /** 每次打开时重新加载 iframe 内容(url 模式生效;默认 false 保留上次内容) */\r\n reloadOnOpen: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'open',\r\n 'close',\r\n 'confirm',\r\n // iframe 联动事件(子页面 postMessage 透传)\r\n 'iframe-message',\r\n 'iframe-ready',\r\n 'iframe-dirty',\r\n 'iframe-submit-success'\r\n])\r\n\r\nconst {\r\n visible,\r\n requestClose,\r\n handleBeforeClose,\r\n onClosed,\r\n setIframeRef,\r\n sendToIframe,\r\n targetOrigin\r\n} = useContainerController({ props, emit })\r\n\r\nconst iframeRef = ref<HTMLIFrameElement | null>(null)\r\n\r\n/** iframe 重建 key:reloadOnOpen 时每次打开自增,强制重新加载 iframe */\r\nconst iframeKey = ref(0)\r\nwatch(\r\n () => visible.value,\r\n (val) => {\r\n if (val && props.reloadOnOpen && props.url) {\r\n iframeKey.value += 1\r\n }\r\n }\r\n)\r\n\r\n// 同步 ref 到 controller\r\nwatch(iframeRef, (newRef) => {\r\n setIframeRef(newRef)\r\n})\r\n\r\nconst resolvedSize = computed(() => (typeof props.size === 'number' ? `${props.size}px` : props.size))\r\n\r\n/** iframe 地址:data 作为 query 追加(保持兼容现有实现) */\r\nconst resolvedUrl = computed(() => {\r\n if (!props.url) return ''\r\n if (!props.data) return props.url\r\n const qs = new URLSearchParams(\r\n Object.entries(props.data).reduce((acc, [k, v]) => {\r\n if (v !== undefined && v !== null) acc[k] = String(v)\r\n return acc\r\n }, {} as Record<string, string>)\r\n ).toString()\r\n if (!qs) return props.url\r\n return props.url + (props.url.includes('?') ? '&' : '?') + qs\r\n})\r\n\r\ndefineExpose({\r\n open: () => (visible.value = true),\r\n /** 向 iframe 内发送指令(如 wd-container:submit 触发表单提交) */\r\n sendToIframe\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.wd-container__iframe {\r\n width: 100%;\r\n border: 0;\r\n display: block;\r\n}\r\n.wd-container__iframe--drawer {\r\n height: 100%;\r\n min-height: 400px;\r\n}\r\n.wd-container__iframe--dialog {\r\n height: 60vh;\r\n}\r\n</style>\r\n"],"names":["useContainerController","options","props","emit","visible","ref","watch","val","beforeCloseGuards","syncVisible","open","sendInitToIframe","requestClose","reason","runGuards","afterClosed","addBeforeClose","guard","handleBeforeClose","done","ElMessageBox","onClosed","refreshDataGrid","iframeRef","targetOrigin","computed","isAllowedOrigin","eventOrigin","setIframeRef","el","sendToIframe","type","payload","msg","onBridgeMessage","event","data","_a","resolve","requestId","handler","e","_b","onMounted","onBeforeUnmount","provideContainer","__props","__emit","iframeKey","newRef","resolvedSize","resolvedUrl","qs","acc","k","v","__expose","_openBlock","_createBlock","_component_el_drawer","_mergeProps","_unref","$event","$attrs","_createSlots","_createElementBlock","_renderSlot","_ctx","$slots","_component_el_dialog"],"mappings":"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"}