workdesktop-ai 1.2.3 → 1.2.5

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 (131) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/api-button/index.mjs +1 -1
  3. package/dist/auto-complete/index.mjs +1 -1
  4. package/dist/checkbox-list/index.mjs +1 -1
  5. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs → ApiButton.vue_vue_type_script_setup_true_lang-ZLHP9S_H.mjs} +2 -2
  6. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-ZLHP9S_H.mjs.map} +1 -1
  7. package/dist/chunks/{AutoComplete-C6Nxatvt.mjs → AutoComplete-BKWrR5pD.mjs} +2 -2
  8. package/dist/chunks/{AutoComplete-C6Nxatvt.mjs.map → AutoComplete-BKWrR5pD.mjs.map} +1 -1
  9. package/dist/chunks/{CheckboxList-5AEx33r5.mjs → CheckboxList-5o9E0Tzg.mjs} +2 -2
  10. package/dist/chunks/{CheckboxList-5AEx33r5.mjs.map → CheckboxList-5o9E0Tzg.mjs.map} +1 -1
  11. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-Cz1M6QsL.mjs} +2 -2
  12. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-Cz1M6QsL.mjs.map} +1 -1
  13. package/dist/chunks/{DataForm-C6VLTSOm.mjs → DataForm-Dvx6GxlR.mjs} +8 -7
  14. package/dist/chunks/{DataForm-C6VLTSOm.mjs.map → DataForm-Dvx6GxlR.mjs.map} +1 -1
  15. package/dist/chunks/{DataGrid-Dd7n5JM7.mjs → DataGrid-Cw3yXhmR.mjs} +3 -3
  16. package/dist/chunks/{DataGrid-Dd7n5JM7.mjs.map → DataGrid-Cw3yXhmR.mjs.map} +1 -1
  17. package/dist/chunks/{DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs → DialogButton.vue_vue_type_script_setup_true_lang-ex2zYLZC.mjs} +2 -2
  18. package/dist/chunks/{DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map → DialogButton.vue_vue_type_script_setup_true_lang-ex2zYLZC.mjs.map} +1 -1
  19. package/dist/chunks/{Drawer-ucXKUecL.mjs → Drawer-BzdohcBg.mjs} +96 -90
  20. package/dist/chunks/Drawer-BzdohcBg.mjs.map +1 -0
  21. package/dist/chunks/{DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs → DrawerButton.vue_vue_type_script_setup_true_lang-u5ifQw5k.mjs} +2 -2
  22. package/dist/chunks/{DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs.map → DrawerButton.vue_vue_type_script_setup_true_lang-u5ifQw5k.mjs.map} +1 -1
  23. package/dist/chunks/{EditableGrid-CDeeVkaX.mjs → EditableGrid-Dr48XzLH.mjs} +6 -5
  24. package/dist/chunks/{EditableGrid-CDeeVkaX.mjs.map → EditableGrid-Dr48XzLH.mjs.map} +1 -1
  25. package/dist/chunks/Guide-AWaWvQoq.mjs +347 -0
  26. package/dist/chunks/Guide-AWaWvQoq.mjs.map +1 -0
  27. package/dist/chunks/Iframe-BB1Va2kZ.mjs +128 -0
  28. package/dist/chunks/Iframe-BB1Va2kZ.mjs.map +1 -0
  29. package/dist/chunks/{ImageUpload-CQA9XQ7Q.mjs → ImageUpload-DiJ16Aga.mjs} +5 -4
  30. package/dist/chunks/{ImageUpload-CQA9XQ7Q.mjs.map → ImageUpload-DiJ16Aga.mjs.map} +1 -1
  31. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs → PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs} +2 -2
  32. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs.map} +1 -1
  33. package/dist/chunks/{RadioList-BUWcP_Pk.mjs → RadioList-CQJDixnr.mjs} +2 -2
  34. package/dist/chunks/{RadioList-BUWcP_Pk.mjs.map → RadioList-CQJDixnr.mjs.map} +1 -1
  35. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs +63 -0
  36. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs.map +1 -0
  37. package/dist/chunks/{Select-uvFy7_NU.mjs → Select-ByH7uxuS.mjs} +2 -2
  38. package/dist/chunks/{Select-uvFy7_NU.mjs.map → Select-ByH7uxuS.mjs.map} +1 -1
  39. package/dist/chunks/{Station-BTP0SbBg.mjs → Station-DDoJem4F.mjs} +150 -139
  40. package/dist/chunks/Station-DDoJem4F.mjs.map +1 -0
  41. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs → Switch.vue_vue_type_script_setup_true_lang-DrSXmsj6.mjs} +2 -2
  42. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DrSXmsj6.mjs.map} +1 -1
  43. package/dist/chunks/Tips-B_18E4mc.mjs +71 -0
  44. package/dist/chunks/Tips-B_18E4mc.mjs.map +1 -0
  45. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs → Upload.vue_vue_type_script_setup_true_lang-k-0PTz3l.mjs} +5 -4
  46. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map → Upload.vue_vue_type_script_setup_true_lang-k-0PTz3l.mjs.map} +1 -1
  47. package/dist/chunks/{Viewer-CjLSQTrw.mjs → Viewer-CmTaneb6.mjs} +2 -2
  48. package/dist/chunks/{Viewer-CjLSQTrw.mjs.map → Viewer-CmTaneb6.mjs.map} +1 -1
  49. package/dist/chunks/config-CDqjABpD.mjs +1378 -0
  50. package/dist/chunks/config-CDqjABpD.mjs.map +1 -0
  51. package/dist/chunks/http-CW9konD4.mjs +2774 -0
  52. package/dist/chunks/http-CW9konD4.mjs.map +1 -0
  53. package/dist/chunks/{useApiAction-DxVQWWxv.mjs → useApiAction-CQVmN1MH.mjs} +2 -2
  54. package/dist/chunks/{useApiAction-DxVQWWxv.mjs.map → useApiAction-CQVmN1MH.mjs.map} +1 -1
  55. package/dist/chunks/{useColumnSettings-BwG2V9xp.mjs → useColumnSettings-CIFQCmzT.mjs} +22 -21
  56. package/dist/chunks/{useColumnSettings-BwG2V9xp.mjs.map → useColumnSettings-CIFQCmzT.mjs.map} +1 -1
  57. package/dist/chunks/useConfig-ChIkE3Lz.mjs +23 -0
  58. package/dist/chunks/useConfig-ChIkE3Lz.mjs.map +1 -0
  59. package/dist/chunks/{useOptionsLoader-DEVCYhrp.mjs → useOptionsLoader-BUO0VTjH.mjs} +2 -2
  60. package/dist/chunks/{useOptionsLoader-DEVCYhrp.mjs.map → useOptionsLoader-BUO0VTjH.mjs.map} +1 -1
  61. package/dist/confirm-button/index.mjs +1 -1
  62. package/dist/data-form/index.mjs +1 -1
  63. package/dist/data-grid/index.mjs +1 -1
  64. package/dist/dialog-button/index.mjs +1 -1
  65. package/dist/drawer/index.mjs +1 -1
  66. package/dist/drawer/style.css +1 -1
  67. package/dist/drawer-button/index.mjs +1 -1
  68. package/dist/editable-grid/index.mjs +1 -1
  69. package/dist/guide/index.mjs +7 -0
  70. package/dist/guide/index.mjs.map +1 -0
  71. package/dist/guide/style.css +1 -0
  72. package/dist/iframe/index.mjs +1 -1
  73. package/dist/iframe/style.css +1 -1
  74. package/dist/image-upload/index.mjs +1 -1
  75. package/dist/index.esm.js +194 -189
  76. package/dist/index.esm.js.map +1 -1
  77. package/dist/index.umd.js +25 -21
  78. package/dist/index.umd.js.map +1 -1
  79. package/dist/prompt-button/index.mjs +1 -1
  80. package/dist/radio-list/index.mjs +1 -1
  81. package/dist/requester/index.mjs +1 -1
  82. package/dist/select/index.mjs +1 -1
  83. package/dist/station/index.mjs +1 -1
  84. package/dist/station/style.css +1 -1
  85. package/dist/style.css +1 -1
  86. package/dist/switch/index.mjs +1 -1
  87. package/dist/tips/index.mjs +1 -1
  88. package/dist/tips/style.css +1 -1
  89. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +3 -3
  90. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +5 -5
  91. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +3 -3
  92. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +4 -4
  93. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +6 -6
  94. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +5 -5
  95. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +1 -1
  96. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +1 -1
  97. package/dist/types/src/components/containers/Drawer.vue.d.ts +4 -4
  98. package/dist/types/src/components/containers/Iframe.vue.d.ts +42 -0
  99. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +5 -5
  100. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +7 -7
  101. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +1 -1
  102. package/dist/types/src/components/form/FormItem.vue.d.ts +1 -1
  103. package/dist/types/src/components/form/SearchItem.vue.d.ts +1 -1
  104. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +10 -10
  105. package/dist/types/src/components/guide/Guide.vue.d.ts +116 -0
  106. package/dist/types/src/components/index.d.ts +2 -1
  107. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +6 -6
  108. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +6 -6
  109. package/dist/types/src/components/inputs/RadioList.vue.d.ts +6 -6
  110. package/dist/types/src/components/inputs/Select.vue.d.ts +6 -6
  111. package/dist/types/src/components/inputs/Switch.vue.d.ts +9 -9
  112. package/dist/types/src/components/layout/Station.vue.d.ts +15 -4
  113. package/dist/types/src/components/layout/types.d.ts +2 -0
  114. package/dist/types/src/components/styles/Path.vue.d.ts +1 -1
  115. package/dist/types/src/components/styles/Tips.vue.d.ts +17 -0
  116. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +5 -5
  117. package/dist/types/src/components/upload/Upload.vue.d.ts +5 -5
  118. package/dist/types/src/entries/guide.d.ts +9 -0
  119. package/dist/upload/index.mjs +1 -1
  120. package/dist/viewer/index.mjs +1 -1
  121. package/package.json +1 -1
  122. package/dist/chunks/Drawer-ucXKUecL.mjs.map +0 -1
  123. package/dist/chunks/Iframe-CeSiMnvR.mjs +0 -65
  124. package/dist/chunks/Iframe-CeSiMnvR.mjs.map +0 -1
  125. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs +0 -80
  126. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map +0 -1
  127. package/dist/chunks/Station-BTP0SbBg.mjs.map +0 -1
  128. package/dist/chunks/Tips-IWCZcR1K.mjs +0 -63
  129. package/dist/chunks/Tips-IWCZcR1K.mjs.map +0 -1
  130. package/dist/chunks/http-C06mNpwY.mjs +0 -4141
  131. package/dist/chunks/http-C06mNpwY.mjs.map +0 -1
@@ -24,6 +24,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
24
24
  type: StringConstructor;
25
25
  default: string;
26
26
  };
27
+ /**
28
+ * box 模式背景:none=不带背景(默认);primary=主题色浅底(文字取主题色);
29
+ * 也可传任意 CSS 颜色值(如 '#FEFEFE'、'rgba(...)')
30
+ */
31
+ bg: {
32
+ type: StringConstructor;
33
+ default: string;
34
+ };
27
35
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
28
36
  /** 提示内容 */
29
37
  tips: {
@@ -45,10 +53,19 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
45
53
  type: StringConstructor;
46
54
  default: string;
47
55
  };
