@hkyhy/marsun-components-core 0.1.30 → 0.1.32

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 (42) hide show
  1. package/dist/components/Filter/FilterCascader/index.d.ts +40 -0
  2. package/dist/components/Filter/FilterCascader/index.js +328 -0
  3. package/dist/components/Filter/FilterCascader/index.js.map +1 -0
  4. package/dist/components/Filter/FilterCascader/style.module.scss.js +14 -0
  5. package/dist/components/Filter/FilterCascader/style.module.scss.js.map +1 -0
  6. package/dist/components/Filter/FilterPopover/index.d.ts +2 -0
  7. package/dist/components/Filter/FilterPopover/index.js +22 -21
  8. package/dist/components/Filter/FilterPopover/index.js.map +1 -1
  9. package/dist/components/Filter/FilterSelect/index.d.ts +6 -0
  10. package/dist/components/Filter/FilterSelect/index.js +201 -197
  11. package/dist/components/Filter/FilterSelect/index.js.map +1 -1
  12. package/dist/components/Filter/FilterSelect/style.module.scss.js +16 -15
  13. package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -1
  14. package/dist/components/Filter/FilterTreeSelect/index.d.ts +6 -0
  15. package/dist/components/Filter/FilterTreeSelect/index.js +220 -203
  16. package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -1
  17. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js +15 -14
  18. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js.map +1 -1
  19. package/dist/components/Filter/FilterTrigger/index.d.ts +3 -0
  20. package/dist/components/Filter/FilterTrigger/index.js +57 -44
  21. package/dist/components/Filter/FilterTrigger/index.js.map +1 -1
  22. package/dist/components/Filter/FilterTrigger/style.module.scss.js +5 -4
  23. package/dist/components/Filter/FilterTrigger/style.module.scss.js.map +1 -1
  24. package/dist/components/Filter/index.d.ts +3 -0
  25. package/dist/components/Table/ColumnConfigPanel.d.ts +13 -0
  26. package/dist/components/Table/ColumnConfigPanel.js +260 -0
  27. package/dist/components/Table/ColumnConfigPanel.js.map +1 -0
  28. package/dist/components/Table/Table.d.ts +16 -2
  29. package/dist/components/Table/Table.js +106 -28
  30. package/dist/components/Table/Table.js.map +1 -1
  31. package/dist/components/Table/columnConfig.module.scss.js +38 -0
  32. package/dist/components/Table/columnConfig.module.scss.js.map +1 -0
  33. package/dist/components/Table/columnConfigTypes.d.ts +22 -0
  34. package/dist/components/Table/columnConfigUtils.d.ts +25 -0
  35. package/dist/components/Table/columnConfigUtils.js +141 -0
  36. package/dist/components/Table/columnConfigUtils.js.map +1 -0
  37. package/dist/components/Table/index.d.ts +2 -1
  38. package/dist/index.js +258 -251
  39. package/dist/index.js.map +1 -1
  40. package/dist/marsun-components-core.css +1 -1
  41. package/dist/styles/global.css +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,260 @@
