workdesktop-ai 1.1.1 → 1.2.0

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 (98) hide show
  1. package/CHANGELOG.md +31 -6
  2. package/README.md +16 -6
  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-CH_B3jbO.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-CH_B3jbO.mjs.map} +1 -1
  9. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs → AutoComplete-6yrCFGZ5.mjs} +2 -2
  10. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs.map → AutoComplete-6yrCFGZ5.mjs.map} +1 -1
  11. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs → CheckboxList-ChmfF6zs.mjs} +2 -2
  12. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs.map → CheckboxList-ChmfF6zs.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-D9ZUQB7V.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-D9ZUQB7V.mjs.map} +1 -1
  15. package/dist/chunks/{DataForm-C5MBVdei.mjs → DataForm-Rsa1PT-X.mjs} +16 -16
  16. package/dist/chunks/{DataForm-C5MBVdei.mjs.map → DataForm-Rsa1PT-X.mjs.map} +1 -1
  17. package/dist/chunks/{DataGrid-HUzKWuQx.mjs → DataGrid-DzbJpT43.mjs} +4 -4
  18. package/dist/chunks/{DataGrid-HUzKWuQx.mjs.map → DataGrid-DzbJpT43.mjs.map} +1 -1
  19. package/dist/chunks/{EditableGrid-C8A-nJZv.mjs → EditableGrid-C-0uy89H.mjs} +330 -333
  20. package/dist/chunks/EditableGrid-C-0uy89H.mjs.map +1 -0
  21. package/dist/chunks/{ImageUpload-DGehzaYa.mjs → ImageUpload-CrDyIjWC.mjs} +2 -2
  22. package/dist/chunks/{ImageUpload-DGehzaYa.mjs.map → ImageUpload-CrDyIjWC.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/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs → PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs} +2 -2
  26. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs.map} +1 -1
  27. package/dist/chunks/{RadioList-vE8JOuST.mjs → RadioList-BIwUZ6lm.mjs} +2 -2
  28. package/dist/chunks/{RadioList-vE8JOuST.mjs.map → RadioList-BIwUZ6lm.mjs.map} +1 -1
  29. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs → Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs} +2 -2
  30. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map → Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs.map} +1 -1
  31. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs → SearchPanel-DPlWWuXb.mjs} +2 -2
  32. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs.map → SearchPanel-DPlWWuXb.mjs.map} +1 -1
  33. package/dist/chunks/{Select-DAGZDXvI.mjs → Select-DlJ9U0nE.mjs} +2 -2
  34. package/dist/chunks/{Select-DAGZDXvI.mjs.map → Select-DlJ9U0nE.mjs.map} +1 -1
  35. package/dist/chunks/{Station-BF_QlQ8c.mjs → Station-CrMTjqfa.mjs} +2 -2
  36. package/dist/chunks/{Station-BF_QlQ8c.mjs.map → Station-CrMTjqfa.mjs.map} +1 -1
  37. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs → Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs} +2 -2
  38. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map → Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs.map} +1 -1
  39. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs → Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs} +2 -2
  40. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map → Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs.map} +1 -1
  41. package/dist/chunks/{Viewer-iub6TjoD.mjs → Viewer-DcMSN3_1.mjs} +2 -2
  42. package/dist/chunks/{Viewer-iub6TjoD.mjs.map → Viewer-DcMSN3_1.mjs.map} +1 -1
  43. package/dist/chunks/http-9ToPNkWJ.mjs +4026 -0
  44. package/dist/chunks/http-9ToPNkWJ.mjs.map +1 -0
  45. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs → useApiAction-BetCGQrx.mjs} +2 -2
  46. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs.map → useApiAction-BetCGQrx.mjs.map} +1 -1
  47. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs → useColumnSettings-CnXeA0k7.mjs} +2 -2
  48. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs.map → useColumnSettings-CnXeA0k7.mjs.map} +1 -1
  49. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs → useOptionsLoader-BwRdHDPL.mjs} +2 -2
  50. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs.map → useOptionsLoader-BwRdHDPL.mjs.map} +1 -1
  51. package/dist/confirm-button/index.mjs +1 -1
  52. package/dist/data-form/index.mjs +1 -1
  53. package/dist/data-form/style.css +1 -1
  54. package/dist/data-grid/index.mjs +1 -1
  55. package/dist/data-grid/style.css +1 -1
  56. package/dist/editable-grid/index.mjs +1 -1
  57. package/dist/editable-grid/style.css +1 -1
  58. package/dist/image-upload/index.mjs +1 -1
  59. package/dist/index.esm.js +106 -103
  60. package/dist/index.umd.js +605 -18
  61. package/dist/index.umd.js.map +1 -1
  62. package/dist/panel/index.mjs +1 -1
  63. package/dist/panel/style.css +1 -1
  64. package/dist/prompt-button/index.mjs +1 -1
  65. package/dist/radio-list/index.mjs +1 -1
  66. package/dist/requester/index.mjs +1 -1
  67. package/dist/search-panel/index.mjs +1 -1
  68. package/dist/search-panel/style.css +1 -1
  69. package/dist/select/index.mjs +1 -1
  70. package/dist/station/index.mjs +1 -1
  71. package/dist/station/style.css +1 -1
  72. package/dist/style.css +1 -1
  73. package/dist/switch/index.mjs +1 -1
  74. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +9 -9
  75. package/dist/types/src/index.d.ts +2 -0
  76. package/dist/types/src/lib/core/skins/apple.d.ts +3 -0
  77. package/dist/types/src/lib/core/skins/business.d.ts +3 -0
  78. package/dist/types/src/lib/core/skins/chinese.d.ts +3 -0
  79. package/dist/types/src/lib/core/skins/cool.d.ts +3 -0
  80. package/dist/types/src/lib/core/skins/cyberpunk.d.ts +3 -0
  81. package/dist/types/src/lib/core/skins/default.d.ts +3 -0
  82. package/dist/types/src/lib/core/skins/fashion.d.ts +3 -0
  83. package/dist/types/src/lib/core/skins/flat.d.ts +3 -0
  84. package/dist/types/src/lib/core/skins/governance.d.ts +3 -0
  85. package/dist/types/src/lib/core/skins/index.d.ts +15 -0
  86. package/dist/types/src/lib/core/skins/tech-brain.d.ts +5 -0
  87. package/dist/types/src/lib/core/skins/tech.d.ts +3 -0
  88. package/dist/types/src/lib/core/skins/types.d.ts +19 -0
  89. package/dist/types/src/lib/core/theme.d.ts +7 -2
  90. package/dist/types/src/types/config.d.ts +4 -0
  91. package/dist/upload/index.mjs +1 -1
  92. package/dist/viewer/index.mjs +1 -1
  93. package/llms.txt +36 -6
  94. package/package.json +1 -1
  95. package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +0 -1
  96. package/dist/chunks/Panel-CrRqBTj6.mjs.map +0 -1
  97. package/dist/chunks/http-Bs-dM076.mjs +0 -2951
  98. package/dist/chunks/http-Bs-dM076.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,12 +4,33 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.1.1] - 2026-09-24
8
+
9
+ 预设皮肤系统与主题能力增强:`theme.skin` 一键套用 11 套预设皮肤,Element Plus 派生色阶自动生成,组件级 CSS 变量回退链全面打通。
10
+
11
+ ### Added
12
+
13
+ - **预设皮肤系统(`theme.skin` 一键套用)**:新增 11 套预设皮肤——`default` / `fashion` / `business` / `tech` / `cyberpunk` / `chinese` / `flat` / `neumorphism` / `gradient` / `cool` / `governance`;通过 `app.use(WorkDesktop, { theme: { skin: 'tech' } })` 或 `setGlobalConfig({ theme: { skin: 'cyberpunk' } })` 一键切换,每套皮肤 = 语义色 + 组件级 CSS 变量整套预设。覆盖优先级 `theme.cssVars > theme.colors > theme.skin`;未传或传入未知皮肤名时 `console.warn` 并回退默认皮肤。主入口新增导出 `SKIN_PRESETS` / `getSkinPreset(key?)` / `listSkins()` 与类型 `SkinPreset` / `SkinName`(`listSkins()` 供设置面板遍历全部预设)。新增 `skins.test.ts` 单测。
14
+ - **Element Plus 派生色阶自动生成**:`resolveTheme` / `applyTheme` 重构——皮肤预设打底,`colors` / `cssVars` 依次覆盖;按 Element Plus 混色公式由语义主色自动推导 `--el-color-{key}-light-3/5/7/8/9` 与 `dark-2` 色阶(`error` 归一为 `danger`),换肤后 EP 组件的 hover / disabled 等派生态同步更新。写入 `:root` 顺序:colors 语义键 → El 派生色阶 → cssVars 精细覆盖。
15
+ - **组件级令牌回退链**:`WdDataGrid` / `WdEditableGrid`(卡片模式)、`WdSearchPanel`、`WdDataForm`(footer)、`WdStation`(aside / header / tabs)、`WdPanel` 等组件样式全部接入组件级 CSS 变量回退链(形如 `var(--wd-panel-bg, var(--wd-bg-color, #fff))`),皮肤可单独定制某个组件而不影响全局;可用令牌见 `src/styles/tokens.css`。
16
+ - **`WdPanel` 新增 `border` prop**(Boolean,默认 `true`):置于嵌套容器内时可传 `:border="false"` 关闭外边框(加 `wd-panel--no-border` 类),配合内容页多容器布局减少边框堆叠。
17
+ - **`ApiButton` 指定 `icon` 时请求期间按钮自动变 loading**:开发人员为按钮设置 `icon`(经 `$attrs` 透传 el-button)后,发起请求期间 el-button 自动进入 loading 加载形式(icon 被 loading 动画替换、按钮加 `is-loading`),严格遵循请求 loading 时机(请求开始置 true、结束置 false);原有的 `buttonLoading`(按钮转圈开关)、`pageLoading`(全局遮罩)与请求事件链路均不受影响。`api-button` 组件页基础用法示例补充带 `icon`(Edit)的「保存配置」按钮演示;新增 `ApiButton.loading.test.ts` 2 个回归用例(请求挂起时按钮 `is-loading` 出现、`button-loading=false` 时不转圈)。
18
+
19
+ ### Changed
20
+
21
+ - package.json `files` 新增 `llms.txt`:AI 参考文档随 npm 包一起发布。
22
+ - 文档站:新增「自定义皮肤」示例与皮肤切换入口(可遍历 11 套预设皮肤),api-meta 同步组件级令牌说明。
23
+
24
+ ## [1.1.0] - 2026-09-17
25
+
26
+ 组件架构整合与能力扩充:容器组件统一为 `WdDrawer`;新增 5 个组件(`WdPopconfirmButton` / `WdStation` / `WdFormItem` / `WdSearchItem` / `WdRequester`),组件总数 24 → 28;新增 27 个 ESM 按需子路径入口。
27
+
7
28
  ### Changed
