From 29c39d44e181828862514264d4519cfc0b3df0de Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Wed, 16 Oct 2024 22:36:44 -0700 Subject: [PATCH] fix: collapsible space toggle issue --- .../open_webui/apps/webui/models/folders.py | 22 ++++++++- .../open_webui/apps/webui/routers/folders.py | 13 +++++- src/lib/components/common/Collapsible.svelte | 12 +++-- .../layout/Sidebar/RecursiveFolder.svelte | 46 +++++++++++++++---- 4 files changed, 76 insertions(+), 17 deletions(-) diff --git a/backend/open_webui/apps/webui/models/folders.py b/backend/open_webui/apps/webui/models/folders.py index 6e28e3797..d1b6a0621 100644 --- a/backend/open_webui/apps/webui/models/folders.py +++ b/backend/open_webui/apps/webui/models/folders.py @@ -101,6 +101,10 @@ class FolderTable: try: with get_db() as db: folder = db.query(Folder).filter_by(id=id, user_id=user_id).first() + + if not folder: + return None + return FolderModel.model_validate(folder) except Exception: return None @@ -119,12 +123,16 @@ class FolderTable: with get_db() as db: folder = ( db.query(Folder) - .filter_by(parent_id=parent_id, user_id=user_id, name=name) + .filter_by(parent_id=parent_id, user_id=user_id, name=name.lower()) .first() ) + + if not folder: + return None + return FolderModel.model_validate(folder) except Exception as e: - log.error(f"get_folder_by_name_and_user_id: {e}") + log.error(f"get_folder_by_parent_id_and_user_id_and_name: {e}") return None def get_folders_by_parent_id_and_user_id( @@ -147,6 +155,10 @@ class FolderTable: try: with get_db() as db: folder = db.query(Folder).filter_by(id=id, user_id=user_id).first() + + if not folder: + return None + folder.parent_id = parent_id folder.updated_at = int(time.time()) @@ -164,6 +176,9 @@ class FolderTable: with get_db() as db: folder = db.query(Folder).filter_by(id=id, user_id=user_id).first() + if not folder: + return None + existing_folder = ( db.query(Folder) .filter_by(name=name, parent_id=folder.parent_id, user_id=user_id) @@ -190,6 +205,9 @@ class FolderTable: with get_db() as db: folder = db.query(Folder).filter_by(id=id, user_id=user_id).first() + if not folder: + return None + folder.items = items.model_dump() folder.updated_at = int(time.time()) diff --git a/backend/open_webui/apps/webui/routers/folders.py b/backend/open_webui/apps/webui/routers/folders.py index df38b2190..ffc6fdee3 100644 --- a/backend/open_webui/apps/webui/routers/folders.py +++ b/backend/open_webui/apps/webui/routers/folders.py @@ -215,7 +215,18 @@ async def delete_folder_by_id(id: str, user=Depends(get_verified_user)): if folder: try: result = Folders.delete_folder_by_id_and_user_id(id, user.id) - return result + if result: + # Delete all chats in the folder + chats = Chats.get_chats_by_folder_id_and_user_id(id, user.id) + for chat in chats: + Chats.delete_chat_by_id(chat.id, user.id) + + return result + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=ERROR_MESSAGES.DEFAULT("Error deleting folder"), + ) except Exception as e: log.exception(e) log.error(f"Error deleting folder: {id}") diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index 6a9d1ff19..72baec4cf 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -18,7 +18,9 @@
{#if title !== null} - +
{:else} - + {/if} {#if open} diff --git a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte index 7e4354b7d..b097d51b4 100644 --- a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte +++ b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte @@ -11,6 +11,8 @@ import FolderOpen from '$lib/components/icons/FolderOpen.svelte'; import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte'; + import { updateFolderNameById } from '$lib/apis/folders'; + import { toast } from 'svelte-sonner'; export let open = true; @@ -136,6 +138,29 @@ folderElement.removeEventListener('dragend', onDragEnd); } }); + + const nameUpdateHandler = async () => { + name = name.trim(); + + if (name === '') { + toast.error("Folder name can't be empty"); + return; + } + + if (name === folders[folderId].name) { + edit = false; + return; + } + + const res = await updateFolderNameById(localStorage.token, folderId, name).catch((error) => { + toast.error(error); + return null; + }); + + if (res) { + folders[folderId].name = name; + } + }; {#if dragged && x && y} @@ -194,17 +219,18 @@ { - folders[folderId].name = e.target.value; - }} + bind:value={name} on:blur={() => { edit = false; + nameUpdateHandler(); }} - on:keydown={(e) => { - if (e.key === 'Enter') { - edit = false; - } + on:click={(e) => { + // Prevent accidental collapse toggling when clicking inside input + e.stopPropagation(); + }} + on:mousedown={(e) => { + // Prevent accidental collapse toggling when clicking inside input + e.stopPropagation(); }} class="w-full h-full bg-transparent text-gray-500 dark:text-gray-500 outline-none" /> @@ -213,14 +239,14 @@ {/if} -