From 25dcb7d17f6fef9148801e88a4c37e38cfb5d776 Mon Sep 17 00:00:00 2001 From: itqop Date: Mon, 5 Jan 2026 15:26:53 +0300 Subject: [PATCH] fix tree --- backend/src/app/api/v1/folders.py | 17 ++++++++++++----- .../src/app/repositories/folder_repository.py | 14 ++++++++++++++ backend/src/app/services/folder_service.py | 12 ++++++++++++ frontend/src/components/MoveFolderDialog.tsx | 4 ++-- frontend/src/services/api.ts | 10 ++++++++-- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/backend/src/app/api/v1/folders.py b/backend/src/app/api/v1/folders.py index 2b5a018..93758f0 100644 --- a/backend/src/app/api/v1/folders.py +++ b/backend/src/app/api/v1/folders.py @@ -48,23 +48,30 @@ async def list_folders( current_user: CurrentUser, session: DatabaseSession, parent_folder_id: Optional[str] = Query(None), + all: bool = Query(False, description="Return all folders (ignore parent_folder_id)"), ): """ - List folders in a specific parent folder. + List folders in a specific parent folder or all folders. Args: current_user: Current authenticated user session: Database session parent_folder_id: Parent folder ID (None for root folders) + all: If True, return all user's folders (for building tree) Returns: List of folders """ folder_service = FolderService(session) - folders = await folder_service.list_folders( - user_id=current_user.id, - parent_folder_id=parent_folder_id, - ) + + if all: + folders = await folder_service.list_all_folders(user_id=current_user.id) + else: + folders = await folder_service.list_folders( + user_id=current_user.id, + parent_folder_id=parent_folder_id, + ) + return FolderListResponse(items=folders) diff --git a/backend/src/app/repositories/folder_repository.py b/backend/src/app/repositories/folder_repository.py index c0f48d9..362da32 100644 --- a/backend/src/app/repositories/folder_repository.py +++ b/backend/src/app/repositories/folder_repository.py @@ -89,6 +89,20 @@ class FolderRepository: result = await self.session.execute(query) return list(result.scalars().all()) + async def list_all_by_user(self, user_id: str) -> list[Folder]: + """ + List ALL folders for a user (no parent filter). + + Args: + user_id: User ID + + Returns: + List of all user's folders + """ + query = select(Folder).where(Folder.user_id == user_id).order_by(Folder.name) + result = await self.session.execute(query) + return list(result.scalars().all()) + async def get_all_subfolders(self, folder_id: str) -> list[Folder]: """ Get all subfolders recursively. diff --git a/backend/src/app/services/folder_service.py b/backend/src/app/services/folder_service.py index 6a26cf2..ea9f3ef 100644 --- a/backend/src/app/services/folder_service.py +++ b/backend/src/app/services/folder_service.py @@ -116,6 +116,18 @@ class FolderService: return folders + async def list_all_folders(self, user_id: str) -> list[Folder]: + """ + List ALL folders for a user (no parent filter). + + Args: + user_id: User ID + + Returns: + List of all user's folders + """ + return await self.folder_repo.list_all_by_user(user_id) + async def rename_folder( self, user_id: str, diff --git a/frontend/src/components/MoveFolderDialog.tsx b/frontend/src/components/MoveFolderDialog.tsx index 7897543..a2af2a1 100644 --- a/frontend/src/components/MoveFolderDialog.tsx +++ b/frontend/src/components/MoveFolderDialog.tsx @@ -110,8 +110,8 @@ export default function MoveFolderDialog({ open, onClose, onMove }: MoveFolderDi const loadAllFolders = async () => { try { setLoading(true); - // Load all folders (no parent_id filter to get all) - const response = await api.listFolders(); + // Load all folders with all=true parameter + const response = await api.listFolders(null, true); const allFolders: Folder[] = response.items || []; // Build tree structure diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts index 4d7e7be..c24b485 100644 --- a/frontend/src/services/api.ts +++ b/frontend/src/services/api.ts @@ -194,9 +194,15 @@ class ApiClient { return data; } - async listFolders(parentFolderId?: string | null): Promise { + async listFolders(parentFolderId?: string | null, all: boolean = false): Promise { + const params: any = {}; + if (all) { + params.all = true; + } else if (parentFolderId) { + params.parent_folder_id = parentFolderId; + } const { data } = await this.client.get('/folders', { - params: parentFolderId ? { parent_folder_id: parentFolderId } : undefined, + params: Object.keys(params).length > 0 ? params : undefined, }); return data; }