refactor: Simplify folder ancestor expansion logic and refine onCreateFolder parentId type.

This commit is contained in:
2025-11-25 15:21:45 +01:00
parent d6206786f7
commit 13c87f4b07
4 changed files with 10 additions and 24 deletions
@@ -229,7 +229,6 @@ const useDocumentsPanelProps = (props: UseDocumentsPanelPropsArgs) => {
selectFolder, selectFolder,
tagLookupById, tagLookupById,
activeTagFilters, activeTagFilters,
activeCorrespondentFilters,
tags, tags,
ensureAssetUrl, ensureAssetUrl,
getDocumentAsset, getDocumentAsset,
+8 -21
View File
@@ -170,38 +170,25 @@ const useFolderTree = ({
], ],
); );
const expandFolderAncestors = useCallback((targetId: FolderId | null, options: { includeSelf?: boolean } = {}) => { const expandFolderAncestors = useCallback((targetId: FolderId | null) => {
const { includeSelf = true } = options;
if (!targetId || targetId === 'root') { if (!targetId || targetId === 'root') {
setFolderNodes((prev: Map<FolderId, FolderTreeNode>) => {
const root = prev.get('root');
if (!root || root.expanded) return prev;
const next = new Map<FolderId, FolderTreeNode>(prev);
next.set('root', { ...root, expanded: true });
return next;
});
return; return;
} }
setFolderNodes((prev: Map<FolderId, FolderTreeNode>) => { setFolderNodes((prev: Map<FolderId, FolderTreeNode>) => {
const next = new Map<FolderId, FolderTreeNode>(prev); const next = new Map<FolderId, FolderTreeNode>(prev);
let currentId = targetId; const node = next.get(targetId);
let currentId = node?.parentId ?? 'root';
let guard = 0; 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) { while (currentId && guard < 32) {
guard += 1; guard += 1;
const node = next.get(currentId); const currentNode = next.get(currentId);
if (!node) break; if (!currentNode) break;
if (!node.expanded) { if (!currentNode.expanded) {
next.set(currentId, { ...node, expanded: true }); next.set(currentId, { ...currentNode, expanded: true });
} }
currentId = node.parentId ?? 'root'; currentId = currentNode.parentId ?? 'root';
} }
return next; return next;
}); });
@@ -250,7 +250,7 @@ const useFolderTreeActions = ({
const targetId = folderId && folderId !== 'root' ? folderId : 'root'; const targetId = folderId && folderId !== 'root' ? folderId : 'root';
await ensureFolderAncestorsLoaded(targetId); await ensureFolderAncestorsLoaded(targetId);
expandFolderAncestors(targetId, { includeSelf: false }); expandFolderAncestors(targetId);
if (!navigate || immediate) { if (!navigate || immediate) {
await loadFolder(targetId, { preserveSearch: isFilterActive }); await loadFolder(targetId, { preserveSearch: isFilterActive });
+1 -1
View File
@@ -30,7 +30,7 @@ interface SidebarProps {
onFolderDragStart?: (event: React.DragEvent<HTMLDivElement>, folderId: FolderIdentifier) => void; onFolderDragStart?: (event: React.DragEvent<HTMLDivElement>, folderId: FolderIdentifier) => void;
onFolderDragEnd?: (event: React.DragEvent<HTMLDivElement>) => void; onFolderDragEnd?: (event: React.DragEvent<HTMLDivElement>) => void;
draggedFolderId?: FolderIdentifier | null; draggedFolderId?: FolderIdentifier | null;
onCreateFolder?: (parentId?: Identifier | null) => void; onCreateFolder?: (parentId?: FolderIdentifier | null) => void;
creatingFolder?: boolean; creatingFolder?: boolean;
tags?: TagEntry[]; tags?: TagEntry[];
untaggedFilterId?: Identifier | null; untaggedFilterId?: Identifier | null;