workdesktop-ai 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +43 -6
  2. package/README.md +26 -13
  3. package/dist/api-button/index.mjs +1 -1
  4. package/dist/auto-complete/index.mjs +1 -1
  5. package/dist/base.css +1 -1
  6. package/dist/checkbox-list/index.mjs +1 -1
  7. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs} +2 -2
  8. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map} +1 -1
  9. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs → AutoComplete-C6Nxatvt.mjs} +2 -2
  10. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs.map → AutoComplete-C6Nxatvt.mjs.map} +1 -1
  11. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs → CheckboxList-5AEx33r5.mjs} +2 -2
  12. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs.map → CheckboxList-5AEx33r5.mjs.map} +1 -1
  13. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs} +2 -2
  14. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map} +1 -1
  15. package/dist/chunks/{DataForm-C5MBVdei.mjs → DataForm-C6VLTSOm.mjs} +16 -16
  16. package/dist/chunks/{DataForm-C5MBVdei.mjs.map → DataForm-C6VLTSOm.mjs.map} +1 -1
  17. package/dist/chunks/{DataGrid-HUzKWuQx.mjs → DataGrid-Dd7n5JM7.mjs} +4 -4
  18. package/dist/chunks/{DataGrid-HUzKWuQx.mjs.map → DataGrid-Dd7n5JM7.mjs.map} +1 -1
  19. package/dist/chunks/{EditableGrid-C8A-nJZv.mjs → EditableGrid-CDeeVkaX.mjs} +330 -333
  20. package/dist/chunks/EditableGrid-CDeeVkaX.mjs.map +1 -0
  21. package/dist/chunks/{ImageUpload-DGehzaYa.mjs → ImageUpload-CQA9XQ7Q.mjs} +2 -2
  22. package/dist/chunks/{ImageUpload-DGehzaYa.mjs.map → ImageUpload-CQA9XQ7Q.mjs.map} +1 -1
  23. package/dist/chunks/{Panel-CrRqBTj6.mjs → Panel-BHqAeBaH.mjs} +8 -8
  24. package/dist/chunks/Panel-BHqAeBaH.mjs.map +1 -0
  25. package/dist/chunks/Path-C_oyo6Dg.mjs +200 -0
  26. package/dist/chunks/Path-C_oyo6Dg.mjs.map +1 -0
  27. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs} +2 -2
  28. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map} +1 -1
  29. package/dist/chunks/{RadioList-vE8JOuST.mjs → RadioList-BUWcP_Pk.mjs} +2 -2
  30. package/dist/chunks/{RadioList-vE8JOuST.mjs.map → RadioList-BUWcP_Pk.mjs.map} +1 -1
  31. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs} +2 -2
  32. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map} +1 -1
  33. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs → SearchPanel-DPlWWuXb.mjs} +2 -2
  34. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs.map → SearchPanel-DPlWWuXb.mjs.map} +1 -1
  35. package/dist/chunks/{Select-DAGZDXvI.mjs → Select-uvFy7_NU.mjs} +2 -2
  36. package/dist/chunks/{Select-DAGZDXvI.mjs.map → Select-uvFy7_NU.mjs.map} +1 -1
  37. package/dist/chunks/Station-DLV19USa.mjs +780 -0
  38. package/dist/chunks/Station-DLV19USa.mjs.map +1 -0
  39. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs} +2 -2
  40. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs.map} +1 -1
  41. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs} +2 -2
  42. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map} +1 -1
  43. package/dist/chunks/{Viewer-iub6TjoD.mjs → Viewer-CjLSQTrw.mjs} +2 -2
  44. package/dist/chunks/{Viewer-iub6TjoD.mjs.map → Viewer-CjLSQTrw.mjs.map} +1 -1
  45. package/dist/chunks/http-C06mNpwY.mjs +4141 -0
  46. package/dist/chunks/http-C06mNpwY.mjs.map +1 -0
  47. package/dist/chunks/station-linkage-D54-_iyL.mjs +77 -0
  48. package/dist/chunks/station-linkage-D54-_iyL.mjs.map +1 -0
  49. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs → useApiAction-DxVQWWxv.mjs} +2 -2
  50. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs.map → useApiAction-DxVQWWxv.mjs.map} +1 -1
  51. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs → useColumnSettings-BwG2V9xp.mjs} +2 -2
  52. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs.map → useColumnSettings-BwG2V9xp.mjs.map} +1 -1
  53. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs → useOptionsLoader-DEVCYhrp.mjs} +2 -2
  54. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs.map → useOptionsLoader-DEVCYhrp.mjs.map} +1 -1
  55. package/dist/confirm-button/index.mjs +1 -1
  56. package/dist/data-form/index.mjs +1 -1
  57. package/dist/data-form/style.css +1 -1
  58. package/dist/data-grid/index.mjs +1 -1
  59. package/dist/data-grid/style.css +1 -1
  60. package/dist/editable-grid/index.mjs +1 -1
  61. package/dist/editable-grid/style.css +1 -1
  62. package/dist/image-upload/index.mjs +1 -1
  63. package/dist/index.esm.js +133 -124
  64. package/dist/index.esm.js.map +1 -1
  65. package/dist/index.umd.js +705 -15
  66. package/dist/index.umd.js.map +1 -1
  67. package/dist/panel/index.mjs +1 -1
  68. package/dist/panel/style.css +1 -1
  69. package/dist/path/index.mjs +7 -0
  70. package/dist/path/index.mjs.map +1 -0
  71. package/dist/path/style.css +1 -0
  72. package/dist/prompt-button/index.mjs +1 -1
  73. package/dist/radio-list/index.mjs +1 -1
  74. package/dist/requester/index.mjs +1 -1
  75. package/dist/search-panel/index.mjs +1 -1
  76. package/dist/search-panel/style.css +1 -1
  77. package/dist/select/index.mjs +1 -1
  78. package/dist/station/index.mjs +1 -1
  79. package/dist/station/style.css +1 -1
  80. package/dist/style.css +1 -1
  81. package/dist/switch/index.mjs +1 -1
  82. package/dist/upload/index.mjs +1 -1
  83. package/dist/viewer/index.mjs +1 -1
  84. package/llms.txt +99 -9
  85. package/package.json +6 -1
  86. package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +0 -1
  87. package/dist/chunks/Panel-CrRqBTj6.mjs.map +0 -1
  88. package/dist/chunks/Station-BF_QlQ8c.mjs +0 -796
  89. package/dist/chunks/Station-BF_QlQ8c.mjs.map +0 -1
  90. package/dist/chunks/http-Bs-dM076.mjs +0 -2951
  91. package/dist/chunks/http-Bs-dM076.mjs.map +0 -1
  92. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +0 -134
  93. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +0 -169
  94. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +0 -167
  95. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +0 -186
  96. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +0 -317
  97. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +0 -180
  98. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +0 -122
  99. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +0 -66
  100. package/dist/types/src/components/buttons/useApiAction.d.ts +0 -20
  101. package/dist/types/src/components/common/props.d.ts +0 -122
  102. package/dist/types/src/components/containers/Drawer.vue.d.ts +0 -172
  103. package/dist/types/src/components/containers/Iframe.vue.d.ts +0 -81
  104. package/dist/types/src/components/containers/containerContext.d.ts +0 -15
  105. package/dist/types/src/components/containers/useContainerController.d.ts +0 -24
  106. package/dist/types/src/components/containers/useIframeContainer.d.ts +0 -20
  107. package/dist/types/src/components/core/Requester.vue.d.ts +0 -41
  108. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +0 -542
  109. package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +0 -62
  110. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +0 -586
  111. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +0 -187
  112. package/dist/types/src/components/form/FormItem.vue.d.ts +0 -62
  113. package/dist/types/src/components/form/SearchItem.vue.d.ts +0 -62
  114. package/dist/types/src/components/form/SearchPanel.vue.d.ts +0 -167
  115. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +0 -311
  116. package/dist/types/src/components/index.d.ts +0 -31
  117. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +0 -166
  118. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +0 -166
  119. package/dist/types/src/components/inputs/RadioList.vue.d.ts +0 -166
  120. package/dist/types/src/components/inputs/Select.vue.d.ts +0 -176
  121. package/dist/types/src/components/inputs/Switch.vue.d.ts +0 -116
  122. package/dist/types/src/components/inputs/useOptionsLoader.d.ts +0 -32
  123. package/dist/types/src/components/layout/Station.vue.d.ts +0 -302
  124. package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +0 -20
  125. package/dist/types/src/components/layout/types.d.ts +0 -54
  126. package/dist/types/src/components/styles/Panel.vue.d.ts +0 -94
  127. package/dist/types/src/components/styles/Tips.vue.d.ts +0 -60
  128. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +0 -176
  129. package/dist/types/src/components/upload/Upload.vue.d.ts +0 -235
  130. package/dist/types/src/entries/api-button.d.ts +0 -9
  131. package/dist/types/src/entries/auto-complete.d.ts +0 -9
  132. package/dist/types/src/entries/checkbox-list.d.ts +0 -9
  133. package/dist/types/src/entries/components-map.d.ts +0 -8
  134. package/dist/types/src/entries/confirm-button.d.ts +0 -9
  135. package/dist/types/src/entries/data-form.d.ts +0 -9
  136. package/dist/types/src/entries/data-grid.d.ts +0 -9
  137. package/dist/types/src/entries/dialog-button.d.ts +0 -9
  138. package/dist/types/src/entries/drawer-button.d.ts +0 -9
  139. package/dist/types/src/entries/drawer.d.ts +0 -9
  140. package/dist/types/src/entries/editable-grid.d.ts +0 -9
  141. package/dist/types/src/entries/form-item.d.ts +0 -9
  142. package/dist/types/src/entries/iframe.d.ts +0 -9
  143. package/dist/types/src/entries/image-upload.d.ts +0 -9
  144. package/dist/types/src/entries/panel.d.ts +0 -9
  145. package/dist/types/src/entries/prompt-button.d.ts +0 -9
  146. package/dist/types/src/entries/radio-list.d.ts +0 -9
  147. package/dist/types/src/entries/requester.d.ts +0 -9
  148. package/dist/types/src/entries/route-button.d.ts +0 -9
  149. package/dist/types/src/entries/search-item.d.ts +0 -9
  150. package/dist/types/src/entries/search-panel.d.ts +0 -9
  151. package/dist/types/src/entries/select.d.ts +0 -9
  152. package/dist/types/src/entries/station.d.ts +0 -9
  153. package/dist/types/src/entries/switch.d.ts +0 -9
  154. package/dist/types/src/entries/tips-button.d.ts +0 -9
  155. package/dist/types/src/entries/tips.d.ts +0 -9
  156. package/dist/types/src/entries/upload.d.ts +0 -9
  157. package/dist/types/src/entries/viewer.d.ts +0 -9
  158. package/dist/types/src/index.d.ts +0 -21
  159. package/dist/types/src/lib/composables/useConfig.d.ts +0 -19
  160. package/dist/types/src/lib/composables/useDataGrid.d.ts +0 -69
  161. package/dist/types/src/lib/composables/useEventBus.d.ts +0 -16
  162. package/dist/types/src/lib/composables/useGlobalState.d.ts +0 -5
  163. package/dist/types/src/lib/composables/useRequest.d.ts +0 -42
  164. package/dist/types/src/lib/configs/default-config.d.ts +0 -6
  165. package/dist/types/src/lib/core/config.d.ts +0 -28
  166. package/dist/types/src/lib/core/http.d.ts +0 -100
  167. package/dist/types/src/lib/core/linkage.d.ts +0 -48
  168. package/dist/types/src/lib/core/station-linkage.d.ts +0 -41
  169. package/dist/types/src/lib/core/theme.d.ts +0 -6
  170. package/dist/types/src/lib/core/utils.d.ts +0 -28
  171. package/dist/types/src/lib/install.d.ts +0 -11
  172. package/dist/types/src/types/config.d.ts +0 -126
  173. package/dist/types/src/types/index.d.ts +0 -4
  174. package/dist/types/vite.config.d.ts +0 -7