8
29
 
9
30
  - `WdDialog` 合并进 `WdDrawer`:容器组件统一为一个,通过 `mode="drawer" | "dialog"` 切换(默认 `drawer`);`size` 同时作用于抽屉尺寸与对话框宽度,`direction` 仅抽屉模式生效,`filter` / `headRefreshDatagrid` / 事件 / 插槽保持不变。容器组件由 `WdDialog` / `WdDrawer` 两个合并为一个 `WdDrawer`(组件总数 -1)。
10
31
  - `WdEditableTable`(`<wd-editable-table>`)重命名为 `WdEditableGrid`(`<wd-editable-grid>`),目录 `data/editable-table` → `data/editable-grid`。
11
- - `WdDialogButton`(`<wd-dialog-button>`)合并进 `WdDrawerButton`(`<wd-drawer-button>`):二者仅弹层形式不同,现统一为一个按钮组件,通过 `mode="drawer" | "dialog"` 切换(默认 `drawer`),属性同步统一命名——`drawerTitle`/`dialogTitle` → `title`,`drawerUrl`/`dialogUrl` → `url`,`drawerData`/`dialogData` → `data`;`size`、`direction`(仅抽屉生效)、`filter`、`headRefreshDatagrid`、事件与插槽保持不变。组件总数由 25 调整为 24,按钮组由 7 个调整为 6 个。
12
- - 按钮组文案属性 `text` 改名为 `label`(破坏性):六个按钮组件(`WdApiButton` / `WdConfirmButton` / `WdPromptButton` / `WdRouteButton` / `WdTipsButton` / `WdDrawerButton`)的「按钮文案」属性由 `text` 统一改为 `label`,释放 `text` 给 el-button 原生「文字按钮」布尔语义(经 `$attrs` 透传,原声明截获已移除,`text` 不再作为 String 文案)。调用方需将 `text="文案"` 迁移为 `label="文案"`;el-button 的其它原生属性(`type` / `size` / `plain` / `round` / `circle` / `link` / `disabled` / `icon` / `native-type` 等)继续经 `$attrs` 透传支持,并在各按钮组件文档 Props 表中按「继承自 el-button」逐条列明(API 请求类按钮因内部已绑定 `:loading` 由 `buttonLoading` 控制,不列 `loading`;Route/Tips/Drawer 类含 `loading`)。
32
+ - `WdDrawerButton` 新增 `mode="drawer" | "dialog"`(默认 `drawer`):一个按钮即可打开抽屉或对话框弹层;`WdDialogButton` 保留为 dialog 专用简化版(内部基于 `WdDrawer mode="dialog"`,无 `mode` / `direction`,默认 `type="primary"`,自带 `buttonSize`)。两个按钮属性统一命名(破坏性):`drawerTitle` / `dialogTitle` → `title`,`drawerUrl` / `dialogUrl` → `url`,`drawerData` / `dialogData` → `data`;`size`(弹层宽度)、`direction`(仅抽屉生效)、`filter`、`headRefreshDatagrid`、事件与插槽保持不变。
33
+ - 按钮组文案属性 `text` 改名为 `label`(破坏性):七个按钮组件(`WdApiButton` / `WdConfirmButton` / `WdDialogButton` / `WdPromptButton` / `WdRouteButton` / `WdTipsButton` / `WdDrawerButton`)的「按钮文案」属性由 `text` 统一改为 `label`,释放 `text` 给 el-button 原生「文字按钮」布尔语义(经 `$attrs` 透传,原声明截获已移除,`text` 不再作为 String 文案)。调用方需将 `text="文案"` 迁移为 `label="文案"`;el-button 的其它原生属性(`type` / `size` / `plain` / `round` / `circle` / `link` / `disabled` / `icon` / `native-type` 等)继续经 `$attrs` 透传支持,并在各按钮组件文档 Props 表中按「继承自 el-button」逐条列明(API 请求类按钮因内部已绑定 `:loading` 由 `buttonLoading` 控制,不列 `loading`;Route/Tips/Drawer 类含 `loading`)。
13
34
  - **所有按钮组件均已集成语悬停提示**:和 TipsButton 一样,每个按钮组件都支持 `tips`(提示内容)、`tipsType`(主题)、`placement`(位置)三个属性;当 `tips` 非空时自动用 `el-tooltip` 包裹,无提示则不包裹;现在所有按钮都可按需添加悬停提示,无需额外套一层 tooltip。
14
35
  - **PromptButton 自定义内容插槽**:新增 `#content` 插槽允许开发者自定义弹窗内容(示例中展示了嵌入 `WdDataForm` 实现多字段输入表单);点击确认后默认发起 API 请求,仅当 API 返回包 `success=true` 时自动关闭弹窗,API 请求失败时不关闭弹窗,允许开发者修改错误后重试。新增 `confirm` 事件(自定义内容模式点击确认触发)。
15
36
  - **文档站 mock 改为 HTTP 层(请求真实可见)**:`docs/src/mock` 新增 `createMockHttpHandler`,由 `docs/vite.config.ts` 新增 `wd-mock-server` 插件在 dev server 中间件层拦截 `/mock/*` 返回假数据。开发模式下 `/mock/xxx` 请求**真实发出**(浏览器 Network 面板可见请求 URL、方法、参数与响应),示例数据不受影响;`docs/src/main.ts` 移除 axios adapter 短路(生产构建 `import.meta.env.PROD` 时回退 `createMockAdapter`,保证静态部署后示例仍可演示)。
@@ -17,7 +38,6 @@
17
38
  ### Removed
18
39
 
19
40
  - 移除 `WdDialog` 容器组件及其导出,请改用 `WdDrawer` 并设置 `mode="dialog"`。
20
- - 移除 `WdDialogButton` 组件及其导出,请改用 `WdDrawerButton` 并设置 `mode="dialog"`。
21
41
 
22
42
  ### Fixed
23
43
 
@@ -38,7 +58,7 @@
38
58
  - **修复 datagrid 示例操作列 el-button-group 样式错乱**:原示例把 `<el-button>` 放进 DrawerButton 的 `#button` 内容插槽,渲染出「button 嵌套 button」的非法 HTML,导致 group 内按钮尺寸/样式错乱。已改为 `label` + `type` + `button-size` 属性式写法,group 内两个按钮(详情 + 删除)尺寸一致、圆角衔接、边框合并、分割色全部正确(Playwright 实测验证)。
39
59
 
40
60
  - **全部按钮组件支持 `el-button-group` 连排使用**:8 个 Wd 按钮组件(Api / Confirm / Popconfirm / Prompt / Route / Tips / Drawer / DialogButton)渲染根 DOM 均为 `button.el-button`(含 el-tooltip / el-popconfirm 包裹时 trigger 即按钮),天然命中 Element Plus `.el-button-group > .el-button` 样式——首尾圆角衔接、相邻 `margin-right:-1px` 边框合并、type 分割边框色、hover/active z-index 均与原生 el-button 一致;弹层类按钮(抽屉/对话框/气泡确认/提示)在 group 内点击能力不受影响。`api-button` 组件页新增「按钮组(el-button-group)」示例,混合 5 种按钮演示;`datagrid` 示例的操作列(详情 + 删除)同样使用 group。
41
- - **`WdPopconfirmButton`(`<wd-popconfirm-button>`)新增组件**:基于 ApiButton 请求逻辑与 el-popconfirm 气泡确认封装——点击按钮弹出气泡确认,用户点击「确定」后自动请求 API(loading、成功/失败提示、`apiSuccess` 事件与声明式 DataGrid 刷新均复用按钮组请求链路)。集成属性:el-button 全属性(`$attrs` 透传,文档列明)、TipsButton 悬停提示(`tips`/`tipsType`/`placement`)、el-popconfirm 常用属性(`title`、`confirmButtonText`、`cancelButtonText`、`confirmButtonType`、`cancelButtonType`、`width`、`trigger`、`popperClass`、`teleported` 等;其中 `icon`→`popIcon`、`disabled`→`popDisabled` 以避免与 el-button 同名透传冲突)。事件:`click`/`confirm`/`cancel`/`show`/`hide` + 请求事件 `apiBefore`/`apiSuccess`/`apiFail`/`apiException`/`apiAfter`。**同时支持悬停提示**:el-tooltip 与 el-popconfirm 采用平级 `virtual-ref` 方案(均以 `virtual-ref` 指向同一按钮,互不嵌套),hover 显示提示、click 弹出确认,两者互不冲突、控制台零警告(嵌套方案会触发 EP `[ElOnlyChild]` / runtime directive 警告且外层弹层事件失效)。组件总数 26→27,按钮组 7→8(文档新增 popconfirm-button 页与示例)。
61
+ - **`WdPopconfirmButton`(`<wd-popconfirm-button>`)新增组件**:基于 ApiButton 请求逻辑与 el-popconfirm 气泡确认封装——点击按钮弹出气泡确认,用户点击「确定」后自动请求 API(loading、成功/失败提示、`apiSuccess` 事件与声明式 DataGrid 刷新均复用按钮组请求链路)。集成属性:el-button 全属性(`$attrs` 透传,文档列明)、TipsButton 悬停提示(`tips`/`tipsType`/`placement`)、el-popconfirm 常用属性(`title`、`confirmButtonText`、`cancelButtonText`、`confirmButtonType`、`cancelButtonType`、`width`、`trigger`、`popperClass`、`teleported` 等;其中 `icon`→`popIcon`、`disabled`→`popDisabled` 以避免与 el-button 同名透传冲突)。事件:`click`/`confirm`/`cancel`/`show`/`hide` + 请求事件 `apiBefore`/`apiSuccess`/`apiFail`/`apiException`/`apiAfter`。**同时支持悬停提示**:el-tooltip 与 el-popconfirm 采用平级 `virtual-ref` 方案(均以 `virtual-ref` 指向同一按钮,互不嵌套),hover 显示提示、click 弹出确认,两者互不冲突、控制台零警告(嵌套方案会触发 EP `[ElOnlyChild]` / runtime directive 警告且外层弹层事件失效)。按钮组 7→8(文档新增 popconfirm-button 页与示例)。
42
62
 