1
+ import { jsx as a, jsxs as C, Fragment as z } from "react/jsx-runtime";
2
+ import { useState as N, useCallback as x, useMemo as A } from "react";
3
+ import { Popover as G, Tooltip as K, Collapse as U, Input as E, Space as W, Button as P, Empty as I, Checkbox as J } from "antd";
4
+ import { Settings as Q, Undo2 as X } from "../Icons/index.js";
5
+ import { mergePanelWithConfig as Y, splitVisibleHidden as Z, panelItemsToConfig as $ } from "./columnConfigUtils.js";
6
+ import c from "./columnConfig.module.scss.js";
7
+ function B(t, n) {
8
+ if (!n) return !0;
9
+ const r = n.toLowerCase();
10
+ return t.some(
11
+ (e) => e.label.toLowerCase().includes(r) || e.id.toLowerCase().includes(r) || (e.children ? B(e.children, n) : !1)
12
+ );
13
+ }
14
+ const L = ({ items: t, search: n, onChange: r, onToggle: e, depth: d = 0 }) => {
15
+ const [h, u] = N(null), m = A(() => n.trim() ? t.map((l, s) => ({ it: l, i: s })).filter(({ it: l }) => B([l], n.trim())) : t.map((l, s) => ({ it: l, i: s })), [t, n]), D = (l, s) => {
16
+ u(s), l.dataTransfer.effectAllowed = "move", l.dataTransfer.setData("text/plain", String(s));
17
+ }, S = (l, s) => {
18
+ l.preventDefault();
19
+ const v = h ?? Number(l.dataTransfer.getData("text/plain"));
20
+ if (u(null), !Number.isFinite(v) || v === s) return;
21
+ const i = [...t], [p] = i.splice(v, 1);
22
+ p && (i.splice(s, 0, p), r(i));
23
+ };
24
+ return m.length ? /* @__PURE__ */ a("ul", { className: c.list, style: { paddingLeft: d ? 12 : 0 }, children: m.map(({ it: l, i: s }) => {
25
+ var v;
26
+ return /* @__PURE__ */ C("li", { className: c.listItem, children: [
27
+ /* @__PURE__ */ C(
28
+ "div",
29
+ {
30
+ className: c.row,
31
+ draggable: !n.trim(),
32
+ onDragStart: (i) => D(i, s),
33
+ onDragOver: (i) => i.preventDefault(),
34
+ onDrop: (i) => S(i, s),
35
+ children: [
36
+ /* @__PURE__ */ a("span", { className: c.grip, "aria-hidden": !0, children: "⠿" }),
37
+ /* @__PURE__ */ a(J, { checked: !l.hidden, onChange: (i) => e(l.id, !i.target.checked), children: /* @__PURE__ */ a("span", { className: c.label, children: l.label || l.id }) })
38
+ ]
39
+ }
40
+ ),
41
+ (v = l.children) != null && v.length ? /* @__PURE__ */ a(
42
+ L,
43
+ {
44
+ items: l.children,
45
+ search: n,
46
+ depth: d + 1,
47
+ onChange: (i) => {
48
+ const p = t.map((b) => b.id === l.id ? { ...b, children: i } : b);
49
+ r(p);
50
+ },
51
+ onToggle: (i, p) => {
52
+ const b = t.map((g) => {
53
+ if (g.id !== l.id || !g.children) return g;
54
+ const y = g.children.map(
55
+ (f) => f.id === i ? { ...f, hidden: p } : f.children ? {
56
+ ...f,
57
+ children: M(f.children, i, p)
58
+ } : f
59
+ ), w = y.every((f) => f.hidden);
60
+ return { ...g, children: y, hidden: w ? !0 : p ? g.hidden : !1 };
61
+ });
62
+ r(b);
63
+ }
64
+ }
65
+ ) : null
66
+ ] }, l.id);
67
+ }) }) : /* @__PURE__ */ a(I, { image: I.PRESENTED_IMAGE_SIMPLE, description: "暂无数据" });
68
+ };
69
+ function M(t, n, r) {
70
+ return t.map((e) => {
71
+ if (e.id === n) return { ...e, hidden: r };
72
+ if (e.children) {
73
+ const d = M(e.children, n, r);
74
+ return {
75
+ ...e,
76
+ children: d,
77
+ hidden: d.every((h) => h.hidden) ? !0 : e.hidden && r
78
+ };
79
+ }
80
+ return e;
81
+ });
82
+ }
83
+ function R(t, n, r) {
84
+ return t.map((e) => {
85
+ var d;
86
+ if (e.id === n) {
87
+ const h = (d = e.children) == null ? void 0 : d.map((u) => j(u, r));
88
+ return { ...e, hidden: r, children: h };
89
+ }
90
+ if (e.children) {
91
+ const h = R(e.children, n, r), u = h.every((m) => m.hidden);
92
+ return {
93
+ ...e,
94
+ children: h,
95
+ hidden: u ? !0 : !r && e.id !== n ? !1 : e.hidden
96
+ };
97
+ }
98
+ return e;
99
+ });
100
+ }
101
+ function j(t, n) {
102
+ var r;
103
+ return {
104
+ ...t,
105
+ hidden: n,
106
+ children: (r = t.children) == null ? void 0 : r.map((e) => j(e, n))
107
+ };
108
+ }
109
+ function V(t, n) {
110
+ return [...t, ...n];
111
+ }
112
+ const q = ({
113
+ open: t,
114
+ onOpenChange: n,
115
+ defaultItems: r,
116
+ savedConfig: e,
117
+ onConfirm: d,
118
+ children: h
119
+ }) => {
120
+ const [u, m] = N([]), [D, S] = N(""), [l, s] = N(""), [v, i] = N(!1), p = x(() => {
121
+ m(Y(r, e)), S(""), s("");
122
+ }, [r, e]), b = (o) => {
123
+ o && p(), n(o);
124
+ }, { visible: g, hidden: y } = A(() => Z(u), [u]), w = (o) => {
125
+ m(V(o, y));
126
+ }, f = (o) => {
127
+ m(V(g, o));
128
+ }, H = (o, k) => {
129
+ m((T) => R(T, o, k));
130
+ }, F = () => {
131
+ m(r.map((o) => {
132
+ var k;
133
+ return { ...o, children: (k = o.children) == null ? void 0 : k.map((T) => ({ ...T })) };
134
+ }));
135
+ }, O = async () => {
136
+ i(!0);
137
+ try {
138
+ await d($(u)), n(!1);
139
+ } finally {
140
+ i(!1);
141
+ }
142
+ }, _ = /* @__PURE__ */ C("div", { className: c.panel, "data-ui": "table-column-config", children: [
143
+ /* @__PURE__ */ C("div", { className: c.header, children: [
144
+ /* @__PURE__ */ a("span", { className: c.title, children: "编辑表格" }),
145
+ /* @__PURE__ */ a(K, { title: "恢复默认", children: /* @__PURE__ */ a("button", { type: "button", className: c.resetBtn, onClick: F, "aria-label": "恢复默认", children: /* @__PURE__ */ a(X, { size: 16 }) }) })
146
+ ] }),
147
+ /* @__PURE__ */ a(
148
+ U,
149
+ {
150
+ className: c.collapse,
151
+ defaultActiveKey: ["visible", "hidden"],
152
+ ghost: !0,
153
+ items: [
154
+ {
155
+ key: "visible",
156
+ label: "显示的信息",
157
+ children: /* @__PURE__ */ C(z, { children: [
158
+ /* @__PURE__ */ a(
159
+ E,
160
+ {
161
+ allowClear: !0,
162
+ size: "small",
163
+ className: c.search,
164
+ placeholder: "搜索",
165
+ value: D,
166
+ onChange: (o) => S(o.target.value)
167
+ }
168
+ ),
169
+ /* @__PURE__ */ a(
170
+ L,
171
+ {
172
+ items: g,
173
+ search: D,
174
+ onChange: w,
175
+ onToggle: H
176
+ }
177
+ )
178
+ ] })
179
+ },
180
+ {
181
+ key: "hidden",
182
+ label: "隐藏的信息",
183
+ children: /* @__PURE__ */ C(z, { children: [
184
+ /* @__PURE__ */ a(
185
+ E,
186
+ {
187
+ allowClear: !0,
188
+ size: "small",
189
+ className: c.search,
190
+ placeholder: "搜索",
191
+ value: l,
192
+ onChange: (o) => s(o.target.value)
193
+ }
194
+ ),
195
+ /* @__PURE__ */ a(
196
+ L,
197
+ {
198
+ items: y,
199
+ search: l,
200
+ onChange: f,
201
+ onToggle: H
202
+ }
203
+ )
204
+ ] })
205
+ }
206
+ ]
207
+ }
208
+ ),
209
+ /* @__PURE__ */ a("div", { className: c.footer, children: /* @__PURE__ */ C(W, { children: [
210
+ /* @__PURE__ */ a(P, { size: "small", onClick: () => n(!1), children: "取消" }),
211
+ /* @__PURE__ */ a(P, { type: "primary", size: "small", loading: v, onClick: () => void O(), children: "确定" })
212
+ ] }) })
213
+ ] });
214
+ return /* @__PURE__ */ a(
215
+ G,
216
+ {
217
+ trigger: "click",
218
+ placement: "bottomRight",
219
+ open: t,
220
+ onOpenChange: b,
221
+ content: _,
222
+ overlayClassName: c.overlay,
223
+ arrow: !1,
224
+ children: h
225
+ }
226
+ );
227
+ };
228
+ function ie({
229
+ open: t,
230
+ onOpenChange: n,
231
+ defaultItems: r,
232
+ savedConfig: e,
233
+ onConfirm: d
234
+ }) {
235
+ return /* @__PURE__ */ a(
236
+ q,
237
+ {
238
+ open: t,
239
+ onOpenChange: n,
240
+ defaultItems: r,
241
+ savedConfig: e,
242
+ onConfirm: d,
243
+ children: /* @__PURE__ */ a(
244
+ "button",
245
+ {
246
+ type: "button",
247
+ className: c.gearBtn,
248
+ "aria-label": "编辑表格",
249
+ onClick: (h) => h.stopPropagation(),
250
+ children: /* @__PURE__ */ a(Q, { size: 14 })
251
+ }
252
+ )
253
+ }
254
+ );
255
+ }
256
+ export {
257
+ q as ColumnConfigPopover,
258
+ ie as ColumnConfigTrigger
259
+ };
260
+ //# sourceMappingURL=ColumnConfigPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnConfigPanel.js","sources":["../../../src/components/Table/ColumnConfigPanel.tsx"],"sourcesContent":["import { useCallback, useMemo, useState, type DragEvent, type FC, type ReactNode } from 'react';\nimport { Button, Checkbox, Collapse, Empty, Input, Popover, Space, Tooltip } from 'antd';\nimport { Settings, Undo2 } from '../Icons';\nimport type { ColumnConfigPanelItem, TableColumnConfigItem } from './columnConfigTypes';\nimport { mergePanelWithConfig, panelItemsToConfig, splitVisibleHidden } from './columnConfigUtils';\nimport styles from './columnConfig.module.scss';\n\ntype ColumnConfigPanelProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n defaultItems: ColumnConfigPanelItem[];\n savedConfig: TableColumnConfigItem[] | null;\n onConfirm: (items: TableColumnConfigItem[]) => void | Promise<void>;\n children: ReactNode;\n};\n\nfunction flattenSearch(items: ColumnConfigPanelItem[], q: string): boolean {\n if (!q) return true;\n const lower = q.toLowerCase();\n return items.some(\n (it) =>\n it.label.toLowerCase().includes(lower) ||\n it.id.toLowerCase().includes(lower) ||\n (it.children ? flattenSearch(it.children, q) : false),\n );\n}\n\nconst DragList: FC<{\n items: ColumnConfigPanelItem[];\n search: string;\n onChange: (next: ColumnConfigPanelItem[]) => void;\n onToggle: (id: string, hidden: boolean) => void;\n depth?: number;\n}> = ({ items, search, onChange, onToggle, depth = 0 }) => {\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n\n const filtered = useMemo(() => {\n if (!search.trim()) return items.map((it, i) => ({ it, i }));\n return items.map((it, i) => ({ it, i })).filter(({ it }) => flattenSearch([it], search.trim()));\n }, [items, search]);\n\n const onDragStart = (e: DragEvent, index: number) => {\n setDragIndex(index);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(index));\n };\n\n const onDrop = (e: DragEvent, toIndex: number) => {\n e.preventDefault();\n const from = dragIndex ?? Number(e.dataTransfer.getData('text/plain'));\n setDragIndex(null);\n if (!Number.isFinite(from) || from === toIndex) return;\n const next = [...items];\n const [moved] = next.splice(from, 1);\n if (!moved) return;\n next.splice(toIndex, 0, moved);\n onChange(next);\n };\n\n if (!filtered.length) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无数据\" />;\n }\n\n return (\n <ul className={styles.list} style={{ paddingLeft: depth ? 12 : 0 }}>\n {filtered.map(({ it, i }) => (\n <li key={it.id} className={styles.listItem}>\n <div\n className={styles.row}\n draggable={!search.trim()}\n onDragStart={(e) => onDragStart(e, i)}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => onDrop(e, i)}\n >\n <span className={styles.grip} aria-hidden>\n ⠿\n </span>\n <Checkbox checked={!it.hidden} onChange={(e) => onToggle(it.id, !e.target.checked)}>\n <span className={styles.label}>{it.label || it.id}</span>\n </Checkbox>\n </div>\n {it.children?.length ? (\n <DragList\n items={it.children}\n search={search}\n depth={depth + 1}\n onChange={(childNext) => {\n const next = items.map((x) => (x.id === it.id ? { ...x, children: childNext } : x));\n onChange(next);\n }}\n onToggle={(cid, hidden) => {\n const next = items.map((x) => {\n if (x.id !== it.id || !x.children) return x;\n const children = x.children.map((c) =>\n c.id === cid\n ? { ...c, hidden }\n : c.children\n ? {\n ...c,\n children: toggleDeep(c.children, cid, hidden),\n }\n : c,\n );\n const allHidden = children.every((c) => c.hidden);\n return { ...x, children, hidden: allHidden ? true : hidden ? x.hidden : false };\n });\n onChange(next);\n }}\n />\n ) : null}\n </li>\n ))}\n </ul>\n );\n};\n\nfunction toggleDeep(\n items: ColumnConfigPanelItem[],\n id: string,\n hidden: boolean,\n): ColumnConfigPanelItem[] {\n return items.map((it) => {\n if (it.id === id) return { ...it, hidden };\n if (it.children) {\n const children = toggleDeep(it.children, id, hidden);\n return {\n ...it,\n children,\n hidden: children.every((c) => c.hidden) ? true : it.hidden && hidden,\n };\n }\n return it;\n });\n}\n\nfunction toggleInTree(\n items: ColumnConfigPanelItem[],\n id: string,\n hidden: boolean,\n): ColumnConfigPanelItem[] {\n return items.map((it) => {\n if (it.id === id) {\n const children = it.children?.map((c) => setHiddenDeep(c, hidden));\n return { ...it, hidden, children };\n }\n if (it.children) {\n const children = toggleInTree(it.children, id, hidden);\n const allHidden = children.every((c) => c.hidden);\n return {\n ...it,\n children,\n hidden: allHidden ? true : !hidden && it.id !== id ? false : it.hidden,\n };\n }\n return it;\n });\n}\n\nfunction setHiddenDeep(item: ColumnConfigPanelItem, hidden: boolean): ColumnConfigPanelItem {\n return {\n ...item,\n hidden,\n children: item.children?.map((c) => setHiddenDeep(c, hidden)),\n };\n}\n\n/** 将显隐两区合并回完整顺序:visible 在前,hidden 在后(保持各自内部拖拽序) */\nfunction mergeSections(\n visible: ColumnConfigPanelItem[],\n hidden: ColumnConfigPanelItem[],\n): ColumnConfigPanelItem[] {\n return [...visible, ...hidden];\n}\n\nexport const ColumnConfigPopover: FC<ColumnConfigPanelProps> = ({\n open,\n onOpenChange,\n defaultItems,\n savedConfig,\n onConfirm,\n children,\n}) => {\n const [draft, setDraft] = useState<ColumnConfigPanelItem[]>([]);\n const [searchVisible, setSearchVisible] = useState('');\n const [searchHidden, setSearchHidden] = useState('');\n const [saving, setSaving] = useState(false);\n\n const syncDraft = useCallback(() => {\n setDraft(mergePanelWithConfig(defaultItems, savedConfig));\n setSearchVisible('');\n setSearchHidden('');\n }, [defaultItems, savedConfig]);\n\n const handleOpenChange = (next: boolean) => {\n if (next) syncDraft();\n onOpenChange(next);\n };\n\n const { visible, hidden } = useMemo(() => splitVisibleHidden(draft), [draft]);\n\n const setVisibleList = (list: ColumnConfigPanelItem[]) => {\n setDraft(mergeSections(list, hidden));\n };\n const setHiddenList = (list: ColumnConfigPanelItem[]) => {\n setDraft(mergeSections(visible, list));\n };\n\n const onToggle = (id: string, nextHidden: boolean) => {\n setDraft((prev) => toggleInTree(prev, id, nextHidden));\n };\n\n const onReset = () => {\n setDraft(defaultItems.map((d) => ({ ...d, children: d.children?.map((c) => ({ ...c })) })));\n };\n\n const onOk = async () => {\n setSaving(true);\n try {\n await onConfirm(panelItemsToConfig(draft));\n onOpenChange(false);\n } finally {\n setSaving(false);\n }\n };\n\n const content = (\n <div className={styles.panel} data-ui=\"table-column-config\">\n <div className={styles.header}>\n <span className={styles.title}>编辑表格</span>\n <Tooltip title=\"恢复默认\">\n <button type=\"button\" className={styles.resetBtn} onClick={onReset} aria-label=\"恢复默认\">\n <Undo2 size={16} />\n </button>\n </Tooltip>\n </div>\n <Collapse\n className={styles.collapse}\n defaultActiveKey={['visible', 'hidden']}\n ghost\n items={[\n {\n key: 'visible',\n label: '显示的信息',\n children: (\n <>\n <Input\n allowClear\n size=\"small\"\n className={styles.search}\n placeholder=\"搜索\"\n value={searchVisible}\n onChange={(e) => setSearchVisible(e.target.value)}\n />\n <DragList\n items={visible}\n search={searchVisible}\n onChange={setVisibleList}\n onToggle={onToggle}\n />\n </>\n ),\n },\n {\n key: 'hidden',\n label: '隐藏的信息',\n children: (\n <>\n <Input\n allowClear\n size=\"small\"\n className={styles.search}\n placeholder=\"搜索\"\n value={searchHidden}\n onChange={(e) => setSearchHidden(e.target.value)}\n />\n <DragList\n items={hidden}\n search={searchHidden}\n onChange={setHiddenList}\n onToggle={onToggle}\n />\n </>\n ),\n },\n ]}\n />\n <div className={styles.footer}>\n <Space>\n <Button size=\"small\" onClick={() => onOpenChange(false)}>\n 取消\n </Button>\n <Button type=\"primary\" size=\"small\" loading={saving} onClick={() => void onOk()}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n\n return (\n <Popover\n trigger=\"click\"\n placement=\"bottomRight\"\n open={open}\n onOpenChange={handleOpenChange}\n content={content}\n overlayClassName={styles.overlay}\n arrow={false}\n >\n {children}\n </Popover>\n );\n};\n\nexport function ColumnConfigTrigger({\n open,\n onOpenChange,\n defaultItems,\n savedConfig,\n onConfirm,\n}: Omit<ColumnConfigPanelProps, 'children'>) {\n return (\n <ColumnConfigPopover\n open={open}\n onOpenChange={onOpenChange}\n defaultItems={defaultItems}\n savedConfig={savedConfig}\n onConfirm={onConfirm}\n >\n <button\n type=\"button\"\n className={styles.gearBtn}\n aria-label=\"编辑表格\"\n onClick={(e) => e.stopPropagation()}\n >\n <Settings size={14} />\n </button>\n </ColumnConfigPopover>\n );\n}\n"],"names":["flattenSearch","items","q","lower","it","DragList","search","onChange","onToggle","depth","dragIndex","setDragIndex","useState","filtered","useMemo","i","onDragStart","e","index","onDrop","toIndex","from","next","moved","jsx","styles","jsxs","Checkbox","_a","childNext","x","cid","hidden","children","c","toggleDeep","allHidden","Empty","id","toggleInTree","setHiddenDeep","item","mergeSections","visible","ColumnConfigPopover","open","onOpenChange","defaultItems","savedConfig","onConfirm","draft","setDraft","searchVisible","setSearchVisible","searchHidden","setSearchHidden","saving","setSaving","syncDraft","useCallback","mergePanelWithConfig","handleOpenChange","splitVisibleHidden","setVisibleList","list","setHiddenList","nextHidden","prev","onReset","d","onOk","panelItemsToConfig","content","Tooltip","Undo2","Collapse","Fragment","Input","Space","Button","Popover","ColumnConfigTrigger","Settings"],"mappings":";;;;;;AAgBA,SAASA,EAAcC,GAAgCC,GAAoB;AACzE,MAAI,CAACA,EAAG,QAAO;AACf,QAAMC,IAAQD,EAAE,YAAA;AAChB,SAAOD,EAAM;AAAA,IACX,CAACG,MACCA,EAAG,MAAM,cAAc,SAASD,CAAK,KACrCC,EAAG,GAAG,cAAc,SAASD,CAAK,MACjCC,EAAG,WAAWJ,EAAcI,EAAG,UAAUF,CAAC,IAAI;AAAA,EAAA;AAErD;AAEA,MAAMG,IAMD,CAAC,EAAE,OAAAJ,GAAO,QAAAK,GAAQ,UAAAC,GAAU,UAAAC,GAAU,OAAAC,IAAQ,QAAQ;AACzD,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAwB,IAAI,GAExDC,IAAWC,EAAQ,MAClBR,EAAO,KAAA,IACLL,EAAM,IAAI,CAACG,GAAIW,OAAO,EAAE,IAAAX,GAAI,GAAAW,EAAA,EAAI,EAAE,OAAO,CAAC,EAAE,IAAAX,EAAA,MAASJ,EAAc,CAACI,CAAE,GAAGE,EAAO,KAAA,CAAM,CAAC,IADnEL,EAAM,IAAI,CAACG,GAAIW,OAAO,EAAE,IAAAX,GAAI,GAAAW,IAAI,GAE1D,CAACd,GAAOK,CAAM,CAAC,GAEZU,IAAc,CAACC,GAAcC,MAAkB;AACnD,IAAAP,EAAaO,CAAK,GAClBD,EAAE,aAAa,gBAAgB,QAC/BA,EAAE,aAAa,QAAQ,cAAc,OAAOC,CAAK,CAAC;AAAA,EACpD,GAEMC,IAAS,CAACF,GAAcG,MAAoB;AAChD,IAAAH,EAAE,eAAA;AACF,UAAMI,IAAOX,KAAa,OAAOO,EAAE,aAAa,QAAQ,YAAY,CAAC;AAErE,QADAN,EAAa,IAAI,GACb,CAAC,OAAO,SAASU,CAAI,KAAKA,MAASD,EAAS;AAChD,UAAME,IAAO,CAAC,GAAGrB,CAAK,GAChB,CAACsB,CAAK,IAAID,EAAK,OAAOD,GAAM,CAAC;AACnC,IAAKE,MACLD,EAAK,OAAOF,GAAS,GAAGG,CAAK,GAC7BhB,EAASe,CAAI;AAAA,EACf;AAEA,SAAKT,EAAS,SAKZ,gBAAAW,EAAC,QAAG,WAAWC,EAAO,MAAM,OAAO,EAAE,aAAahB,IAAQ,KAAK,EAAA,GAC5D,UAAAI,EAAS,IAAI,CAAC,EAAE,IAAAT,GAAI,GAAAW,EAAA;;AACnB,2BAAAW,EAAC,MAAA,EAAe,WAAWD,EAAO,UAChC,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWD,EAAO;AAAA,UAClB,WAAW,CAACnB,EAAO,KAAA;AAAA,UACnB,aAAa,CAACW,MAAMD,EAAYC,GAAGF,CAAC;AAAA,UACpC,YAAY,CAACE,MAAMA,EAAE,eAAA;AAAA,UACrB,QAAQ,CAACA,MAAME,EAAOF,GAAGF,CAAC;AAAA,UAE1B,UAAA;AAAA,YAAA,gBAAAS,EAAC,UAAK,WAAWC,EAAO,MAAM,eAAW,IAAC,UAAA,KAE1C;AAAA,YACA,gBAAAD,EAACG,GAAA,EAAS,SAAS,CAACvB,EAAG,QAAQ,UAAU,CAACa,MAAMT,EAASJ,EAAG,IAAI,CAACa,EAAE,OAAO,OAAO,GAC/E,UAAA,gBAAAO,EAAC,QAAA,EAAK,WAAWC,EAAO,OAAQ,UAAArB,EAAG,SAASA,EAAG,GAAA,CAAG,EAAA,CACpD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,OAEDwB,IAAAxB,EAAG,aAAH,QAAAwB,EAAa,SACZ,gBAAAJ;AAAA,QAACnB;AAAA,QAAA;AAAA,UACC,OAAOD,EAAG;AAAA,UACV,QAAAE;AAAA,UACA,OAAOG,IAAQ;AAAA,UACf,UAAU,CAACoB,MAAc;AACvB,kBAAMP,IAAOrB,EAAM,IAAI,CAAC6B,MAAOA,EAAE,OAAO1B,EAAG,KAAK,EAAE,GAAG0B,GAAG,UAAUD,EAAA,IAAcC,CAAE;AAClF,YAAAvB,EAASe,CAAI;AAAA,UACf;AAAA,UACA,UAAU,CAACS,GAAKC,MAAW;AACzB,kBAAMV,IAAOrB,EAAM,IAAI,CAAC6B,MAAM;AAC5B,kBAAIA,EAAE,OAAO1B,EAAG,MAAM,CAAC0B,EAAE,SAAU,QAAOA;AAC1C,oBAAMG,IAAWH,EAAE,SAAS;AAAA,gBAAI,CAACI,MAC/BA,EAAE,OAAOH,IACL,EAAE,GAAGG,GAAG,QAAAF,EAAA,IACRE,EAAE,WACA;AAAA,kBACE,GAAGA;AAAA,kBACH,UAAUC,EAAWD,EAAE,UAAUH,GAAKC,CAAM;AAAA,gBAAA,IAE9CE;AAAA,cAAA,GAEFE,IAAYH,EAAS,MAAM,CAACC,MAAMA,EAAE,MAAM;AAChD,qBAAO,EAAE,GAAGJ,GAAG,UAAAG,GAAU,QAAQG,IAAY,KAAOJ,IAASF,EAAE,SAAS,GAAA;AAAA,YAC1E,CAAC;AACD,YAAAvB,EAASe,CAAI;AAAA,UACf;AAAA,QAAA;AAAA,MAAA,IAEA;AAAA,IAAA,EAAA,GA3CGlB,EAAG,EA4CZ;AAAA,GACD,GACH,sBApDQiC,GAAA,EAAM,OAAOA,EAAM,wBAAwB,aAAY,QAAO;AAsD1E;AAEA,SAASF,EACPlC,GACAqC,GACAN,GACyB;AACzB,SAAO/B,EAAM,IAAI,CAACG,MAAO;AACvB,QAAIA,EAAG,OAAOkC,UAAW,EAAE,GAAGlC,GAAI,QAAA4B,EAAA;AAClC,QAAI5B,EAAG,UAAU;AACf,YAAM6B,IAAWE,EAAW/B,EAAG,UAAUkC,GAAIN,CAAM;AACnD,aAAO;AAAA,QACL,GAAG5B;AAAA,QACH,UAAA6B;AAAA,QACA,QAAQA,EAAS,MAAM,CAACC,MAAMA,EAAE,MAAM,IAAI,KAAO9B,EAAG,UAAU4B;AAAA,MAAA;AAAA,IAElE;AACA,WAAO5B;AAAA,EACT,CAAC;AACH;AAEA,SAASmC,EACPtC,GACAqC,GACAN,GACyB;AACzB,SAAO/B,EAAM,IAAI,CAACG,MAAO;;AACvB,QAAIA,EAAG,OAAOkC,GAAI;AAChB,YAAML,KAAWL,IAAAxB,EAAG,aAAH,gBAAAwB,EAAa,IAAI,CAACM,MAAMM,EAAcN,GAAGF,CAAM;AAChE,aAAO,EAAE,GAAG5B,GAAI,QAAA4B,GAAQ,UAAAC,EAAA;AAAA,IAC1B;AACA,QAAI7B,EAAG,UAAU;AACf,YAAM6B,IAAWM,EAAanC,EAAG,UAAUkC,GAAIN,CAAM,GAC/CI,IAAYH,EAAS,MAAM,CAACC,MAAMA,EAAE,MAAM;AAChD,aAAO;AAAA,QACL,GAAG9B;AAAA,QACH,UAAA6B;AAAA,QACA,QAAQG,IAAY,KAAO,CAACJ,KAAU5B,EAAG,OAAOkC,IAAK,KAAQlC,EAAG;AAAA,MAAA;AAAA,IAEpE;AACA,WAAOA;AAAA,EACT,CAAC;AACH;AAEA,SAASoC,EAAcC,GAA6BT,GAAwC;;AAC1F,SAAO;AAAA,IACL,GAAGS;AAAA,IACH,QAAAT;AAAA,IACA,WAAUJ,IAAAa,EAAK,aAAL,gBAAAb,EAAe,IAAI,CAACM,MAAMM,EAAcN,GAAGF,CAAM;AAAA,EAAC;AAEhE;AAGA,SAASU,EACPC,GACAX,GACyB;AACzB,SAAO,CAAC,GAAGW,GAAS,GAAGX,CAAM;AAC/B;AAEO,MAAMY,IAAkD,CAAC;AAAA,EAC9D,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAhB;AACF,MAAM;AACJ,QAAM,CAACiB,GAAOC,CAAQ,IAAIvC,EAAkC,CAAA,CAAE,GACxD,CAACwC,GAAeC,CAAgB,IAAIzC,EAAS,EAAE,GAC/C,CAAC0C,GAAcC,CAAe,IAAI3C,EAAS,EAAE,GAC7C,CAAC4C,GAAQC,CAAS,IAAI7C,EAAS,EAAK,GAEpC8C,IAAYC,EAAY,MAAM;AAClC,IAAAR,EAASS,EAAqBb,GAAcC,CAAW,CAAC,GACxDK,EAAiB,EAAE,GACnBE,EAAgB,EAAE;AAAA,EACpB,GAAG,CAACR,GAAcC,CAAW,CAAC,GAExBa,IAAmB,CAACvC,MAAkB;AAC1C,IAAIA,KAAMoC,EAAA,GACVZ,EAAaxB,CAAI;AAAA,EACnB,GAEM,EAAE,SAAAqB,GAAS,QAAAX,EAAA,IAAWlB,EAAQ,MAAMgD,EAAmBZ,CAAK,GAAG,CAACA,CAAK,CAAC,GAEtEa,IAAiB,CAACC,MAAkC;AACxD,IAAAb,EAAST,EAAcsB,GAAMhC,CAAM,CAAC;AAAA,EACtC,GACMiC,IAAgB,CAACD,MAAkC;AACvD,IAAAb,EAAST,EAAcC,GAASqB,CAAI,CAAC;AAAA,EACvC,GAEMxD,IAAW,CAAC8B,GAAY4B,MAAwB;AACpD,IAAAf,EAAS,CAACgB,MAAS5B,EAAa4B,GAAM7B,GAAI4B,CAAU,CAAC;AAAA,EACvD,GAEME,IAAU,MAAM;AACpB,IAAAjB,EAASJ,EAAa,IAAI,CAACsB;;AAAO,eAAE,GAAGA,GAAG,WAAUzC,IAAAyC,EAAE,aAAF,gBAAAzC,EAAY,IAAI,CAACM,OAAO,EAAE,GAAGA,MAAI;AAAA,KAAI,CAAC;AAAA,EAC5F,GAEMoC,IAAO,YAAY;AACvB,IAAAb,EAAU,EAAI;AACd,QAAI;AACF,YAAMR,EAAUsB,EAAmBrB,CAAK,CAAC,GACzCJ,EAAa,EAAK;AAAA,IACpB,UAAA;AACE,MAAAW,EAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAEMe,IACJ,gBAAA9C,EAAC,OAAA,EAAI,WAAWD,EAAO,OAAO,WAAQ,uBACpC,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,QACrB,UAAA;AAAA,MAAA,gBAAAD,EAAC,QAAA,EAAK,WAAWC,EAAO,OAAO,UAAA,QAAI;AAAA,MACnC,gBAAAD,EAACiD,KAAQ,OAAM,QACb,4BAAC,UAAA,EAAO,MAAK,UAAS,WAAWhD,EAAO,UAAU,SAAS2C,GAAS,cAAW,QAC7E,UAAA,gBAAA5C,EAACkD,KAAM,MAAM,GAAA,CAAI,GACnB,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACA,gBAAAlD;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,WAAWlD,EAAO;AAAA,QAClB,kBAAkB,CAAC,WAAW,QAAQ;AAAA,QACtC,OAAK;AAAA,QACL,OAAO;AAAA,UACL;AAAA,YACE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UACE,gBAAAC,EAAAkD,GAAA,EACE,UAAA;AAAA,cAAA,gBAAApD;AAAA,gBAACqD;AAAA,gBAAA;AAAA,kBACC,YAAU;AAAA,kBACV,MAAK;AAAA,kBACL,WAAWpD,EAAO;AAAA,kBAClB,aAAY;AAAA,kBACZ,OAAO2B;AAAA,kBACP,UAAU,CAACnC,MAAMoC,EAAiBpC,EAAE,OAAO,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAElD,gBAAAO;AAAA,gBAACnB;AAAA,gBAAA;AAAA,kBACC,OAAOsC;AAAA,kBACP,QAAQS;AAAA,kBACR,UAAUW;AAAA,kBACV,UAAAvD;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF,EAAA,CACF;AAAA,UAAA;AAAA,UAGJ;AAAA,YACE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UACE,gBAAAkB,EAAAkD,GAAA,EACE,UAAA;AAAA,cAAA,gBAAApD;AAAA,gBAACqD;AAAA,gBAAA;AAAA,kBACC,YAAU;AAAA,kBACV,MAAK;AAAA,kBACL,WAAWpD,EAAO;AAAA,kBAClB,aAAY;AAAA,kBACZ,OAAO6B;AAAA,kBACP,UAAU,CAACrC,MAAMsC,EAAgBtC,EAAE,OAAO,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEjD,gBAAAO;AAAA,gBAACnB;AAAA,gBAAA;AAAA,kBACC,OAAO2B;AAAA,kBACP,QAAQsB;AAAA,kBACR,UAAUW;AAAA,kBACV,UAAAzD;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF,EAAA,CACF;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IAAA;AAAA,sBAED,OAAA,EAAI,WAAWiB,EAAO,QACrB,4BAACqD,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAtD,EAACuD,GAAA,EAAO,MAAK,SAAQ,SAAS,MAAMjC,EAAa,EAAK,GAAG,UAAA,KAAA,CAEzD;AAAA,MACA,gBAAAtB,EAACuD,GAAA,EAAO,MAAK,WAAU,MAAK,SAAQ,SAASvB,GAAQ,SAAS,MAAM,KAAKc,EAAA,GAAQ,UAAA,KAAA,CAEjF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF;AAGF,SACE,gBAAA9C;AAAA,IAACwD;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,MAAAnC;AAAA,MACA,cAAcgB;AAAA,MACd,SAAAW;AAAA,MACA,kBAAkB/C,EAAO;AAAA,MACzB,OAAO;AAAA,MAEN,UAAAQ;AAAA,IAAA;AAAA,EAAA;AAGP;AAEO,SAASgD,GAAoB;AAAA,EAClC,MAAApC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AACF,GAA6C;AAC3C,SACE,gBAAAzB;AAAA,IAACoB;AAAA,IAAA;AAAA,MACC,MAAAC;AAAA,MACA,cAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,WAAAC;AAAA,MAEA,UAAA,gBAAAzB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWC,EAAO;AAAA,UAClB,cAAW;AAAA,UACX,SAAS,CAACR,MAAMA,EAAE,gBAAA;AAAA,UAElB,UAAA,gBAAAO,EAAC0D,GAAA,EAAS,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IACtB;AAAA,EAAA;AAGN;"}
@@ -1,8 +1,22 @@
1
1
  import { TableProps as AntTableProps } from 'antd';
