@hkyhy/marsun-components-core 0.1.45 → 0.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/File/FilePreview/FilePreviewContent.js +108 -58
  2. package/dist/components/File/FilePreview/FilePreviewContent.js.map +1 -1
  3. package/dist/components/Form/index.d.ts +1 -1
  4. package/dist/components/Form/kneFormInfo.d.ts +2 -0
  5. package/dist/components/Form/kneFormInfo.js +18 -17
  6. package/dist/components/Form/kneFormInfo.js.map +1 -1
  7. package/dist/components/OrgTree/OrgTree.js +52 -43
  8. package/dist/components/OrgTree/OrgTree.js.map +1 -1
  9. package/dist/components/OrgTree/style.module.scss.js +5 -5
  10. package/dist/components/PermissionBindPanel/PermissionBindPanel.d.ts +4 -1
  11. package/dist/components/PermissionBindPanel/PermissionBindPanel.js +121 -117
  12. package/dist/components/PermissionBindPanel/PermissionBindPanel.js.map +1 -1
  13. package/dist/components/Stat/StatCard/index.d.ts +4 -0
  14. package/dist/components/Stat/StatCard/index.js +45 -29
  15. package/dist/components/Stat/StatCard/index.js.map +1 -1
  16. package/dist/components/Stat/StatCardList.d.ts +0 -2
  17. package/dist/components/Stat/StatCardList.js.map +1 -1
  18. package/dist/components/TooltipInfo/TooltipInfo.js +14 -8
  19. package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -1
  20. package/dist/components/Upload/index.d.ts +6 -23
  21. package/dist/components/Upload/index.js +254 -141
  22. package/dist/components/Upload/index.js.map +1 -1
  23. package/dist/components/Upload/style.module.scss.js +22 -15
  24. package/dist/components/Upload/style.module.scss.js.map +1 -1
  25. package/dist/components/index.d.ts +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +132 -131
  28. package/dist/marsun-components-core.css +1 -1
  29. package/dist/styles/global.css +1 -1
  30. package/package.json +7 -6
