@hkyhy/marsun-components-core 0.1.26 → 0.1.28
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/Filter/FilterTreeSelect/index.d.ts +6 -0
- package/dist/components/Filter/FilterTreeSelect/index.js +271 -201
- package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -1
- package/dist/components/Layout/AgentAppShell/AgentAppShell.d.ts +45 -0
- package/dist/components/Layout/AgentAppShell/AgentAppShell.js +103 -0
- package/dist/components/Layout/AgentAppShell/AgentAppShell.js.map +1 -0
- package/dist/components/Layout/AgentAppShell/index.d.ts +2 -0
- package/dist/components/Layout/AgentAppShell/style.module.scss.js +24 -0
- package/dist/components/Layout/AgentAppShell/style.module.scss.js.map +1 -0
- package/dist/components/Layout/index.d.ts +3 -1
- package/dist/index.js +293 -291
- 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 /** 自定义节点展示标签(默认 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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"}
|
|
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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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/** 菜单项:宽松 any,避免业务仓与 core 双份 antd 类型冲突 */
|
|
3
|
+
export type AgentAppShellMenuItems = any;
|
|
4
|
+
export type AgentAppShellProps = {
|
|
5
|
+
/** 侧栏品牌标题 */
|
|
6
|
+
brandTitle: string;
|
|
7
|
+
/** 侧栏品牌图标(默认字母徽章用 brandMark) */
|
|
8
|
+
brandLogo?: React.ReactNode;
|
|
9
|
+
/** 无 brandLogo 时显示的单字/短文案徽章 */
|
|
10
|
+
brandMark?: string;
|
|
11
|
+
/** 侧栏菜单(antd Menu items) */
|
|
12
|
+
menuItems: AgentAppShellMenuItems;
|
|
13
|
+
selectedKeys?: string[];
|
|
14
|
+
onMenuClick?: (info: {
|
|
15
|
+
key: string;
|
|
16
|
+
}) => void;
|
|
17
|
+
/** 侧栏是否折叠 */
|
|
18
|
+
collapsed?: boolean;
|
|
19
|
+
onToggleCollapsed?: () => void;
|
|
20
|
+
/** 侧栏宽度(展开) */
|
|
21
|
+
siderWidth?: number;
|
|
22
|
+
/** 侧栏底部(如 UserProfileCard) */
|
|
23
|
+
siderFooter?: React.ReactNode;
|
|
24
|
+
/** 顶栏标题 */
|
|
25
|
+
headerTitle?: React.ReactNode;
|
|
26
|
+
/** 顶栏描述 */
|
|
27
|
+
headerDescription?: React.ReactNode;
|
|
28
|
+
/** 顶栏右侧操作 */
|
|
29
|
+
headerActions?: React.ReactNode;
|
|
30
|
+
/** 主内容区滚动后顶栏毛玻璃 */
|
|
31
|
+
headerScrolled?: boolean;
|
|
32
|
+
/** 主内容 */
|
|
33
|
+
children: React.ReactNode;
|
|
34
|
+
className?: string;
|
|
35
|
+
/** 根节点额外 class(兼容业务全局选择器) */
|
|
36
|
+
frameClassName?: string;
|
|
37
|
+
siderClassName?: string;
|
|
38
|
+
mainClassName?: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Agent 业务壳:左 sider(品牌 + 菜单 + 底部槽)+ 右主区(顶栏 + children)。
|
|
42
|
+
* 纯 UI;菜单数据、鉴权、路由由业务注入。
|
|
43
|
+
*/
|
|
44
|
+
declare const AgentAppShell: React.FC<AgentAppShellProps>;
|
|
45
|
+
export default AgentAppShell;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsx as e, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
import { PanelLeftOpen as w, PanelLeftClose as y } from "../../Icons/index.js";
|
|
3
|
+
import { Layout as L, Menu as S, Button as j } from "antd";
|
|
4
|
+
import t from "classnames";
|
|
5
|
+
import a from "./style.module.scss.js";
|
|
6
|
+
import z from "../../VirtualScrollbar/VirtualScrollbar/index.js";
|
|
7
|
+
const { Header: P, Sider: B } = L, E = ({
|
|
8
|
+
brandTitle: m,
|
|
9
|
+
brandLogo: c,
|
|
10
|
+
brandMark: g = "A",
|
|
11
|
+
menuItems: o,
|
|
12
|
+
selectedKeys: d,
|
|
13
|
+
onMenuClick: h,
|
|
14
|
+
collapsed: l = !1,
|
|
15
|
+
onToggleCollapsed: s,
|
|
16
|
+
siderWidth: N = 240,
|
|
17
|
+
siderFooter: u,
|
|
18
|
+
headerTitle: i,
|
|
19
|
+
headerDescription: r,
|
|
20
|
+
headerActions: p,
|
|
21
|
+
headerScrolled: b = !1,
|
|
22
|
+
children: f,
|
|
23
|
+
className: v,
|
|
24
|
+
frameClassName: C,
|
|
25
|
+
siderClassName: x,
|
|
26
|
+
mainClassName: A
|
|
27
|
+
}) => {
|
|
28
|
+
const k = g.trim().charAt(0).toUpperCase() || "A";
|
|
29
|
+
return /* @__PURE__ */ e("div", { className: t("agent-app-shell", a["agent-app-shell"], v), children: /* @__PURE__ */ n("div", { className: t("agent-app-frame", a["agent-app-frame"], C), children: [
|
|
30
|
+
/* @__PURE__ */ n(
|
|
31
|
+
B,
|
|
32
|
+
{
|
|
33
|
+
trigger: null,
|
|
34
|
+
collapsible: !0,
|
|
35
|
+
collapsed: l,
|
|
36
|
+
width: N,
|
|
37
|
+
className: t("agent-app-sider", a["agent-app-sider"], x),
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ n(
|
|
40
|
+
z,
|
|
41
|
+
{
|
|
42
|
+
wrapperClassName: t("agent-sider-scroll", a["agent-sider-scroll"]),
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ n("div", { className: t("agent-sider-brand", a["agent-sider-brand"]), children: [
|
|
45
|
+
c ?? /* @__PURE__ */ e("span", { className: a["agent-sider-logo"], children: k }),
|
|
46
|
+
l ? null : /* @__PURE__ */ e("h1", { className: a["agent-sider-title"], children: m })
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ e(
|
|
49
|
+
S,
|
|
50
|
+
{
|
|
51
|
+
mode: "inline",
|
|
52
|
+
inlineCollapsed: l,
|
|
53
|
+
selectedKeys: d,
|
|
54
|
+
items: o,
|
|
55
|
+
onClick: h,
|
|
56
|
+
className: t("agent-app-menu", a["agent-app-menu"])
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
u
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ n("div", { className: t("agent-app-main", a["agent-app-main"], A), children: [
|
|
67
|
+
/* @__PURE__ */ n(
|
|
68
|
+
P,
|
|
69
|
+
{
|
|
70
|
+
className: t(
|
|
71
|
+
a["agent-page-topbar"],
|
|
72
|
+
b && a["agent-page-topbar--scrolled"],
|
|
73
|
+
r ? a["agent-page-topbar--with-description"] : void 0
|
|
74
|
+
),
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ n("div", { className: a["agent-page-topbar-leading"], children: [
|
|
77
|
+
s ? /* @__PURE__ */ e(
|
|
78
|
+
j,
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
className: a["agent-sider-toggle-btn"],
|
|
82
|
+
icon: l ? /* @__PURE__ */ e(w, { size: 18 }) : /* @__PURE__ */ e(y, { size: 18 }),
|
|
83
|
+
onClick: s,
|
|
84
|
+
"aria-label": l ? "展开侧栏" : "收起侧栏"
|
|
85
|
+
}
|
|
86
|
+
) : null,
|
|
87
|
+
i ? /* @__PURE__ */ n("div", { className: a["agent-page-topbar-meta"], children: [
|
|
88
|
+
/* @__PURE__ */ e("h1", { className: a["agent-page-topbar-title"], children: i }),
|
|
89
|
+
r ? /* @__PURE__ */ e("p", { className: a["agent-page-topbar-description"], children: r }) : null
|
|
90
|
+
] }) : null
|
|
91
|
+
] }),
|
|
92
|
+
p ? /* @__PURE__ */ e("div", { className: a["agent-page-topbar-actions"], children: p }) : null
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
f
|
|
97
|
+
] })
|
|
98
|
+
] }) });
|
|
99
|
+
};
|
|
100
|
+
export {
|
|
101
|
+
E as default
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=AgentAppShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentAppShell.js","sources":["../../../../src/components/Layout/AgentAppShell/AgentAppShell.tsx"],"sourcesContent":["import { PanelLeftClose, PanelLeftOpen } from '../../Icons';\nimport { VirtualScrollbar } from '../../VirtualScrollbar';\nimport { Button, Layout, Menu } from 'antd';\nimport classNames from 'classnames';\nimport React from 'react';\nimport styles from './style.module.scss';\n\nconst { Header, Sider } = Layout;\n\n/** 菜单项:宽松 any,避免业务仓与 core 双份 antd 类型冲突 */\nexport type AgentAppShellMenuItems = any;\n\nexport type AgentAppShellProps = {\n /** 侧栏品牌标题 */\n brandTitle: string;\n /** 侧栏品牌图标(默认字母徽章用 brandMark) */\n brandLogo?: React.ReactNode;\n /** 无 brandLogo 时显示的单字/短文案徽章 */\n brandMark?: string;\n /** 侧栏菜单(antd Menu items) */\n menuItems: AgentAppShellMenuItems;\n selectedKeys?: string[];\n onMenuClick?: (info: { key: string }) => void;\n /** 侧栏是否折叠 */\n collapsed?: boolean;\n onToggleCollapsed?: () => void;\n /** 侧栏宽度(展开) */\n siderWidth?: number;\n /** 侧栏底部(如 UserProfileCard) */\n siderFooter?: React.ReactNode;\n /** 顶栏标题 */\n headerTitle?: React.ReactNode;\n /** 顶栏描述 */\n headerDescription?: React.ReactNode;\n /** 顶栏右侧操作 */\n headerActions?: React.ReactNode;\n /** 主内容区滚动后顶栏毛玻璃 */\n headerScrolled?: boolean;\n /** 主内容 */\n children: React.ReactNode;\n className?: string;\n /** 根节点额外 class(兼容业务全局选择器) */\n frameClassName?: string;\n siderClassName?: string;\n mainClassName?: string;\n};\n\n/**\n * Agent 业务壳:左 sider(品牌 + 菜单 + 底部槽)+ 右主区(顶栏 + children)。\n * 纯 UI;菜单数据、鉴权、路由由业务注入。\n */\nconst AgentAppShell: React.FC<AgentAppShellProps> = ({\n brandTitle,\n brandLogo,\n brandMark = 'A',\n menuItems,\n selectedKeys,\n onMenuClick,\n collapsed = false,\n onToggleCollapsed,\n siderWidth = 240,\n siderFooter,\n headerTitle,\n headerDescription,\n headerActions,\n headerScrolled = false,\n children,\n className,\n frameClassName,\n siderClassName,\n mainClassName,\n}) => {\n const mark = brandMark.trim().charAt(0).toUpperCase() || 'A';\n\n return (\n <div className={classNames('agent-app-shell', styles['agent-app-shell'], className)}>\n <div className={classNames('agent-app-frame', styles['agent-app-frame'], frameClassName)}>\n <Sider\n trigger={null}\n collapsible\n collapsed={collapsed}\n width={siderWidth}\n className={classNames('agent-app-sider', styles['agent-app-sider'], siderClassName)}\n >\n <VirtualScrollbar\n wrapperClassName={classNames('agent-sider-scroll', styles['agent-sider-scroll'])}\n >\n <div className={classNames('agent-sider-brand', styles['agent-sider-brand'])}>\n {brandLogo ?? <span className={styles['agent-sider-logo']}>{mark}</span>}\n {!collapsed ? <h1 className={styles['agent-sider-title']}>{brandTitle}</h1> : null}\n </div>\n <Menu\n mode=\"inline\"\n inlineCollapsed={collapsed}\n selectedKeys={selectedKeys}\n items={menuItems as React.ComponentProps<typeof Menu>['items']}\n onClick={onMenuClick as React.ComponentProps<typeof Menu>['onClick']}\n className={classNames('agent-app-menu', styles['agent-app-menu'])}\n />\n </VirtualScrollbar>\n {siderFooter}\n </Sider>\n\n <div className={classNames('agent-app-main', styles['agent-app-main'], mainClassName)}>\n <Header\n className={classNames(\n styles['agent-page-topbar'],\n headerScrolled && styles['agent-page-topbar--scrolled'],\n headerDescription ? styles['agent-page-topbar--with-description'] : undefined,\n )}\n >\n <div className={styles['agent-page-topbar-leading']}>\n {onToggleCollapsed ? (\n <Button\n type=\"text\"\n className={styles['agent-sider-toggle-btn']}\n icon={collapsed ? <PanelLeftOpen size={18} /> : <PanelLeftClose size={18} />}\n onClick={onToggleCollapsed}\n aria-label={collapsed ? '展开侧栏' : '收起侧栏'}\n />\n ) : null}\n {headerTitle ? (\n <div className={styles['agent-page-topbar-meta']}>\n <h1 className={styles['agent-page-topbar-title']}>{headerTitle}</h1>\n {headerDescription ? (\n <p className={styles['agent-page-topbar-description']}>{headerDescription}</p>\n ) : null}\n </div>\n ) : null}\n </div>\n {headerActions ? (\n <div className={styles['agent-page-topbar-actions']}>{headerActions}</div>\n ) : null}\n </Header>\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default AgentAppShell;\n"],"names":["Header","Sider","Layout","AgentAppShell","brandTitle","brandLogo","brandMark","menuItems","selectedKeys","onMenuClick","collapsed","onToggleCollapsed","siderWidth","siderFooter","headerTitle","headerDescription","headerActions","headerScrolled","children","className","frameClassName","siderClassName","mainClassName","mark","classNames","styles","jsxs","VirtualScrollbar","jsx","Menu","Button","PanelLeftOpen","PanelLeftClose"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
"agent-app-shell": "_agent-app-shell_j0exz_1",
|
|
3
|
+
"agent-app-frame": "_agent-app-frame_j0exz_8",
|
|
4
|
+
"agent-app-sider": "_agent-app-sider_j0exz_16",
|
|
5
|
+
"agent-sider-scroll": "_agent-sider-scroll_j0exz_31",
|
|
6
|
+
"agent-sider-brand": "_agent-sider-brand_j0exz_36",
|
|
7
|
+
"agent-sider-logo": "_agent-sider-logo_j0exz_44",
|
|
8
|
+
"agent-sider-title": "_agent-sider-title_j0exz_58",
|
|
9
|
+
"agent-app-menu": "_agent-app-menu_j0exz_69",
|
|
10
|
+
"agent-app-main": "_agent-app-main_j0exz_115",
|
|
11
|
+
"agent-page-topbar": "_agent-page-topbar_j0exz_128",
|
|
12
|
+
"agent-page-topbar--scrolled": "_agent-page-topbar--scrolled_j0exz_143",
|
|
13
|
+
"agent-page-topbar--with-description": "_agent-page-topbar--with-description_j0exz_148",
|
|
14
|
+
"agent-page-topbar-leading": "_agent-page-topbar-leading_j0exz_152",
|
|
15
|
+
"agent-page-topbar-meta": "_agent-page-topbar-meta_j0exz_160",
|
|
16
|
+
"agent-page-topbar-title": "_agent-page-topbar-title_j0exz_164",
|
|
17
|
+
"agent-page-topbar-description": "_agent-page-topbar-description_j0exz_173",
|
|
18
|
+
"agent-sider-toggle-btn": "_agent-sider-toggle-btn_j0exz_180",
|
|
19
|
+
"agent-page-topbar-actions": "_agent-page-topbar-actions_j0exz_189"
|
|
20
|
+
};
|
|
21
|
+
export {
|
|
22
|
+
e as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=style.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,9 @@ export { default as PageHeaderLayout } from './PageHeaderLayout';
|
|
|
2
2
|
export type { PageHeaderLayoutProps } from './PageHeaderLayout';
|
|
3
3
|
export { default as PageSpin } from './PageSpin';
|
|
4
4
|
export type { PageSpinProps } from './PageSpin';
|
|
5
|
-
export { PageShellProvider, usePageShell, usePageShellLoading
|
|
5
|
+
export { PageShellProvider, usePageShell, usePageShellLoading } from './PageShell';
|
|
6
6
|
export type { PageShellMeta, PageShellProviderProps } from './PageShell';
|
|
7
7
|
export { default as ModulePageShell } from './ModulePageShell';
|
|
8
8
|
export type { ModulePageShellProps } from './ModulePageShell';
|
|
9
|
+
export { AgentAppShell } from './AgentAppShell';
|
|
10
|
+
export type { AgentAppShellProps } from './AgentAppShell';
|