mirror of
https://github.com/open-webui/open-webui
synced 2025-03-25 06:58:04 +00:00
fix: collapsible space toggle issue
This commit is contained in:
parent
7b97d7a718
commit
29c39d44e1
@ -101,6 +101,10 @@ class FolderTable:
|
|||||||
try:
|
try:
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
||||||
|
|
||||||
|
if not folder:
|
||||||
|
return None
|
||||||
|
|
||||||
return FolderModel.model_validate(folder)
|
return FolderModel.model_validate(folder)
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
@ -119,12 +123,16 @@ class FolderTable:
|
|||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
folder = (
|
folder = (
|
||||||
db.query(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()
|
.first()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not folder:
|
||||||
|
return None
|
||||||
|
|
||||||
return FolderModel.model_validate(folder)
|
return FolderModel.model_validate(folder)
|
||||||
except Exception as e:
|
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
|
return None
|
||||||
|
|
||||||
def get_folders_by_parent_id_and_user_id(
|
def get_folders_by_parent_id_and_user_id(
|
||||||
@ -147,6 +155,10 @@ class FolderTable:
|
|||||||
try:
|
try:
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
||||||
|
|
||||||
|
if not folder:
|
||||||
|
return None
|
||||||
|
|
||||||
folder.parent_id = parent_id
|
folder.parent_id = parent_id
|
||||||
folder.updated_at = int(time.time())
|
folder.updated_at = int(time.time())
|
||||||
|
|
||||||
@ -164,6 +176,9 @@ class FolderTable:
|
|||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
||||||
|
|
||||||
|
if not folder:
|
||||||
|
return None
|
||||||
|
|
||||||
existing_folder = (
|
existing_folder = (
|
||||||
db.query(Folder)
|
db.query(Folder)
|
||||||
.filter_by(name=name, parent_id=folder.parent_id, user_id=user_id)
|
.filter_by(name=name, parent_id=folder.parent_id, user_id=user_id)
|
||||||
@ -190,6 +205,9 @@ class FolderTable:
|
|||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
folder = db.query(Folder).filter_by(id=id, user_id=user_id).first()
|
||||||
|
|
||||||
|
if not folder:
|
||||||
|
return None
|
||||||
|
|
||||||
folder.items = items.model_dump()
|
folder.items = items.model_dump()
|
||||||
folder.updated_at = int(time.time())
|
folder.updated_at = int(time.time())
|
||||||
|
|
||||||
|
@ -215,7 +215,18 @@ async def delete_folder_by_id(id: str, user=Depends(get_verified_user)):
|
|||||||
if folder:
|
if folder:
|
||||||
try:
|
try:
|
||||||
result = Folders.delete_folder_by_id_and_user_id(id, user.id)
|
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:
|
except Exception as e:
|
||||||
log.exception(e)
|
log.exception(e)
|
||||||
log.error(f"Error deleting folder: {id}")
|
log.error(f"Error deleting folder: {id}")
|
||||||
|
@ -18,7 +18,9 @@
|
|||||||
|
|
||||||
<div class={className}>
|
<div class={className}>
|
||||||
{#if title !== null}
|
{#if title !== null}
|
||||||
<button class={buttonClassName} on:click={() => (open = !open)}>
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
|
<div class={buttonClassName} on:pointerup={() => (open = !open)}>
|
||||||
<div class=" w-fit font-medium transition flex items-center justify-between gap-2">
|
<div class=" w-fit font-medium transition flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
{title}
|
{title}
|
||||||
@ -32,15 +34,17 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<button class={buttonClassName} on:click={() => (open = !open)}>
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
|
<div class={buttonClassName} on:pointerup={() => (open = !open)}>
|
||||||
<div
|
<div
|
||||||
class="flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition"
|
class="flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition"
|
||||||
>
|
>
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if open}
|
{#if open}
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
import FolderOpen from '$lib/components/icons/FolderOpen.svelte';
|
import FolderOpen from '$lib/components/icons/FolderOpen.svelte';
|
||||||
import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte';
|
import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte';
|
||||||
|
import { updateFolderNameById } from '$lib/apis/folders';
|
||||||
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let open = true;
|
export let open = true;
|
||||||
|
|
||||||
@ -136,6 +138,29 @@
|
|||||||
folderElement.removeEventListener('dragend', onDragEnd);
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if dragged && x && y}
|
{#if dragged && x && y}
|
||||||
@ -194,17 +219,18 @@
|
|||||||
<input
|
<input
|
||||||
id="folder-{folderId}-input"
|
id="folder-{folderId}-input"
|
||||||
type="text"
|
type="text"
|
||||||
bind:value={folders[folderId].name}
|
bind:value={name}
|
||||||
on:input={(e) => {
|
|
||||||
folders[folderId].name = e.target.value;
|
|
||||||
}}
|
|
||||||
on:blur={() => {
|
on:blur={() => {
|
||||||
edit = false;
|
edit = false;
|
||||||
|
nameUpdateHandler();
|
||||||
}}
|
}}
|
||||||
on:keydown={(e) => {
|
on:click={(e) => {
|
||||||
if (e.key === 'Enter') {
|
// Prevent accidental collapse toggling when clicking inside input
|
||||||
edit = false;
|
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"
|
class="w-full h-full bg-transparent text-gray-500 dark:text-gray-500 outline-none"
|
||||||
/>
|
/>
|
||||||
@ -213,14 +239,14 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" hidden group-hover:flex">
|
<div class=" hidden group-hover:flex dark:text-gray-300">
|
||||||
<button
|
<button
|
||||||
on:click={(e) => {
|
on:click={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
console.log('clicked');
|
console.log('clicked');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<EllipsisHorizontal className="size-3.5" strokeWidth="2.5" />
|
<EllipsisHorizontal className="size-4" strokeWidth="2.5" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
Loading…
Reference in New Issue
Block a user