@hkyhy/marsun-components-core 0.1.2

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 (139) hide show
  1. package/README.md +99 -0
  2. package/dist/components/AgentHub/AgentHubAccessGuard.js +12 -0
  3. package/dist/components/AgentHub/AgentHubAccessGuard.js.map +1 -0
  4. package/dist/components/AgentHub/AgentHubIndexRedirect.js +11 -0
  5. package/dist/components/AgentHub/AgentHubIndexRedirect.js.map +1 -0
  6. package/dist/components/AgentHub/ChatSessionAccessGuard.js +11 -0
  7. package/dist/components/AgentHub/ChatSessionAccessGuard.js.map +1 -0
  8. package/dist/components/Auth/PermissionGuard.js +18 -0
  9. package/dist/components/Auth/PermissionGuard.js.map +1 -0
  10. package/dist/components/Auth/ProtectedRoute.js +21 -0
  11. package/dist/components/Auth/ProtectedRoute.js.map +1 -0
  12. package/dist/components/Auth/hasPermission.js +7 -0
  13. package/dist/components/Auth/hasPermission.js.map +1 -0
  14. package/dist/components/Descriptions/CommonDescriptions.js +14 -0
  15. package/dist/components/Descriptions/CommonDescriptions.js.map +1 -0
  16. package/dist/components/File/FileItem/index.js +82 -0
  17. package/dist/components/File/FileItem/index.js.map +1 -0
  18. package/dist/components/File/FileItem/style.module.scss.js +18 -0
  19. package/dist/components/File/FileItem/style.module.scss.js.map +1 -0
  20. package/dist/components/File/FileLink/index.js +27 -0
  21. package/dist/components/File/FileLink/index.js.map +1 -0
  22. package/dist/components/File/FileLink/style.module.scss.js +10 -0
  23. package/dist/components/File/FileLink/style.module.scss.js.map +1 -0
  24. package/dist/components/File/FilePreview/index.js +49 -0
  25. package/dist/components/File/FilePreview/index.js.map +1 -0
  26. package/dist/components/File/FilePreview/style.module.scss.js +5 -0
  27. package/dist/components/File/FilePreview/style.module.scss.js.map +1 -0
  28. package/dist/components/File/FilePreviewModal/index.js +12 -0
  29. package/dist/components/File/FilePreviewModal/index.js.map +1 -0
  30. package/dist/components/File/fileDisplay.js +67 -0
  31. package/dist/components/File/fileDisplay.js.map +1 -0
  32. package/dist/components/Filter/CommonFilter/index.js +81 -0
  33. package/dist/components/Filter/CommonFilter/index.js.map +1 -0
  34. package/dist/components/Filter/CommonFilter/style.module.scss.js +20 -0
  35. package/dist/components/Filter/CommonFilter/style.module.scss.js.map +1 -0
  36. package/dist/components/Filter/FilterDateRange/index.js +97 -0
  37. package/dist/components/Filter/FilterDateRange/index.js.map +1 -0
  38. package/dist/components/Filter/FilterDateRange/style.module.scss.js +10 -0
  39. package/dist/components/Filter/FilterDateRange/style.module.scss.js.map +1 -0
  40. package/dist/components/Filter/FilterInput/index.js +56 -0
  41. package/dist/components/Filter/FilterInput/index.js.map +1 -0
  42. package/dist/components/Filter/FilterNumberRange/index.js +81 -0
  43. package/dist/components/Filter/FilterNumberRange/index.js.map +1 -0
  44. package/dist/components/Filter/FilterNumberRange/style.module.scss.js +9 -0
  45. package/dist/components/Filter/FilterNumberRange/style.module.scss.js.map +1 -0
  46. package/dist/components/Filter/FilterPanel/index.js +21 -0
  47. package/dist/components/Filter/FilterPanel/index.js.map +1 -0
  48. package/dist/components/Filter/FilterPanel/style.module.scss.js +8 -0
  49. package/dist/components/Filter/FilterPanel/style.module.scss.js.map +1 -0
  50. package/dist/components/Filter/FilterPopover/index.js +52 -0
  51. package/dist/components/Filter/FilterPopover/index.js.map +1 -0
  52. package/dist/components/Filter/FilterSelect/index.js +160 -0
  53. package/dist/components/Filter/FilterSelect/index.js.map +1 -0
  54. package/dist/components/Filter/FilterSelect/style.module.scss.js +16 -0
  55. package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -0
  56. package/dist/components/Filter/FilterTreeSelect/index.js +249 -0
  57. package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -0
  58. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js +19 -0
  59. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js.map +1 -0
  60. package/dist/components/Filter/FilterTrigger/index.js +31 -0
  61. package/dist/components/Filter/FilterTrigger/index.js.map +1 -0
  62. package/dist/components/Filter/FilterTrigger/style.module.scss.js +10 -0
  63. package/dist/components/Filter/FilterTrigger/style.module.scss.js.map +1 -0
  64. package/dist/components/Filter/types.js +12 -0
  65. package/dist/components/Filter/types.js.map +1 -0
  66. package/dist/components/Filter/useFilterState.js +35 -0
  67. package/dist/components/Filter/useFilterState.js.map +1 -0
  68. package/dist/components/Form/FetchSelect.js +37 -0
  69. package/dist/components/Form/FetchSelect.js.map +1 -0
  70. package/dist/components/Form/FetchTreeSelect.js +28 -0
  71. package/dist/components/Form/FetchTreeSelect.js.map +1 -0
  72. package/dist/components/Form/PersonOptionRow/index.js +37 -0
  73. package/dist/components/Form/PersonOptionRow/index.js.map +1 -0
  74. package/dist/components/Form/PersonOptionRow/style.module.scss.js +11 -0
  75. package/dist/components/Form/PersonOptionRow/style.module.scss.js.map +1 -0
  76. package/dist/components/Form/StepForm.js +34 -0
  77. package/dist/components/Form/StepForm.js.map +1 -0
  78. package/dist/components/Icons/index.js +245 -0
  79. package/dist/components/Icons/index.js.map +1 -0
  80. package/dist/components/Layout/PageHeaderLayout/index.js +41 -0
  81. package/dist/components/Layout/PageHeaderLayout/index.js.map +1 -0
  82. package/dist/components/Layout/PageHeaderLayout/style.module.scss.js +10 -0
  83. package/dist/components/Layout/PageHeaderLayout/style.module.scss.js.map +1 -0
  84. package/dist/components/Modal/StepModal/index.js +64 -0
  85. package/dist/components/Modal/StepModal/index.js.map +1 -0
  86. package/dist/components/Modal/StepModal/style.module.scss.js +9 -0
  87. package/dist/components/Modal/StepModal/style.module.scss.js.map +1 -0
  88. package/dist/components/Stat/StatCard/index.js +34 -0
  89. package/dist/components/Stat/StatCard/index.js.map +1 -0
  90. package/dist/components/Stat/StatCard/style.module.scss.js +7 -0
  91. package/dist/components/Stat/StatCard/style.module.scss.js.map +1 -0
  92. package/dist/components/Stat/StatCardList.js +20 -0
  93. package/dist/components/Stat/StatCardList.js.map +1 -0
  94. package/dist/components/Stat/StatPendingBreakdown/index.js +38 -0
  95. package/dist/components/Stat/StatPendingBreakdown/index.js.map +1 -0
  96. package/dist/components/Stat/StatPendingBreakdown/style.module.scss.js +9 -0
  97. package/dist/components/Stat/StatPendingBreakdown/style.module.scss.js.map +1 -0
  98. package/dist/components/Tag/FileTags.js +8 -0
  99. package/dist/components/Tag/FileTags.js.map +1 -0
  100. package/dist/components/Tag/SemanticTag.js +92 -0
  101. package/dist/components/Tag/SemanticTag.js.map +1 -0
  102. package/dist/components/Tag/Tags/index.js +32 -0
  103. package/dist/components/Tag/Tags/index.js.map +1 -0
  104. package/dist/components/Tag/Tags/style.module.scss.js +9 -0
  105. package/dist/components/Tag/Tags/style.module.scss.js.map +1 -0
  106. package/dist/components/TooltipInfo/TooltipInfo.js +31 -0
  107. package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -0
  108. package/dist/components/Tour/AppTour/index.js +40 -0
  109. package/dist/components/Tour/AppTour/index.js.map +1 -0
  110. package/dist/components/Tour/AppTour/style.module.scss.js +7 -0
  111. package/dist/components/Tour/AppTour/style.module.scss.js.map +1 -0
  112. package/dist/components/VirtualScrollbar/VirtualScrollbar/index.js +97 -0
  113. package/dist/components/VirtualScrollbar/VirtualScrollbar/index.js.map +1 -0
  114. package/dist/components/VirtualScrollbar/VirtualScrollbar/style.module.scss.js +12 -0
  115. package/dist/components/VirtualScrollbar/VirtualScrollbar/style.module.scss.js.map +1 -0
  116. package/dist/components/VirtualScrollbar/useVirtualScrollbar.js +97 -0
  117. package/dist/components/VirtualScrollbar/useVirtualScrollbar.js.map +1 -0
  118. package/dist/hooks/useFetchData.js +69 -0
  119. package/dist/hooks/useFetchData.js.map +1 -0
  120. package/dist/index.d.ts +28 -0
  121. package/dist/index.js +182 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/marsun-components-core.css +1 -0
  124. package/dist/provider/MarsunCoreProvider.js +51 -0
  125. package/dist/provider/MarsunCoreProvider.js.map +1 -0
  126. package/dist/provider/context.js +27 -0
  127. package/dist/provider/context.js.map +1 -0
  128. package/dist/theme/constants.js +15 -0
  129. package/dist/theme/constants.js.map +1 -0
  130. package/dist/theme/index.d.ts +2 -0
  131. package/dist/theme/index.js +9 -0
  132. package/dist/theme/index.js.map +1 -0
  133. package/dist/theme/theme.js +286 -0
  134. package/dist/theme/theme.js.map +1 -0
  135. package/dist/utils/format.js +9 -0
  136. package/dist/utils/format.js.map +1 -0
  137. package/dist/utils/resolveMaybeFn.js +11 -0
  138. package/dist/utils/resolveMaybeFn.js.map +1 -0
  139. package/package.json +83 -0
