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.
- package/CHANGELOG.md +1 -0
- package/dist/api-button/index.mjs +1 -1
- package/dist/auto-complete/index.mjs +1 -1
- package/dist/checkbox-list/index.mjs +1 -1
- 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
- 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
- package/dist/chunks/{AutoComplete-C6Nxatvt.mjs → AutoComplete-BKWrR5pD.mjs} +2 -2
- package/dist/chunks/{AutoComplete-C6Nxatvt.mjs.map → AutoComplete-BKWrR5pD.mjs.map} +1 -1
- package/dist/chunks/{CheckboxList-5AEx33r5.mjs → CheckboxList-5o9E0Tzg.mjs} +2 -2
- package/dist/chunks/{CheckboxList-5AEx33r5.mjs.map → CheckboxList-5o9E0Tzg.mjs.map} +1 -1
- 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
- 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
- package/dist/chunks/{DataForm-C6VLTSOm.mjs → DataForm-Dvx6GxlR.mjs} +8 -7
- package/dist/chunks/{DataForm-C6VLTSOm.mjs.map → DataForm-Dvx6GxlR.mjs.map} +1 -1
- package/dist/chunks/{DataGrid-Dd7n5JM7.mjs → DataGrid-Cw3yXhmR.mjs} +3 -3
- package/dist/chunks/{DataGrid-Dd7n5JM7.mjs.map → DataGrid-Cw3yXhmR.mjs.map} +1 -1
- 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
- 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
- package/dist/chunks/{Drawer-ucXKUecL.mjs → Drawer-BzdohcBg.mjs} +96 -90
- package/dist/chunks/Drawer-BzdohcBg.mjs.map +1 -0
- 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
- 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
- package/dist/chunks/{EditableGrid-CDeeVkaX.mjs → EditableGrid-Dr48XzLH.mjs} +6 -5
- package/dist/chunks/{EditableGrid-CDeeVkaX.mjs.map → EditableGrid-Dr48XzLH.mjs.map} +1 -1
- package/dist/chunks/Guide-AWaWvQoq.mjs +347 -0
- package/dist/chunks/Guide-AWaWvQoq.mjs.map +1 -0
- package/dist/chunks/Iframe-BB1Va2kZ.mjs +128 -0
- package/dist/chunks/Iframe-BB1Va2kZ.mjs.map +1 -0
- package/dist/chunks/{ImageUpload-CQA9XQ7Q.mjs → ImageUpload-DiJ16Aga.mjs} +5 -4
- package/dist/chunks/{ImageUpload-CQA9XQ7Q.mjs.map → ImageUpload-DiJ16Aga.mjs.map} +1 -1
- 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
- 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
- package/dist/chunks/{RadioList-BUWcP_Pk.mjs → RadioList-CQJDixnr.mjs} +2 -2
- package/dist/chunks/{RadioList-BUWcP_Pk.mjs.map → RadioList-CQJDixnr.mjs.map} +1 -1
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs +63 -0
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs.map +1 -0
- package/dist/chunks/{Select-uvFy7_NU.mjs → Select-ByH7uxuS.mjs} +2 -2
- package/dist/chunks/{Select-uvFy7_NU.mjs.map → Select-ByH7uxuS.mjs.map} +1 -1
- package/dist/chunks/{Station-BTP0SbBg.mjs → Station-DDoJem4F.mjs} +150 -139
- package/dist/chunks/Station-DDoJem4F.mjs.map +1 -0
- 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
- 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
- package/dist/chunks/Tips-B_18E4mc.mjs +71 -0
- package/dist/chunks/Tips-B_18E4mc.mjs.map +1 -0
- 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
- 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
- package/dist/chunks/{Viewer-CjLSQTrw.mjs → Viewer-CmTaneb6.mjs} +2 -2
- package/dist/chunks/{Viewer-CjLSQTrw.mjs.map → Viewer-CmTaneb6.mjs.map} +1 -1
- package/dist/chunks/config-CDqjABpD.mjs +1378 -0
- package/dist/chunks/config-CDqjABpD.mjs.map +1 -0
- package/dist/chunks/http-CW9konD4.mjs +2774 -0
- package/dist/chunks/http-CW9konD4.mjs.map +1 -0
- package/dist/chunks/{useApiAction-DxVQWWxv.mjs → useApiAction-CQVmN1MH.mjs} +2 -2
- package/dist/chunks/{useApiAction-DxVQWWxv.mjs.map → useApiAction-CQVmN1MH.mjs.map} +1 -1
- package/dist/chunks/{useColumnSettings-BwG2V9xp.mjs → useColumnSettings-CIFQCmzT.mjs} +22 -21
- package/dist/chunks/{useColumnSettings-BwG2V9xp.mjs.map → useColumnSettings-CIFQCmzT.mjs.map} +1 -1
- package/dist/chunks/useConfig-ChIkE3Lz.mjs +23 -0
- package/dist/chunks/useConfig-ChIkE3Lz.mjs.map +1 -0
- package/dist/chunks/{useOptionsLoader-DEVCYhrp.mjs → useOptionsLoader-BUO0VTjH.mjs} +2 -2
- package/dist/chunks/{useOptionsLoader-DEVCYhrp.mjs.map → useOptionsLoader-BUO0VTjH.mjs.map} +1 -1
- package/dist/confirm-button/index.mjs +1 -1
- package/dist/data-form/index.mjs +1 -1
- package/dist/data-grid/index.mjs +1 -1
- package/dist/dialog-button/index.mjs +1 -1
- package/dist/drawer/index.mjs +1 -1
- package/dist/drawer/style.css +1 -1
- package/dist/drawer-button/index.mjs +1 -1
- package/dist/editable-grid/index.mjs +1 -1
- package/dist/guide/index.mjs +7 -0
- package/dist/guide/index.mjs.map +1 -0
- package/dist/guide/style.css +1 -0
- package/dist/iframe/index.mjs +1 -1
- package/dist/iframe/style.css +1 -1
- package/dist/image-upload/index.mjs +1 -1
- package/dist/index.esm.js +194 -189
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +25 -21
- package/dist/index.umd.js.map +1 -1
- package/dist/prompt-button/index.mjs +1 -1
- package/dist/radio-list/index.mjs +1 -1
- package/dist/requester/index.mjs +1 -1
- package/dist/select/index.mjs +1 -1
- package/dist/station/index.mjs +1 -1
- package/dist/station/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/switch/index.mjs +1 -1
- package/dist/tips/index.mjs +1 -1
- package/dist/tips/style.css +1 -1
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +3 -3
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +5 -5
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +3 -3
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +4 -4
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +6 -6
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +5 -5
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +1 -1
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +1 -1
- package/dist/types/src/components/containers/Drawer.vue.d.ts +4 -4
- package/dist/types/src/components/containers/Iframe.vue.d.ts +42 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +5 -5
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +7 -7
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +1 -1
- package/dist/types/src/components/form/FormItem.vue.d.ts +1 -1
- package/dist/types/src/components/form/SearchItem.vue.d.ts +1 -1
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +10 -10
- package/dist/types/src/components/guide/Guide.vue.d.ts +116 -0
- package/dist/types/src/components/index.d.ts +2 -1
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +6 -6
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +6 -6
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +6 -6
- package/dist/types/src/components/inputs/Select.vue.d.ts +6 -6
- package/dist/types/src/components/inputs/Switch.vue.d.ts +9 -9
- package/dist/types/src/components/layout/Station.vue.d.ts +15 -4
- package/dist/types/src/components/layout/types.d.ts +2 -0
- package/dist/types/src/components/styles/Path.vue.d.ts +1 -1
- package/dist/types/src/components/styles/Tips.vue.d.ts +17 -0
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +5 -5
- package/dist/types/src/components/upload/Upload.vue.d.ts +5 -5
- package/dist/types/src/entries/guide.d.ts +9 -0
- package/dist/upload/index.mjs +1 -1
- package/dist/viewer/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunks/Drawer-ucXKUecL.mjs.map +0 -1
- package/dist/chunks/Iframe-CeSiMnvR.mjs +0 -65
- package/dist/chunks/Iframe-CeSiMnvR.mjs.map +0 -1
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs +0 -80
- package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map +0 -1
- package/dist/chunks/Station-BTP0SbBg.mjs.map +0 -1
- package/dist/chunks/Tips-IWCZcR1K.mjs +0 -63
- package/dist/chunks/Tips-IWCZcR1K.mjs.map +0 -1
- package/dist/chunks/http-C06mNpwY.mjs +0 -4141
- 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;
|
package/dist/upload/index.mjs
CHANGED
package/dist/viewer/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -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;;;;;"}
|