fix: folder click shows overview doc, add same-name filter, move + to header

This commit is contained in:
2026-03-18 20:13:30 +08:00
parent c3ecebea89
commit 8a7f9ad6e8
4 changed files with 86 additions and 55 deletions

View File

@@ -7,6 +7,7 @@ interface DocTreeProps {
files: DocFile[]
selectedPath?: string
onSelect: (file: DocFile) => void
onFolderClick?: (folderPath: string) => void
}
interface TreeNodeProps {
@@ -16,6 +17,7 @@ interface TreeNodeProps {
ancestorsLast: boolean[]
selectedPath?: string
onSelect: (file: DocFile) => void
onFolderClick?: (folderPath: string) => void
expandedSet: Set<string>
onToggle: (path: string) => void
}
@@ -27,6 +29,7 @@ const TreeNode = React.memo(({
ancestorsLast,
selectedPath,
onSelect,
onFolderClick,
expandedSet,
onToggle,
}: TreeNodeProps) => {
@@ -36,32 +39,24 @@ const TreeNode = React.memo(({
const handleClick = () => {
if (isDir) {
onFolderClick?.(file.relativePath)
onToggle(file.relativePath)
} else {
onSelect(file)
}
}
const renderIndent = () => {
const parts: React.ReactNode[] = []
const getIndent = (): string => {
let result = ''
for (let i = 0; i < level; i++) {
const showLine = !ancestorsLast[i]
parts.push(
<span key={i} className="inline-block w-4 text-center text-zinc-600">
{showLine ? '│' : ' '}
</span>
)
result += ancestorsLast[i] ? ' ' : '│ '
}
const connector = isLast ? '└──' : '├──'
parts.push(
<span key="connector" className="text-zinc-500">
{connector}
</span>
)
return parts
result += isLast ? '└─ ' : '├─ '
return result
}
const getIndentWidth = (): number => {
return level * 3 + 3
}
const showChildren = isDir && isExpanded && file.children
@@ -71,7 +66,7 @@ const TreeNode = React.memo(({
<div
onClick={handleClick}
className={clsx(
'flex items-center py-1 cursor-pointer text-sm select-none rounded',
'flex items-center py-0.5 cursor-pointer text-base select-none rounded',
isDir
? 'text-zinc-400 hover:text-zinc-200'
: isSelected
@@ -79,11 +74,14 @@ const TreeNode = React.memo(({
: 'text-zinc-400 hover:text-zinc-200'
)}
>
<span className="font-mono text-xs leading-none">
{renderIndent()}
<span
className="text-zinc-500 font-mono whitespace-pre"
style={{ width: `${getIndentWidth()}ch` }}
>
{getIndent()}
</span>
<span className={clsx(
'ml-1 truncate',
'truncate',
isDir && 'font-medium'
)}>
{getDisplayName(file.name)}
@@ -99,6 +97,7 @@ const TreeNode = React.memo(({
ancestorsLast={[...ancestorsLast, isLast]}
selectedPath={selectedPath}
onSelect={onSelect}
onFolderClick={onFolderClick}
expandedSet={expandedSet}
onToggle={onToggle}
/>
@@ -109,7 +108,7 @@ const TreeNode = React.memo(({
TreeNode.displayName = 'TreeNode'
export const DocTree = ({ files, selectedPath, onSelect }: DocTreeProps) => {
export const DocTree = ({ files, selectedPath, onSelect, onFolderClick }: DocTreeProps) => {
const [expandedSet, setExpandedSet] = useState<Set<string>>(() => {
const set = new Set<string>()
files.forEach(f => {
@@ -141,6 +140,7 @@ export const DocTree = ({ files, selectedPath, onSelect }: DocTreeProps) => {
ancestorsLast={[]}
selectedPath={selectedPath}
onSelect={onSelect}
onFolderClick={onFolderClick}
expandedSet={expandedSet}
onToggle={handleToggle}
/>