DMS: handleDropFiles + handleDropFolder callbacks
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
* DMS file browser page — complete redesign.
|
* DMS file browser page — complete redesign.
|
||||||
* 3-column explorer-style layout: SourceTree | FileExplorer | FileDetails.
|
* 3-column explorer-style layout: SourceTree | FileExplorer | FileDetails.
|
||||||
* Uses PluginToolbar for actions, ResizablePanel for desktop layout.
|
* 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';
|
import React, { useState, useEffect, useCallback, useRef } from 'react';
|
||||||
@@ -30,6 +31,7 @@ import {
|
|||||||
getSharedWithMe,
|
getSharedWithMe,
|
||||||
bulkMoveFiles,
|
bulkMoveFiles,
|
||||||
bulkDeleteFiles,
|
bulkDeleteFiles,
|
||||||
|
updateFolder,
|
||||||
type DmsFolder,
|
type DmsFolder,
|
||||||
type DmsFile,
|
type DmsFile,
|
||||||
} from '@/api/dms';
|
} from '@/api/dms';
|
||||||
@@ -303,6 +305,53 @@ export function DmsPage() {
|
|||||||
setSelectedSource('local');
|
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
|
// Register toolbar items
|
||||||
const registerItems = usePluginToolbarStore((s) => s.registerItems);
|
const registerItems = usePluginToolbarStore((s) => s.registerItems);
|
||||||
const unregisterPlugin = usePluginToolbarStore((s) => s.unregisterPlugin);
|
const unregisterPlugin = usePluginToolbarStore((s) => s.unregisterPlugin);
|
||||||
@@ -470,6 +519,8 @@ export function DmsPage() {
|
|||||||
onSelectFolder={handleSelectFolder}
|
onSelectFolder={handleSelectFolder}
|
||||||
onSelectSource={handleSelectSource}
|
onSelectSource={handleSelectSource}
|
||||||
loading={loadingFolders}
|
loading={loadingFolders}
|
||||||
|
onDropFiles={handleDropFiles}
|
||||||
|
onDropFolder={handleDropFolder}
|
||||||
/>
|
/>
|
||||||
</ResizablePanel>
|
</ResizablePanel>
|
||||||
|
|
||||||
@@ -537,6 +588,8 @@ export function DmsPage() {
|
|||||||
onSelectFolder={handleSelectFolder}
|
onSelectFolder={handleSelectFolder}
|
||||||
onSelectSource={handleSelectSource}
|
onSelectSource={handleSelectSource}
|
||||||
loading={loadingFolders}
|
loading={loadingFolders}
|
||||||
|
onDropFiles={handleDropFiles}
|
||||||
|
onDropFolder={handleDropFolder}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user