From 864751a848432efa6ebab4fe1431ed473d565bc3 Mon Sep 17 00:00:00 2001 From: Leopoldadmin Date: Mon, 20 Jul 2026 22:33:52 +0000 Subject: [PATCH] DMS: handleDropFiles + handleDropFolder callbacks --- frontend/src/pages/Dms.tsx | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/frontend/src/pages/Dms.tsx b/frontend/src/pages/Dms.tsx index 41d220b..602e366 100644 --- a/frontend/src/pages/Dms.tsx +++ b/frontend/src/pages/Dms.tsx @@ -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} /> @@ -537,6 +588,8 @@ export function DmsPage() { onSelectFolder={handleSelectFolder} onSelectSource={handleSelectSource} loading={loadingFolders} + onDropFiles={handleDropFiles} + onDropFolder={handleDropFolder} /> )}