43
63
  - `WdEditableGrid` 完整集成 DataGrid 全部能力:API/静态双数据源(`api` / `dataSource` / `modelValue`)、分页、工具栏 tools(刷新/尺寸/列设置/模式切换)、高度模式(`height="fix"` / 固定高度 / 自适应)、表格/卡片模式切换、动态列设置(配置列与插槽列合并,localStorage 持久化)、行合并、树形、多选、`rowActions` 只读操作列、SearchPanel / `refreshDataGrid` 联动注册;同时保留可编辑能力:`columns` 配置驱动可编辑列、cell/row 双编辑模式、脏行跟踪、required + 自定义校验、`saveApi` 批量保存、新增/删除行。
44
64
  - `WdEditableGrid` 新增单元格级「已修改」样式:进入编辑时记录该行基线,单元格当前值若与基线不一致(判定为用户编辑过)即自动标识(默认单元格最右侧显示红色感叹号小图标 `.is-dirty`,可自定义);改回原值或取消 / 保存成功后样式自动消失。脏状态粒度由整行细化到单元格。标识样式通过 CSS 变量自定义,默认:
@@ -66,9 +86,12 @@
66
86
  ```
67
87
  批量保存与行内保存前先校验,失败即中断并 `ElMessage.warning` 提示 + 触发 `validate-fail` 事件(携带 `{ index, row, column, error }`),不发起保存请求。`required` / 自定义 `validator` 兼容沿用。
68
88
  - `useColumnSettings` 新增 `initMetas(metas)`,支持以列元信息(而非插槽 vnode)初始化动态列设置,供 columns 配置驱动的组件复用。
69
- - **`WdStation`(`<wd-station>`)新增组件**:中后台外框架组件,一个组件产出「logo + 分导台 + 菜单 + 内容区 + 工具栏 + 底部信息栏」完整骨架。顶栏中央二选一(`headerMode`):流式块状菜单分组切换条(分导台,点击后左侧菜单整体更换)或标题文案;统一菜单模型——优先 `menuGroups`(分组+菜单树),也接受扁平 `menus` 按 `groupKey||group` 自动聚合归一(无组归「默认」组、分导台自动隐藏),数组/对象属性均接受 JSON 字符串入参(UMD/HTML 场景降级);菜单三态 `menuMode`(side 左侧多层建议两层 / top 顶部 / none 不启用),折叠按钮固定分导台最左侧、侧栏收缩 logo 跟随收窄;内容区 `contentMode`(page 单页 / tabs 标签页,affix 固定标签、关闭跳相邻、`v-model:open-tabs` 受控)× `routerMode`(auto 检测 `$router` 自动走 router push + RouterView,否则降级 HTML 仅抛事件);工具栏 refresh/settings/user/login 四点位经 `toolbarConfig` 各自调 left/right/none;底部 `copyright` + `footerInfo`(`v-model:footer-info`)动态信息。新增 `lib/core/station-linkage` 注册中心,命令式导出 `registerStation` / `setStationFooter(target, info)` / `refreshStationView(target)`(target 语义复用联动心智:true 同 filter 组、字符串定向组)。暴露 `refresh()` / `openTab(item)` / `closeTab(key)`。组件总数 27→28(新增 layout 布局组),ESM 按需子入口 26→27(`workdesktop-ai/station`),文档站新增「布局组件」分组与 6 个示例,集成测试 21 用例。
89
+ - **`WdStation`(`<wd-station>`)新增组件**:中后台外框架组件,一个组件产出「logo + 分导台 + 菜单 + 内容区 + 工具栏 + 底部信息栏」完整骨架。顶栏中央二选一(`headerMode`):流式块状菜单分组切换条(分导台,点击后左侧菜单整体更换)或标题文案;统一菜单模型——优先 `menuGroups`(分组+菜单树),也接受扁平 `menus` 按 `groupKey||group` 自动聚合归一(无组归「默认」组、分导台自动隐藏),数组/对象属性均接受 JSON 字符串入参(UMD/HTML 场景降级);菜单三态 `menuMode`(side 左侧多层建议两层 / top 顶部 / none 不启用),折叠按钮固定分导台最左侧、侧栏收缩 logo 跟随收窄;内容区 `contentMode`(page 单页 / tabs 标签页,affix 固定标签、关闭跳相邻、`v-model:open-tabs` 受控)× `routerMode`(auto 检测 `$router` 自动走 router push + RouterView,否则降级 HTML 仅抛事件);工具栏 refresh/settings/user/login 四点位经 `toolbarConfig` 各自调 left/right/none;底部 `copyright` + `footerInfo`(`v-model:footer-info`)动态信息。新增 `lib/core/station-linkage` 注册中心,命令式导出 `registerStation` / `setStationFooter(target, info)` / `refreshStationView(target)`(target 语义复用联动心智:true 同 filter 组、字符串定向组)。暴露 `refresh()` / `openTab(item)` / `closeTab(key)`。组件分组新增 layout 布局组,按需子入口新增 `workdesktop-ai/station`,文档站新增「布局组件」分组与 6 个示例,集成测试 21 用例。
70
90
  - `WdStation` 顶栏中央区由居中改为**左对齐**:左位/右位按内容宽度收缩,中央区 `flex:1` 占满剩余空间,分导台块状项 / 标题文案从左侧起排。
71
91
  - `WdStation` tabs 条样式与交互增强:tabs 条整宽撑满内容列(el-tabs `flex:1`),消除 nav 左/上边框与 header 底线(底线由外层容器统一承担),tab 间保留分隔线;条最右侧新增下拉按钮,内置「关闭当前标签 / 关闭左侧标签 / 关闭其他标签 / 关闭所有标签」批量操作——`affix` 标签永不关闭,无可关对象时对应菜单项禁用,批量关闭逐个触发 `tab-close`,激活标签被关闭后跳转原位置相邻标签。集成测试扩为 22 用例。
92
+ - **`WdFormItem`(`<wd-form-item>`)与 `WdSearchItem`(`<wd-search-item>`)新增组件**:表单项包装器(`label` / `prop` / `tip` / `tipPlacement = 'top'`),`$attrs` 透传 `el-form-item`;`WdSearchItem` 为 SearchPanel 内的语义化别名。均有按需子入口(`form-item` / `search-item`)。
93
+ - **`WdRequester`(`<wd-requester>`)新增组件**:命令式请求器——`v-model` 置 true 触发一次请求后自动回 false(一次性开关语义),新请求自动静默中断旧请求;`method` / `reqOptions` 支持 `page.componentDefault.WdRequester` 全局覆盖;事件 `apiBefore`(可中断)/ `apiSuccess` / `apiFail` / `apiException` / `apiAfter`。
94
+ - **ESM 按需子路径入口(27 个)**:每个组件一个子路径 `workdesktop-ai/<subpath>`(含 types + ESM `.mjs`),14 个有独立样式的组件同步产出 `<subpath>/style.css`(按需引入:`base.css` + 对应组件样式);主入口全量引入方式不变。
72
95
 
73
96
  ## [1.0.2] - 2026-09-06
74
97
 
@@ -149,7 +172,9 @@
149
172
  - 测试体系:vitest + @vue/test-utils,基础设施单测 87 用例 + DataGrid/DataForm 集成 19 用例,基础库行覆盖率 98%。
150
173
  - 中文内置文案,语义化版本与开源配置(MIT)。
151
174
 
152
- [Unreleased]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.2...HEAD
175
+ [Unreleased]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.1.1...HEAD
176
+ [1.1.1]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.1.0...v1.1.1
177
+ [1.1.0]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.2...v1.1.0
153
178
  [1.0.2]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.1...v1.0.2
154
179
  [1.0.1]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.0...v1.0.1
155
180
  [1.0.0]: https://github.com/wordyhuang/workdesktop-ai/releases/tag/v1.0.0
package/README.md CHANGED
@@ -3,13 +3,17 @@
3
3
  <span>企业级 Vue 3 组件库 · 基于 ElementPlus · HTML 模板友好 / AI 编码友好</span>
4
4
  </p>
5
5
 
6
- > 文档版本:V\_1.0 | 创建时间:2026-09-16 22:03:47 | 最后修改时间:2026-09-16 22:03:47
6
+ > 文档版本:V\_1.1 | 创建时间:2026-09-16 22:03:47 | 最后修改时间:2026-09-24 13:44:41
7
7
  > 适用对象:使用本库的开发者(人类阅读;AI 助手请改读 [llms.txt](./llms.txt))
8
8
  > 核心目标:帮助开发者快速了解、安装并上手 WorkDesktop AI
9
- > 文档简述:项目门面说明,覆盖特性、安装、三种引入方式、全局配置、组件总览、请求核心、Hooks 与本地开发指引。当前库版本:v1.0.2
9
+ > 文档简述:项目门面说明,覆盖特性、安装、三种引入方式、全局配置、组件总览、请求核心、Hooks 与本地开发指引。当前库版本:v1.1.1
10
10
 
11
11
  ***
12
12
 
13
+ 本项目的初衷是想让AI在做前端设计的时候拥有更加可控,更加稳定的输出结果。
14
+
15
+ <br />
16
+
13
17
  WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在 ElementPlus 之上做「场景化复合封装」:
14
18
 
15
19
  - **列表一体化**:`DataGrid` 一个组件完成「查询 + 分页 + 工具栏 + 表格 + 列设置 + 卡片/表格切换」;
@@ -27,8 +31,8 @@ WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在
27
31
  | 声明式联动 | 属性(`filter` 分组 + `head-refresh-datagrid` 刷新)+ 事件驱动(A+B 混合),无需引入中心化 DSL |
28
32
  | 组合式 Hooks | `useRequest` / `useDataGrid` / `useConfig` / `useGlobalConfig` / `useEventBus` / `useGlobalState` |
29
33
  | 双产物 + 按需入口 | `dist/index.esm.js` + `dist/index.umd.js` + 27 个组件子路径入口 + 完整 `.d.ts` |
30
- | 开箱主题 | 语义色令牌 + CSS 变量覆盖 + 配置对象生成主题 |
31
- | 测试保障 | vitest + @vue/test-utils:106 用例,基础库行覆盖率 98% |
34
+ | 开箱主题 | 11 套预设皮肤一键套用(`theme.skin`)+ 语义色令牌 + El 派生色阶自动推导 + CSS 变量覆盖(优先级 cssVars > colors > skin) |
35
+ | 测试保障 | vitest + @vue/test-utils:237 用例全通过,行覆盖率 96.6%(阈值 lines/funcs ≥ 80%,branches ≥ 70%) |
32
36
 
33
37
  ## 安装
34
38
 
@@ -175,8 +179,9 @@ app.use(WorkDesktop, {
175
179
  WdDataForm: { submitApi: '/save' }
176
180
  }
177
181
  },
178
- // 主题
179
- theme: { colors: { primary: '#2f6bff' }, cssVars: { '--wd-radius': '8px' } }
182
+ // 主题:skin 一键套用预设皮肤(11 套可选),colors / cssVars 在其上继续覆盖
183
+ // 覆盖优先级:cssVars > colors > skin;colors 改动会自动推导 El 浅/深色阶
184
+ theme: { skin: 'default', colors: { primary: '#2f6bff' }, cssVars: { '--wd-radius': '8px' } }
180
185
  })
181
186
  ```
