diff --git a/src/components/AssetLibraryManagerModal.tsx b/src/components/AssetLibraryManagerModal.tsx index 7fd029a6..81f59349 100644 --- a/src/components/AssetLibraryManagerModal.tsx +++ b/src/components/AssetLibraryManagerModal.tsx @@ -39,7 +39,6 @@ import { import { AssetLibraryUploadModal, type AssetLibraryUploadFolderOption } from "./AssetLibraryUploadModal"; type AssetLibraryFileKind = "image" | "video" | "audio" | "other"; -type AssetLibraryActionMenuView = "actions" | "move"; interface AssetLibraryManagerModalProps { open: boolean; @@ -158,7 +157,7 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr const [expandedMoveFolderIds, setExpandedMoveFolderIds] = useState>(new Set()); const [moveFolderAncestorIds, setMoveFolderAncestorIds] = useState>>({}); const [actionMenuOpenId, setActionMenuOpenId] = useState(null); - const [actionMenuView, setActionMenuView] = useState("actions"); + const [movePanelOpenId, setMovePanelOpenId] = useState(null); const [batchMode, setBatchMode] = useState(false); const [selectedItemIds, setSelectedItemIds] = useState>(new Set()); const [batchDeleting, setBatchDeleting] = useState(false); @@ -213,7 +212,7 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr setExpandedMoveFolderIds(new Set()); setMoveFolderAncestorIds({}); setActionMenuOpenId(null); - setActionMenuView("actions"); + setMovePanelOpenId(null); setBatchMode(false); setSelectedItemIds(new Set()); setBatchDeleting(false); @@ -331,7 +330,7 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr await loadItems(); await onChanged?.(parentId); setActionMenuOpenId(null); - setActionMenuView("actions"); + setMovePanelOpenId(null); void message.success(t("assetLibrary.moveSuccess")); } catch (err) { const messageText = err instanceof Error ? err.message : t("assetLibrary.moveFailed"); @@ -578,7 +577,7 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr const isSelfOrDescendant = item.nodeType === "folder" && ( folder.id === item.id || Boolean(moveFolderAncestorIds[folder.id]?.has(item.id)) ); - const disabled = isSelfOrDescendant; + const disabled = isSelfOrDescendant || isCurrentParent; return (
@@ -604,10 +603,6 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr onClick={(event) => { event.stopPropagation(); if (disabled) return; - if (isCurrentParent) { - setActionMenuOpenId(null); - return; - } void handleMoveItem(item, folder.id); }} > @@ -650,20 +645,18 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr const rootFolders = moveFoldersByParentId[ROOT_PARENT_ID] ?? []; const rootLoading = loadingMoveFolderIds.has(ROOT_PARENT_ID); return ( -
- {item.nodeType === "folder" && ( - - )} +
+ {rootLoading ? (
{t("common.processing")}
) : rootFolders.length > 0 ? ( @@ -675,90 +668,85 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr ); }, [handleMoveItem, loadingMoveFolderIds, moveFoldersByParentId, renderMoveTreeRows, t]); + const handleOpenMovePanel = useCallback((item: UserFileItem) => { + setMovePanelOpenId(item.id); + void loadMoveFolderChildren(ROOT_PARENT_ID); + }, [loadMoveFolderChildren]); + const renderItemActions = useCallback((item: UserFileItem) => { const isFolder = item.nodeType === "folder"; - const isMoveView = actionMenuView === "move"; + const movePanelOpen = movePanelOpenId === item.id; return (
event.stopPropagation()} > - {isMoveView ? ( - <> -
- - - {t("assetLibrary.moveTitle")} - -
- {renderMovePanel(item)} - - ) : ( -
- - {isFolder && ( - - )} +
+ + {isFolder && ( - + )} + + +
+ {movePanelOpen && ( +
+ {renderMovePanel(item)}
)}
); - }, [actionMenuView, handleDeleteItem, loadMoveFolderChildren, openRenameModal, renderMovePanel, t]); + }, [handleDeleteItem, handleOpenMovePanel, movePanelOpenId, openRenameModal, renderMovePanel, t]); const renderItem = (item: UserFileItem) => { const isFolder = item.nodeType === "folder"; @@ -848,7 +836,7 @@ export function AssetLibraryManagerModal({ open, onClose, onChanged }: AssetLibr open={actionMenuOpenId === item.id} onOpenChange={(nextOpen) => { setActionMenuOpenId(nextOpen ? item.id : null); - setActionMenuView("actions"); + if (!nextOpen) setMovePanelOpenId(null); }} trigger={["click"]} placement="bottomRight"