DMS: handleDropFiles + handleDropFolder callbacks
This commit is contained in:
@@ -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>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user