@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.
- package/dist/components/Auth/UserProfileCard/UserProfileCard.d.ts +7 -1
- package/dist/components/Auth/UserProfileCard/UserProfileCard.js +59 -28
- package/dist/components/Auth/UserProfileCard/UserProfileCard.js.map +1 -1
- package/dist/components/Auth/UserProfileCard/style.module.scss.js +16 -10
- package/dist/components/Auth/UserProfileCard/style.module.scss.js.map +1 -1
- package/dist/components/Filter/CommonFilter/index.js +88 -53
- package/dist/components/Filter/CommonFilter/index.js.map +1 -1
- package/dist/components/Filter/FilterCascader/index.d.ts +40 -0
- package/dist/components/Filter/FilterCascader/index.js +318 -0
- package/dist/components/Filter/FilterCascader/index.js.map +1 -0
- package/dist/components/Filter/FilterCascader/style.module.scss.js +14 -0
- package/dist/components/Filter/FilterCascader/style.module.scss.js.map +1 -0
- package/dist/components/Filter/FilterDatePicker/index.js +102 -84
- package/dist/components/Filter/FilterDatePicker/index.js.map +1 -1
- package/dist/components/Filter/FilterDateRange/index.js +84 -66
- package/dist/components/Filter/FilterDateRange/index.js.map +1 -1
- package/dist/components/Filter/FilterInput/index.js +51 -33
- package/dist/components/Filter/FilterInput/index.js.map +1 -1
- package/dist/components/Filter/FilterNumberRange/index.js +87 -69
- package/dist/components/Filter/FilterNumberRange/index.js.map +1 -1
- package/dist/components/Filter/FilterPopover/index.d.ts +2 -0
- package/dist/components/Filter/FilterPopover/index.js +22 -21
- package/dist/components/Filter/FilterPopover/index.js.map +1 -1
- package/dist/components/Filter/FilterSelect/index.d.ts +20 -2
- package/dist/components/Filter/FilterSelect/index.js +237 -194
- package/dist/components/Filter/FilterSelect/index.js.map +1 -1
- package/dist/components/Filter/FilterSelect/style.module.scss.js +16 -14
- package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -1
- package/dist/components/Filter/FilterTreeSelect/index.d.ts +18 -1
- package/dist/components/Filter/FilterTreeSelect/index.js +278 -218
- package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -1
- package/dist/components/Filter/FilterTreeSelect/style.module.scss.js +15 -13
- package/dist/components/Filter/FilterTreeSelect/style.module.scss.js.map +1 -1
- package/dist/components/Filter/FilterTrigger/index.d.ts +3 -0
- package/dist/components/Filter/FilterTrigger/index.js +59 -26
- package/dist/components/Filter/FilterTrigger/index.js.map +1 -1
- package/dist/components/Filter/FilterTrigger/style.module.scss.js +5 -4
- package/dist/components/Filter/FilterTrigger/style.module.scss.js.map +1 -1
- package/dist/components/Filter/index.d.ts +7 -3
- package/dist/components/Filter/types.d.ts +27 -1
- package/dist/components/Filter/types.js +24 -7
- package/dist/components/Filter/types.js.map +1 -1
- package/dist/components/Filter/useFilterState.d.ts +37 -5
- package/dist/components/Filter/useFilterState.js +74 -23
- package/dist/components/Filter/useFilterState.js.map +1 -1
- package/dist/components/Table/ColumnConfigPanel.d.ts +13 -0
- package/dist/components/Table/ColumnConfigPanel.js +260 -0
- package/dist/components/Table/ColumnConfigPanel.js.map +1 -0
- package/dist/components/Table/Table.d.ts +16 -2
- package/dist/components/Table/Table.js +106 -28
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Table/columnConfig.module.scss.js +38 -0
- package/dist/components/Table/columnConfig.module.scss.js.map +1 -0
- package/dist/components/Table/columnConfigTypes.d.ts +22 -0
- package/dist/components/Table/columnConfigUtils.d.ts +25 -0
- package/dist/components/Table/columnConfigUtils.js +141 -0
- package/dist/components/Table/columnConfigUtils.js.map +1 -0
- package/dist/components/Table/index.d.ts +2 -1
- package/dist/index.js +289 -276
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +1 -1
|
@@ -1 +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 /**\n * 仅叶子写入最终值。\n * - 单选:点父节点只展开\n * - 多选:点父节点 / 勾选框 = 全选或取消其下全部叶子;父勾选框支持半选\n */\n leafOnly?: 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(\n nodes: TreeFilterNode[],\n depth = 0,\n parentId: string | null = null,\n): 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(\n nodes: TreeFilterNode[],\n getLabel: (n: TreeFilterNode) => string,\n): 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 leafOnly = 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 }, [\n confirmedValueLabel,\n filterKey,\n label,\n display,\n hidden,\n registerFn,\n onChange,\n multiple,\n visibilityCtx,\n ]);\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 leafDescendantsMap = useMemo(() => {\n const map = new Map<string, string[]>();\n const walk = (nodes: TreeFilterNode[]) => {\n for (const n of nodes) {\n if (!n.children?.length) continue;\n const leaves: string[] = [];\n const collectLeaves = (node: TreeFilterNode) => {\n if (!node.children?.length) {\n leaves.push(node.id);\n return;\n }\n node.children.forEach(collectLeaves);\n };\n n.children.forEach(collectLeaves);\n map.set(n.id, leaves);\n walk(n.children);\n }\n };\n walk(filteredTree);\n return map;\n }, [filteredTree]);\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 handleSingleSelect = useCallback(\n (nodeId: string) => {\n if (leafOnly && hasChildrenMap.get(nodeId)) {\n toggleExpand(nodeId);\n return;\n }\n const next = localValue === nodeId ? undefined : nodeId;\n setLocalValue(next);\n onChange?.(next);\n setOpen(false);\n },\n [localValue, onChange, leafOnly, hasChildrenMap, toggleExpand],\n );\n\n const handleToggleMulti = useCallback(\n (nodeId: string) => {\n const arr = ((localValue as string[]) || []).slice();\n const childIds = childrenMap.get(nodeId);\n const leafIds = leafDescendantsMap.get(nodeId);\n const parentId = parentMap.get(nodeId);\n\n // leafOnly:点父节点 = 全选/取消其下全部叶子(值里不写入父 id)\n if (leafOnly && leafIds?.length) {\n const allLeavesSelected = leafIds.every((id) => arr.includes(id));\n if (allLeavesSelected) {\n const remove = new Set(leafIds);\n setLocalValue(arr.filter((v) => !remove.has(v)));\n } else {\n setLocalValue([...new Set([...arr, ...leafIds])]);\n }\n return;\n }\n\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(\n parentId && next.includes(parentId) ? next.filter((v) => v !== parentId) : next,\n );\n } else {\n const next = [...arr, nodeId];\n if (parentId && !leafOnly) {\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, leafOnly, leafDescendantsMap],\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={\n multiple\n ? () => {\n let next = localValue;\n if (leafOnly && Array.isArray(next)) {\n next = next.filter((id) => !hasChildrenMap.get(id));\n }\n onChange?.(next);\n setOpen(false);\n }\n : undefined\n }\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\n className={classNames('filter-tree-select-options', styles['filter-tree-select-options'])}\n >\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 selectedArr = multiple ? (localValue as string[]) || [] : [];\n let isMultiChecked = multiple && selectedArr.includes(node.id);\n let isIndeterminate = false;\n if (multiple && leafOnly && !isLeaf) {\n const leaves = leafDescendantsMap.get(node.id) || [];\n const selectedLeafCount = leaves.filter((id) => selectedArr.includes(id)).length;\n isMultiChecked = leaves.length > 0 && selectedLeafCount === leaves.length;\n isIndeterminate = selectedLeafCount > 0 && selectedLeafCount < leaves.length;\n }\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) => {\n e.stopPropagation();\n toggleExpand(node.id);\n }}\n >\n {isExpanded || (showSearch && !!searchText) ? (\n <ChevronDown style={{ fontSize: 10 }} />\n ) : (\n <ChevronRight style={{ fontSize: 10 }} />\n )}\n </span>\n ) : (\n <span className={styles['filter-tree-select-expand-placeholder']} />\n )}\n {multiple && (\n <Checkbox\n checked={isMultiChecked}\n indeterminate={isIndeterminate}\n onClick={(e) => e.stopPropagation()}\n onChange={() => handleToggleMulti(node.id)}\n />\n )}\n <span className={styles['filter-tree-select-node-label']}>{node.name}</span>\n {!multiple && isSingleSelected && (\n <Check className={styles['filter-tree-select-option-check']} />\n )}\n </div>\n );\n })}\n {flatNodes.length === 0 && (\n <div className={styles['filter-tree-select-empty']}>暂无数据</div>\n )}\n </div>\n {multiple &&\n (leafOnly\n ? ((localValue as string[]) || []).some((id) => !hasChildrenMap.get(id))\n : ((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[]) || [])\n .filter((v) => !(leafOnly && hasChildrenMap.get(v)))\n .map((v) => (\n <span\n key={v}\n className={styles['filter-tree-select-selected-tag']}\n onClick={(e) => {\n e.stopPropagation();\n handleToggleMulti(v);\n }}\n >\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","leafOnly","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","leafDescendantsMap","leaves","collectLeaves","toggleExpand","useCallback","nodeId","prev","next","handleSingleSelect","handleToggleMulti","leafIds","id","remove","removeSet","isVisible","jsxs","FilterPopover","jsx","classNames","styles","isLeaf","isExpanded","isSingleSelected","selectedArr","isMultiChecked","isIndeterminate","selectedLeafCount","e","ChevronDown","ChevronRight","Checkbox","Check","Space","X"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterTreeSelect/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronRight, X } from '@/components/Icons';\nimport { Empty } from '@/components/Empty';\nimport { useMarsunFetch } from '@/provider';\nimport { useFetchData } from '@/hooks/useFetchData';\nimport { Checkbox, Input, Space, Spin } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\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 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 /**\n * 按依赖值动态拉取树数据(优先于 fetchUrl;若同时传 treeData 则仍以 treeData 为准)。\n */\n loadData?: (ctx: FilterLoadDataContext) => Promise<TreeFilterNode[]>;\n enabled?: boolean;\n value?: string | string[] | undefined;\n onChange?: (value: string | string[] | undefined) => void;\n showSearch?: boolean;\n multiple?: boolean;\n /**\n * 仅叶子写入最终值。\n * - 单选:点父节点只展开\n * - 多选:点父节点 / 勾选框 = 全选或取消其下全部叶子;父勾选框支持半选\n */\n leafOnly?: boolean;\n /** 自定义节点展示标签(默认 name) */\n getNodeLabel?: (node: TreeFilterNode) => string;\n /**\n * 面板内嵌从属条件(与 search 同层:search 下方、树列表上方)。\n * 用于「属性筛服务本树」等场景;禁止再嵌 Filter*(双重 Popover)。\n */\n panelExtra?: React.ReactNode;\n /** 面板宽度;有 panelExtra 时默认 460 */\n panelWidth?: number;\n /**\n * 选项加载中:Filter Item(Trigger)显示 Loader2 spin;\n * 面板列表区显示 Spin,不渲染空态。\n * 与内部 fetchUrl / loadData loading 取或。\n */\n loading?: boolean;\n}\n\ninterface FlatNode {\n id: string;\n name: string;\n depth: number;\n parentId: string | null;\n}\n\nfunction flattenTree(\n nodes: TreeFilterNode[],\n depth = 0,\n parentId: string | null = null,\n): 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(\n nodes: TreeFilterNode[],\n getLabel: (n: TreeFilterNode) => string,\n): 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 loadData,\n enabled = true,\n value,\n onChange,\n showSearch = false,\n multiple = false,\n leafOnly = false,\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\n const resolvedPanelWidth = panelWidth ?? (panelExtra ? 460 : undefined);\n\n const { resolvedLabel, values, depsKey } = useFilterFieldBridge({\n filterKey,\n value,\n label,\n dependsOn,\n clearOnDepsChange,\n onDepsClear: () => onChangeRef.current?.(multiple ? [] : undefined),\n });\n\n const fetchCtx = useMarsunFetch();\n const useStaticOrUrl = propsTreeData != null || (!loadData && !!fetchUrl);\n const { data: fetchedTree, loading: fetchLoading } = useFetchData<TreeFilterNode[]>({\n data: propsTreeData,\n fetchUrl: useStaticOrUrl && !loadData ? fetchUrl : undefined,\n fetchOptions,\n transformData,\n enabled: enabled && useStaticOrUrl && !loadData,\n baseUrl: fetchCtx.baseUrl,\n defaultHeaders: fetchCtx.headers,\n timeoutMs: fetchCtx.timeoutMs,\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 || !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 // values 已由 depsKey 覆盖;避免无 dependsOn 时随 values 全表抖动\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [depsKey, enabled, propsTreeData, loadData]);\n\n const sourceTree = propsTreeData ?? (loadData ? loadedTree : (fetchedTree ?? []));\n const optionsLoading = loadingProp || fetchLoading || loadDataLoading;\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: resolvedLabel, 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: resolvedLabel,\n valueLabel: confirmedValueLabel,\n onRemove: () => onChange?.(multiple ? [] : undefined),\n });\n } else {\n registerFn.unregister(filterKey);\n }\n }, [\n confirmedValueLabel,\n filterKey,\n resolvedLabel,\n display,\n hidden,\n registerFn,\n onChange,\n multiple,\n visibilityCtx,\n ]);\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 leafDescendantsMap = useMemo(() => {\n const map = new Map<string, string[]>();\n const walk = (nodes: TreeFilterNode[]) => {\n for (const n of nodes) {\n if (!n.children?.length) continue;\n const leaves: string[] = [];\n const collectLeaves = (node: TreeFilterNode) => {\n if (!node.children?.length) {\n leaves.push(node.id);\n return;\n }\n node.children.forEach(collectLeaves);\n };\n n.children.forEach(collectLeaves);\n map.set(n.id, leaves);\n walk(n.children);\n }\n };\n walk(filteredTree);\n return map;\n }, [filteredTree]);\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 handleSingleSelect = useCallback(\n (nodeId: string) => {\n if (leafOnly && hasChildrenMap.get(nodeId)) {\n toggleExpand(nodeId);\n return;\n }\n const next = localValue === nodeId ? undefined : nodeId;\n setLocalValue(next);\n onChange?.(next);\n setOpen(false);\n },\n [localValue, onChange, leafOnly, hasChildrenMap, toggleExpand],\n );\n\n const handleToggleMulti = useCallback(\n (nodeId: string) => {\n const arr = ((localValue as string[]) || []).slice();\n const childIds = childrenMap.get(nodeId);\n const leafIds = leafDescendantsMap.get(nodeId);\n const parentId = parentMap.get(nodeId);\n\n // leafOnly:点父节点 = 全选/取消其下全部叶子(值里不写入父 id)\n if (leafOnly && leafIds?.length) {\n const allLeavesSelected = leafIds.every((id) => arr.includes(id));\n if (allLeavesSelected) {\n const remove = new Set(leafIds);\n setLocalValue(arr.filter((v) => !remove.has(v)));\n } else {\n setLocalValue([...new Set([...arr, ...leafIds])]);\n }\n return;\n }\n\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(\n parentId && next.includes(parentId) ? next.filter((v) => v !== parentId) : next,\n );\n } else {\n const next = [...arr, nodeId];\n if (parentId && !leafOnly) {\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, leafOnly, leafDescendantsMap],\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={resolvedLabel}\n active={active || (multiple ? (localValue as string[])?.length > 0 : !!value)}\n loading={optionsLoading}\n open={open}\n onOpenChange={setOpen}\n width={resolvedPanelWidth}\n onConfirm={\n multiple\n ? () => {\n let next = localValue;\n if (leafOnly && Array.isArray(next)) {\n next = next.filter((id) => !hasChildrenMap.get(id));\n }\n onChange?.(next);\n setOpen(false);\n }\n : undefined\n }\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={`搜索${resolvedLabel}`}\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 {panelExtra ? (\n <div\n className={classNames(\n 'filter-tree-select-panel-extra',\n styles['filter-tree-select-panel-extra'],\n )}\n >\n {panelExtra}\n </div>\n ) : null}\n <div\n className={classNames('filter-tree-select-options', styles['filter-tree-select-options'])}\n >\n {optionsLoading ? (\n <div\n className={classNames(\n 'filter-tree-select-loading',\n styles['filter-tree-select-loading'],\n )}\n >\n <Spin size=\"small\" />\n </div>\n ) : flatNodes.length === 0 ? (\n <div\n className={classNames('filter-tree-select-empty', styles['filter-tree-select-empty'])}\n >\n <Empty iconType=\"simple\" description=\"暂无数据\" />\n </div>\n ) : (\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 selectedArr = multiple ? (localValue as string[]) || [] : [];\n let isMultiChecked = multiple && selectedArr.includes(node.id);\n let isIndeterminate = false;\n if (multiple && leafOnly && !isLeaf) {\n const leaves = leafDescendantsMap.get(node.id) || [];\n const selectedLeafCount = leaves.filter((id) => selectedArr.includes(id)).length;\n isMultiChecked = leaves.length > 0 && selectedLeafCount === leaves.length;\n isIndeterminate = selectedLeafCount > 0 && selectedLeafCount < leaves.length;\n }\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={() =>\n multiple ? handleToggleMulti(node.id) : handleSingleSelect(node.id)\n }\n >\n {!isLeaf ? (\n <span\n className={styles['filter-tree-select-expand-icon']}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(node.id);\n }}\n >\n {isExpanded || (showSearch && !!searchText) ? (\n <ChevronDown style={{ fontSize: 10 }} />\n ) : (\n <ChevronRight style={{ fontSize: 10 }} />\n )}\n </span>\n ) : (\n <span className={styles['filter-tree-select-expand-placeholder']} />\n )}\n {multiple && (\n <Checkbox\n checked={isMultiChecked}\n indeterminate={isIndeterminate}\n onClick={(e) => e.stopPropagation()}\n onChange={() => handleToggleMulti(node.id)}\n />\n )}\n <span className={styles['filter-tree-select-node-label']}>{node.name}</span>\n {!multiple && isSingleSelected && (\n <Check className={styles['filter-tree-select-option-check']} />\n )}\n </div>\n );\n })\n )}\n </div>\n {multiple &&\n (leafOnly\n ? ((localValue as string[]) || []).some((id) => !hasChildrenMap.get(id))\n : ((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[]) || [])\n .filter((v) => !(leafOnly && hasChildrenMap.get(v)))\n .map((v) => (\n <span\n key={v}\n className={styles['filter-tree-select-selected-tag']}\n onClick={(e) => {\n e.stopPropagation();\n handleToggleMulti(v);\n }}\n >\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","loadData","enabled","value","onChange","showSearch","multiple","leafOnly","active","hidden","display","dependsOn","clearOnDepsChange","getNodeLabel","panelExtra","panelWidth","loadingProp","onChangeRef","useRef","resolvedPanelWidth","resolvedLabel","values","depsKey","useFilterFieldBridge","fetchCtx","useMarsunFetch","useStaticOrUrl","fetchedTree","fetchLoading","useFetchData","loadedTree","setLoadedTree","useState","loadDataLoading","setLoadDataLoading","loadDataRef","useEffect","cancelled","next","sourceTree","optionsLoading","open","setOpen","localValue","setLocalValue","expandedKeys","setExpandedKeys","searchText","setSearchText","registerFn","useFilterRegister","visibilityCtx","labelMap","useMemo","confirmedValueLabel","arr","v","resolveFilterVisible","filteredTree","flatNodes","hasChildrenMap","childrenMap","childIds","collectAll","parentMap","child","leafDescendantsMap","leaves","collectLeaves","toggleExpand","useCallback","nodeId","prev","handleSingleSelect","handleToggleMulti","leafIds","id","remove","removeSet","isVisible","jsxs","FilterPopover","jsx","classNames","styles","Spin","Empty","isLeaf","isExpanded","isSingleSelected","selectedArr","isMultiChecked","isIndeterminate","selectedLeafCount","e","ChevronDown","ChevronRight","Checkbox","Check","Space","X"],"mappings":"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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
const e = {
|
|
2
|
-
"filter-tree-select-search": "_filter-tree-select-
|
|
3
|
-
"filter-tree-select-
|
|
4
|
-
"filter-tree-select-
|
|
5
|
-
"filter-tree-select-option
|
|
6
|
-
"filter-tree-select-option-
|
|
7
|
-
"filter-tree-select-
|
|
8
|
-
"filter-tree-select-expand-
|
|
9
|
-
"filter-tree-select-
|
|
10
|
-
"filter-tree-select-
|
|
11
|
-
"filter-tree-select-
|
|
12
|
-
"filter-tree-select-
|
|
13
|
-
"filter-tree-select-selected-
|
|
14
|
-
"filter-tree-select-selected-
|
|
2
|
+
"filter-tree-select-search": "_filter-tree-select-search_ifn6c_1",
|
|
3
|
+
"filter-tree-select-panel-extra": "_filter-tree-select-panel-extra_ifn6c_5",
|
|
4
|
+
"filter-tree-select-options": "_filter-tree-select-options_ifn6c_9",
|
|
5
|
+
"filter-tree-select-option": "_filter-tree-select-option_ifn6c_9",
|
|
6
|
+
"filter-tree-select-option-selected": "_filter-tree-select-option-selected_ifn6c_27",
|
|
7
|
+
"filter-tree-select-option-check": "_filter-tree-select-option-check_ifn6c_32",
|
|
8
|
+
"filter-tree-select-expand-icon": "_filter-tree-select-expand-icon_ifn6c_38",
|
|
9
|
+
"filter-tree-select-expand-placeholder": "_filter-tree-select-expand-placeholder_ifn6c_48",
|
|
10
|
+
"filter-tree-select-node-label": "_filter-tree-select-node-label_ifn6c_54",
|
|
11
|
+
"filter-tree-select-empty": "_filter-tree-select-empty_ifn6c_58",
|
|
12
|
+
"filter-tree-select-loading": "_filter-tree-select-loading_ifn6c_66",
|
|
13
|
+
"filter-tree-select-selected-bar": "_filter-tree-select-selected-bar_ifn6c_74",
|
|
14
|
+
"filter-tree-select-selected-label": "_filter-tree-select-selected-label_ifn6c_81",
|
|
15
|
+
"filter-tree-select-selected-tag": "_filter-tree-select-selected-tag_ifn6c_87",
|
|
16
|
+
"filter-tree-select-selected-remove": "_filter-tree-select-selected-remove_ifn6c_100"
|
|
15
17
|
};
|
|
16
18
|
export {
|
|
17
19
|
e as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -3,6 +3,8 @@ import { BaseFilterProps } from '../types';
|
|
|
3
3
|
interface FilterTriggerProps extends Omit<BaseFilterProps, 'filterKey'> {
|
|
4
4
|
onClick?: (e: React.MouseEvent) => void;
|
|
5
5
|
open?: boolean;
|
|
6
|
+
/** 选项加载中:右侧用 Loader2 spin 替换 chevron */
|
|
7
|
+
loading?: boolean;
|
|
6
8
|
className?: string;
|
|
7
9
|
children?: React.ReactNode;
|
|
8
10
|
}
|
|
@@ -10,6 +12,7 @@ interface FilterTriggerProps extends Omit<BaseFilterProps, 'filterKey'> {
|
|
|
10
12
|
* 筛选触发按钮
|
|
11
13
|
* 未选中:灰色文字 + 下箭头
|
|
12
14
|
* 已选:主题色文字 + 浅底 + 上箭头
|
|
15
|
+
* loading:右侧 Loader2 spin(替换 chevron)
|
|
13
16
|
*/
|
|
14
17
|
declare const FilterTrigger: React.FC<FilterTriggerProps>;
|
|
15
18
|
export default FilterTrigger;
|
|
@@ -1,31 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ChevronUp as
|
|
1
|
+
import { jsx as t, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronUp as s, ChevronDown as f, Loader2 as h } from "../../Icons/index.js";
|
|
3
3
|
import e from "classnames";
|
|
4
4
|
import r from "./style.module.scss.js";
|
|
5
|
-
const
|
|
6
|
-
label:
|
|
7
|
-
active:
|
|
8
|
-
onClick:
|
|
9
|
-
open:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
r["filter-trigger-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
)
|
|
5
|
+
const x = ({
|
|
6
|
+
label: g,
|
|
7
|
+
active: o,
|
|
8
|
+
onClick: a,
|
|
9
|
+
open: l,
|
|
10
|
+
loading: i = !1,
|
|
11
|
+
className: c = "",
|
|
12
|
+
children: n
|
|
13
|
+
}) => {
|
|
14
|
+
const v = l !== void 0 ? l ? /* @__PURE__ */ t(
|
|
15
|
+
s,
|
|
16
|
+
{
|
|
17
|
+
className: e("filter-trigger-chevron", r["filter-trigger-chevron"])
|
|
18
|
+
}
|
|
19
|
+
) : /* @__PURE__ */ t(
|
|
20
|
+
f,
|
|
21
|
+
{
|
|
22
|
+
className: e("filter-trigger-chevron", r["filter-trigger-chevron"])
|
|
23
|
+
}
|
|
24
|
+
) : o ? /* @__PURE__ */ t(
|
|
25
|
+
s,
|
|
26
|
+
{
|
|
27
|
+
className: e("filter-trigger-chevron", r["filter-trigger-chevron"])
|
|
28
|
+
}
|
|
29
|
+
) : /* @__PURE__ */ t(
|
|
30
|
+
f,
|
|
31
|
+
{
|
|
32
|
+
className: e("filter-trigger-chevron", r["filter-trigger-chevron"])
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
return /* @__PURE__ */ m(
|
|
36
|
+
"span",
|
|
37
|
+
{
|
|
38
|
+
className: e(
|
|
39
|
+
"filter-trigger-root",
|
|
40
|
+
r["filter-trigger-root"],
|
|
41
|
+
o ? ["filter-trigger-active", r["filter-trigger-active"]] : ["filter-trigger-inactive", r["filter-trigger-inactive"]],
|
|
42
|
+
i && "filter-trigger-loading",
|
|
43
|
+
c
|
|
44
|
+
),
|
|
45
|
+
onClick: a,
|
|
46
|
+
"aria-busy": i || void 0,
|
|
47
|
+
children: [
|
|
48
|
+
n ?? (typeof g == "function" ? null : g),
|
|
49
|
+
i ? /* @__PURE__ */ t(
|
|
50
|
+
h,
|
|
51
|
+
{
|
|
52
|
+
spin: !0,
|
|
53
|
+
size: 12,
|
|
54
|
+
className: e("filter-trigger-loader", r["filter-trigger-loader"])
|
|
55
|
+
}
|
|
56
|
+
) : v
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
28
61
|
export {
|
|
29
|
-
|
|
62
|
+
x as default
|
|
30
63
|
};
|
|
31
64
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterTrigger/index.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp, Loader2 } 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 /** 选项加载中:右侧用 Loader2 spin 替换 chevron */\n loading?: boolean;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * 筛选触发按钮\n * 未选中:灰色文字 + 下箭头\n * 已选:主题色文字 + 浅底 + 上箭头\n * loading:右侧 Loader2 spin(替换 chevron)\n */\nconst FilterTrigger: React.FC<FilterTriggerProps> = ({\n label,\n active,\n onClick,\n open,\n loading = false,\n className = '',\n children,\n}) => {\n const chevron =\n open !== undefined ? (\n open ? (\n <ChevronUp\n className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])}\n />\n ) : (\n <ChevronDown\n className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])}\n />\n )\n ) : !active ? (\n <ChevronDown\n className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])}\n />\n ) : (\n <ChevronUp\n className={classNames('filter-trigger-chevron', styles['filter-trigger-chevron'])}\n />\n );\n\n return (\n <span\n className={classNames(\n 'filter-trigger-root',\n styles['filter-trigger-root'],\n active\n ? ['filter-trigger-active', styles['filter-trigger-active']]\n : ['filter-trigger-inactive', styles['filter-trigger-inactive']],\n loading && 'filter-trigger-loading',\n className,\n )}\n onClick={onClick}\n aria-busy={loading || undefined}\n >\n {children ?? (typeof label === 'function' ? null : label)}\n {loading ? (\n <Loader2\n spin\n size={12}\n className={classNames('filter-trigger-loader', styles['filter-trigger-loader'])}\n />\n ) : (\n chevron\n )}\n </span>\n );\n};\n\nexport default FilterTrigger;\nexport type { FilterTriggerProps };\n"],"names":["FilterTrigger","label","active","onClick","open","loading","className","children","chevron","jsx","ChevronUp","classNames","styles","ChevronDown","jsxs","Loader2"],"mappings":";;;;AAqBA,MAAMA,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,UAAAC;AACF,MAAM;AACJ,QAAMC,IACJJ,MAAS,SACPA,IACE,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC;AAAA,IAAA;AAAA,EAAA,IAGlF,gBAAAH;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC;AAAA,IAAA;AAAA,EAAA,IAGjFV,IAKH,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC;AAAA,IAAA;AAAA,EAAA,IALlF,gBAAAH;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC;AAAA,IAAA;AAAA,EAAA;AAQtF,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWH;AAAA,QACT;AAAA,QACAC,EAAO,qBAAqB;AAAA,QAC5BV,IACI,CAAC,yBAAyBU,EAAO,uBAAuB,CAAC,IACzD,CAAC,2BAA2BA,EAAO,yBAAyB,CAAC;AAAA,QACjEP,KAAW;AAAA,QACXC;AAAA,MAAA;AAAA,MAEF,SAAAH;AAAA,MACA,aAAWE,KAAW;AAAA,MAErB,UAAA;AAAA,QAAAE,MAAa,OAAON,KAAU,aAAa,OAAOA;AAAA,QAClDI,IACC,gBAAAI;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,MAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAWJ,EAAW,yBAAyBC,EAAO,uBAAuB,CAAC;AAAA,UAAA;AAAA,QAAA,IAGhFJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const r = {
|
|
2
|
-
"filter-trigger-root": "_filter-trigger-
|
|
3
|
-
"filter-trigger-active": "_filter-trigger-
|
|
4
|
-
"filter-trigger-inactive": "_filter-trigger-
|
|
5
|
-
"filter-trigger-chevron": "_filter-trigger-
|
|
2
|
+
"filter-trigger-root": "_filter-trigger-root_jz9q7_1",
|
|
3
|
+
"filter-trigger-active": "_filter-trigger-active_jz9q7_12",
|
|
4
|
+
"filter-trigger-inactive": "_filter-trigger-inactive_jz9q7_18",
|
|
5
|
+
"filter-trigger-chevron": "_filter-trigger-chevron_jz9q7_26",
|
|
6
|
+
"filter-trigger-loader": "_filter-trigger-loader_jz9q7_30"
|
|
6
7
|
};
|
|
7
8
|
export {
|
|
8
9
|
r as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -8,9 +8,10 @@ import { default as FilterDateRange } from './FilterDateRange';
|
|
|
8
8
|
import { default as FilterDatePicker } from './FilterDatePicker';
|
|
9
9
|
import { default as FilterNumberRange } from './FilterNumberRange';
|
|
10
10
|
import { default as FilterTreeSelect } from './FilterTreeSelect';
|
|
11
|
+
import { default as FilterCascader, treeToCascaderOptions } from './FilterCascader';
|
|
11
12
|
export type { CommonFilterProps } from './CommonFilter';
|
|
12
|
-
export type { BaseFilterProps, FilterOption, PersonOption, SelectedItem } from './types';
|
|
13
|
-
export { resolveHidden } from './types';
|
|
13
|
+
export type { BaseFilterProps, FilterOption, FilterLabel, FilterLabelContext, FilterLoadDataContext, PersonOption, SelectedItem, } from './types';
|
|
14
|
+
export { resolveHidden, resolveFilterLabel, resolveFilterVisible, normalizeDependsOn, buildDepsKey, } from './types';
|
|
14
15
|
export { CommonFilter };
|
|
15
16
|
export type { FilterTriggerProps } from './FilterTrigger';
|
|
16
17
|
export { FilterTrigger };
|
|
@@ -30,4 +31,7 @@ export type { FilterNumberRangeProps } from './FilterNumberRange';
|
|
|
30
31
|
export { FilterNumberRange };
|
|
31
32
|
export type { FilterTreeSelectProps, TreeFilterNode } from './FilterTreeSelect';
|
|
32
33
|
export { FilterTreeSelect };
|
|
33
|
-
export {
|
|
34
|
+
export type { FilterCascaderProps, CascaderPath } from './FilterCascader';
|
|
35
|
+
export { FilterCascader, treeToCascaderOptions };
|
|
36
|
+
export { useFilterState, useFilterRegister, useFilterDeps, useFilterFieldBridge, FilterProvider, } from './useFilterState';
|
|
37
|
+
export type { FilterContextValue } from './useFilterState';
|
|
@@ -21,17 +21,43 @@ export interface SelectedItem {
|
|
|
21
21
|
/** 为 false 时不允许移除(如多选至少保留一项) */
|
|
22
22
|
removable?: boolean;
|
|
23
23
|
}
|
|
24
|
+
/** 动态 label 上下文(可读其它筛选项当前值) */
|
|
25
|
+
export type FilterLabelContext = {
|
|
26
|
+
values: Record<string, unknown>;
|
|
27
|
+
};
|
|
28
|
+
/** label:静态文案,或根据其它筛选项值动态生成 */
|
|
29
|
+
export type FilterLabel = string | ((ctx: FilterLabelContext) => string);
|
|
30
|
+
/** loadData 回调上下文 */
|
|
31
|
+
export type FilterLoadDataContext = {
|
|
32
|
+
values: Record<string, unknown>;
|
|
33
|
+
keyword?: string;
|
|
34
|
+
};
|
|
24
35
|
/** 所有筛选组件共用的 Props */
|
|
25
36
|
export interface BaseFilterProps {
|
|
26
37
|
filterKey: string;
|
|
27
|
-
label:
|
|
38
|
+
label: FilterLabel;
|
|
28
39
|
active?: boolean;
|
|
29
40
|
/** 隐藏;支持 boolean 或 (ctx) => boolean */
|
|
30
41
|
hidden?: Visibility;
|
|
31
42
|
/** 展示;与 hidden 二选一,display 优先 */
|
|
32
43
|
display?: Visibility;
|
|
44
|
+
/**
|
|
45
|
+
* 声明式依赖:其它筛选项的 filterKey。
|
|
46
|
+
* 依赖值变化时,默认清空本项(见 clearOnDepsChange),并触发 loadData(若有)。
|
|
47
|
+
*/
|
|
48
|
+
dependsOn?: string | string[];
|
|
49
|
+
/** 依赖变化时是否清空本项;默认 true */
|
|
50
|
+
clearOnDepsChange?: boolean;
|
|
51
|
+
/** 可选分组标记(文档/示例语义;不做强布局) */
|
|
52
|
+
filterGroup?: string;
|
|
33
53
|
}
|
|
34
54
|
export type FilterVisibilityContext = Record<string, unknown>;
|
|
55
|
+
/** 解析动态 / 静态 label */
|
|
56
|
+
export declare function resolveFilterLabel(label: FilterLabel, values?: Record<string, unknown>): string;
|
|
57
|
+
/** 规范化 dependsOn 为 key 列表 */
|
|
58
|
+
export declare function normalizeDependsOn(dependsOn?: string | string[]): string[];
|
|
59
|
+
/** 从 values 提取依赖快照 key(稳定序列化) */
|
|
60
|
+
export declare function buildDepsKey(dependsOn: string | string[] | undefined, values: Record<string, unknown>): string;
|
|
35
61
|
/** 解析 hidden(兼容旧 API,支持 MaybeFn) */
|
|
36
62
|
export declare function resolveHidden(hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined, ctx?: FilterVisibilityContext): boolean;
|
|
37
63
|
/** 根据 display / hidden 计算筛选项是否可见 */
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
import { resolveMaybeFn as
|
|
2
|
-
function
|
|
3
|
-
return
|
|
1
|
+
import { resolveMaybeFn as o } from "../../utils/resolveMaybeFn.js";
|
|
2
|
+
function s(r, e = {}) {
|
|
3
|
+
return typeof r == "function" ? r({ values: e }) : r;
|
|
4
4
|
}
|
|
5
|
-
function
|
|
6
|
-
return
|
|
5
|
+
function f(r) {
|
|
6
|
+
return r ? Array.isArray(r) ? r.filter(Boolean) : [r] : [];
|
|
7
|
+
}
|
|
8
|
+
function c(r, e) {
|
|
9
|
+
const i = f(r);
|
|
10
|
+
if (!i.length) return "";
|
|
11
|
+
const n = {};
|
|
12
|
+
for (const t of i)
|
|
13
|
+
n[t] = e[t];
|
|
14
|
+
return JSON.stringify(n);
|
|
15
|
+
}
|
|
16
|
+
function u(r, e = {}) {
|
|
17
|
+
return r === void 0 ? !1 : o(r, e, !1);
|
|
18
|
+
}
|
|
19
|
+
function y(r, e = {}) {
|
|
20
|
+
return r.display !== void 0 ? o(r.display, e, !0) : !u(r.hidden, e);
|
|
7
21
|
}
|
|
8
22
|
export {
|
|
9
|
-
|
|
10
|
-
|
|
23
|
+
c as buildDepsKey,
|
|
24
|
+
f as normalizeDependsOn,
|
|
25
|
+
s as resolveFilterLabel,
|
|
26
|
+
y as resolveFilterVisible,
|
|
27
|
+
u as resolveHidden
|
|
11
28
|
};
|
|
12
29
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +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 departmentId?: string;\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 /** 为 false 时不允许移除(如多选至少保留一项) */\n removable?: boolean;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label:
|
|
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 departmentId?: string;\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 /** 为 false 时不允许移除(如多选至少保留一项) */\n removable?: boolean;\n}\n\n/** 动态 label 上下文(可读其它筛选项当前值) */\nexport type FilterLabelContext = {\n values: Record<string, unknown>;\n};\n\n/** label:静态文案,或根据其它筛选项值动态生成 */\nexport type FilterLabel = string | ((ctx: FilterLabelContext) => string);\n\n/** loadData 回调上下文 */\nexport type FilterLoadDataContext = {\n values: Record<string, unknown>;\n keyword?: string;\n};\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: FilterLabel;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n /**\n * 声明式依赖:其它筛选项的 filterKey。\n * 依赖值变化时,默认清空本项(见 clearOnDepsChange),并触发 loadData(若有)。\n */\n dependsOn?: string | string[];\n /** 依赖变化时是否清空本项;默认 true */\n clearOnDepsChange?: boolean;\n /** 可选分组标记(文档/示例语义;不做强布局) */\n filterGroup?: string;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析动态 / 静态 label */\nexport function resolveFilterLabel(\n label: FilterLabel,\n values: Record<string, unknown> = {},\n): string {\n if (typeof label === 'function') {\n return label({ values });\n }\n return label;\n}\n\n/** 规范化 dependsOn 为 key 列表 */\nexport function normalizeDependsOn(dependsOn?: string | string[]): string[] {\n if (!dependsOn) return [];\n return Array.isArray(dependsOn) ? dependsOn.filter(Boolean) : [dependsOn];\n}\n\n/** 从 values 提取依赖快照 key(稳定序列化) */\nexport function buildDepsKey(\n dependsOn: string | string[] | undefined,\n values: Record<string, unknown>,\n): string {\n const keys = normalizeDependsOn(dependsOn);\n if (!keys.length) return '';\n const picked: Record<string, unknown> = {};\n for (const k of keys) {\n picked[k] = values[k];\n }\n return JSON.stringify(picked);\n}\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":["resolveFilterLabel","label","values","normalizeDependsOn","dependsOn","buildDepsKey","keys","picked","k","resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";AAiEO,SAASA,EACdC,GACAC,IAAkC,IAC1B;AACR,SAAI,OAAOD,KAAU,aACZA,EAAM,EAAE,QAAAC,GAAQ,IAElBD;AACT;AAGO,SAASE,EAAmBC,GAAyC;AAC1E,SAAKA,IACE,MAAM,QAAQA,CAAS,IAAIA,EAAU,OAAO,OAAO,IAAI,CAACA,CAAS,IADjD,CAAA;AAEzB;AAGO,SAASC,EACdD,GACAF,GACQ;AACR,QAAMI,IAAOH,EAAmBC,CAAS;AACzC,MAAI,CAACE,EAAK,OAAQ,QAAO;AACzB,QAAMC,IAAkC,CAAA;AACxC,aAAWC,KAAKF;AACd,IAAAC,EAAOC,CAAC,IAAIN,EAAOM,CAAC;AAEtB,SAAO,KAAK,UAAUD,CAAM;AAC9B;AAGO,SAASE,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;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { SelectedItem } from './types';
|
|
2
|
+
import { FilterLabel, SelectedItem } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* 筛选项注册信息
|
|
5
5
|
*/
|
|
@@ -14,14 +14,42 @@ interface FilterRegistration {
|
|
|
14
14
|
removable?: boolean;
|
|
15
15
|
}
|
|
16
16
|
/** Context 类型 */
|
|
17
|
-
interface FilterContextValue {
|
|
17
|
+
export interface FilterContextValue {
|
|
18
18
|
/** 注册筛选条件(有值时调用) */
|
|
19
19
|
register: (key: string, reg: FilterRegistration) => void;
|
|
20
20
|
/** 注销筛选条件(组件卸载或值清空时调用) */
|
|
21
21
|
unregister: (key: string) => void;
|
|
22
|
+
/** 各筛选项原始值(供 dependsOn / 动态 label / loadData) */
|
|
23
|
+
values: Record<string, unknown>;
|
|
24
|
+
/** 上报本项原始值 */
|
|
25
|
+
setFieldValue: (key: string, value: unknown) => void;
|
|
26
|
+
/** 清除本项原始值(卸载 / 隐藏) */
|
|
27
|
+
clearFieldValue: (key: string) => void;
|
|
22
28
|
}
|
|
23
29
|
/** 供子组件使用 —— 在 CommonFilter 内部注册自身状态(不在 CommonFilter 内时安全返回 null) */
|
|
24
30
|
export declare function useFilterRegister(): FilterContextValue | null;
|
|
31
|
+
/** 读取依赖筛选项当前值与稳定 depsKey */
|
|
32
|
+
export declare function useFilterDeps(dependsOn?: string | string[]): {
|
|
33
|
+
values: Record<string, unknown>;
|
|
34
|
+
depsKey: string;
|
|
35
|
+
depKeys: string[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 字段桥接:上报 value、解析动态 label、依赖变化时清空。
|
|
39
|
+
*/
|
|
40
|
+
export declare function useFilterFieldBridge(opts: {
|
|
41
|
+
filterKey: string;
|
|
42
|
+
value: unknown;
|
|
43
|
+
label: FilterLabel;
|
|
44
|
+
dependsOn?: string | string[];
|
|
45
|
+
clearOnDepsChange?: boolean;
|
|
46
|
+
/** 依赖变化时调用(应清空受控 value) */
|
|
47
|
+
onDepsClear?: () => void;
|
|
48
|
+
}): {
|
|
49
|
+
resolvedLabel: string;
|
|
50
|
+
values: Record<string, unknown>;
|
|
51
|
+
depsKey: string;
|
|
52
|
+
};
|
|
25
53
|
interface UseFilterStateReturn {
|
|
26
54
|
/** 所有已注册的筛选项 */
|
|
27
55
|
registrations: Record<string, FilterRegistration>;
|
|
@@ -33,19 +61,23 @@ interface UseFilterStateReturn {
|
|
|
33
61
|
unregister: (key: string) => void;
|
|
34
62
|
/** 清空全部 */
|
|
35
63
|
clearAll: () => void;
|
|
64
|
+
/** 字段原始值 */
|
|
65
|
+
values: Record<string, unknown>;
|
|
66
|
+
setFieldValue: (key: string, value: unknown) => void;
|
|
67
|
+
clearFieldValue: (key: string) => void;
|
|
36
68
|
}
|
|
37
69
|
/**
|
|
38
70
|
* 筛选状态管理 Hook
|
|
39
71
|
*
|
|
40
72
|
* 各 Filter 子组件通过 `register(key, { label, valueLabel, onRemove })` 注册,
|
|
41
73
|
* CommonFilter 自动聚合成 `selectedItems` 展示。
|
|
74
|
+
* 同时维护 `values` 供声明式 dependsOn / 动态 label / loadData。
|
|
42
75
|
*/
|
|
43
76
|
export declare function useFilterState(): UseFilterStateReturn;
|
|
44
77
|
interface FilterProviderProps {
|
|
45
78
|
children: React.ReactNode;
|
|
46
|
-
|
|
47
|
-
ctx: Pick<UseFilterStateReturn, 'register' | 'unregister'>;
|
|
79
|
+
ctx: Pick<UseFilterStateReturn, 'register' | 'unregister' | 'values' | 'setFieldValue' | 'clearFieldValue'>;
|
|
48
80
|
}
|
|
49
|
-
/** 内部 Provider,将 register/unregister 注入给子组件 */
|
|
81
|
+
/** 内部 Provider,将 register/unregister/values 注入给子组件 */
|
|
50
82
|
export declare const FilterProvider: React.FC<FilterProviderProps>;
|
|
51
83
|
export default useFilterState;
|