182
187
 
@@ -301,6 +306,11 @@ python -m http.server 8000
301
306
 
302
307
  ## 版本变化
303
308
 
309
+ - **V\_1.1**(2026-09-24 13:44:41):对齐库版本 v1.1.1。相对 V\_1.0 的变化:
310
+ 1. 头部库版本 v1.0.2 → v1.1.1;
311
+ 2. 特性表「开箱主题」补充 1.1.1 新增的 11 套预设皮肤(`theme.skin`)与 El 派生色阶自动推导;
312
+ 3. 全局配置示例 `theme` 补充 `skin` 用法与覆盖优先级说明;
313
+ 4. 特性表「测试保障」用例数按当前真实运行结果更新(106 → 237)。
304
314
  - **V\_1.0**(2026-09-16 22:03:47):首次建立带版本标注的 README。相对旧版的变化:
305
315
  1. 组件总数 25 → 28(按 `src/components/index.ts` 实际导出核对);
306
316
  2. 「组件总览」按源码分组重排:`WdViewer` 归入数据组、`WdSearchPanel`/`WdFormItem`/`WdSearchItem` 归入表单组,补齐旧版遗漏的 `WdRequester`、`WdFormItem`、`WdSearchItem`、`WdDialogButton`、`WdPopconfirmButton`、`WdStation`;
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { _ as o } from "../chunks/ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs";
2
+ import { _ as o } from "../chunks/ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs";
3
3
  export {
4
4
  o as WdApiButton,
5
5
  o as default
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as e } from "../chunks/AutoComplete-CLV_PwcZ.mjs";
2
+ import { W as e } from "../chunks/AutoComplete-6yrCFGZ5.mjs";
3
3
  export {
4
4
  e as WdAutoComplete,
5
5
  e as default
package/dist/base.css CHANGED
@@ -1 +1 @@
1
- :root{--wd-color-primary: #1677ff;--wd-color-success: #67c23a;--wd-color-warning: #e6a23c;--wd-color-danger: #f56c6c;--wd-color-info: #909399;--wd-text-color-primary: #24272c;--wd-text-color-regular: #555b63;--wd-text-color-secondary: #909399;--wd-text-color-placeholder: #a8abb2;--wd-border-color: #d8dde5;--wd-border-color-light: #e5e8ef;--wd-bg-color: #ffffff;--wd-bg-color-page: #f4f6fa;--wd-bg-color-overlay: #ffffff;--wd-size-default: 32px;--wd-size-large: 40px;--wd-size-small: 24px;--wd-radius-base: 6px;--wd-radius-small: 4px;--wd-spacing-base: 12px;--wd-spacing-large: 16px;--wd-font-size-base: 14px;--wd-font-size-small: 12px;--wd-font-size-large: 16px;--wd-z-index-popup: 2000}:root{--el-color-primary: var(--wd-color-primary);--el-color-primary-dark-2: #125fcc;--el-color-primary-light-3: #5ca0ff;--el-color-primary-light-5: #8bbbff;--el-color-primary-light-7: #b9d6ff;--el-color-primary-light-8: #d0e4ff;--el-color-primary-light-9: #e8f1ff;--el-color-success: var(--wd-color-success);--el-color-warning: var(--wd-color-warning);--el-color-danger: var(--wd-color-danger);--el-color-error: var(--wd-color-danger);--el-color-info: var(--wd-color-info);--el-text-color-primary: var(--wd-text-color-primary);--el-text-color-regular: var(--wd-text-color-regular);--el-border-color: var(--wd-border-color);--el-border-color-light: var(--wd-border-color-light);--el-bg-color: var(--wd-bg-color);--el-bg-color-page: var(--wd-bg-color-page);--el-bg-color-overlay: var(--wd-bg-color-overlay);--el-font-size-base: var(--wd-font-size-base);--el-border-radius-base: var(--wd-radius-base)}
1
+ :root{--wd-color-primary: #1677ff;--wd-color-success: #67c23a;--wd-color-warning: #e6a23c;--wd-color-danger: #f56c6c;--wd-color-info: #909399;--wd-text-color-primary: #24272c;--wd-text-color-regular: #555b63;--wd-text-color-secondary: #909399;--wd-text-color-placeholder: #a8abb2;--wd-border-color: #d8dde5;--wd-border-color-light: #e5e8ef;--wd-border-width: 1px;--wd-border-style: solid;--wd-bg-color: #ffffff;--wd-bg-color-page: #f4f6fa;--wd-bg-color-overlay: #ffffff;--wd-size-default: 32px;--wd-size-large: 40px;--wd-size-small: 24px;--wd-radius-base: 6px;--wd-radius-small: 4px;--wd-spacing-base: 12px;--wd-spacing-large: 16px;--wd-font-size-base: 14px;--wd-font-size-small: 12px;--wd-font-size-large: 16px;--wd-z-index-popup: 2000}:root{--el-color-primary: var(--wd-color-primary);--el-color-primary-dark-2: #125fcc;--el-color-primary-light-3: #5ca0ff;--el-color-primary-light-5: #8bbbff;--el-color-primary-light-7: #b9d6ff;--el-color-primary-light-8: #d0e4ff;--el-color-primary-light-9: #e8f1ff;--el-color-success: var(--wd-color-success);--el-color-warning: var(--wd-color-warning);--el-color-danger: var(--wd-color-danger);--el-color-error: var(--wd-color-danger);--el-color-info: var(--wd-color-info);--el-text-color-primary: var(--wd-text-color-primary);--el-text-color-regular: var(--wd-text-color-regular);--el-text-color-secondary: var(--wd-text-color-secondary);--el-text-color-placeholder: var(--wd-text-color-placeholder);--el-border-color: var(--wd-border-color);--el-border-color-light: var(--wd-border-color-light);--el-border-color-hover: var(--wd-border-color);--el-border-width: var(--wd-border-width);--el-border-style: var(--wd-border-style);--el-bg-color: var(--wd-bg-color);--el-bg-color-page: var(--wd-bg-color-page);--el-bg-color-overlay: var(--wd-bg-color-overlay);--el-fill-color-blank: var(--wd-bg-color);--el-font-size-base: var(--wd-font-size-base);--el-border-radius-base: var(--wd-radius-base);--el-border-radius-small: var(--wd-radius-small)}
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as r } from "../chunks/CheckboxList-Bx3Ce1q5.mjs";
2
+ import { W as r } from "../chunks/CheckboxList-ChmfF6zs.mjs";
3
3
  export {
4
4
  r as WdCheckboxList,
5
5
  r as default
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as k, resolveComponent as r, openBlock as s, createBlock as l, withCtx as o, createVNode as y, mergeProps as d, unref as f, renderSlot as c, createTextVNode as u, toDisplayString as g } from "vue";
2
- import { u as A } from "./useApiAction-6_vvf5Fd.mjs";
2
+ import { u as A } from "./useApiAction-BetCGQrx.mjs";
3
3
  import { t as B, b as L, a as _, h as R, f as C } from "./props-DAytpx7D.mjs";
4
4
  const T = /* @__PURE__ */ k({
5
5
  name: "WdApiButton",
@@ -77,4 +77,4 @@ const T = /* @__PURE__ */ k({
77
77
  export {
78
78
  T as _
79
79
  };
80
- //# sourceMappingURL=ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map
80
+ //# sourceMappingURL=ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs","sources":["../../src/components/buttons/ApiButton.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 v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdApiButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 按钮级 loading(默认 true);false 时按钮不转圈 */\r\n buttonLoading: { type: Boolean, default: true },\r\n /** 页面级 loading(全局遮罩 ElLoading) */\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n await doRequest()\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","loading","doRequest","useApiAction","onClick","event","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,UAAMA,IAAQC,GAYRC,IAAOC,GASP,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMN,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeO,EAAQC,GAAmB;AACxC,MAAAN,EAAK,SAASM,CAAK,GACnB,MAAMH,EAAA;AAAA,IACR;;;aAvDUI,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAd,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBY,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAd,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBY,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
1
+ {"version":3,"file":"ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs","sources":["../../src/components/buttons/ApiButton.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 v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdApiButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 按钮级 loading(默认 true);false 时按钮不转圈 */\r\n buttonLoading: { type: Boolean, default: true },\r\n /** 页面级 loading(全局遮罩 ElLoading) */\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n await doRequest()\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","loading","doRequest","useApiAction","onClick","event","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,UAAMA,IAAQC,GAYRC,IAAOC,GASP,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMN,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeO,EAAQC,GAAmB;AACxC,MAAAN,EAAK,SAASM,CAAK,GACnB,MAAMH,EAAA;AAAA,IACR;;;aAvDUI,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAd,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBY,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAd,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBY,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as h, toRefs as S, computed as w, resolveComponent as K, resolveDirective as V, withDirectives as C, openBlock as P, createElementBlock as k, createVNode as x, mergeProps as D, withCtx as _, renderSlot as A, createElementVNode as b, toDisplayString as B, unref as L } from "vue";
2
- import { u as W } from "./useOptionsLoader-Bi8oqNbG.mjs";
2
+ import { u as W } from "./useOptionsLoader-BwRdHDPL.mjs";
3
3
  import { o as E } from "./props-DAytpx7D.mjs";
4
4
  import { _ as M } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
5
5
  const N = { class: "wd-auto-complete" }, O = /* @__PURE__ */ h({
@@ -77,4 +77,4 @@ const N = { class: "wd-auto-complete" }, O = /* @__PURE__ */ h({
77
77
  export {
78
78
  U as W
79
79
  };
80
- //# sourceMappingURL=AutoComplete-CLV_PwcZ.mjs.map
80
+ //# sourceMappingURL=AutoComplete-6yrCFGZ5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutoComplete-CLV_PwcZ.mjs","sources":["../../src/components/inputs/AutoComplete.vue"],"sourcesContent":["<template>\n <div v-loading=\"loading\" class=\"wd-auto-complete\">\n <el-autocomplete\n v-model=\"inner\"\n :fetch-suggestions=\"fetchSuggestions\"\n :value-key=\"labelKey\"\n v-bind=\"$attrs\"\n @select=\"onSelect\"\n @change=\"onChange\"\n >\n <template #default=\"{ item }\">\n <slot :option=\"item.raw\" :text=\"item[valueKey]\" :value=\"item[valueKey]\">\n <span>{{ item[labelKey] }}</span>\n </slot>\n </template>\n </el-autocomplete>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdAutoComplete', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: String, default: '' },\n /** 选项值字段 */\n valueKey: { type: String, default: 'value' },\n /** 选项显示字段 */\n labelKey: { type: String, default: 'text' },\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'select', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch, fetchOptions } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\n/** el-autocomplete 回调式建议加载 */\nasync function fetchSuggestions(query: string, cb: (results: any[]) => void) {\n if (props.api && props.active) {\n await remoteSearch(query, props.keywordKey)\n } else if (!options.value.length) {\n await fetchOptions()\n }\n // 本地过滤\n const list = options.value.filter((o) =>\n query ? String(o.text).toLowerCase().includes(String(query).toLowerCase()) : true\n )\n cb(list as any)\n}\n\nfunction onSelect(item: any) {\n emit('update:modelValue', item[props.valueKey])\n emit('select', item.raw)\n emit('change', item[props.valueKey])\n}\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-auto-complete {\n width: 100%;\n}\n.wd-auto-complete :deep(.el-autocomplete) {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","fetchOptions","useOptionsLoader","inner","computed","val","fetchSuggestions","query","cb","list","o","onSelect","item","onChange","_withDirectives","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_autocomplete","_mergeProps","$event","$attrs","_withCtx","_renderSlot","_ctx","_createElementVNode","_toDisplayString","_unref"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BA,UAAMA,IAAQC,GAURC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,GAAc,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MACxE,KAAKN,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKS,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMZ,EAAM;AAAA,MACjB,KAAK,CAACa,MAAQX,EAAK,qBAAqBW,CAAG;AAAA,IAAA,CAC5C;AAGD,mBAAeC,EAAiBC,GAAeC,GAA8B;AAC3E,MAAIhB,EAAM,OAAOA,EAAM,SACrB,MAAMQ,EAAaO,GAAOf,EAAM,UAAU,IAChCM,EAAQ,MAAM,UACxB,MAAMG,EAAA;AAGR,YAAMQ,IAAOX,EAAQ,MAAM;AAAA,QAAO,CAACY,MACjCH,IAAQ,OAAOG,EAAE,IAAI,EAAE,YAAA,EAAc,SAAS,OAAOH,CAAK,EAAE,YAAA,CAAa,IAAI;AAAA,MAAA;AAE/E,MAAAC,EAAGC,CAAW;AAAA,IAChB;AAEA,aAASE,EAASC,GAAW;AAC3B,MAAAlB,EAAK,qBAAqBkB,EAAKpB,EAAM,QAAQ,CAAC,GAC9CE,EAAK,UAAUkB,EAAK,GAAG,GACvBlB,EAAK,UAAUkB,EAAKpB,EAAM,QAAQ,CAAC;AAAA,IACrC;AAEA,aAASqB,EAASR,GAAU;AAC1B,MAAAX,EAAK,UAAUW,CAAG;AAAA,IACpB;;;AA9EE,aAAAS,GAAAC,EAAA,GAAAC,EAeM,OAfNC,GAeM;AAAA,QAdJC,EAakBC,GAblBC,EAakB;AAAA,sBAZPjB,EAAA;AAAA,wDAAAA,EAAK,QAAAkB;AAAA,UACb,qBAAmBf;AAAA,UACnB,aAAWb,EAAA;AAAA,QAAA,GACJ6B,EAAAA,QAAM;AAAA,UACb,UAAAX;AAAA,UACA,UAAAE;AAAA,QAAA;UAEU,SAAOU,EAChB,CAEO,EAHa,MAAAX,QAAI;AAAA,YACxBY,EAEOC,EAAA,QAAA,WAAA;AAAA,cAFA,QAAQb,EAAK;AAAA,cAAM,MAAMA,EAAKnB,EAAA,QAAQ;AAAA,cAAI,OAAOmB,EAAKnB,EAAA,QAAQ;AAAA,YAAA,GAArE,MAEO;AAAA,cADLiC,EAAiC,QAAA,MAAAC,EAAxBf,EAAKnB,EAAA,QAAQ,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;YAXdmC,EAAA7B,CAAA,CAAO;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"AutoComplete-6yrCFGZ5.mjs","sources":["../../src/components/inputs/AutoComplete.vue"],"sourcesContent":["<template>\n <div v-loading=\"loading\" class=\"wd-auto-complete\">\n <el-autocomplete\n v-model=\"inner\"\n :fetch-suggestions=\"fetchSuggestions\"\n :value-key=\"labelKey\"\n v-bind=\"$attrs\"\n @select=\"onSelect\"\n @change=\"onChange\"\n >\n <template #default=\"{ item }\">\n <slot :option=\"item.raw\" :text=\"item[valueKey]\" :value=\"item[valueKey]\">\n <span>{{ item[labelKey] }}</span>\n </slot>\n </template>\n </el-autocomplete>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdAutoComplete', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: String, default: '' },\n /** 选项值字段 */\n valueKey: { type: String, default: 'value' },\n /** 选项显示字段 */\n labelKey: { type: String, default: 'text' },\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'select', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch, fetchOptions } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\n/** el-autocomplete 回调式建议加载 */\nasync function fetchSuggestions(query: string, cb: (results: any[]) => void) {\n if (props.api && props.active) {\n await remoteSearch(query, props.keywordKey)\n } else if (!options.value.length) {\n await fetchOptions()\n }\n // 本地过滤\n const list = options.value.filter((o) =>\n query ? String(o.text).toLowerCase().includes(String(query).toLowerCase()) : true\n )\n cb(list as any)\n}\n\nfunction onSelect(item: any) {\n emit('update:modelValue', item[props.valueKey])\n emit('select', item.raw)\n emit('change', item[props.valueKey])\n}\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-auto-complete {\n width: 100%;\n}\n.wd-auto-complete :deep(.el-autocomplete) {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","fetchOptions","useOptionsLoader","inner","computed","val","fetchSuggestions","query","cb","list","o","onSelect","item","onChange","_withDirectives","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_autocomplete","_mergeProps","$event","$attrs","_withCtx","_renderSlot","_ctx","_createElementVNode","_toDisplayString","_unref"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BA,UAAMA,IAAQC,GAURC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,GAAc,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MACxE,KAAKN,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKS,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMZ,EAAM;AAAA,MACjB,KAAK,CAACa,MAAQX,EAAK,qBAAqBW,CAAG;AAAA,IAAA,CAC5C;AAGD,mBAAeC,EAAiBC,GAAeC,GAA8B;AAC3E,MAAIhB,EAAM,OAAOA,EAAM,SACrB,MAAMQ,EAAaO,GAAOf,EAAM,UAAU,IAChCM,EAAQ,MAAM,UACxB,MAAMG,EAAA;AAGR,YAAMQ,IAAOX,EAAQ,MAAM;AAAA,QAAO,CAACY,MACjCH,IAAQ,OAAOG,EAAE,IAAI,EAAE,YAAA,EAAc,SAAS,OAAOH,CAAK,EAAE,YAAA,CAAa,IAAI;AAAA,MAAA;AAE/E,MAAAC,EAAGC,CAAW;AAAA,IAChB;AAEA,aAASE,EAASC,GAAW;AAC3B,MAAAlB,EAAK,qBAAqBkB,EAAKpB,EAAM,QAAQ,CAAC,GAC9CE,EAAK,UAAUkB,EAAK,GAAG,GACvBlB,EAAK,UAAUkB,EAAKpB,EAAM,QAAQ,CAAC;AAAA,IACrC;AAEA,aAASqB,EAASR,GAAU;AAC1B,MAAAX,EAAK,UAAUW,CAAG;AAAA,IACpB;;;AA9EE,aAAAS,GAAAC,EAAA,GAAAC,EAeM,OAfNC,GAeM;AAAA,QAdJC,EAakBC,GAblBC,EAakB;AAAA,sBAZPjB,EAAA;AAAA,wDAAAA,EAAK,QAAAkB;AAAA,UACb,qBAAmBf;AAAA,UACnB,aAAWb,EAAA;AAAA,QAAA,GACJ6B,EAAAA,QAAM;AAAA,UACb,UAAAX;AAAA,UACA,UAAAE;AAAA,QAAA;UAEU,SAAOU,EAChB,CAEO,EAHa,MAAAX,QAAI;AAAA,YACxBY,EAEOC,EAAA,QAAA,WAAA;AAAA,cAFA,QAAQb,EAAK;AAAA,cAAM,MAAMA,EAAKnB,EAAA,QAAQ;AAAA,cAAI,OAAOmB,EAAKnB,EAAA,QAAQ;AAAA,YAAA,GAArE,MAEO;AAAA,cADLiC,EAAiC,QAAA,MAAAC,EAAxBf,EAAKnB,EAAA,QAAQ,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;YAXdmC,EAAA7B,CAAA,CAAO;AAAA,MAAA;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as D, toRefs as B, computed as L, resolveComponent as s, resolveDirective as $, withDirectives as A, openBlock as o, createBlock as n, mergeProps as W, withCtx as l, createElementBlock as _, Fragment as x, renderList as E, unref as h, createElementVNode as k, renderSlot as r, createTextVNode as i, toDisplayString as u } from "vue";
2
- import { u as F } from "./useOptionsLoader-Bi8oqNbG.mjs";
2
+ import { u as F } from "./useOptionsLoader-BwRdHDPL.mjs";
3
3
  import { o as M } from "./props-DAytpx7D.mjs";
4
4
  import { _ as N } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
5
5
  const I = { class: "wd-option-text" }, O = { class: "wd-option-text" }, R = /* @__PURE__ */ D({
@@ -126,4 +126,4 @@ const I = { class: "wd-option-text" }, O = { class: "wd-option-text" }, R = /* @
126
126
  export {
127
127
  z as W
128
128
  };
129
- //# sourceMappingURL=CheckboxList-Bx3Ce1q5.mjs.map
129
+ //# sourceMappingURL=CheckboxList-ChmfF6zs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxList-Bx3Ce1q5.mjs","sources":["../../src/components/inputs/CheckboxList.vue"],"sourcesContent":["<template>\n <el-checkbox-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-checkbox-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-checkbox-button>\n <el-checkbox v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-checkbox>\n </template>\n </el-checkbox-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdCheckboxList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: Array as PropType<any[]>, default: () => [] },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_checkbox_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_checkbox_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_checkbox","_hoisted_2"],"mappings":"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"}
1
+ {"version":3,"file":"CheckboxList-ChmfF6zs.mjs","sources":["../../src/components/inputs/CheckboxList.vue"],"sourcesContent":["<template>\n <el-checkbox-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-checkbox-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-checkbox-button>\n <el-checkbox v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-checkbox>\n </template>\n </el-checkbox-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdCheckboxList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: Array as PropType<any[]>, default: () => [] },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_checkbox_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_checkbox_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_checkbox","_hoisted_2"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as B, resolveComponent as l, openBlock as p, createBlock as s, withCtx as a, createVNode as b, mergeProps as c, unref as f, renderSlot as d, createTextVNode as m, toDisplayString as u } from "vue";
2
2
  import { ElMessageBox as P } from "element-plus";
3
- import { u as k } from "./useApiAction-6_vvf5Fd.mjs";
3
+ import { u as k } from "./useApiAction-BetCGQrx.mjs";
4
4
  import { t as C, b as L, a as S, h as _, f as w } from "./props-DAytpx7D.mjs";
5
5
  const M = /* @__PURE__ */ B({
6
6
  name: "WdConfirmButton",
@@ -96,4 +96,4 @@ const M = /* @__PURE__ */ B({
96
96
  export {
97
97
  M as _
98
98
  };
99
- //# sourceMappingURL=ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map
99
+ //# sourceMappingURL=ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs","sources":["../../src/components/buttons/ConfirmButton.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 v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdConfirmButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 确认文案 */\r\n confirmText: { type: String, default: '确认执行该操作?' },\r\n /** 取消按钮文案(空则不显示取消按钮) */\r\n cancelText: { type: String, default: '取消' },\r\n /** 确认框标题 */\r\n confirmTitle: { type: String, default: '提示' },\r\n /** 按钮级 loading */\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'confirm',\r\n 'cancel',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n try {\r\n await ElMessageBox.confirm(props.confirmText, props.confirmTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: props.cancelText,\r\n type: 'warning'\r\n })\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('confirm')\r\n await doRequest()\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","loading","doRequest","useApiAction","onClick","event","ElMessageBox","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAMA,IAAQC,GAiBRC,IAAOC,GAWP,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMN,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeO,EAAQC,GAAmB;AACxC,MAAAN,EAAK,SAASM,CAAK;AACnB,UAAI;AACF,cAAMC,EAAa,QAAQT,EAAM,aAAaA,EAAM,cAAc;AAAA,UAChE,mBAAmB;AAAA,UACnB,kBAAkBA,EAAM;AAAA,UACxB,MAAM;AAAA,QAAA,CACP;AAAA,MACH,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,SAAS,GACd,MAAMG,EAAA;AAAA,IACR;;;aA1EUK,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAf,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBa,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAf,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBa,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
1
+ {"version":3,"file":"ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs","sources":["../../src/components/buttons/ConfirmButton.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 v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdConfirmButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 确认文案 */\r\n confirmText: { type: String, default: '确认执行该操作?' },\r\n /** 取消按钮文案(空则不显示取消按钮) */\r\n cancelText: { type: String, default: '取消' },\r\n /** 确认框标题 */\r\n confirmTitle: { type: String, default: '提示' },\r\n /** 按钮级 loading */\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'confirm',\r\n 'cancel',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n try {\r\n await ElMessageBox.confirm(props.confirmText, props.confirmTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: props.cancelText,\r\n type: 'warning'\r\n })\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('confirm')\r\n await doRequest()\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","loading","doRequest","useApiAction","onClick","event","ElMessageBox","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAMA,IAAQC,GAiBRC,IAAOC,GAWP,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMN,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeO,EAAQC,GAAmB;AACxC,MAAAN,EAAK,SAASM,CAAK;AACnB,UAAI;AACF,cAAMC,EAAa,QAAQT,EAAM,aAAaA,EAAM,cAAc;AAAA,UAChE,mBAAmB;AAAA,UACnB,kBAAkBA,EAAM;AAAA,UACxB,MAAM;AAAA,QAAA,CACP;AAAA,MACH,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,SAAS,GACd,MAAMG,EAAA;AAAA,IACR;;;aA1EUK,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAf,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBa,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAf,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBa,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
@@ -1,10 +1,10 @@
1
1
  import { defineComponent as z, ref as F, reactive as Q, computed as b, getCurrentInstance as X, provide as Y, watch as Z, onMounted as ee, onBeforeUnmount as te, resolveComponent as L, resolveDirective as ae, openBlock as w, createElementBlock as V, withDirectives as oe, createBlock as A, mergeProps as re, withModifiers as ie, withCtx as S, renderSlot as W, createTextVNode as O, toDisplayString as T, createCommentVNode as M, createVNode as le } from "vue";
2
2
  import { ElMessageBox as _, ElMessage as ne } from "element-plus";
3
- import { d as se, r as N } from "./http-Bs-dM076.mjs";
3
+ import { d as se, r as N } from "./http-9ToPNkWJ.mjs";
4
4
  import { r as ue } from "./linkage-FbL1mcz3.mjs";
5
5
  import { u as fe } from "./containerContext-BgphFDeH.mjs";
6
- import { _ as de } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
7
- const ce = { class: "wd-data-form" }, me = {
6
+ import { _ as ce } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
7
+ const de = { class: "wd-data-form" }, me = {
8
8
  key: 0,
9
9
  class: "wd-data-form__footer"
10
10
  }, pe = /* @__PURE__ */ z({
@@ -62,7 +62,7 @@ const ce = { class: "wd-data-form" }, me = {
62
62
  "apiAfter"
63
63
  ],
64
64
  setup(m, { expose: $, emit: K }) {
65
- const a = m, s = K, d = F(null), f = F(!1), i = Q({}), C = F({}), P = b(() => a.mode !== "edit"), y = b(
65
+ const a = m, s = K, c = F(null), f = F(!1), i = Q({}), C = F({}), P = b(() => a.mode !== "edit"), y = b(
66
66
  () => se(
67
67
  {
68
68
  resetText: "重置",
@@ -77,7 +77,7 @@ const ce = { class: "wd-data-form" }, me = {
77
77
  ), I = b(() => y.value.closeText), v = X();
78
78
  Y("wdDataForm", {
79
79
  model: i,
80
- formRef: d
80
+ formRef: c
81
81
  });
82
82
  function p(e) {
83
83
  Object.keys(i).forEach((t) => delete i[t]), e && typeof e == "object" && Object.assign(i, JSON.parse(JSON.stringify(e))), C.value = JSON.parse(JSON.stringify(i));
@@ -99,14 +99,14 @@ const ce = { class: "wd-data-form" }, me = {
99
99
  return { ...i };
100
100
  }
101
101
  function G() {
102
- const e = h(), t = (n) => n == null ? null : Array.isArray(n) ? n : String(n).split(",").map((c) => c.trim()).filter(Boolean), o = t(a.submitKeys), r = t(a.submitExcludeKeys);
102
+ const e = h(), t = (n) => n == null ? null : Array.isArray(n) ? n : String(n).split(",").map((d) => d.trim()).filter(Boolean), o = t(a.submitKeys), r = t(a.submitExcludeKeys);
103
103
  let u = e;
104
- return o && (u = o.reduce((n, c) => (n[c] = e[c], n), {})), r && (u = Object.keys(u).reduce((n, c) => (r.includes(c) || (n[c] = u[c]), n), {})), u;
104
+ return o && (u = o.reduce((n, d) => (n[d] = e[d], n), {})), r && (u = Object.keys(u).reduce((n, d) => (r.includes(d) || (n[d] = u[d]), n), {})), u;
105
105
  }
106
106
  async function J() {
107
- if (!d.value) return !0;
107
+ if (!c.value) return !0;
108
108
  try {
109
- return await d.value.validate(), !0;
109
+ return await c.value.validate(), !0;
110
110
  } catch {
111
111
  return !1;
112
112
  }
@@ -133,7 +133,7 @@ const ce = { class: "wd-data-form" }, me = {
133
133
  }
134
134
  function x(e = !1) {
135
135
  var t, o, r, u;
136
- P.value || e ? (Object.keys(i).forEach((n) => delete i[n]), (o = (t = d.value) == null ? void 0 : t.clearValidate) == null || o.call(t)) : (p(C.value), (u = (r = d.value) == null ? void 0 : r.clearValidate) == null || u.call(r));
136
+ P.value || e ? (Object.keys(i).forEach((n) => delete i[n]), (o = (t = c.value) == null ? void 0 : t.clearValidate) == null || o.call(t)) : (p(C.value), (u = (r = c.value) == null ? void 0 : r.clearValidate) == null || u.call(r));
137
137
  }
138
138
  function k() {
139
139
  return JSON.stringify(i) !== JSON.stringify(C.value);
@@ -222,13 +222,13 @@ const ce = { class: "wd-data-form" }, me = {
222
222
  isDirty: k,
223
223
  beforeLeave: U,
224
224
  fillForm: p,
225
- formRef: d
225
+ formRef: c
226
226
  }), (e, t) => {
227
227
  const o = L("el-button"), r = L("el-form"), u = ae("loading");
228
- return w(), V("div", ce, [
228
+ return w(), V("div", de, [
229
229
  oe((w(), A(r, re({
230
230
  ref_key: "formRef",
231
- ref: d,
231
+ ref: c,
232
232
  model: i,
233
233
  rules: m.rules,
234
234
  "label-width": m.labelWidth,
@@ -242,7 +242,7 @@ const ce = { class: "wd-data-form" }, me = {
242
242
  default: S(() => [
243
243
  W(e.$slots, "default", {
244
244
  model: i,
245
- form: d.value
245
+ form: c.value
246
246
  }, void 0, !0),
247
247
  m.withActions ? (w(), V("div", me, [
248
248
  W(e.$slots, "footer", {
@@ -298,8 +298,8 @@ const ce = { class: "wd-data-form" }, me = {
298
298
  ]);
299
299
  };
300
300
  }
301
- }), Se = /* @__PURE__ */ de(pe, [["__scopeId", "data-v-ad5b00d6"]]);
301
+ }), Se = /* @__PURE__ */ ce(pe, [["__scopeId", "data-v-2177fb08"]]);
302
302
  export {
303
303
  Se as W
304
304
  };
305
- //# sourceMappingURL=DataForm-C5MBVdei.mjs.map
305
+ //# sourceMappingURL=DataForm-Rsa1PT-X.mjs.map
@@ -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-Rsa1PT-X.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: 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 /* 组件级令牌:皮肤可给表单 footer 加底色 */\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,UAAMA,IAAQC,GAiDRC,IAAOC,GAUPC,IAAUC,EAAS,IAAI,GACvBC,IAAUD,EAAI,EAAK,GACnBE,IAAYC,EAA8B,EAAE,GAE5CC,IAAWJ,EAAyB,EAAE,GAEtCK,IAAWC,EAAS,MAAMX,EAAM,SAAS,MAAM,GAE/CY,IAAaD;AAAA,MAAS,MAC1BE;AAAA,QACE;AAAA,UACE,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,QAAA;AAAA,QAEhBb,EAAM,gBAAgB,CAAA;AAAA,MAAC;AAAA,IACzB,GAGIc,IAAYH,EAAS,MAAMC,EAAW,MAAM,SAAS,GAKrDG,IAAWC,EAAA;AACjB,IAAAC,EAAQ,cAAc;AAAA,MACpB,OAAOV;AAAA,MACP,SAAAH;AAAA,IAAA,CACD;AAGD,aAASc,EAASC,GAA8C;AAE9D,aAAO,KAAKZ,CAAS,EAAE,QAAQ,CAACa,MAAM,OAAOb,EAAUa,CAAC,CAAC,GACrDD,KAAQ,OAAOA,KAAS,YAC1B,OAAO,OAAOZ,GAAW,KAAK,MAAM,KAAK,UAAUY,CAAI,CAAC,CAAC,GAE3DV,EAAS,QAAQ,KAAK,MAAM,KAAK,UAAUF,CAAS,CAAC;AAAA,IACvD;AAGA,mBAAec,EAAWC,GAA8C;AACtE,UAAI,CAACtB,EAAM,KAAK;AACd,QAAAkB,EAASlB,EAAM,QAAQ,EAAE;AACzB;AAAA,MACF;AACA,MAAAM,EAAQ,QAAQ,IAChBJ,EAAK,aAAa,EAAE,MAAM,OAAA,CAAQ;AAClC,UAAI;AACF,cAAMqB,IAAQ,EAAE,GAAGvB,EAAM,UAAU,IAAIsB,KAAA,gBAAAA,EAAS,aAAY,GAAC,GACvDE,IACJxB,EAAM,cAAc,QAChB,MAAMyB,EAAQ,IAAIzB,EAAM,KAAKuB,CAAK,IAClC,MAAME,EAAQ,KAAKzB,EAAM,KAAKuB,CAAK;AACzC,QAAIC,EAAO,YACTN,EAASM,EAAO,QAAQ,EAAE,GAC1BtB,EAAK,gBAAgBsB,EAAO,IAAI;AAAA,MAEpC,UAAA;AACE,QAAAlB,EAAQ,QAAQ,IAChBJ,EAAK,YAAY,EAAE,MAAM,OAAA,CAAQ;AAAA,MACnC;AAAA,IACF;AAGA,aAASwB,IAAc;AACrB,aAAO,EAAE,GAAGnB,EAAA;AAAA,IACd;AAGA,aAASoB,IAAiB;AACxB,YAAMR,IAAOO,EAAA,GACPE,IAAQ,CAACC,MACbA,KAAK,OAAO,OAAO,MAAM,QAAQA,CAAC,IAAIA,IAAI,OAAOA,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAACC,MAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO,GAE9FC,IAAYH,EAAM5B,EAAM,UAAU,GAClCgC,IAAYJ,EAAM5B,EAAM,iBAAiB;AAE/C,UAAIwB,IAASL;AACb,aAAIY,MACFP,IAASO,EAAU,OAAO,CAACE,GAA0BC,OACnDD,EAAIC,CAAG,IAAIf,EAAKe,CAAG,GACZD,IACN,CAAA,CAAE,IAEHD,MACFR,IAAS,OAAO,KAAKA,CAAM,EAAE,OAAO,CAACS,GAA0BC,OACxDF,EAAU,SAASE,CAAG,MAAGD,EAAIC,CAAG,IAAIV,EAAOU,CAAG,IAC5CD,IACN,CAAA,CAAE,IAEAT;AAAA,IACT;AAGA,mBAAeW,IAA6B;AAC1C,UAAI,CAAC/B,EAAQ,MAAO,QAAO;AAC3B,UAAI;AACF,qBAAMA,EAAQ,MAAM,SAAA,GACb;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAGA,mBAAegC,EAAWC,IAAe,IAAO;AAE9C,UAAI,CADO,MAAMF,EAAA,GACR;AACP,QAAAG,GAAU,QAAQ,UAAU;AAC5B;AAAA,MACF;AACA,UAAI,CAACtC,EAAM,WAAW;AAEpB,QAAAE,EAAK,kBAAkBwB,GAAa,GACpCa,EAAmBb,EAAA,GAAeW,CAAY;AAC9C;AAAA,MACF;AAEA,MAAA/B,EAAQ,QAAQ,IAChBJ,EAAK,aAAa,EAAE,MAAM,SAAA,CAAU;AACpC,UAAI;AACF,cAAMsC,IAAab,EAAA,GACbH,IACJxB,EAAM,iBAAiB,QACnB,MAAMyB,EAAQ,IAAIzB,EAAM,WAAWwC,CAAU,IAC7C,MAAMf,EAAQ,KAAKzB,EAAM,WAAWwC,CAAU;AAEpD,QAAIhB,EAAO,WACTtB,EAAK,kBAAkBsB,EAAO,IAAI,GAClCe,EAAmBf,EAAO,MAAMa,CAAY,KAE5CnC,EAAK,eAAesB,CAAM;AAAA,MAE9B,UAAA;AACE,QAAAlB,EAAQ,QAAQ,IAChBJ,EAAK,YAAY,EAAE,MAAM,SAAA,CAAU;AAAA,MACrC;AAAA,IACF;AAGA,aAASqC,EAAmBpB,GAAWkB,GAAuB;AAE5D,MAAIrC,EAAM,uBACRyC,GAAgBzC,EAAM,qBAAqBA,EAAM,MAAM,GAGrDqC,KAAgB3B,EAAS,QAE3BgC,EAAU,EAAI,IACL1C,EAAM,oBAEX2C,KAAA,QAAAA,EAAW,eACbA,EAAU,aAAa,QAAQ,IAE/BzC,EAAK,SAAS,EAAE,QAAQ,SAAA,CAAU,IAItCO,EAAS,QAAQ,KAAK,MAAM,KAAK,UAAUF,CAAS,CAAC;AAAA,IACvD;AAGA,aAASmC,EAAUE,IAAY,IAAO;;AACpC,MAAIlC,EAAS,SAASkC,KACpB,OAAO,KAAKrC,CAAS,EAAE,QAAQ,CAACa,MAAM,OAAOb,EAAUa,CAAC,CAAC,IACzDyB,KAAAC,IAAA1C,EAAQ,UAAR,gBAAA0C,EAAe,kBAAf,QAAAD,EAAA,KAAAC,OAEA5B,EAAST,EAAS,KAAK,IACvBsC,KAAAC,IAAA5C,EAAQ,UAAR,gBAAA4C,EAAe,kBAAf,QAAAD,EAAA,KAAAC;AAAA,IAEJ;AAGA,aAASC,IAAmB;AAC1B,aAAO,KAAK,UAAU1C,CAAS,MAAM,KAAK,UAAUE,EAAS,KAAK;AAAA,IACpE;AAGA,aAASyC,IAAU;;AACjB,UAAIP,KAAA,QAAAA,EAAW,cAAc;AAE3B,QAAAA,EAAU,aAAa,QAAQ;AAC/B;AAAA,MACF;AAEA,UAAIQ,EAAS,OAAO;AAClB,SAAAL,IAAA,OAAO,WAAP,QAAAA,EAAe,YAAY,EAAE,MAAM,qBAAA,GAAwB;AAC3D;AAAA,MACF;AAEA,UAAI9C,EAAM,gBAAgBiD,KAAW;AACnC,QAAAG,EAAa,QAAQ,iBAAiB,MAAM;AAAA,UAC1C,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,MAAM;AAAA,QAAA,CACP,EACE,KAAK,MAAMlD,EAAK,SAAS,EAAE,QAAQ,SAAA,CAAU,CAAC,EAC9C,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB;AAAA,MACF;AACA,MAAAA,EAAK,SAAS,EAAE,QAAQ,SAAA,CAAU;AAAA,IACpC;AAGA,mBAAemD,IAAgC;AAC7C,UAAI,CAACrD,EAAM,gBAAgB,CAACiD,EAAA,EAAW,QAAO;AAC9C,UAAI;AACF,qBAAMG,EAAa,QAAQ,iBAAiB,MAAM;AAAA,UAChD,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,MAAM;AAAA,QAAA,CACP,GACM;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAGA,IAAAE;AAAA,MACE/C;AAAA,MACA,MAAM;AACJ,QAAAL,EAAK,UAAUwB,GAAa;AAAA,MAC9B;AAAA,MACA,EAAE,MAAM,GAAA;AAAA,IAAK;AAIf,UAAMiB,IAAYY,GAAA;AAClB,QAAIC,IAAyC;AAE7C,UAAMC,IAAgB9C,EAAS,MAAMX,EAAM,SAAQ2C,KAAA,gBAAAA,EAAW,KAAI,GAG5DQ,IAAWxC,EAAS,MAAM;AAC9B,UAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,UAAI;AACF,eAAO,OAAO,SAAS,OAAO;AAAA,MAChC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC,GAEK+C,IAAS/C,EAAS,MAAM,CAAC,CAACgC,KAAaQ,EAAS,KAAK;AAK3D,WAAIM,EAAc,SAChBvC,EAASuC,EAAc,KAAK,GAG9BE,GAAU,MAAM;;AAEd,YAAMC,IAAa7C,KAAA,gBAAAA,EAAU;AAC7B,UAAI6C,GAAY;AACd,QAAAA,EAAW,OAAO,iBAAiB,QAAQrD;AAC3C,cAAMsD,KAAYhB,KAAAC,IAAAc,EAAW,QAAX,gBAAAd,EAAgB,WAAhB,gBAAAD,EAAwB;AAC1C,QAAIgB,QAAqB,QAAQtD;AAAA,MACnC;AAGA,MAAIoC,KAAA,QAAAA,EAAW,mBACba,IAAoBb,EAAU,eAAe,YAAY;AACvD,YAAI,CAAC3C,EAAM,gBAAgB,CAACiD,EAAA,EAAW,QAAO;AAC9C,YAAI;AACF,uBAAMG,EAAa,QAAQ,iBAAiB,MAAM;AAAA,YAChD,mBAAmB;AAAA,YACnB,kBAAkB;AAAA,YAClB,MAAM;AAAA,UAAA,CACP,GACM;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,CAAC,IAGCpD,EAAM,SAAS,UACbyD,EAAc,SAChBvC,EAASuC,EAAc,KAAK,GAE1BzD,EAAM,UAAUA,EAAM,OACxBqB,EAAA,KAEOoC,EAAc,SACvBvC,EAASuC,EAAc,KAAK;AAAA,IAEhC,CAAC,GAEDK,GAAgB,MAAM;;AACpB,MAAAN,KAAA,QAAAA;AAEA,YAAMI,IAAa7C,KAAA,gBAAAA,EAAU;AAC7B,QAAI8B,KAAAC,IAAAc,KAAA,gBAAAA,EAAY,WAAZ,gBAAAd,EAAoB,qBAApB,gBAAAD,EAAsC,WAAUtC,KAClD,OAAOqD,EAAW,OAAO,iBAAiB;AAAA,IAE9C,CAAC,GAEDG,EAAa;AAAA,MACX,YAAA1C;AAAA,MACA,YAAAe;AAAA,MACA,WAAAM;AAAA,MACA,UAAAP;AAAA,MACA,aAAAT;AAAA,MACA,SAAAuB;AAAA,MACA,aAAAI;AAAA,MACA,UAAAnC;AAAA,MACA,SAAAd;AAAA,IAAA,CACD;;AAnaC,aAAA4D,EAAA,GAAAC,EAkCM,OAlCNC,IAkCM;AAAA,QAjCJC,IAAAH,EAAA,GAAAI,EAgCUC,GAhCVC,GAgCU;AAAA,mBA/BJ;AAAA,UAAJ,KAAIlE;AAAA,UAEH,OAAOG;AAAA,UACP,OAAON,EAAA;AAAA,UACP,eAAaA,EAAA;AAAA,UACb,kBAAgBA,EAAA;AAAA,UAChB,QAAQA,EAAA;AAAA,UACR,UAAUK,EAAA;AAAA,QAAA,GACHiE,EAAAA,QAAM;AAAA,UACb,6BAAD,MAAA;AAAA,UAAA,GAAe,CAAA,SAAA,CAAA;AAAA,QAAA;qBAEf,MAA2C;AAAA,YAA3CC,EAA2CC,EAAA,QAAA,WAAA;AAAA,cAApC,OAAOlE;AAAA,cAAY,MAAMH,EAAA;AAAA,YAAA;YAGrBH,EAAA,eAAX+D,EAAA,GAAAC,EAgBM,OAhBNS,IAgBM;AAAA,cAfJF,EAcOC,EAAA,QAAA,UAAA;AAAA,gBAdc,QAAQrC;AAAA,gBAAa,OAAOM;AAAA,gBAAY,SAASpC,EAAA;AAAA,cAAA,GAAtE,MAcO;AAAA,gBAZYoD,EAAA,cAAjBU,EAAqEO,GAAA;AAAA;kBAA3C,SAAOzB;AAAA,gBAAA;6BAAS,MAAe;AAAA,wBAAZpC,EAAA,KAAS,GAAA,CAAA;AAAA,kBAAA;;;gBACrCF,EAAA,MAAW,kBAA5BwD,EAAgGO,GAAA;AAAA;kBAAxD,SAAOjC;AAAA,gBAAA;6BAAW,MAA0B;AAAA,oBAAvBkC,EAAAC,EAAAjE,EAAA,MAAW,SAAS,GAAA,CAAA;AAAA,kBAAA;;;gBAEzE8C,EAAA,SAAUhD,EAAA,SAAYT,oBAAkBW,EAAA,MAAW,qBAD3DwD,EAMYO,GAAA;AAAA;kBAJT,SAASrE,EAAA;AAAA,kBACT,gCAAO8B,EAAU,EAAA;AAAA,gBAAA;6BAElB,MAA6B;AAAA,oBAA1BwC,EAAAC,EAAAjE,EAAA,MAAW,YAAY,GAAA,CAAA;AAAA,kBAAA;;;gBAE5BkE,GAEYH,GAAA;AAAA,kBAFD,MAAK;AAAA,kBAAW,SAASrE,EAAA;AAAA,kBAAU,gCAAO8B,EAAU,EAAA;AAAA,gBAAA;6BAC7D,MAA2B;AAAA,oBAAxBwC,EAAAC,EAAAjE,EAAA,MAAW,UAAU,GAAA,CAAA;AAAA,kBAAA;;;;;;;;cA1BnBN,EAAA,KAAO;AAAA,QAAA;;;;;"}