package/CHANGELOG.md CHANGED
@@ -4,12 +4,45 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ 新增 `WdPath` 导航路径(面包屑)组件(组件总数 28 → 29)与 Station 菜单链联动能力;并将 `WdPath` 与 `WdTips` 一并归入「页面元素」分组(原「辅助组件」分组移除)。
8
+
9
+ ### Added
10
+
11
+ - **`WdPath` 导航路径组件**:基于 el-breadcrumb 封装,支持手动与自动双模式。手动模式通过 `items` 填写路径节点(`title` / `icon` / `path`,支持 JSON 字符串);自动模式与 `WdStation` 按 `filter` 分组联动——自动读取当前激活菜单所在路径(分组 → 菜单 → 子菜单),并扫描内容区 `h1~h4` 标题按大纲收敛为当前章节链,标题段**始终跟随当前可视范围内第一个标题**(滚动跟随)。`container` 限定标题扫描范围(默认最近 `.wd-station__content`,无则整页),`show-home` / `home` / `separator` 可配。新增 `docs/src/examples/path.vue` 3 个示例与 `document/components/path_v1.0.md` 文档。
12
+ - **Station 菜单链联动 API**:`station-linkage.ts` 扩展——`WdStation` 新增 `getActiveMenuChain`(激活菜单路径链:分组 → 菜单 → 子菜单),并新增导出 `getStationMenuChain(target, selfFilter?)`(读取目标组 Station 菜单链)、`subscribeStationChange(filter, cb)` / `notifyStationChange(filter)`(菜单/分组切换时通知同组订阅者,供路径自动刷新)。`src/index.ts` 同步导出并补充类型 `MenuChainItem`。
13
+ - **按需入口**:新增 `workdesktop-ai/path` 子路径入口与 `path/style.css`,`package.json` exports 与 vite 多入口/CSS 归档同步。
14
+ - **分组调整**:原 `WdBreadcrumb` 改名为 `WdPath`,与原 `WdTips` 一并归入「页面元素」分组(docs 侧边栏 / Playground 同步);`BreadcrumbItem` 类型更名为 `PathItem`。
15
+ - **`WdStation` 新增 `header-mode="both"`**:顶栏中央形态由 `nav` / `title` 扩为 `nav` / `title` / `both`。`both` = 顶部显示分导台(仅切换激活分组)+ 左侧按分组小标题平铺展示**全部**菜单(不随分组变化,复用 `title` 侧边渲染),适合分组多且需一眼看全所有菜单的系统;单分组时分导台自动隐藏退化为普通侧栏。`showNav` 条件由 `headerMode==='nav'` 改为 `headerMode!=='title'`。新增 3 个集成用例(both 顶部分导台 + 侧边全量 / 切分组侧边不变 / 单分组退化),全量 vitest 24 文件 273 用例全绿;文档站新增「分导台 + 系统标题并存」demo(第 8 个),api-meta / FAQ / 设计文档 / 组件文档同步。
16
+ - **`WdPath` 新增 `animation` 属性**:设置路径段(内容)变动时的过渡动画——`none`(默认,零视觉变化)/ `fade`(淡入淡出)/ `slide`(横向滑移+淡入,留存段 FLIP 位移),基于 Vue `TransitionGroup` 实现,时长 0.2s,适用于自动模式滚动跟随章节、菜单链切换与手动 `items` 更新。同步修复自动模式下的自激刷新隐患:Path 位于自身标题观察容器内时,MutationObserver 会把动画产生的段节点增删误判为内容变化触发重扫——现过滤全部落在 `.wd-path` 子树内的变动,并对标题扫描结果做结构签名比对(层级+标题未变则不重建列表),彻底切断「动画改 DOM → 重扫 → 重渲染」循环。新增 6 个用例(动画渲染/切换 3 个 + 自激防护 3 个),全量 vitest 278 用例全绿;文档站自动模式示例增加 none/fade/slide 实时切换演示,api-meta 与 `document/components/path_v1.1.md` 同步。
17
+ - **`WdStation` 新增 `show-header-title` 属性**(Boolean,默认 `true`):控制 `headerMode` 非 `nav` 时顶栏中央的系统标题 fallback 是否渲染;需要完全自绘 `#header-center`(如文档站改用 `WdPath` 承载吸顶路径)时传 `false` 关闭,组件默认行为与既有 DOM 结构不变。新增 1 个集成用例;文档站框架已启用(去除顶栏中央重复的「WorkDesktop」标题)。
18
+
19
+ ## [1.1.1] - 2026-09-24
20
+
21
+ 预设皮肤系统与主题能力增强:`theme.skin` 一键套用 11 套预设皮肤,Element Plus 派生色阶自动生成,组件级 CSS 变量回退链全面打通。
22
+
23
+ ### Added
24
+
25
+ - **预设皮肤系统(`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` 单测。
26
+ - **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 精细覆盖。
27
+ - **组件级令牌回退链**:`WdDataGrid` / `WdEditableGrid`(卡片模式)、`WdSearchPanel`、`WdDataForm`(footer)、`WdStation`(aside / header / tabs)、`WdPanel` 等组件样式全部接入组件级 CSS 变量回退链(形如 `var(--wd-panel-bg, var(--wd-bg-color, #fff))`),皮肤可单独定制某个组件而不影响全局;可用令牌见 `src/styles/tokens.css`。
28
+ - **`WdPanel` 新增 `border` prop**(Boolean,默认 `true`):置于嵌套容器内时可传 `:border="false"` 关闭外边框(加 `wd-panel--no-border` 类),配合内容页多容器布局减少边框堆叠。
29
+ - **`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` 时不转圈)。
30
+
31
+ ### Changed
32
+
33
+ - package.json `files` 新增 `llms.txt`:AI 参考文档随 npm 包一起发布。
34
+ - 文档站:新增「自定义皮肤」示例与皮肤切换入口(可遍历 11 套预设皮肤),api-meta 同步组件级令牌说明。
35
+
36
+ ## [1.1.0] - 2026-09-17
37
+
38
+ 组件架构整合与能力扩充:容器组件统一为 `WdDrawer`;新增 5 个组件(`WdPopconfirmButton` / `WdStation` / `WdFormItem` / `WdSearchItem` / `WdRequester`),组件总数 24 → 28;新增 27 个 ESM 按需子路径入口。
39
+
7
40
  ### Changed
