workdesktop-ai 1.0.1 → 1.1.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.
- package/CHANGELOG.md +155 -61
- package/README.md +123 -25
- package/dist/api-button/index.mjs +7 -0
- package/dist/api-button/index.mjs.map +1 -0
- package/dist/assets/Select-CNzSyvlZ.css +1 -0
- package/dist/auto-complete/index.mjs +7 -0
- package/dist/auto-complete/index.mjs.map +1 -0
- package/dist/auto-complete/style.css +1 -0
- package/dist/base.css +1 -0
- package/dist/checkbox-list/index.mjs +7 -0
- package/dist/checkbox-list/index.mjs.map +1 -0
- package/dist/checkbox-list/style.css +1 -0
- package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs +80 -0
- package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs.map +1 -0
- package/dist/chunks/AutoComplete-B_L169hU.mjs +80 -0
- package/dist/chunks/AutoComplete-B_L169hU.mjs.map +1 -0
- package/dist/chunks/CheckboxList-bPqpbd8d.mjs +129 -0
- package/dist/chunks/CheckboxList-bPqpbd8d.mjs.map +1 -0
- package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs +99 -0
- package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs.map +1 -0
- package/dist/chunks/DataForm-C6UW92Ds.mjs +305 -0
- package/dist/chunks/DataForm-C6UW92Ds.mjs.map +1 -0
- package/dist/chunks/DataGrid-BhgND4G_.mjs +1124 -0
- package/dist/chunks/DataGrid-BhgND4G_.mjs.map +1 -0
- package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs +117 -0
- package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map +1 -0
- package/dist/chunks/Drawer-ucXKUecL.mjs +259 -0
- package/dist/chunks/Drawer-ucXKUecL.mjs.map +1 -0
- package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs +125 -0
- package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs.map +1 -0
- package/dist/chunks/EditableGrid-Cx7ScWkW.mjs +1783 -0
- package/dist/chunks/EditableGrid-Cx7ScWkW.mjs.map +1 -0
- package/dist/chunks/FormItem-C1q0opnk.mjs +79 -0
- package/dist/chunks/FormItem-C1q0opnk.mjs.map +1 -0
- package/dist/chunks/Iframe-CeSiMnvR.mjs +65 -0
- package/dist/chunks/Iframe-CeSiMnvR.mjs.map +1 -0
- package/dist/chunks/ImageUpload-D3JGJjVO.mjs +193 -0
- package/dist/chunks/ImageUpload-D3JGJjVO.mjs.map +1 -0
- package/dist/chunks/Panel-d4chdlTA.mjs +113 -0
- package/dist/chunks/Panel-d4chdlTA.mjs.map +1 -0
- package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs +118 -0
- package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs.map +1 -0
- package/dist/chunks/RadioList-DT-8WSN2.mjs +129 -0
- package/dist/chunks/RadioList-DT-8WSN2.mjs.map +1 -0
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs +80 -0
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs.map +1 -0
- package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs +73 -0
- package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs.map +1 -0
- package/dist/chunks/SearchItem-pFO57lEO.mjs +79 -0
- package/dist/chunks/SearchItem-pFO57lEO.mjs.map +1 -0
- package/dist/chunks/SearchPanel-xQ1hPaNq.mjs +158 -0
- package/dist/chunks/SearchPanel-xQ1hPaNq.mjs.map +1 -0
- package/dist/chunks/Select-CMw-tWYm.mjs +114 -0
- package/dist/chunks/Select-CMw-tWYm.mjs.map +1 -0
- package/dist/chunks/Station-BF_QlQ8c.mjs +796 -0
- package/dist/chunks/Station-BF_QlQ8c.mjs.map +1 -0
- package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs +71 -0
- package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs.map +1 -0
- package/dist/chunks/Tips-IWCZcR1K.mjs +63 -0
- package/dist/chunks/Tips-IWCZcR1K.mjs.map +1 -0
- package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs +51 -0
- package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs.map +1 -0
- package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs +200 -0
- package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs.map +1 -0
- package/dist/chunks/Viewer-COLbtcgF.mjs +381 -0
- package/dist/chunks/Viewer-COLbtcgF.mjs.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs +10 -0
- package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs.map +1 -0
- package/dist/chunks/containerContext-BgphFDeH.mjs +13 -0
- package/dist/chunks/containerContext-BgphFDeH.mjs.map +1 -0
- package/dist/chunks/http-DUPsbs2K.mjs +2951 -0
- package/dist/chunks/http-DUPsbs2K.mjs.map +1 -0
- package/dist/chunks/linkage-FbL1mcz3.mjs +66 -0
- package/dist/chunks/linkage-FbL1mcz3.mjs.map +1 -0
- package/dist/chunks/props-DAytpx7D.mjs +65 -0
- package/dist/chunks/props-DAytpx7D.mjs.map +1 -0
- package/dist/chunks/useApiAction-C1CdKGjt.mjs +30 -0
- package/dist/chunks/useApiAction-C1CdKGjt.mjs.map +1 -0
- package/dist/chunks/useColumnSettings-BDtF5-8R.mjs +216 -0
- package/dist/chunks/useColumnSettings-BDtF5-8R.mjs.map +1 -0
- package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs +64 -0
- package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs.map +1 -0
- package/dist/confirm-button/index.mjs +7 -0
- package/dist/confirm-button/index.mjs.map +1 -0
- package/dist/data-form/index.mjs +7 -0
- package/dist/data-form/index.mjs.map +1 -0
- package/dist/data-form/style.css +1 -0
- package/dist/data-grid/index.mjs +7 -0
- package/dist/data-grid/index.mjs.map +1 -0
- package/dist/data-grid/style.css +1 -0
- package/dist/dialog-button/index.mjs +7 -0
- package/dist/dialog-button/index.mjs.map +1 -0
- package/dist/drawer/index.mjs +7 -0
- package/dist/drawer/index.mjs.map +1 -0
- package/dist/drawer/style.css +1 -0
- package/dist/drawer-button/index.mjs +7 -0
- package/dist/drawer-button/index.mjs.map +1 -0
- package/dist/editable-grid/index.mjs +7 -0
- package/dist/editable-grid/index.mjs.map +1 -0
- package/dist/editable-grid/style.css +1 -0
- package/dist/form-item/index.mjs +7 -0
- package/dist/form-item/index.mjs.map +1 -0
- package/dist/form-item/style.css +1 -0
- package/dist/iframe/index.mjs +7 -0
- package/dist/iframe/index.mjs.map +1 -0
- package/dist/iframe/style.css +1 -0
- package/dist/image-upload/index.mjs +7 -0
- package/dist/image-upload/index.mjs.map +1 -0
- package/dist/image-upload/style.css +1 -0
- package/dist/index.esm.js +318 -6474
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +20 -9
- package/dist/index.umd.js.map +1 -1
- package/dist/panel/index.mjs +7 -0
- package/dist/panel/index.mjs.map +1 -0
- package/dist/panel/style.css +1 -0
- package/dist/prompt-button/index.mjs +7 -0
- package/dist/prompt-button/index.mjs.map +1 -0
- package/dist/radio-list/index.mjs +7 -0
- package/dist/radio-list/index.mjs.map +1 -0
- package/dist/radio-list/style.css +1 -0
- package/dist/requester/index.mjs +7 -0
- package/dist/requester/index.mjs.map +1 -0
- package/dist/route-button/index.mjs +7 -0
- package/dist/route-button/index.mjs.map +1 -0
- package/dist/search-item/index.mjs +7 -0
- package/dist/search-item/index.mjs.map +1 -0
- package/dist/search-item/style.css +1 -0
- package/dist/search-panel/index.mjs +7 -0
- package/dist/search-panel/index.mjs.map +1 -0
- package/dist/search-panel/style.css +1 -0
- package/dist/select/index.mjs +7 -0
- package/dist/select/index.mjs.map +1 -0
- package/dist/station/index.mjs +7 -0
- package/dist/station/index.mjs.map +1 -0
- package/dist/station/style.css +1 -0
- package/dist/style.css +1 -1
- package/dist/switch/index.mjs +7 -0
- package/dist/switch/index.mjs.map +1 -0
- package/dist/tips/index.mjs +7 -0
- package/dist/tips/index.mjs.map +1 -0
- package/dist/tips/style.css +1 -0
- package/dist/tips-button/index.mjs +7 -0
- package/dist/tips-button/index.mjs.map +1 -0
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +41 -3
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +43 -5
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +89 -29
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +99 -31
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +51 -11
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +40 -2
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +14 -12
- package/dist/types/src/components/common/props.d.ts +37 -0
- package/dist/types/src/components/containers/Drawer.vue.d.ts +61 -8
- package/dist/types/src/components/containers/Iframe.vue.d.ts +39 -2
- package/dist/types/src/components/containers/containerContext.d.ts +1 -1
- package/dist/types/src/components/containers/useContainerController.d.ts +5 -0
- package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
- package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +212 -5
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +14 -0
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
- package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
- package/dist/types/src/components/{containers → form}/SearchPanel.vue.d.ts +17 -2
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +6 -6
- package/dist/types/src/components/index.d.ts +10 -6
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +12 -3
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +28 -3
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +28 -3
- package/dist/types/src/components/inputs/Select.vue.d.ts +11 -1
- package/dist/types/src/components/inputs/Switch.vue.d.ts +2 -2
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +3 -0
- package/dist/types/src/components/layout/Station.vue.d.ts +302 -0
- package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
- package/dist/types/src/components/layout/types.d.ts +54 -0
- package/dist/types/src/components/styles/Panel.vue.d.ts +47 -5
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +9 -9
- package/dist/types/src/components/upload/Upload.vue.d.ts +1 -1
- package/dist/types/src/entries/api-button.d.ts +9 -0
- package/dist/types/src/entries/auto-complete.d.ts +9 -0
- package/dist/types/src/entries/checkbox-list.d.ts +9 -0
- package/dist/types/src/entries/components-map.d.ts +8 -0
- package/dist/types/src/entries/confirm-button.d.ts +9 -0
- package/dist/types/src/entries/data-form.d.ts +9 -0
- package/dist/types/src/entries/data-grid.d.ts +9 -0
- package/dist/types/src/entries/dialog-button.d.ts +9 -0
- package/dist/types/src/entries/drawer-button.d.ts +9 -0
- package/dist/types/src/entries/drawer.d.ts +9 -0
- package/dist/types/src/entries/editable-grid.d.ts +9 -0
- package/dist/types/src/entries/form-item.d.ts +9 -0
- package/dist/types/src/entries/iframe.d.ts +9 -0
- package/dist/types/src/entries/image-upload.d.ts +9 -0
- package/dist/types/src/entries/panel.d.ts +9 -0
- package/dist/types/src/entries/prompt-button.d.ts +9 -0
- package/dist/types/src/entries/radio-list.d.ts +9 -0
- package/dist/types/src/entries/requester.d.ts +9 -0
- package/dist/types/src/entries/route-button.d.ts +9 -0
- package/dist/types/src/entries/search-item.d.ts +9 -0
- package/dist/types/src/entries/search-panel.d.ts +9 -0
- package/dist/types/src/entries/select.d.ts +9 -0
- package/dist/types/src/entries/station.d.ts +9 -0
- package/dist/types/src/entries/switch.d.ts +9 -0
- package/dist/types/src/entries/tips-button.d.ts +9 -0
- package/dist/types/src/entries/tips.d.ts +9 -0
- package/dist/types/src/entries/upload.d.ts +9 -0
- package/dist/types/src/entries/viewer.d.ts +9 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/lib/composables/useConfig.d.ts +1 -1
- package/dist/types/src/lib/composables/useDataGrid.d.ts +15 -0
- package/dist/types/src/lib/core/http.d.ts +21 -4
- package/dist/types/src/lib/core/station-linkage.d.ts +41 -0
- package/dist/types/src/types/config.d.ts +21 -4
- package/dist/types/vite.config.d.ts +6 -1
- package/dist/upload/index.mjs +7 -0
- package/dist/upload/index.mjs.map +1 -0
- package/dist/viewer/index.mjs +7 -0
- package/dist/viewer/index.mjs.map +1 -0
- package/dist/viewer/style.css +1 -0
- package/package.json +199 -68
- package/dist/types/src/components/containers/Dialog.vue.d.ts +0 -112
- package/dist/types/src/components/data/editable-table/EditableTable.vue.d.ts +0 -306
- package/dist/types/src/components/utils/Viewer.vue.d.ts +0 -131
package/CHANGELOG.md
CHANGED
|
@@ -1,61 +1,155 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
本项目遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
4
|
-
|
|
5
|
-
## [Unreleased]
|
|
6
|
-
|
|
7
|
-
###
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- `
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- `
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
本项目遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- `WdDialog` 合并进 `WdDrawer`:容器组件统一为一个,通过 `mode="drawer" | "dialog"` 切换(默认 `drawer`);`size` 同时作用于抽屉尺寸与对话框宽度,`direction` 仅抽屉模式生效,`filter` / `headRefreshDatagrid` / 事件 / 插槽保持不变。容器组件由 `WdDialog` / `WdDrawer` 两个合并为一个 `WdDrawer`(组件总数 -1)。
|
|
10
|
+
- `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`)。
|
|
13
|
+
- **所有按钮组件均已集成语悬停提示**:和 TipsButton 一样,每个按钮组件都支持 `tips`(提示内容)、`tipsType`(主题)、`placement`(位置)三个属性;当 `tips` 非空时自动用 `el-tooltip` 包裹,无提示则不包裹;现在所有按钮都可按需添加悬停提示,无需额外套一层 tooltip。
|
|
14
|
+
- **PromptButton 自定义内容插槽**:新增 `#content` 插槽允许开发者自定义弹窗内容(示例中展示了嵌入 `WdDataForm` 实现多字段输入表单);点击确认后默认发起 API 请求,仅当 API 返回包 `success=true` 时自动关闭弹窗,API 请求失败时不关闭弹窗,允许开发者修改错误后重试。新增 `confirm` 事件(自定义内容模式点击确认触发)。
|
|
15
|
+
- **文档站 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`,保证静态部署后示例仍可演示)。
|
|
16
|
+
|
|
17
|
+
### Removed
|
|
18
|
+
|
|
19
|
+
- 移除 `WdDialog` 容器组件及其导出,请改用 `WdDrawer` 并设置 `mode="dialog"`。
|
|
20
|
+
- 移除 `WdDialogButton` 组件及其导出,请改用 `WdDrawerButton` 并设置 `mode="dialog"`。
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- 修复 `WdDialog` / `WdDrawer` 容器「外部 `v-model` 置 true 无法打开」:`useContainerController` 原先只在容器挂载时读一次 `modelValue`(`visible = ref(!!props.modelValue)`),不监听后续变化。而 `WdDrawerButton` 采用「先懒挂载容器、`nextTick` 后再置 `panelVisible=true`」的两段式时序,导致打开动作失效——dialog 模式完全不弹层、抽屉/对话框内容无法正确呈现,且关闭后父级状态不回写,二次打开同样失败。现补充双向同步:`watch(modelValue)` 使外部置位即时生效(受控打开),`watch(visible)` 在弹层被 X / 遮罩 / ESC 关闭后回写 `update:modelValue=false`,保证重复开关正常。新增 `useContainerController.test.ts` 4 个回归用例。
|
|
25
|
+
- 修复 `WdStation` 菜单徽章(badge)位置错乱:`el-badge` 继承 `el-menu-item` 的 `line-height:56px` 导致行盒撑满整行、圆点垂直沉底,且水平紧贴标题右侧而非菜单项右侧。现徽章转为 `inline-flex`(消除行盒撑高)+ `margin-left:auto` 靠右 + `align-self:center` 垂直居中;菜单折叠成窄条时隐藏徽章避免溢出。Playwright 坐标级断言 6 项全过。
|
|
26
|
+
- `WdStation` tabs 标签分隔线由 `border-left`(首个标签无左边框、末个标签右侧开口)改为 `border-right`:每个标签默认带右侧边框(含最后一个),tabs 区右端封闭,与右侧下拉按钮区自然分隔。Playwright 回归 24 项全过。
|
|
27
|
+
- 修复 `WdDataGrid` 表格/列表清单模式切换按钮不渲染:按钮渲染条件误用从未渲染的 `$slots.list` 插槽(顶/底工具组及 `hasTools` 判定共 3 处),与文档记载的 `card-item` 插槽不一致,导致开启 `mode-switch` 并提供 `card-item` 后按钮仍不出现、功能按文档契约完全不可达。现统一为 `card-item` 插槽判定。新增 2 个集成回归用例(提供插槽时渲染按钮 + 点击双向切换 + `mode-change` 事件回传;未提供插槽时不渲染按钮)。`WdEditableGrid` 无此问题(其切换按钮无插槽限制)。
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **`WdStation` 固定点位全面开放插槽(11 个新增)**:`logo`(side 模式在侧栏顶部、top/none 模式在顶栏左侧,两处共用同一插槽)、`menu-top` / `menu-bottom`(侧栏菜单滚动区上/下方,仅 side 模式)、`header-left` / `header-center` / `header-right`(顶栏左/中/右扩展位,`header-right` 位于工具栏右侧点位之前)、`top-menu-left` / `top-menu-right`(顶部菜单行两侧,仅 top 模式)、`tabs-left` / `tabs-right`(tabs 条两侧,仅 tabs 内容模式)、`footer`(底栏整区)。所有插槽内置默认内容 fallback——未传插槽时各点位保持原渲染,完全向后兼容;`logo` 与 `footer` 为替换型(传入后默认图标+标题 / footer-info+copyright 不再渲染),其余为追加型。`logo` / `menu-top` / `menu-bottom` 透传 `collapsed` 作用域参数,折叠时可切换 mini 形态(如 `v-show="!collapsed"` 隐藏文字)。顶部菜单行改 flex 布局(`el-menu` `flex:1` 占满中间)以容纳左右扩展位。新增 3 个集成用例(点位渲染与位置顺序 / top 模式点位与未传点位默认保持 / collapsed 作用域透传),Playwright 实测 25 项断言全过(含折叠/展开切换复核);文档站新增「固定点位插槽」示例(第 7 个 demo),api-meta slots 表同步补全。
|
|
32
|
+
|
|
33
|
+
- **`WdDataGrid` 分页支持位置指定 `pagerPosition`**:left / center / right,默认 right(与既有行为一致)。缺省时走全局配置 `page.pager.position`(`PagerConfig` 新增 `position` 项,默认 `'right'`),prop 优先于全局配置;有底部工具组(tools/toolbar 置 bottom)时分页仍按指定位置对齐,组自然排布于剩余空间。新增 2 个集成用例(prop 三档 + 全局配置优先级),Playwright 坐标级实测三档布局。
|
|
34
|
+
|
|
35
|
+
- **docs 新增 `WdDataGrid`「表格 / 列表清单模式(卡片)」示例**:静态项目台账数据 + 自定义 `card-item` 卡片(项目名称/状态/编号/负责人/截止日期/进度条/优先级标签)+ `mode-change` 事件 ElMessage 提示,演示开启 `mode-switch` 后工具栏切换按钮在表格视图与列表清单(卡片)视图间切换的完整用法;旧「静态数据」示例移除误导性的 `mode-switch` 声明(未提供 `card-item` 插槽时按钮本不渲染),更名「静态数据 + 动态列」。
|
|
36
|
+
|
|
37
|
+
- **`WdDrawerButton` 新增 `buttonSize`(按钮尺寸)**:DrawerButton 的 `size` 已被「弹层尺寸」占用,el-button 的按钮尺寸无法通过 `size` 透传(被截获)。现新增 `buttonSize` prop 专门控制按钮尺寸(large/default/small),与弹层尺寸解耦;`DialogButton` 已有 `buttonSize`。
|
|
38
|
+
- **修复 datagrid 示例操作列 el-button-group 样式错乱**:原示例把 `<el-button>` 放进 DrawerButton 的 `#button` 内容插槽,渲染出「button 嵌套 button」的非法 HTML,导致 group 内按钮尺寸/样式错乱。已改为 `label` + `type` + `button-size` 属性式写法,group 内两个按钮(详情 + 删除)尺寸一致、圆角衔接、边框合并、分割色全部正确(Playwright 实测验证)。
|
|
39
|
+
|
|
40
|
+
- **全部按钮组件支持 `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 页与示例)。
|
|
42
|
+
|
|
43
|
+
- `WdEditableGrid` 完整集成 DataGrid 全部能力:API/静态双数据源(`api` / `dataSource` / `modelValue`)、分页、工具栏 tools(刷新/尺寸/列设置/模式切换)、高度模式(`height="fix"` / 固定高度 / 自适应)、表格/卡片模式切换、动态列设置(配置列与插槽列合并,localStorage 持久化)、行合并、树形、多选、`rowActions` 只读操作列、SearchPanel / `refreshDataGrid` 联动注册;同时保留可编辑能力:`columns` 配置驱动可编辑列、cell/row 双编辑模式、脏行跟踪、required + 自定义校验、`saveApi` 批量保存、新增/删除行。
|
|
44
|
+
- `WdEditableGrid` 新增单元格级「已修改」样式:进入编辑时记录该行基线,单元格当前值若与基线不一致(判定为用户编辑过)即自动标识(默认单元格最右侧显示红色感叹号小图标 `.is-dirty`,可自定义);改回原值或取消 / 保存成功后样式自动消失。脏状态粒度由整行细化到单元格。标识样式通过 CSS 变量自定义,默认:
|
|
45
|
+
- 显示感叹号图标(`--wd-cell-dirty-show-icon: true`)
|
|
46
|
+
- 图标颜色用警告色 `--wd-cell-dirty-color: var(--el-color-warning)`
|
|
47
|
+
- 单元格底色透明 `--wd-cell-dirty-bg: transparent`
|
|
48
|
+
开发者可覆盖:
|
|
49
|
+
```css
|
|
50
|
+
/* 恢复底色高亮 + 关闭图标 */
|
|
51
|
+
.wd-editable-grid__cell.is-dirty {
|
|
52
|
+
--wd-cell-dirty-show-icon: false;
|
|
53
|
+
--wd-cell-dirty-decoration: none;
|
|
54
|
+
--wd-cell-dirty-bg: rgba(230,162,60,.12);
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
- `WdEditableGrid` 新增与 ElForm 完全一致的 `rules` 单元格校验:`columns[].rules` 基于 `async-validator`(与 `el-form` 的 `:rules` 同源),规则不满足的单元格显示约束样式(`.is-error`),默认浅红底色 + 红色内边框;可通过 CSS 变量自定义:
|
|
58
|
+
- `--wd-cell-error-bg`:单元格背景色
|
|
59
|
+
- `--wd-cell-error-border`:边框阴影
|
|
60
|
+
示例:
|
|
61
|
+
```css
|
|
62
|
+
/* 自定义深色错误背景 */
|
|
63
|
+
.wd-editable-grid__cell.is-error {
|
|
64
|
+
--wd-cell-error-bg: rgba(245, 108, 108, 0.3);
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
批量保存与行内保存前先校验,失败即中断并 `ElMessage.warning` 提示 + 触发 `validate-fail` 事件(携带 `{ index, row, column, error }`),不发起保存请求。`required` / 自定义 `validator` 兼容沿用。
|
|
68
|
+
- `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 用例。
|
|
70
|
+
- `WdStation` 顶栏中央区由居中改为**左对齐**:左位/右位按内容宽度收缩,中央区 `flex:1` 占满剩余空间,分导台块状项 / 标题文案从左侧起排。
|
|
71
|
+
- `WdStation` tabs 条样式与交互增强:tabs 条整宽撑满内容列(el-tabs `flex:1`),消除 nav 左/上边框与 header 底线(底线由外层容器统一承担),tab 间保留分隔线;条最右侧新增下拉按钮,内置「关闭当前标签 / 关闭左侧标签 / 关闭其他标签 / 关闭所有标签」批量操作——`affix` 标签永不关闭,无可关对象时对应菜单项禁用,批量关闭逐个触发 `tab-close`,激活标签被关闭后跳转原位置相邻标签。集成测试扩为 22 用例。
|
|
72
|
+
|
|
73
|
+
## [1.0.2] - 2026-09-06
|
|
74
|
+
|
|
75
|
+
文档示例告警治理与 HTML 模板渲染友好性修复。基于文档站 24 个组件页 + 7 个场景页的自动化控制台检测,修复 5 类 Vue / Element Plus 警告。
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
|
|
79
|
+
**按钮组 text 属性透传报错(影响 5 个按钮)**
|
|
80
|
+
|
|
81
|
+
- `WdApiButton`、`WdConfirmButton`、`WdPromptButton`、`WdRouteButton`、`WdTipsButton` 新增 `text` 文字 prop(String),支持 `text="保存配置"` 属性式写法;默认插槽兜底渲染 `{{ text }}`。
|
|
82
|
+
- 根因:组件未声明 `text` 时,属性式写法的字符串会经 `$attrs` 透传给 `el-button`,而 el-button 的 `text` 是 Boolean 型「文字按钮」开关,触发类型校验警告。声明 prop 后该属性自动从 `$attrs` 移除。统一对齐 `WdDrawerButton` / `WdDialogButton` 已有的 `text` + 插槽范式。
|
|
83
|
+
|
|
84
|
+
**WdImageUpload thumbnailSize 类型**
|
|
85
|
+
|
|
86
|
+
- `thumbnail-size` prop 类型由 `Number` 放宽为 `[Number, String]`,兼容 HTML 属性式字符串写法(如 `thumbnail-size="90"`),`v-bind` CSS 对两种类型均正确产出像素值。
|
|
87
|
+
|
|
88
|
+
**WdDataForm 编辑态首帧控件告警**
|
|
89
|
+
|
|
90
|
+
- 同步数据(`props.data` / 容器 `data`)的回填由 `onMounted` 提前到 setup 阶段(首次渲染前),避免插槽内 `el-switch` / `el-radio` 等控件首帧绑定 `undefined` 触发 Element Plus 校验警告;api 异步详情仍在 `onMounted` 拉取并覆盖。
|
|
91
|
+
|
|
92
|
+
**WdAutoComplete v-loading 指令告警**
|
|
93
|
+
|
|
94
|
+
- `v-loading` 由根节点 `el-autocomplete`(根为 ElTooltip / fragment 非单一原生元素)移至包裹 `<div>`,修复 "Runtime directive used on component with non-element root node at <ElPopper>" 告警。
|
|
95
|
+
|
|
96
|
+
**文档示例**
|
|
97
|
+
|
|
98
|
+
- `select` 远程搜索示例补全 `value-prop="id" text-prop="name"`:mock `/user/list` 返回用户对象主键为 `id`、名称字段为 `name`(非默认 `value` / `text`),缺失映射导致 `el-option` 的 `value` 为 `undefined` 告警。
|
|
99
|
+
|
|
100
|
+
## [1.0.1] - 2026-09-05
|
|
101
|
+
|
|
102
|
+
1.0.0 修订发布。
|
|
103
|
+
|
|
104
|
+
## [1.0.0] - 2026-09-05
|
|
105
|
+
|
|
106
|
+
首个正式发布。
|
|
107
|
+
|
|
108
|
+
### Added
|
|
109
|
+
|
|
110
|
+
**基础设施**
|
|
111
|
+
|
|
112
|
+
- HTTP 客户端 `request` / `http`:axios 封装,统一 `{ code, message, data }` 解封包、`urlPrefix` 前缀、Loading、成功/失败/异常提示、请求全生命周期监听、`create()` 子实例配置覆盖、请求/响应拦截器。
|
|
113
|
+
- 三级配置系统:内置默认配置 → 全局配置(`app.use` 第二参 / `window.workDesktopConfig`)→ 组件 props,deep merge;运行期 API `initConfig / setGlobalConfig / getGlobalConfig / mergeConfig / resetConfig`。
|
|
114
|
+
- 主题系统:语义色令牌(primary/success/warning/danger/info)与自定义 CSS 变量,支持配置对象生成 + CSS 变量覆盖。
|
|
115
|
+
- 声明式联动注册中心(`registerDataGrid / refreshDataGrid / searchDataGrid / resetSearchDataGrid / getDataGrids`):属性式联动(`head-refresh-datagrid` / `head-close-drawer` 等)。
|
|
116
|
+
- 组合式 Hooks:`useRequest`、`useDataGrid`、`useConfig`、`useGlobalConfig`、`useEventBus`、`useGlobalState`。
|
|
117
|
+
- 轻量事件总线 `useEventBus` 支持跨层级事件驱动联动。
|
|
118
|
+
|
|
119
|
+
**数据组件**
|
|
120
|
+
|
|
121
|
+
- `WdDataGrid`:API / 静态双数据源、分页、搜索联动、工具栏(刷新 / 表格大小 / 视图切换)、动态列设置与本地持久化、序号列、多选、树形数据、卡片模式、行操作列场景规范。
|
|
122
|
+
- `WdEditableTable`:单元格级可编辑表格。
|
|
123
|
+
- `WdDataForm`:新增 / 编辑 / 详情回填、校验、提交(含保存并继续)、API 加载、字段白/黑名单、改动检测(`isDirty` / 离开拦截)、提交后联动刷新目标 DataGrid。
|
|
124
|
+
|
|
125
|
+
**按钮组(7)**
|
|
126
|
+
|
|
127
|
+
- `WdApiButton`、`WdConfirmButton`、`WdPromptButton`、`WdRouteButton`、`WdTipsButton`、`WdDrawerButton`、`WdDialogButton`。
|
|
128
|
+
|
|
129
|
+
**容器组(4)**
|
|
130
|
+
|
|
131
|
+
- `WdDialog`、`WdDrawer`、`WdIframe`、`WdSearchPanel`(含头部刷新/重置声明式联动)。
|
|
132
|
+
|
|
133
|
+
**输入选择组(5)**
|
|
134
|
+
|
|
135
|
+
- `WdSelect`、`WdAutoComplete`、`WdCheckboxList`、`WdRadioList`、`WdSwitch`。
|
|
136
|
+
|
|
137
|
+
**上传组(2)**
|
|
138
|
+
|
|
139
|
+
- `WdUpload`(单/多文件、模板下载、错误回显)、`WdImageUpload`(图片预览与裁剪配合 Viewer)。
|
|
140
|
+
|
|
141
|
+
**展示与工具**
|
|
142
|
+
|
|
143
|
+
- `WdPanel`、`WdTips`(长内容悬停提示)、`WdViewer`(图片 / PDF / 文档预览,缩放旋转翻页)。
|
|
144
|
+
|
|
145
|
+
**工程与质量**
|
|
146
|
+
|
|
147
|
+
- Vite 库模式双产物:ESM(`index.esm.js`)+ UMD(`index.umd.js`,全局名 `WorkDesktop`)+ 全量 `.d.ts` + 汇总 `style.css`。
|
|
148
|
+
- TypeScript 全类型导出;文档站(组件示例 + 场景演示 + Playground)、Mock 服务。
|
|
149
|
+
- 测试体系:vitest + @vue/test-utils,基础设施单测 87 用例 + DataGrid/DataForm 集成 19 用例,基础库行覆盖率 98%。
|
|
150
|
+
- 中文内置文案,语义化版本与开源配置(MIT)。
|
|
151
|
+
|
|
152
|
+
[Unreleased]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.2...HEAD
|
|
153
|
+
[1.0.2]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.1...v1.0.2
|
|
154
|
+
[1.0.1]: https://github.com/wordyhuang/workdesktop-ai/compare/v1.0.0...v1.0.1
|
|
155
|
+
[1.0.0]: https://github.com/wordyhuang/workdesktop-ai/releases/tag/v1.0.0
|
package/README.md
CHANGED
|
@@ -3,27 +3,32 @@
|
|
|
3
3
|
<span>企业级 Vue 3 组件库 · 基于 ElementPlus · HTML 模板友好 / AI 编码友好</span>
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
> 文档版本:V\_1.0 | 创建时间:2026-09-16 22:03:47 | 最后修改时间:2026-09-16 22:03:47
|
|
7
|
+
> 适用对象:使用本库的开发者(人类阅读;AI 助手请改读 [llms.txt](./llms.txt))
|
|
8
|
+
> 核心目标:帮助开发者快速了解、安装并上手 WorkDesktop AI
|
|
9
|
+
> 文档简述:项目门面说明,覆盖特性、安装、三种引入方式、全局配置、组件总览、请求核心、Hooks 与本地开发指引。当前库版本:v1.0.2
|
|
10
|
+
|
|
11
|
+
***
|
|
7
12
|
|
|
8
13
|
WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在 ElementPlus 之上做「场景化复合封装」:
|
|
9
14
|
|
|
10
15
|
- **列表一体化**:`DataGrid` 一个组件完成「查询 + 分页 + 工具栏 + 表格 + 列设置 + 卡片/表格切换」;
|
|
11
16
|
- **请求一体化**:内置 axios 封装,自动完成 `{ code, message, data }` 解封包、Loading、错误提示;
|
|
12
|
-
- **AI 编码友好**:`HTML 模板渲染优先`,组件用标签即所得,TypeScript
|
|
17
|
+
- **AI 编码友好**:`HTML 模板渲染优先`,组件用标签即所得,TypeScript 类型完整;仓库根目录附带面向 AI 的 [llms.txt](./llms.txt);
|
|
13
18
|
- **双入口**:既支持 npm 工程化使用,也支持浏览器 `<script>` 直引(UMD),无需构建。
|
|
14
19
|
|
|
15
20
|
## 特性
|
|
16
21
|
|
|
17
|
-
| 能力
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
| 三级配置
|
|
21
|
-
| 内置 HTTP
|
|
22
|
-
| 声明式联动
|
|
23
|
-
| 组合式 Hooks
|
|
24
|
-
|
|
|
25
|
-
| 开箱主题
|
|
26
|
-
| 测试保障
|
|
22
|
+
| 能力 | 说明 |
|
|
23
|
+
| ---------- | ---------------------------------------------------------------------------------------------------- |
|
|
24
|
+
| 28 个业务组件 | DataGrid / EditableGrid / Viewer / DataForm / SearchPanel / 8 类按钮 / Drawer / Iframe / Station 整页布局 等 |
|
|
25
|
+
| 三级配置 | 内置默认 → 全局(`app.use` / `window.workDesktopConfig`)→ 组件 props,deep merge |
|
|
26
|
+
| 内置 HTTP | axios 封装:统一封包格式、URL 前缀、Loading、失败/异常提示、请求监听、并发去重、子实例配置;请求核心 `RequestAPI` 公开,支持手动调用 API 请求代码 |
|
|
27
|
+
| 声明式联动 | 属性(`filter` 分组 + `head-refresh-datagrid` 刷新)+ 事件驱动(A+B 混合),无需引入中心化 DSL |
|
|
28
|
+
| 组合式 Hooks | `useRequest` / `useDataGrid` / `useConfig` / `useGlobalConfig` / `useEventBus` / `useGlobalState` |
|
|
29
|
+
| 双产物 + 按需入口 | `dist/index.esm.js` + `dist/index.umd.js` + 27 个组件子路径入口 + 完整 `.d.ts` |
|
|
30
|
+
| 开箱主题 | 语义色令牌 + CSS 变量覆盖 + 配置对象生成主题 |
|
|
31
|
+
| 测试保障 | vitest + @vue/test-utils:106 用例,基础库行覆盖率 98% |
|
|
27
32
|
|
|
28
33
|
## 安装
|
|
29
34
|
|
|
@@ -43,7 +48,7 @@ import ElementPlus from 'element-plus'
|
|
|
43
48
|
import 'element-plus/dist/index.css'
|
|
44
49
|
import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
|
45
50
|
|
|
46
|
-
import WorkDesktop from 'workdesktop-ai' // Vue 插件:全量注册
|
|
51
|
+
import WorkDesktop from 'workdesktop-ai' // Vue 插件:全量注册 28 个组件
|
|
47
52
|
import 'workdesktop-ai/style.css'
|
|
48
53
|
|
|
49
54
|
const app = createApp(App)
|
|
@@ -77,6 +82,8 @@ app.mount('#app')
|
|
|
77
82
|
|
|
78
83
|
### 按需引入
|
|
79
84
|
|
|
85
|
+
方式一:主入口命名导出(tree-shaking 由构建工具完成):
|
|
86
|
+
|
|
80
87
|
```ts
|
|
81
88
|
import { createApp } from 'vue'
|
|
82
89
|
import { WdDataGrid, WdDataForm } from 'workdesktop-ai'
|
|
@@ -87,6 +94,18 @@ app.component(WdDataGrid.name, WdDataGrid)
|
|
|
87
94
|
app.component(WdDataForm.name, WdDataForm)
|
|
88
95
|
```
|
|
89
96
|
|
|
97
|
+
方式二:子路径按需入口(27 个子路径,产物与样式都可按组件粒度引入):
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
import WdDataGrid from 'workdesktop-ai/data-grid'
|
|
101
|
+
import 'workdesktop-ai/base.css' // 基础样式(必引)
|
|
102
|
+
import 'workdesktop-ai/data-grid/style.css' // 该组件的样式
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
- 子路径命名规则为组件名的 kebab-case:`data-grid` / `data-form` / `drawer-button` / `search-panel` / `station` 等;
|
|
106
|
+
- 其中 14 个组件带独立 `style.css`(data-grid、data-form、editable-grid、drawer、iframe、panel、viewer、station、search-panel、search-item、form-item、auto-complete、image-upload、tips),其余组件无额外样式;
|
|
107
|
+
- 注意:`WdPopconfirmButton` 没有子路径入口,只从主入口 `import { WdPopconfirmButton } from 'workdesktop-ai'` 引入。
|
|
108
|
+
|
|
90
109
|
### 纯 script 直引(UMD,无需构建)
|
|
91
110
|
|
|
92
111
|
在 HTML 中依次引入 Vue3、ElementPlus、图标库与本库产物:
|
|
@@ -141,6 +160,7 @@ app.use(WorkDesktop, {
|
|
|
141
160
|
urlPrefix: '/api',
|
|
142
161
|
axiosConfig: { timeout: 15000 }, // 透传给 axios
|
|
143
162
|
loading: { enable: true },
|
|
163
|
+
dedup: true, // 并发相同请求合并去重(method+url+params 一致只发一次)
|
|
144
164
|
transform: {
|
|
145
165
|
requestInterceptor: (config) => config, // 发请求前改写 axios 配置
|
|
146
166
|
responseInterceptor: (res) => res // 拿到响应后改写
|
|
@@ -162,23 +182,48 @@ app.use(WorkDesktop, {
|
|
|
162
182
|
|
|
163
183
|
组件级 props 优先级最高,三者按需覆盖。运行期也提供 API:`setGlobalConfig` / `mergeConfig` / `getGlobalConfig` / `resetConfig`。
|
|
164
184
|
|
|
185
|
+
> 注意:配置在组件挂载时读取一次并缓存,运行中修改全局配置只影响之后新挂载的组件;已挂载组件可通过变更 `:key` 强制重建。
|
|
186
|
+
|
|
165
187
|
## 与 ElementPlus 的边界
|
|
166
188
|
|
|
167
189
|
- 基础控件(按钮、输入框、下拉、表格单元格等)继续使用 ElementPlus,**不重复造轮子**;
|
|
168
190
|
- 本库只做场景化复合与业务约定的封装,宿主对 ElementPlus 的使用方式完全不受影响。
|
|
169
191
|
|
|
170
|
-
##
|
|
192
|
+
## 组件总览(28 个)
|
|
193
|
+
|
|
194
|
+
| 分组 | 组件 |
|
|
195
|
+
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
196
|
+
| 数据 | `WdDataGrid`(分页表格)、`WdEditableGrid`(可编辑表格)、`WdViewer`(详情描述列表) |
|
|
197
|
+
| 表单 | `WdDataForm`(数据表单)、`WdSearchPanel`(搜索面板)、`WdFormItem` / `WdSearchItem`(表单项包装) |
|
|
198
|
+
| 按钮组(8 个) | `WdApiButton` / `WdConfirmButton` / `WdPopconfirmButton` / `WdPromptButton` / `WdRouteButton` / `WdTipsButton` / `WdDrawerButton`(`mode` 切换抽屉/对话框)/ `WdDialogButton`(对话框专用) |
|
|
199
|
+
| 容器 | `WdDrawer`(`mode` 切换抽屉/对话框,支持 iframe 宿主)、`WdIframe`(iframe 嵌入与通信) |
|
|
200
|
+
| 输入选择 | `WdSelect` / `WdAutoComplete` / `WdCheckboxList` / `WdRadioList` / `WdSwitch`(切换即请求,失败自动回滚) |
|
|
201
|
+
| 上传 | `WdUpload`(文件)、`WdImageUpload`(图片,强制 image/\*) |
|
|
202
|
+
| 样式 | `WdPanel`(面板)、`WdTips`(提示图标/提示框) |
|
|
203
|
+
| 布局 | `WdStation`(管理台整页布局:菜单分组 / 标签页 / 工具栏 / 页脚) |
|
|
204
|
+
| 核心 | `WdRequester`(命令式请求触发器,v-model 开关语义) |
|
|
205
|
+
|
|
206
|
+
## 手动调用请求(RequestAPI)
|
|
171
207
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
208
|
+
本库所有请求类组件(DataGrid / DataForm / 按钮组 / 输入选择 / 上传等)都基于同一个请求核心开发,该核心对外公开,开发者可以在组件外**手动调用 API 请求代码**:
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
import { RequestAPI, request, type ApiResult } from 'workdesktop-ai'
|
|
212
|
+
|
|
213
|
+
// 方式一:全局单例(与组件共用同一套 urlPrefix / loading / 提示 / 解封逻辑)
|
|
214
|
+
const result: ApiResult = await request.get('/user/list', { currentPage: 1, pageSize: 20 })
|
|
215
|
+
if (result.success) {
|
|
216
|
+
console.log(result.data) // 已解封的业务 data
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// 方式二:new RequestAPI() 自建独立实例(可传 axios 配置:baseURL / timeout / headers 等)
|
|
220
|
+
const customApi = new RequestAPI({ baseURL: '/other-api', timeout: 20000 })
|
|
221
|
+
await customApi.post('/user/save', { name: '张三' })
|
|
222
|
+
|
|
223
|
+
// 方法一致:get / post / put / delete / request;业务失败 resolve(success=false),仅网络异常 reject
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
`reqOptions` 可覆盖项:`{ showLoading?, showTips?, tipsConfig?, axiosConfig?, signal?, dedup? }`;可用 `request.on(handler)` 订阅 `apiBefore / apiSuccess / apiFail / apiException / apiAfter` 请求事件。
|
|
182
227
|
|
|
183
228
|
## Hooks
|
|
184
229
|
|
|
@@ -193,6 +238,10 @@ const grid = useDataGrid({ api: '/user/list', immediate: true })
|
|
|
193
238
|
await grid.search({ name: '张' })
|
|
194
239
|
```
|
|
195
240
|
|
|
241
|
+
## AI 编码助手
|
|
242
|
+
|
|
243
|
+
仓库根目录提供 [llms.txt](./llms.txt) —— 面向 AI 的机器可读全量参考(28 个组件 API、配置体系、请求协议、声明式联动、跨 iframe 通信协议、常见陷阱清单)。使用 Copilot / Cursor / Trae 等 AI 助手开发时,让它先阅读该文件,可显著减少组件误用。
|
|
244
|
+
|
|
196
245
|
## 本地开发
|
|
197
246
|
|
|
198
247
|
```bash
|
|
@@ -205,10 +254,59 @@ npm run typecheck # 类型检查(vue-tsc)
|
|
|
205
254
|
npm run build # 产出 ESM + UMD + .d.ts 到 dist/
|
|
206
255
|
```
|
|
207
256
|
|
|
257
|
+
## 项目示例与文档站启动
|
|
258
|
+
|
|
259
|
+
### 文档站
|
|
260
|
+
|
|
261
|
+
项目内置独立文档站(Vue Vite 应用),包含组件完整文档、API 表格、可运行代码示例:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
cd code
|
|
265
|
+
npm install # 如果已安装过依赖可跳过
|
|
266
|
+
npm run docs:dev # 启动文档站,默认 http://localhost:5003
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
打开浏览器访问即可查看每个组件的 API 与在线可运行示例。所有示例均可「查看代码」复制粘贴直接使用。
|
|
270
|
+
|
|
271
|
+
### 纯 HTML UMD 示例
|
|
272
|
+
|
|
273
|
+
项目内置 `code/examples/index.html`,可直接打开浏览器查看纯 script 标签引入用法(UMD 全局版本)。也可以启动一个简单 HTTP 服务器预览:
|
|
274
|
+
|
|
275
|
+
```powershell
|
|
276
|
+
# PowerShell 自带 Python,无需额外安装
|
|
277
|
+
cd code
|
|
278
|
+
python -m http.server 8000
|
|
279
|
+
# 打开浏览器访问 http://localhost:8000/examples/index.html
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
```cmd
|
|
283
|
+
:: cmd 下也一样
|
|
284
|
+
cd code
|
|
285
|
+
python -m http.server 8000
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Playground
|
|
289
|
+
|
|
290
|
+
`npm run dev` 可启动组件调试游乐场,用于开发测试新组件或修改现有组件。
|
|
291
|
+
|
|
208
292
|
## 参与贡献
|
|
209
293
|
|
|
210
|
-
欢迎提交 Issue 与 PR,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
294
|
+
欢迎提交 Issue 与 PR,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。版本变更记录见 [CHANGELOG.md](./CHANGELOG.md)。
|
|
211
295
|
|
|
212
296
|
## License
|
|
213
297
|
|
|
214
298
|
[MIT](./LICENSE)
|
|
299
|
+
|
|
300
|
+
***
|
|
301
|
+
|
|
302
|
+
## 版本变化
|
|
303
|
+
|
|
304
|
+
- **V\_1.0**(2026-09-16 22:03:47):首次建立带版本标注的 README。相对旧版的变化:
|
|
305
|
+
1. 组件总数 25 → 28(按 `src/components/index.ts` 实际导出核对);
|
|
306
|
+
2. 「组件总览」按源码分组重排:`WdViewer` 归入数据组、`WdSearchPanel`/`WdFormItem`/`WdSearchItem` 归入表单组,补齐旧版遗漏的 `WdRequester`、`WdFormItem`、`WdSearchItem`、`WdDialogButton`、`WdPopconfirmButton`、`WdStation`;
|
|
307
|
+
3. 「按需引入」新增子路径入口方式(27 个子路径 + 14 个独立样式说明,标注 `WdPopconfirmButton` 仅主入口);
|
|
308
|
+
4. 特性表补充「并发去重」「27 个组件子路径入口」,Hooks 列表补齐 `useGlobalConfig` / `useGlobalState`;
|
|
309
|
+
5. 新增「AI 编码助手」章节,指引阅读仓库根目录的 `llms.txt`;
|
|
310
|
+
6. `reqOptions` 补充 `dedup` 项;全局配置示例补充 `dedup`,并新增「配置挂载时缓存」注意提示;
|
|
311
|
+
7. 头部新增文档版本信息块(版本 / 时间 / 适用对象 / 目标 / 简述),文尾新增本「版本变化」章节。
|
|
312
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wd-option-row[data-v-a8ac119c]{display:flex;align-items:center;gap:6px;width:100%}.wd-option-text[data-v-a8ac119c]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wd-option-tip[data-v-a8ac119c]{flex:none;display:inline-flex;align-items:center;color:var(--el-text-color-secondary, #909399);font-size:14px;cursor:help}.wd-option-tip[data-v-a8ac119c]:focus-visible{outline:1px dashed currentColor;outline-offset:2px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wd-auto-complete[data-v-e01593cf],.wd-auto-complete[data-v-e01593cf] .el-autocomplete{width:100%}
|
package/dist/base.css
ADDED
|
@@ -0,0 +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)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wd-option-text[data-v-b633634d]{display:inline-block}
|
|
@@ -0,0 +1,80 @@
|
|
|
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-C1CdKGjt.mjs";
|
|
3
|
+
import { t as B, b as L, a as _, h as R, f as C } from "./props-DAytpx7D.mjs";
|
|
4
|
+
const T = /* @__PURE__ */ k({
|
|
5
|
+
name: "WdApiButton",
|
|
6
|
+
inheritAttrs: !1,
|
|
7
|
+
__name: "ApiButton",
|
|
8
|
+
props: {
|
|
9
|
+
...C,
|
|
10
|
+
...R,
|
|
11
|
+
..._,
|
|
12
|
+
...L,
|
|
13
|
+
...B,
|
|
14
|
+
/** 按钮级 loading(默认 true);false 时按钮不转圈 */
|
|
15
|
+
buttonLoading: { type: Boolean, default: !0 },
|
|
16
|
+
/** 页面级 loading(全局遮罩 ElLoading) */
|
|
17
|
+
pageLoading: { type: Boolean, default: !1 }
|
|
18
|
+
},
|
|
19
|
+
emits: [
|
|
20
|
+
"click",
|
|
21
|
+
"apiBefore",
|
|
22
|
+
"apiSuccess",
|
|
23
|
+
"apiFail",
|
|
24
|
+
"apiException",
|
|
25
|
+
"apiAfter"
|
|
26
|
+
],
|
|
27
|
+
setup(m, { emit: h }) {
|
|
28
|
+
const t = m, a = h, { loading: n, doRequest: b } = A({
|
|
29
|
+
getApi: () => t.api,
|
|
30
|
+
getMethod: () => t.apiMethod,
|
|
31
|
+
getParam: () => t.apiParam,
|
|
32
|
+
getFilter: () => t.filter,
|
|
33
|
+
getHeadRefresh: () => t.headRefreshDatagrid,
|
|
34
|
+
emit: a,
|
|
35
|
+
buttonLoading: () => t.buttonLoading,
|
|
36
|
+
getReqOptions: () => ({ showLoading: t.pageLoading })
|
|
37
|
+
});
|
|
38
|
+
async function i(e) {
|
|
39
|
+
a("click", e), await b();
|
|
40
|
+
}
|
|
41
|
+
return (e, $) => {
|
|
42
|
+
const p = r("el-button"), P = r("el-tooltip");
|
|
43
|
+
return e.tips ? (s(), l(P, {
|
|
44
|
+
key: 0,
|
|
45
|
+
content: e.tips,
|
|
46
|
+
effect: e.tipsType,
|
|
47
|
+
placement: e.placement
|
|
48
|
+
}, {
|
|
49
|
+
default: o(() => [
|
|
50
|
+
y(p, d(e.$attrs, {
|
|
51
|
+
loading: f(n),
|
|
52
|
+
onClick: i
|
|
53
|
+
}), {
|
|
54
|
+
default: o(() => [
|
|
55
|
+
c(e.$slots, "default", {}, () => [
|
|
56
|
+
u(g(e.label), 1)
|
|
57
|
+
])
|
|
58
|
+
]),
|
|
59
|
+
_: 3
|
|
60
|
+
}, 16, ["loading"])
|
|
61
|
+
]),
|
|
62
|
+
_: 3
|
|
63
|
+
}, 8, ["content", "effect", "placement"])) : (s(), l(p, d({ key: 1 }, e.$attrs, {
|
|
64
|
+
loading: f(n),
|
|
65
|
+
onClick: i
|
|
66
|
+
}), {
|
|
67
|
+
default: o(() => [
|
|
68
|
+
c(e.$slots, "default", {}, () => [
|
|
69
|
+
u(g(e.label), 1)
|
|
70
|
+
])
|
|
71
|
+
]),
|
|
72
|
+
_: 3
|
|
73
|
+
}, 16, ["loading"]));
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
export {
|
|
78
|
+
T as _
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.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;;;;;;;"}
|