@hkyhy/marsun-components-core 0.1.29 → 0.1.31

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 (63) hide show
  1. package/dist/components/Auth/UserProfileCard/UserProfileCard.d.ts +7 -1
  2. package/dist/components/Auth/UserProfileCard/UserProfileCard.js +59 -28
  3. package/dist/components/Auth/UserProfileCard/UserProfileCard.js.map +1 -1
  4. package/dist/components/Auth/UserProfileCard/style.module.scss.js +16 -10
  5. package/dist/components/Auth/UserProfileCard/style.module.scss.js.map +1 -1
  6. package/dist/components/Filter/CommonFilter/index.js +88 -53
  7. package/dist/components/Filter/CommonFilter/index.js.map +1 -1
  8. package/dist/components/Filter/FilterCascader/index.d.ts +40 -0
  9. package/dist/components/Filter/FilterCascader/index.js +318 -0
  10. package/dist/components/Filter/FilterCascader/index.js.map +1 -0
  11. package/dist/components/Filter/FilterCascader/style.module.scss.js +14 -0
  12. package/dist/components/Filter/FilterCascader/style.module.scss.js.map +1 -0
  13. package/dist/components/Filter/FilterDatePicker/index.js +102 -84
  14. package/dist/components/Filter/FilterDatePicker/index.js.map +1 -1
  15. package/dist/components/Filter/FilterDateRange/index.js +84 -66
  16. package/dist/components/Filter/FilterDateRange/index.js.map +1 -1
  17. package/dist/components/Filter/FilterInput/index.js +51 -33
  18. package/dist/components/Filter/FilterInput/index.js.map +1 -1
  19. package/dist/components/Filter/FilterNumberRange/index.js +87 -69
  20. package/dist/components/Filter/FilterNumberRange/index.js.map +1 -1
  21. package/dist/components/Filter/FilterPopover/index.d.ts +2 -0
  22. package/dist/components/Filter/FilterPopover/index.js +22 -21
  23. package/dist/components/Filter/FilterPopover/index.js.map +1 -1
  24. package/dist/components/Filter/FilterSelect/index.d.ts +20 -2
  25. package/dist/components/Filter/FilterSelect/index.js +237 -194
  26. package/dist/components/Filter/FilterSelect/index.js.map +1 -1
  27. package/dist/components/Filter/FilterSelect/style.module.scss.js +16 -14
  28. package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -1
  29. package/dist/components/Filter/FilterTreeSelect/index.d.ts +18 -1
  30. package/dist/components/Filter/FilterTreeSelect/index.js +278 -218
  31. package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -1
  32. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js +15 -13
  33. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js.map +1 -1
  34. package/dist/components/Filter/FilterTrigger/index.d.ts +3 -0
  35. package/dist/components/Filter/FilterTrigger/index.js +59 -26
  36. package/dist/components/Filter/FilterTrigger/index.js.map +1 -1
  37. package/dist/components/Filter/FilterTrigger/style.module.scss.js +5 -4
  38. package/dist/components/Filter/FilterTrigger/style.module.scss.js.map +1 -1
  39. package/dist/components/Filter/index.d.ts +7 -3
  40. package/dist/components/Filter/types.d.ts +27 -1
  41. package/dist/components/Filter/types.js +24 -7
  42. package/dist/components/Filter/types.js.map +1 -1
  43. package/dist/components/Filter/useFilterState.d.ts +37 -5
  44. package/dist/components/Filter/useFilterState.js +74 -23
  45. package/dist/components/Filter/useFilterState.js.map +1 -1
  46. package/dist/components/Table/ColumnConfigPanel.d.ts +13 -0
  47. package/dist/components/Table/ColumnConfigPanel.js +260 -0
  48. package/dist/components/Table/ColumnConfigPanel.js.map +1 -0
  49. package/dist/components/Table/Table.d.ts +16 -2
  50. package/dist/components/Table/Table.js +106 -28
  51. package/dist/components/Table/Table.js.map +1 -1
  52. package/dist/components/Table/columnConfig.module.scss.js +38 -0
  53. package/dist/components/Table/columnConfig.module.scss.js.map +1 -0
  54. package/dist/components/Table/columnConfigTypes.d.ts +22 -0
  55. package/dist/components/Table/columnConfigUtils.d.ts +25 -0
  56. package/dist/components/Table/columnConfigUtils.js +141 -0
  57. package/dist/components/Table/columnConfigUtils.js.map +1 -0
  58. package/dist/components/Table/index.d.ts +2 -1
  59. package/dist/index.js +289 -276
  60. package/dist/index.js.map +1 -1
  61. package/dist/marsun-components-core.css +1 -1
  62. package/dist/styles/global.css +1 -1
  63. package/package.json +1 -1
