diff --git a/src/frontend/apps/drive/src/features/explorer/components/ExplorerDndProvider.tsx b/src/frontend/apps/drive/src/features/explorer/components/ExplorerDndProvider.tsx index 5ed57c6a..ec793c1b 100644 --- a/src/frontend/apps/drive/src/features/explorer/components/ExplorerDndProvider.tsx +++ b/src/frontend/apps/drive/src/features/explorer/components/ExplorerDndProvider.tsx @@ -237,6 +237,11 @@ export const canDrop = (activeItem: Item, overItem: Item | TreeItem) => { const activePathSegments = activePath.split("."); const overPathSegments = overPath.split("."); + // Cannot drop an item into its children + if (overPath.startsWith(activePath)) { + return false; + } + if (activePathSegments.length === 1 && overPathSegments.length === 1) { return activePathSegments[0] === overPathSegments[0]; } diff --git a/src/frontend/apps/drive/src/features/explorer/components/grid/ExplorerGrid.tsx b/src/frontend/apps/drive/src/features/explorer/components/grid/ExplorerGrid.tsx index f83edf43..ca26ceba 100644 --- a/src/frontend/apps/drive/src/features/explorer/components/grid/ExplorerGrid.tsx +++ b/src/frontend/apps/drive/src/features/explorer/components/grid/ExplorerGrid.tsx @@ -97,14 +97,17 @@ export const ExplorerGrid = (props: ExplorerProps) => { ...folder, children: children, }); - item.hasLoadedChildren = true; + item.hasLoadedChildren = + folder.numchild_folder !== undefined && + folder.numchild_folder > 0 && + children.length > 0; return item; } else { const children = itemToTreeItem({ ...folder, children: [], }); - + children.hasLoadedChildren = false; return children; } }); diff --git a/src/frontend/apps/drive/src/features/explorer/components/tree/ExplorerTree.tsx b/src/frontend/apps/drive/src/features/explorer/components/tree/ExplorerTree.tsx index 40d9a990..bc4ebd9b 100644 --- a/src/frontend/apps/drive/src/features/explorer/components/tree/ExplorerTree.tsx +++ b/src/frontend/apps/drive/src/features/explorer/components/tree/ExplorerTree.tsx @@ -21,6 +21,7 @@ import { ExplorerTreeNav } from "./nav/ExplorerTreeNav"; import { addItemsMovedToast } from "../toasts/addItemsMovedToast"; import { ExplorerTreeMoveConfirmationModal } from "./ExplorerTreeMoveConfirmationModal"; import { ExplorerSearchModal } from "../modals/search/ExplorerSearchModal"; +import { canDrop } from "../ExplorerDndProvider"; export const ExplorerTree = () => { const { t, i18n } = useTranslation(); @@ -237,15 +238,13 @@ export const ExplorerTree = () => { }} canDrop={(args) => { const parent = args.parentNode?.data.value as Item | undefined; - const canDropOnParent = parent?.abilities.children_create ?? false; const activeItem = args.dragNodes[0].data.value as Item; - const canDropActiveItem = activeItem.abilities.move; - const canDropItem = canDropOnParent && canDropActiveItem; + const canDropResult = parent ? canDrop(activeItem, parent) : true; return ( args.index === 0 && args.parentNode?.willReceiveDrop === true && - canDropItem + canDropResult ); }} renderNode={ExplorerTreeItem} diff --git a/src/frontend/apps/drive/src/features/explorer/hooks/useUpload.tsx b/src/frontend/apps/drive/src/features/explorer/hooks/useUpload.tsx index cdccffb0..5d5252b6 100644 --- a/src/frontend/apps/drive/src/features/explorer/hooks/useUpload.tsx +++ b/src/frontend/apps/drive/src/features/explorer/hooks/useUpload.tsx @@ -11,6 +11,7 @@ import { FileUploadMeta } from "../components/ExplorerInner"; import { ToasterItem } from "@/features/ui/components/toaster/Toaster"; import { addToast } from "@/features/ui/components/toaster/Toaster"; import { FileUploadToast } from "../components/toasts/FileUploadToast"; +import { useQueryClient } from "@tanstack/react-query"; type FileUpload = FileWithPath & { parentId?: string; @@ -32,6 +33,7 @@ type Upload = { const useUpload = ({ item }: { item: Item }) => { const createFolder = useMutationCreateFolder(); + const queryClient = useQueryClient(); /** * TODO: Test. @@ -129,6 +131,9 @@ const useUpload = ({ item }: { item: Item }) => { }, { onSuccess: async (createdFolder) => { + queryClient.invalidateQueries({ + queryKey: ["items", parentItem.id], + }); folder.files.forEach((file) => { file.parentId = createdFolder.id; }); @@ -195,7 +200,7 @@ export const useUploadZone = ({ item }: { item: Item }) => { cloud_upload {t( - `explorer.actions.upload.toast${canUpload ? "_no_rights" : ""}`, + `explorer.actions.upload.toast${canUpload ? "" : "_no_rights"}`, { title: item?.title, }