@hkyhy/marsun-components-core 0.1.30 → 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 (42) hide show
  1. package/dist/components/Filter/FilterCascader/index.d.ts +40 -0
  2. package/dist/components/Filter/FilterCascader/index.js +318 -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,40 @@
1
+ import { DefaultOptionType } from 'antd/es/cascader';
2
+ import { default as React } from 'react';
3
+ import { TreeFilterNode } from '../FilterTreeSelect';
4
+ import { BaseFilterProps, FilterLoadDataContext } from '../types';
5
+ export type { TreeFilterNode };
6
+ export type CascaderPath = string[];
7
+ export interface FilterCascaderProps extends BaseFilterProps {
8
+ /** 树数据(与 FilterTreeSelect 同构);优先于 loadData */
9
+ treeData?: TreeFilterNode[];
10
+ /** 已转换的 Cascader options;与 treeData 二选一(同时存在以 options 为准) */
11
+ options?: DefaultOptionType[];
12
+ loadData?: (ctx: FilterLoadDataContext) => Promise<TreeFilterNode[]>;
13
+ enabled?: boolean;
14
+ /** leafOnly 时为叶子 id;多选为叶子 id 数组 */
15
+ value?: string | string[] | undefined;
16
+ onChange?: (value: string | string[] | undefined) => void;
17
+ /** 完整路径变更(单选 string[];多选 string[][]) */
18
+ onChangePath?: (paths: CascaderPath | CascaderPath[] | undefined) => void;
19
+ showSearch?: boolean;
20
+ multiple?: boolean;
21
+ /**
22
+ * 仅叶子写入最终值(默认 true)。
23
+ * Cascader changeOnSelect=false,父级不可单独作为已选值。
24
+ */
25
+ leafOnly?: boolean;
26
+ getNodeLabel?: (node: TreeFilterNode) => string;
27
+ panelExtra?: React.ReactNode;
28
+ panelWidth?: number;
29
+ loading?: boolean;
30
+ }
31
+ type CascaderOption = DefaultOptionType & {
32
+ value: string;
33
+ label: React.ReactNode;
34
+ children?: CascaderOption[];
35
+ isLeaf?: boolean;
36
+ };
37
+ /** TreeFilterNode → antd Cascader options */
38
+ export declare function treeToCascaderOptions(nodes: TreeFilterNode[] | undefined, getLabel?: (n: TreeFilterNode) => string): CascaderOption[];
39
+ declare const FilterCascader: React.FC<FilterCascaderProps>;
40
+ export default FilterCascader;
@@ -0,0 +1,318 @@
1
+ import { jsx as u, jsxs as Z } from "react/jsx-runtime";
2
+ import { Input as br, Spin as yr, Cascader as K, Space as Ar } from "antd";
3
+ import h from "classnames";
4
+ import { useRef as $, useState as F, useEffect as q, useMemo as L, useCallback as O } from "react";
5
+ import Lr from "../FilterPopover/index.js";
6
+ import { resolveFilterVisible as C } from "../types.js";
7
+ import { useFilterFieldBridge as pr, useFilterRegister as wr } from "../useFilterState.js";
8
+ import v from "./style.module.scss.js";
9
+ import Mr from "../../Empty/Empty.js";
10
+ const { Search: Nr } = br;
11
+ function rr(r, i = (c) => c.name) {
12
+ return r != null && r.length ? r.map((c) => {
13
+ var l;
14
+ const t = (l = c.children) != null && l.length ? rr(c.children, i) : void 0;
15
+ return {
16
+ value: c.id,
17
+ label: i(c),
18
+ children: t,
19
+ isLeaf: !(t != null && t.length)
20
+ };
21
+ }) : [];
22
+ }
23
+ function Fr(r, i) {
24
+ if (!i.trim()) return r;
25
+ const c = i.toLowerCase(), t = (l) => {
26
+ var n;
27
+ const s = [];
28
+ for (const e of l) {
29
+ const a = typeof e.label == "string" || typeof e.label == "number" ? String(e.label) : String(e.value), f = (n = e.children) != null && n.length ? t(e.children) : [];
30
+ (a.toLowerCase().includes(c) || f.length > 0) && s.push({
31
+ ...e,
32
+ children: f.length > 0 ? f : void 0,
33
+ isLeaf: !(f.length > 0)
34
+ });
35
+ }
36
+ return s;
37
+ };
38
+ return t(r);
39
+ }
40
+ function Vr(r) {
41
+ const i = /* @__PURE__ */ new Map(), c = (t, l) => {
42
+ var s;
43
+ for (const n of t) {
44
+ const e = [...l, String(n.value)];
45
+ (s = n.children) != null && s.length ? c(n.children, e) : i.set(String(n.value), e);
46
+ }
47
+ };
48
+ return c(r, []), i;
49
+ }
50
+ function Tr(r, i) {
51
+ let c = r, t = null;
52
+ for (const l of i) {
53
+ if (t = c.find((s) => String(s.value) === String(l)) ?? null, !t) return null;
54
+ c = t.children ?? [];
55
+ }
56
+ return t;
57
+ }
58
+ function er(r) {
59
+ var i;
60
+ return (i = r.children) != null && i.length ? r.children.flatMap(er) : [String(r.value)];
61
+ }
62
+ function P(r, i, c, t) {
63
+ const l = [], s = /* @__PURE__ */ new Set(), n = (e) => {
64
+ !e || s.has(e) || (s.add(e), l.push(e));
65
+ };
66
+ for (const e of r) {
67
+ if (!(e != null && e.length)) continue;
68
+ const a = String(e[e.length - 1]);
69
+ if (c.has(a)) {
70
+ n(a);
71
+ continue;
72
+ }
73
+ if (!t) {
74
+ n(a);
75
+ continue;
76
+ }
77
+ const f = Tr(i, e.map(String));
78
+ f && er(f).forEach(n);
79
+ }
80
+ return l;
81
+ }
82
+ function kr(r) {
83
+ const i = /* @__PURE__ */ new Map(), c = (t) => {
84
+ var l;
85
+ for (const s of t) {
86
+ const n = typeof s.label == "string" || typeof s.label == "number" ? String(s.label) : String(s.value);
87
+ i.set(String(s.value), n), (l = s.children) != null && l.length && c(s.children);
88
+ }
89
+ };
90
+ return c(r), i;
91
+ }
92
+ function zr(r, i, c) {
93
+ if (r == null || r === "") return c ? [] : void 0;
94
+ if (c)
95
+ return (Array.isArray(r) ? r : [r]).map((s) => i.get(String(s)) || [String(s)]).filter((s) => s.length);
96
+ const t = Array.isArray(r) ? r[0] : r;
97
+ if (!(t == null || t === ""))
98
+ return i.get(String(t)) || [String(t)];
99
+ }
100
+ function Ir(r, i, c, t, l) {
101
+ if (r == null || Array.isArray(r) && r.length === 0)
102
+ return i ? [] : void 0;
103
+ if (i) {
104
+ const e = r.filter((a) => Array.isArray(a) && a.length);
105
+ return P(
106
+ e.map((a) => a.map(String)),
107
+ t,
108
+ l,
109
+ c
110
+ );
111
+ }
112
+ const s = r.map(String);
113
+ if (!s.length) return;
114
+ const n = P([s], t, l, c);
115
+ if (!(c && n.length === 0))
116
+ return n[0];
117
+ }
118
+ const qr = ({
119
+ filterKey: r,
120
+ label: i,
121
+ treeData: c,
122
+ options: t,
123
+ loadData: l,
124
+ enabled: s = !0,
125
+ value: n,
126
+ onChange: e,
127
+ onChangePath: a,
128
+ showSearch: f = !1,
129
+ multiple: o = !1,
130
+ leafOnly: V = !0,
131
+ active: tr,
132
+ hidden: I,
133
+ display: R,
134
+ dependsOn: nr,
135
+ clearOnDepsChange: cr = !0,
136
+ getNodeLabel: D = (S) => S.name,
137
+ panelExtra: j,
138
+ panelWidth: sr,
139
+ loading: ir = !1
140
+ }) => {
141
+ const S = $(e);
142
+ S.current = e;
143
+ const T = $(a);
144
+ T.current = a;
145
+ const lr = sr ?? (j ? 520 : 440), { resolvedLabel: p, values: ar, depsKey: or } = pr({
146
+ filterKey: r,
147
+ value: n,
148
+ label: i,
149
+ dependsOn: nr,
150
+ clearOnDepsChange: cr,
151
+ onDepsClear: () => {
152
+ var d, g;
153
+ (d = S.current) == null || d.call(S, o ? [] : void 0), (g = T.current) == null || g.call(T, void 0);
154
+ }
155
+ }), [G, J] = F([]), [dr, Q] = F(!1), x = $(l);
156
+ x.current = l, q(() => {
157
+ if (!x.current || c != null || t != null || !s) return;
158
+ let d = !1;
159
+ return Q(!0), (async () => {
160
+ try {
161
+ const g = await x.current({ values: ar });
162
+ d || J(g ?? []);
163
+ } catch {
164
+ d || J([]);
165
+ } finally {
166
+ d || Q(!1);
167
+ }
168
+ })(), () => {
169
+ d = !0;
170
+ };
171
+ }, [or, s, c, t, l]);
172
+ const m = L(() => t != null && t.length ? t : rr(c ?? (l ? G : []), D), [t, c, l, G, D]), U = ir || dr, b = L(() => Vr(m), [m]), B = L(() => kr(m), [m]), [fr, ur] = F(!1), [k, H] = F(""), [w, X] = F(
173
+ n ?? (o ? [] : void 0)
174
+ );
175
+ q(() => {
176
+ X(n ?? (o ? [] : void 0)), n == null && H("");
177
+ }, [n, o]);
178
+ const W = L(() => {
179
+ if (n == null) return "";
180
+ if (o) {
181
+ const d = n;
182
+ return d.length > 0 ? d.map((g) => B.get(g) ?? g).join("、") : "";
183
+ }
184
+ return B.get(n) ?? "";
185
+ }, [n, o, B]), M = wr(), E = { filterKey: r, label: p, value: n };
186
+ q(() => {
187
+ if (M) {
188
+ if (!C({ display: R, hidden: I }, E)) {
189
+ M.unregister(r);
190
+ return;
191
+ }
192
+ W ? M.register(r, {
193
+ label: p,
194
+ valueLabel: W,
195
+ onRemove: () => {
196
+ e == null || e(o ? [] : void 0), a == null || a(void 0);
197
+ }
198
+ }) : M.unregister(r);
199
+ }
200
+ }, [
201
+ W,
202
+ r,
203
+ p,
204
+ R,
205
+ I,
206
+ M,
207
+ e,
208
+ a,
209
+ o,
210
+ E
211
+ ]);
212
+ const Y = L(
213
+ () => f && k ? Fr(m, k) : m,
214
+ [f, k, m]
215
+ ), gr = L(
216
+ () => zr(w, b, o),
217
+ [w, b, o]
218
+ ), z = O(
219
+ (d, g) => {
220
+ X(d), e == null || e(d), a == null || a(g);
221
+ },
222
+ [e, a]
223
+ ), mr = O(
224
+ (d) => {
225
+ const y = Ir(
226
+ d,
227
+ o,
228
+ V,
229
+ m,
230
+ b
231
+ );
232
+ if (o) {
233
+ const A = Array.isArray(y) ? y : y ? [y] : [], _ = A.map((N) => b.get(String(N))).filter((N) => !!(N != null && N.length));
234
+ z(A, _);
235
+ } else {
236
+ const A = typeof y == "string" ? y : void 0, _ = A ? b.get(A) : void 0;
237
+ z(A, _);
238
+ }
239
+ },
240
+ [o, V, m, b, z]
241
+ ), vr = () => {
242
+ }, hr = () => {
243
+ z(o ? [] : void 0, void 0), H("");
244
+ }, Sr = tr ?? (o ? Array.isArray(n) && n.length > 0 : n != null && n !== "");
245
+ return C({ display: R, hidden: I }, E) ? /* @__PURE__ */ u(
246
+ Lr,
247
+ {
248
+ label: p,
249
+ active: Sr,
250
+ loading: U,
251
+ width: lr,
252
+ open: fr,
253
+ onOpenChange: ur,
254
+ onConfirm: vr,
255
+ onReset: hr,
256
+ children: /* @__PURE__ */ Z("div", { className: h("filter-cascader-root", v["filter-cascader-root"]), children: [
257
+ j ? /* @__PURE__ */ u(
258
+ "div",
259
+ {
260
+ className: h(
261
+ "filter-cascader-panel-extra",
262
+ v["filter-cascader-panel-extra"]
263
+ ),
264
+ children: j
265
+ }
266
+ ) : null,
267
+ f ? /* @__PURE__ */ u("div", { className: h("filter-cascader-search", v["filter-cascader-search"]), children: /* @__PURE__ */ u(
268
+ Nr,
269
+ {
270
+ placeholder: `搜索${p}`,
271
+ allowClear: !0,
272
+ value: k,
273
+ onChange: (d) => H(d.target.value)
274
+ }
275
+ ) }) : null,
276
+ U ? /* @__PURE__ */ u("div", { className: h("filter-cascader-loading", v["filter-cascader-loading"]), children: /* @__PURE__ */ u(yr, { size: "small" }) }) : Y.length === 0 ? /* @__PURE__ */ u(Mr, { iconType: "simple", description: "暂无选项" }) : /* @__PURE__ */ u(
277
+ "div",
278
+ {
279
+ className: h(
280
+ "filter-cascader-panel-wrap",
281
+ v["filter-cascader-panel-wrap"]
282
+ ),
283
+ children: /* @__PURE__ */ u(
284
+ K.Panel,
285
+ {
286
+ className: h("filter-cascader-panel", v["filter-cascader-panel"]),
287
+ options: Y,
288
+ value: gr,
289
+ onChange: mr,
290
+ multiple: o,
291
+ changeOnSelect: !V,
292
+ ...o && V ? { showCheckedStrategy: K.SHOW_CHILD } : {}
293
+ }
294
+ )
295
+ }
296
+ ),
297
+ o && Array.isArray(w) && w.length > 0 ? /* @__PURE__ */ u(
298
+ "div",
299
+ {
300
+ className: h(
301
+ "filter-cascader-selected-bar",
302
+ v["filter-cascader-selected-bar"]
303
+ ),
304
+ children: /* @__PURE__ */ u(Ar, { size: [4, 4], wrap: !0, children: /* @__PURE__ */ Z("span", { className: v["filter-cascader-selected-count"], children: [
305
+ "已选 ",
306
+ w.length
307
+ ] }) })
308
+ }
309
+ ) : null
310
+ ] })
311
+ }
312
+ ) : null;
313
+ };
314
+ export {
315
+ qr as default,
316
+ rr as treeToCascaderOptions
317
+ };
318
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterCascader/index.tsx"],"sourcesContent":["import { Empty } from '@/components/Empty';\nimport { Cascader, Input, Space, Spin } from 'antd';\nimport type { DefaultOptionType } from 'antd/es/cascader';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { TreeFilterNode } from '../FilterTreeSelect';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps, FilterLoadDataContext } from '../types';\nimport { resolveFilterVisible } from '../types';\nimport { useFilterFieldBridge, useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\n\nconst { Search } = Input;\n\nexport type { TreeFilterNode };\n\nexport type CascaderPath = string[];\n\nexport interface FilterCascaderProps extends BaseFilterProps {\n /** 树数据(与 FilterTreeSelect 同构);优先于 loadData */\n treeData?: TreeFilterNode[];\n /** 已转换的 Cascader options;与 treeData 二选一(同时存在以 options 为准) */\n options?: DefaultOptionType[];\n loadData?: (ctx: FilterLoadDataContext) => Promise<TreeFilterNode[]>;\n enabled?: boolean;\n /** leafOnly 时为叶子 id;多选为叶子 id 数组 */\n value?: string | string[] | undefined;\n onChange?: (value: string | string[] | undefined) => void;\n /** 完整路径变更(单选 string[];多选 string[][]) */\n onChangePath?: (paths: CascaderPath | CascaderPath[] | undefined) => void;\n showSearch?: boolean;\n multiple?: boolean;\n /**\n * 仅叶子写入最终值(默认 true)。\n * Cascader changeOnSelect=false,父级不可单独作为已选值。\n */\n leafOnly?: boolean;\n getNodeLabel?: (node: TreeFilterNode) => string;\n panelExtra?: React.ReactNode;\n panelWidth?: number;\n loading?: boolean;\n}\n\ntype CascaderOption = DefaultOptionType & {\n value: string;\n label: React.ReactNode;\n children?: CascaderOption[];\n isLeaf?: boolean;\n};\n\n/** TreeFilterNode → antd Cascader options */\nexport function treeToCascaderOptions(\n nodes: TreeFilterNode[] | undefined,\n getLabel: (n: TreeFilterNode) => string = (n) => n.name,\n): CascaderOption[] {\n if (!nodes?.length) return [];\n return nodes.map((n) => {\n const children = n.children?.length ? treeToCascaderOptions(n.children, getLabel) : undefined;\n return {\n value: n.id,\n label: getLabel(n),\n children,\n isLeaf: !children?.length,\n };\n });\n}\n\nfunction filterOptionsByKeyword(options: CascaderOption[], keyword: string): CascaderOption[] {\n if (!keyword.trim()) return options;\n const lower = keyword.toLowerCase();\n const walk = (opts: CascaderOption[]): CascaderOption[] => {\n const result: CascaderOption[] = [];\n for (const opt of opts) {\n const label =\n typeof opt.label === 'string' || typeof opt.label === 'number'\n ? String(opt.label)\n : String(opt.value);\n const children = opt.children?.length ? walk(opt.children) : [];\n const selfMatch = label.toLowerCase().includes(lower);\n if (selfMatch || children.length > 0) {\n result.push({\n ...opt,\n children: children.length > 0 ? children : undefined,\n isLeaf: !(children.length > 0),\n });\n }\n }\n return result;\n };\n return walk(options);\n}\n\nfunction buildLeafPathMap(options: CascaderOption[]): Map<string, CascaderPath> {\n const map = new Map<string, CascaderPath>();\n const walk = (opts: CascaderOption[], prefix: CascaderPath) => {\n for (const opt of opts) {\n const path = [...prefix, String(opt.value)];\n if (opt.children?.length) {\n walk(opt.children, path);\n } else {\n map.set(String(opt.value), path);\n }\n }\n };\n walk(options, []);\n return map;\n}\n\nfunction findCascaderNode(options: CascaderOption[], path: CascaderPath): CascaderOption | null {\n let nodes = options;\n let found: CascaderOption | null = null;\n for (const id of path) {\n found = nodes.find((n) => String(n.value) === String(id)) ?? null;\n if (!found) return null;\n nodes = found.children ?? [];\n }\n return found;\n}\n\nfunction collectDescendantLeafIds(node: CascaderOption): string[] {\n if (!node.children?.length) return [String(node.value)];\n return node.children.flatMap(collectDescendantLeafIds);\n}\n\n/** leafOnly:多选路径可能因 SHOW_PARENT 塌成父级,展开为叶子 id */\nfunction pathsToLeafIds(\n paths: CascaderPath[],\n options: CascaderOption[],\n leafPathMap: Map<string, CascaderPath>,\n leafOnly: boolean,\n): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n const push = (id: string) => {\n if (!id || seen.has(id)) return;\n seen.add(id);\n out.push(id);\n };\n\n for (const path of paths) {\n if (!path?.length) continue;\n const last = String(path[path.length - 1]);\n if (leafPathMap.has(last)) {\n push(last);\n continue;\n }\n if (!leafOnly) {\n push(last);\n continue;\n }\n const node = findCascaderNode(options, path.map(String));\n if (node) {\n collectDescendantLeafIds(node).forEach(push);\n }\n }\n return out;\n}\n\nfunction buildLabelMapFromOptions(options: CascaderOption[]): Map<string, string> {\n const map = new Map<string, string>();\n const walk = (opts: CascaderOption[]) => {\n for (const opt of opts) {\n const label =\n typeof opt.label === 'string' || typeof opt.label === 'number'\n ? String(opt.label)\n : String(opt.value);\n map.set(String(opt.value), label);\n if (opt.children?.length) walk(opt.children);\n }\n };\n walk(options);\n return map;\n}\n\nfunction leafToCascaderValue(\n leaf: string | string[] | undefined,\n leafPathMap: Map<string, CascaderPath>,\n multiple: boolean,\n): CascaderPath | CascaderPath[] | undefined {\n if (leaf == null || leaf === '') return multiple ? [] : undefined;\n if (multiple) {\n const arr = Array.isArray(leaf) ? leaf : [leaf];\n return arr.map((id) => leafPathMap.get(String(id)) || [String(id)]).filter((p) => p.length);\n }\n const id = Array.isArray(leaf) ? leaf[0] : leaf;\n if (id == null || id === '') return undefined;\n return leafPathMap.get(String(id)) || [String(id)];\n}\n\nfunction cascaderValueToLeaf(\n next: CascaderPath | CascaderPath[] | null,\n multiple: boolean,\n leafOnly: boolean,\n options: CascaderOption[],\n leafPathMap: Map<string, CascaderPath>,\n): string | string[] | undefined {\n if (next == null || (Array.isArray(next) && next.length === 0)) {\n return multiple ? [] : undefined;\n }\n if (multiple) {\n const paths = (next as CascaderPath[]).filter((p) => Array.isArray(p) && p.length);\n return pathsToLeafIds(\n paths.map((p) => p.map(String)),\n options,\n leafPathMap,\n leafOnly,\n );\n }\n const path = (next as CascaderPath).map(String);\n if (!path.length) return undefined;\n const leaves = pathsToLeafIds([path], options, leafPathMap, leafOnly);\n if (leafOnly && leaves.length === 0) return undefined;\n return leaves[0];\n}\n\nconst FilterCascader: React.FC<FilterCascaderProps> = ({\n filterKey,\n label,\n treeData: propsTreeData,\n options: propsOptions,\n loadData,\n enabled = true,\n value,\n onChange,\n onChangePath,\n showSearch = false,\n multiple = false,\n leafOnly = true,\n active,\n hidden,\n display,\n dependsOn,\n clearOnDepsChange = true,\n getNodeLabel = (n) => n.name,\n panelExtra,\n panelWidth,\n loading: loadingProp = false,\n}) => {\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const onChangePathRef = useRef(onChangePath);\n onChangePathRef.current = onChangePath;\n\n // 两列路径:分厂列 + 品种长文案列,默认略宽;有 panelExtra 再加一点\n const resolvedPanelWidth = panelWidth ?? (panelExtra ? 520 : 440);\n\n const { resolvedLabel, values, depsKey } = useFilterFieldBridge({\n filterKey,\n value,\n label,\n dependsOn,\n clearOnDepsChange,\n onDepsClear: () => {\n onChangeRef.current?.(multiple ? [] : undefined);\n onChangePathRef.current?.(undefined);\n },\n });\n\n const [loadedTree, setLoadedTree] = useState<TreeFilterNode[]>([]);\n const [loadDataLoading, setLoadDataLoading] = useState(false);\n const loadDataRef = useRef(loadData);\n loadDataRef.current = loadData;\n\n useEffect(() => {\n if (!loadDataRef.current || propsTreeData != null || propsOptions != null || !enabled) return;\n let cancelled = false;\n setLoadDataLoading(true);\n (async () => {\n try {\n const next = await loadDataRef.current!({ values });\n if (!cancelled) setLoadedTree(next ?? []);\n } catch {\n if (!cancelled) setLoadedTree([]);\n } finally {\n if (!cancelled) setLoadDataLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [depsKey, enabled, propsTreeData, propsOptions, loadData]);\n\n const cascaderOptions = useMemo(() => {\n if (propsOptions?.length) return propsOptions as CascaderOption[];\n const tree = propsTreeData ?? (loadData ? loadedTree : []);\n return treeToCascaderOptions(tree, getNodeLabel);\n }, [propsOptions, propsTreeData, loadData, loadedTree, getNodeLabel]);\n\n const optionsLoading = loadingProp || loadDataLoading;\n const leafPathMap = useMemo(() => buildLeafPathMap(cascaderOptions), [cascaderOptions]);\n const labelMap = useMemo(() => buildLabelMapFromOptions(cascaderOptions), [cascaderOptions]);\n\n const [open, setOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const [localValue, setLocalValue] = useState<string | string[] | undefined>(\n value ?? (multiple ? [] : undefined),\n );\n\n useEffect(() => {\n setLocalValue(value ?? (multiple ? [] : undefined));\n if (value === undefined || value === null) setSearchText('');\n }, [value, multiple]);\n\n const confirmedValueLabel = useMemo(() => {\n if (value == null) return '';\n if (multiple) {\n const arr = value as string[];\n return arr.length > 0 ? arr.map((v) => labelMap.get(v) ?? v).join('、') : '';\n }\n return labelMap.get(value as string) ?? '';\n }, [value, multiple, labelMap]);\n\n const registerFn = useFilterRegister();\n const visibilityCtx = { filterKey, label: resolvedLabel, value };\n\n useEffect(() => {\n if (!registerFn) return;\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (confirmedValueLabel) {\n registerFn.register(filterKey, {\n label: resolvedLabel,\n valueLabel: confirmedValueLabel,\n onRemove: () => {\n onChange?.(multiple ? [] : undefined);\n onChangePath?.(undefined);\n },\n });\n } else {\n registerFn.unregister(filterKey);\n }\n }, [\n confirmedValueLabel,\n filterKey,\n resolvedLabel,\n display,\n hidden,\n registerFn,\n onChange,\n onChangePath,\n multiple,\n visibilityCtx,\n ]);\n\n const displayOptions = useMemo(\n () =>\n showSearch && searchText\n ? filterOptionsByKeyword(cascaderOptions, searchText)\n : cascaderOptions,\n [showSearch, searchText, cascaderOptions],\n );\n\n const cascaderValue = useMemo(\n () => leafToCascaderValue(localValue, leafPathMap, multiple),\n [localValue, leafPathMap, multiple],\n );\n\n const emitChange = useCallback(\n (nextLeaf: string | string[] | undefined, paths: CascaderPath | CascaderPath[] | undefined) => {\n setLocalValue(nextLeaf);\n onChange?.(nextLeaf);\n onChangePath?.(paths);\n },\n [onChange, onChangePath],\n );\n\n const handleCascaderChange = useCallback(\n (next: (string | number | null)[] | (string | number | null)[][] | null) => {\n const normalized = next as CascaderPath | CascaderPath[] | null;\n const leaf = cascaderValueToLeaf(\n normalized,\n multiple,\n leafOnly,\n cascaderOptions,\n leafPathMap,\n );\n if (multiple) {\n const leafArr = Array.isArray(leaf) ? leaf : leaf ? [leaf] : [];\n const paths = leafArr\n .map((id) => leafPathMap.get(String(id)))\n .filter((p): p is CascaderPath => !!p?.length);\n emitChange(leafArr, paths);\n } else {\n const id = typeof leaf === 'string' ? leaf : undefined;\n const path = id ? leafPathMap.get(id) : undefined;\n emitChange(id, path);\n }\n },\n [multiple, leafOnly, cascaderOptions, leafPathMap, emitChange],\n );\n\n const handleConfirm = () => {\n // 即时 onChange;确认仅关面板\n };\n\n const handleReset = () => {\n emitChange(multiple ? [] : undefined, undefined);\n setSearchText('');\n };\n\n const isActive =\n active ?? (multiple ? Array.isArray(value) && value.length > 0 : value != null && value !== '');\n\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) {\n return null;\n }\n\n return (\n <FilterPopover\n label={resolvedLabel}\n active={isActive}\n loading={optionsLoading}\n width={resolvedPanelWidth}\n open={open}\n onOpenChange={setOpen}\n onConfirm={handleConfirm}\n onReset={handleReset}\n >\n <div className={classNames('filter-cascader-root', styles['filter-cascader-root'])}>\n {panelExtra ? (\n <div\n className={classNames(\n 'filter-cascader-panel-extra',\n styles['filter-cascader-panel-extra'],\n )}\n >\n {panelExtra}\n </div>\n ) : null}\n {showSearch ? (\n <div className={classNames('filter-cascader-search', styles['filter-cascader-search'])}>\n <Search\n placeholder={`搜索${resolvedLabel}`}\n allowClear\n value={searchText}\n onChange={(e) => setSearchText(e.target.value)}\n />\n </div>\n ) : null}\n {optionsLoading ? (\n <div className={classNames('filter-cascader-loading', styles['filter-cascader-loading'])}>\n <Spin size=\"small\" />\n </div>\n ) : displayOptions.length === 0 ? (\n <Empty iconType=\"simple\" description=\"暂无选项\" />\n ) : (\n <div\n className={classNames(\n 'filter-cascader-panel-wrap',\n styles['filter-cascader-panel-wrap'],\n )}\n >\n <Cascader.Panel\n className={classNames('filter-cascader-panel', styles['filter-cascader-panel'])}\n options={displayOptions}\n value={cascaderValue as never}\n onChange={handleCascaderChange as never}\n multiple={multiple}\n changeOnSelect={!leafOnly}\n // leafOnly 多选:禁止 SHOW_PARENT 把整厂塌成父级 Code\n {...(multiple && leafOnly ? { showCheckedStrategy: Cascader.SHOW_CHILD } : {})}\n />\n </div>\n )}\n {multiple && Array.isArray(localValue) && localValue.length > 0 ? (\n <div\n className={classNames(\n 'filter-cascader-selected-bar',\n styles['filter-cascader-selected-bar'],\n )}\n >\n <Space size={[4, 4]} wrap>\n <span className={styles['filter-cascader-selected-count']}>\n 已选 {localValue.length}\n </span>\n </Space>\n </div>\n ) : null}\n </div>\n </FilterPopover>\n );\n};\n\nexport default FilterCascader;\n"],"names":["Search","Input","treeToCascaderOptions","nodes","getLabel","n","children","_a","filterOptionsByKeyword","options","keyword","lower","walk","opts","result","opt","label","buildLeafPathMap","map","prefix","path","findCascaderNode","found","id","collectDescendantLeafIds","node","pathsToLeafIds","paths","leafPathMap","leafOnly","out","seen","push","last","buildLabelMapFromOptions","leafToCascaderValue","leaf","multiple","p","cascaderValueToLeaf","next","leaves","FilterCascader","filterKey","propsTreeData","propsOptions","loadData","enabled","value","onChange","onChangePath","showSearch","active","hidden","display","dependsOn","clearOnDepsChange","getNodeLabel","panelExtra","panelWidth","loadingProp","onChangeRef","useRef","onChangePathRef","resolvedPanelWidth","resolvedLabel","values","depsKey","useFilterFieldBridge","_b","loadedTree","setLoadedTree","useState","loadDataLoading","setLoadDataLoading","loadDataRef","useEffect","cancelled","cascaderOptions","useMemo","optionsLoading","labelMap","open","setOpen","searchText","setSearchText","localValue","setLocalValue","confirmedValueLabel","arr","v","registerFn","useFilterRegister","visibilityCtx","resolveFilterVisible","displayOptions","cascaderValue","emitChange","useCallback","nextLeaf","handleCascaderChange","leafArr","handleConfirm","handleReset","isActive","jsx","FilterPopover","jsxs","classNames","styles","e","Spin","Empty","Cascader","Space"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ const a = {
2
+ "filter-cascader-root": "_filter-cascader-root_13av2_1",
3
+ "filter-cascader-panel-extra": "_filter-cascader-panel-extra_13av2_5",
4
+ "filter-cascader-search": "_filter-cascader-search_13av2_9",
5
+ "filter-cascader-loading": "_filter-cascader-loading_13av2_14",
6
+ "filter-cascader-panel-wrap": "_filter-cascader-panel-wrap_13av2_22",
7
+ "filter-cascader-panel": "_filter-cascader-panel_13av2_5",
8
+ "filter-cascader-selected-bar": "_filter-cascader-selected-bar_13av2_109",
9
+ "filter-cascader-selected-count": "_filter-cascader-selected-count_13av2_117"
10
+ };
11
+ export {
12
+ a as default
13
+ };
14
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -4,6 +4,8 @@ interface FilterPopoverProps {
4
4
  label: string;
5
5
  /** 是否有值(控制选中态样式) */
6
6
  active?: boolean;
7
+ /** 选项加载中:透传至 FilterTrigger */
8
+ loading?: boolean;
7
9
  /** 面板宽度 */
8
10
  width?: number;
9
11
  /** 确定按钮文字 */
@@ -1,24 +1,25 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
- import { Popover as y } from "antd";
3
- import { useState as h } from "react";
4
- import v from "../FilterPanel/index.js";
5
- import x from "../FilterTrigger/index.js";
6
- const I = ({
2
+ import { Popover as h } from "antd";
3
+ import { useState as v } from "react";
4
+ import x from "../FilterPanel/index.js";
5
+ import P from "../FilterTrigger/index.js";
6
+ const L = ({
7
7
  label: a,
8
8
  active: p,
9
+ loading: d = !1,
9
10
  width: i,
10
- confirmText: d = "确定",
11
- children: c,
11
+ confirmText: c = "确定",
12
+ children: f,
12
13
  open: m,
13
14
  onOpenChange: l,
14
- onConfirm: t,
15
- onReset: e
15
+ onConfirm: e,
16
+ onReset: t
16
17
  }) => {
17
- const [f, u] = h(!1), n = m ?? f, o = (s) => {
18
- u(s), l == null || l(s);
18
+ const [u, y] = v(!1), n = m ?? u, o = (s) => {
19
+ y(s), l == null || l(s);
19
20
  };
20
21
  return /* @__PURE__ */ r(
21
- y,
22
+ h,
22
23
  {
23
24
  open: n,
24
25
  onOpenChange: o,
@@ -29,24 +30,24 @@ const I = ({
29
30
  styles: { content: { maxWidth: i || 300, padding: 0 } },
30
31
  getPopupContainer: () => document.body,
31
32
  content: /* @__PURE__ */ r(
32
- v,
33
+ x,
33
34
  {
34
- onConfirm: t ? () => {
35
- (t == null ? void 0 : t()) !== !1 && o(!1);
35
+ onConfirm: e ? () => {
36
+ (e == null ? void 0 : e()) !== !1 && o(!1);
36
37
  } : void 0,
37
- onReset: e ? () => {
38
- e == null || e(), o(!1);
38
+ onReset: t ? () => {
39
+ t == null || t(), o(!1);
39
40
  } : void 0,
40
- confirmText: d,
41
+ confirmText: c,
41
42
  width: i || 300,
42
- children: c
43
+ children: f
43
44
  }
44
45
  ),
45
- children: /* @__PURE__ */ r("span", { style: { display: "inline-flex" }, children: /* @__PURE__ */ r(x, { label: a, active: p, open: n }) })
46
+ children: /* @__PURE__ */ r("span", { style: { display: "inline-flex" }, children: /* @__PURE__ */ r(P, { label: a, active: p, open: n, loading: d }) })
46
47
  }
47
48
  );
48
49
  };
49
50
  export {
50
- I as default
51
+ L as default
51
52
  };
52
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterPopover/index.tsx"],"sourcesContent":["import { Popover } from 'antd';\nimport React, { useState } from 'react';\nimport FilterPanel from '../FilterPanel';\nimport FilterTrigger from '../FilterTrigger';\n\ninterface FilterPopoverProps {\n /** 筛选项标签 */\n label: string;\n /** 是否有值(控制选中态样式) */\n active?: boolean;\n /** 面板宽度 */\n width?: number;\n /** 确定按钮文字 */\n confirmText?: string;\n /** 面板内容 */\n children: React.ReactNode;\n /** 受控打开状态(传入则由外部控制) */\n open?: boolean;\n /** 打开状态变更回调 */\n onOpenChange?: (open: boolean) => void;\n /** 确认回调(不传则无确定/取消按钮);返回 `false` 时不关闭弹层 */\n onConfirm?: () => void | boolean;\n /** 取消回调 */\n onReset?: () => void;\n}\n\nconst FilterPopover: React.FC<FilterPopoverProps> = ({\n label,\n active,\n width,\n confirmText = '确定',\n children,\n open: controlledOpen,\n onOpenChange,\n onConfirm,\n onReset,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n\n const setOpen = (value: boolean) => {\n setInternalOpen(value);\n onOpenChange?.(value);\n };\n\n const handleConfirm = () => {\n const result = onConfirm?.();\n if (result === false) return;\n setOpen(false);\n };\n\n const handleReset = () => {\n onReset?.();\n setOpen(false);\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n trigger=\"click\"\n placement=\"bottomLeft\"\n destroyOnHidden\n classNames={{ root: 'filter-popover-panel' }}\n styles={{ content: { maxWidth: width || 300, padding: 0 } }}\n getPopupContainer={() => document.body}\n content={\n <FilterPanel\n onConfirm={onConfirm ? handleConfirm : undefined}\n onReset={onReset ? handleReset : undefined}\n confirmText={confirmText}\n width={width || 300}\n >\n {children}\n </FilterPanel>\n }\n >\n <span style={{ display: 'inline-flex' }}>\n <FilterTrigger label={label} active={active} open={open} />\n </span>\n </Popover>\n );\n};\n\nexport default FilterPopover;\nexport type { FilterPopoverProps };\n"],"names":["FilterPopover","label","active","width","confirmText","children","controlledOpen","onOpenChange","onConfirm","onReset","internalOpen","setInternalOpen","useState","open","setOpen","value","jsx","Popover","FilterPanel","FilterTrigger"],"mappings":";;;;;AA0BA,MAAMA,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,UAAAC;AAAA,EACA,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAOP,KAAkBI,GAEzBI,IAAU,CAACC,MAAmB;AAClC,IAAAJ,EAAgBI,CAAK,GACrBR,KAAA,QAAAA,EAAeQ;AAAA,EACjB;AAaA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAJ;AAAA,MACA,cAAcC;AAAA,MACd,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,iBAAe;AAAA,MACf,YAAY,EAAE,MAAM,uBAAA;AAAA,MACpB,QAAQ,EAAE,SAAS,EAAE,UAAUX,KAAS,KAAK,SAAS,IAAE;AAAA,MACxD,mBAAmB,MAAM,SAAS;AAAA,MAClC,SACE,gBAAAa;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,WAAWV,IAvBG,MAAM;AAE1B,aADeA,KAAA,gBAAAA,SACA,MACfM,EAAQ,EAAK;AAAA,UACf,IAmB+C;AAAA,UACvC,SAASL,IAlBG,MAAM;AACxB,YAAAA,KAAA,QAAAA,KACAK,EAAQ,EAAK;AAAA,UACf,IAeyC;AAAA,UACjC,aAAAV;AAAA,UACA,OAAOD,KAAS;AAAA,UAEf,UAAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MAIL,UAAA,gBAAAW,EAAC,QAAA,EAAK,OAAO,EAAE,SAAS,cAAA,GACtB,UAAA,gBAAAA,EAACG,GAAA,EAAc,OAAAlB,GAAc,QAAAC,GAAgB,MAAAW,EAAA,CAAY,EAAA,CAC3D;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterPopover/index.tsx"],"sourcesContent":["import { Popover } from 'antd';\nimport React, { useState } from 'react';\nimport FilterPanel from '../FilterPanel';\nimport FilterTrigger from '../FilterTrigger';\n\ninterface FilterPopoverProps {\n /** 筛选项标签 */\n label: string;\n /** 是否有值(控制选中态样式) */\n active?: boolean;\n /** 选项加载中:透传至 FilterTrigger */\n loading?: boolean;\n /** 面板宽度 */\n width?: number;\n /** 确定按钮文字 */\n confirmText?: string;\n /** 面板内容 */\n children: React.ReactNode;\n /** 受控打开状态(传入则由外部控制) */\n open?: boolean;\n /** 打开状态变更回调 */\n onOpenChange?: (open: boolean) => void;\n /** 确认回调(不传则无确定/取消按钮);返回 `false` 时不关闭弹层 */\n onConfirm?: () => void | boolean;\n /** 取消回调 */\n onReset?: () => void;\n}\n\nconst FilterPopover: React.FC<FilterPopoverProps> = ({\n label,\n active,\n loading = false,\n width,\n confirmText = '确定',\n children,\n open: controlledOpen,\n onOpenChange,\n onConfirm,\n onReset,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n\n const setOpen = (value: boolean) => {\n setInternalOpen(value);\n onOpenChange?.(value);\n };\n\n const handleConfirm = () => {\n const result = onConfirm?.();\n if (result === false) return;\n setOpen(false);\n };\n\n const handleReset = () => {\n onReset?.();\n setOpen(false);\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n trigger=\"click\"\n placement=\"bottomLeft\"\n destroyOnHidden\n classNames={{ root: 'filter-popover-panel' }}\n styles={{ content: { maxWidth: width || 300, padding: 0 } }}\n getPopupContainer={() => document.body}\n content={\n <FilterPanel\n onConfirm={onConfirm ? handleConfirm : undefined}\n onReset={onReset ? handleReset : undefined}\n confirmText={confirmText}\n width={width || 300}\n >\n {children}\n </FilterPanel>\n }\n >\n <span style={{ display: 'inline-flex' }}>\n <FilterTrigger label={label} active={active} open={open} loading={loading} />\n </span>\n </Popover>\n );\n};\n\nexport default FilterPopover;\nexport type { FilterPopoverProps };\n"],"names":["FilterPopover","label","active","loading","width","confirmText","children","controlledOpen","onOpenChange","onConfirm","onReset","internalOpen","setInternalOpen","useState","open","setOpen","value","jsx","Popover","FilterPanel","FilterTrigger"],"mappings":";;;;;AA4BA,MAAMA,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,UAAAC;AAAA,EACA,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAOP,KAAkBI,GAEzBI,IAAU,CAACC,MAAmB;AAClC,IAAAJ,EAAgBI,CAAK,GACrBR,KAAA,QAAAA,EAAeQ;AAAA,EACjB;AAaA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAJ;AAAA,MACA,cAAcC;AAAA,MACd,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,iBAAe;AAAA,MACf,YAAY,EAAE,MAAM,uBAAA;AAAA,MACpB,QAAQ,EAAE,SAAS,EAAE,UAAUX,KAAS,KAAK,SAAS,IAAE;AAAA,MACxD,mBAAmB,MAAM,SAAS;AAAA,MAClC,SACE,gBAAAa;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,WAAWV,IAvBG,MAAM;AAE1B,aADeA,KAAA,gBAAAA,SACA,MACfM,EAAQ,EAAK;AAAA,UACf,IAmB+C;AAAA,UACvC,SAASL,IAlBG,MAAM;AACxB,YAAAA,KAAA,QAAAA,KACAK,EAAQ,EAAK;AAAA,UACf,IAeyC;AAAA,UACjC,aAAAV;AAAA,UACA,OAAOD,KAAS;AAAA,UAEf,UAAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MAIL,UAAA,gBAAAW,EAAC,QAAA,EAAK,OAAO,EAAE,SAAS,cAAA,GACtB,UAAA,gBAAAA,EAACG,GAAA,EAAc,OAAAnB,GAAc,QAAAC,GAAgB,MAAAY,GAAY,SAAAX,GAAkB,EAAA,CAC7E;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -32,6 +32,12 @@ interface FilterSelectProps extends BaseFilterProps {
32
32
  panelExtra?: React.ReactNode;
33
33
  /** 面板宽度;有 panelExtra 时默认 460 */
34
34
  panelWidth?: number;
35
+ /**
36
+ * 选项加载中:Filter Item(Trigger)显示 Loader2 spin;
37
+ * 面板列表区显示 Spin,不渲染空态。
38
+ * 与内部 loadData loading 取或。
39
+ */
40
+ loading?: boolean;
35
41
  }
36
42
  declare const FilterSelect: React.FC<FilterSelectProps>;
37
43
  export default FilterSelect;