2
- export type TableProps<RecordType extends object = Record<string, unknown>> = AntTableProps<RecordType>;
2
+ import { TableColumnConfigFetcher, TableColumnConfigItem, TableColumnConfigSaver } from './columnConfigTypes';
3
+ import { applyColumnConfig, columnsToConfig, COLUMN_CONFIG_COL_KEY } from './columnConfigUtils';
4
+ export type { TableColumnConfigItem, TableColumnConfigFetcher, TableColumnConfigSaver };
5
+ export type TableProps<RecordType extends object = Record<string, unknown>> = AntTableProps<RecordType> & {
6
+ /** 稳定偏好 key;业务列表必填 */
7
+ tableName?: string;
8
+ /** 是否启用「编辑表格」列配置;默认 !!tableName */
9
+ columnConfigEnabled?: boolean;
10
+ fetchColumnConfig?: TableColumnConfigFetcher;
11
+ saveColumnConfig?: TableColumnConfigSaver;
12
+ onColumnConfigChange?: (items: TableColumnConfigItem[]) => void;
13
+ };
3
14
  /**
4
15
  * 基于 antd Table 的列表表格包装。
5
16
  * 默认:横向滚动 max-content、受控分页 showSizeChanger + showTotal、空态 Empty。
17
+ * tableName + columnConfigEnabled 时在最右侧追加独立齿轮列(跨多级表头高度)。
6
18
  */