8
41
 
9
42
  - `WdDialog` 合并进 `WdDrawer`:容器组件统一为一个,通过 `mode="drawer" | "dialog"` 切换(默认 `drawer`);`size` 同时作用于抽屉尺寸与对话框宽度,`direction` 仅抽屉模式生效,`filter` / `headRefreshDatagrid` / 事件 / 插槽保持不变。容器组件由 `WdDialog` / `WdDrawer` 两个合并为一个 `WdDrawer`(组件总数 -1)。
10
43
  - `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`)。
44
+ - `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`、事件与插槽保持不变。
45
+ - 按钮组文案属性 `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
46
  - **所有按钮组件均已集成语悬停提示**:和 TipsButton 一样,每个按钮组件都支持 `tips`(提示内容)、`tipsType`(主题)、`placement`(位置)三个属性;当 `tips` 非空时自动用 `el-tooltip` 包裹,无提示则不包裹;现在所有按钮都可按需添加悬停提示,无需额外套一层 tooltip。
14
47
  - **PromptButton 自定义内容插槽**:新增 `#content` 插槽允许开发者自定义弹窗内容(示例中展示了嵌入 `WdDataForm` 实现多字段输入表单);点击确认后默认发起 API 请求,仅当 API 返回包 `success=true` 时自动关闭弹窗,API 请求失败时不关闭弹窗,允许开发者修改错误后重试。新增 `confirm` 事件(自定义内容模式点击确认触发)。
