DMS: handleDropFiles + handleDropFolder callbacks

This commit is contained in:
2026-07-20 22:33:52 +00:00
parent f08933a97c
commit 864751a848
+53
View File
@@ -2,6 +2,7 @@
* DMS file browser page — complete redesign.
* 3-column explorer-style layout: SourceTree | FileExplorer | FileDetails.
* Uses PluginToolbar for actions, ResizablePanel for desktop layout.
* Supports drag-and-drop: files→folders, folders→folders (reparent), files→root.
*/
import React, { useState, useEffect, useCallback, useRef } from 'react';
@@ -30,6 +31,7 @@ import {
getSharedWithMe,
bulkMoveFiles,
bulkDeleteFiles,
updateFolder,
type DmsFolder,
type DmsFile,
} from '@/api/dms';
@@ -303,6 +305,53 @@ export function DmsPage() {
setSelectedSource('local');
}, []);
// ─── Drag-and-drop handlers ───
// Handle files dropped onto a folder (or root when targetFolderId is null)
const handleDropFiles = useCallback(async (fileIds: string[], targetFolderId: string | null) => {
if (fileIds.length === 0) return;
try {
await bulkMoveFiles({
file_ids: fileIds,
target_folder_id: targetFolderId,
});
toast.success(
targetFolderId
? t('dms.filesMoved')
: t('dms.filesMovedRoot')
);
// Remove moved files from current view (unless we're in the target folder)
if (selectedFolderId !== targetFolderId) {
setFiles((prev) => prev.filter((f) => !fileIds.includes(f.id)));
}
// Reload folders to update file counts
loadFolders();
// If dropping into a folder, navigate to it
if (targetFolderId) {
setSelectedFolderId(targetFolderId);
setSelectedSource('local');
setSearchQuery('');
setSelectedFileIds(new Set());
}
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
toast.error(msg);
}
}, [selectedFolderId, toast, t, loadFolders]);
// Handle folder dropped onto another folder (reparent) or root
const handleDropFolder = useCallback(async (sourceFolderId: string, targetFolderId: string | null) => {
if (sourceFolderId === targetFolderId) return;
try {
await updateFolder(sourceFolderId, { parent_id: targetFolderId });
toast.success(t('dms.folderMoved'));
loadFolders();
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
toast.error(msg);
}
}, [toast, t, loadFolders]);
// Register toolbar items
const registerItems = usePluginToolbarStore((s) => s.registerItems);
const unregisterPlugin = usePluginToolbarStore((s) => s.unregisterPlugin);
@@ -470,6 +519,8 @@ export function DmsPage() {
onSelectFolder={handleSelectFolder}
onSelectSource={handleSelectSource}
loading={loadingFolders}
onDropFiles={handleDropFiles}
onDropFolder={handleDropFolder}
/>
</ResizablePanel>
@@ -537,6 +588,8 @@ export function DmsPage() {
onSelectFolder={handleSelectFolder}
onSelectSource={handleSelectSource}
loading={loadingFolders}
onDropFiles={handleDropFiles}
onDropFolder={handleDropFolder}
/>
</div>
)}