workdesktop-ai 1.2.0 → 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 +192 -180
- package/README.md +11 -8
- package/dist/api-button/index.mjs +1 -1
- package/dist/auto-complete/index.mjs +1 -1
- package/dist/checkbox-list/index.mjs +1 -1
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs} +2 -2
- package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map} +1 -1
- package/dist/chunks/{AutoComplete-6yrCFGZ5.mjs → AutoComplete-C6Nxatvt.mjs} +2 -2
- package/dist/chunks/{AutoComplete-6yrCFGZ5.mjs.map → AutoComplete-C6Nxatvt.mjs.map} +1 -1
- package/dist/chunks/{CheckboxList-ChmfF6zs.mjs → CheckboxList-5AEx33r5.mjs} +2 -2
- package/dist/chunks/{CheckboxList-ChmfF6zs.mjs.map → CheckboxList-5AEx33r5.mjs.map} +1 -1
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs} +2 -2
- package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map} +1 -1
- package/dist/chunks/{DataForm-Rsa1PT-X.mjs → DataForm-C6VLTSOm.mjs} +3 -3
- package/dist/chunks/{DataForm-Rsa1PT-X.mjs.map → DataForm-C6VLTSOm.mjs.map} +1 -1
- package/dist/chunks/{DataGrid-DzbJpT43.mjs → DataGrid-Dd7n5JM7.mjs} +3 -3
- package/dist/chunks/{DataGrid-DzbJpT43.mjs.map → DataGrid-Dd7n5JM7.mjs.map} +1 -1
- package/dist/chunks/{EditableGrid-C-0uy89H.mjs → EditableGrid-CDeeVkaX.mjs} +3 -3
- package/dist/chunks/{EditableGrid-C-0uy89H.mjs.map → EditableGrid-CDeeVkaX.mjs.map} +1 -1
- package/dist/chunks/{ImageUpload-CrDyIjWC.mjs → ImageUpload-CQA9XQ7Q.mjs} +2 -2
- package/dist/chunks/{ImageUpload-CrDyIjWC.mjs.map → ImageUpload-CQA9XQ7Q.mjs.map} +1 -1
- package/dist/chunks/Path-pIP0JQ0c.mjs +245 -0
- package/dist/chunks/Path-pIP0JQ0c.mjs.map +1 -0
- package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.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-ClrF3C2w.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map} +1 -1
- package/dist/chunks/{RadioList-BIwUZ6lm.mjs → RadioList-BUWcP_Pk.mjs} +2 -2
- package/dist/chunks/{RadioList-BIwUZ6lm.mjs.map → RadioList-BUWcP_Pk.mjs.map} +1 -1
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs} +2 -2
- package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs.map → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map} +1 -1
- package/dist/chunks/{Select-DlJ9U0nE.mjs → Select-uvFy7_NU.mjs} +2 -2
- package/dist/chunks/{Select-DlJ9U0nE.mjs.map → Select-uvFy7_NU.mjs.map} +1 -1
- package/dist/chunks/Station-BTP0SbBg.mjs +818 -0
- package/dist/chunks/Station-BTP0SbBg.mjs.map +1 -0
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs} +2 -2
- package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.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-DORizGEF.mjs → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs} +2 -2
- package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs.map → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map} +1 -1
- package/dist/chunks/{Viewer-DcMSN3_1.mjs → Viewer-CjLSQTrw.mjs} +2 -2
- package/dist/chunks/{Viewer-DcMSN3_1.mjs.map → Viewer-CjLSQTrw.mjs.map} +1 -1
- package/dist/chunks/{http-9ToPNkWJ.mjs → http-C06mNpwY.mjs} +1180 -1065
- 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-BetCGQrx.mjs → useApiAction-DxVQWWxv.mjs} +2 -2
- package/dist/chunks/{useApiAction-BetCGQrx.mjs.map → useApiAction-DxVQWWxv.mjs.map} +1 -1
- package/dist/chunks/{useColumnSettings-CnXeA0k7.mjs → useColumnSettings-BwG2V9xp.mjs} +2 -2
- package/dist/chunks/{useColumnSettings-CnXeA0k7.mjs.map → useColumnSettings-BwG2V9xp.mjs.map} +1 -1
- package/dist/chunks/{useOptionsLoader-BwRdHDPL.mjs → useOptionsLoader-DEVCYhrp.mjs} +2 -2
- package/dist/chunks/{useOptionsLoader-BwRdHDPL.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/editable-grid/index.mjs +1 -1
- package/dist/image-upload/index.mjs +1 -1
- package/dist/index.esm.js +86 -80
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +128 -25
- package/dist/index.umd.js.map +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/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/types/src/components/index.d.ts +2 -1
- package/dist/types/src/components/layout/Station.vue.d.ts +30 -19
- package/dist/types/src/components/layout/types.d.ts +13 -0
- package/dist/types/src/components/styles/Path.vue.d.ts +103 -0
- package/dist/types/src/entries/path.d.ts +9 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/lib/core/skins/business.d.ts +1 -1
- package/dist/types/src/lib/core/skins/tech.d.ts +1 -1
- package/dist/types/src/lib/core/station-linkage.d.ts +31 -0
- package/dist/upload/index.mjs +1 -1
- package/dist/viewer/index.mjs +1 -1
- package/llms.txt +69 -9
- package/package.json +11 -1
- package/dist/chunks/Station-CrMTjqfa.mjs +0 -796
- package/dist/chunks/Station-CrMTjqfa.mjs.map +0 -1
- package/dist/chunks/http-9ToPNkWJ.mjs.map +0 -1
- package/dist/types/src/lib/core/skins/tech-brain.d.ts +0 -5
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const a = /* @__PURE__ */ new Map();
|
|
2
|
+
function i(t) {
|
|
3
|
+
return t || "";
|
|
4
|
+
}
|
|
5
|
+
function g(t) {
|
|
6
|
+
const e = i(t.filter);
|
|
7
|
+
return a.has(e) || a.set(e, /* @__PURE__ */ new Set()), a.get(e).add(t), () => {
|
|
8
|
+
var r;
|
|
9
|
+
(r = a.get(e)) == null || r.delete(t);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function f(t, e) {
|
|
13
|
+
if (!t) return [];
|
|
14
|
+
const r = typeof t == "string" ? t : i(e), o = a.get(r);
|
|
15
|
+
return o ? Array.from(o) : [];
|
|
16
|
+
}
|
|
17
|
+
function h(t, e, r) {
|
|
18
|
+
const o = f(t, r);
|
|
19
|
+
let s = 0;
|
|
20
|
+
return o.forEach((n) => {
|
|
21
|
+
try {
|
|
22
|
+
n.setFooterInfo(e), s += 1;
|
|
23
|
+
} catch (u) {
|
|
24
|
+
console.error("[WorkDesktop] setStationFooter error:", u);
|
|
25
|
+
}
|
|
26
|
+
}), s;
|
|
27
|
+
}
|
|
28
|
+
function l(t = !0, e) {
|
|
29
|
+
const r = f(t, e);
|
|
30
|
+
let o = 0;
|
|
31
|
+
return r.forEach((s) => {
|
|
32
|
+
try {
|
|
33
|
+
s.refresh(), o += 1;
|
|
34
|
+
} catch (n) {
|
|
35
|
+
console.error("[WorkDesktop] refreshStationView error:", n);
|
|
36
|
+
}
|
|
37
|
+
}), o;
|
|
38
|
+
}
|
|
39
|
+
function S(t, e) {
|
|
40
|
+
var o;
|
|
41
|
+
const r = f(t, e);
|
|
42
|
+
for (const s of r)
|
|
43
|
+
try {
|
|
44
|
+
const n = (o = s.getActiveMenuChain) == null ? void 0 : o.call(s);
|
|
45
|
+
if (n && n.length) return n;
|
|
46
|
+
} catch (n) {
|
|
47
|
+
console.error("[WorkDesktop] getStationMenuChain error:", n);
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const c = /* @__PURE__ */ new Map();
|
|
52
|
+
function p(t, e) {
|
|
53
|
+
const r = i(t);
|
|
54
|
+
return c.has(r) || c.set(r, /* @__PURE__ */ new Set()), c.get(r).add(e), () => {
|
|
55
|
+
var o;
|
|
56
|
+
(o = c.get(r)) == null || o.delete(e);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function y(t) {
|
|
60
|
+
var e;
|
|
61
|
+
(e = c.get(i(t))) == null || e.forEach((r) => {
|
|
62
|
+
try {
|
|
63
|
+
r();
|
|
64
|
+
} catch (o) {
|
|
65
|
+
console.error("[WorkDesktop] notifyStationChange error:", o);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
g as a,
|
|
71
|
+
p as b,
|
|
72
|
+
S as g,
|
|
73
|
+
y as n,
|
|
74
|
+
l as r,
|
|
75
|
+
h as s
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=station-linkage-D54-_iyL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"station-linkage-D54-_iyL.mjs","sources":["../../src/lib/core/station-linkage.ts"],"sourcesContent":["/**\n * WdStation 联动注册中心\n *\n * 复用 DataGrid linkage 的 filter 分组心智:\n * - Station 挂载时按 filter 注册;\n * - 业务代码调用 setStationFooter(target, info, selfFilter) 更新底部动态信息;\n * - refreshStationView(target, selfFilter) 触发内容区强制刷新(重新挂载)。\n *\n * target:true = 与发起方同 filter 组;字符串 = 定向该 filter 组。\n */\n\nexport interface StationInstance {\n /** 组件 filter 分组标识 */\n filter: string\n /** 设置底部动态信息 */\n setFooterInfo: (info: string) => void\n /** 刷新内容区(强制重挂载) */\n refresh: () => void\n /** 当前激活菜单的路径链(分组标题 → 菜单 → 子菜单),供 WdPath 自动模式读取 */\n getActiveMenuChain?: () => MenuChainItem[]\n}\n\n/** 菜单链节点(面包屑自动模式的菜单段) */\nexport interface MenuChainItem {\n /** 标题 */\n title: string\n /** 路由路径 */\n path?: string\n /** 图标(ElementPlus 图标名字符串或组件) */\n icon?: string | object\n}\n\n/** filter 分组 → Station 实例集合 */\nconst stationRegistry: Map<string, Set<StationInstance>> = new Map()\n\nfunction groupOf(filter?: string): string {\n return filter || ''\n}\n\n/**\n * 注册 Station 实例,返回注销函数(组件 onUnmounted 调用)\n */\nexport function registerStation(instance: StationInstance): () => void {\n const key = groupOf(instance.filter)\n if (!stationRegistry.has(key)) {\n stationRegistry.set(key, new Set())\n }\n stationRegistry.get(key)!.add(instance)\n return () => {\n stationRegistry.get(key)?.delete(instance)\n }\n}\n\nfunction resolveTargets(target: boolean | string | undefined, selfFilter?: string): StationInstance[] {\n if (!target) return []\n const targetFilter = typeof target === 'string' ? target : groupOf(selfFilter)\n const group = stationRegistry.get(targetFilter)\n return group ? Array.from(group) : []\n}\n\n/**\n * 设置目标 Station 底部动态信息\n * @param target true=同 filter 组;字符串=定向该 filter 组\n * @param info 展示内容(文本)\n * @param selfFilter 发起方自身 filter\n * @returns 被更新的实例数量\n */\nexport function setStationFooter(\n target: boolean | string,\n info: string,\n selfFilter?: string\n): number {\n const targets = resolveTargets(target, selfFilter)\n let count = 0\n targets.forEach((station) => {\n try {\n station.setFooterInfo(info)\n count += 1\n } catch (e) {\n console.error('[WorkDesktop] setStationFooter error:', e)\n }\n })\n return count\n}\n\n/**\n * 刷新目标 Station 内容区(强制重新挂载)\n * @param target true=同 filter 组(默认);字符串=定向该 filter 组\n * @param selfFilter 发起方自身 filter\n * @returns 被刷新的实例数量\n */\nexport function refreshStationView(\n target: boolean | string = true,\n selfFilter?: string\n): number {\n const targets = resolveTargets(target, selfFilter)\n let count = 0\n targets.forEach((station) => {\n try {\n station.refresh()\n count += 1\n } catch (e) {\n console.error('[WorkDesktop] refreshStationView error:', e)\n }\n })\n return count\n}\n\n/**\n * 读取目标 Station 当前激活菜单的路径链(供 WdPath 自动模式使用)\n * @param target true=同 filter 组;字符串=定向该 filter 组\n * @param selfFilter 发起方自身 filter\n * @returns 菜单链节点数组(无匹配实例时为空数组)\n */\nexport function getStationMenuChain(\n target: boolean | string | undefined,\n selfFilter?: string\n): MenuChainItem[] {\n const targets = resolveTargets(target, selfFilter)\n for (const station of targets) {\n try {\n const chain = station.getActiveMenuChain?.()\n if (chain && chain.length) return chain\n } catch (e) {\n console.error('[WorkDesktop] getStationMenuChain error:', e)\n }\n }\n return []\n}\n\n/** filter 分组 → 路径组件刷新回调集合(Station 菜单变化时通知同组 Path 重新读取菜单链) */\nconst pathListeners: Map<string, Set<() => void>> = new Map()\n\n/**\n * 订阅某 filter 组的 Station 变化(菜单/分组切换),返回取消订阅函数\n */\nexport function subscribeStationChange(filter: string, cb: () => void): () => void {\n const key = groupOf(filter)\n if (!pathListeners.has(key)) {\n pathListeners.set(key, new Set())\n }\n pathListeners.get(key)!.add(cb)\n return () => {\n pathListeners.get(key)?.delete(cb)\n }\n}\n\n/**\n * 通知某 filter 组的订阅者:Station 的激活菜单/分组发生了变化\n * (Station 内部在菜单选中、分组切换、路由反查、挂载时调用)\n */\nexport function notifyStationChange(filter: string): void {\n pathListeners.get(groupOf(filter))?.forEach((cb) => {\n try {\n cb()\n } catch (e) {\n console.error('[WorkDesktop] notifyStationChange error:', e)\n }\n })\n}\n\n/**\n * 仅供测试 / 调试:清空路径组件订阅者\n */\nexport function clearPathListeners(): void {\n pathListeners.clear()\n}\n\n/**\n * 仅供测试 / 调试:清空注册中心\n */\nexport function clearStationRegistry(): void {\n stationRegistry.clear()\n}\n"],"names":["stationRegistry","groupOf","filter","registerStation","instance","key","_a","resolveTargets","target","selfFilter","targetFilter","group","setStationFooter","info","targets","count","station","e","refreshStationView","getStationMenuChain","chain","pathListeners","subscribeStationChange","cb","notifyStationChange"],"mappings":"AAiCA,MAAMA,wBAAyD,IAAA;AAE/D,SAASC,EAAQC,GAAyB;AACxC,SAAOA,KAAU;AACnB;AAKO,SAASC,EAAgBC,GAAuC;AACrE,QAAMC,IAAMJ,EAAQG,EAAS,MAAM;AACnC,SAAKJ,EAAgB,IAAIK,CAAG,KAC1BL,EAAgB,IAAIK,GAAK,oBAAI,IAAA,CAAK,GAEpCL,EAAgB,IAAIK,CAAG,EAAG,IAAID,CAAQ,GAC/B,MAAM;AAff,QAAAE;AAgBI,KAAAA,IAAAN,EAAgB,IAAIK,CAAG,MAAvB,QAAAC,EAA0B,OAAOF;AAAA,EACnC;AACF;AAEA,SAASG,EAAeC,GAAsCC,GAAwC;AACpG,MAAI,CAACD,EAAQ,QAAO,CAAA;AACpB,QAAME,IAAe,OAAOF,KAAW,WAAWA,IAASP,EAAQQ,CAAU,GACvEE,IAAQX,EAAgB,IAAIU,CAAY;AAC9C,SAAOC,IAAQ,MAAM,KAAKA,CAAK,IAAI,CAAA;AACrC;AASO,SAASC,EACdJ,GACAK,GACAJ,GACQ;AACR,QAAMK,IAAUP,EAAeC,GAAQC,CAAU;AACjD,MAAIM,IAAQ;AACZ,SAAAD,EAAQ,QAAQ,CAACE,MAAY;AAC3B,QAAI;AACF,MAAAA,EAAQ,cAAcH,CAAI,GAC1BE,KAAS;AAAA,IACX,SAASE,GAAG;AACV,cAAQ,MAAM,yCAAyCA,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC,GACMF;AACT;AAQO,SAASG,EACdV,IAA2B,IAC3BC,GACQ;AACR,QAAMK,IAAUP,EAAeC,GAAQC,CAAU;AACjD,MAAIM,IAAQ;AACZ,SAAAD,EAAQ,QAAQ,CAACE,MAAY;AAC3B,QAAI;AACF,MAAAA,EAAQ,QAAA,GACRD,KAAS;AAAA,IACX,SAASE,GAAG;AACV,cAAQ,MAAM,2CAA2CA,CAAC;AAAA,IAC5D;AAAA,EACF,CAAC,GACMF;AACT;AAQO,SAASI,EACdX,GACAC,GACiB;AApFnB,MAAAH;AAqFE,QAAMQ,IAAUP,EAAeC,GAAQC,CAAU;AACjD,aAAWO,KAAWF;AACpB,QAAI;AACF,YAAMM,KAAQd,IAAAU,EAAQ,uBAAR,gBAAAV,EAAA,KAAAU;AACd,UAAII,KAASA,EAAM,OAAQ,QAAOA;AAAA,IACpC,SAASH,GAAG;AACV,cAAQ,MAAM,4CAA4CA,CAAC;AAAA,IAC7D;AAEF,SAAO,CAAA;AACT;AAGA,MAAMI,wBAAkD,IAAA;AAKjD,SAASC,EAAuBpB,GAAgBqB,GAA4B;AACjF,QAAMlB,IAAMJ,EAAQC,CAAM;AAC1B,SAAKmB,EAAc,IAAIhB,CAAG,KACxBgB,EAAc,IAAIhB,GAAK,oBAAI,IAAA,CAAK,GAElCgB,EAAc,IAAIhB,CAAG,EAAG,IAAIkB,CAAE,GACvB,MAAM;AA7Gf,QAAAjB;AA8GI,KAAAA,IAAAe,EAAc,IAAIhB,CAAG,MAArB,QAAAC,EAAwB,OAAOiB;AAAA,EACjC;AACF;AAMO,SAASC,EAAoBtB,GAAsB;AAtH1D,MAAAI;AAuHE,GAAAA,IAAAe,EAAc,IAAIpB,EAAQC,CAAM,CAAC,MAAjC,QAAAI,EAAoC,QAAQ,CAACiB,MAAO;AAClD,QAAI;AACF,MAAAA,EAAA;AAAA,IACF,SAASN,GAAG;AACV,cAAQ,MAAM,4CAA4CA,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref as n } from "vue";
|
|
2
|
-
import { r as d } from "./http-
|
|
2
|
+
import { r as d } from "./http-C06mNpwY.mjs";
|
|
3
3
|
import { r as o } from "./linkage-FbL1mcz3.mjs";
|
|
4
4
|
function A(e) {
|
|
5
5
|
const s = n(!1);
|
|
@@ -27,4 +27,4 @@ function A(e) {
|
|
|
27
27
|
export {
|
|
28
28
|
A as u
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=useApiAction-
|
|
30
|
+
//# sourceMappingURL=useApiAction-DxVQWWxv.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApiAction-
|
|
1
|
+
{"version":3,"file":"useApiAction-DxVQWWxv.mjs","sources":["../../src/components/buttons/useApiAction.ts"],"sourcesContent":["import { ref } from 'vue'\nimport { request, type ApiEventPayload } from '../../lib/core/http'\nimport { refreshDataGrid } from '../../lib/core/linkage'\nimport type { ReqOptions } from '../../types/config'\n\n/**\n * 按钮组共享:点击 → 请求 → 提示 → 联动刷新(PRD 4.4 按钮组)\n * 业务失败 resolve 不抛异常;网络异常 reject。\n */\nexport function useApiAction(options: {\n getApi: () => string\n getMethod: () => 'get' | 'post' | 'put' | 'delete'\n getParam: () => Record<string, any>\n getFilter: () => string\n getHeadRefresh: () => boolean | string\n emit: (event: any, ...args: any[]) => void\n /** 是否按钮级 loading(ApiButton buttonLoading=false 时按钮不转圈) */\n buttonLoading?: () => boolean\n /** 请求附加项(pageLoading=true 时开启全局 ElLoading 遮罩) */\n getReqOptions?: () => ReqOptions\n}) {\n const loading = ref(false)\n\n async function doRequest(extraParam?: Record<string, any>): Promise<boolean> {\n const api = options.getApi()\n if (!api) return false\n\n const method = options.getMethod()\n const param = { ...options.getParam(), ...(extraParam || {}) }\n const useBtnLoading = options.buttonLoading ? options.buttonLoading() : true\n const reqOptions: ReqOptions = options.getReqOptions\n ? options.getReqOptions()\n : {}\n\n const beforePayload: ApiEventPayload = { type: 'apiBefore', url: api, method, params: param }\n options.emit('apiBefore', beforePayload)\n\n if (useBtnLoading) loading.value = true\n\n try {\n const result =\n method === 'get' || method === 'delete'\n ? await request.request({ url: api, method, params: param }, reqOptions)\n : await request.request({ url: api, method, data: param }, reqOptions)\n\n if (result.success) {\n options.emit('apiSuccess', { data: result.data, code: result.code, message: result.message })\n // 声明式联动:刷新目标 DataGrid\n const head = options.getHeadRefresh()\n if (head) {\n refreshDataGrid(head, options.getFilter())\n }\n options.emit('apiAfter', { data: result.data, code: result.code })\n return true\n }\n options.emit('apiFail', { data: null, code: result.code, message: result.message })\n options.emit('apiAfter', { code: result.code, message: result.message })\n return false\n } catch (error: any) {\n options.emit('apiException', { error, message: error?.message })\n options.emit('apiAfter', { error })\n return false\n } finally {\n loading.value = false\n }\n }\n\n return { loading, doRequest }\n}\n"],"names":["useApiAction","options","loading","ref","doRequest","extraParam","api","method","param","useBtnLoading","reqOptions","beforePayload","result","request","head","refreshDataGrid","error"],"mappings":";;;AASO,SAASA,EAAaC,GAW1B;AACD,QAAMC,IAAUC,EAAI,EAAK;AAEzB,iBAAeC,EAAUC,GAAoD;AAC3E,UAAMC,IAAML,EAAQ,OAAA;AACpB,QAAI,CAACK,EAAK,QAAO;AAEjB,UAAMC,IAASN,EAAQ,UAAA,GACjBO,IAAQ,EAAE,GAAGP,EAAQ,YAAY,GAAII,KAAc,GAAC,GACpDI,IAAgBR,EAAQ,gBAAgBA,EAAQ,kBAAkB,IAClES,IAAyBT,EAAQ,gBACnCA,EAAQ,cAAA,IACR,CAAA,GAEEU,IAAiC,EAAE,MAAM,aAAa,KAAKL,GAAK,QAAAC,GAAQ,QAAQC,EAAA;AACtF,IAAAP,EAAQ,KAAK,aAAaU,CAAa,GAEnCF,QAAuB,QAAQ;AAEnC,QAAI;AACF,YAAMG,IACJL,MAAW,SAASA,MAAW,WAC3B,MAAMM,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,QAAQC,EAAA,GAASE,CAAU,IACrE,MAAMG,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,MAAMC,EAAA,GAASE,CAAU;AAEzE,UAAIE,EAAO,SAAS;AAClB,QAAAX,EAAQ,KAAK,cAAc,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS;AAE5F,cAAME,IAAOb,EAAQ,eAAA;AACrB,eAAIa,KACFC,EAAgBD,GAAMb,EAAQ,WAAW,GAE3CA,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,GAC1D;AAAA,MACT;AACA,aAAAX,EAAQ,KAAK,WAAW,EAAE,MAAM,MAAM,MAAMW,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS,GAClFX,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,SAASA,EAAO,SAAS,GAChE;AAAA,IACT,SAASI,GAAY;AACnB,aAAAf,EAAQ,KAAK,gBAAgB,EAAE,OAAAe,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAC/Df,EAAQ,KAAK,YAAY,EAAE,OAAAe,EAAA,CAAO,GAC3B;AAAA,IACT,UAAA;AACE,MAAAd,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,SAAAA,GAAS,WAAAE,EAAA;AACpB;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref as P, shallowRef as J, reactive as _, computed as A, nextTick as R } from "vue";
|
|
2
|
-
import { a as B, r as M, e as H } from "./http-
|
|
2
|
+
import { a as B, r as M, e as H } from "./http-C06mNpwY.mjs";
|
|
3
3
|
function X(p = {}) {
|
|
4
4
|
const t = B(), {
|
|
5
5
|
api: c,
|
|
@@ -213,4 +213,4 @@ export {
|
|
|
213
213
|
Y as o,
|
|
214
214
|
X as u
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=useColumnSettings-
|
|
216
|
+
//# sourceMappingURL=useColumnSettings-BwG2V9xp.mjs.map
|
package/dist/chunks/{useColumnSettings-CnXeA0k7.mjs.map → useColumnSettings-BwG2V9xp.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnSettings-CnXeA0k7.mjs","sources":["../../src/lib/composables/useDataGrid.ts","../../src/components/data/datagrid/useColumnSettings.ts"],"sourcesContent":["import { ref, reactive, shallowRef } from 'vue'\r\nimport { request, type ApiResult } from '../core/http'\r\nimport { getGlobalConfig } from '../core/config'\r\n\r\n/**\r\n * useDataGrid(PRD 5.3)\r\n * DataGrid 状态管理:分页 / 搜索 / 选中 / 请求\r\n *\r\n * @example\r\n * const grid = useDataGrid({ pageSize: 20 })\r\n * grid.fetchData()\r\n */\r\n\r\nexport interface SortState {\r\n prop: string\r\n order: 'ascending' | 'descending'\r\n}\r\n\r\nexport interface UseDataGridOptions {\r\n /** 数据接口地址 */\r\n api?: string\r\n /** 请求方法,默认 post */\r\n apiMethod?: 'get' | 'post' | 'put' | 'delete'\r\n /** 固定请求参数 */\r\n apiParam?: Record<string, any>\r\n /** 初始每页条数 */\r\n pageSize?: number\r\n /** 是否自动请求 */\r\n immediate?: boolean\r\n /** 请求级覆盖 */\r\n reqOptions?: import('../../types/config').ReqOptions\r\n /** 请求成功回调(解封后的列表结果) */\r\n onLoaded?: (result: { list: any[]; total: number }) => void\r\n}\r\n\r\nexport interface ListData {\r\n list: any[]\r\n total: number\r\n pageSize: number\r\n currentPage: number\r\n}\r\n\r\nexport function useDataGrid(options: UseDataGridOptions = {}) {\r\n const cfg = getGlobalConfig()\r\n const {\r\n api,\r\n apiMethod = 'post',\r\n apiParam = {},\r\n pageSize: initPageSize = cfg.page.pager.pageSize,\r\n immediate = false,\r\n reqOptions,\r\n onLoaded\r\n } = options\r\n\r\n const currentPage = ref(1)\r\n const pageSize = ref(initPageSize)\r\n const total = ref(0)\r\n const list = shallowRef<any[]>([])\r\n const loading = ref(false)\r\n const searchParams = reactive<Record<string, any>>({})\r\n const selection = ref<any[]>([])\r\n // 排序状态\r\n const sortState = ref<SortState | null>(null)\r\n\r\n const pageParam = cfg.request.pageParam\r\n const listCfg = cfg.response.list\r\n\r\n let controller: AbortController | null = null\r\n\r\n /**\r\n * 组装列表请求体:{ currentPage, pageSize, param: {...搜索+固定参数+排序} }\r\n */\r\n function buildParams(extra?: Record<string, any>) {\r\n const params: Record<string, any> = {\r\n [pageParam.pageField]: currentPage.value,\r\n [pageParam.sizeField]: pageSize.value\r\n }\r\n const search = {\r\n ...apiParam,\r\n ...searchParams,\r\n ...(extra || {})\r\n }\r\n // 如果有排序,增加排序参数\r\n if (sortState.value) {\r\n search.sortProp = sortState.value.prop\r\n search.sortOrder = sortState.value.order\r\n }\r\n params[pageParam.searchField] = search\r\n return params\r\n }\r\n\r\n /**\r\n * 请求数据\r\n */\r\n async function fetchData(extra?: Record<string, any>): Promise<ListData> {\r\n if (!api) {\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n }\r\n\r\n loading.value = true\r\n if (controller) controller.abort()\r\n controller = new AbortController()\r\n\r\n const body = buildParams(extra)\r\n try {\r\n let result: ApiResult<any>\r\n if (apiMethod === 'get') {\r\n result = await request.request({ url: api, method: 'get', params: body }, { ...reqOptions, signal: controller.signal })\r\n } else {\r\n result = await request.request({ url: api, method: apiMethod, data: body }, { ...reqOptions, signal: controller.signal })\r\n }\r\n\r\n if (result.success) {\r\n const data = result.data\r\n // 解封列表结构\r\n let rows: any[] = []\r\n let totalCount = 0\r\n if (Array.isArray(data)) {\r\n rows = data\r\n totalCount = data.length\r\n } else if (data && typeof data === 'object') {\r\n rows = data[listCfg.listName] ?? data.list ?? []\r\n totalCount = data[listCfg.totalName] ?? data.total ?? rows.length\r\n }\r\n list.value = rows\r\n total.value = totalCount\r\n onLoaded?.({ list: rows, total: totalCount })\r\n return {\r\n list: rows,\r\n total: totalCount,\r\n pageSize: data?.[listCfg.pageSizeName] ?? pageSize.value,\r\n currentPage: data?.[listCfg.currentPageName] ?? currentPage.value\r\n }\r\n }\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n } finally {\r\n loading.value = false\r\n controller = null\r\n }\r\n }\r\n\r\n /** 刷新当前页 */\r\n function refresh() {\r\n return fetchData()\r\n }\r\n\r\n function onChangeCurrentpage(value: number) {\r\n currentPage.value = value\r\n return fetchData()\r\n }\r\n\r\n function onChangePagesize(value: number) {\r\n pageSize.value = value\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n function setSelection(rows: any[]) {\r\n selection.value = rows || []\r\n }\r\n\r\n function getSelection() {\r\n return selection.value\r\n }\r\n\r\n function clearSelection() {\r\n selection.value = []\r\n }\r\n\r\n /** 合并搜索条件并查询(搜索面板用) */\r\n function search(params?: Record<string, any>) {\r\n if (params) Object.assign(searchParams, params)\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 排序变更,更新排序状态并查询 */\r\n function changeSort({ prop, order }: { prop: string; order: 'ascending' | 'descending' | null }) {\r\n if (!prop || !order) {\r\n sortState.value = null\r\n } else {\r\n sortState.value = { prop, order }\r\n }\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 重置到第一页并清空搜索条件 + 排序 */\r\n function reset() {\r\n currentPage.value = 1\r\n Object.keys(searchParams).forEach((k) => delete searchParams[k])\r\n sortState.value = null\r\n return fetchData()\r\n }\r\n\r\n if (immediate) {\r\n fetchData()\r\n }\r\n\r\n return {\r\n // 状态\r\n currentPage,\r\n page: currentPage,\r\n pageSize,\r\n total,\r\n list,\r\n loading,\r\n searchParams,\r\n selection,\r\n sortState,\r\n // 方法\r\n fetchData,\r\n refresh,\r\n reset,\r\n search,\r\n changeSort,\r\n onChangeCurrentpage,\r\n onChangePagesize,\r\n setSelection,\r\n getSelection,\r\n clearSelection,\r\n buildParams\r\n }\r\n}\r\n\r\nexport type DataGridController = ReturnType<typeof useDataGrid>\r\n","import { ref, computed, nextTick } from 'vue'\r\nimport type { VNode } from 'vue'\r\nimport { safeJsonParse } from '../../../lib/core/utils'\r\n\r\n/**\r\n * 动态列:从默认插槽的 el-table-column vnode 中提取列元信息,\r\n * 支持显示/隐藏/排序,状态可持久化到 localStorage(PRD 4.2)。\r\n */\r\n\r\nexport interface ColumnMeta {\r\n /** el-table-column 的 key(prop 或自动 id) */\r\n key: string\r\n label: string\r\n /** 用户可控制的业务列(selection/index 等内置列不可控) */\r\n controllable: boolean\r\n visible: boolean\r\n order: number\r\n}\r\n\r\n/** 判定 vnode 是否为 el-table-column(type 显式声明或组件 name 匹配) */\r\nfunction isColumnVNode(vnode: VNode): boolean {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n const typeName =\r\n (vnode.type as any)?.name ||\r\n (vnode.type as any)?.__name ||\r\n ''\r\n return (\r\n String(typeName).includes('TableColumn') ||\r\n (vnode.type as any) === Symbol.for('el-table-column') ||\r\n // 全局注册组件时 type 为对象带 name\r\n typeName === 'ElTableColumn' ||\r\n !!(props.prop || props.label || props.type)\r\n )\r\n}\r\n\r\n/**\r\n * 从插槽 vnode 数组中解析列\r\n */\r\nexport function extractColumns(vnodes: VNode[]): ColumnMeta[] {\r\n const columns: ColumnMeta[] = []\r\n let auto = 0\r\n const walk = (nodes: VNode[]) => {\r\n nodes.forEach((vnode) => {\r\n if (!vnode || typeof vnode !== 'object') return\r\n const props = (vnode.props || {}) as Record<string, any>\r\n\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n const colType = props.type // selection / index / expand\r\n const key = String(props.prop || props.columnKey || `col-${auto}`)\r\n columns.push({\r\n key,\r\n label: props.label || key,\r\n controllable: !colType,\r\n visible: props.hidden !== true,\r\n order: columns.length\r\n })\r\n }\r\n // 递归子节点(fragment)\r\n const children = (vnode as any).children\r\n if (Array.isArray(children)) {\r\n walk(children.filter((c: any) => c && typeof c === 'object') as VNode[])\r\n }\r\n })\r\n }\r\n walk(vnodes)\r\n return columns\r\n}\r\n\r\n/**\r\n * 按列设置中的 order 重排业务列 vnode。\r\n * key 解析规则必须与 extractColumns 完全一致(含自动编号计数),\r\n * 未匹配到列设置的 vnode 保持原相对顺序排在末尾。\r\n */\r\nexport function orderColumnVnodes(vnodes: VNode[], orderMap: Map<string, number>): VNode[] {\r\n let auto = 0\r\n const keyOf = (vnode: VNode): string => {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n return String(props.prop || props.columnKey || `col-${auto}`)\r\n }\r\n return ''\r\n }\r\n return vnodes\r\n .map((vnode, index) => ({ vnode, index, order: orderMap.get(keyOf(vnode)) }))\r\n .sort((a, b) => {\r\n if (a.order == null && b.order == null) return a.index - b.index\r\n if (a.order == null) return 1\r\n if (b.order == null) return -1\r\n return a.order - b.order\r\n })\r\n .map((item) => item.vnode)\r\n}\r\n\r\nexport function useColumnSettings(storageKey?: string) {\r\n const columns = ref<ColumnMeta[]>([])\r\n /** 初始列定义快照(插槽声明顺序),供「恢复默认」还原 */\r\n let initialColumns: ColumnMeta[] = []\r\n const settingVisible = ref(false)\r\n\r\n const storageKeyName = storageKey ? `wd:columns:${storageKey}` : ''\r\n\r\n function loadStored(): Record<string, { visible?: boolean; order?: number }> {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return {}\r\n return safeJsonParse(localStorage.getItem(storageKeyName), {})\r\n }\r\n\r\n function persist() {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return\r\n const data: Record<string, any> = {}\r\n columns.value.forEach((c, i) => {\r\n data[c.key] = { visible: c.visible, order: i }\r\n })\r\n localStorage.setItem(storageKeyName, JSON.stringify(data))\r\n }\r\n\r\n /** 合并本地存储的显隐/排序后写入列状态 */\r\n function applyParsed(parsed: ColumnMeta[]) {\r\n initialColumns = parsed.map((col) => ({ ...col }))\r\n const stored = loadStored()\r\n columns.value = parsed.map((col) => {\r\n const s = stored[col.key]\r\n if (s) {\r\n return { ...col, visible: s.visible ?? col.visible, order: s.order ?? col.order }\r\n }\r\n return col\r\n })\r\n columns.value.sort((a, b) => a.order - b.order)\r\n }\r\n\r\n function init(vnodes: VNode[]) {\r\n applyParsed(extractColumns(vnodes))\r\n }\r\n\r\n /** 直接以列元信息初始化(columns 配置驱动的组件用,如 EditableGrid) */\r\n function initMetas(metas: Array<{ key: string; label: string; controllable?: boolean; visible?: boolean }>) {\r\n applyParsed(\r\n metas.map((m, i) => ({\r\n key: m.key,\r\n label: m.label,\r\n controllable: m.controllable !== false,\r\n visible: m.visible !== false,\r\n order: i\r\n }))\r\n )\r\n }\r\n\r\n function setVisible(key: string, visible: boolean) {\r\n const col = columns.value.find((c) => c.key === key)\r\n if (col) {\r\n col.visible = visible\r\n persist()\r\n }\r\n }\r\n\r\n function move(key: string, direction: -1 | 1) {\r\n const idx = columns.value.findIndex((c) => c.key === key)\r\n const target = idx + direction\r\n if (idx < 0 || target < 0 || target >= columns.value.length) return\r\n const arr = columns.value.slice()\r\n const [item] = arr.splice(idx, 1)\r\n arr.splice(target, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /**\r\n * 拖拽重排:把 fromKey 拖到 toKey 的前面(before)或后面(after)。\r\n * 仅允许在可控列之间拖拽,selection/index 等内置列不参与。\r\n */\r\n function reorder(fromKey: string, toKey: string, position: 'before' | 'after' = 'before') {\r\n if (!fromKey || !toKey || fromKey === toKey) return\r\n const arr = columns.value.slice()\r\n const fromIdx = arr.findIndex((c) => c.key === fromKey)\r\n if (fromIdx < 0) return\r\n if (!arr[fromIdx].controllable) return\r\n const [item] = arr.splice(fromIdx, 1)\r\n let insertIdx = arr.findIndex((c) => c.key === toKey)\r\n if (insertIdx < 0 || !arr[insertIdx].controllable) return\r\n if (position === 'after') insertIdx += 1\r\n arr.splice(insertIdx, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /** 恢复到插槽声明时的原始顺序与显隐状态 */\r\n function reset() {\r\n columns.value = initialColumns.map((col, i) => ({ ...col, visible: true, order: i }))\r\n if (storageKeyName && typeof localStorage !== 'undefined') {\r\n localStorage.removeItem(storageKeyName)\r\n }\r\n }\r\n\r\n /** 隐藏列的 key 集合,供模板过滤插槽 vnode */\r\n const hiddenKeys = computed(() => new Set(columns.value.filter((c) => !c.visible).map((c) => c.key)))\r\n\r\n /** 列 key → 当前排序位置,供插槽 vnode 重排 */\r\n const columnOrderMap = computed(() => new Map(columns.value.map((c, i) => [c.key, i])))\r\n\r\n const controllableColumns = computed(() => columns.value.filter((c) => c.controllable))\r\n\r\n return {\r\n columns,\r\n controllableColumns,\r\n hiddenKeys,\r\n columnOrderMap,\r\n settingVisible,\r\n init,\r\n initMetas,\r\n setVisible,\r\n move,\r\n reorder,\r\n reset,\r\n nextTick\r\n }\r\n}\r\n"],"names":["useDataGrid","options","cfg","getGlobalConfig","api","apiMethod","apiParam","initPageSize","immediate","reqOptions","onLoaded","currentPage","ref","pageSize","total","list","shallowRef","loading","searchParams","reactive","selection","sortState","pageParam","listCfg","controller","buildParams","extra","params","search","fetchData","body","result","request","data","rows","totalCount","refresh","onChangeCurrentpage","value","onChangePagesize","setSelection","getSelection","clearSelection","changeSort","prop","order","reset","k","isColumnVNode","vnode","props","typeName","_a","_b","extractColumns","vnodes","columns","auto","walk","nodes","colType","key","children","c","orderColumnVnodes","orderMap","keyOf","index","a","b","item","useColumnSettings","storageKey","initialColumns","settingVisible","storageKeyName","loadStored","safeJsonParse","persist","i","applyParsed","parsed","col","stored","s","init","initMetas","metas","m","setVisible","visible","move","direction","idx","target","arr","reorder","fromKey","toKey","position","fromIdx","insertIdx","hiddenKeys","computed","columnOrderMap","controllableColumns","nextTick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useColumnSettings-BwG2V9xp.mjs","sources":["../../src/lib/composables/useDataGrid.ts","../../src/components/data/datagrid/useColumnSettings.ts"],"sourcesContent":["import { ref, reactive, shallowRef } from 'vue'\r\nimport { request, type ApiResult } from '../core/http'\r\nimport { getGlobalConfig } from '../core/config'\r\n\r\n/**\r\n * useDataGrid(PRD 5.3)\r\n * DataGrid 状态管理:分页 / 搜索 / 选中 / 请求\r\n *\r\n * @example\r\n * const grid = useDataGrid({ pageSize: 20 })\r\n * grid.fetchData()\r\n */\r\n\r\nexport interface SortState {\r\n prop: string\r\n order: 'ascending' | 'descending'\r\n}\r\n\r\nexport interface UseDataGridOptions {\r\n /** 数据接口地址 */\r\n api?: string\r\n /** 请求方法,默认 post */\r\n apiMethod?: 'get' | 'post' | 'put' | 'delete'\r\n /** 固定请求参数 */\r\n apiParam?: Record<string, any>\r\n /** 初始每页条数 */\r\n pageSize?: number\r\n /** 是否自动请求 */\r\n immediate?: boolean\r\n /** 请求级覆盖 */\r\n reqOptions?: import('../../types/config').ReqOptions\r\n /** 请求成功回调(解封后的列表结果) */\r\n onLoaded?: (result: { list: any[]; total: number }) => void\r\n}\r\n\r\nexport interface ListData {\r\n list: any[]\r\n total: number\r\n pageSize: number\r\n currentPage: number\r\n}\r\n\r\nexport function useDataGrid(options: UseDataGridOptions = {}) {\r\n const cfg = getGlobalConfig()\r\n const {\r\n api,\r\n apiMethod = 'post',\r\n apiParam = {},\r\n pageSize: initPageSize = cfg.page.pager.pageSize,\r\n immediate = false,\r\n reqOptions,\r\n onLoaded\r\n } = options\r\n\r\n const currentPage = ref(1)\r\n const pageSize = ref(initPageSize)\r\n const total = ref(0)\r\n const list = shallowRef<any[]>([])\r\n const loading = ref(false)\r\n const searchParams = reactive<Record<string, any>>({})\r\n const selection = ref<any[]>([])\r\n // 排序状态\r\n const sortState = ref<SortState | null>(null)\r\n\r\n const pageParam = cfg.request.pageParam\r\n const listCfg = cfg.response.list\r\n\r\n let controller: AbortController | null = null\r\n\r\n /**\r\n * 组装列表请求体:{ currentPage, pageSize, param: {...搜索+固定参数+排序} }\r\n */\r\n function buildParams(extra?: Record<string, any>) {\r\n const params: Record<string, any> = {\r\n [pageParam.pageField]: currentPage.value,\r\n [pageParam.sizeField]: pageSize.value\r\n }\r\n const search = {\r\n ...apiParam,\r\n ...searchParams,\r\n ...(extra || {})\r\n }\r\n // 如果有排序,增加排序参数\r\n if (sortState.value) {\r\n search.sortProp = sortState.value.prop\r\n search.sortOrder = sortState.value.order\r\n }\r\n params[pageParam.searchField] = search\r\n return params\r\n }\r\n\r\n /**\r\n * 请求数据\r\n */\r\n async function fetchData(extra?: Record<string, any>): Promise<ListData> {\r\n if (!api) {\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n }\r\n\r\n loading.value = true\r\n if (controller) controller.abort()\r\n controller = new AbortController()\r\n\r\n const body = buildParams(extra)\r\n try {\r\n let result: ApiResult<any>\r\n if (apiMethod === 'get') {\r\n result = await request.request({ url: api, method: 'get', params: body }, { ...reqOptions, signal: controller.signal })\r\n } else {\r\n result = await request.request({ url: api, method: apiMethod, data: body }, { ...reqOptions, signal: controller.signal })\r\n }\r\n\r\n if (result.success) {\r\n const data = result.data\r\n // 解封列表结构\r\n let rows: any[] = []\r\n let totalCount = 0\r\n if (Array.isArray(data)) {\r\n rows = data\r\n totalCount = data.length\r\n } else if (data && typeof data === 'object') {\r\n rows = data[listCfg.listName] ?? data.list ?? []\r\n totalCount = data[listCfg.totalName] ?? data.total ?? rows.length\r\n }\r\n list.value = rows\r\n total.value = totalCount\r\n onLoaded?.({ list: rows, total: totalCount })\r\n return {\r\n list: rows,\r\n total: totalCount,\r\n pageSize: data?.[listCfg.pageSizeName] ?? pageSize.value,\r\n currentPage: data?.[listCfg.currentPageName] ?? currentPage.value\r\n }\r\n }\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n } finally {\r\n loading.value = false\r\n controller = null\r\n }\r\n }\r\n\r\n /** 刷新当前页 */\r\n function refresh() {\r\n return fetchData()\r\n }\r\n\r\n function onChangeCurrentpage(value: number) {\r\n currentPage.value = value\r\n return fetchData()\r\n }\r\n\r\n function onChangePagesize(value: number) {\r\n pageSize.value = value\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n function setSelection(rows: any[]) {\r\n selection.value = rows || []\r\n }\r\n\r\n function getSelection() {\r\n return selection.value\r\n }\r\n\r\n function clearSelection() {\r\n selection.value = []\r\n }\r\n\r\n /** 合并搜索条件并查询(搜索面板用) */\r\n function search(params?: Record<string, any>) {\r\n if (params) Object.assign(searchParams, params)\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 排序变更,更新排序状态并查询 */\r\n function changeSort({ prop, order }: { prop: string; order: 'ascending' | 'descending' | null }) {\r\n if (!prop || !order) {\r\n sortState.value = null\r\n } else {\r\n sortState.value = { prop, order }\r\n }\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 重置到第一页并清空搜索条件 + 排序 */\r\n function reset() {\r\n currentPage.value = 1\r\n Object.keys(searchParams).forEach((k) => delete searchParams[k])\r\n sortState.value = null\r\n return fetchData()\r\n }\r\n\r\n if (immediate) {\r\n fetchData()\r\n }\r\n\r\n return {\r\n // 状态\r\n currentPage,\r\n page: currentPage,\r\n pageSize,\r\n total,\r\n list,\r\n loading,\r\n searchParams,\r\n selection,\r\n sortState,\r\n // 方法\r\n fetchData,\r\n refresh,\r\n reset,\r\n search,\r\n changeSort,\r\n onChangeCurrentpage,\r\n onChangePagesize,\r\n setSelection,\r\n getSelection,\r\n clearSelection,\r\n buildParams\r\n }\r\n}\r\n\r\nexport type DataGridController = ReturnType<typeof useDataGrid>\r\n","import { ref, computed, nextTick } from 'vue'\r\nimport type { VNode } from 'vue'\r\nimport { safeJsonParse } from '../../../lib/core/utils'\r\n\r\n/**\r\n * 动态列:从默认插槽的 el-table-column vnode 中提取列元信息,\r\n * 支持显示/隐藏/排序,状态可持久化到 localStorage(PRD 4.2)。\r\n */\r\n\r\nexport interface ColumnMeta {\r\n /** el-table-column 的 key(prop 或自动 id) */\r\n key: string\r\n label: string\r\n /** 用户可控制的业务列(selection/index 等内置列不可控) */\r\n controllable: boolean\r\n visible: boolean\r\n order: number\r\n}\r\n\r\n/** 判定 vnode 是否为 el-table-column(type 显式声明或组件 name 匹配) */\r\nfunction isColumnVNode(vnode: VNode): boolean {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n const typeName =\r\n (vnode.type as any)?.name ||\r\n (vnode.type as any)?.__name ||\r\n ''\r\n return (\r\n String(typeName).includes('TableColumn') ||\r\n (vnode.type as any) === Symbol.for('el-table-column') ||\r\n // 全局注册组件时 type 为对象带 name\r\n typeName === 'ElTableColumn' ||\r\n !!(props.prop || props.label || props.type)\r\n )\r\n}\r\n\r\n/**\r\n * 从插槽 vnode 数组中解析列\r\n */\r\nexport function extractColumns(vnodes: VNode[]): ColumnMeta[] {\r\n const columns: ColumnMeta[] = []\r\n let auto = 0\r\n const walk = (nodes: VNode[]) => {\r\n nodes.forEach((vnode) => {\r\n if (!vnode || typeof vnode !== 'object') return\r\n const props = (vnode.props || {}) as Record<string, any>\r\n\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n const colType = props.type // selection / index / expand\r\n const key = String(props.prop || props.columnKey || `col-${auto}`)\r\n columns.push({\r\n key,\r\n label: props.label || key,\r\n controllable: !colType,\r\n visible: props.hidden !== true,\r\n order: columns.length\r\n })\r\n }\r\n // 递归子节点(fragment)\r\n const children = (vnode as any).children\r\n if (Array.isArray(children)) {\r\n walk(children.filter((c: any) => c && typeof c === 'object') as VNode[])\r\n }\r\n })\r\n }\r\n walk(vnodes)\r\n return columns\r\n}\r\n\r\n/**\r\n * 按列设置中的 order 重排业务列 vnode。\r\n * key 解析规则必须与 extractColumns 完全一致(含自动编号计数),\r\n * 未匹配到列设置的 vnode 保持原相对顺序排在末尾。\r\n */\r\nexport function orderColumnVnodes(vnodes: VNode[], orderMap: Map<string, number>): VNode[] {\r\n let auto = 0\r\n const keyOf = (vnode: VNode): string => {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n return String(props.prop || props.columnKey || `col-${auto}`)\r\n }\r\n return ''\r\n }\r\n return vnodes\r\n .map((vnode, index) => ({ vnode, index, order: orderMap.get(keyOf(vnode)) }))\r\n .sort((a, b) => {\r\n if (a.order == null && b.order == null) return a.index - b.index\r\n if (a.order == null) return 1\r\n if (b.order == null) return -1\r\n return a.order - b.order\r\n })\r\n .map((item) => item.vnode)\r\n}\r\n\r\nexport function useColumnSettings(storageKey?: string) {\r\n const columns = ref<ColumnMeta[]>([])\r\n /** 初始列定义快照(插槽声明顺序),供「恢复默认」还原 */\r\n let initialColumns: ColumnMeta[] = []\r\n const settingVisible = ref(false)\r\n\r\n const storageKeyName = storageKey ? `wd:columns:${storageKey}` : ''\r\n\r\n function loadStored(): Record<string, { visible?: boolean; order?: number }> {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return {}\r\n return safeJsonParse(localStorage.getItem(storageKeyName), {})\r\n }\r\n\r\n function persist() {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return\r\n const data: Record<string, any> = {}\r\n columns.value.forEach((c, i) => {\r\n data[c.key] = { visible: c.visible, order: i }\r\n })\r\n localStorage.setItem(storageKeyName, JSON.stringify(data))\r\n }\r\n\r\n /** 合并本地存储的显隐/排序后写入列状态 */\r\n function applyParsed(parsed: ColumnMeta[]) {\r\n initialColumns = parsed.map((col) => ({ ...col }))\r\n const stored = loadStored()\r\n columns.value = parsed.map((col) => {\r\n const s = stored[col.key]\r\n if (s) {\r\n return { ...col, visible: s.visible ?? col.visible, order: s.order ?? col.order }\r\n }\r\n return col\r\n })\r\n columns.value.sort((a, b) => a.order - b.order)\r\n }\r\n\r\n function init(vnodes: VNode[]) {\r\n applyParsed(extractColumns(vnodes))\r\n }\r\n\r\n /** 直接以列元信息初始化(columns 配置驱动的组件用,如 EditableGrid) */\r\n function initMetas(metas: Array<{ key: string; label: string; controllable?: boolean; visible?: boolean }>) {\r\n applyParsed(\r\n metas.map((m, i) => ({\r\n key: m.key,\r\n label: m.label,\r\n controllable: m.controllable !== false,\r\n visible: m.visible !== false,\r\n order: i\r\n }))\r\n )\r\n }\r\n\r\n function setVisible(key: string, visible: boolean) {\r\n const col = columns.value.find((c) => c.key === key)\r\n if (col) {\r\n col.visible = visible\r\n persist()\r\n }\r\n }\r\n\r\n function move(key: string, direction: -1 | 1) {\r\n const idx = columns.value.findIndex((c) => c.key === key)\r\n const target = idx + direction\r\n if (idx < 0 || target < 0 || target >= columns.value.length) return\r\n const arr = columns.value.slice()\r\n const [item] = arr.splice(idx, 1)\r\n arr.splice(target, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /**\r\n * 拖拽重排:把 fromKey 拖到 toKey 的前面(before)或后面(after)。\r\n * 仅允许在可控列之间拖拽,selection/index 等内置列不参与。\r\n */\r\n function reorder(fromKey: string, toKey: string, position: 'before' | 'after' = 'before') {\r\n if (!fromKey || !toKey || fromKey === toKey) return\r\n const arr = columns.value.slice()\r\n const fromIdx = arr.findIndex((c) => c.key === fromKey)\r\n if (fromIdx < 0) return\r\n if (!arr[fromIdx].controllable) return\r\n const [item] = arr.splice(fromIdx, 1)\r\n let insertIdx = arr.findIndex((c) => c.key === toKey)\r\n if (insertIdx < 0 || !arr[insertIdx].controllable) return\r\n if (position === 'after') insertIdx += 1\r\n arr.splice(insertIdx, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /** 恢复到插槽声明时的原始顺序与显隐状态 */\r\n function reset() {\r\n columns.value = initialColumns.map((col, i) => ({ ...col, visible: true, order: i }))\r\n if (storageKeyName && typeof localStorage !== 'undefined') {\r\n localStorage.removeItem(storageKeyName)\r\n }\r\n }\r\n\r\n /** 隐藏列的 key 集合,供模板过滤插槽 vnode */\r\n const hiddenKeys = computed(() => new Set(columns.value.filter((c) => !c.visible).map((c) => c.key)))\r\n\r\n /** 列 key → 当前排序位置,供插槽 vnode 重排 */\r\n const columnOrderMap = computed(() => new Map(columns.value.map((c, i) => [c.key, i])))\r\n\r\n const controllableColumns = computed(() => columns.value.filter((c) => c.controllable))\r\n\r\n return {\r\n columns,\r\n controllableColumns,\r\n hiddenKeys,\r\n columnOrderMap,\r\n settingVisible,\r\n init,\r\n initMetas,\r\n setVisible,\r\n move,\r\n reorder,\r\n reset,\r\n nextTick\r\n }\r\n}\r\n"],"names":["useDataGrid","options","cfg","getGlobalConfig","api","apiMethod","apiParam","initPageSize","immediate","reqOptions","onLoaded","currentPage","ref","pageSize","total","list","shallowRef","loading","searchParams","reactive","selection","sortState","pageParam","listCfg","controller","buildParams","extra","params","search","fetchData","body","result","request","data","rows","totalCount","refresh","onChangeCurrentpage","value","onChangePagesize","setSelection","getSelection","clearSelection","changeSort","prop","order","reset","k","isColumnVNode","vnode","props","typeName","_a","_b","extractColumns","vnodes","columns","auto","walk","nodes","colType","key","children","c","orderColumnVnodes","orderMap","keyOf","index","a","b","item","useColumnSettings","storageKey","initialColumns","settingVisible","storageKeyName","loadStored","safeJsonParse","persist","i","applyParsed","parsed","col","stored","s","init","initMetas","metas","m","setVisible","visible","move","direction","idx","target","arr","reorder","fromKey","toKey","position","fromIdx","insertIdx","hiddenKeys","computed","columnOrderMap","controllableColumns","nextTick"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { shallowRef as m, ref as g, onMounted as p, watch as w } from "vue";
|
|
2
|
-
import { r as y } from "./http-
|
|
2
|
+
import { r as y } from "./http-C06mNpwY.mjs";
|
|
3
3
|
function P(a) {
|
|
4
4
|
const i = m([]), f = g(!1), s = g(!1);
|
|
5
5
|
function n(r) {
|
|
@@ -61,4 +61,4 @@ function P(a) {
|
|
|
61
61
|
export {
|
|
62
62
|
P as u
|
|
63
63
|
};
|
|
64
|
-
//# sourceMappingURL=useOptionsLoader-
|
|
64
|
+
//# sourceMappingURL=useOptionsLoader-DEVCYhrp.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOptionsLoader-
|
|
1
|
+
{"version":3,"file":"useOptionsLoader-DEVCYhrp.mjs","sources":["../../src/components/inputs/useOptionsLoader.ts"],"sourcesContent":["/**\n * 输入选择组共享:选项自动加载(静态数组 or api)、前插/后追加固定项\n */\nimport { ref, shallowRef, onMounted, watch, type Ref } from 'vue'\nimport { request } from '../../lib/core/http'\n\nexport interface UseOptionsOptions {\n api: Ref<string>\n apiMethod: Ref<'get' | 'post'>\n apiParam: Ref<Record<string, any>>\n active: Ref<boolean>\n dataSource: Ref<any[] | undefined>\n textProp: Ref<string>\n valueProp: Ref<string>\n tipsProp?: Ref<string>\n addData: Ref<any[] | undefined>\n appendData: Ref<any[] | undefined>\n emit: (event: any, ...args: any[]) => void\n}\n\nexport interface NormalizedOption {\n text: string\n value: any\n /** 悬停提示内容(取 tipsProp 字段,无则为空字符串) */\n tips: string\n /** 原始数据(默认插槽上下文 { option }) */\n raw: Record<string, any>\n}\n\nexport function useOptionsLoader(opts: UseOptionsOptions) {\n const options = shallowRef<NormalizedOption[]>([])\n const loading = ref(false)\n /** 标记是否加载过,避免重复请求 */\n const loaded = ref(false)\n\n function normalize(list: any[]): NormalizedOption[] {\n const textKey = opts.textProp.value\n const valueKey = opts.valueProp.value\n const tipsKey = opts.tipsProp?.value || 'tips'\n return (list || []).map((item) => {\n if (item && typeof item === 'object') {\n const tips = item[tipsKey]\n return {\n text: item[textKey],\n value: item[valueKey],\n tips: tips === null || tips === undefined ? '' : String(tips),\n raw: item\n }\n }\n // 基本类型数组 [1,2,3] / ['a','b']\n return { text: String(item), value: item, tips: '', raw: { [textKey]: String(item), [valueKey]: item } }\n })\n }\n\n async function fetchOptions(extraParam?: Record<string, any>) {\n // 静态数据源\n if (opts.dataSource.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value))\n return\n }\n if (!opts.api.value) {\n options.value = mergeFixed([])\n return\n }\n loading.value = true\n opts.emit('apiBefore', { url: opts.api.value })\n try {\n const param = { ...opts.apiParam.value, ...(extraParam || {}) }\n const result =\n opts.apiMethod.value === 'get'\n ? await request.get(opts.api.value, param)\n : await request.post(opts.api.value, param)\n if (result.success) {\n const list = Array.isArray(result.data) ? result.data : result.data?.list || []\n options.value = mergeFixed(normalize(list))\n opts.emit('apiSuccess', { data: result.data })\n } else {\n opts.emit('apiFail', { code: result.code, message: result.message })\n }\n } catch (error: any) {\n opts.emit('apiFail', { error, message: error?.message })\n } finally {\n loading.value = false\n opts.emit('apiAfter')\n loaded.value = true\n }\n }\n\n /** 合并前插/后追加固定项 */\n function mergeFixed(main: NormalizedOption[]): NormalizedOption[] {\n const head = normalize(opts.addData.value || [])\n const tail = normalize(opts.appendData.value || [])\n return [...head, ...main, ...tail]\n }\n\n /** 远程搜索(Select remote / AutoComplete) */\n async function remoteSearch(keyword: string, keywordKey = 'keyword') {\n if (!opts.api.value) return\n await fetchOptions({ [keywordKey]: keyword })\n }\n\n onMounted(() => {\n if (opts.active.value) {\n fetchOptions()\n } else if (opts.dataSource.value || !opts.api.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value || []))\n }\n })\n\n watch(\n () => [opts.api.value, opts.dataSource.value],\n () => {\n if (opts.active.value || opts.dataSource.value) fetchOptions()\n }\n )\n\n return { options, loading, fetchOptions, remoteSearch, loaded }\n}\n"],"names":["useOptionsLoader","opts","options","shallowRef","loading","ref","loaded","normalize","list","textKey","valueKey","tipsKey","_a","item","tips","fetchOptions","extraParam","mergeFixed","param","result","request","error","main","head","tail","remoteSearch","keyword","keywordKey","onMounted","watch"],"mappings":"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"}
|
package/dist/data-form/index.mjs
CHANGED
package/dist/data-form/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.wd-data-form[data-v-
|
|
1
|
+
.wd-data-form[data-v-af8e46f8]{width:100%}.wd-data-form__footer[data-v-af8e46f8]{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:var(--wd-form-footer-padding, 12px 0 0);border-top:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #e4e7ed);margin-top:var(--wd-spacing-base, 12px);border-radius:var(--wd-form-footer-radius, 0);background:var(--wd-form-footer-bg, transparent)}
|
package/dist/data-grid/index.mjs
CHANGED