15
48
  - **文档站 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 +50,6 @@
17
50
  ### Removed
18
51
 
19
52
  - 移除 `WdDialog` 容器组件及其导出,请改用 `WdDrawer` 并设置 `mode="dialog"`。
20
- - 移除 `WdDialogButton` 组件及其导出,请改用 `WdDrawerButton` 并设置 `mode="dialog"`。
21
53
 
22
54
  ### Fixed
23
55
 
@@ -38,7 +70,7 @@
38
70
  - **修复 datagrid 示例操作列 el-button-group 样式错乱**:原示例把 `<el-button>` 放进 DrawerButton 的 `#button` 内容插槽,渲染出「button 嵌套 button」的非法 HTML,导致 group 内按钮尺寸/样式错乱。已改为 `label` + `type` + `button-size` 属性式写法,group 内两个按钮(详情 + 删除)尺寸一致、圆角衔接、边框合并、分割色全部正确(Playwright 实测验证)。
39
71
 
40
72
  - **全部按钮组件支持 `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 页与示例)。
73
+ - **`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
74
 
43
75
  - `WdEditableGrid` 完整集成 DataGrid 全部能力:API/静态双数据源(`api` / `dataSource` / `modelValue`)、分页、工具栏 tools(刷新/尺寸/列设置/模式切换)、高度模式(`height="fix"` / 固定高度 / 自适应)、表格/卡片模式切换、动态列设置(配置列与插槽列合并,localStorage 持久化)、行合并、树形、多选、`rowActions` 只读操作列、SearchPanel / `refreshDataGrid` 联动注册;同时保留可编辑能力:`columns` 配置驱动可编辑列、cell/row 双编辑模式、脏行跟踪、required + 自定义校验、`saveApi` 批量保存、新增/删除行。