@@ -0,0 +1,160 @@
1
+ import { jsxs as h, jsx as d } from "react/jsx-runtime";
2
+ import { Check as H, X as J } from "../../Icons/index.js";
3
+ import { Input as Q, Checkbox as U, Space as W } from "antd";
4
+ import { useState as y, useRef as Y, useMemo as P, useEffect as j } from "react";
5
+ import Z from "../../Form/PersonOptionRow/index.js";
6
+ import _ from "../FilterPopover/index.js";
7
+ import { resolveFilterVisible as A } from "../types.js";
8
+ import { useFilterRegister as C } from "../useFilterState.js";
9
+ import a from "./style.module.scss.js";
10
+ import f from "classnames";
11
+ const { Search: K } = Q;
12
+ function V(t) {
13
+ const i = [t.label];
14
+ return t.departmentName && i.push(t.departmentName), i.join(" · ");
15
+ }
16
+ function ee(t, i) {
17
+ const o = i.toLowerCase();
18
+ return [t.label, t.departmentName, t.email, t.phone, t.employeeId].filter(Boolean).some((m) => String(m).toLowerCase().includes(o));
19
+ }
20
+ function D(t, i, o) {
21
+ if (o) return t ?? [];
22
+ if (!(i !== void 0 && t === i))
23
+ return t;
24
+ }
25
+ const me = ({
26
+ filterKey: t,
27
+ label: i,
28
+ options: o = [],
29
+ value: m,
30
+ onChange: n,
31
+ defaultValue: v,
32
+ searchable: T = !1,
33
+ multiple: s = !1,
34
+ variant: z = "default",
35
+ active: I,
36
+ hidden: w,
37
+ display: L
38
+ }) => {
39
+ const u = z === "person", [M, x] = y(!1), [N, O] = y(""), B = D(m, v, s), [r, b] = y(
40
+ B ?? (s ? [] : void 0)
41
+ ), S = C(), p = Y(n);
42
+ p.current = n;
43
+ const R = P(
44
+ () => () => {
45
+ var e;
46
+ (e = p.current) == null || e.call(p, void 0);
47
+ },
48
+ []
49
+ );
50
+ j(() => {
51
+ const e = D(m, v, s);
52
+ b(e ?? (s ? [] : void 0)), (e == null || Array.isArray(e) && e.length === 0) && O("");
53
+ }, [m, v, s]);
54
+ const g = P(() => {
55
+ if (s) {
56
+ const c = r || [];
57
+ return c.length > 0 ? c.map((l) => {
58
+ var k;
59
+ return ((k = o.find((G) => G.value === l)) == null ? void 0 : k.label) ?? String(l);
60
+ }).join("、") : "";
61
+ }
62
+ if (r == null) return "";
63
+ const e = o.find((c) => c.value === r);
64
+ return e ? u ? V(e) : e.label : String(r);
65
+ }, [o, r, s, u]);
66
+ if (j(() => {
67
+ if (!S) return;
68
+ if (!A({ display: L, hidden: w }, { filterKey: t, label: i, value: m })) {
69
+ S.unregister(t);
70
+ return;
71
+ }
72
+ g && !s ? S.register(t, {
73
+ label: i,
74
+ valueLabel: g,
75
+ onRemove: R
76
+ }) : S.unregister(t);
77
+ }, [g, t, i, w, L, s, R]), !A({ display: L, hidden: w }, { filterKey: t, label: i, value: m })) return null;
78
+ const F = N ? o.filter(
79
+ (e) => u ? ee(e, N) : e.label.toLowerCase().includes(N.toLowerCase())
80
+ ) : o, E = () => {
81
+ n == null || n(r), x(!1);
82
+ }, X = () => {
83
+ b(s ? [] : void 0), O(""), n == null || n(void 0), x(!1);
84
+ }, $ = (e) => {
85
+ if (!s) {
86
+ const c = v !== void 0 && e === v;
87
+ let l;
88
+ r === e || c ? l = void 0 : l = e, b(l), n == null || n(l), x(!1);
89
+ }
90
+ }, q = (e) => {
91
+ const c = r || [], l = c.includes(e) ? c.filter((k) => k !== e) : [...c, e];
92
+ b(l);
93
+ };
94
+ return /* @__PURE__ */ h(
95
+ _,
96
+ {
97
+ label: i,
98
+ active: I || (s ? Array.isArray(r) && r.length > 0 : r != null && r !== ""),
99
+ open: M,
100
+ onOpenChange: x,
101
+ onConfirm: s ? E : void 0,
102
+ onReset: s ? X : void 0,
103
+ children: [
104
+ T && /* @__PURE__ */ d(
105
+ K,
106
+ {
107
+ placeholder: `搜索${i}`,
108
+ allowClear: !0,
109
+ size: "middle",
110
+ className: f("filter-select-search", a["filter-select-search"]),
111
+ value: N,
112
+ onChange: (e) => O(e.target.value)
113
+ }
114
+ ),
115
+ /* @__PURE__ */ h("div", { className: f("filter-select-options", a["filter-select-options"]), children: [
116
+ F.map((e) => /* @__PURE__ */ h(
117
+ "div",
118
+ {
119
+ className: f(
120
+ "filter-select-option",
121
+ a["filter-select-option"],
122
+ !s && r === e.value && f("filter-select-option-selected", a["filter-select-option-selected"])
123
+ ),
124
+ onClick: () => $(e.value),
125
+ children: [
126
+ s && /* @__PURE__ */ d(U, { checked: r == null ? void 0 : r.includes(e.value) }),
127
+ u ? /* @__PURE__ */ d(Z, { option: e }) : /* @__PURE__ */ d("span", { children: e.label }),
128
+ !s && !u && r === e.value && /* @__PURE__ */ d(H, { className: f("filter-select-option-check", a["filter-select-option-check"]) })
129
+ ]
130
+ },
131
+ String(e.value)
132
+ )),
133
+ F.length === 0 && /* @__PURE__ */ d("div", { className: f("filter-select-empty", a["filter-select-empty"]), children: "暂无数据" })
134
+ ] }),
135
+ s && (r == null ? void 0 : r.length) > 0 && /* @__PURE__ */ h("div", { className: f("filter-select-selected-bar", a["filter-select-selected-bar"]), children: [
136
+ /* @__PURE__ */ d("div", { className: f("filter-select-selected-label", a["filter-select-selected-label"]), children: "已选:" }),
137
+ /* @__PURE__ */ d(W, { size: [4, 4], wrap: !0, children: r.map((e) => {
138
+ const c = o.find((l) => l.value === e);
139
+ return /* @__PURE__ */ h(
140
+ "span",
141
+ {
142
+ className: f("filter-select-selected-tag", a["filter-select-selected-tag"]),
143
+ onClick: () => q(e),
144
+ children: [
145
+ (c == null ? void 0 : c.label) ?? String(e),
146
+ /* @__PURE__ */ d(J, { className: f("filter-select-selected-remove", a["filter-select-selected-remove"]) })
147
+ ]
148
+ },
149
+ String(e)
150
+ );
151
+ }) })
152
+ ] })
153
+ ]
154
+ }
155
+ );
156
+ };
157
+ export {
158
+ me as default
159
+ };
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterSelect/index.tsx"],"sourcesContent":["import { Check, X } from '@/components/Icons';\nimport { Checkbox, Input, Space } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport PersonOptionRow from '../../Form/PersonOptionRow';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps, FilterOption, PersonOption } from '../types';\nimport { resolveFilterVisible } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nconst { Search } = Input;\n\nfunction formatPersonValueLabel(opt: PersonOption): string {\n const parts = [opt.label];\n if (opt.departmentName) parts.push(opt.departmentName);\n return parts.join(' · ');\n}\n\nfunction matchPersonOptionSearch(opt: PersonOption, keyword: string): boolean {\n const lower = keyword.toLowerCase();\n return [opt.label, opt.departmentName, opt.email, opt.phone, opt.employeeId]\n .filter(Boolean)\n .some((s) => String(s).toLowerCase().includes(lower));\n}\n\ninterface FilterSelectProps extends BaseFilterProps {\n options: FilterOption[];\n value?: string | number | undefined;\n onChange?: (value: string | number | undefined) => void;\n /** 默认值:与默认值相同时视为未筛选(不展示已选标签与选中态) */\n defaultValue?: string | number;\n placeholder?: string;\n searchable?: boolean;\n /** 是否多选 */\n multiple?: boolean;\n /** 人员选项:展示部门与联系方式 */\n variant?: 'default' | 'person';\n}\n\nfunction toDisplayValue(\n value: string | number | undefined,\n defaultValue: string | number | undefined,\n multiple: boolean,\n): string | number | (string | number)[] | undefined {\n if (multiple) return value ?? [];\n if (defaultValue !== undefined && value === defaultValue) return undefined;\n return value;\n}\n\nconst FilterSelect: React.FC<FilterSelectProps> = ({\n filterKey,\n label,\n options = [],\n value,\n onChange,\n defaultValue,\n searchable = false,\n multiple = false,\n variant = 'default',\n active,\n hidden,\n display,\n}) => {\n const isPersonVariant = variant === 'person';\n const [open, setOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const displayValue = toDisplayValue(value, defaultValue, multiple);\n const [localValue, setLocalValue] = useState<string | number | (string | number)[] | undefined>(\n displayValue ?? (multiple ? [] : undefined),\n );\n\n // ── 自动注册到 CommonFilter ──\n const registerFn = useFilterRegister();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const handleRemove = useMemo(\n () => () => {\n onChangeRef.current?.(undefined);\n },\n [],\n );\n\n // 同步外部 value 到内部 localValue\n useEffect(() => {\n const nextDisplayValue = toDisplayValue(value, defaultValue, multiple);\n setLocalValue(nextDisplayValue ?? (multiple ? [] : undefined));\n // 外部清空时同时清空搜索文本\n if (\n nextDisplayValue === undefined ||\n nextDisplayValue === null ||\n (Array.isArray(nextDisplayValue) && nextDisplayValue.length === 0)\n ) {\n setSearchText('');\n }\n }, [value, defaultValue, multiple]);\n\n // 从 options 反查 valueLabel\n const valueLabel = useMemo(() => {\n if (multiple) {\n const arr = (localValue as (string | number)[]) || [];\n return arr.length > 0\n ? arr.map((v) => options.find((o) => o.value === v)?.label ?? String(v)).join('、')\n : '';\n }\n if (localValue == null) return '';\n const opt = options.find((o) => o.value === localValue);\n if (!opt) return String(localValue);\n return isPersonVariant ? formatPersonValueLabel(opt as PersonOption) : opt.label;\n }, [options, localValue, multiple, isPersonVariant]);\n\n useEffect(() => {\n if (!registerFn) return;\n const ctx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, ctx)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel && !multiple) {\n // 多选由 CommonFilter 的 clearAll 统一处理,单选直接注册\n registerFn.register(filterKey, {\n label,\n valueLabel,\n onRemove: handleRemove,\n });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, label, hidden, display, multiple, handleRemove]);\n\n const visibilityCtx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) return null;\n\n const filteredOptions = searchText\n ? options.filter((opt) =>\n isPersonVariant\n ? matchPersonOptionSearch(opt as PersonOption, searchText)\n : opt.label.toLowerCase().includes(searchText.toLowerCase()),\n )\n : options;\n\n const handleConfirm = () => {\n onChange?.(localValue as string | number | undefined);\n setOpen(false);\n };\n\n const handleReset = () => {\n setLocalValue(multiple ? [] : undefined);\n setSearchText('');\n onChange?.(undefined);\n setOpen(false);\n };\n\n const handleClickOption = (optVal: string | number) => {\n if (!multiple) {\n const isDefaultOption = defaultValue !== undefined && optVal === defaultValue;\n let next: string | number | undefined;\n if (localValue === optVal || isDefaultOption) {\n next = undefined;\n } else {\n next = optVal;\n }\n setLocalValue(next);\n onChange?.(next);\n setOpen(false); // 单选自动收起\n }\n };\n\n const handleToggleMulti = (optVal: string | number) => {\n const arr = (localValue as (string | number)[]) || [];\n const next = arr.includes(optVal) ? arr.filter((v) => v !== optVal) : [...arr, optVal];\n setLocalValue(next);\n };\n\n return (\n <FilterPopover\n label={label}\n active={\n active ||\n (multiple\n ? Array.isArray(localValue) && localValue.length > 0\n : localValue != null && localValue !== '')\n }\n open={open}\n onOpenChange={setOpen}\n onConfirm={multiple ? handleConfirm : undefined}\n onReset={multiple ? handleReset : undefined}\n >\n {/* 搜索框 */}\n {searchable && (\n <Search\n placeholder={`搜索${label}`}\n allowClear\n size=\"middle\"\n className={classNames('filter-select-search', styles['filter-select-search'])}\n value={searchText}\n onChange={(e) => setSearchText(e.target.value)}\n />\n )}\n\n {/* 选项列表 */}\n <div className={classNames('filter-select-options', styles['filter-select-options'])}>\n {filteredOptions.map((opt) => (\n <div\n key={String(opt.value)}\n className={classNames('filter-select-option', styles['filter-select-option'],\n !multiple &&\n localValue === opt.value &&\n classNames('filter-select-option-selected', styles['filter-select-option-selected']),\n )}\n onClick={() => handleClickOption(opt.value)}\n >\n {multiple && (\n <Checkbox checked={(localValue as (string | number)[])?.includes(opt.value)} />\n )}\n {isPersonVariant ? (\n <PersonOptionRow option={opt as PersonOption} />\n ) : (\n <span>{opt.label}</span>\n )}\n {!multiple && !isPersonVariant && localValue === opt.value && (\n <Check className={classNames('filter-select-option-check', styles['filter-select-option-check'])} />\n )}\n </div>\n ))}\n {filteredOptions.length === 0 && (\n <div className={classNames('filter-select-empty', styles['filter-select-empty'])}>暂无数据</div>\n )}\n </div>\n\n {/* 多选已选 */}\n {multiple && (localValue as (string | number)[])?.length > 0 && (\n <div className={classNames('filter-select-selected-bar', styles['filter-select-selected-bar'])}>\n <div className={classNames('filter-select-selected-label', styles['filter-select-selected-label'])}>已选:</div>\n <Space size={[4, 4]} wrap>\n {(localValue as (string | number)[]).map((v) => {\n const opt = options.find((o) => o.value === v);\n return (\n <span\n key={String(v)}\n className={classNames('filter-select-selected-tag', styles['filter-select-selected-tag'])}\n onClick={() => handleToggleMulti(v)}\n >\n {opt?.label ?? String(v)}\n <X className={classNames('filter-select-selected-remove', styles['filter-select-selected-remove'])} />\n </span>\n );\n })}\n </Space>\n </div>\n )}\n </FilterPopover>\n );\n};\n\nexport default FilterSelect;\nexport type { FilterSelectProps };\n"],"names":["Search","Input","formatPersonValueLabel","opt","parts","matchPersonOptionSearch","keyword","lower","s","toDisplayValue","value","defaultValue","multiple","FilterSelect","filterKey","label","options","onChange","searchable","variant","active","hidden","display","isPersonVariant","open","setOpen","useState","searchText","setSearchText","displayValue","localValue","setLocalValue","registerFn","useFilterRegister","onChangeRef","useRef","handleRemove","useMemo","_a","useEffect","nextDisplayValue","valueLabel","arr","v","o","resolveFilterVisible","filteredOptions","handleConfirm","handleReset","handleClickOption","optVal","isDefaultOption","next","handleToggleMulti","jsxs","FilterPopover","jsx","classNames","styles","Checkbox","PersonOptionRow","Check","Space","X"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ const e = {
2
+ "filter-select-search": "_filter-select-search_1esgk_1",
3
+ "filter-select-options": "_filter-select-options_1esgk_5",
4
+ "filter-select-option": "_filter-select-option_1esgk_5",
5
+ "filter-select-option-selected": "_filter-select-option-selected_1esgk_23",
6
+ "filter-select-option-check": "_filter-select-option-check_1esgk_28",
7
+ "filter-select-empty": "_filter-select-empty_1esgk_34",
8
+ "filter-select-selected-bar": "_filter-select-selected-bar_1esgk_42",
9
+ "filter-select-selected-label": "_filter-select-selected-label_1esgk_49",
10
+ "filter-select-selected-tag": "_filter-select-selected-tag_1esgk_55",
11
+ "filter-select-selected-remove": "_filter-select-selected-remove_1esgk_68"
12
+ };
13
+ export {
14
+ e as default
15
+ };
16
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
@@ -0,0 +1,249 @@
1
+ import { jsxs as F, jsx as m } from "react/jsx-runtime";
2
+ import { ChevronDown as ie, ChevronRight as ne, Check as le, X as oe } from "../../Icons/index.js";
3
+ import { useFetchData as fe } from "../../../hooks/useFetchData.js";
4
+ import { Input as ae, Checkbox as de, Space as he } from "antd";
5
+ import V from "classnames";
6
+ import { useState as R, useEffect as X, useMemo as S, useCallback as j } from "react";
7
+ import pe from "../FilterPopover/index.js";
8
+ import { resolveFilterVisible as Z } from "../types.js";
9
+ import { useFilterRegister as ue } from "../useFilterState.js";
10
+ import u from "./style.module.scss.js";
11
+ import { useMarsunFetch as me } from "../../../provider/context.js";
12
+ const { Search: ge } = ae;
13
+ function _(d, i = 0, g = null) {
14
+ var w;
15
+ const f = [];
16
+ for (const a of d)
17
+ f.push({ id: a.id, name: a.name, depth: i, parentId: g }), (w = a.children) != null && w.length && f.push(..._(a.children, i + 1, a.id));
18
+ return f;
19
+ }
20
+ function xe(d, i) {
21
+ if (!i) return d;
22
+ const g = i.toLowerCase();
23
+ function f(w) {
24
+ var L;
25
+ const a = [];
26
+ for (const n of w) {
27
+ const r = (L = n.children) != null && L.length ? f(n.children) : [];
28
+ (n.name.toLowerCase().includes(g) || r.length > 0) && a.push({ ...n, children: r.length > 0 ? r : void 0 });
29
+ }
30
+ return a;
31
+ }
32
+ return f(d);
33
+ }
34
+ function C(d) {
35
+ var g;
36
+ const i = [];
37
+ for (const f of d)
38
+ (g = f.children) != null && g.length && (i.push(f.id), i.push(...C(f.children)));
39
+ return i;
40
+ }
41
+ function Me(d, i) {
42
+ const g = /* @__PURE__ */ new Map(), f = (w) => {
43
+ for (const a of w)
44
+ g.set(a.id, i(a)), a.children && f(a.children);
45
+ };
46
+ return f(d), g;
47
+ }
48
+ const ze = ({
49
+ filterKey: d,
50
+ label: i,
51
+ treeData: g,
52
+ fetchUrl: f,
53
+ fetchOptions: w,
54
+ transformData: a,
55
+ enabled: L = !0,
56
+ value: n,
57
+ onChange: r,
58
+ showSearch: b = !1,
59
+ multiple: l = !1,
60
+ active: I,
61
+ hidden: D,
62
+ display: P,
63
+ getNodeLabel: $ = (T) => T.name
64
+ }) => {
65
+ const T = me(), { data: K } = fe({
66
+ data: g,
67
+ fetchUrl: f,
68
+ fetchOptions: w,
69
+ transformData: a,
70
+ enabled: L,
71
+ baseUrl: T.baseUrl,
72
+ defaultHeaders: T.headers,
73
+ timeoutMs: T.timeoutMs
74
+ }), x = K ?? [], [ee, y] = R(!1), [h, M] = R(
75
+ n ?? (l ? [] : void 0)
76
+ ), [O, q] = R(/* @__PURE__ */ new Set()), [N, U] = R(""), E = ue(), A = { filterKey: d, label: i, value: n };
77
+ X(() => {
78
+ M(n ?? (l ? [] : void 0)), n == null && U("");
79
+ }, [n, l]), X(() => {
80
+ x.length && q(new Set(C(x)));
81
+ }, [x]);
82
+ const z = S(
83
+ () => Me(x, $),
84
+ [x, $]
85
+ ), B = S(() => {
86
+ if (!x.length || n == null) return "";
87
+ if (l) {
88
+ const e = n;
89
+ return e.length > 0 ? e.map((t) => z.get(t) ?? t).join("、") : "";
90
+ }
91
+ return z.get(n) ?? "";
92
+ }, [x, n, l, z]);
93
+ X(() => {
94
+ if (E) {
95
+ if (!Z({ display: P, hidden: D }, A)) {
96
+ E.unregister(d);
97
+ return;
98
+ }
99
+ B ? E.register(d, {
100
+ label: i,
101
+ valueLabel: B,
102
+ onRemove: () => r == null ? void 0 : r(l ? [] : void 0)
103
+ }) : E.unregister(d);
104
+ }
105
+ }, [B, d, i, P, D, E, r, l, A]);
106
+ const k = S(
107
+ () => b && N ? xe(x, N) : x,
108
+ [b, N, x]
109
+ ), G = S(() => _(k), [k]), te = S(() => {
110
+ const e = /* @__PURE__ */ new Map(), t = (o) => {
111
+ var c;
112
+ for (const s of o)
113
+ e.set(s.id, !!((c = s.children) != null && c.length)), s.children && t(s.children);
114
+ };
115
+ return t(k), e;
116
+ }, [k]), H = S(() => {
117
+ const e = /* @__PURE__ */ new Map(), t = (o) => {
118
+ var c;
119
+ for (const s of o)
120
+ if ((c = s.children) != null && c.length) {
121
+ const p = [], v = (W) => {
122
+ var Y;
123
+ p.push(W.id), (Y = W.children) == null || Y.forEach(v);
124
+ };
125
+ s.children.forEach(v), e.set(s.id, p), t(s.children);
126
+ }
127
+ };
128
+ return t(k), e;
129
+ }, [k]), J = S(() => {
130
+ const e = /* @__PURE__ */ new Map(), t = (o) => {
131
+ var c;
132
+ for (const s of o)
133
+ if ((c = s.children) != null && c.length) {
134
+ for (const p of s.children) e.set(p.id, s.id);
135
+ t(s.children);
136
+ }
137
+ };
138
+ return t(k), e;
139
+ }, [k]), se = j(
140
+ (e) => {
141
+ const t = h === e ? void 0 : e;
142
+ M(t), r == null || r(t), y(!1);
143
+ },
144
+ [h, r]
145
+ ), Q = j(
146
+ (e) => {
147
+ const t = (h || []).slice(), o = H.get(e), c = J.get(e);
148
+ if (o)
149
+ if (t.includes(e)) {
150
+ const p = /* @__PURE__ */ new Set([e, ...o]);
151
+ M(t.filter((v) => !p.has(v)));
152
+ } else
153
+ M([.../* @__PURE__ */ new Set([...t, e, ...o])]);
154
+ else if (t.includes(e)) {
155
+ const s = t.filter((p) => p !== e);
156
+ M(c && s.includes(c) ? s.filter((p) => p !== c) : s);
157
+ } else {
158
+ const s = [...t, e];
159
+ c && (H.get(c) || []).every((v) => s.includes(v)) ? M([.../* @__PURE__ */ new Set([...s, c])]) : M(s);
160
+ }
161
+ },
162
+ [h, H, J]
163
+ ), re = j((e) => {
164
+ q((t) => {
165
+ const o = new Set(t);
166
+ return o.has(e) ? o.delete(e) : o.add(e), o;
167
+ });
168
+ }, []), ce = j(
169
+ (e) => e.parentId === null || b && N ? !0 : O.has(e.parentId),
170
+ [O, b, N]
171
+ );
172
+ return Z({ display: P, hidden: D }, A) ? /* @__PURE__ */ F(
173
+ pe,
174
+ {
175
+ label: i,
176
+ active: I || (l ? (h == null ? void 0 : h.length) > 0 : !!n),
177
+ open: ee,
178
+ onOpenChange: y,
179
+ onConfirm: l ? () => {
180
+ r == null || r(h), y(!1);
181
+ } : void 0,
182
+ onReset: () => {
183
+ const e = l ? [] : void 0;
184
+ M(e), U(""), r == null || r(e), y(!1);
185
+ },
186
+ children: [
187
+ b && /* @__PURE__ */ m(
188
+ ge,
189
+ {
190
+ placeholder: `搜索${i}`,
191
+ allowClear: !0,
192
+ size: "middle",
193
+ className: V("filter-tree-select-search", u["filter-tree-select-search"]),
194
+ value: N,
195
+ onChange: (e) => U(e.target.value)
196
+ }
197
+ ),
198
+ /* @__PURE__ */ F("div", { className: V("filter-tree-select-options", u["filter-tree-select-options"]), children: [
199
+ G.map((e) => {
200
+ if (!ce(e)) return null;
201
+ const t = !te.get(e.id), o = O.has(e.id), c = !l && h === e.id, s = l && (h || []).includes(e.id);
202
+ return /* @__PURE__ */ F(
203
+ "div",
204
+ {
205
+ className: V(
206
+ "filter-tree-select-option",
207
+ u["filter-tree-select-option"],
208
+ c && u["filter-tree-select-option-selected"]
209
+ ),
210
+ style: { paddingLeft: 8 + e.depth * 20 },
211
+ onClick: () => l ? Q(e.id) : se(e.id),
212
+ children: [
213
+ t ? /* @__PURE__ */ m("span", { className: u["filter-tree-select-expand-placeholder"] }) : /* @__PURE__ */ m(
214
+ "span",
215
+ {
216
+ className: u["filter-tree-select-expand-icon"],
217
+ onClick: (p) => {
218
+ p.stopPropagation(), re(e.id);
219
+ },
220
+ children: o || b && N ? /* @__PURE__ */ m(ie, { style: { fontSize: 10 } }) : /* @__PURE__ */ m(ne, { style: { fontSize: 10 } })
221
+ }
222
+ ),
223
+ l && /* @__PURE__ */ m(de, { checked: s }),
224
+ /* @__PURE__ */ m("span", { className: u["filter-tree-select-node-label"], children: e.name }),
225
+ !l && c && /* @__PURE__ */ m(le, { className: u["filter-tree-select-option-check"] })
226
+ ]
227
+ },
228
+ e.id
229
+ );
230
+ }),
231
+ G.length === 0 && /* @__PURE__ */ m("div", { className: u["filter-tree-select-empty"], children: "暂无数据" })
232
+ ] }),
233
+ l && (h == null ? void 0 : h.length) > 0 && /* @__PURE__ */ F("div", { className: u["filter-tree-select-selected-bar"], children: [
234
+ /* @__PURE__ */ m("div", { className: u["filter-tree-select-selected-label"], children: "已选:" }),
235
+ /* @__PURE__ */ m(he, { size: [4, 4], wrap: !0, children: h.map((e) => /* @__PURE__ */ F("span", { className: u["filter-tree-select-selected-tag"], onClick: (t) => {
236
+ t.stopPropagation(), Q(e);
237
+ }, children: [
238
+ z.get(e) ?? e,
239
+ /* @__PURE__ */ m(oe, { className: u["filter-tree-select-selected-remove"] })
240
+ ] }, e)) })
241
+ ] })
242
+ ]
243
+ }
244
+ ) : null;
245
+ };
246
+ export {
247
+ ze as default
248
+ };
249
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterTreeSelect/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronRight, X } from '@/components/Icons';\nimport { useMarsunFetch } from '@/provider';\nimport { useFetchData } from '@/hooks/useFetchData';\nimport { Checkbox, Input, Space } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps } from '../types';\nimport { resolveFilterVisible } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\n\nconst { Search } = Input;\n\nexport interface TreeFilterNode {\n id: string;\n name: string;\n children?: TreeFilterNode[];\n}\n\nexport interface FilterTreeSelectProps extends BaseFilterProps {\n treeData?: TreeFilterNode[];\n fetchUrl?: string;\n fetchOptions?: RequestInit;\n transformData?: (raw: unknown) => TreeFilterNode[];\n enabled?: boolean;\n value?: string | string[] | undefined;\n onChange?: (value: string | string[] | undefined) => void;\n showSearch?: boolean;\n multiple?: boolean;\n /** 自定义节点展示标签(默认 name) */\n getNodeLabel?: (node: TreeFilterNode) => string;\n}\n\ninterface FlatNode {\n id: string;\n name: string;\n depth: number;\n parentId: string | null;\n}\n\nfunction flattenTree(nodes: TreeFilterNode[], depth = 0, parentId: string | null = null): FlatNode[] {\n const result: FlatNode[] = [];\n for (const node of nodes) {\n result.push({ id: node.id, name: node.name, depth, parentId });\n if (node.children?.length) {\n result.push(...flattenTree(node.children, depth + 1, node.id));\n }\n }\n return result;\n}\n\nfunction filterByKeyword(nodes: TreeFilterNode[], keyword: string): TreeFilterNode[] {\n if (!keyword) return nodes;\n const lower = keyword.toLowerCase();\n function matchTree(items: TreeFilterNode[]): TreeFilterNode[] {\n const result: TreeFilterNode[] = [];\n for (const item of items) {\n const children = item.children?.length ? matchTree(item.children) : [];\n const selfMatch = item.name.toLowerCase().includes(lower);\n if (selfMatch || children.length > 0) {\n result.push({ ...item, children: children.length > 0 ? children : undefined });\n }\n }\n return result;\n }\n return matchTree(nodes);\n}\n\nfunction collectExpandableIds(nodes: TreeFilterNode[]): string[] {\n const ids: string[] = [];\n for (const node of nodes) {\n if (node.children?.length) {\n ids.push(node.id);\n ids.push(...collectExpandableIds(node.children));\n }\n }\n return ids;\n}\n\nfunction buildLabelMap(nodes: TreeFilterNode[], getLabel: (n: TreeFilterNode) => string): Map<string, string> {\n const map = new Map<string, string>();\n const walk = (items: TreeFilterNode[]) => {\n for (const n of items) {\n map.set(n.id, getLabel(n));\n if (n.children) walk(n.children);\n }\n };\n walk(nodes);\n return map;\n}\n\nconst FilterTreeSelect: React.FC<FilterTreeSelectProps> = ({\n filterKey,\n label,\n treeData: propsTreeData,\n fetchUrl,\n fetchOptions,\n transformData,\n enabled = true,\n value,\n onChange,\n showSearch = false,\n multiple = false,\n active,\n hidden,\n display,\n getNodeLabel = (n) => n.name,\n}) => {\n const fetchCtx = useMarsunFetch();\n const { data: fetchedTree } = useFetchData<TreeFilterNode[]>({\n data: propsTreeData,\n fetchUrl,\n fetchOptions,\n transformData,\n enabled,\n baseUrl: fetchCtx.baseUrl,\n defaultHeaders: fetchCtx.headers,\n timeoutMs: fetchCtx.timeoutMs,\n });\n\n const sourceTree = fetchedTree ?? [];\n\n const [open, setOpen] = useState(false);\n const [localValue, setLocalValue] = useState<string | string[] | undefined>(\n value ?? (multiple ? [] : undefined),\n );\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\n const [searchText, setSearchText] = useState('');\n\n const registerFn = useFilterRegister();\n const visibilityCtx = { filterKey, label, value };\n\n useEffect(() => {\n setLocalValue(value ?? (multiple ? [] : undefined));\n if (value === undefined || value === null) setSearchText('');\n }, [value, multiple]);\n\n useEffect(() => {\n if (sourceTree.length) {\n setExpandedKeys(new Set(collectExpandableIds(sourceTree)));\n }\n }, [sourceTree]);\n\n const labelMap = useMemo(\n () => buildLabelMap(sourceTree, getNodeLabel),\n [sourceTree, getNodeLabel],\n );\n\n const confirmedValueLabel = useMemo(() => {\n if (!sourceTree.length || 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 }, [sourceTree, value, multiple, labelMap]);\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,\n valueLabel: confirmedValueLabel,\n onRemove: () => onChange?.(multiple ? [] : undefined),\n });\n } else {\n registerFn.unregister(filterKey);\n }\n }, [confirmedValueLabel, filterKey, label, display, hidden, registerFn, onChange, multiple, visibilityCtx]);\n\n const filteredTree = useMemo(\n () => (showSearch && searchText ? filterByKeyword(sourceTree, searchText) : sourceTree),\n [showSearch, searchText, sourceTree],\n );\n\n const flatNodes = useMemo(() => flattenTree(filteredTree), [filteredTree]);\n\n const hasChildrenMap = useMemo(() => {\n const map = new Map<string, boolean>();\n const walk = (nodes: TreeFilterNode[]) => {\n for (const n of nodes) {\n map.set(n.id, !!n.children?.length);\n if (n.children) walk(n.children);\n }\n };\n walk(filteredTree);\n return map;\n }, [filteredTree]);\n\n const childrenMap = useMemo(() => {\n const map = new Map<string, string[]>();\n const walk = (nodes: TreeFilterNode[]) => {\n for (const n of nodes) {\n if (n.children?.length) {\n const childIds: string[] = [];\n const collectAll = (node: TreeFilterNode) => {\n childIds.push(node.id);\n node.children?.forEach(collectAll);\n };\n n.children.forEach(collectAll);\n map.set(n.id, childIds);\n walk(n.children);\n }\n }\n };\n walk(filteredTree);\n return map;\n }, [filteredTree]);\n\n const parentMap = useMemo(() => {\n const map = new Map<string, string>();\n const walk = (nodes: TreeFilterNode[]) => {\n for (const n of nodes) {\n if (n.children?.length) {\n for (const child of n.children) map.set(child.id, n.id);\n walk(n.children);\n }\n }\n };\n walk(filteredTree);\n return map;\n }, [filteredTree]);\n\n const handleSingleSelect = useCallback(\n (nodeId: string) => {\n const next = localValue === nodeId ? undefined : nodeId;\n setLocalValue(next);\n onChange?.(next);\n setOpen(false);\n },\n [localValue, onChange],\n );\n\n const handleToggleMulti = useCallback(\n (nodeId: string) => {\n const arr = ((localValue as string[]) || []).slice();\n const childIds = childrenMap.get(nodeId);\n const parentId = parentMap.get(nodeId);\n if (childIds) {\n const isChecked = arr.includes(nodeId);\n if (isChecked) {\n const removeSet = new Set([nodeId, ...childIds]);\n setLocalValue(arr.filter((v) => !removeSet.has(v)));\n } else {\n setLocalValue([...new Set([...arr, nodeId, ...childIds])]);\n }\n } else if (arr.includes(nodeId)) {\n const next = arr.filter((v) => v !== nodeId);\n setLocalValue(parentId && next.includes(parentId) ? next.filter((v) => v !== parentId) : next);\n } else {\n const next = [...arr, nodeId];\n if (parentId) {\n const siblingIds = childrenMap.get(parentId) || [];\n if (siblingIds.every((id) => next.includes(id))) {\n setLocalValue([...new Set([...next, parentId])]);\n } else {\n setLocalValue(next);\n }\n } else {\n setLocalValue(next);\n }\n }\n },\n [localValue, childrenMap, parentMap],\n );\n\n const toggleExpand = useCallback((nodeId: string) => {\n setExpandedKeys((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n }, []);\n\n const isVisible = useCallback(\n (node: FlatNode) => {\n if (node.parentId === null) return true;\n if (showSearch && searchText) return true;\n return expandedKeys.has(node.parentId);\n },\n [expandedKeys, showSearch, searchText],\n );\n\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) return null;\n\n return (\n <FilterPopover\n label={label}\n active={active || (multiple ? (localValue as string[])?.length > 0 : !!value)}\n open={open}\n onOpenChange={setOpen}\n onConfirm={multiple ? () => { onChange?.(localValue); setOpen(false); } : undefined}\n onReset={() => {\n const next = multiple ? [] : undefined;\n setLocalValue(next);\n setSearchText('');\n onChange?.(next);\n setOpen(false);\n }}\n >\n {showSearch && (\n <Search\n placeholder={`搜索${label}`}\n allowClear\n size=\"middle\"\n className={classNames('filter-tree-select-search', styles['filter-tree-select-search'])}\n value={searchText}\n onChange={(e) => setSearchText(e.target.value)}\n />\n )}\n <div className={classNames('filter-tree-select-options', styles['filter-tree-select-options'])}>\n {flatNodes.map((node) => {\n if (!isVisible(node)) return null;\n const isLeaf = !hasChildrenMap.get(node.id);\n const isExpanded = expandedKeys.has(node.id);\n const isSingleSelected = !multiple && localValue === node.id;\n const isMultiChecked = multiple && ((localValue as string[]) || []).includes(node.id);\n return (\n <div\n key={node.id}\n className={classNames(\n 'filter-tree-select-option',\n styles['filter-tree-select-option'],\n isSingleSelected && styles['filter-tree-select-option-selected'],\n )}\n style={{ paddingLeft: 8 + node.depth * 20 }}\n onClick={() => (multiple ? handleToggleMulti(node.id) : handleSingleSelect(node.id))}\n >\n {!isLeaf ? (\n <span\n className={styles['filter-tree-select-expand-icon']}\n onClick={(e) => { e.stopPropagation(); toggleExpand(node.id); }}\n >\n {isExpanded || (showSearch && !!searchText) ? <ChevronDown style={{ fontSize: 10 }} /> : <ChevronRight style={{ fontSize: 10 }} />}\n </span>\n ) : (\n <span className={styles['filter-tree-select-expand-placeholder']} />\n )}\n {multiple && <Checkbox checked={isMultiChecked} />}\n <span className={styles['filter-tree-select-node-label']}>{node.name}</span>\n {!multiple && isSingleSelected && <Check className={styles['filter-tree-select-option-check']} />}\n </div>\n );\n })}\n {flatNodes.length === 0 && <div className={styles['filter-tree-select-empty']}>暂无数据</div>}\n </div>\n {multiple && (localValue as string[])?.length > 0 && (\n <div className={styles['filter-tree-select-selected-bar']}>\n <div className={styles['filter-tree-select-selected-label']}>已选:</div>\n <Space size={[4, 4]} wrap>\n {(localValue as string[]).map((v) => (\n <span key={v} className={styles['filter-tree-select-selected-tag']} onClick={(e) => { e.stopPropagation(); handleToggleMulti(v); }}>\n {labelMap.get(v) ?? v}\n <X className={styles['filter-tree-select-selected-remove']} />\n </span>\n ))}\n </Space>\n </div>\n )}\n </FilterPopover>\n );\n};\n\nexport default FilterTreeSelect;\n"],"names":["Search","Input","flattenTree","nodes","depth","parentId","result","node","_a","filterByKeyword","keyword","lower","matchTree","items","item","children","collectExpandableIds","ids","buildLabelMap","getLabel","map","walk","n","FilterTreeSelect","filterKey","label","propsTreeData","fetchUrl","fetchOptions","transformData","enabled","value","onChange","showSearch","multiple","active","hidden","display","getNodeLabel","fetchCtx","useMarsunFetch","fetchedTree","useFetchData","sourceTree","open","setOpen","useState","localValue","setLocalValue","expandedKeys","setExpandedKeys","searchText","setSearchText","registerFn","useFilterRegister","visibilityCtx","useEffect","labelMap","useMemo","confirmedValueLabel","arr","v","resolveFilterVisible","filteredTree","flatNodes","hasChildrenMap","childrenMap","childIds","collectAll","parentMap","child","handleSingleSelect","useCallback","nodeId","next","handleToggleMulti","removeSet","id","toggleExpand","prev","isVisible","jsxs","FilterPopover","jsx","classNames","styles","isLeaf","isExpanded","isSingleSelected","isMultiChecked","e","ChevronDown","ChevronRight","Checkbox","Check","Space","X"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const e = {
2
+ "filter-tree-select-search": "_filter-tree-select-search_he1ck_1",
3
+ "filter-tree-select-options": "_filter-tree-select-options_he1ck_5",
4
+ "filter-tree-select-option": "_filter-tree-select-option_he1ck_5",
5
+ "filter-tree-select-option-selected": "_filter-tree-select-option-selected_he1ck_23",
6
+ "filter-tree-select-option-check": "_filter-tree-select-option-check_he1ck_28",
7
+ "filter-tree-select-expand-icon": "_filter-tree-select-expand-icon_he1ck_34",
8
+ "filter-tree-select-expand-placeholder": "_filter-tree-select-expand-placeholder_he1ck_44",
9
+ "filter-tree-select-node-label": "_filter-tree-select-node-label_he1ck_50",
10
+ "filter-tree-select-empty": "_filter-tree-select-empty_he1ck_54",
11
+ "filter-tree-select-selected-bar": "_filter-tree-select-selected-bar_he1ck_62",
12
+ "filter-tree-select-selected-label": "_filter-tree-select-selected-label_he1ck_69",
13
+ "filter-tree-select-selected-tag": "_filter-tree-select-selected-tag_he1ck_75",
14
+ "filter-tree-select-selected-remove": "_filter-tree-select-selected-remove_he1ck_88"
15
+ };
16
+ export {
17
+ e as default
18
+ };
19
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -0,0 +1,31 @@
1
+ import { jsxs as n, jsx as t } from "react/jsx-runtime";
2
+ import { ChevronUp as o, ChevronDown as l } from "../../Icons/index.js";
3
+ import e from "classnames";
4
+ import r from "./style.module.scss.js";
5
+ const N = ({
6
+ label: s,
7
+ active: i,
8
+ onClick: c,
9
+ open: g,
10
+ className: f = "",
11
+ children: a
12
+ }) => /* @__PURE__ */ n(
13
+ "span",
14
+ {
15
+ className: e(
16
+ "filter-trigger-root",
17
+ r["filter-trigger-root"],
18
+ i ? ["filter-trigger-active", r["filter-trigger-active"]] : ["filter-trigger-inactive", r["filter-trigger-inactive"]],
19
+ f
20
+ ),
21
+ onClick: c,
22
+ children: [
23
+ a ?? s,
24
+ g !== void 0 ? g ? /* @__PURE__ */ t(o, { className: e("filter-trigger-chevron", r["filter-trigger-chevron"]) }) : /* @__PURE__ */ t(l, { className: e("filter-trigger-chevron", r["filter-trigger-chevron"]) }) : i ? /* @__PURE__ */ t(o, { className: e("filter-trigger-chevron", r["filter-trigger-chevron"]) }) : /* @__PURE__ */ t(l, { className: e("filter-trigger-chevron", r["filter-trigger-chevron"]) })
25
+ ]
26
+ }
27
+ );
28
+ export {
29
+ N as default
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterTrigger/index.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from '@/components/Icons';\nimport classNames from 'classnames';\nimport React from 'react';\nimport type { BaseFilterProps } from '../types';\nimport styles from './style.module.scss';\n\ninterface FilterTriggerProps extends Omit<BaseFilterProps, 'filterKey'> {\n onClick?: (e: React.MouseEvent) => void;\n open?: boolean;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * 筛选触发按钮\n * 未选中:文字 + 下箭头\n * 选中:主题色背景 + 白字 + 上箭头\n */\nconst FilterTrigger: React.FC<FilterTriggerProps> = ({\n label,\n active,\n onClick,\n open,\n className = '',\n children,\n}) => (\n <span\n className={classNames('filter-trigger-root', styles['filter-trigger-root'],\n active\n ? ['filter-trigger-active', styles['filter-trigger-active']]\n : ['filter-trigger-inactive', styles['filter-trigger-inactive']],\n className,\n )}\n onClick={onClick}\n >\n {children ?? label}\n {open !== undefined ? (\n open ? (\n <ChevronUp className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])} />\n ) : (\n <ChevronDown className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])} />\n )\n ) : !active ? (\n <ChevronDown className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])} />\n ) : (\n <ChevronUp className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])} />\n )}\n </span>\n);\n\nexport default FilterTrigger;\nexport type { FilterTriggerProps };\n"],"names":["FilterTrigger","label","active","onClick","open","className","children","jsxs","classNames","styles","ChevronUp","jsx","ChevronDown"],"mappings":";;;;AAkBA,MAAMA,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AACF,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MAAW;AAAA,MAAuBC,EAAO,qBAAqB;AAAA,MACvEP,IACI,CAAC,yBAAyBO,EAAO,uBAAuB,CAAC,IACzD,CAAC,2BAA2BA,EAAO,yBAAyB,CAAC;AAAA,MACjEJ;AAAA,IAAA;AAAA,IAEF,SAAAF;AAAA,IAEC,UAAA;AAAA,MAAAG,KAAYL;AAAA,MACZG,MAAS,SACRA,sBACGM,GAAA,EAAU,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,EAAA,CAAG,IAE9F,gBAAAE,EAACC,GAAA,EAAY,WAAWJ,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,GAAG,IAE/FP,IAGH,gBAAAS,EAACD,KAAU,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,EAAA,CAAG,IAF9F,gBAAAE,EAACC,GAAA,EAAY,WAAWJ,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,GAAG;AAAA,IAEF;AAAA,EAAA;AAElG;"}
@@ -0,0 +1,10 @@
1
+ const r = {
2
+ "filter-trigger-root": "_filter-trigger-root_115kh_1",
3
+ "filter-trigger-active": "_filter-trigger-active_115kh_12",
4
+ "filter-trigger-inactive": "_filter-trigger-inactive_115kh_17",
5
+ "filter-trigger-chevron": "_filter-trigger-chevron_115kh_25"
6
+ };
7
+ export {
8
+ r as default
9
+ };
10
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,12 @@
1
+ import { resolveMaybeFn as i } from "../../utils/resolveMaybeFn.js";
2
+ function n(e, r = {}) {
3
+ return e === void 0 ? !1 : i(e, r, !1);
4
+ }
5
+ function t(e, r = {}) {
6
+ return e.display !== void 0 ? i(e.display, r, !0) : !n(e.hidden, r);
7
+ }
8
+ export {
9
+ t as resolveFilterVisible,
10
+ n as resolveHidden
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../src/components/Filter/types.ts"],"sourcesContent":["import type { MaybeFn, Visibility } from '@/utils/resolveMaybeFn';\nimport { resolveMaybeFn } from '@/utils/resolveMaybeFn';\n\n/** 筛选选项基础类型 */\nexport interface FilterOption {\n label: string;\n value: string | number;\n}\n\n/** 人员展示选项(仅 UI 字段,数据由消费方提供) */\nexport interface PersonOption extends FilterOption {\n departmentName?: string;\n email?: string;\n phone?: string;\n employeeId?: string;\n}\n\n/** 已选项 */\nexport interface SelectedItem {\n key: string;\n label: string;\n valueLabel: string;\n onRemove: () => void;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: string;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析 hidden(兼容旧 API,支持 MaybeFn) */\nexport function resolveHidden(\n hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (hidden === undefined) return false;\n return resolveMaybeFn(hidden, ctx, false);\n}\n\n/** 根据 display / hidden 计算筛选项是否可见 */\nexport function resolveFilterVisible(\n props: Pick<BaseFilterProps, 'display' | 'hidden'>,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (props.display !== undefined) {\n return resolveMaybeFn(props.display, ctx, true);\n }\n return !resolveHidden(props.hidden, ctx);\n}\n"],"names":["resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";AAuCO,SAASA,EACdC,GACAC,IAA+B,IACtB;AACT,SAAID,MAAW,SAAkB,KAC1BE,EAAeF,GAAQC,GAAK,EAAK;AAC1C;AAGO,SAASE,EACdC,GACAH,IAA+B,IACtB;AACT,SAAIG,EAAM,YAAY,SACbF,EAAeE,EAAM,SAASH,GAAK,EAAI,IAEzC,CAACF,EAAcK,EAAM,QAAQH,CAAG;AACzC;"}