refactor: Simplify folder ancestor expansion logic and refine onCreateFolder parentId type.
This commit is contained in:
@@ -229,7 +229,6 @@ const useDocumentsPanelProps = (props: UseDocumentsPanelPropsArgs) => {
|
|||||||
selectFolder,
|
selectFolder,
|
||||||
tagLookupById,
|
tagLookupById,
|
||||||
activeTagFilters,
|
activeTagFilters,
|
||||||
activeCorrespondentFilters,
|
|
||||||
tags,
|
tags,
|
||||||
ensureAssetUrl,
|
ensureAssetUrl,
|
||||||
getDocumentAsset,
|
getDocumentAsset,
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user