44
76
  - `WdEditableGrid` 新增单元格级「已修改」样式:进入编辑时记录该行基线,单元格当前值若与基线不一致(判定为用户编辑过)即自动标识(默认单元格最右侧显示红色感叹号小图标 `.is-dirty`,可自定义);改回原值或取消 / 保存成功后样式自动消失。脏状态粒度由整行细化到单元格。标识样式通过 CSS 变量自定义,默认:
@@ -66,9 +98,12 @@
66
98
  ```
67
99
  批量保存与行内保存前先校验,失败即中断并 `ElMessage.warning` 提示 + 触发 `validate-fail` 事件(携带 `{ index, row, column, error }`),不发起保存请求。`required` / 自定义 `validator` 兼容沿用。
68
100
  - `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 用例。
101
+ - **`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
102
  - `WdStation` 顶栏中央区由居中改为**左对齐**:左位/右位按内容宽度收缩,中央区 `flex:1` 占满剩余空间,分导台块状项 / 标题文案从左侧起排。
71
103
  - `WdStation` tabs 条样式与交互增强:tabs 条整宽撑满内容列(el-tabs `flex:1`),消除 nav 左/上边框与 header 底线(底线由外层容器统一承担),tab 间保留分隔线;条最右侧新增下拉按钮,内置「关闭当前标签 / 关闭左侧标签 / 关闭其他标签 / 关闭所有标签」批量操作——`affix` 标签永不关闭,无可关对象时对应菜单项禁用,批量关闭逐个触发 `tab-close`,激活标签被关闭后跳转原位置相邻标签。集成测试扩为 22 用例。
104
+ - **`WdFormItem`(`<wd-form-item>`)与 `WdSearchItem`(`<wd-search-item>`)新增组件**:表单项包装器(`label` / `prop` / `tip` / `tipPlacement = 'top'`),`$attrs` 透传 `el-form-item`;`WdSearchItem` 为 SearchPanel 内的语义化别名。均有按需子入口(`form-item` / `search-item`)。
105
+ - **`WdRequester`(`<wd-requester>`)新增组件**:命令式请求器——`v-model` 置 true 触发一次请求后自动回 false(一次性开关语义),新请求自动静默中断旧请求;`method` / `reqOptions` 支持 `page.componentDefault.WdRequester` 全局覆盖;事件 `apiBefore`(可中断)/ `apiSuccess` / `apiFail` / `apiException` / `apiAfter`。
106
+ - **ESM 按需子路径入口(27 个)**:每个组件一个子路径 `workdesktop-ai/<subpath>`(含 types + ESM `.mjs`),14 个有独立样式的组件同步产出 `<subpath>/style.css`(按需引入:`base.css` + 对应组件样式);主入口全量引入方式不变。
72
107
 
73
108
  ## [1.0.2] - 2026-09-06
74
109
 
@@ -149,7 +184,9 @@
149
184
  - 测试体系:vitest + @vue/test-utils,基础设施单测 87 用例 + DataGrid/DataForm 集成 19 用例,基础库行覆盖率 98%。
150
185
  - 中文内置文案,语义化版本与开源配置(MIT)。
151
186
 
152
- [Unreleased]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.2...HEAD
187
+ [Unreleased]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.1.1...HEAD
188
+ [1.1.1]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.1.0...v1.1.1
189
+ [1.1.0]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.2...v1.1.0
153
190
  [1.0.2]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.1...v1.0.2
154
191
  [1.0.1]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.0...v1.0.1
155
192
  [1.0.0]: https://github.com/wordyhuang/workdesktop-ai/releases/tag/v1.0.0
package/README.md CHANGED
@@ -3,13 +3,19 @@
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
7
- > 适用对象:使用本库的开发者(人类阅读;AI 助手请改读 [llms.txt](./llms.txt))
6
+ > 文档版本:V\_1.1 | 创建时间:2026-09-16 22:03:47 | 最后修改时间:2026-09-24 13:44:41
7
+ > 适用对象:使用本库的开发者(人类阅读;AI 助手请改读 [llms.txt](./code/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
+ > 如果你是使用AI来构建前端,你只需要在开始构建时加上提示词“使用workdesktop-ai组件库进行构建”即可。
16
+
17
+ <br />
18
+
13
19
  WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在 ElementPlus 之上做「场景化复合封装」:
14
20
 
15
21
  - **列表一体化**:`DataGrid` 一个组件完成「查询 + 分页 + 工具栏 + 表格 + 列设置 + 卡片/表格切换」;
@@ -21,14 +27,14 @@ WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在
21
27
 
22
28
  | 能力 | 说明 |
23
29
  | ---------- | ---------------------------------------------------------------------------------------------------- |
24
- | 28 个业务组件 | DataGrid / EditableGrid / Viewer / DataForm / SearchPanel / 8 类按钮 / Drawer / Iframe / Station 整页布局 等 |
30
+ | 29 个业务组件 | DataGrid / EditableGrid / Viewer / DataForm / SearchPanel / 8 类按钮 / Drawer / Iframe / Station 整页布局 等 |
25
31
  | 三级配置 | 内置默认 → 全局(`app.use` / `window.workDesktopConfig`)→ 组件 props,deep merge |
26
32
  | 内置 HTTP | axios 封装:统一封包格式、URL 前缀、Loading、失败/异常提示、请求监听、并发去重、子实例配置;请求核心 `RequestAPI` 公开,支持手动调用 API 请求代码 |
27
33
  | 声明式联动 | 属性(`filter` 分组 + `head-refresh-datagrid` 刷新)+ 事件驱动(A+B 混合),无需引入中心化 DSL |
28
34
  | 组合式 Hooks | `useRequest` / `useDataGrid` / `useConfig` / `useGlobalConfig` / `useEventBus` / `useGlobalState` |
29
35
  | 双产物 + 按需入口 | `dist/index.esm.js` + `dist/index.umd.js` + 27 个组件子路径入口 + 完整 `.d.ts` |
30
- | 开箱主题 | 语义色令牌 + CSS 变量覆盖 + 配置对象生成主题 |
31
- | 测试保障 | vitest + @vue/test-utils:106 用例,基础库行覆盖率 98% |
36
+ | 开箱主题 | 11 套预设皮肤一键套用(`theme.skin`)+ 语义色令牌 + El 派生色阶自动推导 + CSS 变量覆盖(优先级 cssVars > colors > skin) |
37
+ | 测试保障 | vitest + @vue/test-utils:237 用例全通过,行覆盖率 96.6%(阈值 lines/funcs ≥ 80%,branches ≥ 70%) |
32
38
 
33
39
  ## 安装
34
40
 
@@ -48,7 +54,7 @@ import ElementPlus from 'element-plus'
48
54
  import 'element-plus/dist/index.css'
49
55
  import zhCn from 'element-plus/es/locale/lang/zh-cn'
50
56
 
51
- import WorkDesktop from 'workdesktop-ai' // Vue 插件:全量注册 28 个组件
57
+ import WorkDesktop from 'workdesktop-ai' // Vue 插件:全量注册 29 个组件
52
58
  import 'workdesktop-ai/style.css'
53
59
 
54
60
  const app = createApp(App)
@@ -175,8 +181,9 @@ app.use(WorkDesktop, {
175
181
  WdDataForm: { submitApi: '/save' }
176
182
  }
177
183
  },
178
- // 主题
179
- theme: { colors: { primary: '#2f6bff' }, cssVars: { '--wd-radius': '8px' } }
184
+ // 主题:skin 一键套用预设皮肤(11 套可选),colors / cssVars 在其上继续覆盖
185
+ // 覆盖优先级:cssVars > colors > skin;colors 改动会自动推导 El 浅/深色阶
186
+ theme: { skin: 'default', colors: { primary: '#2f6bff' }, cssVars: { '--wd-radius': '8px' } }
180
187
  })
181
188
  ```
