From 13c87f4b071dc0d87f686cef635f1d2ee7c48299 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 25 Nov 2025 15:21:45 +0100 Subject: [PATCH] refactor: Simplify folder ancestor expansion logic and refine `onCreateFolder` parentId type. --- .../documents/hooks/useDocumentsPanelProps.ts | 1 - frontend/src/hooks/documents/useFolderTree.ts | 29 +++++-------------- .../hooks/documents/useFolderTreeActions.ts | 2 +- frontend/src/sidebar/Sidebar.tsx | 2 +- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/frontend/src/documents/hooks/useDocumentsPanelProps.ts b/frontend/src/documents/hooks/useDocumentsPanelProps.ts index 124d0ab..483873a 100644 --- a/frontend/src/documents/hooks/useDocumentsPanelProps.ts +++ b/frontend/src/documents/hooks/useDocumentsPanelProps.ts @@ -229,7 +229,6 @@ const useDocumentsPanelProps = (props: UseDocumentsPanelPropsArgs) => { selectFolder, tagLookupById, activeTagFilters, - activeCorrespondentFilters, tags, ensureAssetUrl, getDocumentAsset, diff --git a/frontend/src/hooks/documents/useFolderTree.ts b/frontend/src/hooks/documents/useFolderTree.ts index b0fa3f7..a684a06 100644 --- a/frontend/src/hooks/documents/useFolderTree.ts +++ b/frontend/src/hooks/documents/useFolderTree.ts @@ -170,38 +170,25 @@ const useFolderTree = ({ ], ); - const expandFolderAncestors = useCallback((targetId: FolderId | null, options: { includeSelf?: boolean } = {}) => { - const { includeSelf = true } = options; + const expandFolderAncestors = useCallback((targetId: FolderId | null) => { if (!targetId || targetId === 'root') { - setFolderNodes((prev: Map) => { - const root = prev.get('root'); - if (!root || root.expanded) return prev; - const next = new Map(prev); - next.set('root', { ...root, expanded: true }); - return next; - }); return; } setFolderNodes((prev: Map) => { const next = new Map(prev); - let currentId = targetId; + const node = next.get(targetId); + let currentId = node?.parentId ?? 'root'; let guard = 0; - // If not including self, start from parent - if (!includeSelf) { - const node = next.get(currentId); - currentId = node?.parentId ?? 'root'; - } - while (currentId && guard < 32) { guard += 1; - const node = next.get(currentId); - if (!node) break; - if (!node.expanded) { - next.set(currentId, { ...node, expanded: true }); + const currentNode = next.get(currentId); + if (!currentNode) break; + if (!currentNode.expanded) { + next.set(currentId, { ...currentNode, expanded: true }); } - currentId = node.parentId ?? 'root'; + currentId = currentNode.parentId ?? 'root'; } return next; }); diff --git a/frontend/src/hooks/documents/useFolderTreeActions.ts b/frontend/src/hooks/documents/useFolderTreeActions.ts index 2443621..3eff89b 100644 --- a/frontend/src/hooks/documents/useFolderTreeActions.ts +++ b/frontend/src/hooks/documents/useFolderTreeActions.ts @@ -250,7 +250,7 @@ const useFolderTreeActions = ({ const targetId = folderId && folderId !== 'root' ? folderId : 'root'; await ensureFolderAncestorsLoaded(targetId); - expandFolderAncestors(targetId, { includeSelf: false }); + expandFolderAncestors(targetId); if (!navigate || immediate) { await loadFolder(targetId, { preserveSearch: isFilterActive }); diff --git a/frontend/src/sidebar/Sidebar.tsx b/frontend/src/sidebar/Sidebar.tsx index 1b0a20c..6bbe91e 100644 --- a/frontend/src/sidebar/Sidebar.tsx +++ b/frontend/src/sidebar/Sidebar.tsx @@ -30,7 +30,7 @@ interface SidebarProps { onFolderDragStart?: (event: React.DragEvent, folderId: FolderIdentifier) => void; onFolderDragEnd?: (event: React.DragEvent) => void; draggedFolderId?: FolderIdentifier | null; - onCreateFolder?: (parentId?: Identifier | null) => void; + onCreateFolder?: (parentId?: FolderIdentifier | null) => void; creatingFolder?: boolean; tags?: TagEntry[]; untaggedFilterId?: Identifier | null;