@@ -1,89 +1,139 @@
1
- import { jsx as n } from "react/jsx-runtime";
2
- import { Empty as u, Spin as x } from "antd";
3
- import { useRef as h, useState as g, useEffect as N } from "react";
4
- import { getPreviewKind as E, needsBlobPreview as P } from "../previewKind.js";
5
- import o from "./style.module.scss.js";
6
- import b from "classnames";
7
- async function H(r) {
8
- const e = await fetch(r);
9
- if (!e.ok) throw new Error(`预览加载失败 (${e.status})`);
10
- return e.arrayBuffer();
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { Empty as p, Spin as N } from "antd";
3
+ import { useRef as v, useState as y, useEffect as P } from "react";
4
+ import { getPreviewKind as b, needsBlobPreview as W } from "../previewKind.js";
5
+ import c from "./style.module.scss.js";
6
+ import H from "classnames";
7
+ async function S(e) {
8
+ const r = await fetch(e);
9
+ if (!r.ok) throw new Error(`预览加载失败 (${r.status})`);
10
+ return r.arrayBuffer();
11
11
  }
12
- async function B(r, e) {
13
- var d;
14
- const [{ default: s }] = await Promise.all([
12
+ function h(e, r) {
13
+ const t = e instanceof Error ? e.message : String(e ?? "");
14
+ return r === "excel" && /anchors/i.test(t) ? "该 Excel 含图表/绘图等对象,当前预览引擎无法解析,请下载后用本地软件打开" : t && !/^Cannot read properties/i.test(t) && !/^undefined/i.test(t) ? t : r === "excel" ? "Excel 预览失败,请下载后查看" : "预览加载失败";
15
+ }
16
+ async function B(e) {
17
+ try {
18
+ const { default: r } = await import("jszip"), t = await r.loadAsync(e), a = Object.keys(t.files), n = a.filter(
19
+ (i) => i.startsWith("xl/drawings/") || i.startsWith("xl/charts/") || i.startsWith("xl/diagrams/") || /drawing[0-9]*\.xml$/i.test(i)
20
+ );
21
+ if (n.length === 0) return null;
22
+ for (const i of n)
23
+ t.remove(i);
24
+ return await Promise.all(
25
+ a.filter((i) => /^xl\/worksheets\/[^/]+\.xml$/i.test(i) && t.file(i)).map(async (i) => {
26
+ const m = t.file(i);
27
+ if (!m) return;
28
+ const d = await m.async("string"), f = d.replace(/<drawing[^>]*\/>/gi, "").replace(/<drawing[^>]*>[\s\S]*?<\/drawing>/gi, "");
29
+ f !== d && t.file(i, f);
30
+ })
31
+ ), t.generateAsync({ type: "arraybuffer" });
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function x(e, r, t) {
37
+ const a = e.init(r);
38
+ try {
39
+ return await a.preview(t), () => a.destroy();
40
+ } catch (n) {
41
+ try {
42
+ a.destroy();
43
+ } catch {
44
+ }
45
+ throw n;
46
+ }
47
+ }
48
+ async function M(e, r) {
49
+ var n;
50
+ const [{ default: t }] = await Promise.all([
15
51
  import("@js-preview/excel"),
16
52
  Promise.resolve({ })
17
53
  ]), a = Math.max(
18
- ((d = r.parentElement) == null ? void 0 : d.clientHeight) ?? 0,
54
+ ((n = e.parentElement) == null ? void 0 : n.clientHeight) ?? 0,
19
55
  Math.round(window.innerHeight * 0.65),
20
56
  480
21
57
  );
22
- r.style.height = `${a}px`;
23
- const t = s.init(r);
24
- return await t.preview(e), () => t.destroy();
58
+ e.style.height = `${a}px`;
59
+ try {
60
+ return await x(t, e, r);
61
+ } catch (i) {
62
+ const m = i instanceof Error ? i.message : String(i ?? "");
63
+ if (!/anchors/i.test(m))
64
+ throw i instanceof Error ? i : new Error(h(i, "excel"));
65
+ const d = await B(r);
66
+ if (!d)
67
+ throw i instanceof Error ? i : new Error(h(i, "excel"));
68
+ e.innerHTML = "";
69
+ try {
70
+ return await x(t, e, d);
71
+ } catch (f) {
72
+ throw f instanceof Error ? f : new Error(h(f, "excel"));
73
+ }
74
+ }
25
75
  }
26
- async function M(r, e) {
27
- const { renderAsync: s } = await import("docx-preview"), a = new Blob([e]);
28
- await s(a, r, r, {
76
+ async function T(e, r) {
77
+ const { renderAsync: t } = await import("docx-preview"), a = new Blob([r]);
78
+ await t(a, e, e, {
29
79
  inWrapper: !0,
30
80
  ignoreWidth: !1,
31
81
  ignoreHeight: !1,
32
82
  breakPages: !0
33
83
  });
34
84
  }
35
- async function T(r, e, s) {
36
- const { init: a } = await import("pptx-preview"), t = a(r, { width: s, height: Math.round(s * 0.5625), mode: "list" });
37
- return await t.preview(e), () => t.destroy();
85
+ async function k(e, r, t) {
86
+ const { init: a } = await import("pptx-preview"), n = a(e, { width: t, height: Math.round(t * 0.5625), mode: "list" });
87
+ return await n.preview(r), () => n.destroy();
38
88
  }
39
- function W(r, e) {
40
- const s = new TextDecoder("utf-8"), a = document.createElement("pre");
41
- a.className = o["file-preview-text"], a.textContent = s.decode(e), r.appendChild(a);
89
+ function C(e, r) {
90
+ const t = new TextDecoder("utf-8"), a = document.createElement("pre");
91
+ a.className = c["file-preview-text"], a.textContent = t.decode(r), e.appendChild(a);
42
92
  }
43
- const D = ({
44
- file: r,
45
- previewUrl: e,
46
- unsupportedMessage: s = "暂不支持预览此文件类型"
93
+ const J = ({
94
+ file: e,
95
+ previewUrl: r,
96
+ unsupportedMessage: t = "暂不支持预览此文件类型"
47
97
  }) => {
48
- const a = h(null), t = h(void 0), [d, m] = g(!1), [p, w] = g(null), i = E(r);
49
- return N(() => {
50
- var v;
51
- const f = a.current;
52
- if (!f || !e) return;
53
- let l = !1;
54
- return (v = t.current) == null || v.call(t), t.current = void 0, f.innerHTML = "", w(null), (async () => {
55
- if (i !== "image" && !(i === "pdf" || i === "iframe") && !(i === "video" || i === "audio") && i !== "unsupported") {
98
+ const a = v(null), n = v(void 0), [i, m] = y(!1), [d, f] = y(null), s = b(e);
99
+ return P(() => {
100
+ var g;
101
+ const u = a.current;
102
+ if (!u || !r) return;
103
+ let w = !1;
104
+ return (g = n.current) == null || g.call(n), n.current = void 0, u.innerHTML = "", f(null), (async () => {
105
+ if (s !== "image" && !(s === "pdf" || s === "iframe") && !(s === "video" || s === "audio") && s !== "unsupported") {
56
106
  m(!0);
57
107
  try {
58
- const c = await H(e);
59
- if (l) return;
60
- if (i === "excel")
61
- t.current = await B(f, c);
62
- else if (i === "word")
63
- await M(f, c);
64
- else if (i === "ppt") {
65
- const y = f.clientWidth || 852;
66
- t.current = await T(f, c, y);
67
- } else i === "text" && W(f, c);
68
- } catch (c) {
69
- l || w(c instanceof Error ? c.message : "预览加载失败");
108
+ const l = await S(r);
109
+ if (w) return;
110
+ if (s === "excel")
111
+ n.current = await M(u, l);
112
+ else if (s === "word")
113
+ await T(u, l);
114
+ else if (s === "ppt") {
115
+ const E = u.clientWidth || 852;
116
+ n.current = await k(u, l, E);
117
+ } else s === "text" && C(u, l);
118
+ } catch (l) {
119
+ w || f(h(l, s));
70
120
  } finally {
71
- l || m(!1);
121
+ w || m(!1);
72
122
  }
73
123
  }
74
124
  })(), () => {
75
- var c;
76
- l = !0, (c = t.current) == null || c.call(t), t.current = void 0, f.innerHTML = "";
125
+ var l;
126
+ w = !0, (l = n.current) == null || l.call(n), n.current = void 0, u.innerHTML = "";
77
127
  };
78
- }, [e, i, r.id, r.name]), e ? i === "image" ? /* @__PURE__ */ n("div", { className: o["file-preview-media-wrap"], children: /* @__PURE__ */ n("img", { src: e, alt: r.name, className: o["file-preview-image"] }) }) : i === "pdf" || i === "iframe" ? /* @__PURE__ */ n("iframe", { src: e, title: r.name, className: o["file-preview-iframe"] }) : i === "video" ? /* @__PURE__ */ n("div", { className: o["file-preview-media-wrap"], children: /* @__PURE__ */ n("video", { src: e, controls: !0, className: o["file-preview-video"] }) }) : i === "audio" ? /* @__PURE__ */ n("div", { className: o["file-preview-audio-wrap"], children: /* @__PURE__ */ n("audio", { src: e, controls: !0, className: o["file-preview-audio"] }) }) : i === "unsupported" ? /* @__PURE__ */ n(u, { description: s }) : P(i) ? /* @__PURE__ */ n(
128
+ }, [r, s, e.id, e.name]), r ? s === "image" ? /* @__PURE__ */ o("div", { className: c["file-preview-media-wrap"], children: /* @__PURE__ */ o("img", { src: r, alt: e.name, className: c["file-preview-image"] }) }) : s === "pdf" || s === "iframe" ? /* @__PURE__ */ o("iframe", { src: r, title: e.name, className: c["file-preview-iframe"] }) : s === "video" ? /* @__PURE__ */ o("div", { className: c["file-preview-media-wrap"], children: /* @__PURE__ */ o("video", { src: r, controls: !0, className: c["file-preview-video"] }) }) : s === "audio" ? /* @__PURE__ */ o("div", { className: c["file-preview-audio-wrap"], children: /* @__PURE__ */ o("audio", { src: r, controls: !0, className: c["file-preview-audio"] }) }) : s === "unsupported" ? /* @__PURE__ */ o(p, { description: t }) : W(s) ? /* @__PURE__ */ o(
79
129
  "div",
80
130
  {
81
- className: b(o["file-preview-office"], o["file-preview-office-wrap"]),
82
- children: /* @__PURE__ */ n(x, { spinning: d, classNames: { root: o["file-preview-office-spin"] }, children: p ? /* @__PURE__ */ n(u, { description: p }) : /* @__PURE__ */ n("div", { ref: a, className: o["file-preview-office-inner"] }) })
131
+ className: H(c["file-preview-office"], c["file-preview-office-wrap"]),
132
+ children: /* @__PURE__ */ o(N, { spinning: i, classNames: { root: c["file-preview-office-spin"] }, children: d ? /* @__PURE__ */ o(p, { description: d }) : /* @__PURE__ */ o("div", { ref: a, className: c["file-preview-office-inner"] }) })
83
133
  }
84
- ) : /* @__PURE__ */ n(u, { description: s }) : /* @__PURE__ */ n(u, { description: "无可预览地址" });
134
+ ) : /* @__PURE__ */ o(p, { description: t }) : /* @__PURE__ */ o(p, { description: "无可预览地址" });
85
135
  };
86
136
  export {
87
- D as default
137
+ J as default
88
138
  };
89
139
  //# sourceMappingURL=FilePreviewContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilePreviewContent.js","sources":["../../../../src/components/File/FilePreview/FilePreviewContent.tsx"],"sourcesContent":["import { Empty, Spin } from 'antd';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { getPreviewKind, needsBlobPreview } from '../previewKind';\nimport type { FileDisplayItem } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\ninterface FilePreviewContentProps {\n file: FileDisplayItem;\n previewUrl?: string;\n unsupportedMessage?: string;\n}\n\nasync function fetchPreviewBlob(url: string): Promise<ArrayBuffer> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`预览加载失败 (${res.status})`);\n return res.arrayBuffer();\n}\n\nasync function renderExcel(container: HTMLElement, data: ArrayBuffer) {\n const [{ default: jsPreviewExcel }] = await Promise.all([\n import('@js-preview/excel'),\n import('@js-preview/excel/lib/index.css'),\n ]);\n const height = Math.max(\n container.parentElement?.clientHeight ?? 0,\n Math.round(window.innerHeight * 0.65),\n 480,\n );\n container.style.height = `${height}px`;\n const instance = jsPreviewExcel.init(container);\n await instance.preview(data);\n return () => instance.destroy();\n}\n\nasync function renderWord(container: HTMLElement, data: ArrayBuffer) {\n const { renderAsync } = await import('docx-preview');\n const blob = new Blob([data]);\n await renderAsync(blob, container, container, {\n inWrapper: true,\n ignoreWidth: false,\n ignoreHeight: false,\n breakPages: true,\n });\n}\n\nasync function renderPpt(container: HTMLElement, data: ArrayBuffer, width: number) {\n const { init } = await import('pptx-preview');\n const previewer = init(container, { width, height: Math.round(width * 0.5625), mode: 'list' });\n await previewer.preview(data);\n return () => previewer.destroy();\n}\n\nfunction renderText(container: HTMLElement, data: ArrayBuffer) {\n const decoder = new TextDecoder('utf-8');\n const pre = document.createElement('pre');\n pre.className = styles['file-preview-text'] ?? '';\n pre.textContent = decoder.decode(data);\n container.appendChild(pre);\n}\n\nconst FilePreviewContent: React.FC<FilePreviewContentProps> = ({\n file,\n previewUrl,\n unsupportedMessage = '暂不支持预览此文件类型',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const cleanupRef = useRef<(() => void) | void>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const kind = getPreviewKind(file);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !previewUrl) return undefined;\n\n let cancelled = false;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n setError(null);\n\n const run = async () => {\n if (kind === 'image') return;\n if (kind === 'pdf' || kind === 'iframe') return;\n if (kind === 'video' || kind === 'audio') return;\n if (kind === 'unsupported') return;\n\n setLoading(true);\n try {\n const data = await fetchPreviewBlob(previewUrl);\n if (cancelled) return;\n\n if (kind === 'excel') {\n cleanupRef.current = await renderExcel(container, data);\n } else if (kind === 'word') {\n await renderWord(container, data);\n } else if (kind === 'ppt') {\n const width = container.clientWidth || 852;\n cleanupRef.current = await renderPpt(container, data, width);\n } else if (kind === 'text') {\n renderText(container, data);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : '预览加载失败');\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n\n void run();\n\n return () => {\n cancelled = true;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n };\n }, [previewUrl, kind, file.id, file.name]);\n\n if (!previewUrl) {\n return <Empty description=\"无可预览地址\" />;\n }\n\n if (kind === 'image') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <img src={previewUrl} alt={file.name} className={styles['file-preview-image']} />\n </div>\n );\n }\n\n if (kind === 'pdf' || kind === 'iframe') {\n return <iframe src={previewUrl} title={file.name} className={styles['file-preview-iframe']} />;\n }\n\n if (kind === 'video') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <video src={previewUrl} controls className={styles['file-preview-video']} />\n </div>\n );\n }\n\n if (kind === 'audio') {\n return (\n <div className={styles['file-preview-audio-wrap']}>\n <audio src={previewUrl} controls className={styles['file-preview-audio']} />\n </div>\n );\n }\n\n if (kind === 'unsupported') {\n return <Empty description={unsupportedMessage} />;\n }\n\n if (needsBlobPreview(kind)) {\n return (\n <div\n className={classNames(styles['file-preview-office'], styles['file-preview-office-wrap'])}\n >\n <Spin spinning={loading} classNames={{ root: styles['file-preview-office-spin'] }}>\n {error ? (\n <Empty description={error} />\n ) : (\n <div ref={containerRef} className={styles['file-preview-office-inner']} />\n )}\n </Spin>\n </div>\n );\n }\n\n return <Empty description={unsupportedMessage} />;\n};\n\nexport default FilePreviewContent;\n"],"names":["fetchPreviewBlob","url","res","renderExcel","container","data","jsPreviewExcel","height","_a","instance","renderWord","renderAsync","blob","renderPpt","width","init","previewer","renderText","decoder","pre","styles","FilePreviewContent","file","previewUrl","unsupportedMessage","containerRef","useRef","cleanupRef","loading","setLoading","useState","error","setError","kind","getPreviewKind","useEffect","cancelled","err","jsx","Empty","needsBlobPreview","classNames","Spin"],"mappings":"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"}
1
+ {"version":3,"file":"FilePreviewContent.js","sources":["../../../../src/components/File/FilePreview/FilePreviewContent.tsx"],"sourcesContent":["import { Empty, Spin } from 'antd';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { getPreviewKind, needsBlobPreview } from '../previewKind';\nimport type { FileDisplayItem } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\ninterface FilePreviewContentProps {\n file: FileDisplayItem;\n previewUrl?: string;\n unsupportedMessage?: string;\n}\n\nasync function fetchPreviewBlob(url: string): Promise<ArrayBuffer> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`预览加载失败 (${res.status})`);\n return res.arrayBuffer();\n}\n\nfunction mapPreviewError(err: unknown, kind: string): string {\n const raw = err instanceof Error ? err.message : String(err ?? '');\n if (kind === 'excel' && /anchors/i.test(raw)) {\n return '该 Excel 含图表/绘图等对象,当前预览引擎无法解析,请下载后用本地软件打开';\n }\n if (raw && !/^Cannot read properties/i.test(raw) && !/^undefined/i.test(raw)) {\n return raw;\n }\n return kind === 'excel' ? 'Excel 预览失败,请下载后查看' : '预览加载失败';\n}\n\n/** exceljs/@js-preview 对部分含 drawing/chart 的 xlsx 会在 reconcile 时读 anchors 崩溃;去掉绘图部件后重试。 */\nasync function stripExcelDrawings(data: ArrayBuffer): Promise<ArrayBuffer | null> {\n try {\n const { default: JSZip } = await import('jszip');\n const zip = await JSZip.loadAsync(data);\n const names = Object.keys(zip.files);\n const drop = names.filter(\n (n) =>\n n.startsWith('xl/drawings/') ||\n n.startsWith('xl/charts/') ||\n n.startsWith('xl/diagrams/') ||\n /drawing[0-9]*\\.xml$/i.test(n),\n );\n if (drop.length === 0) return null;\n for (const n of drop) {\n zip.remove(n);\n }\n // 清理 worksheet 中的 drawing 引用,避免指向已删部件\n await Promise.all(\n names\n .filter((n) => /^xl\\/worksheets\\/[^/]+\\.xml$/i.test(n) && zip.file(n))\n .map(async (n) => {\n const file = zip.file(n);\n if (!file) return;\n const xml = await file.async('string');\n const cleaned = xml\n .replace(/<drawing[^>]*\\/>/gi, '')\n .replace(/<drawing[^>]*>[\\s\\S]*?<\\/drawing>/gi, '');\n if (cleaned !== xml) zip.file(n, cleaned);\n }),\n );\n return zip.generateAsync({ type: 'arraybuffer' });\n } catch {\n return null;\n }\n}\n\nasync function previewExcelBuffer(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n jsPreviewExcel: { init: (el: HTMLElement) => any },\n container: HTMLElement,\n data: ArrayBuffer,\n) {\n const instance = jsPreviewExcel.init(container);\n try {\n await instance.preview(data);\n return () => instance.destroy();\n } catch (err) {\n try {\n instance.destroy();\n } catch {\n // ignore\n }\n throw err;\n }\n}\n\nasync function renderExcel(container: HTMLElement, data: ArrayBuffer) {\n const [{ default: jsPreviewExcel }] = await Promise.all([\n import('@js-preview/excel'),\n import('@js-preview/excel/lib/index.css'),\n ]);\n const height = Math.max(\n container.parentElement?.clientHeight ?? 0,\n Math.round(window.innerHeight * 0.65),\n 480,\n );\n container.style.height = `${height}px`;\n\n try {\n return await previewExcelBuffer(jsPreviewExcel, container, data);\n } catch (firstErr) {\n const msg = firstErr instanceof Error ? firstErr.message : String(firstErr ?? '');\n if (!/anchors/i.test(msg)) {\n throw firstErr instanceof Error ? firstErr : new Error(mapPreviewError(firstErr, 'excel'));\n }\n const stripped = await stripExcelDrawings(data);\n if (!stripped) {\n throw firstErr instanceof Error ? firstErr : new Error(mapPreviewError(firstErr, 'excel'));\n }\n container.innerHTML = '';\n try {\n return await previewExcelBuffer(jsPreviewExcel, container, stripped);\n } catch (retryErr) {\n throw retryErr instanceof Error ? retryErr : new Error(mapPreviewError(retryErr, 'excel'));\n }\n }\n}\n\nasync function renderWord(container: HTMLElement, data: ArrayBuffer) {\n const { renderAsync } = await import('docx-preview');\n const blob = new Blob([data]);\n await renderAsync(blob, container, container, {\n inWrapper: true,\n ignoreWidth: false,\n ignoreHeight: false,\n breakPages: true,\n });\n}\n\nasync function renderPpt(container: HTMLElement, data: ArrayBuffer, width: number) {\n const { init } = await import('pptx-preview');\n const previewer = init(container, { width, height: Math.round(width * 0.5625), mode: 'list' });\n await previewer.preview(data);\n return () => previewer.destroy();\n}\n\nfunction renderText(container: HTMLElement, data: ArrayBuffer) {\n const decoder = new TextDecoder('utf-8');\n const pre = document.createElement('pre');\n pre.className = styles['file-preview-text'] ?? '';\n pre.textContent = decoder.decode(data);\n container.appendChild(pre);\n}\n\nconst FilePreviewContent: React.FC<FilePreviewContentProps> = ({\n file,\n previewUrl,\n unsupportedMessage = '暂不支持预览此文件类型',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const cleanupRef = useRef<(() => void) | void>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const kind = getPreviewKind(file);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !previewUrl) return undefined;\n\n let cancelled = false;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n setError(null);\n\n const run = async () => {\n if (kind === 'image') return;\n if (kind === 'pdf' || kind === 'iframe') return;\n if (kind === 'video' || kind === 'audio') return;\n if (kind === 'unsupported') return;\n\n setLoading(true);\n try {\n const data = await fetchPreviewBlob(previewUrl);\n if (cancelled) return;\n\n if (kind === 'excel') {\n cleanupRef.current = await renderExcel(container, data);\n } else if (kind === 'word') {\n await renderWord(container, data);\n } else if (kind === 'ppt') {\n const width = container.clientWidth || 852;\n cleanupRef.current = await renderPpt(container, data, width);\n } else if (kind === 'text') {\n renderText(container, data);\n }\n } catch (err) {\n if (!cancelled) {\n setError(mapPreviewError(err, kind));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n\n void run();\n\n return () => {\n cancelled = true;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n };\n }, [previewUrl, kind, file.id, file.name]);\n\n if (!previewUrl) {\n return <Empty description=\"无可预览地址\" />;\n }\n\n if (kind === 'image') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <img src={previewUrl} alt={file.name} className={styles['file-preview-image']} />\n </div>\n );\n }\n\n if (kind === 'pdf' || kind === 'iframe') {\n return <iframe src={previewUrl} title={file.name} className={styles['file-preview-iframe']} />;\n }\n\n if (kind === 'video') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <video src={previewUrl} controls className={styles['file-preview-video']} />\n </div>\n );\n }\n\n if (kind === 'audio') {\n return (\n <div className={styles['file-preview-audio-wrap']}>\n <audio src={previewUrl} controls className={styles['file-preview-audio']} />\n </div>\n );\n }\n\n if (kind === 'unsupported') {\n return <Empty description={unsupportedMessage} />;\n }\n\n if (needsBlobPreview(kind)) {\n return (\n <div\n className={classNames(styles['file-preview-office'], styles['file-preview-office-wrap'])}\n >\n <Spin spinning={loading} classNames={{ root: styles['file-preview-office-spin'] }}>\n {error ? (\n <Empty description={error} />\n ) : (\n <div ref={containerRef} className={styles['file-preview-office-inner']} />\n )}\n </Spin>\n </div>\n );\n }\n\n return <Empty description={unsupportedMessage} />;\n};\n\nexport default FilePreviewContent;\n"],"names":["fetchPreviewBlob","url","res","mapPreviewError","err","kind","raw","stripExcelDrawings","data","JSZip","zip","names","drop","n","file","xml","cleaned","previewExcelBuffer","jsPreviewExcel","container","instance","renderExcel","height","_a","firstErr","msg","stripped","retryErr","renderWord","renderAsync","blob","renderPpt","width","init","previewer","renderText","decoder","pre","styles","FilePreviewContent","previewUrl","unsupportedMessage","containerRef","useRef","cleanupRef","loading","setLoading","useState","error","setError","getPreviewKind","useEffect","cancelled","jsx","Empty","needsBlobPreview","classNames","Spin"],"mappings":"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"}
@@ -9,7 +9,7 @@ export type { PersonOptionRowProps } from './PersonOptionRow';
9
9
  export { default as FormDataSync } from './FormDataSync';
10
10
  export type { FormDataSyncProps } from './FormDataSync';
11
11
  /** @kne/form-info — 业务从包根导入,勿直连 @kne/form-info */
12
- export { FormInfo, Form, FormModal, FormSteps, FormStepsModal, List, TableList, MultiField, Input, TextArea, Select, InputNumber, Switch, RadioGroup, SubmitButton, ResetButton, CancelButton, } from './kneFormInfo';
12
+ export { FormInfo, Form, FormModal, FormSteps, FormStepsModal, List, TableList, MultiField, Input, TextArea, Select, InputNumber, Switch, RadioGroup, TreeSelect, SubmitButton, ResetButton, CancelButton, } from './kneFormInfo';
13
13
  export type { FormInfoProps, FormProps, FormModalProps, FormStepsProps, FormStepsModalProps, ListProps, TableListProps, MultiFieldProps, } from './kneFormInfo';
14
14
  /** @kne/react-form — 引擎 API;默认组件为 ReactForm(勿与 FormInfo 的 Form 混淆) */
15
15
  export { ReactForm, GroupList, useField, useFormApi, useFormContext, useGroup, useSubmit, useReset, RULES, preset, interceptors, compileErrMsg, computedFieldValueFromFormData, computedFormDataFormState, filterEmpty, findField, formUtils, isEmpty, isNotEmpty, matchFields, stateToError, stateToIsPass, } from './kneReactForm';
@@ -43,6 +43,8 @@ export declare const Select: ComponentType<FieldProps>;
43
43
  export declare const InputNumber: ComponentType<FieldProps>;
44
44
  export declare const Switch: ComponentType<FieldProps>;
45
45
  export declare const RadioGroup: ComponentType<FieldProps>;
46
+ /** 与 Input/Select 同源再导出,避免业务直连 @kne/react-form-antd 导致双 Context */
47
+ export declare const TreeSelect: ComponentType<FieldProps>;
46
48
  export declare const SubmitButton: ComponentType<ButtonProps>;
47
49
  export declare const ResetButton: ComponentType<ButtonProps>;
48
50
  export declare const CancelButton: ComponentType<ButtonProps>;
@@ -1,24 +1,25 @@
1
1
  /* empty css */
2
- import t, { Form as o, FormModal as s, FormSteps as e, FormStepsModal as n, List as a, MultiField as r, TableList as u } from "@kne/form-info";
3
- import { CancelButton as c, Input as m, InputNumber as i, RadioGroup as l, ResetButton as p, Select as F, SubmitButton as $, Switch as S, TextArea as d } from "@kne/react-form-antd";
4
- const I = t, L = o, R = s, T = e, f = n, x = a, h = u, w = r, A = m, C = d, G = F, N = i, g = S, j = l, k = $, q = p, v = c;
2
+ import t, { Form as o, FormModal as s, FormSteps as e, FormStepsModal as n, List as a, MultiField as r, TableList as c } from "@kne/form-info";
3
+ import { CancelButton as u, Input as m, InputNumber as i, RadioGroup as l, ResetButton as p, Select as S, SubmitButton as F, Switch as $, TextArea as d, TreeSelect as B } from "@kne/react-form-antd";
4
+ const I = t, L = o, R = s, f = e, x = n, h = a, w = c, A = r, C = m, G = d, N = S, g = i, j = $, k = l, q = B, v = F, y = p, z = u;
5
5
  export {
6
- v as CancelButton,
6
+ z as CancelButton,
7
7
  L as Form,
8
8
  I as FormInfo,
9
9
  R as FormModal,
10
- T as FormSteps,
11
- f as FormStepsModal,
12
- A as Input,
13
- N as InputNumber,
14
- x as List,
15
- w as MultiField,
16
- j as RadioGroup,
17
- q as ResetButton,
18
- G as Select,
19
- k as SubmitButton,
20
- g as Switch,
21
- h as TableList,
22
- C as TextArea
10
+ f as FormSteps,
11
+ x as FormStepsModal,
12
+ C as Input,
13
+ g as InputNumber,
14
+ h as List,
15
+ A as MultiField,
16
+ k as RadioGroup,
17
+ y as ResetButton,
18
+ N as Select,
19
+ v as SubmitButton,
20
+ j as Switch,
21
+ w as TableList,
22
+ G as TextArea,
23
+ q as TreeSelect
23
24
  };
24
25
  //# sourceMappingURL=kneFormInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kneFormInfo.js","sources":["../../../src/components/Form/kneFormInfo.ts"],"sourcesContent":["/**\n * 经 core 再导出 @kne/form-info(业务唯一入口)。\n * 布局组件来自 @kne/form-info;字段组件须从 @kne/react-form-antd 具名导入\n * (form-info 的 `export *` 在 Vite 下经 namespace 读取时常为 undefined)。\n */\nimport '@kne/form-info/dist/index.css';\nimport FormInfoBase, {\n Form as KneForm,\n FormModal as KneFormModal,\n FormSteps as KneFormSteps,\n FormStepsModal as KneFormStepsModal,\n List as KneList,\n MultiField as KneMultiField,\n TableList as KneTableList,\n type FormModalProps,\n type FormProps,\n type FormStepsModalProps,\n type FormStepsProps,\n type ListProps,\n type MultiFieldProps,\n type TableListProps,\n type FormInfoProps,\n} from '@kne/form-info';\nimport {\n CancelButton as KneCancelButton,\n Input as KneInput,\n InputNumber as KneInputNumber,\n RadioGroup as KneRadioGroup,\n ResetButton as KneResetButton,\n Select as KneSelect,\n SubmitButton as KneSubmitButton,\n Switch as KneSwitch,\n TextArea as KneTextArea,\n} from '@kne/react-form-antd';\nimport type { ComponentType, FC, ReactNode } from 'react';\n\ntype FieldProps = {\n name: string;\n label?: ReactNode;\n rule?: string;\n placeholder?: string;\n disabled?: boolean;\n block?: boolean;\n rows?: number;\n options?: unknown[];\n [key: string]: unknown;\n};\n\ntype ButtonProps = {\n children?: ReactNode;\n type?: string;\n loading?: boolean;\n [key: string]: unknown;\n};\n\ntype ItemTitleCtx = { index: number; data?: Record<string, unknown> };\n\nexport type {\n FormInfoProps,\n FormProps,\n FormModalProps,\n FormStepsProps,\n FormStepsModalProps,\n ListProps,\n TableListProps,\n MultiFieldProps,\n};\n\nexport const FormInfo = FormInfoBase;\nexport const Form = KneForm;\nexport const FormModal = KneFormModal as FC<FormModalProps & { children?: ReactNode }>;\nexport const FormSteps = KneFormSteps as FC<FormStepsProps>;\nexport const FormStepsModal = KneFormStepsModal as FC<FormStepsModalProps>;\n\nexport const List = KneList as FC<\n Omit<ListProps, 'itemTitle'> & {\n maxLength?: number;\n itemTitle?: (ctx: ItemTitleCtx) => string;\n }\n>;\nexport const TableList = KneTableList as FC<\n Omit<TableListProps, 'itemTitle'> & {\n itemTitle?: (ctx: ItemTitleCtx) => string;\n }\n>;\nexport const MultiField = KneMultiField as FC<MultiFieldProps>;\n\nexport const Input = KneInput as ComponentType<FieldProps>;\nexport const TextArea = KneTextArea as ComponentType<FieldProps>;\nexport const Select = KneSelect as ComponentType<FieldProps>;\nexport const InputNumber = KneInputNumber as ComponentType<FieldProps>;\nexport const Switch = KneSwitch as ComponentType<FieldProps>;\nexport const RadioGroup = KneRadioGroup as ComponentType<FieldProps>;\nexport const SubmitButton = KneSubmitButton as ComponentType<ButtonProps>;\nexport const ResetButton = KneResetButton as ComponentType<ButtonProps>;\nexport const CancelButton = KneCancelButton as ComponentType<ButtonProps>;\n"],"names":["FormInfo","FormInfoBase","Form","KneForm","FormModal","KneFormModal","FormSteps","KneFormSteps","FormStepsModal","KneFormStepsModal","List","KneList","TableList","KneTableList","MultiField","KneMultiField","Input","KneInput","TextArea","KneTextArea","Select","KneSelect","InputNumber","KneInputNumber","Switch","KneSwitch","RadioGroup","KneRadioGroup","SubmitButton","KneSubmitButton","ResetButton","KneResetButton","CancelButton","KneCancelButton"],"mappings":";;;AAoEO,MAAMA,IAAWC,GACXC,IAAOC,GACPC,IAAYC,GACZC,IAAYC,GACZC,IAAiBC,GAEjBC,IAAOC,GAMPC,IAAYC,GAKZC,IAAaC,GAEbC,IAAQC,GACRC,IAAWC,GACXC,IAASC,GACTC,IAAcC,GACdC,IAASC,GACTC,IAAaC,GACbC,IAAeC,GACfC,IAAcC,GACdC,IAAeC;"}
1
+ {"version":3,"file":"kneFormInfo.js","sources":["../../../src/components/Form/kneFormInfo.ts"],"sourcesContent":["/**\n * 经 core 再导出 @kne/form-info(业务唯一入口)。\n * 布局组件来自 @kne/form-info;字段组件须从 @kne/react-form-antd 具名导入\n * (form-info 的 `export *` 在 Vite 下经 namespace 读取时常为 undefined)。\n */\nimport '@kne/form-info/dist/index.css';\nimport FormInfoBase, {\n Form as KneForm,\n FormModal as KneFormModal,\n FormSteps as KneFormSteps,\n FormStepsModal as KneFormStepsModal,\n List as KneList,\n MultiField as KneMultiField,\n TableList as KneTableList,\n type FormModalProps,\n type FormProps,\n type FormStepsModalProps,\n type FormStepsProps,\n type ListProps,\n type MultiFieldProps,\n type TableListProps,\n type FormInfoProps,\n} from '@kne/form-info';\nimport {\n CancelButton as KneCancelButton,\n Input as KneInput,\n InputNumber as KneInputNumber,\n RadioGroup as KneRadioGroup,\n ResetButton as KneResetButton,\n Select as KneSelect,\n SubmitButton as KneSubmitButton,\n Switch as KneSwitch,\n TextArea as KneTextArea,\n TreeSelect as KneTreeSelect,\n} from '@kne/react-form-antd';\nimport type { ComponentType, FC, ReactNode } from 'react';\n\ntype FieldProps = {\n name: string;\n label?: ReactNode;\n rule?: string;\n placeholder?: string;\n disabled?: boolean;\n block?: boolean;\n rows?: number;\n options?: unknown[];\n [key: string]: unknown;\n};\n\ntype ButtonProps = {\n children?: ReactNode;\n type?: string;\n loading?: boolean;\n [key: string]: unknown;\n};\n\ntype ItemTitleCtx = { index: number; data?: Record<string, unknown> };\n\nexport type {\n FormInfoProps,\n FormProps,\n FormModalProps,\n FormStepsProps,\n FormStepsModalProps,\n ListProps,\n TableListProps,\n MultiFieldProps,\n};\n\nexport const FormInfo = FormInfoBase;\nexport const Form = KneForm;\nexport const FormModal = KneFormModal as FC<FormModalProps & { children?: ReactNode }>;\nexport const FormSteps = KneFormSteps as FC<FormStepsProps>;\nexport const FormStepsModal = KneFormStepsModal as FC<FormStepsModalProps>;\n\nexport const List = KneList as FC<\n Omit<ListProps, 'itemTitle'> & {\n maxLength?: number;\n itemTitle?: (ctx: ItemTitleCtx) => string;\n }\n>;\nexport const TableList = KneTableList as FC<\n Omit<TableListProps, 'itemTitle'> & {\n itemTitle?: (ctx: ItemTitleCtx) => string;\n }\n>;\nexport const MultiField = KneMultiField as FC<MultiFieldProps>;\n\nexport const Input = KneInput as ComponentType<FieldProps>;\nexport const TextArea = KneTextArea as ComponentType<FieldProps>;\nexport const Select = KneSelect as ComponentType<FieldProps>;\nexport const InputNumber = KneInputNumber as ComponentType<FieldProps>;\nexport const Switch = KneSwitch as ComponentType<FieldProps>;\nexport const RadioGroup = KneRadioGroup as ComponentType<FieldProps>;\n/** 与 Input/Select 同源再导出,避免业务直连 @kne/react-form-antd 导致双 Context */\nexport const TreeSelect = KneTreeSelect as ComponentType<FieldProps>;\nexport const SubmitButton = KneSubmitButton as ComponentType<ButtonProps>;\nexport const ResetButton = KneResetButton as ComponentType<ButtonProps>;\nexport const CancelButton = KneCancelButton as ComponentType<ButtonProps>;\n"],"names":["FormInfo","FormInfoBase","Form","KneForm","FormModal","KneFormModal","FormSteps","KneFormSteps","FormStepsModal","KneFormStepsModal","List","KneList","TableList","KneTableList","MultiField","KneMultiField","Input","KneInput","TextArea","KneTextArea","Select","KneSelect","InputNumber","KneInputNumber","Switch","KneSwitch","RadioGroup","KneRadioGroup","TreeSelect","KneTreeSelect","SubmitButton","KneSubmitButton","ResetButton","KneResetButton","CancelButton","KneCancelButton"],"mappings":";;;AAqEO,MAAMA,IAAWC,GACXC,IAAOC,GACPC,IAAYC,GACZC,IAAYC,GACZC,IAAiBC,GAEjBC,IAAOC,GAMPC,IAAYC,GAKZC,IAAaC,GAEbC,IAAQC,GACRC,IAAWC,GACXC,IAASC,GACTC,IAAcC,GACdC,IAASC,GACTC,IAAaC,GAEbC,IAAaC,GACbC,IAAeC,GACfC,IAAcC,GACdC,IAAeC;"}
@@ -1,19 +1,19 @@
1
- import { jsx as t, jsxs as u } from "react/jsx-runtime";
2
- import { Plus as K, Pencil as S, Trash2 as w } from "../Icons/index.js";
3
- import { Spin as j, Tree as v, Tooltip as B, Space as L, Button as p, Popconfirm as M } from "antd";
1
+ import { jsx as a, jsxs as u, Fragment as K } from "react/jsx-runtime";
2
+ import { Plus as S, Pencil as w, Trash2 as j } from "../Icons/index.js";
3
+ import { Spin as v, Tree as B, Tooltip as F, Space as L, Button as p, Popconfirm as M } from "antd";
4
4
  import o from "classnames";
5
5
  import { useMemo as O, useState as q, useEffect as A } from "react";
6
6
  import c from "./style.module.scss.js";
7
- function T(a) {
7
+ function T(t) {
8
8
  var l;
9
9
  const i = [];
10
- for (const n of a)
10
+ for (const n of t)
11
11
  i.push(n.id), (l = n.children) != null && l.length && i.push(...T(n.children));
12
12
  return i;
13
13
  }
14
- function k(a, i) {
14
+ function k(t, i) {
15
15
  var l;
16
- for (const n of a) {
16
+ for (const n of t) {
17
17
  if (n.id === i)
18
18
  return { id: n.id, name: n.name, parentId: n.parentId ?? null };
19
19
  if ((l = n.children) != null && l.length) {
@@ -23,21 +23,21 @@ function k(a, i) {
23
23
  }
24
24
  return null;
25
25
  }
26
- const R = ({
27
- nodes: a,
26
+ const U = ({
27
+ nodes: t,
28
28
  loading: i = !1,
29
29
  editable: l = !1,
30
30
  className: n,
31
31
  selectedKeys: m,
32
32
  onSelect: f,
33
- onAdd: d,
34
- onEdit: g,
35
- onDelete: h,
36
- deleteConfirmTitle: b = "确认删除该节点?",
33
+ onAdd: g,
34
+ onEdit: h,
35
+ onDelete: d,
36
+ deleteConfirmTitle: E = "确认删除该节点?",
37
37
  deleteOkText: x = "删除",
38
- deleteOkType: C = "danger"
38
+ deleteOkType: b = "danger"
39
39
  }) => {
40
- const y = O(() => T(a), [a]), [E, N] = q([]);
40
+ const y = O(() => T(t), [t]), [C, N] = q([]);
41
41
  A(() => {
42
42
  N(y);
43
43
  }, [y]);
@@ -46,43 +46,52 @@ const R = ({
46
46
  return {
47
47
  key: r.id,
48
48
  title: /* @__PURE__ */ u("div", { className: o("marsun-org-tree-row", c["marsun-org-tree-row"]), children: [
49
- /* @__PURE__ */ t(B, { title: r.name, children: /* @__PURE__ */ u("span", { className: o("marsun-org-tree-name", c["marsun-org-tree-name"]), children: [
50
- r.name,
51
- r.nameExtra ? /* @__PURE__ */ t(
52
- "span",
53
- {
54
- className: o("marsun-org-tree-extra", c["marsun-org-tree-extra"]),
55
- children: r.nameExtra
56
- }
57
- ) : null
58
- ] }) }),
49
+ /* @__PURE__ */ a(
50
+ F,
51
+ {
52
+ title: r.nameExtra ? /* @__PURE__ */ u(K, { children: [
53
+ r.name,
54
+ r.nameExtra
55
+ ] }) : r.name,
56
+ children: /* @__PURE__ */ u("span", { className: o("marsun-org-tree-name", c["marsun-org-tree-name"]), children: [
57
+ r.name,
58
+ r.nameExtra ? /* @__PURE__ */ a(
59
+ "span",
60
+ {
61
+ className: o("marsun-org-tree-extra", c["marsun-org-tree-extra"]),
62
+ children: r.nameExtra
63
+ }
64
+ ) : null
65
+ ] })
66
+ }
67
+ ),
59
68
  l ? /* @__PURE__ */ u(
60
69
  L,
61
70
  {
62
71
  size: 0,
63
72
  className: o("marsun-org-tree-actions", c["marsun-org-tree-actions"]),
64
73
  children: [
65
- d ? /* @__PURE__ */ t(
74
+ g ? /* @__PURE__ */ a(
66
75
  p,
67
76
  {
68
77
  type: "text",
69
78
  size: "small",
70
79
  "aria-label": "添加子节点",
71
- icon: /* @__PURE__ */ t(K, { size: 14 }),
80
+ icon: /* @__PURE__ */ a(S, { size: 14 }),
72
81
  onClick: (e) => {
73
- e.stopPropagation(), d(r.id);
82
+ e.stopPropagation(), g(r.id);
74
83
  }
75
84
  }
76
85
  ) : null,
77
- g ? /* @__PURE__ */ t(
86
+ h ? /* @__PURE__ */ a(
78
87
  p,
79
88
  {
80
89
  type: "text",
81
90
  size: "small",
82
91
  "aria-label": "编辑",
83
- icon: /* @__PURE__ */ t(S, { size: 14 }),
92
+ icon: /* @__PURE__ */ a(w, { size: 14 }),
84
93
  onClick: (e) => {
85
- e.stopPropagation(), g({
94
+ e.stopPropagation(), h({
86
95
  id: r.id,
87
96
  name: r.name,
88
97
  parentId: r.parentId ?? null
@@ -90,23 +99,23 @@ const R = ({
90
99
  }
91
100
  }
92
101
  ) : null,
93
- h ? /* @__PURE__ */ t(
102
+ d ? /* @__PURE__ */ a(
94
103
  M,
95
104
  {
96
- title: b,
105
+ title: E,
97
106
  okText: x,
98
- okType: C,
107
+ okType: b,
99
108
  cancelText: "取消",
100
- onConfirm: (e) => (e == null || e.stopPropagation(), h({ id: r.id, name: r.name })),
109
+ onConfirm: (e) => (e == null || e.stopPropagation(), d({ id: r.id, name: r.name })),
101
110
  onCancel: (e) => e == null ? void 0 : e.stopPropagation(),
102
- children: /* @__PURE__ */ t(
111
+ children: /* @__PURE__ */ a(
103
112
  p,
104
113
  {
105
114
  type: "text",
106
115
  size: "small",
107
116
  danger: !0,
108
117
  "aria-label": x,
109
- icon: /* @__PURE__ */ t(w, { size: 14 }),
118
+ icon: /* @__PURE__ */ a(j, { size: 14 }),
110
119
  onClick: (e) => e.stopPropagation()
111
120
  }
112
121
  )
@@ -118,19 +127,19 @@ const R = ({
118
127
  ] }),
119
128
  children: (z = r.children) != null && z.length ? P(r.children) : void 0
120
129
  };
121
- }), I = P(a);
122
- return /* @__PURE__ */ t(j, { spinning: i, children: /* @__PURE__ */ t(
123
- v,
130
+ }), I = P(t);
131
+ return /* @__PURE__ */ a(v, { spinning: i, children: /* @__PURE__ */ a(
132
+ B,
124
133
  {
125
134
  className: o("marsun-org-tree", c["marsun-org-tree"], n),
126
135
  treeData: I,
127
- expandedKeys: E,
136
+ expandedKeys: C,
128
137
  onExpand: (s) => N(s),
129
138
  selectedKeys: m,
130
139
  onSelect: (s) => {
131
140
  if (!f) return;
132
141
  const r = s[0] != null ? String(s[0]) : "";
133
- f(r ? k(a, r) : null);
142
+ f(r ? k(t, r) : null);
134
143
  },
135
144
  showLine: !0,
136
145
  blockNode: !0
@@ -138,6 +147,6 @@ const R = ({
138
147
  ) });
139
148
  };
140
149
  export {
141
- R as default
150
+ U as default
142
151
  };
143
152
  //# sourceMappingURL=OrgTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrgTree.js","sources":["../../../src/components/OrgTree/OrgTree.tsx"],"sourcesContent":["import { Pencil, Plus, Trash2 } from '../Icons';\nimport { Button, Popconfirm, Space, Spin, Tooltip, Tree } from 'antd';\nimport type { DataNode } from 'antd/es/tree';\nimport classNames from 'classnames';\nimport React, { useEffect, useMemo, useState, type Key, type ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type OrgTreeNode = {\n id: string;\n name: string;\n parentId?: string | null;\n children?: OrgTreeNode[];\n /** 名称旁附加文案(如 mapped) */\n nameExtra?: ReactNode;\n};\n\nexport type OrgTreeProps = {\n nodes: OrgTreeNode[];\n loading?: boolean;\n /** 展示节点内增删改操作 */\n editable?: boolean;\n className?: string;\n /** 受控选中(点选节点,如右侧岗位面板) */\n selectedKeys?: Key[];\n onSelect?: (node: { id: string; name: string; parentId: string | null } | null) => void;\n onAdd?: (parentId: string) => void;\n onEdit?: (node: { id: string; name: string; parentId: string | null }) => void;\n /** 确认删除后回调;由业务执行 API */\n onDelete?: (node: { id: string; name: string }) => void | Promise<void>;\n /** 删除确认文案 */\n deleteConfirmTitle?: string;\n /** 确认钮文案(软禁用场景可传「禁用」) */\n deleteOkText?: string;\n deleteOkType?: 'primary' | 'danger';\n};\n\nfunction collectAllKeys(nodes: OrgTreeNode[]): string[] {\n const keys: string[] = [];\n for (const n of nodes) {\n keys.push(n.id);\n if (n.children?.length) keys.push(...collectAllKeys(n.children));\n }\n return keys;\n}\n\nfunction findOrgNode(\n list: OrgTreeNode[],\n id: string,\n): { id: string; name: string; parentId: string | null } | null {\n for (const n of list) {\n if (n.id === id) {\n return { id: n.id, name: n.name, parentId: n.parentId ?? null };\n }\n if (n.children?.length) {\n const hit = findOrgNode(n.children, id);\n if (hit) return hit;\n }\n }\n return null;\n}\n\n/**\n * 组织树(对齐 Assets 组织架构行为):默认展开、节点 hover 增删改。\n * 纯 UI,无业务 API。\n */\nconst OrgTree: React.FC<OrgTreeProps> = ({\n nodes,\n loading = false,\n editable = false,\n className,\n selectedKeys,\n onSelect,\n onAdd,\n onEdit,\n onDelete,\n deleteConfirmTitle = '确认删除该节点?',\n deleteOkText = '删除',\n deleteOkType = 'danger',\n}) => {\n const allKeys = useMemo(() => collectAllKeys(nodes), [nodes]);\n const [expandedKeys, setExpandedKeys] = useState<Key[]>([]);\n\n useEffect(() => {\n setExpandedKeys(allKeys);\n }, [allKeys]);\n\n const buildTreeNodes = (list: OrgTreeNode[]): DataNode[] =>\n list.map((node) => ({\n key: node.id,\n title: (\n <div className={classNames('marsun-org-tree-row', styles['marsun-org-tree-row'])}>\n <Tooltip title={node.name}>\n <span className={classNames('marsun-org-tree-name', styles['marsun-org-tree-name'])}>\n {node.name}\n {node.nameExtra ? (\n <span\n className={classNames('marsun-org-tree-extra', styles['marsun-org-tree-extra'])}\n >\n {node.nameExtra}\n </span>\n ) : null}\n </span>\n </Tooltip>\n {editable ? (\n <Space\n size={0}\n className={classNames('marsun-org-tree-actions', styles['marsun-org-tree-actions'])}\n >\n {onAdd ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"添加子节点\"\n icon={<Plus size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onAdd(node.id);\n }}\n />\n ) : null}\n {onEdit ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"编辑\"\n icon={<Pencil size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onEdit({\n id: node.id,\n name: node.name,\n parentId: node.parentId ?? null,\n });\n }}\n />\n ) : null}\n {onDelete ? (\n <Popconfirm\n title={deleteConfirmTitle}\n okText={deleteOkText}\n okType={deleteOkType}\n cancelText=\"取消\"\n onConfirm={(e) => {\n e?.stopPropagation();\n return onDelete({ id: node.id, name: node.name });\n }}\n onCancel={(e) => e?.stopPropagation()}\n >\n <Button\n type=\"text\"\n size=\"small\"\n danger\n aria-label={deleteOkText}\n icon={<Trash2 size={14} />}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n ) : null}\n </Space>\n ) : null}\n </div>\n ),\n children: node.children?.length ? buildTreeNodes(node.children) : undefined,\n }));\n\n const treeData = buildTreeNodes(nodes);\n\n return (\n <Spin spinning={loading}>\n <Tree\n className={classNames('marsun-org-tree', styles['marsun-org-tree'], className)}\n treeData={treeData}\n expandedKeys={expandedKeys}\n onExpand={(keys) => setExpandedKeys(keys)}\n selectedKeys={selectedKeys}\n onSelect={(keys) => {\n if (!onSelect) return;\n const id = keys[0] != null ? String(keys[0]) : '';\n onSelect(id ? findOrgNode(nodes, id) : null);\n }}\n showLine\n blockNode\n />\n </Spin>\n );\n};\n\nexport default OrgTree;\n"],"names":["collectAllKeys","nodes","keys","_a","findOrgNode","list","id","hit","OrgTree","loading","editable","className","selectedKeys","onSelect","onAdd","onEdit","onDelete","deleteConfirmTitle","deleteOkText","deleteOkType","allKeys","useMemo","expandedKeys","setExpandedKeys","useState","useEffect","buildTreeNodes","node","classNames","styles","jsx","Tooltip","jsxs","Space","Button","Plus","Pencil","Popconfirm","Trash2","treeData","Spin","Tree"],"mappings":"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"}
1
+ {"version":3,"file":"OrgTree.js","sources":["../../../src/components/OrgTree/OrgTree.tsx"],"sourcesContent":["import { Pencil, Plus, Trash2 } from '../Icons';\nimport { Button, Popconfirm, Space, Spin, Tooltip, Tree } from 'antd';\nimport type { DataNode } from 'antd/es/tree';\nimport classNames from 'classnames';\nimport React, { useEffect, useMemo, useState, type Key, type ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type OrgTreeNode = {\n id: string;\n name: string;\n parentId?: string | null;\n children?: OrgTreeNode[];\n /** 名称旁附加文案(如 mapped) */\n nameExtra?: ReactNode;\n};\n\nexport type OrgTreeProps = {\n nodes: OrgTreeNode[];\n loading?: boolean;\n /** 展示节点内增删改操作 */\n editable?: boolean;\n className?: string;\n /** 受控选中(点选节点,如右侧岗位面板) */\n selectedKeys?: Key[];\n onSelect?: (node: { id: string; name: string; parentId: string | null } | null) => void;\n onAdd?: (parentId: string) => void;\n onEdit?: (node: { id: string; name: string; parentId: string | null }) => void;\n /** 确认删除后回调;由业务执行 API */\n onDelete?: (node: { id: string; name: string }) => void | Promise<void>;\n /** 删除确认文案 */\n deleteConfirmTitle?: string;\n /** 确认钮文案(软禁用场景可传「禁用」) */\n deleteOkText?: string;\n deleteOkType?: 'primary' | 'danger';\n};\n\nfunction collectAllKeys(nodes: OrgTreeNode[]): string[] {\n const keys: string[] = [];\n for (const n of nodes) {\n keys.push(n.id);\n if (n.children?.length) keys.push(...collectAllKeys(n.children));\n }\n return keys;\n}\n\nfunction findOrgNode(\n list: OrgTreeNode[],\n id: string,\n): { id: string; name: string; parentId: string | null } | null {\n for (const n of list) {\n if (n.id === id) {\n return { id: n.id, name: n.name, parentId: n.parentId ?? null };\n }\n if (n.children?.length) {\n const hit = findOrgNode(n.children, id);\n if (hit) return hit;\n }\n }\n return null;\n}\n\n/**\n * 组织树(对齐 Assets 组织架构行为):默认展开、节点 hover 增删改。\n * 纯 UI,无业务 API。\n */\nconst OrgTree: React.FC<OrgTreeProps> = ({\n nodes,\n loading = false,\n editable = false,\n className,\n selectedKeys,\n onSelect,\n onAdd,\n onEdit,\n onDelete,\n deleteConfirmTitle = '确认删除该节点?',\n deleteOkText = '删除',\n deleteOkType = 'danger',\n}) => {\n const allKeys = useMemo(() => collectAllKeys(nodes), [nodes]);\n const [expandedKeys, setExpandedKeys] = useState<Key[]>([]);\n\n useEffect(() => {\n setExpandedKeys(allKeys);\n }, [allKeys]);\n\n const buildTreeNodes = (list: OrgTreeNode[]): DataNode[] =>\n list.map((node) => ({\n key: node.id,\n title: (\n <div className={classNames('marsun-org-tree-row', styles['marsun-org-tree-row'])}>\n <Tooltip\n title={\n node.nameExtra ? (\n <>\n {node.name}\n {node.nameExtra}\n </>\n ) : (\n node.name\n )\n }\n >\n <span className={classNames('marsun-org-tree-name', styles['marsun-org-tree-name'])}>\n {node.name}\n {node.nameExtra ? (\n <span\n className={classNames('marsun-org-tree-extra', styles['marsun-org-tree-extra'])}\n >\n {node.nameExtra}\n </span>\n ) : null}\n </span>\n </Tooltip>\n {editable ? (\n <Space\n size={0}\n className={classNames('marsun-org-tree-actions', styles['marsun-org-tree-actions'])}\n >\n {onAdd ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"添加子节点\"\n icon={<Plus size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onAdd(node.id);\n }}\n />\n ) : null}\n {onEdit ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"编辑\"\n icon={<Pencil size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onEdit({\n id: node.id,\n name: node.name,\n parentId: node.parentId ?? null,\n });\n }}\n />\n ) : null}\n {onDelete ? (\n <Popconfirm\n title={deleteConfirmTitle}\n okText={deleteOkText}\n okType={deleteOkType}\n cancelText=\"取消\"\n onConfirm={(e) => {\n e?.stopPropagation();\n return onDelete({ id: node.id, name: node.name });\n }}\n onCancel={(e) => e?.stopPropagation()}\n >\n <Button\n type=\"text\"\n size=\"small\"\n danger\n aria-label={deleteOkText}\n icon={<Trash2 size={14} />}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n ) : null}\n </Space>\n ) : null}\n </div>\n ),\n children: node.children?.length ? buildTreeNodes(node.children) : undefined,\n }));\n\n const treeData = buildTreeNodes(nodes);\n\n return (\n <Spin spinning={loading}>\n <Tree\n className={classNames('marsun-org-tree', styles['marsun-org-tree'], className)}\n treeData={treeData}\n expandedKeys={expandedKeys}\n onExpand={(keys) => setExpandedKeys(keys)}\n selectedKeys={selectedKeys}\n onSelect={(keys) => {\n if (!onSelect) return;\n const id = keys[0] != null ? String(keys[0]) : '';\n onSelect(id ? findOrgNode(nodes, id) : null);\n }}\n showLine\n blockNode\n />\n </Spin>\n );\n};\n\nexport default OrgTree;\n"],"names":["collectAllKeys","nodes","keys","_a","findOrgNode","list","id","hit","OrgTree","loading","editable","className","selectedKeys","onSelect","onAdd","onEdit","onDelete","deleteConfirmTitle","deleteOkText","deleteOkType","allKeys","useMemo","expandedKeys","setExpandedKeys","useState","useEffect","buildTreeNodes","node","classNames","styles","jsx","Tooltip","jsxs","Fragment","Space","Button","Plus","Pencil","Popconfirm","Trash2","treeData","Spin","Tree"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  const r = {
2
- "marsun-org-tree": "_marsun-org-tree_1hg7h_2",
3
- "marsun-org-tree-row": "_marsun-org-tree-row_1hg7h_10",
4
- "marsun-org-tree-actions": "_marsun-org-tree-actions_1hg7h_18",
5
- "marsun-org-tree-name": "_marsun-org-tree-name_1hg7h_22",
6
- "marsun-org-tree-extra": "_marsun-org-tree-extra_1hg7h_32"
2
+ "marsun-org-tree": "_marsun-org-tree_j34q1_2",
3
+ "marsun-org-tree-row": "_marsun-org-tree-row_j34q1_10",
4
+ "marsun-org-tree-actions": "_marsun-org-tree-actions_j34q1_18",
5
+ "marsun-org-tree-name": "_marsun-org-tree-name_j34q1_22",
6
+ "marsun-org-tree-extra": "_marsun-org-tree-extra_j34q1_33"
7
7
  };
8
8
  export {
9
9
  r as default