182
189
 
@@ -189,7 +196,7 @@ app.use(WorkDesktop, {
189
196
  - 基础控件(按钮、输入框、下拉、表格单元格等)继续使用 ElementPlus,**不重复造轮子**;
190
197
  - 本库只做场景化复合与业务约定的封装,宿主对 ElementPlus 的使用方式完全不受影响。
191
198
 
192
- ## 组件总览(28 个)
199
+ ## 组件总览(29 个)
193
200
 
194
201
  | 分组 | 组件 |
195
202
  | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -199,8 +206,9 @@ app.use(WorkDesktop, {
199
206
  | 容器 | `WdDrawer`(`mode` 切换抽屉/对话框,支持 iframe 宿主)、`WdIframe`(iframe 嵌入与通信) |
200
207
  | 输入选择 | `WdSelect` / `WdAutoComplete` / `WdCheckboxList` / `WdRadioList` / `WdSwitch`(切换即请求,失败自动回滚) |
201
208
  | 上传 | `WdUpload`(文件)、`WdImageUpload`(图片,强制 image/\*) |
202
- | 样式 | `WdPanel`(面板)、`WdTips`(提示图标/提示框) |
203
- | 布局 | `WdStation`(管理台整页布局:菜单分组 / 标签页 / 工具栏 / 页脚) |
209
+ | 布局 | `WdStation`(管理台整页布局:菜单分组 / 标签页 / 工具栏 / 页脚) |
210
+ | 样式 | `WdPanel`(面板) |
211
+ | 页面元素 | `WdPath`(导航路径/面包屑:手动路径 / 自动联动 Station 菜单链 + 页面标题链 / 滚动跟随可视区第一个标题)、`WdTips`(提示图标/提示框) |
204
212
  | 核心 | `WdRequester`(命令式请求触发器,v-model 开关语义) |
205
213
 
206
214
  ## 手动调用请求(RequestAPI)
@@ -240,7 +248,7 @@ await grid.search({ name: '张' })
240
248
 
241
249
  ## AI 编码助手
242
250
 
243
- 仓库根目录提供 [llms.txt](./llms.txt) —— 面向 AI 的机器可读全量参考(28 个组件 API、配置体系、请求协议、声明式联动、跨 iframe 通信协议、常见陷阱清单)。使用 Copilot / Cursor / Trae 等 AI 助手开发时,让它先阅读该文件,可显著减少组件误用。
251
+ 仓库根目录提供 [llms.txt](./llms.txt) —— 面向 AI 的机器可读全量参考(29 个组件 API、配置体系、请求协议、声明式联动、跨 iframe 通信协议、常见陷阱清单)。使用 Copilot / Cursor / Trae 等 AI 助手开发时,让它先阅读该文件,可显著减少组件误用。
244
252
 
245
253
  ## 本地开发
246
254
 
@@ -301,6 +309,11 @@ python -m http.server 8000
301
309
 
302
310
  ## 版本变化
303
311
 
312
+ - **V\_1.1**(2026-09-24 13:44:41):对齐库版本 v1.1.1。相对 V\_1.0 的变化:
313
+ 1. 头部库版本 v1.0.2 → v1.1.1;
314
+ 2. 特性表「开箱主题」补充 1.1.1 新增的 11 套预设皮肤(`theme.skin`)与 El 派生色阶自动推导;
315
+ 3. 全局配置示例 `theme` 补充 `skin` 用法与覆盖优先级说明;
316
+ 4. 特性表「测试保障」用例数按当前真实运行结果更新(106 → 237)。
304
317
  - **V\_1.0**(2026-09-16 22:03:47):首次建立带版本标注的 README。相对旧版的变化:
305
318
  1. 组件总数 25 → 28(按 `src/components/index.ts` 实际导出核对);
306
319
  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-3BjZSAPZ.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-C6Nxatvt.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-5AEx33r5.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-DxVQWWxv.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-3BjZSAPZ.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-3BjZSAPZ.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-DEVCYhrp.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-C6Nxatvt.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-C6Nxatvt.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-DEVCYhrp.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-5AEx33r5.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-5AEx33r5.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-DxVQWWxv.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-CXYH1Rlc.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-CXYH1Rlc.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-C06mNpwY.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-af8e46f8"]]);
302
302
  export {
303
303
  Se as W
304
304
  };
305
- //# sourceMappingURL=DataForm-C5MBVdei.mjs.map
305
+ //# sourceMappingURL=DataForm-C6VLTSOm.mjs.map