workdesktop-ai 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -6
- package/README.md +26 -13
- package/dist/api-button/index.mjs +1 -1
- package/dist/auto-complete/index.mjs +1 -1
- package/dist/base.css +1 -1
- package/dist/checkbox-list/index.mjs +1 -1
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs} +2 -2
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map} +1 -1
- package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs → AutoComplete-C6Nxatvt.mjs} +2 -2
- package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs.map → AutoComplete-C6Nxatvt.mjs.map} +1 -1
- package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs → CheckboxList-5AEx33r5.mjs} +2 -2
- package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs.map → CheckboxList-5AEx33r5.mjs.map} +1 -1
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs} +2 -2
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map} +1 -1
- package/dist/chunks/{DataForm-C5MBVdei.mjs → DataForm-C6VLTSOm.mjs} +16 -16
- package/dist/chunks/{DataForm-C5MBVdei.mjs.map → DataForm-C6VLTSOm.mjs.map} +1 -1
- package/dist/chunks/{DataGrid-HUzKWuQx.mjs → DataGrid-Dd7n5JM7.mjs} +4 -4
- package/dist/chunks/{DataGrid-HUzKWuQx.mjs.map → DataGrid-Dd7n5JM7.mjs.map} +1 -1
- package/dist/chunks/{EditableGrid-C8A-nJZv.mjs → EditableGrid-CDeeVkaX.mjs} +330 -333
- package/dist/chunks/EditableGrid-CDeeVkaX.mjs.map +1 -0
- package/dist/chunks/{ImageUpload-DGehzaYa.mjs → ImageUpload-CQA9XQ7Q.mjs} +2 -2
- package/dist/chunks/{ImageUpload-DGehzaYa.mjs.map → ImageUpload-CQA9XQ7Q.mjs.map} +1 -1
- package/dist/chunks/{Panel-CrRqBTj6.mjs → Panel-BHqAeBaH.mjs} +8 -8
- package/dist/chunks/Panel-BHqAeBaH.mjs.map +1 -0
- package/dist/chunks/Path-C_oyo6Dg.mjs +200 -0
- package/dist/chunks/Path-C_oyo6Dg.mjs.map +1 -0
- package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs} +2 -2
- package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map} +1 -1
- package/dist/chunks/{RadioList-vE8JOuST.mjs → RadioList-BUWcP_Pk.mjs} +2 -2
- package/dist/chunks/{RadioList-vE8JOuST.mjs.map → RadioList-BUWcP_Pk.mjs.map} +1 -1
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs} +2 -2
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map} +1 -1
- package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs → SearchPanel-DPlWWuXb.mjs} +2 -2
- package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs.map → SearchPanel-DPlWWuXb.mjs.map} +1 -1
- package/dist/chunks/{Select-DAGZDXvI.mjs → Select-uvFy7_NU.mjs} +2 -2
- package/dist/chunks/{Select-DAGZDXvI.mjs.map → Select-uvFy7_NU.mjs.map} +1 -1
- package/dist/chunks/Station-DLV19USa.mjs +780 -0
- package/dist/chunks/Station-DLV19USa.mjs.map +1 -0
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs} +2 -2
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs.map} +1 -1
- package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs} +2 -2
- package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map} +1 -1
- package/dist/chunks/{Viewer-iub6TjoD.mjs → Viewer-CjLSQTrw.mjs} +2 -2
- package/dist/chunks/{Viewer-iub6TjoD.mjs.map → Viewer-CjLSQTrw.mjs.map} +1 -1
- package/dist/chunks/http-C06mNpwY.mjs +4141 -0
- package/dist/chunks/http-C06mNpwY.mjs.map +1 -0
- package/dist/chunks/station-linkage-D54-_iyL.mjs +77 -0
- package/dist/chunks/station-linkage-D54-_iyL.mjs.map +1 -0
- package/dist/chunks/{useApiAction-6_vvf5Fd.mjs → useApiAction-DxVQWWxv.mjs} +2 -2
- package/dist/chunks/{useApiAction-6_vvf5Fd.mjs.map → useApiAction-DxVQWWxv.mjs.map} +1 -1
- package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs → useColumnSettings-BwG2V9xp.mjs} +2 -2
- package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs.map → useColumnSettings-BwG2V9xp.mjs.map} +1 -1
- package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs → useOptionsLoader-DEVCYhrp.mjs} +2 -2
- package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs.map → useOptionsLoader-DEVCYhrp.mjs.map} +1 -1
- package/dist/confirm-button/index.mjs +1 -1
- package/dist/data-form/index.mjs +1 -1
- package/dist/data-form/style.css +1 -1
- package/dist/data-grid/index.mjs +1 -1
- package/dist/data-grid/style.css +1 -1
- package/dist/editable-grid/index.mjs +1 -1
- package/dist/editable-grid/style.css +1 -1
- package/dist/image-upload/index.mjs +1 -1
- package/dist/index.esm.js +133 -124
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +705 -15
- package/dist/index.umd.js.map +1 -1
- package/dist/panel/index.mjs +1 -1
- package/dist/panel/style.css +1 -1
- package/dist/path/index.mjs +7 -0
- package/dist/path/index.mjs.map +1 -0
- package/dist/path/style.css +1 -0
- 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/search-panel/index.mjs +1 -1
- package/dist/search-panel/style.css +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/upload/index.mjs +1 -1
- package/dist/viewer/index.mjs +1 -1
- package/llms.txt +99 -9
- package/package.json +6 -1
- package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +0 -1
- package/dist/chunks/Panel-CrRqBTj6.mjs.map +0 -1
- package/dist/chunks/Station-BF_QlQ8c.mjs +0 -796
- package/dist/chunks/Station-BF_QlQ8c.mjs.map +0 -1
- package/dist/chunks/http-Bs-dM076.mjs +0 -2951
- package/dist/chunks/http-Bs-dM076.mjs.map +0 -1
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +0 -134
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +0 -169
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +0 -167
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +0 -186
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +0 -317
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +0 -180
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +0 -122
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +0 -66
- package/dist/types/src/components/buttons/useApiAction.d.ts +0 -20
- package/dist/types/src/components/common/props.d.ts +0 -122
- package/dist/types/src/components/containers/Drawer.vue.d.ts +0 -172
- package/dist/types/src/components/containers/Iframe.vue.d.ts +0 -81
- package/dist/types/src/components/containers/containerContext.d.ts +0 -15
- package/dist/types/src/components/containers/useContainerController.d.ts +0 -24
- package/dist/types/src/components/containers/useIframeContainer.d.ts +0 -20
- package/dist/types/src/components/core/Requester.vue.d.ts +0 -41
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +0 -542
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +0 -62
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +0 -586
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +0 -187
- package/dist/types/src/components/form/FormItem.vue.d.ts +0 -62
- package/dist/types/src/components/form/SearchItem.vue.d.ts +0 -62
- package/dist/types/src/components/form/SearchPanel.vue.d.ts +0 -167
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +0 -311
- package/dist/types/src/components/index.d.ts +0 -31
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +0 -166
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +0 -166
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +0 -166
- package/dist/types/src/components/inputs/Select.vue.d.ts +0 -176
- package/dist/types/src/components/inputs/Switch.vue.d.ts +0 -116
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +0 -32
- package/dist/types/src/components/layout/Station.vue.d.ts +0 -302
- package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +0 -20
- package/dist/types/src/components/layout/types.d.ts +0 -54
- package/dist/types/src/components/styles/Panel.vue.d.ts +0 -94
- package/dist/types/src/components/styles/Tips.vue.d.ts +0 -60
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +0 -176
- package/dist/types/src/components/upload/Upload.vue.d.ts +0 -235
- package/dist/types/src/entries/api-button.d.ts +0 -9
- package/dist/types/src/entries/auto-complete.d.ts +0 -9
- package/dist/types/src/entries/checkbox-list.d.ts +0 -9
- package/dist/types/src/entries/components-map.d.ts +0 -8
- package/dist/types/src/entries/confirm-button.d.ts +0 -9
- package/dist/types/src/entries/data-form.d.ts +0 -9
- package/dist/types/src/entries/data-grid.d.ts +0 -9
- package/dist/types/src/entries/dialog-button.d.ts +0 -9
- package/dist/types/src/entries/drawer-button.d.ts +0 -9
- package/dist/types/src/entries/drawer.d.ts +0 -9
- package/dist/types/src/entries/editable-grid.d.ts +0 -9
- package/dist/types/src/entries/form-item.d.ts +0 -9
- package/dist/types/src/entries/iframe.d.ts +0 -9
- package/dist/types/src/entries/image-upload.d.ts +0 -9
- package/dist/types/src/entries/panel.d.ts +0 -9
- package/dist/types/src/entries/prompt-button.d.ts +0 -9
- package/dist/types/src/entries/radio-list.d.ts +0 -9
- package/dist/types/src/entries/requester.d.ts +0 -9
- package/dist/types/src/entries/route-button.d.ts +0 -9
- package/dist/types/src/entries/search-item.d.ts +0 -9
- package/dist/types/src/entries/search-panel.d.ts +0 -9
- package/dist/types/src/entries/select.d.ts +0 -9
- package/dist/types/src/entries/station.d.ts +0 -9
- package/dist/types/src/entries/switch.d.ts +0 -9
- package/dist/types/src/entries/tips-button.d.ts +0 -9
- package/dist/types/src/entries/tips.d.ts +0 -9
- package/dist/types/src/entries/upload.d.ts +0 -9
- package/dist/types/src/entries/viewer.d.ts +0 -9
- package/dist/types/src/index.d.ts +0 -21
- package/dist/types/src/lib/composables/useConfig.d.ts +0 -19
- package/dist/types/src/lib/composables/useDataGrid.d.ts +0 -69
- package/dist/types/src/lib/composables/useEventBus.d.ts +0 -16
- package/dist/types/src/lib/composables/useGlobalState.d.ts +0 -5
- package/dist/types/src/lib/composables/useRequest.d.ts +0 -42
- package/dist/types/src/lib/configs/default-config.d.ts +0 -6
- package/dist/types/src/lib/core/config.d.ts +0 -28
- package/dist/types/src/lib/core/http.d.ts +0 -100
- package/dist/types/src/lib/core/linkage.d.ts +0 -48
- package/dist/types/src/lib/core/station-linkage.d.ts +0 -41
- package/dist/types/src/lib/core/theme.d.ts +0 -6
- package/dist/types/src/lib/core/utils.d.ts +0 -28
- package/dist/types/src/lib/install.d.ts +0 -11
- package/dist/types/src/types/config.d.ts +0 -126
- package/dist/types/src/types/index.d.ts +0 -4
- package/dist/types/vite.config.d.ts +0 -7
|
@@ -0,0 +1,200 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,UAAMA,IAAQC,GAgBRC,IAAOC,GAKPC,IAAWC,GAAA,GACXC,IAAYC,EAAS,MAAM;;AAC/B,YAAMC,KAAOC,KAAAC,IAAAN,KAAA,gBAAAA,EAAU,eAAV,gBAAAM,EAAsB,WAAtB,gBAAAD,EAA8B;AAC3C,aAAO,CAAC,EAAED,KAAA,QAAAA,EAAM;AAAA,IAClB,CAAC;AAGD,aAASG,IAAyB;AAChC,UAAI,CAACX,EAAM,MAAO,QAAO,CAAA;AACzB,UAAI,OAAOA,EAAM,SAAU;AACzB,YAAI;AACF,iBAAO,KAAK,MAAMA,EAAM,KAAK;AAAA,QAC/B,SAAS,GAAG;AACV,yBAAQ,MAAM,gDAAgD,CAAC,GACxD,CAAA;AAAA,QACT;AAEF,aAAOA,EAAM;AAAA,IACf;AASA,UAAMY,IAAcC,EAAwB,IAAI,GAC1CC,IAAYD,EAAgB,EAAE,GAC9BE,IAAWF,EAAmB,EAAE,GAChCG,IAAcH,EAAI,EAAE;AAE1B,aAASI,IAAgC;;AACvC,YAAMT,KAAOE,IAAAN,KAAA,gBAAAA,EAAU,UAAV,gBAAAM,EAAiB;AAC9B,UAAIV,EAAM;AACR,YAAI,OAAOA,EAAM,aAAc,UAAU;AACvC,gBAAMkB,IAAK,SAAS,cAAclB,EAAM,SAAS;AACjD,cAAIkB,EAAI,QAAOA;AAAA,QACjB,WAAYlB,EAAM,UAA0B,aAAa;AACvD,iBAAOA,EAAM;AAAA;AAKjB,cADgBQ,KAAA,gBAAAA,EAAM,QAAQ,4BACZ,SAAS;AAAA,IAC7B;AAEA,aAASW,IAAiC;AACxC,YAAMC,IAAYR,EAAY,SAAS,SAAS,MAC1CS,IAAuB,CAAA;AAC7B,aAAAD,EAAU,iBAAiB,aAAa,EAAE,QAAQ,CAACF,MAAO;AACxD,cAAMI,KAASJ,EAAG,eAAe,IAAI,KAAA;AACrC,QAAKI,KACLD,EAAM,KAAK,EAAE,IAAAH,GAAuB,OAAO,OAAOA,EAAG,QAAQ,OAAO,CAAC,CAAC,GAAG,OAAAI,EAAA,CAAO;AAAA,MAClF,CAAC,GACMD;AAAA,IACT;AAGA,aAASE,EAAWC,GAAqBC,GAAyB;AAChE,YAAMC,IAAuB,CAAA;AAC7B,eAASC,IAAI,GAAGA,KAAKF,GAAKE,KAAK;AAC7B,cAAMC,IAAIJ,EAAKG,CAAC;AAChB,eAAOD,EAAM,UAAUA,EAAMA,EAAM,SAAS,CAAC,EAAE,SAASE,EAAE,QAAO,CAAAF,EAAM,IAAA;AACvE,QAAAA,EAAM,KAAKE,CAAC;AAAA,MACd;AACA,aAAOF,EAAM,IAAI,CAACE,OAAO,EAAE,OAAOA,EAAE,OAAO,QAAQ,WAAW,OAAOA,EAAE,QAAoB;AAAA,IAC7F;AAEA,aAASC,EAAgBX,GAA0B;AACjD,aAAOA,MAAO,SAAS,QAAQA,MAAO,SAAS;AAAA,IACjD;AAGA,aAASY,IAA6B;AACpC,YAAMN,IAAOT,EAAS;AACtB,UAAI,CAACS,EAAK,OAAQ,QAAO;AACzB,YAAMJ,IAAYR,EAAY,SAAS,SAAS,MAC1CmB,IAAQX,EAAU,sBAAA,GAClBY,IAAYH,EAAgBT,CAAS,IACvC,OAAO,WAAW,SAAS,gBAAgB,YAC3CA,EAAU;AAEd,UAAIa,IAAST,EAAK,SAAS;AAC3B,eAAS,IAAI,GAAG,IAAIA,EAAK,QAAQ;AAI/B,YAHcA,EAAK,CAAC,EAAE,GAAG,sBAAA,EACP,MAAMO,EAAM,MAAMC,KAEzBA,IAAY,GAAG;AAAE,UAAAC,IAAS;AAAG;AAAA,QAAM;AAEhD,aAAOA;AAAA,IACT;AAGA,aAASC,IAAmB;AAC1B,MAAApB,EAAU,QAAQqB,GAAoB,IAAMnC,EAAM,MAAM,EAAE,IAAI,CAACoC,OAAO;AAAA,QACpE,GAAGA;AAAA,QACH,QAAQ;AAAA,MAAA,EACI;AAAA,IAChB;AAEA,aAASC,IAAkB;AACzB,MAAAtB,EAAS,QAAQI,EAAA,GACjBH,EAAY,QAAQc,EAAA;AAAA,IACtB;AAGA,aAASQ,IAAU;AACjB,UAAItC,EAAM,SAAS,QAAQ;AACzB,QAAAuC,EAAA;AACA;AAAA,MACF;AACA,MAAAL,EAAA,GACAG,EAAA,GACAE,EAAA;AAAA,IACF;AAGA,UAAMC,IAAkBjC,EAAqB,MAAM;AACjD,YAAMiB,IAAOT,EAAS;AACtB,aAAKS,EAAK,SACHR,EAAY,SAAS,IAAIO,EAAWC,GAAMR,EAAY,KAAK,IAAI,CAAA,IAD7C,CAAA;AAAA,IAE3B,CAAC,GAEKyB,IAAWlC,EAAqB,MAChCP,EAAM,SAAS,SAEV,CAAC,GADiBA,EAAM,WAAW,CAAC,EAAE,OAAOA,EAAM,MAAM,QAAQ,OAAA,CAAQ,IAAI,CAAA,GACnE,GAAGc,EAAU,OAAO,GAAG0B,EAAgB,KAAK,IAExD7B,EAAA,EAAa,IAAI,CAAC+B,OAAQ,EAAE,GAAGA,GAAI,QAAQA,EAAG,UAAU,SAAA,EAAW,CAC3E,GAEKC,IAAepC;AAAA,MAAS,MAC5BkC,EAAS,MAAM,IAAI,CAACG,GAAGjB,OAAO,EAAE,GAAGiB,GAAG,KAAK,GAAGA,EAAE,UAAU,KAAK,IAAIjB,CAAC,IAAIiB,EAAE,KAAK,KAAK;AAAA,IAAA;AAGtF,QAAIC,IAAU;AACd,aAASN,IAAa;AACpB,YAAMO,IAAML,EAAS,MAAM,IAAI,CAACG,MAAM,GAAGA,EAAE,SAAS,EAAE,IAAIA,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG;AAC7E,MAAIE,MAAQD,MACZA,IAAUC,GACV5C,EAAK,UAAUuC,EAAS,KAAK;AAAA,IAC/B;AAEA,IAAAM,EAAMN,GAAU,MAAMF,GAAY;AAGlC,QAAIS,IAAgB;AACpB,aAASC,IAAW;AAClB,MAAIjD,EAAM,SAAS,UAAUgD,MAC7BA,IAAgB,IAChB,sBAAsB,MAAM;AAC1B,QAAAA,IAAgB,IACZhD,EAAM,SAAS,WACjBgB,EAAY,QAAQc,EAAA;AAAA,MAExB,CAAC;AAAA,IACH;AAEA,QAAIoB,IAAoC,MACpCC,IAA4C;AAChD,aAASC,EAAclC,GAAiB;AACtC,MAAAmC,EAAA,GACAzC,EAAY,QAAQM,GAEpBiC,IAAetB,EAAgBX,CAAE,IAAI,SAASA,GAC9CiC,EAAa,iBAAiB,UAAUF,GAAU,EAAE,SAAS,IAAM,GAC/D,OAAO,mBAAqB,QAC9BC,IAAW,IAAI,iBAAiB,MAAM;AACpC,QAAIlD,EAAM,SAAS,UAAQqC,EAAA;AAAA,MAC7B,CAAC,GACDa,EAAS,QAAQhC,GAAI,EAAE,WAAW,IAAM,SAAS,IAAM;AAAA,IAE3D;AAEA,aAASmC,IAAkB;AACzB,MAAAzC,EAAY,QAAQ,MACpBuC,KAAA,QAAAA,EAAc,oBAAoB,UAAUF,IAC5CE,IAAe,MACfD,KAAA,QAAAA,EAAU,cACVA,IAAW;AAAA,IACb;AAGA,aAASI,EAAeC,GAAe;AACrC,MAAArD,EAAK,cAAcqD,CAAG;AAAA,IACxB;AAEA,aAASC,EAAYC,GAAW;AAC9B,aAAKA,IACD,OAAOA,KAAS,WAAkBC,GAAgBD,CAAI,KAAK,OACxDA,IAFW;AAAA,IAGpB;AAGA,QAAIE,IAA6B;AACjC,aAASC,IAAW;AAClB,MAAI5D,EAAM,SAAS,WACnB2D,IAAQE,EAAuB7D,EAAM,QAAQkC,CAAgB,GAC7DkB,EAAcnC,GAAkB,GAChCqB,EAAA;AAAA,IACF;AAEA,aAASwB,IAAa;AACpB,MAAAT,EAAA,GACAM,KAAA,QAAAA,KACAA,IAAQ;AAAA,IACV;AAEA,IAAAI,GAAU,MAAM;AACd,MAAAH,EAAA,GACAtB,EAAA;AAAA,IACF,CAAC,GAEDS;AAAA,MACE,MAAM/C,EAAM;AAAA,MACZ,CAACgE,MAAS;AACR,QAAIA,MAAS,SACXJ,EAAA,KAEAE,EAAA,GACAxB,EAAA;AAAA,MAEJ;AAAA,IAAA,GAGFS;AAAA,MACE,MAAM/C,EAAM;AAAA,MACZ,MAAM;AACJ,QAAIA,EAAM,SAAS,WACnB2D,KAAA,QAAAA,KACAA,IAAQE,EAAuB7D,EAAM,QAAQkC,CAAgB,GAC7DA,EAAA;AAAA,MACF;AAAA,IAAA,GAIFa;AAAA,MACE,MAAM/C,EAAM;AAAA,MACZ,MAAM;AACJ,QAAIA,EAAM,SAAS,UAAQoD,EAAcnC,GAAkB,GAC3DqB,EAAA;AAAA,MACF;AAAA,IAAA;AAIF,UAAM2B,IAAY1D,EAAS,MAAA;;AAAO,cAAAE,KAAAC,IAAAN,KAAA,gBAAAA,EAAU,UAAV,gBAAAM,EAAyB,WAAzB,gBAAAD,EAAiC;AAAA,KAAI;AACvE,WAAAsC,EAAMkB,GAAW,MAAM;AACrB,MAAIjE,EAAM,SAAS,UAAQsC,EAAA;AAAA,IAC7B,CAAC,GAED4B,GAAY,MAAMJ,GAAY,GAE9BK,EAAa,EAAE,SAAA7B,GAAS;;AArTtB,aAAA8B,EAAA,GAAAC,EAeM,OAfNC,IAeM;AAAA,QAdJC,GAagBC,GAAA,EAbA,WAAWvE,EAAA,aAAS;AAAA,qBAEhC,MAA2B;AAAA,oBAD7BoE,EAWqBI,IAAA,MAAAC,GAVL/B,EAAA,OAAY,CAAnBY,YADToB,EAWqBC,GAAA;AAAA,cATlB,KAAKrB,EAAI;AAAA,cACT,OAAKsB,GAAA,EAAA,cAAkBtB,EAAI,WAAM,WAAA,aAA6BA,EAAI,WAAM,aAAkBA,EAAI,WAAM,QAAA;AAAA,cACpG,IAAIA,EAAI,QAAQjD,EAAA,QAAS,EAAA,MAAWiD,EAAI,KAAA,IAAS;AAAA,cACjD,SAAK,CAAAuB,MAAExB,EAAeC,CAAG;AAAA,YAAA;yBAE1B,MAEU;AAAA,gBAFKC,EAAYD,EAAI,IAAI,UAAnCoB,EAEUI,GAAA;AAAA;kBAF4B,OAAM;AAAA,gBAAA;6BAC1C,MAAyC;AAAA,qBAAzCX,EAAA,GAAAO,EAAyCK,GAAzBxB,EAAYD,EAAI,IAAI,CAAA,CAAA;AAAA,kBAAA;;;mBAC5B,MACV0B,GAAG1B,EAAI,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as S, useSlots as k, resolveComponent as u, openBlock as m, createBlock as f, withCtx as l, createVNode as L, mergeProps as d, unref as g, renderSlot as h, createTextVNode as y, toDisplayString as P } from "vue";
|
|
2
2
|
import { ElMessageBox as n } from "element-plus";
|
|
3
|
-
import { u as w } from "./useApiAction-
|
|
3
|
+
import { u as w } from "./useApiAction-DxVQWWxv.mjs";
|
|
4
4
|
import { t as D, b as _, a as A, h as R, f as v } from "./props-DAytpx7D.mjs";
|
|
5
5
|
const q = /* @__PURE__ */ S({
|
|
6
6
|
name: "WdPromptButton",
|
|
@@ -115,4 +115,4 @@ const q = /* @__PURE__ */ S({
|
|
|
115
115
|
export {
|
|
116
116
|
q as _
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-
|
|
118
|
+
//# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs","sources":["../../src/components/buttons/PromptButton.vue"],"sourcesContent":["<template>\r\n <el-tooltip\r\n v-if=\"tips\"\r\n :content=\"tips\"\r\n :effect=\"tipsType\"\r\n :placement=\"placement\"\r\n >\r\n <el-button v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useSlots } from 'vue'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdPromptButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 输入框标题 */\r\n promptTitle: { type: String, default: '请输入' },\r\n /** 输入框占位文本(默认输入框模式有效) */\r\n promptPlaceholder: { type: String, default: '请输入内容' },\r\n /** 输入值并入 apiParam 的字段名(默认输入框模式有效) */\r\n paramKey: { type: String, default: 'value' },\r\n /** 输入框默认值(默认输入框模式有效) */\r\n promptDefault: { type: String, default: '' },\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'prompt',\r\n 'cancel',\r\n 'confirm',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst slots = useSlots()\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n if (slots.content) {\r\n // 自定义内容模式:弹窗内容由用户插槽 #content 提供,点击确认后请求 API\r\n try {\r\n await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault,\r\n // 允许自定义内容:message 设为空,插槽内容会被保留\r\n dangerouslyUseHTMLString: true,\r\n message: ''\r\n })\r\n emit('confirm')\r\n const success = await doRequest({})\r\n // API 请求成功(success=true)自动关闭弹窗,失败不关闭让用户继续修改\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n } catch {\r\n emit('cancel')\r\n }\r\n return\r\n }\r\n\r\n // 默认单输入框模式\r\n let value: string\r\n try {\r\n const res = await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault\r\n })\r\n value = res.value\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('prompt', value)\r\n const success = await doRequest({ [props.paramKey]: value })\r\n // 根据 API 返回 success 决定是否自动关闭:成功关闭,失败不关闭\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","slots","useSlots","loading","doRequest","useApiAction","onClick","event","ElMessageBox","value","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAQC,GAkBRC,IAAOC,GAYPC,IAAQC,EAAA,GACR,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMR,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeS,EAAQC,GAAmB;AAExC,UADAR,EAAK,SAASQ,CAAK,GACfN,EAAM,SAAS;AAEjB,YAAI;AACF,gBAAMO,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,YAC9D,mBAAmB;AAAA,YACnB,kBAAkB;AAAA,YAClB,kBAAkBA,EAAM;AAAA,YACxB,YAAYA,EAAM;AAAA;AAAA,YAElB,0BAA0B;AAAA,YAC1B,SAAS;AAAA,UAAA,CACV,GACDE,EAAK,SAAS,GACE,MAAMK,EAAU,EAAE,KAGhCI,EAAa,MAAA;AAAA,QAEjB,QAAQ;AACN,UAAAT,EAAK,QAAQ;AAAA,QACf;AACA;AAAA,MACF;AAGA,UAAIU;AACJ,UAAI;AAOF,QAAAA,KANY,MAAMD,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,UAC1E,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,kBAAkBA,EAAM;AAAA,UACxB,YAAYA,EAAM;AAAA,QAAA,CACnB,GACW;AAAA,MACd,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,UAAUU,CAAK,GACJ,MAAML,EAAU,EAAE,CAACP,EAAM,QAAQ,GAAGY,GAAO,KAGzDD,EAAa,MAAA;AAAA,IAEjB;;;aA9GUE,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAhB,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAhB,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as B, toRefs as L, computed as $, resolveComponent as i, resolveDirective as C, withDirectives as R, openBlock as o, createBlock as n, mergeProps as N, withCtx as l, createElementBlock as _, Fragment as x, renderList as W, unref as g, createElementVNode as h, renderSlot as s, createTextVNode as r, toDisplayString as u } from "vue";
|
|
2
|
-
import { u as A } from "./useOptionsLoader-
|
|
2
|
+
import { u as A } from "./useOptionsLoader-DEVCYhrp.mjs";
|
|
3
3
|
import { o as E } from "./props-DAytpx7D.mjs";
|
|
4
4
|
import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
5
5
|
const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @__PURE__ */ B({
|
|
@@ -126,4 +126,4 @@ const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @
|
|
|
126
126
|
export {
|
|
127
127
|
z as W
|
|
128
128
|
};
|
|
129
|
-
//# sourceMappingURL=RadioList-
|
|
129
|
+
//# sourceMappingURL=RadioList-BUWcP_Pk.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioList-
|
|
1
|
+
{"version":3,"file":"RadioList-BUWcP_Pk.mjs","sources":["../../src/components/inputs/RadioList.vue"],"sourcesContent":["<template>\n <el-radio-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-radio-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio-button>\n <el-radio v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio>\n </template>\n </el-radio-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdRadioList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean] as PropType<any>, default: undefined },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_radio_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_radio_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_radio","_hoisted_2"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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-
|
|
2
|
+
import { a as w, g as R, d as _, r as c } from "./http-C06mNpwY.mjs";
|
|
3
3
|
function O(n, s) {
|
|
4
4
|
const e = g(p(n, s));
|
|
5
5
|
return b(() => {
|
|
@@ -77,4 +77,4 @@ export {
|
|
|
77
77
|
x as a,
|
|
78
78
|
O as u
|
|
79
79
|
};
|
|
80
|
-
//# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-
|
|
80
|
+
//# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-
|
|
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;;"}
|
|
@@ -151,8 +151,8 @@ const fe = { class: "wd-search-panel" }, he = { class: "wd-search-panel__row wd-
|
|
|
151
151
|
]);
|
|
152
152
|
};
|
|
153
153
|
}
|
|
154
|
-
}), Pe = /* @__PURE__ */ pe(_e, [["__scopeId", "data-v-
|
|
154
|
+
}), Pe = /* @__PURE__ */ pe(_e, [["__scopeId", "data-v-13de410a"]]);
|
|
155
155
|
export {
|
|
156
156
|
Pe as W
|
|
157
157
|
};
|
|
158
|
-
//# sourceMappingURL=SearchPanel-
|
|
158
|
+
//# sourceMappingURL=SearchPanel-DPlWWuXb.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchPanel-xQ1hPaNq.mjs","sources":["../../src/components/form/SearchPanel.vue"],"sourcesContent":["<template>\n <div class=\"wd-search-panel\" v-loading=\"loading\">\n <!-- 搜索表单:整体一个 el-form,显示项和隐藏项分两行布局,都在同一个表单作用域中 -->\n <el-form\n ref=\"formRef\"\n :model=\"searchModel\"\n :inline=\"true\"\n :label-width=\"labelWidth\"\n v-bind=\"$attrs\"\n @submit.prevent\n >\n <!-- 第一行:默认搜索项 + 右侧操作按钮,布局不随隐藏项变化 -->\n <div class=\"wd-search-panel__row wd-search-panel__row--primary\">\n <div class=\"wd-search-panel__fields\">\n <div ref=\"primaryRef\" class=\"wd-search-panel__primary\" :class=\"{ 'is-collapsed': collapsePrimary }\">\n <slot v-bind=\"{ model: searchModel }\" />\n </div>\n </div>\n\n <!-- 右侧操作列(搜索 / 重置 / 展开),固定宽度、按钮横排一行不折行 -->\n <div v-if=\"withActions\" class=\"wd-search-panel__actions\" :style=\"actionStyle\">\n <slot name=\"actions\" :search=\"onSearch\" :reset=\"onReset\">\n <el-button type=\"primary\" :loading=\"loading\" @click=\"onSearch\">{{ searchText }}</el-button>\n <el-button @click=\"onReset\">{{ resetText }}</el-button>\n <el-button v-if=\"canCollapse\" link type=\"primary\" @click=\"toggleExpand\">\n {{ expanded ? collapseText : expandText }}\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 第二行:隐藏搜索条件区,整行平顺滑出/收起,仍然在同一个 el-form 内 -->\n <div\n v-if=\"hasMore\"\n class=\"wd-search-panel__more-wrap\"\n :class=\"{ 'is-open': expanded }\"\n :aria-hidden=\"!expanded ? 'true' : undefined\"\n >\n <div class=\"wd-search-panel__more\">\n <slot name=\"more\" v-bind=\"{ model: searchModel }\" />\n </div>\n </div>\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, onBeforeUnmount, getCurrentInstance, useSlots, nextTick } from 'vue'\nimport { searchDataGrid, resetSearchDataGrid } from '../../lib/core/linkage'\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\n\ndefineOptions({ name: 'WdSearchPanel', inheritAttrs: false })\n\nconst props = defineProps({\n ...filterProp,\n ...headRefreshDatagridProp,\n /** 是否可折叠(默认 true:面板自带 展开/收起 按钮;有 more 插槽时折叠 more 区,无 more 插槽时折叠默认区整体) */\n collapsible: { type: Boolean, default: true },\n /** 是否展开(v-model:expand) */\n expand: { type: Boolean, default: undefined },\n /** 默认是否展开 */\n defaultExpand: { type: Boolean, default: false },\n /** 是否内置查询/重置按钮 */\n withActions: { type: Boolean, default: true },\n searchText: { type: String, default: '搜索' },\n resetText: { type: String, default: '重置' },\n expandText: { type: String, default: '展开' },\n collapseText: { type: String, default: '收起' },\n labelWidth: { type: [String, Number], default: '80px' },\n /** 操作列宽度:默认 'auto' 随按钮内容自适应;数字按 px;也可传 CSS 长度(如 '120px') */\n actionWidth: { type: [String, Number], default: 'auto' }\n})\n\nconst emit = defineEmits(['search', 'reset', 'expand-change', 'update:expand'])\n\nconst formRef = ref<any>(null)\nconst primaryRef = ref<HTMLElement | null>(null)\nconst loading = ref(false)\nconst searchModel = reactive<Record<string, any>>({})\nconst slots = useSlots()\n\n// 是否提供了 more 插槽(隐藏搜索项目)\nconst hasMore = computed(() => !!slots.more)\n\n// 折叠行高(与 .wd-search-panel__primary.is-collapsed 的 max-height 保持一致)\nconst COLLAPSE_MAX_HEIGHT = 40\n// 无 more 插槽时:默认区完整内容是否超出折叠行高(超出才存在被隐藏的搜索条件)\nconst primaryOverflow = ref(false)\n\n// 是否存在可隐藏的搜索条件:有 more 插槽恒有;无 more 插槽时默认区超出折叠行高才有\nconst hasHidden = computed(() => hasMore.value || primaryOverflow.value)\n// 折叠能力:允许折叠且确实存在隐藏条件时,才显示 展开/收起 按钮\nconst canCollapse = computed(() => props.collapsible && hasHidden.value)\n\n// 展开状态(canCollapse 时生效)\nconst innerExpanded = ref(props.defaultExpand)\nconst expanded = computed(() =>\n canCollapse.value ? (props.expand !== undefined ? !!props.expand : innerExpanded.value) : true\n)\nconst collapsed = computed(() => canCollapse.value && !expanded.value)\n// 无 more 插槽时走旧行为:折叠默认区整体;有 more 插槽时默认区始终完整展示\nconst collapsePrimary = computed(() => collapsed.value && !hasMore.value)\n\n/** 测量默认区内容是否超出折叠行高(scrollHeight 包含因 overflow 隐藏的内容,折叠态下也能测到完整高度) */\nfunction measurePrimary() {\n const el = primaryRef.value\n if (!el) return\n primaryOverflow.value = el.scrollHeight > COLLAPSE_MAX_HEIGHT + 1\n}\n\n/** 操作列样式:默认随内容自适应;显式传宽度时固定宽度 */\nconst actionStyle = computed(() => {\n const w = props.actionWidth\n if (w === 'auto' || w === '' || w == null) return undefined\n const width = typeof w === 'number' ? `${w}px` : w\n return { width, flex: '0 0 auto' }\n})\n\nfunction toggleExpand() {\n const next = !expanded.value\n innerExpanded.value = next\n emit('update:expand', next)\n emit('expand-change', next)\n}\n\nfunction getSearchParams() {\n return { ...searchModel }\n}\n\nfunction onSearch() {\n const params = getSearchParams()\n emit('search', params)\n // 声明式联动:刷新同 filter 组 DataGrid(重置到第一页)\n if (props.headRefreshDatagrid) {\n searchDataGrid(params, props.headRefreshDatagrid, props.filter)\n }\n}\n\nfunction onReset() {\n // 清空表单字段\n Object.keys(searchModel).forEach((k) => delete searchModel[k])\n formRef.value?.clearValidate?.()\n emit('reset')\n if (props.headRefreshDatagrid) {\n resetSearchDataGrid(props.headRefreshDatagrid, props.filter)\n }\n}\n\nfunction expand() {\n innerExpanded.value = true\n emit('update:expand', true)\n}\nfunction collapse() {\n innerExpanded.value = false\n emit('update:expand', false)\n}\nfunction resetForm() {\n onReset()\n}\n\n// HTML 场景:插槽 v-model=\"q.xxx\" 需要根模板作用域可见 q\nconst instance = getCurrentInstance()\nlet resizeObserver: ResizeObserver | null = null\nonMounted(() => {\n const appContext = instance?.appContext\n if (appContext) {\n appContext.config.globalProperties.q = searchModel\n }\n // 初始测量 + 监听默认区尺寸/窗口宽度变化:无 more 插槽时据此判断是否存在隐藏条件\n nextTick(measurePrimary)\n if (typeof ResizeObserver !== 'undefined' && primaryRef.value) {\n resizeObserver = new ResizeObserver(() => measurePrimary())\n resizeObserver.observe(primaryRef.value)\n }\n window.addEventListener('resize', measurePrimary)\n})\nonBeforeUnmount(() => {\n const appContext = instance?.appContext\n if (appContext?.config?.globalProperties?.q === searchModel) {\n delete appContext.config.globalProperties.q\n }\n resizeObserver?.disconnect()\n window.removeEventListener('resize', measurePrimary)\n})\n\ndefineExpose({ expand, collapse, resetForm, getSearchParams })\n</script>\n\n<style scoped>\n.wd-search-panel {\n width: 100%;\n background: var(--wd-bg-color, #fff);\n padding: var(--wd-spacing-base, 8px) var(--wd-spacing-base, 12px) 0;\n box-sizing: border-box;\n}\n/* 第一行:默认搜索项(fields)+ 右侧操作列(actions),grid 三列布局锁定空间,布局稳定不受第二行影响\n * grid-template-columns: 1fr auto; —— 左侧搜索区自动占满剩余空间,右侧操作列宽度固定(随内容自适应或显式指定)\n * 避免 flex 压缩挤压导致最后一项换行不自然,结尾总是整齐\n */\n.wd-search-panel__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: flex-start;\n column-gap: var(--wd-spacing-base, 12px);\n padding-bottom: var(--wd-spacing-base, 4px);\n}\n.wd-search-panel__fields {\n min-width: 0;\n}\n/* 旧折叠模式(无 more 插槽):默认区超出一行隐藏 */\n.wd-search-panel__primary.is-collapsed {\n max-height: 40px;\n overflow: hidden;\n}\n/* 第二行:隐藏搜索条件区(独立容器 + 独立 el-form 作用域)。\n 外层 grid 行高 0fr→1fr 动画实现平顺滑出/收起;visibility 延迟隐藏,收起后不占位、不可聚焦 */\n.wd-search-panel__more-wrap {\n display: grid;\n grid-template-rows: 0fr;\n visibility: hidden;\n transition: grid-template-rows 0.25s ease, visibility 0s linear 0.25s;\n}\n.wd-search-panel__more-wrap.is-open {\n grid-template-rows: 1fr;\n visibility: visible;\n transition: grid-template-rows 0.25s ease;\n}\n.wd-search-panel__more {\n overflow: hidden;\n min-height: 0;\n box-sizing: border-box;\n padding-top: var(--wd-spacing-base, 6px);\n border-top: 1px dashed var(--wd-border-color-light, #e4e7ed);\n}\n/* 右侧操作列:按钮横排一行、不换行/不折行(宽度默认随内容,可经 actionWidth 显式固定) */\n.wd-search-panel__actions {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 0px;\n white-space: nowrap;\n}\n.wd-search-panel__actions :deep(.el-button) {\n white-space: nowrap;\n}\n\n/* SearchPanel 内让表单项更紧凑 */\n:deep(.el-form--inline .el-form-item) {\n margin-bottom: 4px;\n margin-right: 12px;\n}\n:deep(.el-form-item) {\n margin-bottom: 4px;\n}\n:deep(.el-form-item__label) {\n line-height: 30px;\n}\n:deep(.el-form-item__content) {\n line-height: 30px;\n}\n</style>\n"],"names":["COLLAPSE_MAX_HEIGHT","props","__props","emit","__emit","formRef","ref","primaryRef","loading","searchModel","reactive","slots","useSlots","hasMore","computed","primaryOverflow","hasHidden","canCollapse","innerExpanded","expanded","collapsed","collapsePrimary","measurePrimary","el","actionStyle","w","toggleExpand","next","getSearchParams","onSearch","params","searchDataGrid","onReset","k","_b","_a","resetSearchDataGrid","expand","collapse","resetForm","instance","getCurrentInstance","resizeObserver","onMounted","appContext","nextTick","onBeforeUnmount","__expose","_withDirectives","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_form","_mergeProps","$attrs","_createElementVNode","_hoisted_2","_hoisted_3","_normalizeClass","_renderSlot","_ctx","_component_el_button","_createBlock","_hoisted_5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SearchPanel-DPlWWuXb.mjs","sources":["../../src/components/form/SearchPanel.vue"],"sourcesContent":["<template>\n <div class=\"wd-search-panel\" v-loading=\"loading\">\n <!-- 搜索表单:整体一个 el-form,显示项和隐藏项分两行布局,都在同一个表单作用域中 -->\n <el-form\n ref=\"formRef\"\n :model=\"searchModel\"\n :inline=\"true\"\n :label-width=\"labelWidth\"\n v-bind=\"$attrs\"\n @submit.prevent\n >\n <!-- 第一行:默认搜索项 + 右侧操作按钮,布局不随隐藏项变化 -->\n <div class=\"wd-search-panel__row wd-search-panel__row--primary\">\n <div class=\"wd-search-panel__fields\">\n <div ref=\"primaryRef\" class=\"wd-search-panel__primary\" :class=\"{ 'is-collapsed': collapsePrimary }\">\n <slot v-bind=\"{ model: searchModel }\" />\n </div>\n </div>\n\n <!-- 右侧操作列(搜索 / 重置 / 展开),固定宽度、按钮横排一行不折行 -->\n <div v-if=\"withActions\" class=\"wd-search-panel__actions\" :style=\"actionStyle\">\n <slot name=\"actions\" :search=\"onSearch\" :reset=\"onReset\">\n <el-button type=\"primary\" :loading=\"loading\" @click=\"onSearch\">{{ searchText }}</el-button>\n <el-button @click=\"onReset\">{{ resetText }}</el-button>\n <el-button v-if=\"canCollapse\" link type=\"primary\" @click=\"toggleExpand\">\n {{ expanded ? collapseText : expandText }}\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 第二行:隐藏搜索条件区,整行平顺滑出/收起,仍然在同一个 el-form 内 -->\n <div\n v-if=\"hasMore\"\n class=\"wd-search-panel__more-wrap\"\n :class=\"{ 'is-open': expanded }\"\n :aria-hidden=\"!expanded ? 'true' : undefined\"\n >\n <div class=\"wd-search-panel__more\">\n <slot name=\"more\" v-bind=\"{ model: searchModel }\" />\n </div>\n </div>\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, onBeforeUnmount, getCurrentInstance, useSlots, nextTick } from 'vue'\nimport { searchDataGrid, resetSearchDataGrid } from '../../lib/core/linkage'\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\n\ndefineOptions({ name: 'WdSearchPanel', inheritAttrs: false })\n\nconst props = defineProps({\n ...filterProp,\n ...headRefreshDatagridProp,\n /** 是否可折叠(默认 true:面板自带 展开/收起 按钮;有 more 插槽时折叠 more 区,无 more 插槽时折叠默认区整体) */\n collapsible: { type: Boolean, default: true },\n /** 是否展开(v-model:expand) */\n expand: { type: Boolean, default: undefined },\n /** 默认是否展开 */\n defaultExpand: { type: Boolean, default: false },\n /** 是否内置查询/重置按钮 */\n withActions: { type: Boolean, default: true },\n searchText: { type: String, default: '搜索' },\n resetText: { type: String, default: '重置' },\n expandText: { type: String, default: '展开' },\n collapseText: { type: String, default: '收起' },\n labelWidth: { type: [String, Number], default: '80px' },\n /** 操作列宽度:默认 'auto' 随按钮内容自适应;数字按 px;也可传 CSS 长度(如 '120px') */\n actionWidth: { type: [String, Number], default: 'auto' }\n})\n\nconst emit = defineEmits(['search', 'reset', 'expand-change', 'update:expand'])\n\nconst formRef = ref<any>(null)\nconst primaryRef = ref<HTMLElement | null>(null)\nconst loading = ref(false)\nconst searchModel = reactive<Record<string, any>>({})\nconst slots = useSlots()\n\n// 是否提供了 more 插槽(隐藏搜索项目)\nconst hasMore = computed(() => !!slots.more)\n\n// 折叠行高(与 .wd-search-panel__primary.is-collapsed 的 max-height 保持一致)\nconst COLLAPSE_MAX_HEIGHT = 40\n// 无 more 插槽时:默认区完整内容是否超出折叠行高(超出才存在被隐藏的搜索条件)\nconst primaryOverflow = ref(false)\n\n// 是否存在可隐藏的搜索条件:有 more 插槽恒有;无 more 插槽时默认区超出折叠行高才有\nconst hasHidden = computed(() => hasMore.value || primaryOverflow.value)\n// 折叠能力:允许折叠且确实存在隐藏条件时,才显示 展开/收起 按钮\nconst canCollapse = computed(() => props.collapsible && hasHidden.value)\n\n// 展开状态(canCollapse 时生效)\nconst innerExpanded = ref(props.defaultExpand)\nconst expanded = computed(() =>\n canCollapse.value ? (props.expand !== undefined ? !!props.expand : innerExpanded.value) : true\n)\nconst collapsed = computed(() => canCollapse.value && !expanded.value)\n// 无 more 插槽时走旧行为:折叠默认区整体;有 more 插槽时默认区始终完整展示\nconst collapsePrimary = computed(() => collapsed.value && !hasMore.value)\n\n/** 测量默认区内容是否超出折叠行高(scrollHeight 包含因 overflow 隐藏的内容,折叠态下也能测到完整高度) */\nfunction measurePrimary() {\n const el = primaryRef.value\n if (!el) return\n primaryOverflow.value = el.scrollHeight > COLLAPSE_MAX_HEIGHT + 1\n}\n\n/** 操作列样式:默认随内容自适应;显式传宽度时固定宽度 */\nconst actionStyle = computed(() => {\n const w = props.actionWidth\n if (w === 'auto' || w === '' || w == null) return undefined\n const width = typeof w === 'number' ? `${w}px` : w\n return { width, flex: '0 0 auto' }\n})\n\nfunction toggleExpand() {\n const next = !expanded.value\n innerExpanded.value = next\n emit('update:expand', next)\n emit('expand-change', next)\n}\n\nfunction getSearchParams() {\n return { ...searchModel }\n}\n\nfunction onSearch() {\n const params = getSearchParams()\n emit('search', params)\n // 声明式联动:刷新同 filter 组 DataGrid(重置到第一页)\n if (props.headRefreshDatagrid) {\n searchDataGrid(params, props.headRefreshDatagrid, props.filter)\n }\n}\n\nfunction onReset() {\n // 清空表单字段\n Object.keys(searchModel).forEach((k) => delete searchModel[k])\n formRef.value?.clearValidate?.()\n emit('reset')\n if (props.headRefreshDatagrid) {\n resetSearchDataGrid(props.headRefreshDatagrid, props.filter)\n }\n}\n\nfunction expand() {\n innerExpanded.value = true\n emit('update:expand', true)\n}\nfunction collapse() {\n innerExpanded.value = false\n emit('update:expand', false)\n}\nfunction resetForm() {\n onReset()\n}\n\n// HTML 场景:插槽 v-model=\"q.xxx\" 需要根模板作用域可见 q\nconst instance = getCurrentInstance()\nlet resizeObserver: ResizeObserver | null = null\nonMounted(() => {\n const appContext = instance?.appContext\n if (appContext) {\n appContext.config.globalProperties.q = searchModel\n }\n // 初始测量 + 监听默认区尺寸/窗口宽度变化:无 more 插槽时据此判断是否存在隐藏条件\n nextTick(measurePrimary)\n if (typeof ResizeObserver !== 'undefined' && primaryRef.value) {\n resizeObserver = new ResizeObserver(() => measurePrimary())\n resizeObserver.observe(primaryRef.value)\n }\n window.addEventListener('resize', measurePrimary)\n})\nonBeforeUnmount(() => {\n const appContext = instance?.appContext\n if (appContext?.config?.globalProperties?.q === searchModel) {\n delete appContext.config.globalProperties.q\n }\n resizeObserver?.disconnect()\n window.removeEventListener('resize', measurePrimary)\n})\n\ndefineExpose({ expand, collapse, resetForm, getSearchParams })\n</script>\n\n<style scoped>\n.wd-search-panel {\n width: 100%;\n /* 组件级令牌回退链:皮肤可单独定制 SearchPanel */\n background: var(--wd-search-bg, var(--wd-bg-color, #fff));\n /* 背景素材:皮肤可挂纹理/图片(须置于 background 简写之后,否则被简写重置) */\n background-image: var(--wd-search-bg-image, none);\n padding: var(--wd-search-padding, var(--wd-spacing-base, 8px) var(--wd-spacing-base, 12px) 0);\n box-sizing: border-box;\n}\n/* 第一行:默认搜索项(fields)+ 右侧操作列(actions),grid 三列布局锁定空间,布局稳定不受第二行影响\n * grid-template-columns: 1fr auto; —— 左侧搜索区自动占满剩余空间,右侧操作列宽度固定(随内容自适应或显式指定)\n * 避免 flex 压缩挤压导致最后一项换行不自然,结尾总是整齐\n */\n.wd-search-panel__row {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: flex-start;\n column-gap: var(--wd-spacing-base, 12px);\n padding-bottom: var(--wd-spacing-base, 4px);\n}\n.wd-search-panel__fields {\n min-width: 0;\n}\n/* 旧折叠模式(无 more 插槽):默认区超出一行隐藏 */\n.wd-search-panel__primary.is-collapsed {\n max-height: 40px;\n overflow: hidden;\n}\n/* 第二行:隐藏搜索条件区(独立容器 + 独立 el-form 作用域)。\n 外层 grid 行高 0fr→1fr 动画实现平顺滑出/收起;visibility 延迟隐藏,收起后不占位、不可聚焦 */\n.wd-search-panel__more-wrap {\n display: grid;\n grid-template-rows: 0fr;\n visibility: hidden;\n transition: grid-template-rows 0.25s ease, visibility 0s linear 0.25s;\n}\n.wd-search-panel__more-wrap.is-open {\n grid-template-rows: 1fr;\n visibility: visible;\n transition: grid-template-rows 0.25s ease;\n}\n.wd-search-panel__more {\n overflow: hidden;\n min-height: 0;\n box-sizing: border-box;\n padding-top: var(--wd-spacing-base, 6px);\n border-top: var(--wd-border-width, 1px) dashed var(--wd-border-color-light, #e4e7ed);\n}\n/* 右侧操作列:按钮横排一行、不换行/不折行(宽度默认随内容,可经 actionWidth 显式固定) */\n.wd-search-panel__actions {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 0px;\n white-space: nowrap;\n}\n.wd-search-panel__actions :deep(.el-button) {\n white-space: nowrap;\n}\n\n/* SearchPanel 内让表单项更紧凑 */\n:deep(.el-form--inline .el-form-item) {\n margin-bottom: 4px;\n margin-right: 12px;\n}\n:deep(.el-form-item) {\n margin-bottom: 4px;\n}\n:deep(.el-form-item__label) {\n line-height: 30px;\n}\n:deep(.el-form-item__content) {\n line-height: 30px;\n}\n</style>\n"],"names":["COLLAPSE_MAX_HEIGHT","props","__props","emit","__emit","formRef","ref","primaryRef","loading","searchModel","reactive","slots","useSlots","hasMore","computed","primaryOverflow","hasHidden","canCollapse","innerExpanded","expanded","collapsed","collapsePrimary","measurePrimary","el","actionStyle","w","toggleExpand","next","getSearchParams","onSearch","params","searchDataGrid","onReset","k","_b","_a","resetSearchDataGrid","expand","collapse","resetForm","instance","getCurrentInstance","resizeObserver","onMounted","appContext","nextTick","onBeforeUnmount","__expose","_withDirectives","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_form","_mergeProps","$attrs","_createElementVNode","_hoisted_2","_hoisted_3","_normalizeClass","_renderSlot","_ctx","_component_el_button","_createBlock","_hoisted_5"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as b, toRefs as B, computed as D, resolveComponent as r, resolveDirective as C, withDirectives as N, openBlock as i, createBlock as d, mergeProps as A, withCtx as s, createElementBlock as F, Fragment as M, renderList as W, unref as c, createElementVNode as m, renderSlot as E, createTextVNode as K, toDisplayString as L, withModifiers as R, createVNode as f, createCommentVNode as $ } from "vue";
|
|
2
2
|
import { QuestionFilled as I } from "@element-plus/icons-vue";
|
|
3
|
-
import { u as O } from "./useOptionsLoader-
|
|
3
|
+
import { u as O } from "./useOptionsLoader-DEVCYhrp.mjs";
|
|
4
4
|
import { o as Q } from "./props-DAytpx7D.mjs";
|
|
5
5
|
import { _ as T } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
6
6
|
const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @__PURE__ */ b({
|
|
@@ -111,4 +111,4 @@ const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @_
|
|
|
111
111
|
export {
|
|
112
112
|
Y as W
|
|
113
113
|
};
|
|
114
|
-
//# sourceMappingURL=Select-
|
|
114
|
+
//# sourceMappingURL=Select-uvFy7_NU.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-
|
|
1
|
+
{"version":3,"file":"Select-uvFy7_NU.mjs","sources":["../../src/components/inputs/Select.vue"],"sourcesContent":["<template>\n <el-select\n v-model=\"inner\"\n v-loading=\"loading\"\n :multiple=\"multiple\"\n :filterable=\"remote || filterable\"\n :remote=\"remote\"\n :remote-method=\"onRemote\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.text\"\n :value=\"opt.value\"\n >\n <span class=\"wd-option-row\">\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">\n {{ opt.text }}\n </slot>\n </span>\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-tip\" tabindex=\"0\" role=\"note\" aria-label=\"帮助说明\" @click.stop>\n <el-icon><QuestionFilled /></el-icon>\n </span>\n </el-tooltip>\n </span>\n </el-option>\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { QuestionFilled } from '@element-plus/icons-vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdSelect', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean, Array] as PropType<any>, default: undefined },\n multiple: { type: Boolean, default: false },\n /** 远程搜索 */\n remote: { type: Boolean, default: false },\n /** 本地可搜索 */\n filterable: { type: Boolean, default: true },\n /** 远程搜索关键字字段名 */\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n\nfunction onRemote(query: string) {\n if (props.remote) remoteSearch(query, props.keywordKey)\n}\n</script>\n\n<style scoped>\n.wd-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n}\n.wd-option-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wd-option-tip {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--el-text-color-secondary, #909399);\n font-size: 14px;\n cursor: help;\n}\n.wd-option-tip:focus-visible {\n outline: 1px dashed currentColor;\n outline-offset: 2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","useOptionsLoader","inner","computed","val","onChange","onRemote","query","_withDirectives","_openBlock","_createBlock","_component_el_select","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_option","_createElementVNode","_hoisted_1","_hoisted_2","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_tooltip","_createVNode","_component_el_icon","QuestionFilled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+CA,UAAMA,IAAQC,GAYRC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MAC1D,KAAKL,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKQ,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMX,EAAM;AAAA,MACjB,KAAK,CAACY,MAAQV,EAAK,qBAAqBU,CAAG;AAAA,IAAA,CAC5C;AAED,aAASC,EAASD,GAAU;AAC1B,MAAAV,EAAK,UAAUU,CAAG;AAAA,IACpB;AAEA,aAASE,EAASC,GAAe;AAC/B,MAAIf,EAAM,UAAQQ,EAAaO,GAAOf,EAAM,UAAU;AAAA,IACxD;;;AAtFE,aAAAgB,GAAAC,EAAA,GAAAC,EAmCYC,GAnCZC,EAmCY;AAAA,oBAlCDV,EAAA;AAAA,sDAAAA,EAAK,QAAAW;AAAA,QAEb,UAAUpB,EAAA;AAAA,QACV,YAAYA,EAAA,UAAUA,EAAA;AAAA,QACtB,QAAQA,EAAA;AAAA,QACR,iBAAea;AAAA,MAAA,GACRQ,EAAAA,QAAM,EACb,UAAAT,EAAA,CAAgB,GAAA;AAAA,mBAGf,MAAsB;AAAA,kBADxBU,EAwBYC,GAAA,MAAAC,EAvBIC,EAAApB,CAAA,GAAO,CAAdqB,YADTT,EAwBYU,GAAA;AAAA,YAtBT,KAAK,OAAOD,EAAI,KAAK;AAAA,YACrB,OAAOA,EAAI;AAAA,YACX,OAAOA,EAAI;AAAA,UAAA;uBAEZ,MAiBO;AAAA,cAjBPE,EAiBO,QAjBPC,GAiBO;AAAA,gBAhBLD,EAIO,QAJPE,GAIO;AAAA,kBAHLC,EAEOC,EAAA,QAAA,WAAA;AAAA,oBAFA,QAAQN,EAAI;AAAA,oBAAM,MAAMA,EAAI;AAAA,oBAAO,OAAOA,EAAI;AAAA,oBAAQ,MAAMA,EAAI;AAAA,kBAAA,GAAvE,MAEO;AAAA,oBADFO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,kBAAA;;gBAIPA,EAAI,aADZT,EAUakB,GAAA;AAAA;kBARV,SAAST,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPE,EAEO,QAAA;AAAA,sBAFD,OAAM;AAAA,sBAAgB,UAAS;AAAA,sBAAI,MAAK;AAAA,sBAAO,cAAW;AAAA,sBAAQ,2BAAD,MAAA;AAAA,sBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,oBAAA;sBAChFQ,EAAqCC,GAAA,MAAA;AAAA,mCAA5B,MAAkB;AAAA,0BAAlBD,EAAkBX,EAAAa,CAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;YA5BxBb,EAAAnB,CAAA,CAAO;AAAA,MAAA;;;;"}
|