@@ -1,36 +1,87 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- import { useContext as v, useState as f, useCallback as a, useMemo as x, createContext as R } from "react";
3
- const s = R(null);
4
- function C() {
5
- return v(s);
1
+ import { jsx as y } from "react/jsx-runtime";
2
+ import { useMemo as F, useEffect as R, useRef as V, useContext as C, useState as g, useCallback as b, createContext as D } from "react";
3
+ import { normalizeDependsOn as A, buildDepsKey as E, resolveFilterLabel as p } from "./types.js";
4
+ const K = D(null);
5
+ function O() {
6
+ return C(K);
6
7
  }
7
- function F() {
8
- const [o, n] = f({}), u = a((t, e) => {
9
- n((l) => {
10
- const r = l[t];
11
- return r && r.label === e.label && r.valueLabel === e.valueLabel && (r.removable ?? !0) === (e.removable ?? !0) && r.onRemove === e.onRemove ? l : { ...l, [t]: e };
8
+ function P(s) {
9
+ const r = O(), i = (r == null ? void 0 : r.values) ?? h, u = F(() => A(s), [s]), a = F(() => E(u, i), [u, i]);
10
+ return { values: i, depsKey: a, depKeys: u };
11
+ }
12
+ const h = {};
13
+ function z(s) {
14
+ const { filterKey: r, value: i, label: u, dependsOn: a, clearOnDepsChange: d = !0, onDepsClear: m } = s, o = O(), f = (o == null ? void 0 : o.values) ?? h, L = F(() => p(u, f), [u, f]), { depsKey: t } = P(a), e = o == null ? void 0 : o.setFieldValue, n = o == null ? void 0 : o.clearFieldValue;
15
+ R(() => {
16
+ if (!(!e || !n))
17
+ return e(r, i), () => n(r);
18
+ }, [r, i, e, n]);
19
+ const l = V(null), c = V(m);
20
+ return c.current = m, R(() => {
21
+ var v;
22
+ if (!(!a || A(a).length === 0)) {
23
+ if (l.current === null) {
24
+ l.current = t;
25
+ return;
26
+ }
27
+ l.current !== t && (l.current = t, d && ((v = c.current) == null || v.call(c)));
28
+ }
29
+ }, [t, a, d]), { resolvedLabel: L, values: f, depsKey: t };
30
+ }
31
+ function B() {
32
+ const [s, r] = g({}), [i, u] = g({}), a = b((t, e) => {
33
+ r((n) => {
34
+ const l = n[t];
35
+ return l && l.label === e.label && l.valueLabel === e.valueLabel && (l.removable ?? !0) === (e.removable ?? !0) && l.onRemove === e.onRemove ? n : { ...n, [t]: e };
36
+ });
37
+ }, []), d = b((t) => {
38
+ r((e) => {
39
+ if (!(t in e)) return e;
40
+ const n = { ...e };
41
+ return delete n[t], n;
42
+ });
43
+ }, []), m = b((t, e) => {
44
+ u((n) => {
45
+ if (Object.is(n[t], e)) return n;
46
+ if (Array.isArray(e) && Array.isArray(n[t])) {
47
+ const l = e, c = n[t];
48
+ if (l.length === c.length && l.every((v, j) => Object.is(v, c[j])))
49
+ return n;
50
+ }
51
+ return { ...n, [t]: e };
12
52
  });
13
- }, []), i = a((t) => {
14
- n((e) => {
53
+ }, []), o = b((t) => {
54
+ u((e) => {
15
55
  if (!(t in e)) return e;
16
- const l = { ...e };
17
- return delete l[t], l;
56
+ const n = { ...e };
57
+ return delete n[t], n;
18
58
  });
19
- }, []), c = a(() => {
20
- Object.values(o).forEach((t) => t.onRemove()), n({});
21
- }, [o]), b = x(() => Object.entries(o).filter(([, t]) => !!t.valueLabel).map(([t, e]) => ({
59
+ }, []), f = b(() => {
60
+ Object.values(s).forEach((t) => t.onRemove()), r({});
61
+ }, [s]), L = F(() => Object.entries(s).filter(([, t]) => !!t.valueLabel).map(([t, e]) => ({
22
62
  key: t,
23
63
  label: e.label,
24
64
  valueLabel: e.valueLabel,
25
65
  onRemove: e.onRemove,
26
66
  removable: e.removable ?? !0
27
- })), [o]);
28
- return { registrations: o, selectedItems: b, register: u, unregister: i, clearAll: c };
67
+ })), [s]);
68
+ return {
69
+ registrations: s,
70
+ selectedItems: L,
71
+ register: a,
72
+ unregister: d,
73
+ clearAll: f,
74
+ values: i,
75
+ setFieldValue: m,
76
+ clearFieldValue: o
77
+ };
29
78
  }
30
- const j = ({ children: o, ctx: n }) => /* @__PURE__ */ m(s.Provider, { value: n, children: o });
79
+ const I = ({ children: s, ctx: r }) => /* @__PURE__ */ y(K.Provider, { value: r, children: s });
31
80
  export {
32
- j as FilterProvider,
33
- C as useFilterRegister,
34
- F as useFilterState
81
+ I as FilterProvider,
82
+ P as useFilterDeps,
83
+ z as useFilterFieldBridge,
84
+ O as useFilterRegister,
85
+ B as useFilterState
35
86
  };
36
87
  //# sourceMappingURL=useFilterState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterState.js","sources":["../../../src/components/Filter/useFilterState.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { SelectedItem } from './types';\n\n/**\n * 筛选项注册信息\n */\ninterface FilterRegistration {\n /** 筛选项标签 */\n label: string;\n /** 当前值的展示文案(如 \"技术中心\" / \"审核员\"),为空则不显示该条目 */\n valueLabel: string;\n /** 移除回调 */\n onRemove: () => void;\n /** 是否允许移除标签,默认 true */\n removable?: boolean;\n}\n\n/** Context 类型 */\ninterface FilterContextValue {\n /** 注册筛选条件(有值时调用) */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销筛选条件(组件卸载或值清空时调用) */\n unregister: (key: string) => void;\n}\n\nconst FilterContext = createContext<FilterContextValue | null>(null);\n\n/** 供子组件使用 —— 在 CommonFilter 内部注册自身状态(不在 CommonFilter 内时安全返回 null) */\nexport function useFilterRegister(): FilterContextValue | null {\n return useContext(FilterContext);\n}\n\n// ──────────────────── Hook ────────────────────\n\ninterface UseFilterStateReturn {\n /** 所有已注册的筛选项 */\n registrations: Record<string, FilterRegistration>;\n /** 已选条目数组(过滤掉无 valueLabel 的项) */\n selectedItems: SelectedItem[];\n /** 注册方法 */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销方法 */\n unregister: (key: string) => void;\n /** 清空全部 */\n clearAll: () => void;\n}\n\n/**\n * 筛选状态管理 Hook\n *\n * 各 Filter 子组件通过 `register(key, { label, valueLabel, onRemove })` 注册,\n * CommonFilter 自动聚合成 `selectedItems` 展示。\n */\nexport function useFilterState(): UseFilterStateReturn {\n const [registrations, setRegistrations] = useState<Record<string, FilterRegistration>>({});\n\n const register = useCallback((key: string, reg: FilterRegistration) => {\n setRegistrations((prev) => {\n const existing = prev[key];\n if (\n existing &&\n existing.label === reg.label &&\n existing.valueLabel === reg.valueLabel &&\n (existing.removable ?? true) === (reg.removable ?? true) &&\n existing.onRemove === reg.onRemove\n ) {\n return prev;\n }\n return { ...prev, [key]: reg };\n });\n }, []);\n\n const unregister = useCallback((key: string) => {\n setRegistrations((prev) => {\n if (!(key in prev)) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n // 依次调用每项的 onRemove\n Object.values(registrations).forEach((r) => r.onRemove());\n setRegistrations({});\n }, [registrations]);\n\n const selectedItems = useMemo<SelectedItem[]>(() => {\n return Object.entries(registrations)\n .filter(([, r]) => !!r.valueLabel)\n .map(([key, r]) => ({\n key,\n label: r.label,\n valueLabel: r.valueLabel,\n onRemove: r.onRemove,\n removable: r.removable ?? true,\n }));\n }, [registrations]);\n\n return { registrations, selectedItems, register, unregister, clearAll };\n}\n\n// ──────────────────── Provider ────────────────────\n\ninterface FilterProviderProps {\n children: React.ReactNode;\n /** register / unregister 方法 */\n ctx: Pick<UseFilterStateReturn, 'register' | 'unregister'>;\n}\n\n/** 内部 Provider,将 register/unregister 注入给子组件 */\nexport const FilterProvider: React.FC<FilterProviderProps> = ({ children, ctx }) => (\n <FilterContext.Provider value={ctx}>{children}</FilterContext.Provider>\n);\n\nexport default useFilterState;\n"],"names":["FilterContext","createContext","useFilterRegister","useContext","useFilterState","registrations","setRegistrations","useState","register","useCallback","key","reg","prev","existing","unregister","next","clearAll","r","selectedItems","useMemo","FilterProvider","children","ctx","jsx"],"mappings":";;AAyBA,MAAMA,IAAgBC,EAAyC,IAAI;AAG5D,SAASC,IAA+C;AAC7D,SAAOC,EAAWH,CAAa;AACjC;AAuBO,SAASI,IAAuC;AACrD,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAA6C,CAAA,CAAE,GAEnFC,IAAWC,EAAY,CAACC,GAAaC,MAA4B;AACrE,IAAAL,EAAiB,CAACM,MAAS;AACzB,YAAMC,IAAWD,EAAKF,CAAG;AACzB,aACEG,KACAA,EAAS,UAAUF,EAAI,SACvBE,EAAS,eAAeF,EAAI,eAC3BE,EAAS,aAAa,SAAWF,EAAI,aAAa,OACnDE,EAAS,aAAaF,EAAI,WAEnBC,IAEF,EAAE,GAAGA,GAAM,CAACF,CAAG,GAAGC,EAAA;AAAA,IAC3B,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECG,IAAaL,EAAY,CAACC,MAAgB;AAC9C,IAAAJ,EAAiB,CAACM,MAAS;AACzB,UAAI,EAAEF,KAAOE,GAAO,QAAOA;AAC3B,YAAMG,IAAO,EAAE,GAAGH,EAAA;AAClB,oBAAOG,EAAKL,CAAG,GACRK;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,IAAWP,EAAY,MAAM;AAEjC,WAAO,OAAOJ,CAAa,EAAE,QAAQ,CAACY,MAAMA,EAAE,UAAU,GACxDX,EAAiB,CAAA,CAAE;AAAA,EACrB,GAAG,CAACD,CAAa,CAAC,GAEZa,IAAgBC,EAAwB,MACrC,OAAO,QAAQd,CAAa,EAChC,OAAO,CAAC,CAAA,EAAGY,CAAC,MAAM,CAAC,CAACA,EAAE,UAAU,EAChC,IAAI,CAAC,CAACP,GAAKO,CAAC,OAAO;AAAA,IAClB,KAAAP;AAAA,IACA,OAAOO,EAAE;AAAA,IACT,YAAYA,EAAE;AAAA,IACd,UAAUA,EAAE;AAAA,IACZ,WAAWA,EAAE,aAAa;AAAA,EAAA,EAC1B,GACH,CAACZ,CAAa,CAAC;AAElB,SAAO,EAAE,eAAAA,GAAe,eAAAa,GAAe,UAAAV,GAAU,YAAAM,GAAY,UAAAE,EAAA;AAC/D;AAWO,MAAMI,IAAgD,CAAC,EAAE,UAAAC,GAAU,KAAAC,QACxE,gBAAAC,EAACvB,EAAc,UAAd,EAAuB,OAAOsB,GAAM,UAAAD,EAAA,CAAS;"}
1
+ {"version":3,"file":"useFilterState.js","sources":["../../../src/components/Filter/useFilterState.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n buildDepsKey,\n normalizeDependsOn,\n resolveFilterLabel,\n type FilterLabel,\n type SelectedItem,\n} from './types';\n\n/**\n * 筛选项注册信息\n */\ninterface FilterRegistration {\n /** 筛选项标签 */\n label: string;\n /** 当前值的展示文案(如 \"技术中心\" / \"审核员\"),为空则不显示该条目 */\n valueLabel: string;\n /** 移除回调 */\n onRemove: () => void;\n /** 是否允许移除标签,默认 true */\n removable?: boolean;\n}\n\n/** Context 类型 */\nexport interface FilterContextValue {\n /** 注册筛选条件(有值时调用) */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销筛选条件(组件卸载或值清空时调用) */\n unregister: (key: string) => void;\n /** 各筛选项原始值(供 dependsOn / 动态 label / loadData) */\n values: Record<string, unknown>;\n /** 上报本项原始值 */\n setFieldValue: (key: string, value: unknown) => void;\n /** 清除本项原始值(卸载 / 隐藏) */\n clearFieldValue: (key: string) => void;\n}\n\nconst FilterContext = createContext<FilterContextValue | null>(null);\n\n/** 供子组件使用 —— 在 CommonFilter 内部注册自身状态(不在 CommonFilter 内时安全返回 null) */\nexport function useFilterRegister(): FilterContextValue | null {\n return useContext(FilterContext);\n}\n\n/** 读取依赖筛选项当前值与稳定 depsKey */\nexport function useFilterDeps(dependsOn?: string | string[]): {\n values: Record<string, unknown>;\n depsKey: string;\n depKeys: string[];\n} {\n const ctx = useFilterRegister();\n const values = ctx?.values ?? EMPTY_VALUES;\n const depKeys = useMemo(() => normalizeDependsOn(dependsOn), [dependsOn]);\n const depsKey = useMemo(() => buildDepsKey(depKeys, values), [depKeys, values]);\n return { values, depsKey, depKeys };\n}\n\nconst EMPTY_VALUES: Record<string, unknown> = {};\n\n/**\n * 字段桥接:上报 value、解析动态 label、依赖变化时清空。\n */\nexport function useFilterFieldBridge(opts: {\n filterKey: string;\n value: unknown;\n label: FilterLabel;\n dependsOn?: string | string[];\n clearOnDepsChange?: boolean;\n /** 依赖变化时调用(应清空受控 value) */\n onDepsClear?: () => void;\n}): {\n resolvedLabel: string;\n values: Record<string, unknown>;\n depsKey: string;\n} {\n const { filterKey, value, label, dependsOn, clearOnDepsChange = true, onDepsClear } = opts;\n const ctx = useFilterRegister();\n const values = ctx?.values ?? EMPTY_VALUES;\n const resolvedLabel = useMemo(() => resolveFilterLabel(label, values), [label, values]);\n const { depsKey } = useFilterDeps(dependsOn);\n\n const setFieldValue = ctx?.setFieldValue;\n const clearFieldValue = ctx?.clearFieldValue;\n\n useEffect(() => {\n if (!setFieldValue || !clearFieldValue) return;\n setFieldValue(filterKey, value);\n return () => clearFieldValue(filterKey);\n }, [filterKey, value, setFieldValue, clearFieldValue]);\n\n const prevDepsKeyRef = useRef<string | null>(null);\n const onDepsClearRef = useRef(onDepsClear);\n onDepsClearRef.current = onDepsClear;\n\n useEffect(() => {\n if (!dependsOn || normalizeDependsOn(dependsOn).length === 0) return;\n if (prevDepsKeyRef.current === null) {\n prevDepsKeyRef.current = depsKey;\n return;\n }\n if (prevDepsKeyRef.current === depsKey) return;\n prevDepsKeyRef.current = depsKey;\n if (clearOnDepsChange) {\n onDepsClearRef.current?.();\n }\n }, [depsKey, dependsOn, clearOnDepsChange]);\n\n return { resolvedLabel, values, depsKey };\n}\n\n// ──────────────────── Hook ────────────────────\n\ninterface UseFilterStateReturn {\n /** 所有已注册的筛选项 */\n registrations: Record<string, FilterRegistration>;\n /** 已选条目数组(过滤掉无 valueLabel 的项) */\n selectedItems: SelectedItem[];\n /** 注册方法 */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销方法 */\n unregister: (key: string) => void;\n /** 清空全部 */\n clearAll: () => void;\n /** 字段原始值 */\n values: Record<string, unknown>;\n setFieldValue: (key: string, value: unknown) => void;\n clearFieldValue: (key: string) => void;\n}\n\n/**\n * 筛选状态管理 Hook\n *\n * 各 Filter 子组件通过 `register(key, { label, valueLabel, onRemove })` 注册,\n * CommonFilter 自动聚合成 `selectedItems` 展示。\n * 同时维护 `values` 供声明式 dependsOn / 动态 label / loadData。\n */\nexport function useFilterState(): UseFilterStateReturn {\n const [registrations, setRegistrations] = useState<Record<string, FilterRegistration>>({});\n const [values, setValues] = useState<Record<string, unknown>>({});\n\n const register = useCallback((key: string, reg: FilterRegistration) => {\n setRegistrations((prev) => {\n const existing = prev[key];\n if (\n existing &&\n existing.label === reg.label &&\n existing.valueLabel === reg.valueLabel &&\n (existing.removable ?? true) === (reg.removable ?? true) &&\n existing.onRemove === reg.onRemove\n ) {\n return prev;\n }\n return { ...prev, [key]: reg };\n });\n }, []);\n\n const unregister = useCallback((key: string) => {\n setRegistrations((prev) => {\n if (!(key in prev)) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n }, []);\n\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValues((prev) => {\n if (Object.is(prev[key], value)) return prev;\n // 浅比较数组:同内容不触发更新\n if (Array.isArray(value) && Array.isArray(prev[key])) {\n const a = value as unknown[];\n const b = prev[key] as unknown[];\n if (a.length === b.length && a.every((v, i) => Object.is(v, b[i]))) {\n return prev;\n }\n }\n return { ...prev, [key]: value };\n });\n }, []);\n\n const clearFieldValue = useCallback((key: string) => {\n setValues((prev) => {\n if (!(key in prev)) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n Object.values(registrations).forEach((r) => r.onRemove());\n setRegistrations({});\n }, [registrations]);\n\n const selectedItems = useMemo<SelectedItem[]>(() => {\n return Object.entries(registrations)\n .filter(([, r]) => !!r.valueLabel)\n .map(([key, r]) => ({\n key,\n label: r.label,\n valueLabel: r.valueLabel,\n onRemove: r.onRemove,\n removable: r.removable ?? true,\n }));\n }, [registrations]);\n\n return {\n registrations,\n selectedItems,\n register,\n unregister,\n clearAll,\n values,\n setFieldValue,\n clearFieldValue,\n };\n}\n\n// ──────────────────── Provider ────────────────────\n\ninterface FilterProviderProps {\n children: React.ReactNode;\n ctx: Pick<\n UseFilterStateReturn,\n 'register' | 'unregister' | 'values' | 'setFieldValue' | 'clearFieldValue'\n >;\n}\n\n/** 内部 Provider,将 register/unregister/values 注入给子组件 */\nexport const FilterProvider: React.FC<FilterProviderProps> = ({ children, ctx }) => (\n <FilterContext.Provider value={ctx}>{children}</FilterContext.Provider>\n);\n\nexport default useFilterState;\n"],"names":["FilterContext","createContext","useFilterRegister","useContext","useFilterDeps","dependsOn","ctx","values","EMPTY_VALUES","depKeys","useMemo","normalizeDependsOn","depsKey","buildDepsKey","useFilterFieldBridge","opts","filterKey","value","label","clearOnDepsChange","onDepsClear","resolvedLabel","resolveFilterLabel","setFieldValue","clearFieldValue","useEffect","prevDepsKeyRef","useRef","onDepsClearRef","_a","useFilterState","registrations","setRegistrations","useState","setValues","register","useCallback","key","reg","prev","existing","unregister","next","a","b","i","clearAll","r","selectedItems","FilterProvider","children","jsx"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { ColumnConfigPanelItem, TableColumnConfigItem } from './columnConfigTypes';
3
+ type ColumnConfigPanelProps = {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ defaultItems: ColumnConfigPanelItem[];
7
+ savedConfig: TableColumnConfigItem[] | null;
8
+ onConfirm: (items: TableColumnConfigItem[]) => void | Promise<void>;
9
+ children: ReactNode;
10
+ };
11
+ export declare const ColumnConfigPopover: FC<ColumnConfigPanelProps>;
12
+ export declare function ColumnConfigTrigger({ open, onOpenChange, defaultItems, savedConfig, onConfirm, }: Omit<ColumnConfigPanelProps, 'children'>): import("react").JSX.Element;
13
+ export {};
@@ -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":"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"}
@@ -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