workdesktop-ai 1.2.1 → 1.2.2
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 +190 -190
- package/dist/chunks/Path-pIP0JQ0c.mjs +245 -0
- package/dist/chunks/Path-pIP0JQ0c.mjs.map +1 -0
- package/dist/chunks/Station-BTP0SbBg.mjs +818 -0
- package/dist/chunks/Station-BTP0SbBg.mjs.map +1 -0
- package/dist/index.esm.js +2 -2
- package/dist/index.umd.js +19 -19
- package/dist/index.umd.js.map +1 -1
- package/dist/path/index.mjs +1 -1
- package/dist/path/style.css +1 -1
- package/dist/station/index.mjs +1 -1
- package/dist/station/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +134 -0
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +169 -0
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +167 -0
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +186 -0
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +180 -0
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +122 -0
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +66 -0
- package/dist/types/src/components/buttons/useApiAction.d.ts +20 -0
- package/dist/types/src/components/common/props.d.ts +122 -0
- package/dist/types/src/components/containers/Drawer.vue.d.ts +172 -0
- package/dist/types/src/components/containers/Iframe.vue.d.ts +81 -0
- package/dist/types/src/components/containers/containerContext.d.ts +15 -0
- package/dist/types/src/components/containers/useContainerController.d.ts +24 -0
- package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
- package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +542 -0
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +62 -0
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
- package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchPanel.vue.d.ts +167 -0
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +311 -0
- package/dist/types/src/components/index.d.ts +32 -0
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/Select.vue.d.ts +176 -0
- package/dist/types/src/components/inputs/Switch.vue.d.ts +116 -0
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +32 -0
- package/dist/types/src/components/layout/Station.vue.d.ts +313 -0
- package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
- package/dist/types/src/components/layout/types.d.ts +67 -0
- package/dist/types/src/components/styles/Panel.vue.d.ts +94 -0
- package/dist/types/src/components/styles/Path.vue.d.ts +103 -0
- package/dist/types/src/components/styles/Tips.vue.d.ts +60 -0
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +176 -0
- package/dist/types/src/components/upload/Upload.vue.d.ts +235 -0
- package/dist/types/src/entries/api-button.d.ts +9 -0
- package/dist/types/src/entries/auto-complete.d.ts +9 -0
- package/dist/types/src/entries/checkbox-list.d.ts +9 -0
- package/dist/types/src/entries/components-map.d.ts +8 -0
- package/dist/types/src/entries/confirm-button.d.ts +9 -0
- package/dist/types/src/entries/data-form.d.ts +9 -0
- package/dist/types/src/entries/data-grid.d.ts +9 -0
- package/dist/types/src/entries/dialog-button.d.ts +9 -0
- package/dist/types/src/entries/drawer-button.d.ts +9 -0
- package/dist/types/src/entries/drawer.d.ts +9 -0
- package/dist/types/src/entries/editable-grid.d.ts +9 -0
- package/dist/types/src/entries/form-item.d.ts +9 -0
- package/dist/types/src/entries/iframe.d.ts +9 -0
- package/dist/types/src/entries/image-upload.d.ts +9 -0
- package/dist/types/src/entries/panel.d.ts +9 -0
- package/dist/types/src/entries/path.d.ts +9 -0
- package/dist/types/src/entries/prompt-button.d.ts +9 -0
- package/dist/types/src/entries/radio-list.d.ts +9 -0
- package/dist/types/src/entries/requester.d.ts +9 -0
- package/dist/types/src/entries/route-button.d.ts +9 -0
- package/dist/types/src/entries/search-item.d.ts +9 -0
- package/dist/types/src/entries/search-panel.d.ts +9 -0
- package/dist/types/src/entries/select.d.ts +9 -0
- package/dist/types/src/entries/station.d.ts +9 -0
- package/dist/types/src/entries/switch.d.ts +9 -0
- package/dist/types/src/entries/tips-button.d.ts +9 -0
- package/dist/types/src/entries/tips.d.ts +9 -0
- package/dist/types/src/entries/upload.d.ts +9 -0
- package/dist/types/src/entries/viewer.d.ts +9 -0
- package/dist/types/src/index.d.ts +24 -0
- package/dist/types/src/lib/composables/useConfig.d.ts +19 -0
- package/dist/types/src/lib/composables/useDataGrid.d.ts +69 -0
- package/dist/types/src/lib/composables/useEventBus.d.ts +16 -0
- package/dist/types/src/lib/composables/useGlobalState.d.ts +5 -0
- package/dist/types/src/lib/composables/useRequest.d.ts +42 -0
- package/dist/types/src/lib/configs/default-config.d.ts +6 -0
- package/dist/types/src/lib/core/config.d.ts +28 -0
- package/dist/types/src/lib/core/http.d.ts +100 -0
- package/dist/types/src/lib/core/linkage.d.ts +48 -0
- package/dist/types/src/lib/core/skins/apple.d.ts +3 -0
- package/dist/types/src/lib/core/skins/business.d.ts +3 -0
- package/dist/types/src/lib/core/skins/chinese.d.ts +3 -0
- package/dist/types/src/lib/core/skins/cool.d.ts +3 -0
- package/dist/types/src/lib/core/skins/cyberpunk.d.ts +3 -0
- package/dist/types/src/lib/core/skins/default.d.ts +3 -0
- package/dist/types/src/lib/core/skins/fashion.d.ts +3 -0
- package/dist/types/src/lib/core/skins/flat.d.ts +3 -0
- package/dist/types/src/lib/core/skins/governance.d.ts +3 -0
- package/dist/types/src/lib/core/skins/index.d.ts +15 -0
- package/dist/types/src/lib/core/skins/tech.d.ts +3 -0
- package/dist/types/src/lib/core/skins/types.d.ts +19 -0
- package/dist/types/src/lib/core/station-linkage.d.ts +72 -0
- package/dist/types/src/lib/core/theme.d.ts +11 -0
- package/dist/types/src/lib/core/utils.d.ts +28 -0
- package/dist/types/src/lib/install.d.ts +11 -0
- package/dist/types/src/types/config.d.ts +130 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/vite.config.d.ts +7 -0
- package/package.json +6 -1
- package/dist/chunks/Path-C_oyo6Dg.mjs +0 -200
- package/dist/chunks/Path-C_oyo6Dg.mjs.map +0 -1
- package/dist/chunks/Station-DLV19USa.mjs +0 -780
- package/dist/chunks/Station-DLV19USa.mjs.map +0 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkDesktop 全局配置类型(PRD 5.2)
|
|
3
|
+
*/
|
|
4
|
+
export type DeepPartial<T> = {
|
|
5
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
6
|
+
};
|
|
7
|
+
export interface RequestLoadingConfig {
|
|
8
|
+
enable: boolean;
|
|
9
|
+
props?: Record<string, any>;
|
|
10
|
+
}
|
|
11
|
+
export interface PageParamConfig {
|
|
12
|
+
/** 当前页字段名,默认 'currentPage' */
|
|
13
|
+
pageField: string;
|
|
14
|
+
/** 每页条数字段名,默认 'pageSize' */
|
|
15
|
+
sizeField: string;
|
|
16
|
+
/** 搜索条件外层字段名,默认 'param' */
|
|
17
|
+
searchField: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TransformConfig {
|
|
20
|
+
/** 请求拦截器(加 token 等),返回处理后的 axios config */
|
|
21
|
+
requestInterceptor?: (config: any) => any;
|
|
22
|
+
/** 响应拦截器 */
|
|
23
|
+
responseInterceptor?: (response: any) => any;
|
|
24
|
+
}
|
|
25
|
+
export interface RequestConfig {
|
|
26
|
+
/** 接口地址前缀 */
|
|
27
|
+
urlPrefix: string;
|
|
28
|
+
/** 网络异常是否抛出 */
|
|
29
|
+
throwException: boolean;
|
|
30
|
+
/** 并发相同请求合并去重(method+url+params 一致只发一次),默认 true;reqOptions.dedup 可单次覆盖 */
|
|
31
|
+
dedup: boolean;
|
|
32
|
+
loading: RequestLoadingConfig;
|
|
33
|
+
/** 透传给 axios 的配置(headers、timeout、withCredentials 等) */
|
|
34
|
+
axiosConfig: Record<string, any>;
|
|
35
|
+
pageParam: PageParamConfig;
|
|
36
|
+
transform: TransformConfig;
|
|
37
|
+
}
|
|
38
|
+
export interface ResponsePropsConfig {
|
|
39
|
+
codeName: string;
|
|
40
|
+
messageName: string;
|
|
41
|
+
dataName: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ResponseListConfig {
|
|
44
|
+
listName: string;
|
|
45
|
+
totalName: string;
|
|
46
|
+
pageSizeName: string;
|
|
47
|
+
currentPageName: string;
|
|
48
|
+
}
|
|
49
|
+
export interface TipsConfig {
|
|
50
|
+
/** 提示呈现方式:
|
|
51
|
+
* - 'message':轻量消息提示(ElMessage)
|
|
52
|
+
* - 'notify':右上角通知(ElNotification)
|
|
53
|
+
* - 'messagebox':模态弹框(ElMessageBox.alert),需用户手动确认
|
|
54
|
+
* - 'none':不提示
|
|
55
|
+
*/
|
|
56
|
+
tipsMode: 'message' | 'notify' | 'messagebox' | 'none';
|
|
57
|
+
/** 提示语义类型:success/warning/error/info */
|
|
58
|
+
tipsType: 'success' | 'warning' | 'error' | 'info';
|
|
59
|
+
/** 是否显示提示 */
|
|
60
|
+
showTips?: boolean;
|
|
61
|
+
/** 弹框标题(仅 messagebox 模式有效) */
|
|
62
|
+
title?: string;
|
|
63
|
+
/** 透传给对应组件的属性(ElMessage / ElNotification / ElMessageBox) */
|
|
64
|
+
props?: Record<string, any>;
|
|
65
|
+
}
|
|
66
|
+
export interface ResponseConfig {
|
|
67
|
+
props: ResponsePropsConfig;
|
|
68
|
+
/** code >= successCode 视为成功(负数为失败) */
|
|
69
|
+
successCode: number;
|
|
70
|
+
list: ResponseListConfig;
|
|
71
|
+
success: TipsConfig;
|
|
72
|
+
fail: TipsConfig;
|
|
73
|
+
exception: TipsConfig;
|
|
74
|
+
complete: {
|
|
75
|
+
tipsType: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface PagerConfig {
|
|
79
|
+
size: number;
|
|
80
|
+
pageSizes: number[];
|
|
81
|
+
pageSize: number;
|
|
82
|
+
layout: string;
|
|
83
|
+
hideOnSinglePage: boolean;
|
|
84
|
+
/** 分页在底栏的水平位置:left/center/right,默认 right */
|
|
85
|
+
position: 'left' | 'center' | 'right';
|
|
86
|
+
}
|
|
87
|
+
export interface PageConfig {
|
|
88
|
+
/** 全局尺寸:large/default/small */
|
|
89
|
+
global: {
|
|
90
|
+
size: string;
|
|
91
|
+
};
|
|
92
|
+
/** 按组件类型的默认配置,key 为组件 PascalName,如 WdDataGrid */
|
|
93
|
+
componentDefault: Record<string, any>;
|
|
94
|
+
pager: PagerConfig;
|
|
95
|
+
}
|
|
96
|
+
/** 预设皮肤名(与 lib/core/skins.ts 的 SKIN_PRESETS 一一对应) */
|
|
97
|
+
export type SkinName = 'default' | 'fashion' | 'business' | 'tech' | 'cyberpunk' | 'chinese' | 'flat' | 'cool' | 'governance' | 'apple';
|
|
98
|
+
export interface ThemeConfig {
|
|
99
|
+
/** 预设皮肤名,一键套用整套皮肤;colors/cssVars 可在皮肤基础上继续覆盖(优先级 cssVars > colors > skin) */
|
|
100
|
+
skin?: SkinName;
|
|
101
|
+
/** 语义令牌覆盖(primary/success/warning/danger/info) */
|
|
102
|
+
colors?: Record<string, string>;
|
|
103
|
+
/** CSS 变量覆盖(--wd-* / --el-*),优先级高于 colors */
|
|
104
|
+
cssVars?: Record<string, string>;
|
|
105
|
+
}
|
|
106
|
+
export interface WorkDesktopConfig {
|
|
107
|
+
/** 库版本号,界面上显示的版本号统一从这里读取(与 package.json version 保持一致) */
|
|
108
|
+
version: string;
|
|
109
|
+
page: PageConfig;
|
|
110
|
+
request: RequestConfig;
|
|
111
|
+
response: ResponseConfig;
|
|
112
|
+
theme: ThemeConfig;
|
|
113
|
+
}
|
|
114
|
+
/** 请求级覆盖项(PRD 5.1 reqOptions) */
|
|
115
|
+
export interface ReqOptions {
|
|
116
|
+
/** 是否显示 loading */
|
|
117
|
+
showLoading?: boolean;
|
|
118
|
+
/** 是否显示提示 */
|
|
119
|
+
showTips?: boolean;
|
|
120
|
+
/** 提示配置覆盖 */
|
|
121
|
+
tipsConfig?: Partial<Record<'success' | 'fail' | 'exception', TipsConfig>>;
|
|
122
|
+
/** 透传给 axios 的单次配置 */
|
|
123
|
+
axiosConfig?: Record<string, any>;
|
|
124
|
+
/** AbortSignal,用于中断 */
|
|
125
|
+
signal?: AbortSignal;
|
|
126
|
+
/** 单次请求是否参与去重(默认取全局 request.dedup) */
|
|
127
|
+
dedup?: boolean;
|
|
128
|
+
/** 是否列表请求(影响封包分页参数与解封列表结构),由调用方组件控制,http 不强制 */
|
|
129
|
+
[key: string]: any;
|
|
130
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workdesktop-ai",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "WorkDesktop 一个企业级 Vue3 组件库(基于 ElementPlus,HTML 模板渲染友好、AI 编码友好)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.umd.js",
|
|
@@ -141,6 +141,11 @@
|
|
|
141
141
|
"import": "./dist/viewer/index.mjs"
|
|
142
142
|
},
|
|
143
143
|
"./viewer/style.css": "./dist/viewer/style.css",
|
|
144
|
+
"./guide": {
|
|
145
|
+
"types": "./dist/types/src/entries/guide.d.ts",
|
|
146
|
+
"import": "./dist/guide/index.mjs"
|
|
147
|
+
},
|
|
148
|
+
"./guide/style.css": "./dist/guide/style.css",
|
|
144
149
|
"./package.json": "./package.json"
|
|
145
150
|
},
|
|
146
151
|
"sideEffects": [
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { defineComponent as Z, getCurrentInstance as ee, computed as d, ref as _, watch as f, onMounted as te, onUnmounted as ne, resolveComponent as S, openBlock as p, createElementBlock as V, createVNode as oe, withCtx as w, Fragment as re, renderList as ie, createBlock as x, normalizeClass as ce, resolveDynamicComponent as ae, createCommentVNode as le, createTextVNode as ue, toDisplayString as se } from "vue";
|
|
2
|
-
import * as me from "@element-plus/icons-vue";
|
|
3
|
-
import { f as de } from "./props-DAytpx7D.mjs";
|
|
4
|
-
import { b as q, g as fe } from "./station-linkage-D54-_iyL.mjs";
|
|
5
|
-
import { _ as pe } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
6
|
-
const he = { class: "wd-path" }, ve = /* @__PURE__ */ Z({
|
|
7
|
-
name: "WdPath",
|
|
8
|
-
__name: "Path",
|
|
9
|
-
props: {
|
|
10
|
-
...de,
|
|
11
|
-
/** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */
|
|
12
|
-
mode: { type: String, default: "manual" },
|
|
13
|
-
/** 手动模式路径节点(PathItem[],支持 JSON 字符串) */
|
|
14
|
-
items: { type: [Array, String], default: void 0 },
|
|
15
|
-
/** 自动模式:首页节点标题 */
|
|
16
|
-
home: { type: String, default: "首页" },
|
|
17
|
-
/** 自动模式:是否显示首页节点 */
|
|
18
|
-
showHome: { type: Boolean, default: !0 },
|
|
19
|
-
/** 分隔符 */
|
|
20
|
-
separator: { type: String, default: "/" },
|
|
21
|
-
/** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */
|
|
22
|
-
container: { type: [String, Object], default: void 0 }
|
|
23
|
-
},
|
|
24
|
-
emits: ["change", "item-click"],
|
|
25
|
-
setup($, { expose: D, emit: j }) {
|
|
26
|
-
const t = $, E = j, c = ee(), F = d(() => {
|
|
27
|
-
var n, o;
|
|
28
|
-
const e = (o = (n = c == null ? void 0 : c.appContext) == null ? void 0 : n.config) == null ? void 0 : o.globalProperties;
|
|
29
|
-
return !!(e != null && e.$router);
|
|
30
|
-
});
|
|
31
|
-
function J() {
|
|
32
|
-
if (!t.items) return [];
|
|
33
|
-
if (typeof t.items == "string")
|
|
34
|
-
try {
|
|
35
|
-
return JSON.parse(t.items);
|
|
36
|
-
} catch (e) {
|
|
37
|
-
return console.error("[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:", e), [];
|
|
38
|
-
}
|
|
39
|
-
return t.items;
|
|
40
|
-
}
|
|
41
|
-
const h = _(null), P = _([]), b = _([]), v = _(-1);
|
|
42
|
-
function A() {
|
|
43
|
-
var o;
|
|
44
|
-
const e = (o = c == null ? void 0 : c.proxy) == null ? void 0 : o.$el;
|
|
45
|
-
if (t.container) {
|
|
46
|
-
if (typeof t.container == "string") {
|
|
47
|
-
const r = document.querySelector(t.container);
|
|
48
|
-
if (r) return r;
|
|
49
|
-
} else if (t.container.nodeType === 1)
|
|
50
|
-
return t.container;
|
|
51
|
-
}
|
|
52
|
-
return (e == null ? void 0 : e.closest(".wd-station__content")) || document.body;
|
|
53
|
-
}
|
|
54
|
-
function z() {
|
|
55
|
-
const e = h.value || document.body, n = [];
|
|
56
|
-
return e.querySelectorAll("h1,h2,h3,h4").forEach((o) => {
|
|
57
|
-
const r = (o.textContent || "").trim();
|
|
58
|
-
r && n.push({ el: o, level: Number(o.tagName.charAt(1)), title: r });
|
|
59
|
-
}), n;
|
|
60
|
-
}
|
|
61
|
-
function U(e, n) {
|
|
62
|
-
const o = [];
|
|
63
|
-
for (let r = 0; r <= n; r++) {
|
|
64
|
-
const l = e[r];
|
|
65
|
-
for (; o.length && o[o.length - 1].level >= l.level; ) o.pop();
|
|
66
|
-
o.push(l);
|
|
67
|
-
}
|
|
68
|
-
return o.map((r) => ({ title: r.title, source: "heading", level: r.level }));
|
|
69
|
-
}
|
|
70
|
-
function I(e) {
|
|
71
|
-
return e === document.body || e === document.documentElement;
|
|
72
|
-
}
|
|
73
|
-
function N() {
|
|
74
|
-
const e = b.value;
|
|
75
|
-
if (!e.length) return -1;
|
|
76
|
-
const n = h.value || document.body, o = n.getBoundingClientRect(), r = I(n) ? window.scrollY || document.documentElement.scrollTop : n.scrollTop;
|
|
77
|
-
let l = e.length - 1;
|
|
78
|
-
for (let i = 0; i < e.length; i++)
|
|
79
|
-
if (e[i].el.getBoundingClientRect().top - o.top + r >= r - 1) {
|
|
80
|
-
l = i;
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
return l;
|
|
84
|
-
}
|
|
85
|
-
function g() {
|
|
86
|
-
P.value = fe(!0, t.filter).map((e) => ({
|
|
87
|
-
...e,
|
|
88
|
-
source: "menu"
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
91
|
-
function B() {
|
|
92
|
-
b.value = z(), v.value = N();
|
|
93
|
-
}
|
|
94
|
-
function u() {
|
|
95
|
-
if (t.mode !== "auto") {
|
|
96
|
-
C();
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
g(), B(), C();
|
|
100
|
-
}
|
|
101
|
-
const Y = d(() => {
|
|
102
|
-
const e = b.value;
|
|
103
|
-
return e.length ? v.value >= 0 ? U(e, v.value) : [] : [];
|
|
104
|
-
}), y = d(() => t.mode === "auto" ? [...t.showHome ? [{ title: t.home, source: "home" }] : [], ...P.value, ...Y.value] : J().map((e) => ({ ...e, source: e.source || "manual" }))), G = d(
|
|
105
|
-
() => y.value.map((e, n) => ({ ...e, key: `${e.source || "seg"}:${n}:${e.title}` }))
|
|
106
|
-
);
|
|
107
|
-
let R = "";
|
|
108
|
-
function C() {
|
|
109
|
-
const e = y.value.map((n) => `${n.level ?? ""}:${n.title}`).join("|");
|
|
110
|
-
e !== R && (R = e, E("change", y.value));
|
|
111
|
-
}
|
|
112
|
-
f(y, () => C());
|
|
113
|
-
let k = !1;
|
|
114
|
-
function H() {
|
|
115
|
-
t.mode !== "auto" || k || (k = !0, requestAnimationFrame(() => {
|
|
116
|
-
k = !1, t.mode === "auto" && (v.value = N());
|
|
117
|
-
}));
|
|
118
|
-
}
|
|
119
|
-
let s = null, m = null;
|
|
120
|
-
function M(e) {
|
|
121
|
-
O(), h.value = e, m = I(e) ? window : e, m.addEventListener("scroll", H, { passive: !0 }), typeof MutationObserver < "u" && (s = new MutationObserver(() => {
|
|
122
|
-
t.mode === "auto" && B();
|
|
123
|
-
}), s.observe(e, { childList: !0, subtree: !0 }));
|
|
124
|
-
}
|
|
125
|
-
function O() {
|
|
126
|
-
h.value = null, m == null || m.removeEventListener("scroll", H), m = null, s == null || s.disconnect(), s = null;
|
|
127
|
-
}
|
|
128
|
-
function K(e) {
|
|
129
|
-
E("item-click", e);
|
|
130
|
-
}
|
|
131
|
-
function T(e) {
|
|
132
|
-
return e ? typeof e == "string" ? me[e] || null : e : null;
|
|
133
|
-
}
|
|
134
|
-
let a = null;
|
|
135
|
-
function W() {
|
|
136
|
-
t.mode === "auto" && (a = q(t.filter, g), M(A()), u());
|
|
137
|
-
}
|
|
138
|
-
function L() {
|
|
139
|
-
O(), a == null || a(), a = null;
|
|
140
|
-
}
|
|
141
|
-
te(() => {
|
|
142
|
-
W(), u();
|
|
143
|
-
}), f(
|
|
144
|
-
() => t.mode,
|
|
145
|
-
(e) => {
|
|
146
|
-
e === "auto" ? W() : (L(), u());
|
|
147
|
-
}
|
|
148
|
-
), f(
|
|
149
|
-
() => t.filter,
|
|
150
|
-
() => {
|
|
151
|
-
t.mode === "auto" && (a == null || a(), a = q(t.filter, g), g());
|
|
152
|
-
}
|
|
153
|
-
), f(
|
|
154
|
-
() => t.container,
|
|
155
|
-
() => {
|
|
156
|
-
t.mode === "auto" && M(A()), u();
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
const Q = d(() => {
|
|
160
|
-
var e, n;
|
|
161
|
-
return (n = (e = c == null ? void 0 : c.proxy) == null ? void 0 : e.$route) == null ? void 0 : n.path;
|
|
162
|
-
});
|
|
163
|
-
return f(Q, () => {
|
|
164
|
-
t.mode === "auto" && u();
|
|
165
|
-
}), ne(() => L()), D({ refresh: u }), (e, n) => {
|
|
166
|
-
const o = S("el-icon"), r = S("el-breadcrumb-item"), l = S("el-breadcrumb");
|
|
167
|
-
return p(), V("div", he, [
|
|
168
|
-
oe(l, { separator: $.separator }, {
|
|
169
|
-
default: w(() => [
|
|
170
|
-
(p(!0), V(re, null, ie(G.value, (i) => (p(), x(r, {
|
|
171
|
-
key: i.key,
|
|
172
|
-
class: ce({ "is-heading": i.source === "heading", "is-active": i.source === "heading" || i.source === "home" }),
|
|
173
|
-
to: i.path && F.value ? { path: i.path } : void 0,
|
|
174
|
-
onClick: (X) => K(i)
|
|
175
|
-
}, {
|
|
176
|
-
default: w(() => [
|
|
177
|
-
T(i.icon) ? (p(), x(o, {
|
|
178
|
-
key: 0,
|
|
179
|
-
class: "wd-path__icon"
|
|
180
|
-
}, {
|
|
181
|
-
default: w(() => [
|
|
182
|
-
(p(), x(ae(T(i.icon))))
|
|
183
|
-
]),
|
|
184
|
-
_: 2
|
|
185
|
-
}, 1024)) : le("", !0),
|
|
186
|
-
ue(" " + se(i.title), 1)
|
|
187
|
-
]),
|
|
188
|
-
_: 2
|
|
189
|
-
}, 1032, ["class", "to", "onClick"]))), 128))
|
|
190
|
-
]),
|
|
191
|
-
_: 1
|
|
192
|
-
}, 8, ["separator"])
|
|
193
|
-
]);
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
}), ke = /* @__PURE__ */ pe(ve, [["__scopeId", "data-v-1d53e66a"]]);
|
|
197
|
-
export {
|
|
198
|
-
ke as W
|
|
199
|
-
};
|
|
200
|
-
//# sourceMappingURL=Path-C_oyo6Dg.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Path-C_oyo6Dg.mjs","sources":["../../src/components/styles/Path.vue"],"sourcesContent":["<template>\n <div class=\"wd-path\">\n <el-breadcrumb :separator=\"separator\">\n <el-breadcrumb-item\n v-for=\"seg in segmentViews\"\n :key=\"seg.key\"\n :class=\"{ 'is-heading': seg.source === 'heading', 'is-active': seg.source === 'heading' || seg.source === 'home' }\"\n :to=\"seg.path && hasRouter ? { path: seg.path } : undefined\"\n @click=\"onSegmentClick(seg)\"\n >\n <el-icon v-if=\"resolveIcon(seg.icon)\" class=\"wd-path__icon\">\n <component :is=\"resolveIcon(seg.icon)\" />\n </el-icon>\n {{ seg.title }}\n </el-breadcrumb-item>\n </el-breadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n onMounted,\n onUnmounted,\n ref,\n watch,\n type PropType\n} from 'vue'\nimport * as ElIcons from '@element-plus/icons-vue'\nimport { filterProp } from '../common/props'\nimport { getStationMenuChain, subscribeStationChange } from '../../lib/core/station-linkage'\nimport type { PathItem } from '../layout/types'\n\ndefineOptions({ name: 'WdPath' })\n\nconst props = defineProps({\n ...filterProp,\n /** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */\n mode: { type: String as PropType<'manual' | 'auto'>, default: 'manual' },\n /** 手动模式路径节点(PathItem[],支持 JSON 字符串) */\n items: { type: [Array, String] as PropType<PathItem[] | string>, default: undefined },\n /** 自动模式:首页节点标题 */\n home: { type: String, default: '首页' },\n /** 自动模式:是否显示首页节点 */\n showHome: { type: Boolean, default: true },\n /** 分隔符 */\n separator: { type: String, default: '/' },\n /** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */\n container: { type: [String, Object] as PropType<string | HTMLElement>, default: undefined }\n})\n\nconst emit = defineEmits<{\n (e: 'change', segments: PathItem[]): void\n (e: 'item-click', item: PathItem): void\n}>()\n\nconst instance = getCurrentInstance()\nconst hasRouter = computed(() => {\n const root = instance?.appContext?.config?.globalProperties as any\n return !!(root?.$router)\n})\n\n/* ---------- 手动模式:路径解析 ---------- */\nfunction parseItems(): PathItem[] {\n if (!props.items) return []\n if (typeof props.items === 'string') {\n try {\n return JSON.parse(props.items)\n } catch (e) {\n console.error('[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:', e)\n return []\n }\n }\n return props.items\n}\n\n/* ---------- 自动模式:标题扫描 ---------- */\ninterface HeadingNode {\n el: HTMLElement\n level: number\n title: string\n}\n\nconst containerEl = ref<HTMLElement | null>(null)\nconst menuChain = ref<PathItem[]>([])\nconst headings = ref<HeadingNode[]>([])\nconst activeIndex = ref(-1)\n\nfunction resolveContainer(): HTMLElement {\n const root = instance?.proxy?.$el as HTMLElement | undefined\n if (props.container) {\n if (typeof props.container === 'string') {\n const el = document.querySelector(props.container)\n if (el) return el as HTMLElement\n } else if ((props.container as HTMLElement).nodeType === 1) {\n return props.container as HTMLElement\n }\n }\n // 默认:最近的 Station 内容区;无则整页\n const content = root?.closest('.wd-station__content') as HTMLElement | null\n return content || document.body\n}\n\nfunction collectHeadings(): HeadingNode[] {\n const container = containerEl.value || document.body\n const nodes: HeadingNode[] = []\n container.querySelectorAll('h1,h2,h3,h4').forEach((el) => {\n const title = (el.textContent || '').trim()\n if (!title) return\n nodes.push({ el: el as HTMLElement, level: Number(el.tagName.charAt(1)), title })\n })\n return nodes\n}\n\n/** 大纲链:以 end 位置的标题为终点,逐级收敛(h1→h2→h3→h4) */\nfunction buildChain(list: HeadingNode[], end: number): PathItem[] {\n const stack: HeadingNode[] = []\n for (let i = 0; i <= end; i++) {\n const h = list[i]\n while (stack.length && stack[stack.length - 1].level >= h.level) stack.pop()\n stack.push(h)\n }\n return stack.map((h) => ({ title: h.title, source: 'heading', level: h.level } as PathItem))\n}\n\nfunction isPageContainer(el: HTMLElement): boolean {\n return el === document.body || el === document.documentElement\n}\n\n/** 当前可视范围内的第一个标题:容器滚动位置处最先映入视口/容器顶部的 H1~H4(滚动跟随) */\nfunction computeActiveIndex(): number {\n const list = headings.value\n if (!list.length) return -1\n const container = containerEl.value || document.body\n const cRect = container.getBoundingClientRect()\n const scrollTop = isPageContainer(container)\n ? window.scrollY || document.documentElement.scrollTop\n : container.scrollTop\n // 默认取最后一个(全部标题均已滚出顶部时,锚定末尾章节)\n let active = list.length - 1\n for (let i = 0; i < list.length; i++) {\n const hRect = list[i].el.getBoundingClientRect()\n const top = hRect.top - cRect.top + scrollTop\n // 容器滚动内容中,位置位于可视区起点(scrollTop)之下的第一个标题即当前章节\n if (top >= scrollTop - 1) { active = i; break }\n }\n return active\n}\n\n/* ---------- 自动模式:数据刷新 ---------- */\nfunction refreshMenuChain() {\n menuChain.value = getStationMenuChain(true, props.filter).map((c) => ({\n ...c,\n source: 'menu'\n }) as PathItem)\n}\n\nfunction refreshHeadings() {\n headings.value = collectHeadings()\n activeIndex.value = computeActiveIndex()\n}\n\n/** 完整刷新(手动模式仅触发 change 事件;自动模式重读菜单链与标题) */\nfunction refresh() {\n if (props.mode !== 'auto') {\n emitChange()\n return\n }\n refreshMenuChain()\n refreshHeadings()\n emitChange()\n}\n\n/* ---------- 段组装 ---------- */\nconst displayHeadings = computed<PathItem[]>(() => {\n const list = headings.value\n if (!list.length) return []\n return activeIndex.value >= 0 ? buildChain(list, activeIndex.value) : []\n})\n\nconst segments = computed<PathItem[]>(() => {\n if (props.mode === 'auto') {\n const head: PathItem[] = props.showHome ? [{ title: props.home, source: 'home' }] : []\n return [...head, ...menuChain.value, ...displayHeadings.value]\n }\n return parseItems().map((it) => ({ ...it, source: it.source || 'manual' }))\n})\n\nconst segmentViews = computed(() =>\n segments.value.map((s, i) => ({ ...s, key: `${s.source || 'seg'}:${i}:${s.title}` }))\n)\n\nlet lastSig = ''\nfunction emitChange() {\n const sig = segments.value.map((s) => `${s.level ?? ''}:${s.title}`).join('|')\n if (sig === lastSig) return\n lastSig = sig\n emit('change', segments.value)\n}\n\nwatch(segments, () => emitChange())\n\n/* ---------- 容器事件绑定(标题扫描 + 滚动跟随当前可视范围内第一个标题) ---------- */\nlet scrollTicking = false\nfunction onScroll() {\n if (props.mode !== 'auto' || scrollTicking) return\n scrollTicking = true\n requestAnimationFrame(() => {\n scrollTicking = false\n if (props.mode === 'auto') {\n activeIndex.value = computeActiveIndex()\n }\n })\n}\n\nlet observer: MutationObserver | null = null\nlet scrollTarget: HTMLElement | Window | null = null\nfunction bindContainer(el: HTMLElement) {\n unbindContainer()\n containerEl.value = el\n // 页面级容器(body/documentElement)滚动事件挂在 window;元素级挂在自身\n scrollTarget = isPageContainer(el) ? window : el\n scrollTarget.addEventListener('scroll', onScroll, { passive: true })\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver(() => {\n if (props.mode === 'auto') refreshHeadings()\n })\n observer.observe(el, { childList: true, subtree: true })\n }\n}\n\nfunction unbindContainer() {\n containerEl.value = null\n scrollTarget?.removeEventListener('scroll', onScroll)\n scrollTarget = null\n observer?.disconnect()\n observer = null\n}\n\n/* ---------- 事件 ---------- */\nfunction onSegmentClick(seg: PathItem) {\n emit('item-click', seg)\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\n/* ---------- 生命周期:自动模式联动(Station 菜单链 + 路由 + 标题) ---------- */\nlet unsub: (() => void) | null = null\nfunction bindAuto() {\n if (props.mode !== 'auto') return\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n bindContainer(resolveContainer())\n refresh()\n}\n\nfunction unbindAuto() {\n unbindContainer()\n unsub?.()\n unsub = null\n}\n\nonMounted(() => {\n bindAuto()\n refresh()\n})\n\nwatch(\n () => props.mode,\n (mode) => {\n if (mode === 'auto') {\n bindAuto()\n } else {\n unbindAuto()\n refresh()\n }\n }\n)\n\nwatch(\n () => props.filter,\n () => {\n if (props.mode !== 'auto') return\n unsub?.()\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n refreshMenuChain()\n }\n)\n\n// 容器变化(如 :container=\"ref\" 延迟就绪)→ 重绑并重扫\nwatch(\n () => props.container,\n () => {\n if (props.mode === 'auto') bindContainer(resolveContainer())\n refresh()\n }\n)\n\n// router 模式:路由变化 → 重读菜单链与标题\nconst routePath = computed(() => (instance?.proxy as any)?.$route?.path)\nwatch(routePath, () => {\n if (props.mode === 'auto') refresh()\n})\n\nonUnmounted(() => unbindAuto())\n\ndefineExpose({ refresh })\n</script>\n\n<style scoped>\n.wd-path {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n}\n.wd-path :deep(.el-breadcrumb__item) {\n max-width: 260px;\n overflow: hidden;\n white-space: nowrap;\n}\n.wd-path :deep(.el-breadcrumb__inner) {\n display: inline-flex;\n align-items: center;\n color: var(--wd-text-color-secondary, #909399);\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link) {\n color: var(--wd-color-primary, #409eff);\n font-weight: 400;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link:hover) {\n color: var(--wd-color-primary-light-3, #79bbff);\n}\n/* 首页与标题段:主色加粗,标识当前位置 */\n.wd-path :deep(.el-breadcrumb__item.is-active .el-breadcrumb__inner) {\n color: var(--wd-text-color-primary, #303133);\n font-weight: 600;\n}\n.wd-path__icon {\n margin-right: 4px;\n vertical-align: -2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","instance","getCurrentInstance","hasRouter","computed","root","_b","_a","parseItems","containerEl","ref","menuChain","headings","activeIndex","resolveContainer","el","collectHeadings","container","nodes","title","buildChain","list","end","stack","i","h","isPageContainer","computeActiveIndex","cRect","scrollTop","active","refreshMenuChain","getStationMenuChain","c","refreshHeadings","refresh","emitChange","displayHeadings","segments","it","segmentViews","s","lastSig","sig","watch","scrollTicking","onScroll","observer","scrollTarget","bindContainer","unbindContainer","onSegmentClick","seg","resolveIcon","icon","ElIcons","unsub","bindAuto","subscribeStationChange","unbindAuto","onMounted","mode","routePath","onUnmounted","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_breadcrumb","_Fragment","_renderList","_createBlock","_component_el_breadcrumb_item","_normalizeClass","$event","_component_el_icon","_resolveDynamicComponent","_toDisplayString"],"mappings":"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"}
|