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,
|
||||
tagLookupById,
|
||||
activeTagFilters,
|
||||
activeCorrespondentFilters,
|
||||
tags,
|
||||
ensureAssetUrl,
|
||||
getDocumentAsset,
|
||||
|
||||
@@ -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<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;
|
||||
}
|
||||
|
||||
setFolderNodes((prev: Map<FolderId, FolderTreeNode>) => {
|
||||
const next = new Map<FolderId, FolderTreeNode>(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;
|
||||
});
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -30,7 +30,7 @@ interface SidebarProps {
|
||||
onFolderDragStart?: (event: React.DragEvent<HTMLDivElement>, folderId: FolderIdentifier) => void;
|
||||
onFolderDragEnd?: (event: React.DragEvent<HTMLDivElement>) => void;
|
||||
draggedFolderId?: FolderIdentifier | null;
|
||||
onCreateFolder?: (parentId?: Identifier | null) => void;
|
||||
onCreateFolder?: (parentId?: FolderIdentifier | null) => void;
|
||||
creatingFolder?: boolean;
|
||||
tags?: TagEntry[];
|
||||
untaggedFilterId?: Identifier | null;
|
||||
|
||||
Reference in New Issue
Block a user