7
- declare function Table<RecordType extends object = Record<string, unknown>>({ className, scroll, pagination, locale, ...rest }: TableProps<RecordType>): import("react").JSX.Element;
19
+ declare function Table<RecordType extends object = Record<string, unknown>>({ className, scroll, pagination, locale, columns, tableName, columnConfigEnabled, fetchColumnConfig, saveColumnConfig, onColumnConfigChange, ...rest }: TableProps<RecordType>): import("react").JSX.Element;
8
20
  export default Table;
21
+ /** 导出工具:业务侧也可手动生成默认配置 */
22
+ export { columnsToConfig, applyColumnConfig, COLUMN_CONFIG_COL_KEY };
@@ -1,39 +1,117 @@
1
- import { jsx as r } from "react/jsx-runtime";
2
- import { Table as n } from "antd";
3
- import c from "classnames";
4
- import f from "./style.module.scss.js";
5
- import i from "../Empty/Empty.js";
6
- const p = { x: "max-content" };
7
- function u(o) {
8
- return `共 ${o} 项`;
1
+ import { jsx as m } from "react/jsx-runtime";
2
+ import { useRef as P, useState as T, useEffect as _, useMemo as y, useCallback as R } from "react";
3
+ import { Table as j } from "antd";
4
+ import k from "classnames";
5
+ import { ColumnConfigTrigger as D } from "./ColumnConfigPanel.js";
6
+ import { applyColumnConfig as G, columnsToPanelItems as U, COLUMN_CONFIG_COL_KEY as $ } from "./columnConfigUtils.js";
7
+ import { columnsToConfig as oe } from "./columnConfigUtils.js";
8
+ import v from "./style.module.scss.js";
9
+ import w from "./columnConfig.module.scss.js";
10
+ import z from "../Empty/Empty.js";
11
+ const A = { x: "max-content" }, B = 40;
12
+ function K(f) {
13
+ return `共 ${f} 项`;
9
14
  }
10
- function h({
11
- className: o,
12
- scroll: t,
13
- pagination: e,
14
- locale: a,
15
- ...s
15
+ function ee({
16
+ className: f,
17
+ scroll: O,
18
+ pagination: s,
19
+ locale: h,
20
+ columns: r,
21
+ tableName: t,
22
+ columnConfigEnabled: C,
23
+ fetchColumnConfig: c,
24
+ saveColumnConfig: i,
25
+ onColumnConfigChange: l,
26
+ ...E
16
27
  }) {
17
- const m = e === !1 ? !1 : {
28
+ const o = C ?? !!t, L = P(r), [n, u] = T(null), [x, b] = T(!1), [g, d] = T(!o);
29
+ _(() => {
30
+ L.current = r;
31
+ }, [r]), _(() => {
32
+ if (!o || !t || !c) {
33
+ d(!0);
34
+ return;
35
+ }
36
+ let e = !1;
37
+ return d(!1), c(t).then((a) => {
38
+ e || u(a != null && a.length ? a : null);
39
+ }).catch(() => {
40
+ e || u(null);
41
+ }).finally(() => {
42
+ e || d(!0);
43
+ }), () => {
44
+ e = !0;
45
+ };
46
+ }, [o, t, c]);
47
+ const p = y(() => {
48
+ const e = r || [];
49
+ return o ? G(e, n) : e;
50
+ }, [r, o, n]), I = y(
51
+ () => U(
52
+ L.current || r
53
+ ),
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- 随 columns 结构变
55
+ [r]
56
+ ), S = R(
57
+ async (e) => {
58
+ t && i && await i(t, e), u(e), l == null || l(e);
59
+ },
60
+ [t, i, l]
61
+ ), F = y(() => {
62
+ if (!o || !g) return p;
63
+ const e = {
64
+ key: $,
65
+ width: B,
66
+ fixed: "right",
67
+ align: "center",
68
+ className: w.configCol,
69
+ onHeaderCell: () => ({ className: w.configColHeader }),
70
+ title: /* @__PURE__ */ m(
71
+ D,
72
+ {
73
+ open: x,
74
+ onOpenChange: b,
75
+ defaultItems: I,
76
+ savedConfig: n,
77
+ onConfirm: S
78
+ }
79
+ ),
80
+ render: () => null
81
+ };
82
+ return [...p, e];
83
+ }, [
84
+ o,
85
+ g,
86
+ p,
87
+ x,
88
+ I,
89
+ n,
90
+ S
91
+ ]), H = s === !1 ? !1 : {
18
92
  showSizeChanger: !0,
19
- showTotal: u,
20
- ...e && typeof e == "object" ? e : {}
21
- }, l = {
22
- emptyText: /* @__PURE__ */ r(i, { iconType: "simple", description: "暂无数据" }),
23
- ...a
93
+ showTotal: K,
94
+ ...s && typeof s == "object" ? s : {}
95
+ }, M = {
96
+ emptyText: /* @__PURE__ */ m(z, { iconType: "simple", description: "暂无数据" }),
97
+ ...h
24
98
  };
25
- return /* @__PURE__ */ r(
26
- n,
99
+ return /* @__PURE__ */ m(
100
+ j,
27
101
  {
28
- className: c("marsun-table", f["marsun-table"], o),
29
- scroll: t === void 0 ? p : t,
30
- pagination: m,
31
- locale: l,
32
- ...s
102
+ className: k("marsun-table", v["marsun-table"], f),
103
+ scroll: O === void 0 ? A : O,
104
+ pagination: H,
105
+ locale: M,
106
+ columns: F,
107
+ ...E
33
108
  }
34
109
  );
35
110
  }
36
111
  export {
37
- h as default
112
+ $ as COLUMN_CONFIG_COL_KEY,
113
+ G as applyColumnConfig,
114
+ oe as columnsToConfig,
115
+ ee as default
38
116
  };
39
117
  //# sourceMappingURL=Table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import { Table as AntTable } from 'antd';\nimport type { TableProps as AntTableProps } from 'antd';\nimport classNames from 'classnames';\nimport { Empty } from '../Empty';\nimport styles from './style.module.scss';\n\nexport type TableProps<RecordType extends object = Record<string, unknown>> =\n AntTableProps<RecordType>;\n\nconst DEFAULT_SCROLL = { x: 'max-content' as const };\n\nfunction defaultShowTotal(total: number): string {\n return `共 ${total} 项`;\n}\n\n/**\n * 基于 antd Table 的列表表格包装。\n * 默认:横向滚动 max-content、受控分页 showSizeChanger + showTotal、空态 Empty。\n */\nfunction Table<RecordType extends object = Record<string, unknown>>({\n className,\n scroll,\n pagination,\n locale,\n ...rest\n}: TableProps<RecordType>) {\n const mergedPagination =\n pagination === false\n ? false\n : {\n showSizeChanger: true,\n showTotal: defaultShowTotal,\n ...(pagination && typeof pagination === 'object' ? pagination : {}),\n };\n\n const mergedLocale = {\n emptyText: <Empty iconType=\"simple\" description=\"暂无数据\" />,\n ...locale,\n };\n\n return (\n <AntTable<RecordType>\n className={classNames('marsun-table', styles['marsun-table'], className)}\n scroll={scroll === undefined ? DEFAULT_SCROLL : scroll}\n pagination={mergedPagination}\n locale={mergedLocale}\n {...rest}\n />\n );\n}\n\nexport default Table;\n"],"names":["DEFAULT_SCROLL","defaultShowTotal","total","Table","className","scroll","pagination","locale","rest","mergedPagination","mergedLocale","jsx","Empty","AntTable","classNames","styles"],"mappings":";;;;;AASA,MAAMA,IAAiB,EAAE,GAAG,cAAA;AAE5B,SAASC,EAAiBC,GAAuB;AAC/C,SAAO,KAAKA,CAAK;AACnB;AAMA,SAASC,EAA2D;AAAA,EAClE,WAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,GAAGC;AACL,GAA2B;AACzB,QAAMC,IACJH,MAAe,KACX,KACA;AAAA,IACE,iBAAiB;AAAA,IACjB,WAAWL;AAAA,IACX,GAAIK,KAAc,OAAOA,KAAe,WAAWA,IAAa,CAAA;AAAA,EAAC,GAGnEI,IAAe;AAAA,IACnB,WAAW,gBAAAC,EAACC,GAAA,EAAM,UAAS,UAAS,aAAY,QAAO;AAAA,IACvD,GAAGL;AAAA,EAAA;AAGL,SACE,gBAAAI;AAAA,IAACE;AAAAA,IAAA;AAAA,MACC,WAAWC,EAAW,gBAAgBC,EAAO,cAAc,GAAGX,CAAS;AAAA,MACvE,QAAQC,MAAW,SAAYL,IAAiBK;AAAA,MAChD,YAAYI;AAAA,MACZ,QAAQC;AAAA,MACP,GAAGF;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"Table.js","sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Table as AntTable } from 'antd';\nimport type { TableProps as AntTableProps } from 'antd';\nimport type { ColumnsType, ColumnType } from 'antd/es/table';\nimport classNames from 'classnames';\nimport { Empty } from '../Empty';\nimport { ColumnConfigTrigger } from './ColumnConfigPanel';\nimport type {\n TableColumnConfigFetcher,\n TableColumnConfigItem,\n TableColumnConfigSaver,\n} from './columnConfigTypes';\nimport {\n applyColumnConfig,\n columnsToConfig,\n columnsToPanelItems,\n COLUMN_CONFIG_COL_KEY,\n} from './columnConfigUtils';\nimport styles from './style.module.scss';\nimport gearStyles from './columnConfig.module.scss';\n\nexport type { TableColumnConfigItem, TableColumnConfigFetcher, TableColumnConfigSaver };\n\nexport type TableProps<RecordType extends object = Record<string, unknown>> =\n AntTableProps<RecordType> & {\n /** 稳定偏好 key;业务列表必填 */\n tableName?: string;\n /** 是否启用「编辑表格」列配置;默认 !!tableName */\n columnConfigEnabled?: boolean;\n fetchColumnConfig?: TableColumnConfigFetcher;\n saveColumnConfig?: TableColumnConfigSaver;\n onColumnConfigChange?: (items: TableColumnConfigItem[]) => void;\n };\n\nconst DEFAULT_SCROLL = { x: 'max-content' as const };\nconst CONFIG_COL_WIDTH = 40;\n\nfunction defaultShowTotal(total: number): string {\n return `共 ${total} 项`;\n}\n\n/**\n * 基于 antd Table 的列表表格包装。\n * 默认:横向滚动 max-content、受控分页 showSizeChanger + showTotal、空态 Empty。\n * tableName + columnConfigEnabled 时在最右侧追加独立齿轮列(跨多级表头高度)。\n */\nfunction Table<RecordType extends object = Record<string, unknown>>({\n className,\n scroll,\n pagination,\n locale,\n columns,\n tableName,\n columnConfigEnabled,\n fetchColumnConfig,\n saveColumnConfig,\n onColumnConfigChange,\n ...rest\n}: TableProps<RecordType>) {\n const enableConfig = columnConfigEnabled ?? Boolean(tableName);\n const defaultColumnsRef = useRef(columns);\n const [savedConfig, setSavedConfig] = useState<TableColumnConfigItem[] | null>(null);\n const [configOpen, setConfigOpen] = useState(false);\n const [loaded, setLoaded] = useState(!enableConfig);\n\n useEffect(() => {\n defaultColumnsRef.current = columns;\n }, [columns]);\n\n useEffect(() => {\n if (!enableConfig || !tableName || !fetchColumnConfig) {\n setLoaded(true);\n return;\n }\n let cancelled = false;\n setLoaded(false);\n fetchColumnConfig(tableName)\n .then((items) => {\n if (!cancelled) setSavedConfig(items?.length ? items : null);\n })\n .catch(() => {\n if (!cancelled) setSavedConfig(null);\n })\n .finally(() => {\n if (!cancelled) setLoaded(true);\n });\n return () => {\n cancelled = true;\n };\n }, [enableConfig, tableName, fetchColumnConfig]);\n\n const appliedColumns = useMemo(() => {\n const base = (columns || []) as ColumnsType<RecordType>;\n if (!enableConfig) return base;\n return applyColumnConfig(base, savedConfig);\n }, [columns, enableConfig, savedConfig]);\n\n const defaultPanelItems = useMemo(\n () =>\n columnsToPanelItems(\n (defaultColumnsRef.current || columns) as ColumnsType<Record<string, unknown>>,\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- 随 columns 结构变\n [columns],\n );\n\n const handleConfirm = useCallback(\n async (items: TableColumnConfigItem[]) => {\n if (tableName && saveColumnConfig) {\n await saveColumnConfig(tableName, items);\n }\n setSavedConfig(items);\n onColumnConfigChange?.(items);\n },\n [tableName, saveColumnConfig, onColumnConfigChange],\n );\n\n const displayColumns = useMemo(() => {\n if (!enableConfig || !loaded) return appliedColumns;\n const gearCol: ColumnType<RecordType> = {\n key: COLUMN_CONFIG_COL_KEY,\n width: CONFIG_COL_WIDTH,\n fixed: 'right',\n align: 'center',\n className: gearStyles.configCol,\n onHeaderCell: () => ({ className: gearStyles.configColHeader }),\n title: (\n <ColumnConfigTrigger\n open={configOpen}\n onOpenChange={setConfigOpen}\n defaultItems={defaultPanelItems}\n savedConfig={savedConfig}\n onConfirm={handleConfirm}\n />\n ),\n render: () => null,\n };\n return [...appliedColumns, gearCol] as ColumnsType<RecordType>;\n }, [\n enableConfig,\n loaded,\n appliedColumns,\n configOpen,\n defaultPanelItems,\n savedConfig,\n handleConfirm,\n ]);\n\n const mergedPagination =\n pagination === false\n ? false\n : {\n showSizeChanger: true,\n showTotal: defaultShowTotal,\n ...(pagination && typeof pagination === 'object' ? pagination : {}),\n };\n\n const mergedLocale = {\n emptyText: <Empty iconType=\"simple\" description=\"暂无数据\" />,\n ...locale,\n };\n\n return (\n <AntTable<RecordType>\n className={classNames('marsun-table', styles['marsun-table'], className)}\n scroll={scroll === undefined ? DEFAULT_SCROLL : scroll}\n pagination={mergedPagination}\n locale={mergedLocale}\n columns={displayColumns}\n {...rest}\n />\n );\n}\n\nexport default Table;\n\n/** 导出工具:业务侧也可手动生成默认配置 */\nexport { columnsToConfig, applyColumnConfig, COLUMN_CONFIG_COL_KEY };\n"],"names":["DEFAULT_SCROLL","CONFIG_COL_WIDTH","defaultShowTotal","total","Table","className","scroll","pagination","locale","columns","tableName","columnConfigEnabled","fetchColumnConfig","saveColumnConfig","onColumnConfigChange","rest","enableConfig","defaultColumnsRef","useRef","savedConfig","setSavedConfig","useState","configOpen","setConfigOpen","loaded","setLoaded","useEffect","cancelled","items","appliedColumns","useMemo","base","applyColumnConfig","defaultPanelItems","columnsToPanelItems","handleConfirm","useCallback","displayColumns","gearCol","COLUMN_CONFIG_COL_KEY","gearStyles","jsx","ColumnConfigTrigger","mergedPagination","mergedLocale","Empty","AntTable","classNames","styles"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ const t = "_overlay_g3qto_1", o = "_panel_g3qto_5", e = "_header_g3qto_13", _ = "_title_g3qto_22", l = "_resetBtn_g3qto_28", s = "_collapse_g3qto_45", n = "_search_g3qto_60", c = "_list_g3qto_64", g = "_listItem_g3qto_72", r = "_row_g3qto_76", a = "_grip_g3qto_88", i = "_label_g3qto_96", q = "_footer_g3qto_100", f = "_gearBtn_g3qto_108", p = "_configCol_g3qto_129", d = "_configColHeader_g3qto_133", h = {
2
+ overlay: t,
3
+ panel: o,
4
+ header: e,
5
+ title: _,
6
+ resetBtn: l,
7
+ collapse: s,
8
+ search: n,
9
+ list: c,
10
+ listItem: g,
11
+ row: r,
12
+ grip: a,
13
+ label: i,
14
+ footer: q,
15
+ gearBtn: f,
16
+ configCol: p,
17
+ configColHeader: d
18
+ };
19
+ export {
20
+ s as collapse,
21
+ p as configCol,
22
+ d as configColHeader,
23
+ h as default,
24
+ q as footer,
25
+ f as gearBtn,
26
+ a as grip,
27
+ e as header,
28
+ i as label,
29
+ c as list,
30
+ g as listItem,
31
+ t as overlay,
32
+ o as panel,
33
+ l as resetBtn,
34
+ r as row,
35
+ n as search,
36
+ _ as title
37
+ };
38
+ //# sourceMappingURL=columnConfig.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnConfig.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,22 @@
1
+ import { ColumnType, ColumnsType } from 'antd/es/table';
2
+ /** 与 user_key 持久化一致的列配置项(支持多级 children) */
3
+ export type TableColumnConfigItem = {
4
+ id: string;
5
+ hidden?: boolean;
6
+ width?: number;
7
+ children?: TableColumnConfigItem[];
8
+ };
9
+ export type TableColumnConfigFetcher = (tableName: string) => Promise<TableColumnConfigItem[] | null | undefined>;
10
+ export type TableColumnConfigSaver = (tableName: string, items: TableColumnConfigItem[]) => Promise<void>;
11
+ export type ColumnConfigPanelItem = {
12
+ id: string;
13
+ title: unknown;
14
+ label: string;
15
+ hidden: boolean;
16
+ children?: ColumnConfigPanelItem[];
17
+ };
18
+ export type ColumnTypeAny = ColumnType<Record<string, unknown>> & {
19
+ key?: React.Key;
20
+ children?: ColumnsType<Record<string, unknown>>;
21
+ fixed?: 'left' | 'right' | boolean;
22
+ };
@@ -0,0 +1,25 @@
1
+ import { ColumnsType } from 'antd/es/table';
2
+ import { ColumnConfigPanelItem, TableColumnConfigItem } from './columnConfigTypes';
3
+ /** 列配置齿轮列 key;不进面板 / 持久化 */
4
+ export declare const COLUMN_CONFIG_COL_KEY = "__marsun_column_config";
5
+ /** 叶子相对父级的短 id:TGCV_finished → finished;否则用完整 key */
6
+ export declare function shortChildId(parentId: string, childKey: string): string;
7
+ /** 从 columns 生成默认配置(全部显示,保持树结构;子 id 用短名) */
8
+ export declare function columnsToConfig(columns: ColumnsType<Record<string, unknown>> | undefined, parentId?: string): TableColumnConfigItem[];
9
+ /** columns → 面板树(含 title 文案);子 id 用短名与持久化一致 */
10
+ export declare function columnsToPanelItems(columns: ColumnsType<Record<string, unknown>> | undefined, hiddenIds?: Set<string>, parentId?: string): ColumnConfigPanelItem[];
11
+ /** 按配置重排列并过滤 hidden;子列相对父列解析 */
12
+ export declare function applyColumnConfig<RecordType extends object>(columns: ColumnsType<RecordType> | undefined, config: TableColumnConfigItem[] | null | undefined): ColumnsType<RecordType>;
13
+ /** 找最右可见叶子列路径(用于挂齿轮) */
14
+ export declare function findRightmostLeafPath(columns: ColumnsType<Record<string, unknown>> | undefined): number[] | null;
15
+ export declare function getColumnFixed(columns: ColumnsType<Record<string, unknown>> | undefined, path: number[]): 'left' | 'right' | boolean | undefined;
16
+ /** 在指定 path 的叶子 title 上注入节点 */
17
+ export declare function injectTitleAtPath<RecordType extends object>(columns: ColumnsType<RecordType>, path: number[], inject: (originalTitle: unknown) => unknown): ColumnsType<RecordType>;
18
+ /** 面板草稿 → 持久化 config(hidden 的也写入,保证顺序可恢复) */
19
+ export declare function panelItemsToConfig(items: ColumnConfigPanelItem[]): TableColumnConfigItem[];
20
+ /** 用已保存 config 给面板打 hidden 标记,并按 config 排序 */
21
+ export declare function mergePanelWithConfig(defaults: ColumnConfigPanelItem[], config: TableColumnConfigItem[] | null | undefined): ColumnConfigPanelItem[];
22
+ export declare function splitVisibleHidden(items: ColumnConfigPanelItem[]): {
23
+ visible: ColumnConfigPanelItem[];
24
+ hidden: ColumnConfigPanelItem[];
25
+ };