@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,86 +1,104 @@
1
- import { jsx as d, jsxs as E } from "react/jsx-runtime";
2
- import { InputNumber as M, message as q } from "antd";
3
- import { useState as a, useEffect as $, useMemo as y } from "react";
4
- import A from "../FilterPopover/index.js";
5
- import { useFilterRegister as B } from "../useFilterState.js";
6
- import { resolveHidden as j } from "../types.js";
1
+ import { jsx as d, jsxs as $ } from "react/jsx-runtime";
2
+ import { InputNumber as j, message as G } from "antd";
3
+ import { useState as S, useRef as J, useEffect as w, useMemo as O } from "react";
4
+ import Q from "../FilterPopover/index.js";
5
+ import { useFilterFieldBridge as U, useFilterRegister as W } from "../useFilterState.js";
6
+ import { resolveHidden as z } from "../types.js";
7
7
  import f from "./style.module.scss.js";
8
8
  import c from "classnames";
9
- function w(s, e) {
10
- return e != null && e >= 0 ? s.toFixed(e) : String(s);
9
+ function L(s, i) {
10
+ return i != null && i >= 0 ? s.toFixed(i) : String(s);
11
11
  }
12
- function D(s, e) {
12
+ function X(s, i) {
13
13
  if (s != null) return s;
14
- if (e != null && e >= 0) return 10 ** -e;
14
+ if (i != null && i >= 0) return 10 ** -i;
15
15
  }
16
- const Z = ({
16
+ const rr = ({
17
17
  filterKey: s,
18
- label: e,
18
+ label: i,
19
19
  value: r,
20
20
  onChange: t,
21
21
  unit: u,
22
- minPlaceholder: z = "最低...",
23
- maxPlaceholder: T = "最高...",
24
- min: g,
25
- max: F,
26
- precision: n,
27
- step: H,
28
- active: I,
29
- hidden: p
22
+ minPlaceholder: T = "最低...",
23
+ maxPlaceholder: B = "最高...",
24
+ min: V,
25
+ max: g,
26
+ precision: o,
27
+ step: D,
28
+ active: H,
29
+ hidden: N,
30
+ dependsOn: I,
31
+ clearOnDepsChange: P = !0
30
32
  }) => {
31
- const [m, N] = a(r == null ? void 0 : r[0]), [o, x] = a(r == null ? void 0 : r[1]), [S, l] = a(""), V = D(H, n), b = B();
32
- $(() => {
33
- N(r == null ? void 0 : r[0]), x(r == null ? void 0 : r[1]), l("");
33
+ const [l, x] = S(r == null ? void 0 : r[0]), [m, a] = S(r == null ? void 0 : r[1]), [E, n] = S(""), M = X(D, o), b = J(t);
34
+ b.current = t;
35
+ const { resolvedLabel: F } = U({
36
+ filterKey: s,
37
+ value: r,
38
+ label: i,
39
+ dependsOn: I,
40
+ clearOnDepsChange: P,
41
+ onDepsClear: () => {
42
+ var e;
43
+ return (e = b.current) == null ? void 0 : e.call(b, null);
44
+ }
45
+ }), p = W();
46
+ w(() => {
47
+ x(r == null ? void 0 : r[0]), a(r == null ? void 0 : r[1]), n("");
34
48
  }, [r]);
35
- const R = y(() => {
36
- if (m === void 0 && o === void 0) return "";
37
- const i = m !== void 0 ? w(m, n) : "—", k = o !== void 0 ? w(o, n) : "—";
38
- return `${i} ~ ${k}${u ?? ""}`;
39
- }, [m, o, u, n]);
40
- if ($(() => {
41
- if (b) {
42
- if (j(p)) {
43
- b.unregister(s);
49
+ const R = O(() => {
50
+ if (l === void 0 && m === void 0) return "";
51
+ const e = l !== void 0 ? L(l, o) : "—", A = m !== void 0 ? L(m, o) : "—";
52
+ return `${e} ~ ${A}${u ?? ""}`;
53
+ }, [l, m, u, o]);
54
+ if (w(() => {
55
+ if (p) {
56
+ if (z(N)) {
57
+ p.unregister(s);
44
58
  return;
45
59
  }
46
- R ? b.register(s, { label: e, valueLabel: R, onRemove: () => t == null ? void 0 : t(null) }) : b.unregister(s);
60
+ R ? p.register(s, {
61
+ label: F,
62
+ valueLabel: R,
63
+ onRemove: () => t == null ? void 0 : t(null)
64
+ }) : p.unregister(s);
47
65
  }
48
- }, [R, s, e, p]), j(p)) return null;
49
- const L = () => {
50
- if (m !== void 0 && o !== void 0 && m > o) {
51
- const i = "最小值不能大于最大值";
52
- return l(i), q.warning(i), !1;
66
+ }, [R, s, F, N]), z(N)) return null;
67
+ const k = () => {
68
+ if (l !== void 0 && m !== void 0 && l > m) {
69
+ const e = "最小值不能大于最大值";
70
+ return n(e), G.warning(e), !1;
53
71
  }
54
- l(""), m !== void 0 || o !== void 0 ? t == null || t([m, o]) : t == null || t(null);
55
- }, P = () => {
56
- N(void 0), x(void 0), l(""), t == null || t(null);
72
+ n(""), l !== void 0 || m !== void 0 ? t == null || t([l, m]) : t == null || t(null);
73
+ }, q = () => {
74
+ x(void 0), a(void 0), n(""), t == null || t(null);
57
75
  };
58
76
  return /* @__PURE__ */ d(
59
- A,
77
+ Q,
60
78
  {
61
- label: e,
62
- active: I || !!(r != null && r[0]) || !!(r != null && r[1]),
63
- onConfirm: L,
64
- onReset: P,
79
+ label: F,
80
+ active: H || !!(r != null && r[0]) || !!(r != null && r[1]),
81
+ onConfirm: k,
82
+ onReset: q,
65
83
  width: 380,
66
- children: /* @__PURE__ */ E("div", { className: c("filter-number-range-body", f["filter-number-range-body"]), children: [
67
- /* @__PURE__ */ E(
84
+ children: /* @__PURE__ */ $("div", { className: c("filter-number-range-body", f["filter-number-range-body"]), children: [
85
+ /* @__PURE__ */ $(
68
86
  "div",
69
87
  {
70
88
  className: c("filter-number-range-inputs", f["filter-number-range-inputs"]),
71
89
  children: [
72
90
  /* @__PURE__ */ d(
73
- M,
91
+ j,
74
92
  {
75
93
  size: "middle",
76
- placeholder: z,
77
- value: m,
78
- min: g,
79
- max: F,
80
- precision: n,
81
- step: V,
82
- onChange: (i) => {
83
- N(i === null ? void 0 : i), l("");
94
+ placeholder: T,
95
+ value: l,
96
+ min: V,
97
+ max: g,
98
+ precision: o,
99
+ step: M,
100
+ onChange: (e) => {
101
+ x(e === null ? void 0 : e), n("");
84
102
  }
85
103
  }
86
104
  ),
@@ -95,17 +113,17 @@ const Z = ({
95
113
  }
96
114
  ),
97
115
  /* @__PURE__ */ d(
98
- M,
116
+ j,
99
117
  {
100
118
  size: "middle",
101
- placeholder: T,
102
- value: o,
103
- min: g,
104
- max: F,
105
- precision: n,
106
- step: V,
107
- onChange: (i) => {
108
- x(i === null ? void 0 : i), l("");
119
+ placeholder: B,
120
+ value: m,
121
+ min: V,
122
+ max: g,
123
+ precision: o,
124
+ step: M,
125
+ onChange: (e) => {
126
+ a(e === null ? void 0 : e), n("");
109
127
  }
110
128
  }
111
129
  ),
@@ -119,12 +137,12 @@ const Z = ({
119
137
  ]
120
138
  }
121
139
  ),
122
- S ? /* @__PURE__ */ d(
140
+ E ? /* @__PURE__ */ d(
123
141
  "div",
124
142
  {
125
143
  className: c("filter-number-range-error", f["filter-number-range-error"]),
126
144
  role: "alert",
127
- children: S
145
+ children: E
128
146
  }
129
147
  ) : null
130
148
  ] })
@@ -132,6 +150,6 @@ const Z = ({
132
150
  );
133
151
  };
134
152
  export {
135
- Z as default
153
+ rr as default
136
154
  };
137
155
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterNumberRange/index.tsx"],"sourcesContent":["import { InputNumber, message } from 'antd';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport FilterPopover from '../FilterPopover';\nimport { useFilterRegister } from '../useFilterState';\nimport type { BaseFilterProps } from '../types';\nimport { resolveHidden } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\ninterface FilterNumberRangeProps extends BaseFilterProps {\n value?: [number | undefined, number | undefined] | null;\n onChange?: (value: [number | undefined, number | undefined] | null) => void;\n unit?: string;\n minPlaceholder?: string;\n maxPlaceholder?: string;\n /** 绝对值下限(左右输入框共用) */\n min?: number;\n /** 绝对值上限(左右输入框共用) */\n max?: number;\n /** 小数位数 */\n precision?: number;\n /** 步进;未传且有 precision 时按 10^-precision 推导 */\n step?: number;\n}\n\nfunction formatNumber(n: number, precision?: number): string {\n if (precision != null && precision >= 0) return n.toFixed(precision);\n return String(n);\n}\n\nfunction resolveStep(step: number | undefined, precision: number | undefined): number | undefined {\n if (step != null) return step;\n if (precision != null && precision >= 0) return 10 ** -precision;\n return undefined;\n}\n\nconst FilterNumberRange: React.FC<FilterNumberRangeProps> = ({\n filterKey,\n label,\n value,\n onChange,\n unit,\n minPlaceholder = '最低...',\n maxPlaceholder = '最高...',\n min,\n max,\n precision,\n step,\n active,\n hidden,\n}) => {\n const [minVal, setMinVal] = useState<number | undefined>(value?.[0]);\n const [maxVal, setMaxVal] = useState<number | undefined>(value?.[1]);\n const [rangeError, setRangeError] = useState('');\n\n const resolvedStep = resolveStep(step, precision);\n\n // ── 自动注册到 CommonFilter ──\n const registerFn = useFilterRegister();\n\n // 同步外部 value 到内部 minVal/maxVal\n useEffect(() => {\n setMinVal(value?.[0]);\n setMaxVal(value?.[1]);\n setRangeError('');\n }, [value]);\n\n const valueLabel = useMemo(() => {\n if (minVal === undefined && maxVal === undefined) return '';\n const minText = minVal !== undefined ? formatNumber(minVal, precision) : '—';\n const maxText = maxVal !== undefined ? formatNumber(maxVal, precision) : '—';\n return `${minText} ~ ${maxText}${unit ?? ''}`;\n }, [minVal, maxVal, unit, precision]);\n\n useEffect(() => {\n if (!registerFn) return;\n if (resolveHidden(hidden)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel) {\n registerFn.register(filterKey, { label, valueLabel, onRemove: () => onChange?.(null) });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, label, hidden]);\n\n // hidden 处理 - 必须在所有 hooks 之后\n if (resolveHidden(hidden)) return null;\n\n const handleConfirm = (): boolean | void => {\n if (minVal !== undefined && maxVal !== undefined && minVal > maxVal) {\n const msg = '最小值不能大于最大值';\n setRangeError(msg);\n message.warning(msg);\n return false;\n }\n setRangeError('');\n if (minVal !== undefined || maxVal !== undefined) {\n onChange?.([minVal, maxVal]);\n } else {\n onChange?.(null);\n }\n };\n\n const handleReset = () => {\n setMinVal(undefined);\n setMaxVal(undefined);\n setRangeError('');\n onChange?.(null);\n };\n\n return (\n <FilterPopover\n label={label}\n active={active || !!value?.[0] || !!value?.[1]}\n onConfirm={handleConfirm}\n onReset={handleReset}\n width={380}\n >\n <div className={classNames('filter-number-range-body', styles['filter-number-range-body'])}>\n <div\n className={classNames('filter-number-range-inputs', styles['filter-number-range-inputs'])}\n >\n <InputNumber\n size=\"middle\"\n placeholder={minPlaceholder}\n value={minVal}\n min={min}\n max={max}\n precision={precision}\n step={resolvedStep}\n onChange={(v) => {\n setMinVal(v === null ? undefined : v);\n setRangeError('');\n }}\n />\n <span\n className={classNames(\n 'filter-number-range-separator',\n styles['filter-number-range-separator'],\n )}\n >\n -\n </span>\n <InputNumber\n size=\"middle\"\n placeholder={maxPlaceholder}\n value={maxVal}\n min={min}\n max={max}\n precision={precision}\n step={resolvedStep}\n onChange={(v) => {\n setMaxVal(v === null ? undefined : v);\n setRangeError('');\n }}\n />\n {unit ? (\n <span\n className={classNames('filter-number-range-unit', styles['filter-number-range-unit'])}\n >\n {unit}\n </span>\n ) : null}\n </div>\n {rangeError ? (\n <div\n className={classNames('filter-number-range-error', styles['filter-number-range-error'])}\n role=\"alert\"\n >\n {rangeError}\n </div>\n ) : null}\n </div>\n </FilterPopover>\n );\n};\n\nexport default FilterNumberRange;\nexport type { FilterNumberRangeProps };\n"],"names":["formatNumber","n","precision","resolveStep","step","FilterNumberRange","filterKey","label","value","onChange","unit","minPlaceholder","maxPlaceholder","min","max","active","hidden","minVal","setMinVal","useState","maxVal","setMaxVal","rangeError","setRangeError","resolvedStep","registerFn","useFilterRegister","useEffect","valueLabel","useMemo","minText","maxText","resolveHidden","handleConfirm","msg","message","handleReset","jsx","FilterPopover","jsxs","classNames","styles","InputNumber","v"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterNumberRange/index.tsx"],"sourcesContent":["import { InputNumber, message } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport FilterPopover from '../FilterPopover';\nimport { useFilterFieldBridge, useFilterRegister } from '../useFilterState';\nimport type { BaseFilterProps } from '../types';\nimport { resolveHidden } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\ninterface FilterNumberRangeProps extends BaseFilterProps {\n value?: [number | undefined, number | undefined] | null;\n onChange?: (value: [number | undefined, number | undefined] | null) => void;\n unit?: string;\n minPlaceholder?: string;\n maxPlaceholder?: string;\n /** 绝对值下限(左右输入框共用) */\n min?: number;\n /** 绝对值上限(左右输入框共用) */\n max?: number;\n /** 小数位数 */\n precision?: number;\n /** 步进;未传且有 precision 时按 10^-precision 推导 */\n step?: number;\n}\n\nfunction formatNumber(n: number, precision?: number): string {\n if (precision != null && precision >= 0) return n.toFixed(precision);\n return String(n);\n}\n\nfunction resolveStep(step: number | undefined, precision: number | undefined): number | undefined {\n if (step != null) return step;\n if (precision != null && precision >= 0) return 10 ** -precision;\n return undefined;\n}\n\nconst FilterNumberRange: React.FC<FilterNumberRangeProps> = ({\n filterKey,\n label,\n value,\n onChange,\n unit,\n minPlaceholder = '最低...',\n maxPlaceholder = '最高...',\n min,\n max,\n precision,\n step,\n active,\n hidden,\n dependsOn,\n clearOnDepsChange = true,\n}) => {\n const [minVal, setMinVal] = useState<number | undefined>(value?.[0]);\n const [maxVal, setMaxVal] = useState<number | undefined>(value?.[1]);\n const [rangeError, setRangeError] = useState('');\n\n const resolvedStep = resolveStep(step, precision);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const { resolvedLabel } = useFilterFieldBridge({\n filterKey,\n value,\n label,\n dependsOn,\n clearOnDepsChange,\n onDepsClear: () => onChangeRef.current?.(null),\n });\n\n // ── 自动注册到 CommonFilter ──\n const registerFn = useFilterRegister();\n\n // 同步外部 value 到内部 minVal/maxVal\n useEffect(() => {\n setMinVal(value?.[0]);\n setMaxVal(value?.[1]);\n setRangeError('');\n }, [value]);\n\n const valueLabel = useMemo(() => {\n if (minVal === undefined && maxVal === undefined) return '';\n const minText = minVal !== undefined ? formatNumber(minVal, precision) : '—';\n const maxText = maxVal !== undefined ? formatNumber(maxVal, precision) : '—';\n return `${minText} ~ ${maxText}${unit ?? ''}`;\n }, [minVal, maxVal, unit, precision]);\n\n useEffect(() => {\n if (!registerFn) return;\n if (resolveHidden(hidden)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel) {\n registerFn.register(filterKey, {\n label: resolvedLabel,\n valueLabel,\n onRemove: () => onChange?.(null),\n });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, resolvedLabel, hidden]);\n\n // hidden 处理 - 必须在所有 hooks 之后\n if (resolveHidden(hidden)) return null;\n\n const handleConfirm = (): boolean | void => {\n if (minVal !== undefined && maxVal !== undefined && minVal > maxVal) {\n const msg = '最小值不能大于最大值';\n setRangeError(msg);\n message.warning(msg);\n return false;\n }\n setRangeError('');\n if (minVal !== undefined || maxVal !== undefined) {\n onChange?.([minVal, maxVal]);\n } else {\n onChange?.(null);\n }\n };\n\n const handleReset = () => {\n setMinVal(undefined);\n setMaxVal(undefined);\n setRangeError('');\n onChange?.(null);\n };\n\n return (\n <FilterPopover\n label={resolvedLabel}\n active={active || !!value?.[0] || !!value?.[1]}\n onConfirm={handleConfirm}\n onReset={handleReset}\n width={380}\n >\n <div className={classNames('filter-number-range-body', styles['filter-number-range-body'])}>\n <div\n className={classNames('filter-number-range-inputs', styles['filter-number-range-inputs'])}\n >\n <InputNumber\n size=\"middle\"\n placeholder={minPlaceholder}\n value={minVal}\n min={min}\n max={max}\n precision={precision}\n step={resolvedStep}\n onChange={(v) => {\n setMinVal(v === null ? undefined : v);\n setRangeError('');\n }}\n />\n <span\n className={classNames(\n 'filter-number-range-separator',\n styles['filter-number-range-separator'],\n )}\n >\n -\n </span>\n <InputNumber\n size=\"middle\"\n placeholder={maxPlaceholder}\n value={maxVal}\n min={min}\n max={max}\n precision={precision}\n step={resolvedStep}\n onChange={(v) => {\n setMaxVal(v === null ? undefined : v);\n setRangeError('');\n }}\n />\n {unit ? (\n <span\n className={classNames('filter-number-range-unit', styles['filter-number-range-unit'])}\n >\n {unit}\n </span>\n ) : null}\n </div>\n {rangeError ? (\n <div\n className={classNames('filter-number-range-error', styles['filter-number-range-error'])}\n role=\"alert\"\n >\n {rangeError}\n </div>\n ) : null}\n </div>\n </FilterPopover>\n );\n};\n\nexport default FilterNumberRange;\nexport type { FilterNumberRangeProps };\n"],"names":["formatNumber","n","precision","resolveStep","step","FilterNumberRange","filterKey","label","value","onChange","unit","minPlaceholder","maxPlaceholder","min","max","active","hidden","dependsOn","clearOnDepsChange","minVal","setMinVal","useState","maxVal","setMaxVal","rangeError","setRangeError","resolvedStep","onChangeRef","useRef","resolvedLabel","useFilterFieldBridge","_a","registerFn","useFilterRegister","useEffect","valueLabel","useMemo","minText","maxText","resolveHidden","handleConfirm","msg","message","handleReset","jsx","FilterPopover","jsxs","classNames","styles","InputNumber","v"],"mappings":"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"}
@@ -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;"}
@@ -1,9 +1,14 @@
1
1
  import { default as React } from 'react';
2
- import { BaseFilterProps, FilterOption } from '../types';
2
+ import { BaseFilterProps, FilterLoadDataContext, FilterOption } from '../types';
3
3
  type FilterSelectValue = string | number | (string | number)[] | undefined;
4
4
  export type { FilterSelectValue };
5
5
  interface FilterSelectProps extends BaseFilterProps {
6
- options: FilterOption[];
6
+ /** 静态选项;与 loadData 二选一(同时存在时以 options 为准) */
7
+ options?: FilterOption[];
8
+ /** 按依赖值动态拉取选项 */
9
+ loadData?: (ctx: FilterLoadDataContext) => Promise<FilterOption[]>;
10
+ /** loadData 是否启用;默认 true */
11
+ enabled?: boolean;
7
12
  value?: FilterSelectValue;
8
13
  onChange?: (value: FilterSelectValue) => void;
9
14
  /** 默认值:与默认值相同时视为未筛选(除非 showDefaultAsSelected) */
@@ -20,6 +25,19 @@ interface FilterSelectProps extends BaseFilterProps {
20
25
  minSelection?: number;
21
26
  /** 人员选项:展示部门与联系方式 */
22
27
  variant?: 'default' | 'person';
28
+ /**
29
+ * 面板内嵌从属条件(与 search 同层:search 下方、选项列表上方)。
30
+ * 禁止再嵌 Filter*(双重 Popover)。
31
+ */
32
+ panelExtra?: React.ReactNode;
33
+ /** 面板宽度;有 panelExtra 时默认 460 */
34
+ panelWidth?: number;
35
+ /**
36
+ * 选项加载中:Filter Item(Trigger)显示 Loader2 spin;
37
+ * 面板列表区显示 Spin,不渲染空态。
38
+ * 与内部 loadData loading 取或。
39
+ */
40
+ loading?: boolean;
23
41
  }
24
42
  declare const FilterSelect: React.FC<FilterSelectProps>;
25
43
  export default FilterSelect;