56
+ /**
57
+ * box 模式背景:none=不带背景(默认);primary=主题色浅底(文字取主题色);
58
+ * 也可传任意 CSS 颜色值(如 '#FEFEFE'、'rgba(...)')
59
+ */
60
+ bg: {
61
+ type: StringConstructor;
62
+ default: string;
63
+ };
48
64
  }>> & Readonly<{}>, {
49
65
  type: "word" | "box";
50
66
  icon: string;
51
67
  tips: string;
68
+ bg: string;
52
69
  color: string;
53
70
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
54
71
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
@@ -71,13 +71,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
71
71
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
72
72
  success: (...args: any[]) => void;
73
73
  error: (...args: any[]) => void;
74
+ "update:modelValue": (...args: any[]) => void;
75
+ change: (...args: any[]) => void;
74
76
  apiBefore: (...args: any[]) => void;
75
77
  apiSuccess: (...args: any[]) => void;
76
78
  apiFail: (...args: any[]) => void;
77
79
  apiException: (...args: any[]) => void;
78
80
  apiAfter: (...args: any[]) => void;
79
- "update:modelValue": (...args: any[]) => void;
80
- change: (...args: any[]) => void;
81
81
  "delete-success": (...args: any[]) => void;
82
82
  preview: (...args: any[]) => void;
83
83
  exceed: (...args: any[]) => void;
@@ -148,20 +148,20 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
148
148
  }>> & Readonly<{
149
149
  onSuccess?: ((...args: any[]) => any) | undefined;
150
150
  onError?: ((...args: any[]) => any) | undefined;
151
+ "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
152
+ onChange?: ((...args: any[]) => any) | undefined;
151
153
  onApiBefore?: ((...args: any[]) => any) | undefined;
152
154
  onApiSuccess?: ((...args: any[]) => any) | undefined;
153
155
  onApiFail?: ((...args: any[]) => any) | undefined;
154
156
  onApiException?: ((...args: any[]) => any) | undefined;
155
157
  onApiAfter?: ((...args: any[]) => any) | undefined;
156
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
157
- onChange?: ((...args: any[]) => any) | undefined;
158
158
  "onDelete-success"?: ((...args: any[]) => any) | undefined;
159
159
  onPreview?: ((...args: any[]) => any) | undefined;
160
160
  onExceed?: ((...args: any[]) => any) | undefined;
161
161
  }>, {
162
162
  filter: string;
163
- api: string;
164
163
  modelValue: string[];
164
+ api: string;
165
165
  headRefreshDatagrid: string | boolean;
166
166
  tip: string;
167
167
  deleteApi: string;
@@ -100,13 +100,13 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
100
100
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
101
101
  success: (...args: any[]) => void;
102
102
  error: (...args: any[]) => void;
103
+ "update:modelValue": (...args: any[]) => void;
104
+ change: (...args: any[]) => void;
103
105
  apiBefore: (...args: any[]) => void;
104
106
  apiSuccess: (...args: any[]) => void;
105
107
  apiFail: (...args: any[]) => void;
106
108
  apiException: (...args: any[]) => void;
107
109
  apiAfter: (...args: any[]) => void;
108
- "update:modelValue": (...args: any[]) => void;
109
- change: (...args: any[]) => void;
110
110
  "delete-success": (...args: any[]) => void;
111
111
  preview: (...args: any[]) => void;
112
112
  exceed: (...args: any[]) => void;
@@ -196,13 +196,13 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
196
196
  }>> & Readonly<{
197
197
  onSuccess?: ((...args: any[]) => any) | undefined;
198
198
  onError?: ((...args: any[]) => any) | undefined;
199
+ "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
200
+ onChange?: ((...args: any[]) => any) | undefined;
199
201
  onApiBefore?: ((...args: any[]) => any) | undefined;
200
202
  onApiSuccess?: ((...args: any[]) => any) | undefined;
201
203
  onApiFail?: ((...args: any[]) => any) | undefined;
202
204
  onApiException?: ((...args: any[]) => any) | undefined;
203
205
  onApiAfter?: ((...args: any[]) => any) | undefined;
204
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
205
- onChange?: ((...args: any[]) => any) | undefined;
206
206
  "onDelete-success"?: ((...args: any[]) => any) | undefined;
207
207
  onPreview?: ((...args: any[]) => any) | undefined;
208
208
  onExceed?: ((...args: any[]) => any) | undefined;
@@ -211,8 +211,8 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
211
211
  disabled: boolean;
212
212
  name: string;
213
213
  filter: string;
214
- api: string;
215
214
  modelValue: UploadUserFile[];
215
+ api: string;
216
216
  headRefreshDatagrid: string | boolean;
217
217
  multiple: boolean;
218
218
  deleteApi: string;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * WdGuide 单独入口
3
+ * 用法:import WdGuide from 'workdesktop-ai/guide'
4
+ * import 'workdesktop-ai/guide/style.css'
5
+ */
6
+ import '../styles/index.css';
7
+ import WdGuide from '../components/guide/Guide.vue';
8
+ export { WdGuide };
9
+ export default WdGuide;
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { _ as m } from "../chunks/Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs";
2
+ import { _ as m } from "../chunks/Upload.vue_vue_type_script_setup_true_lang-k-0PTz3l.mjs";
3
3
  export {
4
4
  m as WdUpload,
5
5
  m as default
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as o } from "../chunks/Viewer-CjLSQTrw.mjs";
2
+ import { W as o } from "../chunks/Viewer-CmTaneb6.mjs";
3
3
  export {
4
4
  o as WdViewer,
5
5
  o as default
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workdesktop-ai",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "WorkDesktop 一个企业级 Vue3 组件库。让AI在做前端设计的时候拥有更加可控,更加稳定的输出结果。(基于 ElementPlus,HTML 模板渲染友好、AI 编码友好)",
5
5
  "type": "module",
6
6
  "main": "dist/index.umd.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"Drawer-ucXKUecL.mjs","sources":["../../src/components/containers/useContainerController.ts","../../src/components/containers/Drawer.vue"],"sourcesContent":["/**\r\n * 容器组件(Dialog/Drawer)共享逻辑:\r\n * 显隐、iframe/内容渲染、关闭前拦截(confirmMessage + 内容注册的 beforeClose 守卫)、关闭后联动刷新\r\n */\r\nimport { ref, watch, provide, onMounted, onBeforeUnmount, computed } from 'vue'\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { provideContainer, type ContainerContext } from './containerContext'\r\n\r\ntype BridgeMessage = {\r\n type: string\r\n payload?: any\r\n}\r\n\r\nexport function useContainerController(options: {\r\n props: {\r\n modelValue?: boolean\r\n url?: string\r\n title?: string\r\n confirmMessage?: string\r\n headRefreshDatagrid?: boolean | string\r\n filter?: string\r\n data?: Record<string, any>\r\n origin?: string\r\n [key: string]: any\r\n }\r\n emit: (event: any, ...args: any[]) => void\r\n}) {\r\n const { props, emit } = options\r\n const visible = ref(!!props.modelValue)\r\n\r\n // 受控模式:外部 v-model 变化时同步显隐。\r\n // 容器可能「挂载后再置 true」(如 DrawerButton 懒挂载两段式打开),必须监听后续变化,\r\n // 否则 modelValue 只在挂载时生效一次,弹层永远无法打开。\r\n watch(\r\n () => props.modelValue,\r\n (val) => {\r\n if (val !== visible.value) visible.value = !!val\r\n }\r\n )\r\n\r\n // 反向同步:弹层被 X/遮罩/ESC 关闭后(el-dialog/drawer 内部把 visible 置 false,不经过 syncVisible),\r\n // 需把实际状态回写外部,否则父级 v-model 仍为 true,下次打开会失效。\r\n watch(visible, (val) => {\r\n if (props.modelValue !== val) emit('update:modelValue', val)\r\n })\r\n\r\n /** 关闭前守卫集合(内部 DataForm 的 confirmLeave 等,含 iframe 上报) */\r\n const beforeCloseGuards = new Set<() => Promise<boolean>>()\r\n\r\n function syncVisible(val: boolean) {\r\n visible.value = val\r\n emit('update:modelValue', val)\r\n }\r\n\r\n function open() {\r\n syncVisible(true)\r\n emit('open')\r\n sendInitToIframe()\r\n emit('open')\r\n }\r\n\r\n /**\r\n * 供内部内容主动请求关闭(DataForm headCloseDrawer)\r\n * @param reason 'submit'=提交成功,直接关闭;其余先走过渡守卫(未保存确认)\r\n */\r\n async function requestClose(reason = 'request') {\r\n if (reason !== 'submit') {\r\n const allowed = await runGuards()\r\n if (!allowed) return\r\n }\r\n syncVisible(false)\r\n afterClosed(reason)\r\n }\r\n\r\n function addBeforeClose(guard: () => Promise<boolean>) {\r\n beforeCloseGuards.add(guard)\r\n return () => beforeCloseGuards.delete(guard)\r\n }\r\n\r\n /** 执行全部内容守卫,任一返回 false 则中止 */\r\n async function runGuards(): Promise<boolean> {\r\n for (const guard of beforeCloseGuards) {\r\n const ok = await guard()\r\n if (!ok) return false\r\n }\r\n return true\r\n }\r\n\r\n /** el-dialog/el-drawer 关闭拦截入口(X 按钮 / 遮罩 / ESC) */\r\n async function handleBeforeClose(done: () => void) {\r\n // 1. 内容守卫(DataForm 未保存确认,含 iframe)\r\n const allowed = await runGuards()\r\n if (!allowed) return\r\n // 2. 容器自身确认\r\n if (props.confirmMessage) {\r\n try {\r\n await ElMessageBox.confirm(props.confirmMessage, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return\r\n }\r\n }\r\n done()\r\n afterClosed('manual')\r\n }\r\n\r\n function onClosed() {\r\n emit('close')\r\n }\r\n\r\n function afterClosed(reason: string) {\r\n emit('confirm', { reason })\r\n // 关闭后声明式联动刷新 DataGrid\r\n if (props.headRefreshDatagrid) {\r\n refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n }\r\n }\r\n\r\n // ================= iframe 跨上下文桥接 =================\r\n let iframeRef: HTMLIFrameElement | null = null\r\n const targetOrigin = computed(() => {\r\n if (props.origin) return props.origin\r\n if (!props.url) return window.location.origin\r\n try {\r\n return new URL(props.url).origin\r\n } catch {\r\n return window.location.origin\r\n }\r\n })\r\n\r\n /** 消息来源校验:targetOrigin='*' 时放行(与 postMessage 通配语义一致) */\r\n function isAllowedOrigin(eventOrigin: string) {\r\n return targetOrigin.value === '*' || eventOrigin === targetOrigin.value\r\n }\r\n\r\n function setIframeRef(el: HTMLIFrameElement | null) {\r\n iframeRef = el\r\n }\r\n\r\n function sendToIframe(type: string, payload?: any) {\r\n if (!iframeRef?.contentWindow) return\r\n const msg: BridgeMessage = { type, payload }\r\n iframeRef.contentWindow.postMessage(msg, targetOrigin.value)\r\n }\r\n\r\n /** 发送初始化数据给 iframe(代替 query 参数,支持复杂对象) */\r\n function sendInitToIframe() {\r\n if (!props.url) return\r\n sendToIframe('wd-container:init', { data: props.data })\r\n }\r\n\r\n /**\r\n * 处理 iframe 发来的消息:\r\n * 1. 以 emit 透传给外部(iframe-message 原始透传 + iframe-xxx 语义化事件)\r\n * 2. 保留默认联动行为(提交成功自动关闭、脏状态自动注册守卫、就绪自动下发数据)\r\n */\r\n function onBridgeMessage(event: MessageEvent) {\r\n // 安全校验:来源必须匹配目标 origin(* 通配放行)\r\n if (!isAllowedOrigin(event.origin)) return\r\n const data = event.data\r\n if (!data || typeof data !== 'object' || !data.type) return\r\n\r\n // 透传原始消息,外部可用 @iframe-message 统一监听\r\n emit('iframe-message', data)\r\n\r\n switch (data.type) {\r\n // 提交成功:关闭容器并刷新\r\n case 'wd-container:submit-success':\r\n emit('iframe-submit-success', data.payload)\r\n requestClose('submit')\r\n break\r\n // 子页面主动请求关闭(DataForm「关闭」按钮 / 业务主动触发)\r\n case 'wd-container:close':\r\n requestClose('manual')\r\n break\r\n // 注册/注销未保存守卫\r\n case 'wd-container:dirty':\r\n emit('iframe-dirty', data.payload)\r\n if (data.payload?.dirty) {\r\n addBeforeClose(async () => {\r\n return new Promise((resolve) => {\r\n const requestId = Math.random().toString(36).slice(2)\r\n const handler = (e: MessageEvent) => {\r\n if (!isAllowedOrigin(e.origin)) return\r\n if (e.data?.type === 'wd-container:dirty-confirm-response' && e.data?.requestId === requestId) {\r\n window.removeEventListener('message', handler)\r\n resolve(!!e.data.payload.allowClose)\r\n }\r\n }\r\n window.addEventListener('message', handler)\r\n sendToIframe('wd-container:dirty-confirm', { requestId })\r\n })\r\n })\r\n }\r\n break\r\n case 'wd-container:ready':\r\n emit('iframe-ready', data.payload)\r\n sendInitToIframe()\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n onMounted(() => {\r\n window.addEventListener('message', onBridgeMessage)\r\n })\r\n\r\n onBeforeUnmount(() => {\r\n window.removeEventListener('message', onBridgeMessage)\r\n })\r\n\r\n // 向内部内容(非 iframe 的 Vue 插槽内容)提供容器上下文\r\n provideContainer({\r\n data: props.data,\r\n requestClose,\r\n addBeforeClose\r\n } as ContainerContext)\r\n\r\n return {\r\n visible,\r\n open,\r\n requestClose,\r\n addBeforeClose,\r\n handleBeforeClose,\r\n onClosed,\r\n // iframe 桥接暴露\r\n setIframeRef,\r\n sendToIframe,\r\n targetOrigin\r\n }\r\n}\r\n","<template>\r\n <el-drawer\r\n v-if=\"mode === 'drawer'\"\r\n v-model=\"visible\"\r\n append-to-body\r\n :title=\"title\"\r\n :size=\"resolvedSize\"\r\n :direction=\"direction\"\r\n :before-close=\"handleBeforeClose\"\r\n v-bind=\"$attrs\"\r\n @closed=\"onClosed\"\r\n >\r\n <iframe\r\n v-if=\"url\"\r\n ref=\"iframeRef\"\r\n :key=\"iframeKey\"\r\n :src=\"resolvedUrl\"\r\n class=\"wd-container__iframe wd-container__iframe--drawer\"\r\n frameborder=\"0\"\r\n />\r\n <slot v-else />\r\n <template v-if=\"$slots.footer\" #footer>\r\n <slot name=\"footer\" :close=\"requestClose\" />\r\n </template>\r\n </el-drawer>\r\n\r\n <el-dialog\r\n v-else\r\n v-model=\"visible\"\r\n append-to-body\r\n :title=\"title\"\r\n :width=\"resolvedSize\"\r\n :before-close=\"handleBeforeClose\"\r\n v-bind=\"$attrs\"\r\n @closed=\"onClosed\"\r\n >\r\n <iframe\r\n v-if=\"url\"\r\n ref=\"iframeRef\"\r\n :key=\"iframeKey\"\r\n :src=\"resolvedUrl\"\r\n class=\"wd-container__iframe wd-container__iframe--dialog\"\r\n frameborder=\"0\"\r\n />\r\n <slot v-else />\r\n <template v-if=\"$slots.footer\" #footer>\r\n <slot name=\"footer\" :close=\"requestClose\" />\r\n </template>\r\n </el-dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch, onMounted, type PropType } from 'vue'\r\nimport { useContainerController } from './useContainerController'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdDrawer', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n modelValue: { type: Boolean, default: undefined },\r\n title: { type: String, default: '' },\r\n /** iframe 地址(设置后容器内以 iframe 加载) */\r\n url: { type: String, default: '' },\r\n /** 安全校验:允许的消息来源 origin */\r\n origin: { type: String, default: '' },\r\n /** 弹出形式:drawer 抽屉(默认)/ dialog 对话框 */\r\n mode: { type: String as PropType<'drawer' | 'dialog'>, default: 'drawer' },\r\n /** 尺寸(抽屉宽度/高度,对话框宽度;数字按 px) */\r\n size: { type: [String, Number], default: '50%' },\r\n /** 抽屉弹出方向 rtl/ltr/ttb/btt(仅 mode=drawer 生效) */\r\n direction: { type: String as PropType<'rtl' | 'ltr' | 'ttb' | 'btt'>, default: 'rtl' },\r\n /** 关闭前确认文案(设置后关闭弹确认) */\r\n confirmMessage: { type: String, default: '' },\r\n /** 容器携带数据(传给内部表单) */\r\n data: { type: Object as PropType<Record<string, any>>, default: undefined },\r\n /** 每次打开时重新加载 iframe 内容(url 模式生效;默认 false 保留上次内容) */\r\n reloadOnOpen: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'open',\r\n 'close',\r\n 'confirm',\r\n // iframe 联动事件(子页面 postMessage 透传)\r\n 'iframe-message',\r\n 'iframe-ready',\r\n 'iframe-dirty',\r\n 'iframe-submit-success'\r\n])\r\n\r\nconst {\r\n visible,\r\n requestClose,\r\n handleBeforeClose,\r\n onClosed,\r\n setIframeRef,\r\n sendToIframe,\r\n targetOrigin\r\n} = useContainerController({ props, emit })\r\n\r\nconst iframeRef = ref<HTMLIFrameElement | null>(null)\r\n\r\n/** iframe 重建 key:reloadOnOpen 时每次打开自增,强制重新加载 iframe */\r\nconst iframeKey = ref(0)\r\nwatch(\r\n () => visible.value,\r\n (val) => {\r\n if (val && props.reloadOnOpen && props.url) {\r\n iframeKey.value += 1\r\n }\r\n }\r\n)\r\n\r\n// 同步 ref 到 controller\r\nwatch(iframeRef, (newRef) => {\r\n setIframeRef(newRef)\r\n})\r\n\r\nconst resolvedSize = computed(() => (typeof props.size === 'number' ? `${props.size}px` : props.size))\r\n\r\n/** iframe 地址:data 作为 query 追加(保持兼容现有实现) */\r\nconst resolvedUrl = computed(() => {\r\n if (!props.url) return ''\r\n if (!props.data) return props.url\r\n const qs = new URLSearchParams(\r\n Object.entries(props.data).reduce((acc, [k, v]) => {\r\n if (v !== undefined && v !== null) acc[k] = String(v)\r\n return acc\r\n }, {} as Record<string, string>)\r\n ).toString()\r\n if (!qs) return props.url\r\n return props.url + (props.url.includes('?') ? '&' : '?') + qs\r\n})\r\n\r\ndefineExpose({\r\n open: () => (visible.value = true),\r\n /** 向 iframe 内发送指令(如 wd-container:submit 触发表单提交) */\r\n sendToIframe\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.wd-container__iframe {\r\n width: 100%;\r\n border: 0;\r\n display: block;\r\n}\r\n.wd-container__iframe--drawer {\r\n height: 100%;\r\n min-height: 400px;\r\n}\r\n.wd-container__iframe--dialog {\r\n height: 60vh;\r\n}\r\n</style>\r\n"],"names":["useContainerController","options","props","emit","visible","ref","watch","val","beforeCloseGuards","syncVisible","open","sendInitToIframe","requestClose","reason","runGuards","afterClosed","addBeforeClose","guard","handleBeforeClose","done","ElMessageBox","onClosed","refreshDataGrid","iframeRef","targetOrigin","computed","isAllowedOrigin","eventOrigin","setIframeRef","el","sendToIframe","type","payload","msg","onBridgeMessage","event","data","_a","resolve","requestId","handler","e","_b","onMounted","onBeforeUnmount","provideContainer","__props","__emit","iframeKey","newRef","resolvedSize","resolvedUrl","qs","acc","k","v","__expose","_openBlock","_createBlock","_component_el_drawer","_mergeProps","_unref","$event","$attrs","_createSlots","_createElementBlock","_renderSlot","_ctx","$slots","_component_el_dialog"],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- import { defineComponent as w, ref as a, watch as x, computed as m, onMounted as b, onBeforeUnmount as S, openBlock as k, createElementBlock as B, normalizeStyle as H } from "vue";
2
- import { _ as I } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
3
- const K = ["src"], W = /* @__PURE__ */ w({
4
- name: "WdIframe",
5
- __name: "Iframe",
6
- props: {
7
- /** iframe 地址 */
8
- src: { type: String, default: "" },
9
- /** 固定高度(数字按 px) */
10
- height: { type: [String, Number], default: "480px" },
11
- /** 高度自适应(通过子页面 postMessage 上报高度) */
12
- autoHeight: { type: Boolean, default: !1 },
13
- /** 发送消息时使用的 targetOrigin(默认同源;跨域时需显式指定子页面 origin) */
14
- origin: { type: String, default: "" },
15
- /**
16
- * 刷新信号:值变化时强制重新加载 iframe 内容。
17
- * 常用于「每次显示时刷新」:父级在显示时机自增该值即可(例如 v-if 重建时不需此 prop,仅当 iframe 常驻 DOM 时才需要)。
18
- */
19
- refreshKey: { type: [Number, String], default: 0 }
20
- },
21
- emits: ["load", "message"],
22
- setup(i, { expose: d, emit: g }) {
23
- const e = i, s = g, f = a(null), o = a(null), r = a(0);
24
- x(
25
- () => e.refreshKey,
26
- () => {
27
- r.value += 1;
28
- }
29
- );
30
- const h = m(() => `${e.refreshKey}:${r.value}`), p = m(() => e.autoHeight && o.value ? { height: `${o.value}px` } : { height: typeof e.height == "number" ? `${e.height}px` : e.height });
31
- function y() {
32
- s("load");
33
- }
34
- function v(n) {
35
- var c, l;
36
- const t = e.origin || window.location.origin;
37
- (l = (c = f.value) == null ? void 0 : c.contentWindow) == null || l.postMessage(n, t);
38
- }
39
- function _() {
40
- r.value += 1;
41
- }
42
- function u(n) {
43
- const t = n.data;
44
- e.autoHeight && t && typeof t == "object" && t.type === "wd-iframe-height" && (o.value = Number(t.height) || null), s("message", t);
45
- }
46
- return b(() => {
47
- window.addEventListener("message", u);
48
- }), S(() => {
49
- window.removeEventListener("message", u);
50
- }), d({ send: v, refresh: _ }), (n, t) => (k(), B("iframe", {
51
- ref_key: "iframeRef",
52
- ref: f,
53
- key: h.value,
54
- src: i.src,
55
- class: "wd-iframe",
56
- style: H(p.value),
57
- frameborder: "0",
58
- onLoad: y
59
- }, null, 44, K));
60
- }
61
- }), L = /* @__PURE__ */ I(W, [["__scopeId", "data-v-c0369841"]]);
62
- export {
63
- L as W
64
- };
65
- //# sourceMappingURL=Iframe-CeSiMnvR.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Iframe-CeSiMnvR.mjs","sources":["../../src/components/containers/Iframe.vue"],"sourcesContent":["<template>\r\n <iframe\r\n ref=\"iframeRef\"\r\n :key=\"renderKey\"\r\n :src=\"src\"\r\n class=\"wd-iframe\"\r\n :style=\"iframeStyle\"\r\n frameborder=\"0\"\r\n @load=\"onLoad\"\r\n />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, onMounted, onBeforeUnmount, type PropType } from 'vue'\r\n\r\ndefineOptions({ name: 'WdIframe' })\r\n\r\nconst props = defineProps({\r\n /** iframe 地址 */\r\n src: { type: String, default: '' },\r\n /** 固定高度(数字按 px) */\r\n height: { type: [String, Number], default: '480px' },\r\n /** 高度自适应(通过子页面 postMessage 上报高度) */\r\n autoHeight: { type: Boolean, default: false },\r\n /** 发送消息时使用的 targetOrigin(默认同源;跨域时需显式指定子页面 origin) */\r\n origin: { type: String, default: '' },\r\n /**\r\n * 刷新信号:值变化时强制重新加载 iframe 内容。\r\n * 常用于「每次显示时刷新」:父级在显示时机自增该值即可(例如 v-if 重建时不需此 prop,仅当 iframe 常驻 DOM 时才需要)。\r\n */\r\n refreshKey: { type: [Number, String], default: 0 }\r\n})\r\n\r\nconst emit = defineEmits(['load', 'message'])\r\n\r\nconst iframeRef = ref<HTMLIFrameElement | null>(null)\r\nconst autoHeightValue = ref<number | null>(null)\r\n\r\n/** 内部刷新计数:refreshKey 变化 或 调用 refresh() 时自增,驱动 iframe 重建(强制重新加载) */\r\nconst renderTick = ref(0)\r\nwatch(\r\n () => props.refreshKey,\r\n () => {\r\n renderTick.value += 1\r\n }\r\n)\r\nconst renderKey = computed(() => `${props.refreshKey}:${renderTick.value}`)\r\n\r\nconst iframeStyle = computed(() => {\r\n if (props.autoHeight && autoHeightValue.value) {\r\n return { height: `${autoHeightValue.value}px` }\r\n }\r\n return { height: typeof props.height === 'number' ? `${props.height}px` : props.height }\r\n})\r\n\r\nfunction onLoad() {\r\n emit('load')\r\n}\r\n\r\n/**\r\n * 父 → 子:向 iframe 内页面发送消息(子页通过 window.addEventListener('message') 接收)\r\n */\r\nfunction send(message: any) {\r\n const targetOrigin = props.origin || window.location.origin\r\n iframeRef.value?.contentWindow?.postMessage(message, targetOrigin)\r\n}\r\n\r\n/** 强制重新加载 iframe 内容(重建 iframe 元素) */\r\nfunction refresh() {\r\n renderTick.value += 1\r\n}\r\n\r\n/** 子页面 postMessage 透传:约定 { type:'wd-iframe-height', height } 或任意消息 */\r\nfunction onMessage(event: MessageEvent) {\r\n const data = event.data\r\n if (props.autoHeight && data && typeof data === 'object' && data.type === 'wd-iframe-height') {\r\n autoHeightValue.value = Number(data.height) || null\r\n }\r\n emit('message', data)\r\n}\r\n\r\nonMounted(() => {\r\n window.addEventListener('message', onMessage)\r\n})\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('message', onMessage)\r\n})\r\n\r\ndefineExpose({ send, refresh })\r\n</script>\r\n\r\n<style scoped>\r\n.wd-iframe {\r\n width: 100%;\r\n border: 0;\r\n display: block;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","iframeRef","ref","autoHeightValue","renderTick","watch","renderKey","computed","iframeStyle","onLoad","send","message","targetOrigin","_b","_a","refresh","onMessage","event","data","onMounted","onBeforeUnmount","__expose","_createElementBlock"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiBA,UAAMA,IAAQC,GAgBRC,IAAOC,GAEPC,IAAYC,EAA8B,IAAI,GAC9CC,IAAkBD,EAAmB,IAAI,GAGzCE,IAAaF,EAAI,CAAC;AACxB,IAAAG;AAAA,MACE,MAAMR,EAAM;AAAA,MACZ,MAAM;AACJ,QAAAO,EAAW,SAAS;AAAA,MACtB;AAAA,IAAA;AAEF,UAAME,IAAYC,EAAS,MAAM,GAAGV,EAAM,UAAU,IAAIO,EAAW,KAAK,EAAE,GAEpEI,IAAcD,EAAS,MACvBV,EAAM,cAAcM,EAAgB,QAC/B,EAAE,QAAQ,GAAGA,EAAgB,KAAK,KAAA,IAEpC,EAAE,QAAQ,OAAON,EAAM,UAAW,WAAW,GAAGA,EAAM,MAAM,OAAOA,EAAM,OAAA,CACjF;AAED,aAASY,IAAS;AAChB,MAAAV,EAAK,MAAM;AAAA,IACb;AAKA,aAASW,EAAKC,GAAc;;AAC1B,YAAMC,IAAef,EAAM,UAAU,OAAO,SAAS;AACrD,OAAAgB,KAAAC,IAAAb,EAAU,UAAV,gBAAAa,EAAiB,kBAAjB,QAAAD,EAAgC,YAAYF,GAASC;AAAA,IACvD;AAGA,aAASG,IAAU;AACjB,MAAAX,EAAW,SAAS;AAAA,IACtB;AAGA,aAASY,EAAUC,GAAqB;AACtC,YAAMC,IAAOD,EAAM;AACnB,MAAIpB,EAAM,cAAcqB,KAAQ,OAAOA,KAAS,YAAYA,EAAK,SAAS,uBACxEf,EAAgB,QAAQ,OAAOe,EAAK,MAAM,KAAK,OAEjDnB,EAAK,WAAWmB,CAAI;AAAA,IACtB;AAEA,WAAAC,EAAU,MAAM;AACd,aAAO,iBAAiB,WAAWH,CAAS;AAAA,IAC9C,CAAC,GACDI,EAAgB,MAAM;AACpB,aAAO,oBAAoB,WAAWJ,CAAS;AAAA,IACjD,CAAC,GAEDK,EAAa,EAAE,MAAAX,GAAM,SAAAK,GAAS,mBAvF5BO,EAQE,UAAA;AAAA,eAPI;AAAA,MAAJ,KAAIrB;AAAA,MACH,KAAKK,EAAA;AAAA,MACL,KAAKR,EAAA;AAAA,MACN,OAAM;AAAA,MACL,SAAOU,EAAA,KAAW;AAAA,MACnB,aAAY;AAAA,MACX,QAAAC;AAAA,IAAA;;;"}
@@ -1,80 +0,0 @@
1
- import { shallowRef as g, onMounted as b, defineComponent as q, watch as C, onUnmounted as h, renderSlot as v } from "vue";
2
- import { a as w, g as R, d as _, r as c } from "./http-C06mNpwY.mjs";
3
- function O(n, s) {
4
- const e = g(p(n, s));
5
- return b(() => {
6
- e.value = p(n, s);
7
- }), e;
8
- }
9
- function x() {
10
- return w();
11
- }
12
- function p(n, s) {
13
- const e = n ? R(n) : {}, r = {};
14
- if (s)
15
- for (const [a, t] of Object.entries(s))
16
- t !== void 0 && (r[a] = t);
17
- return _({}, e, r);
18
- }
19
- const A = /* @__PURE__ */ q({
20
- name: "WdRequester",
21
- __name: "Requester",
22
- props: {
23
- modelValue: { type: Boolean },
24
- url: {},
25
- method: {},
26
- params: {},
27
- reqOptions: {}
28
- },
29
- emits: ["update:modelValue", "api-before", "api-success", "api-fail", "api-exception", "api-after"],
30
- setup(n, { emit: s }) {
31
- const e = n, r = O("WdRequester", e), a = s;
32
- let t = null;
33
- function d() {
34
- t == null || t.abort();
35
- }
36
- function u() {
37
- t && (t.abort(), t = null);
38
- }
39
- async function m() {
40
- u();
41
- const o = new AbortController();
42
- t = o;
43
- const f = {
44
- ...r.value.reqOptions || {},
45
- ...e.reqOptions || {},
46
- signal: o.signal
47
- };
48
- try {
49
- if (a("api-before", d), o.signal.aborted)
50
- return;
51
- let i;
52
- const l = (e.method ?? r.value.method ?? "post").toLowerCase();
53
- if (l === "get" || l === "delete" ? i = await c[l](e.url, e.params, f) : i = await c[l](e.url, e.params, f), o.signal.aborted)
54
- return;
55
- i.success ? a("api-success", i) : a("api-fail", i);
56
- } catch (i) {
57
- if (o.signal.aborted)
58
- return;
59
- a("api-exception", i);
60
- } finally {
61
- t === o && (t = null, a("api-after"), a("update:modelValue", !1));
62
- }
63
- }
64
- return C(
65
- () => e.modelValue,
66
- (o) => {
67
- o === !0 ? m() : u();
68
- },
69
- { immediate: !0 }
70
- ), h(() => {
71
- u();
72
- }), (o, f) => v(o.$slots, "default");
73
- }
74
- });
75
- export {
76
- A as _,
77
- x as a,
78
- O as u
79
- };
80
- //# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs","sources":["../../src/lib/composables/useConfig.ts","../../src/components/core/Requester.vue"],"sourcesContent":["import { onMounted, shallowRef } from 'vue'\nimport { getGlobalConfig, getComponentDefault } from '../core/config'\nimport { deepMerge } from '../core/utils'\nimport type { WorkDesktopConfig } from '../../types/config'\n\n/**\n * useConfig(PRD 5.3 / 5.2)\n *\n * 组件内合并三级配置:全局 componentDefault[组件名] → 本地 props。\n * 全局配置在组件 onMounted 时读取一次并缓存(运行中改配置只影响新挂载组件)。\n *\n * 返回一个响应式 ref,merge 后的组件配置对象:\n * componentDefault 的值作为默认,props 中非 undefined 的值覆盖。\n *\n * @example\n * const cfg = useConfig('WdDataGrid', props)\n * cfg.value.withPager\n */\nexport function useConfig<T extends Record<string, any> = Record<string, any>>(\n componentName?: string,\n props?: T\n) {\n const configRef = shallowRef<T>(buildComponentConfig<T>(componentName, props))\n\n onMounted(() => {\n // onMounted 时 install 已完成、window.workDesktopConfig 已就绪,再读一次\n configRef.value = buildComponentConfig<T>(componentName, props)\n })\n\n return configRef\n}\n\n/**\n * 非响应式:直接取当前全局 WorkDesktopConfig\n */\nexport function useGlobalConfig(): WorkDesktopConfig {\n return getGlobalConfig()\n}\n\nfunction buildComponentConfig<T extends Record<string, any>>(\n componentName?: string,\n props?: T\n): T {\n const componentDefaults = componentName ? getComponentDefault(componentName) : {}\n const localProps: Record<string, any> = {}\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n if (v !== undefined) localProps[k] = v\n }\n }\n // 优先级:componentDefault < 本地 props\n return deepMerge<T>({} as T, componentDefaults, localProps)\n}\n","<template>\n <!-- 无默认插槽 -->\n <slot></slot>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * WdRequester 请求触发组件\n *\n * 使用 v-model 控制请求触发:开关变为 true 时发起请求;请求完成后自动设置为 false,\n * 等待开发者下一次将它变为 true 再触发。所有组件都基于本库公开请求核心 RequestAPI。\n *\n * 特性:\n * 1. 封装 get/post/put/delete/request 全部请求方法;\n * 2. 全周期 emit 事件:apiBefore 触发后允许开发者手动 abort 请求;\n * 3. 支持中途发起新请求:旧请求会自动被中断;\n * 4. 请求完成(成功/失败/异常)后自动将 v-model 置为 false;\n *\n * @example\n * <template>\n * <wd-requester\n * v-model=\"trigger\"\n * url=\"/api/save\"\n * method=\"post\"\n * @api-before=\"onApiBefore\"\n * @api-success=\"onSuccess\"\n * />\n * <el-button @click=\"trigger = true\">提交</el-button>\n * </template>\n */\nimport { onUnmounted, watch } from 'vue'\nimport { request, type ApiResult } from '../../lib/core/http'\nimport type { Method } from 'axios'\nimport type { ReqOptions } from '../../types/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdRequester' })\n\ninterface Props {\n /** v-model 触发开关:true 则发起请求,完成后自动变 false */\n modelValue: boolean\n /** 请求 URL */\n url: string\n /** 请求方法,默认 post(可通过全局配置 page.componentDefault.WdRequester.method 覆盖) */\n method?: Method\n /** 请求参数(get/delete 放 query,post/put 放 body) */\n params?: any\n /** 请求选项(透传给 http):showLoading/showTips/tipsConfig/axiosConfig/signal(可通过全局配置 page.componentDefault.WdRequester.reqOptions 覆盖) */\n reqOptions?: ReqOptions\n}\n\nconst props = defineProps<Props>()\n\n// 合并三级配置:默认层(default-config 的 WdRequester)→ 全局层(componentDefault)→ 本地 props\n// 注意:url/params 属业务参数,实时读 props;method/reqOptions 属配置类,走合并结果\nconst config = useConfig<Record<string, any>>('WdRequester', props)\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'api-before', abort: () => void): void\n (e: 'api-success', result: ApiResult): void\n (e: 'api-fail', result: ApiResult): void\n (e: 'api-exception', error: any): void\n (e: 'api-after'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nlet currentController: AbortController | null = null\n\n/**\n * 仅中断当前进行中的请求(不清引用)。\n * 传给 apiBefore 的 abort:中断后本请求仍走 finally 收尾(api-after + 复位开关)。\n */\nfunction abortActive() {\n currentController?.abort()\n}\n\n/**\n * 中断并清引用:用于外部关闭开关 / 组件卸载,不触发收尾事件。\n */\nfunction abortAndClear() {\n if (currentController) {\n currentController.abort()\n currentController = null\n }\n}\n\nasync function doRequest() {\n // 中断并清掉上一次请求(旧请求的收尾会被跳过,不触发 api-after)\n abortAndClear()\n\n const controller = new AbortController()\n currentController = controller\n\n // 组装请求选项:全局默认(reqOptions)→ 实例 props 覆盖 → 注入 abort signal\n const reqOpts: ReqOptions = {\n ...(config.value.reqOptions || {}),\n ...(props.reqOptions || {}),\n signal: controller.signal,\n }\n\n try {\n // 触发 apiBefore,允许开发者在事件中手动调用 abort() 中断本次请求\n emit('api-before', abortActive)\n\n // 如果在 apiBefore 中被手动中断:直接走收尾(api-after + 复位开关)\n if (controller.signal.aborted) {\n return\n }\n\n let result: ApiResult\n // 请求方法优先级:实例 props.method → 全局默认 config.method → 内置兜底 'post'\n const method = (props.method ?? config.value.method ?? 'post').toLowerCase() as 'get' | 'post' | 'put' | 'delete'\n\n if (method === 'get' || method === 'delete') {\n result = await request[method](props.url, props.params, reqOpts)\n } else {\n result = await request[method](props.url, props.params, reqOpts)\n }\n\n if (controller.signal.aborted) {\n // 已被中断,无需后续处理\n return\n }\n\n if (result.success) {\n emit('api-success', result)\n } else {\n emit('api-fail', result)\n }\n } catch (e) {\n if (controller.signal.aborted) {\n return\n }\n emit('api-exception', e)\n } finally {\n if (currentController === controller) {\n currentController = null\n emit('api-after')\n // 自动关闭触发开关\n emit('update:modelValue', false)\n }\n }\n}\n\n// 监听 v-model 开关:变为 true 就发起请求\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (newVal === true) {\n doRequest()\n } else {\n // 外部关闭开关:中断进行中的请求(不触发收尾事件)\n abortAndClear()\n }\n },\n { immediate: true }\n)\n\nonUnmounted(() => {\n abortAndClear()\n})\n</script>\n\n<style scoped>\n</style>\n"],"names":["useConfig","componentName","props","configRef","shallowRef","buildComponentConfig","onMounted","useGlobalConfig","getGlobalConfig","componentDefaults","getComponentDefault","localProps","k","v","deepMerge","__props","config","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;AAkBO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAYC,EAAcC,EAAwBJ,GAAeC,CAAK,CAAC;AAE7E,SAAAI,EAAU,MAAM;AAEd,IAAAH,EAAU,QAAQE,EAAwBJ,GAAeC,CAAK;AAAA,EAChE,CAAC,GAEMC;AACT;AAKO,SAASI,IAAqC;AACnD,SAAOC,EAAA;AACT;AAEA,SAASH,EACPJ,GACAC,GACG;AACH,QAAMO,IAAoBR,IAAgBS,EAAoBT,CAAa,IAAI,CAAA,GACzEU,IAAkC,CAAA;AACxC,MAAIT;AACF,eAAW,CAACU,GAAGC,CAAC,KAAK,OAAO,QAAQX,CAAK;AACvC,MAAIW,MAAM,WAAWF,EAAWC,CAAC,IAAIC;AAIzC,SAAOC,EAAa,CAAA,GAASL,GAAmBE,CAAU;AAC5D;;;;;;;;;;;;;ACDA,UAAMT,IAAQa,GAIRC,IAAShB,EAA+B,eAAeE,CAAK,GAW5De,IAAOC;AAEb,QAAIC,IAA4C;AAMhD,aAASC,IAAc;AACrB,MAAAD,KAAA,QAAAA,EAAmB;AAAA,IACrB;AAKA,aAASE,IAAgB;AACvB,MAAIF,MACFA,EAAkB,MAAA,GAClBA,IAAoB;AAAA,IAExB;AAEA,mBAAeG,IAAY;AAEzB,MAAAD,EAAA;AAEA,YAAME,IAAa,IAAI,gBAAA;AACvB,MAAAJ,IAAoBI;AAGpB,YAAMC,IAAsB;AAAA,QAC1B,GAAIR,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAId,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQqB,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUxB,EAAM,UAAUc,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIU,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,GAG7DD,EAAW,OAAO;AAEpB;AAGF,QAAIE,EAAO,UACTR,EAAK,eAAeQ,CAAM,IAE1BR,EAAK,YAAYQ,CAAM;AAAA,MAE3B,SAASG,GAAG;AACV,YAAIL,EAAW,OAAO;AACpB;AAEF,QAAAN,EAAK,iBAAiBW,CAAC;AAAA,MACzB,UAAA;AACE,QAAIT,MAAsBI,MACxBJ,IAAoB,MACpBF,EAAK,WAAW,GAEhBA,EAAK,qBAAqB,EAAK;AAAA,MAEnC;AAAA,IACF;AAGA,WAAAY;AAAA,MACE,MAAM3B,EAAM;AAAA,MACZ,CAAC4B,MAAW;AACV,QAAIA,MAAW,KACbR,EAAA,IAGAD,EAAA;AAAA,MAEJ;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBU,EAAY,MAAM;AAChB,MAAAV,EAAA;AAAA,IACF,CAAC,aAhKCW,EAAaC,EAAA,QAAA,SAAA;AAAA;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Station-BTP0SbBg.mjs","sources":["../../src/components/layout/StationMenuNode.vue","../../src/components/layout/Station.vue"],"sourcesContent":["<template>\n <template v-for=\"item in items\" :key=\"item._key\">\n <el-sub-menu v-if=\"item.children && item.children.length\" :index=\"item._key\">\n <template #title>\n <el-icon v-if=\"resolveIcon(item.icon)\"><component :is=\"resolveIcon(item.icon)\" /></el-icon>\n <span>{{ item.title }}</span>\n </template>\n <station-menu-node :items=\"item.children\" @select=\"forwardSelect\" />\n </el-sub-menu>\n <el-menu-item v-else :index=\"item._key\" :disabled=\"item.disabled\" @click=\"onClick(item)\">\n <el-icon v-if=\"resolveIcon(item.icon)\"><component :is=\"resolveIcon(item.icon)\" /></el-icon>\n <span>{{ item.title }}</span>\n <el-badge v-if=\"item.badge !== undefined && item.badge !== ''\" :value=\"item.badge\" class=\"wd-station__menu-badge\" />\n </el-menu-item>\n </template>\n</template>\n\n<script setup lang=\"ts\">\nimport * as ElIcons from '@element-plus/icons-vue'\n\ndefineOptions({ name: 'StationMenuNode' })\n\ndefineProps({\n /** 归一化后的菜单项(带 _key) */\n items: { type: Array as () => any[], default: () => [] }\n})\n\nconst emit = defineEmits<{\n (e: 'select', item: any): void\n}>()\n\n/** 图标归一:字符串按 @element-plus/icons-vue 名称解析,组件直接用 */\nfunction resolveIcon(icon: any) {\n if (!icon) return null\n if (typeof icon === 'string') return (ElIcons as any)[icon] || null\n return icon\n}\n\nfunction onClick(item: any) {\n if (item.disabled) return\n emit('select', item)\n}\n\nfunction forwardSelect(item: any) {\n emit('select', item)\n}\n</script>\n\n<style scoped>\n/* 菜单徽章:靠右显示、垂直居中(el-menu-item 为 flex 容器,badge 为末位子元素) */\n.wd-station__menu-badge {\n /* 转 inline-flex:消除继承自 el-menu-item 的 56px line-height 行盒撑高(否则圆点沉底) */\n display: inline-flex;\n align-items: center;\n margin-left: auto;\n align-self: center;\n flex-shrink: 0;\n}\n/* 菜单折叠成窄条时隐藏徽章,避免溢出 */\n.el-menu--collapse .wd-station__menu-badge {\n display: none;\n}\n</style>\n","<template>\n <div class=\"wd-station\" :class=\"{ 'is-collapsed': collapsedState }\">\n <!-- 左侧菜单栏(menuMode=side):logo 与菜单同列,菜单紧贴 logo -->\n <aside v-if=\"menuMode === 'side'\" class=\"wd-station__aside\" :class=\"{ 'is-collapsed': collapsedState }\">\n <div class=\"wd-station__logo\" :class=\"{ 'is-collapsed': collapsedState }\">\n <slot name=\"logo\" :collapsed=\"collapsedState\">\n <el-icon v-if=\"resolveIcon(logo)\" class=\"wd-station__logo-icon\">\n <component :is=\"resolveIcon(logo)\" />\n </el-icon>\n <span v-show=\"!collapsedState\" class=\"wd-station__logo-title\">{{ title }}</span>\n </slot>\n </div>\n <slot name=\"menu-top\" :collapsed=\"collapsedState\" />\n <el-scrollbar class=\"wd-station__menu-scroll\">\n <el-menu class=\"wd-station__menu\" :collapse=\"collapsedState\" :default-active=\"currentKey\">\n <template v-if=\"headerMode === 'title'\">\n <template v-if=\"groups.length > 1\">\n <el-menu-item-group v-for=\"g in groups\" :key=\"g.key\" :title=\"g.title\">\n <station-menu-node :items=\"g.menus\" @select=\"onMenuSelect\" />\n </el-menu-item-group>\n </template>\n <!-- 单分组无分组语义,直接平铺菜单项(不渲染组标题) -->\n <station-menu-node v-else :items=\"groups[0]?.menus || []\" @select=\"onMenuSelect\" />\n </template>\n <template v-else-if=\"headerMode === 'both'\">\n <!-- both:左侧跟随激活分组,一级菜单作 title 分组,二级平铺全量;二级含三级才折叠;叶子一级直接为菜单项 -->\n <template v-for=\"one in currentGroupMenus\" :key=\"one._key\">\n <el-menu-item-group v-if=\"one.children && one.children.length\" :title=\"one.title\">\n <station-menu-node :items=\"one.children\" @select=\"onMenuSelect\" />\n </el-menu-item-group>\n <el-menu-item v-else :index=\"one._key\" :disabled=\"one.disabled\" @click=\"onMenuSelect(one)\">\n <el-icon v-if=\"resolveIcon(one.icon)\"><component :is=\"resolveIcon(one.icon)\" /></el-icon>\n <span>{{ one.title }}</span>\n <el-badge v-if=\"one.badge !== undefined && one.badge !== ''\" :value=\"one.badge\" class=\"wd-station__menu-badge\" />\n </el-menu-item>\n </template>\n </template>\n <station-menu-node v-else :items=\"currentGroupMenus\" @select=\"onMenuSelect\" />\n </el-menu>\n </el-scrollbar>\n <slot name=\"menu-bottom\" :collapsed=\"collapsedState\" />\n </aside>\n\n <div class=\"wd-station__main\">\n <header class=\"wd-station__header\">\n <div class=\"wd-station__header-left\">\n <!-- 折叠按钮:分导台左侧。side 用左右折叠图标,top 用向上折叠图标 -->\n <el-icon\n v-if=\"collapsible && menuMode !== 'none'\"\n class=\"wd-station__collapse\"\n @click=\"toggleCollapsed\"\n >\n <Fold v-if=\"menuMode === 'side' && !collapsedState\" />\n <Expand v-else-if=\"menuMode === 'side'\" />\n <ArrowUp v-else-if=\"!collapsedState\" />\n <ArrowDown v-else />\n </el-icon>\n <!-- top / none 模式 logo 进 header -->\n <div v-if=\"menuMode !== 'side'\" class=\"wd-station__logo wd-station__logo--header\">\n <slot name=\"logo\" :collapsed=\"collapsedState\">\n <el-icon v-if=\"resolveIcon(logo)\" class=\"wd-station__logo-icon\">\n <component :is=\"resolveIcon(logo)\" />\n </el-icon>\n <span class=\"wd-station__logo-title\">{{ title }}</span>\n </slot>\n </div>\n <template v-for=\"tool in toolbarLeft\" :key=\"tool\">\n <el-icon\n v-if=\"tool === 'refresh'\"\n data-tool=\"refresh\"\n class=\"wd-station__tool\"\n @click=\"refresh\"\n ><Refresh /></el-icon>\n <el-icon\n v-else-if=\"tool === 'settings'\"\n data-tool=\"settings\"\n class=\"wd-station__tool\"\n @click=\"onSettings\"\n ><Setting /></el-icon>\n <el-dropdown v-else-if=\"tool === 'user'\" data-tool=\"user\" class=\"wd-station__tool\" trigger=\"click\">\n <span class=\"wd-station__user\">\n <el-avatar :size=\"24\" :src=\"userAvatar || undefined\">{{ userInitial }}</el-avatar>\n <span class=\"wd-station__user-name\">{{ userName }}</span>\n </span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item @click=\"onLogout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-button v-else-if=\"tool === 'login'\" data-tool=\"login\" size=\"small\" @click=\"onLogin\">登录</el-button>\n </template>\n <slot name=\"header-left\" />\n </div>\n <div class=\"wd-station__header-center\">\n <!-- 分导台:流式块状分组切换条,仅多分组且 headerMode=nav 时显示 -->\n <nav v-if=\"showNav\" class=\"wd-station__nav\">\n <span\n v-for=\"g in groups\"\n :key=\"g.key\"\n class=\"wd-station__nav-item\"\n :class=\"{ 'is-active': g.key === activeGroupKey }\"\n @click=\"setActiveGroup(g.key)\"\n >\n <el-icon v-if=\"resolveIcon(g.icon)\"><component :is=\"resolveIcon(g.icon)\" /></el-icon>\n {{ g.title }}\n </span>\n </nav>\n <span v-else-if=\"showHeaderTitle\" class=\"wd-station__header-title\">{{ title }}</span>\n <slot name=\"header-center\" />\n </div>\n <div class=\"wd-station__header-right\">\n <slot name=\"header-right\" />\n <template v-for=\"tool in toolbarRight\" :key=\"tool\">\n <el-icon\n v-if=\"tool === 'refresh'\"\n data-tool=\"refresh\"\n class=\"wd-station__tool\"\n @click=\"refresh\"\n ><Refresh /></el-icon>\n <el-icon\n v-else-if=\"tool === 'settings'\"\n data-tool=\"settings\"\n class=\"wd-station__tool\"\n @click=\"onSettings\"\n ><Setting /></el-icon>\n <el-dropdown v-else-if=\"tool === 'user'\" data-tool=\"user\" class=\"wd-station__tool\" trigger=\"click\">\n <span class=\"wd-station__user\">\n <el-avatar :size=\"24\" :src=\"userAvatar || undefined\">{{ userInitial }}</el-avatar>\n <span class=\"wd-station__user-name\">{{ userName }}</span>\n </span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item @click=\"onLogout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-button v-else-if=\"tool === 'login'\" data-tool=\"login\" size=\"small\" @click=\"onLogin\">登录</el-button>\n </template>\n </div>\n </header>\n\n <!-- 顶部菜单(menuMode=top),向上折叠时隐藏 -->\n <div v-if=\"menuMode === 'top'\" v-show=\"!collapsedState\" class=\"wd-station__top-menu\">\n <slot name=\"top-menu-left\" />\n <el-menu mode=\"horizontal\" :default-active=\"currentKey\">\n <station-menu-node :items=\"currentGroupMenus\" @select=\"onMenuSelect\" />\n </el-menu>\n <slot name=\"top-menu-right\" />\n </div>\n\n <!-- tabs 导航(contentMode=tabs):整宽撑满,右侧下拉批量关闭;自绘 label 插槽,affix 无关闭图标 -->\n <div v-if=\"contentMode === 'tabs'\" class=\"wd-station__tabs-bar\">\n <slot name=\"tabs-left\" />\n <el-tabs\n :model-value=\"currentKey\"\n type=\"card\"\n class=\"wd-station__tabs\"\n >\n <el-tab-pane v-for=\"tab in tabs\" :key=\"tab.key\" :name=\"tab.key\">\n <template #label>\n <span class=\"wd-station__tab-label\" @click=\"onTabClick(tab)\">{{ tab.title }}</span>\n <el-icon v-if=\"!tab.affix\" class=\"wd-station__tab-close\" @click.stop=\"closeTab(tab.key)\">\n <Close />\n </el-icon>\n </template>\n </el-tab-pane>\n </el-tabs>\n <el-dropdown class=\"wd-station__tabs-actions\" trigger=\"click\">\n <span class=\"wd-station__tabs-more\">\n <el-icon><ArrowDown /></el-icon>\n </span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item :disabled=\"!canCloseCurrent\" @click=\"closeCurrentTab\">关闭当前标签</el-dropdown-item>\n <el-dropdown-item :disabled=\"!canCloseLeft\" @click=\"closeLeftTabs\">关闭左侧标签</el-dropdown-item>\n <el-dropdown-item :disabled=\"!canCloseOthers\" @click=\"closeOtherTabs\">关闭其他标签</el-dropdown-item>\n <el-dropdown-item :disabled=\"!canCloseAll\" @click=\"closeAllTabs\">关闭所有标签</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <slot name=\"tabs-right\" />\n </div>\n\n <!-- 内容区:router 模式渲染 RouterView,html 模式渲染默认插槽;contentKey 强制重挂载 -->\n <main class=\"wd-station__content\">\n <div :key=\"contentKey\" class=\"wd-station__content-inner\">\n <template v-if=\"isRouterMode && RouterViewComp\">\n <keep-alive v-if=\"keepAlive\"><component :is=\"RouterViewComp\" /></keep-alive>\n <component :is=\"RouterViewComp\" v-else />\n </template>\n <slot v-else />\n </div>\n </main>\n\n <!-- 底部信息栏:动态信息 + 版权(footer 插槽可整体替换) -->\n <footer class=\"wd-station__footer\">\n <slot name=\"footer\">\n <span v-if=\"displayFooterInfo\" class=\"wd-station__footer-info\">{{ displayFooterInfo }}</span>\n <span v-if=\"copyright\" class=\"wd-station__footer-copyright\">{{ copyright }}</span>\n </slot>\n </footer>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, onMounted, onUnmounted, ref, watch, type PropType } from 'vue'\nimport * as ElIcons from '@element-plus/icons-vue'\nimport { Fold, Expand, ArrowUp, ArrowDown, Refresh, Setting, Close } from '@element-plus/icons-vue'\nimport { filterProp } from '../common/props'\nimport { registerStation, notifyStationChange } from '../../lib/core/station-linkage'\nimport StationMenuNode from './StationMenuNode.vue'\nimport type { MenuChainItem } from '../../lib/core/station-linkage'\nimport type { StationMenuGroup, StationTab, StationToolbarConfig } from './types'\n\ndefineOptions({ name: 'WdStation' })\n\nconst props = defineProps({\n ...filterProp,\n /** 系统标题(logo 区 / headerMode=title 时的头部标题) */\n title: { type: String, default: '' },\n /** logo 图标(@element-plus/icons-vue 名称字符串,或直接传组件) */\n logo: { type: [String, Object] as PropType<string | object>, default: '' },\n /** 分组菜单结构(优先),支持 JSON 字符串 */\n menuGroups: { type: [Array, String] as PropType<any[] | string>, default: undefined },\n /** 扁平菜单结构(带 group/groupKey 字段按出现顺序归组),支持 JSON 字符串 */\n menus: { type: [Array, String] as PropType<any[] | string>, default: undefined },\n /** 头部中央模式:nav=分导台 / title=标题(此时侧边渲染全量菜单并带组标题)/ both=分导台+标题并存(顶部显示分导台,侧边按分组标题渲染全量菜单) */\n headerMode: { type: String as PropType<'nav' | 'title' | 'both'>, default: 'nav' },\n /** 是否显示头部中央标题(headerMode 非 nav 时的 fallback 标题;需自绘 header-center 时可关闭) */\n showHeaderTitle: { type: Boolean, default: true },\n /** 菜单位置:side=左侧 / top=顶部 / none=不启用 */\n menuMode: { type: String as PropType<'side' | 'top' | 'none'>, default: 'side' },\n /** 内容方式:page=单页 / tabs=多标签 */\n contentMode: { type: String as PropType<'page' | 'tabs'>, default: 'page' },\n /** 路由适配:auto=自动检测 $router / router / html */\n routerMode: { type: String as PropType<'auto' | 'router' | 'html'>, default: 'auto' },\n /** 是否显示折叠按钮 */\n collapsible: { type: Boolean, default: true },\n /** 折叠状态(v-model:collapsed) */\n collapsed: { type: Boolean, default: false },\n /** 当前分组 key(v-model:active-group) */\n activeGroup: { type: String, default: '' },\n /** 当前菜单 key(v-model:active-menu) */\n activeMenu: { type: String, default: '' },\n /** 已开启标签(v-model:open-tabs,受控) */\n openTabs: { type: Array as PropType<StationTab[]>, default: undefined },\n /** 用户名(有值显示用户下拉,无值显示登录按钮) */\n userName: { type: String, default: '' },\n /** 用户头像地址 */\n userAvatar: { type: String, default: '' },\n /** 版权信息 */\n copyright: { type: String, default: '' },\n /** 底部动态信息(v-model:footer-info) */\n footerInfo: { type: String, default: '' },\n /** router 模式内容区 keep-alive */\n keepAlive: { type: Boolean, default: false },\n /** 工具栏点位配置:refresh/settings/user/login 各自 left/right/none,支持 JSON 字符串 */\n toolbarConfig: { type: [Object, String] as PropType<StationToolbarConfig | string>, default: undefined }\n})\n\nconst emit = defineEmits([\n 'update:collapsed',\n 'update:active-group',\n 'update:active-menu',\n 'update:open-tabs',\n 'update:footer-info',\n 'group-change',\n 'menu-select',\n 'tab-click',\n 'tab-close',\n 'refresh',\n 'login',\n 'logout',\n 'settings'\n])\n\nconst instance = getCurrentInstance()\n\n/* ---------- 软依赖检测:vue-router / RouterView ---------- */\nconst router =\n (instance?.proxy as any)?.$router || instance?.appContext?.config?.globalProperties?.$router\nconst route =\n (instance?.proxy as any)?.$route || instance?.appContext?.config?.globalProperties?.$route\nconst RouterViewComp = instance?.appContext?.components?.['RouterView']\n\nconst isRouterMode = computed(() => {\n if (props.routerMode === 'html') return false\n if (props.routerMode === 'router') return true\n return !!router\n})\n\n/* ---------- JSON 字符串入参兼容(UMD 属性式写法) ---------- */\nfunction parseMaybeJson(val: any, fallback: any): any {\n if (val === undefined || val === null || val === '') return fallback\n if (typeof val !== 'string') return val\n try {\n return JSON.parse(val)\n } catch (e) {\n console.error('[WorkDesktop] WdStation JSON 解析失败,已回退默认值:', e)\n return fallback\n }\n}\n\n/* ---------- 菜单归一化:统一为 分组 Group → 菜单树 ---------- */\nfunction assignKeys(menus: any[], groupKey: string): any[] {\n return menus.map((m) => ({\n ...m,\n _key: m._key || `${groupKey}:${m.name || m.path || m.title}`,\n children: m.children && m.children.length ? assignKeys(m.children, groupKey) : undefined\n }))\n}\n\nfunction flatToGroups(flat: any[]): StationMenuGroup[] {\n const order: string[] = []\n const map = new Map<string, StationMenuGroup>()\n flat.forEach((m) => {\n const key = m.groupKey || m.group || 'default'\n if (!map.has(key)) {\n map.set(key, {\n key,\n title: m.group || (key === 'default' ? '默认' : key),\n icon: m.groupIcon,\n menus: []\n })\n order.push(key)\n }\n map.get(key)!.menus.push(m)\n })\n return order.map((k) => map.get(k)!)\n}\n\nlet depthWarned = false\nfunction checkMenuDepth(list: StationMenuGroup[]): void {\n if (depthWarned) return\n const walk = (menus: any[], depth: number): void => {\n menus.forEach((m) => {\n if (depth > 2 && !depthWarned) {\n depthWarned = true\n console.warn('[WorkDesktop] WdStation: 菜单层级建议不超过两层,当前已超出(仍按原样渲染)')\n }\n if (m.children && m.children.length) walk(m.children, depth + 1)\n })\n }\n list.forEach((g) => walk(g.menus, 1))\n}\n\nconst groups = computed<StationMenuGroup[]>(() => {\n const mg = parseMaybeJson(props.menuGroups, null)\n let list: StationMenuGroup[]\n if (Array.isArray(mg) && mg.length) {\n list = mg.map((g: any) => ({ key: g.key, title: g.title, icon: g.icon, menus: g.menus || [] }))\n } else {\n const flat = parseMaybeJson(props.menus, [])\n list = flatToGroups(Array.isArray(flat) ? flat : [])\n }\n // 统一分配 _key 并检查层级\n list = list.map((g) => ({ ...g, menus: assignKeys(g.menus, g.key) }))\n checkMenuDepth(list)\n return list\n})\n\n/* ---------- 分组(分导台) ---------- */\nconst innerActiveGroup = ref('')\nconst activeGroupKey = computed(\n () => props.activeGroup || innerActiveGroup.value || groups.value[0]?.key || ''\n)\nconst showNav = computed(() => props.headerMode !== 'title' && groups.value.length > 1)\nconst currentGroup = computed(\n () => groups.value.find((g) => g.key === activeGroupKey.value) || groups.value[0]\n)\nconst currentGroupMenus = computed(() => currentGroup.value?.menus || [])\n\nfunction setActiveGroup(key: string) {\n innerActiveGroup.value = key\n emit('update:active-group', key)\n const g = groups.value.find((item) => item.key === key)\n if (g) emit('group-change', { key: g.key, title: g.title })\n notifyStationChange(props.filter)\n}\n\n/* ---------- 当前菜单 / 标签激活 ---------- */\nconst innerActiveMenu = ref('')\nwatch(\n () => props.activeMenu,\n (v) => {\n if (v) innerActiveMenu.value = v\n }\n)\nconst currentKey = computed(() => props.activeMenu || innerActiveMenu.value)\n\nfunction setActiveMenu(key: string) {\n innerActiveMenu.value = key\n emit('update:active-menu', key)\n notifyStationChange(props.filter)\n}\n\n/* ---------- 菜单点击 ---------- */\nfunction onMenuSelect(item: any) {\n setActiveMenu(item._key)\n emit('menu-select', item)\n if (props.contentMode === 'tabs') openTab(item)\n if (isRouterMode.value && item.path) router.push(item.path)\n}\n\n/* ---------- 路由反查:按当前路径定位分组与菜单 ---------- */\nfunction walkMenus(menus: any[], fn: (m: any) => void): void {\n menus.forEach((m) => {\n fn(m)\n if (m.children && m.children.length) walkMenus(m.children, fn)\n })\n}\n\nfunction findMenuByPath(path: string): { group: StationMenuGroup; item: any } | null {\n for (const g of groups.value) {\n let found: any = null\n walkMenus(g.menus, (m) => {\n if (!found && m.path === path) found = m\n })\n if (found) return { group: g, item: found }\n }\n return null\n}\n\nwatch(\n () => route?.path,\n (path) => {\n if (!path || !isRouterMode.value) return\n const found = findMenuByPath(path)\n if (found) {\n innerActiveGroup.value = found.group.key\n setActiveMenu(found.item._key)\n }\n },\n { immediate: true }\n)\n\n/* ---------- tabs ---------- */\nconst innerTabs = ref<StationTab[]>([])\nconst isTabsControlled = computed(() => props.openTabs !== undefined)\nconst tabs = computed<StationTab[]>(() =>\n isTabsControlled.value ? (props.openTabs as StationTab[]) : innerTabs.value\n)\n\nfunction commitTabs(newTabs: StationTab[]) {\n if (!isTabsControlled.value) innerTabs.value = newTabs\n emit('update:open-tabs', newTabs)\n}\n\nfunction openTab(tab: any) {\n const key = tab._key || tab.key\n if (!key) return\n if (!tabs.value.find((t) => t.key === key)) {\n commitTabs([...tabs.value, { key, title: tab.title, path: tab.path, affix: tab.affix }])\n }\n setActiveMenu(key)\n}\n\nfunction closeTab(key: string) {\n const list = tabs.value\n const idx = list.findIndex((t) => t.key === key)\n if (idx < 0) return\n const tab = list[idx]\n if (tab.affix) return\n const newTabs = list.filter((t) => t.key !== key)\n commitTabs(newTabs)\n emit('tab-close', { ...tab })\n // 关闭激活标签 → 跳到相邻(先右后左)\n if (currentKey.value === key) {\n const next = newTabs[idx] || newTabs[idx - 1]\n if (next) setActiveMenu(next.key)\n }\n}\n\nfunction onTabClick(tab: StationTab) {\n setActiveMenu(tab.key)\n emit('tab-click', { ...tab })\n if (isRouterMode.value && tab.path) router.push(tab.path)\n}\n\n/* ---------- tabs 批量关闭(右侧下拉) ---------- */\nfunction closeTabsBy(shouldClose: (t: StationTab, i: number) => boolean) {\n const list = tabs.value\n const removed = list.filter((t, i) => shouldClose(t, i) && !t.affix)\n if (!removed.length) return\n const removedKeys = new Set(removed.map((t) => t.key))\n const kept = list.filter((t) => !removedKeys.has(t.key))\n commitTabs(kept)\n removed.forEach((t) => emit('tab-close', { ...t }))\n // 激活标签被关掉 → 跳到原位置附近(先右后左)\n if (!kept.find((t) => t.key === currentKey.value)) {\n const idx = list.findIndex((t) => t.key === currentKey.value)\n const next = kept[Math.min(idx, kept.length - 1)]\n if (next) setActiveMenu(next.key)\n }\n}\n\nfunction closeCurrentTab() {\n closeTab(currentKey.value)\n}\nfunction closeLeftTabs() {\n const idx = tabs.value.findIndex((t) => t.key === currentKey.value)\n if (idx < 0) return\n closeTabsBy((_, i) => i < idx)\n}\nfunction closeOtherTabs() {\n closeTabsBy((t) => t.key !== currentKey.value)\n}\nfunction closeAllTabs() {\n closeTabsBy(() => true)\n}\n\nconst canCloseCurrent = computed(() => {\n const cur = tabs.value.find((t) => t.key === currentKey.value)\n return !!cur && !cur.affix\n})\nconst canCloseLeft = computed(() => {\n const idx = tabs.value.findIndex((t) => t.key === currentKey.value)\n return idx > 0 && tabs.value.slice(0, idx).some((t) => !t.affix)\n})\nconst canCloseOthers = computed(() =>\n tabs.value.some((t) => !t.affix && t.key !== currentKey.value)\n)\nconst canCloseAll = computed(() => tabs.value.some((t) => !t.affix))\n\n/* ---------- 工具栏点位 ---------- */\nconst toolbarCfg = computed<Required<StationToolbarConfig>>(() => {\n const raw = parseMaybeJson(props.toolbarConfig, {}) || {}\n return {\n refresh: raw.refresh || 'right',\n settings: raw.settings || 'right',\n user: raw.user || 'right',\n login: raw.login || 'right'\n }\n})\nconst accountTool = computed(() => (props.userName ? 'user' : 'login'))\nconst toolbarLeft = computed(() => {\n const list: string[] = []\n const cfg = toolbarCfg.value\n if (cfg.refresh === 'left') list.push('refresh')\n if (cfg.settings === 'left') list.push('settings')\n if (cfg[accountTool.value as keyof StationToolbarConfig] === 'left') list.push(accountTool.value)\n return list\n})\nconst toolbarRight = computed(() => {\n const list: string[] = []\n const cfg = toolbarCfg.value\n if (cfg.refresh === 'right') list.push('refresh')\n if (cfg.settings === 'right') list.push('settings')\n if (cfg[accountTool.value as keyof StationToolbarConfig] === 'right') list.push(accountTool.value)\n return list\n})\n\nconst userInitial = computed(() => (props.userName ? props.userName.charAt(0) : ''))\n\nfunction onSettings() {\n emit('settings')\n}\nfunction onLogin() {\n emit('login')\n}\nfunction onLogout() {\n emit('logout')\n}\n\n/* ---------- 折叠 ---------- */\n// 与 activeGroup 同一模式:props 优先,未受控时走内部状态\nconst innerCollapsed = ref(false)\nconst collapsedState = computed(() => props.collapsed || innerCollapsed.value)\nfunction toggleCollapsed() {\n innerCollapsed.value = !collapsedState.value\n emit('update:collapsed', collapsedState.value)\n}\n\n/* ---------- 内容刷新(强制重挂载) ---------- */\nconst contentKey = ref(0)\nfunction refresh() {\n contentKey.value += 1\n emit('refresh')\n}\n\n/* ---------- 底部动态信息 + 联动注册 ---------- */\nconst innerFooterInfo = ref('')\nfunction setFooterInfo(info: string) {\n innerFooterInfo.value = info\n emit('update:footer-info', info)\n}\nconst displayFooterInfo = computed(() => innerFooterInfo.value || props.footerInfo)\n\n/* ---------- 激活菜单路径链(WdPath 自动模式读取) ---------- */\nfunction findMenuChain(key: string): { chain: MenuChainItem[] } | null {\n for (const g of groups.value) {\n const path: any[] = []\n const walk = (menus: any[], ancestors: any[]): boolean => {\n for (const m of menus) {\n if (m._key === key) {\n path.push(...ancestors, m)\n return true\n }\n if (m.children && m.children.length && walk(m.children, [...ancestors, m])) return true\n }\n return false\n }\n if (walk(g.menus, [])) {\n return {\n chain: [\n { title: g.title, icon: g.icon },\n ...path.map((m: any) => ({ title: m.title, path: m.path, icon: m.icon }))\n ]\n }\n }\n }\n return null\n}\n\nfunction getActiveMenuChain(): MenuChainItem[] {\n if (!currentKey.value) return []\n return findMenuChain(currentKey.value)?.chain || []\n}\n\nlet unregister: (() => void) | null = null\nonMounted(() => {\n unregister = registerStation({ filter: props.filter, setFooterInfo, refresh, getActiveMenuChain })\n // 通知同 filter 组的面包屑:本站已就绪,可读取菜单链\n notifyStationChange(props.filter)\n // tabs 模式:affix 菜单挂载时自动开启\n if (props.contentMode === 'tabs') {\n groups.value.forEach((g) =>\n walkMenus(g.menus, (m) => {\n if (m.affix) openTab(m)\n })\n )\n }\n})\nonUnmounted(() => {\n unregister?.()\n})\n\n/* ---------- 图标归一 ---------- */\nfunction resolveIcon(icon: any) {\n if (!icon) return null\n if (typeof icon === 'string') return (ElIcons as any)[icon] || null\n return icon\n}\n\ndefineExpose({ refresh, openTab, closeTab })\n</script>\n\n<style scoped>\n.wd-station {\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: var(--wd-bg-color-page);\n color: var(--wd-text-color-primary);\n}\n\n/* 左侧菜单栏:logo 与菜单同列同宽,菜单紧贴 logo */\n.wd-station__aside {\n width: 220px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n /* 组件级令牌回退链:皮肤可单独定制导航区背景 */\n background: var(--wd-station-aside-bg, var(--wd-bg-color));\n /* 背景素材:皮肤可挂纹理/图片(须置于 background 简写之后,否则被简写重置) */\n background-image: var(--wd-station-aside-bg-image, none);\n border-right: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n transition: width 0.2s;\n}\n.wd-station__aside.is-collapsed {\n width: 64px;\n}\n.wd-station__logo {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 48px;\n padding: 0 var(--wd-spacing-large, 16px);\n overflow: hidden;\n flex-shrink: 0;\n border-bottom: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n}\n.wd-station__logo.is-collapsed {\n padding: 0;\n justify-content: center;\n}\n.wd-station__logo--header {\n height: auto;\n padding: 0;\n border-bottom: none;\n}\n.wd-station__logo-title {\n font-size: var(--wd-font-size-large);\n font-weight: 600;\n white-space: nowrap;\n}\n.wd-station__menu-scroll {\n flex: 1;\n min-height: 0;\n}\n.wd-station__menu {\n border-right: none;\n}\n\n/* 右侧主区 */\n.wd-station__main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.wd-station__header {\n display: flex;\n align-items: center;\n height: 48px;\n padding: 0 var(--wd-spacing-large);\n background: var(--wd-station-header-bg, var(--wd-bg-color));\n /* 背景素材:皮肤可挂纹理/图片(须置于 background 简写之后,否则被简写重置) */\n background-image: var(--wd-station-header-bg-image, none);\n border-bottom: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n flex-shrink: 0;\n}\n.wd-station__header-left {\n display: flex;\n align-items: center;\n gap: var(--wd-spacing-base);\n min-width: 0;\n flex-shrink: 0;\n}\n/* 中央区占满剩余空间,分导台/标题左对齐排列 */\n.wd-station__header-center {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1;\n min-width: 0;\n padding: 0 var(--wd-spacing-base);\n}\n.wd-station__header-right {\n display: flex;\n align-items: center;\n gap: var(--wd-spacing-base);\n min-width: 0;\n flex-shrink: 0;\n justify-content: flex-end;\n}\n.wd-station__header-title {\n font-size: var(--wd-font-size-large);\n font-weight: 600;\n}\n.wd-station__collapse {\n cursor: pointer;\n font-size: 18px;\n color: var(--wd-text-color-regular);\n}\n.wd-station__collapse:hover {\n color: var(--wd-color-primary);\n}\n\n/* 分导台:流式块状分组切换条 */\n.wd-station__nav {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n}\n.wd-station__nav-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 12px;\n border-radius: var(--wd-radius-base);\n cursor: pointer;\n color: var(--wd-text-color-regular);\n font-size: var(--wd-font-size-base);\n white-space: nowrap;\n}\n.wd-station__nav-item:hover {\n color: var(--wd-color-primary);\n background: var(--wd-bg-color-page);\n}\n.wd-station__nav-item.is-active {\n color: var(--wd-color-primary);\n background: var(--wd-bg-color-page);\n font-weight: 600;\n}\n\n/* 工具栏 */\n.wd-station__tool {\n cursor: pointer;\n font-size: 16px;\n color: var(--wd-text-color-regular);\n}\n.wd-station__tool:hover {\n color: var(--wd-color-primary);\n}\n.wd-station__user {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n}\n.wd-station__user-name {\n font-size: var(--wd-font-size-base);\n color: var(--wd-text-color-primary);\n}\n\n/* 顶部菜单:flex 排版,左右插槽夹住中间菜单(菜单占满剩余宽度) */\n.wd-station__top-menu {\n display: flex;\n align-items: center;\n background: var(--wd-bg-color);\n border-bottom: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n flex-shrink: 0;\n}\n.wd-station__top-menu :deep(.el-menu) {\n flex: 1;\n min-width: 0;\n}\n\n/* tabs 条:整宽撑满,消左/上边框,右侧下拉批量关闭 */\n.wd-station__tabs-bar {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n padding-top: 4px;\n background: var(--wd-station-tabs-bg, var(--wd-bg-color));\n /* 背景素材:皮肤可挂纹理/图片(须置于 background 简写之后,否则被简写重置) */\n background-image: var(--wd-station-tabs-bg-image, none);\n border-bottom: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n}\n.wd-station__tabs {\n flex: 1;\n min-width: 0;\n}\n.wd-station__tabs-bar :deep(.el-tabs--card > .el-tabs__header) {\n margin-bottom: 0;\n border-bottom: none;\n}\n.wd-station__tabs-bar :deep(.el-tabs--card > .el-tabs__header .el-tabs__nav) {\n border: none;\n border-radius: 0;\n}\n/* 分隔线统一放右侧:每个 tab(含最后一个)默认带右边框,tabs 区右端封闭 */\n.wd-station__tabs-bar :deep(.el-tabs--card > .el-tabs__header .el-tabs__nav .el-tabs__item) {\n border-left: none;\n border-right: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n}\n.wd-station__tabs-actions {\n flex-shrink: 0;\n margin: 0 var(--wd-spacing-large);\n cursor: pointer;\n}\n.wd-station__tabs-more {\n display: inline-flex;\n align-items: center;\n padding: 4px;\n color: var(--wd-text-color-regular);\n}\n.wd-station__tabs-more:hover {\n color: var(--wd-color-primary);\n}\n.wd-station__tab-label {\n cursor: pointer;\n}\n.wd-station__tab-close {\n margin-left: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n\n/* 内容区 */\n.wd-station__content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: var(--wd-spacing-large);\n}\n.wd-station__content-inner {\n height: 100%;\n}\n\n/* 底部信息栏 */\n.wd-station__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wd-spacing-base);\n height: 32px;\n padding: 0 var(--wd-spacing-large);\n /* 组件级令牌回退链:皮肤可单独定制底栏背景 */\n background: var(--wd-station-footer-bg, var(--wd-bg-color));\n border-top: var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light);\n color: var(--wd-text-color-secondary);\n font-size: var(--wd-font-size-small);\n flex-shrink: 0;\n}\n.wd-station__footer-info {\n color: var(--wd-text-color-regular);\n}\n</style>\n"],"names":["emit","__emit","resolveIcon","icon","ElIcons","onClick","item","forwardSelect","_createElementBlock","_Fragment","_renderList","__props","_createBlock","_component_el_sub_menu","_component_el_icon","_openBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_createVNode","_component_station_menu_node","_component_el_menu_item","$event","_component_el_badge","props","instance","getCurrentInstance","router","_a","_d","_c","_b","route","_e","_h","_g","_f","RouterViewComp","_j","_i","isRouterMode","computed","parseMaybeJson","val","fallback","e","assignKeys","menus","groupKey","m","flatToGroups","flat","order","map","key","k","depthWarned","checkMenuDepth","list","walk","depth","g","groups","mg","innerActiveGroup","ref","activeGroupKey","showNav","currentGroup","currentGroupMenus","setActiveGroup","notifyStationChange","innerActiveMenu","watch","v","currentKey","setActiveMenu","onMenuSelect","openTab","walkMenus","fn","findMenuByPath","path","found","innerTabs","isTabsControlled","tabs","commitTabs","newTabs","tab","t","closeTab","idx","next","onTabClick","closeTabsBy","shouldClose","removed","i","removedKeys","kept","closeCurrentTab","closeLeftTabs","_","closeOtherTabs","closeAllTabs","canCloseCurrent","cur","canCloseLeft","canCloseOthers","canCloseAll","toolbarCfg","raw","accountTool","toolbarLeft","cfg","toolbarRight","userInitial","onSettings","onLogin","onLogout","innerCollapsed","collapsedState","toggleCollapsed","contentKey","refresh","innerFooterInfo","setFooterInfo","info","displayFooterInfo","findMenuChain","ancestors","getActiveMenuChain","unregister","onMounted","registerStation","onUnmounted","__expose","_normalizeClass","_renderSlot","_ctx","_withDirectives","_component_el_scrollbar","_component_el_menu","_component_el_menu_item_group","StationMenuNode","one","_hoisted_1","_hoisted_2","_hoisted_3","_unref","Fold","Expand","ArrowDown","ArrowUp","_hoisted_4","_hoisted_5","tool","Refresh","Setting","_component_el_dropdown","_component_el_dropdown_menu","_component_el_dropdown_item","_cache","_hoisted_6","_component_el_avatar","_hoisted_7","_component_el_button","_hoisted_8","_hoisted_9","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_component_el_tabs","_component_el_tab_pane","_hoisted_17","_withModifiers","Close","_hoisted_18","_hoisted_19","_KeepAlive","_hoisted_20","_hoisted_21","_hoisted_22"],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- import { defineComponent as u, computed as y, resolveComponent as i, openBlock as t, createBlock as o, withCtx as l, createVNode as _, normalizeStyle as a, resolveDynamicComponent as r, createElementBlock as k, createCommentVNode as S, renderSlot as g, createTextVNode as v, toDisplayString as w } from "vue";
2
- import { QuestionFilled as x, WarningFilled as C, InfoFilled as s } from "@element-plus/icons-vue";
3
- import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
4
- const T = /* @__PURE__ */ u({
5
- name: "WdTips",
6
- __name: "Tips",
7
- props: {
8
- /** 提示内容 */
9
- tips: { type: String, default: "" },
10
- /** word=悬停图标模式 / box=行内文字模式 */
11
- type: { type: String, default: "word" },
12
- /** 图标组件名(InfoFilled/WarningFilled/QuestionFilled) */
13
- icon: { type: String, default: "InfoFilled" },
14
- /** 图标/文字颜色 */
15
- color: { type: String, default: "#909399" }
16
- },
17
- setup(e) {
18
- const p = e, d = { InfoFilled: s, WarningFilled: C, QuestionFilled: x }, n = y(() => d[p.icon] || s);
19
- return (m, W) => {
20
- const c = i("el-icon"), f = i("el-tooltip");
21
- return e.type === "word" ? (t(), o(f, {
22
- key: 0,
23
- content: e.tips,
24
- effect: "dark",
25
- placement: "top"
26
- }, {
27
- default: l(() => [
28
- _(c, {
29
- class: "wd-tips__icon",
30
- style: a({ color: e.color })
31
- }, {
32
- default: l(() => [
33
- (t(), o(r(n.value)))
34
- ]),
35
- _: 1
36
- }, 8, ["style"])
37
- ]),
38
- _: 1
39
- }, 8, ["content"])) : (t(), k("span", {
40
- key: 1,
41
- class: "wd-tips__box",
42
- style: a({ color: e.color })
43
- }, [
44
- n.value ? (t(), o(c, {
45
- key: 0,
46
- class: "wd-tips__box-icon"
47
- }, {
48
- default: l(() => [
49
- (t(), o(r(n.value)))
50
- ]),
51
- _: 1
52
- })) : S("", !0),
53
- g(m.$slots, "default", {}, () => [
54
- v(w(e.tips), 1)
55
- ], !0)
56
- ], 4));
57
- };
58
- }
59
- }), N = /* @__PURE__ */ F(T, [["__scopeId", "data-v-bacdf99f"]]);
60
- export {
61
- N as W
62
- };
63
- //# sourceMappingURL=Tips-IWCZcR1K.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tips-IWCZcR1K.mjs","sources":["../../src/components/styles/Tips.vue"],"sourcesContent":["<template>\n <!-- word:悬停图标模式 -->\n <el-tooltip v-if=\"type === 'word'\" :content=\"tips\" effect=\"dark\" placement=\"top\">\n <el-icon class=\"wd-tips__icon\" :style=\"{ color: color }\">\n <component :is=\"iconComp\" />\n </el-icon>\n </el-tooltip>\n\n <!-- box:行内文字模式 -->\n <span v-else class=\"wd-tips__box\" :style=\"{ color: color }\">\n <el-icon v-if=\"iconComp\" class=\"wd-tips__box-icon\">\n <component :is=\"iconComp\" />\n </el-icon>\n <slot>{{ tips }}</slot>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport { InfoFilled, WarningFilled, QuestionFilled } from '@element-plus/icons-vue'\n\ndefineOptions({ name: 'WdTips' })\n\nconst props = defineProps({\n /** 提示内容 */\n tips: { type: String, default: '' },\n /** word=悬停图标模式 / box=行内文字模式 */\n type: { type: String as PropType<'word' | 'box'>, default: 'word' },\n /** 图标组件名(InfoFilled/WarningFilled/QuestionFilled) */\n icon: { type: String, default: 'InfoFilled' },\n /** 图标/文字颜色 */\n color: { type: String, default: '#909399' }\n})\n\nconst iconMap: Record<string, any> = { InfoFilled, WarningFilled, QuestionFilled }\n\nconst iconComp = computed(() => iconMap[props.icon] || InfoFilled)\n</script>\n\n<style scoped>\n.wd-tips__icon {\n cursor: pointer;\n vertical-align: middle;\n}\n.wd-tips__box {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: var(--wd-font-size-sm, 12px);\n}\n.wd-tips__box-icon {\n flex-shrink: 0;\n}\n</style>\n"],"names":["props","__props","iconMap","InfoFilled","WarningFilled","QuestionFilled","iconComp","computed","_createBlock","_component_el_tooltip","_createVNode","_component_el_icon","_openBlock","_resolveDynamicComponent","_createElementBlock","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,UAAMA,IAAQC,GAWRC,IAA+B,EAAE,YAAAC,GAAY,eAAAC,GAAe,gBAAAC,EAAA,GAE5DC,IAAWC,EAAS,MAAML,EAAQF,EAAM,IAAI,KAAKG,CAAU;;;aAlC7CF,EAAA,SAAI,eAAtBO,EAIaC,GAAA;AAAA;QAJuB,SAASR,EAAA;AAAA,QAAM,QAAO;AAAA,QAAO,WAAU;AAAA,MAAA;mBACzE,MAEU;AAAA,UAFVS,EAEUC,GAAA;AAAA,YAFD,OAAM;AAAA,YAAiB,kBAAgBV,EAAA,OAAK;AAAA,UAAA;uBACnD,MAA4B;AAAA,eAA5BW,KAAAJ,EAA4BK,EAAZP,EAAA,KAAQ,CAAA;AAAA,YAAA;;;;;kCAK5BQ,EAKO,QAAA;AAAA;QALM,OAAM;AAAA,QAAgB,kBAAgBb,EAAA,OAAK;AAAA,MAAA;QACvCK,EAAA,cAAfE,EAEUG,GAAA;AAAA;UAFe,OAAM;AAAA,QAAA;qBAC7B,MAA4B;AAAA,aAA5BC,KAAAJ,EAA4BK,EAAZP,EAAA,KAAQ,CAAA;AAAA,UAAA;;;QAE1BS,EAAuBC,yBAAvB,MAAuB;AAAA,cAAdf,EAAA,IAAI,GAAA,CAAA;AAAA,QAAA;;;;;"}