mirror of
https://github.com/open-webui/open-webui
synced 2025-06-22 18:07:17 +00:00
Update Sidebar.svelte
This commit is contained in:
parent
8f01f72d28
commit
f6ec2f537f
@ -22,7 +22,11 @@
|
|||||||
socket,
|
socket,
|
||||||
config,
|
config,
|
||||||
isApp,
|
isApp,
|
||||||
models
|
models,
|
||||||
|
pendingFolderId,
|
||||||
|
pendingFolderName,
|
||||||
|
folders,
|
||||||
|
refreshSidebar
|
||||||
} from '$lib/stores';
|
} from '$lib/stores';
|
||||||
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
||||||
|
|
||||||
@ -77,7 +81,6 @@
|
|||||||
let chatListLoading = false;
|
let chatListLoading = false;
|
||||||
let allChatsLoaded = false;
|
let allChatsLoaded = false;
|
||||||
|
|
||||||
let folders = {};
|
|
||||||
let newFolderId = null;
|
let newFolderId = null;
|
||||||
|
|
||||||
const initFolders = async () => {
|
const initFolders = async () => {
|
||||||
@ -86,15 +89,15 @@
|
|||||||
return [];
|
return [];
|
||||||
});
|
});
|
||||||
|
|
||||||
folders = {};
|
let newFolders = {};
|
||||||
|
|
||||||
// First pass: Initialize all folder entries
|
// First pass: Initialize all folder entries
|
||||||
for (const folder of folderList) {
|
for (const folder of folderList) {
|
||||||
// Ensure folder is added to folders with its data
|
// Ensure folder is added to folders with its data
|
||||||
folders[folder.id] = { ...(folders[folder.id] || {}), ...folder };
|
newFolders[folder.id] = { ...(newFolders[folder.id] || {}), ...folder };
|
||||||
|
|
||||||
if (newFolderId && folder.id === newFolderId) {
|
if (newFolderId && folder.id === newFolderId) {
|
||||||
folders[folder.id].new = true;
|
newFolders[folder.id].new = true;
|
||||||
newFolderId = null;
|
newFolderId = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,30 +106,31 @@
|
|||||||
for (const folder of folderList) {
|
for (const folder of folderList) {
|
||||||
if (folder.parent_id) {
|
if (folder.parent_id) {
|
||||||
// Ensure the parent folder is initialized if it doesn't exist
|
// Ensure the parent folder is initialized if it doesn't exist
|
||||||
if (!folders[folder.parent_id]) {
|
if (!newFolders[folder.parent_id]) {
|
||||||
folders[folder.parent_id] = {}; // Create a placeholder if not already present
|
newFolders[folder.parent_id] = {}; // Create a placeholder if not already present
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize childrenIds array if it doesn't exist and add the current folder id
|
// Initialize childrenIds array if it doesn't exist and add the current folder id
|
||||||
folders[folder.parent_id].childrenIds = folders[folder.parent_id].childrenIds
|
newFolders[folder.parent_id].childrenIds = newFolders[folder.parent_id].childrenIds
|
||||||
? [...folders[folder.parent_id].childrenIds, folder.id]
|
? [...newFolders[folder.parent_id].childrenIds, folder.id]
|
||||||
: [folder.id];
|
: [folder.id];
|
||||||
|
|
||||||
// Sort the children by updated_at field
|
// Sort the children by updated_at field
|
||||||
folders[folder.parent_id].childrenIds.sort((a, b) => {
|
newFolders[folder.parent_id].childrenIds.sort((a, b) => {
|
||||||
return folders[b].updated_at - folders[a].updated_at;
|
return newFolders[b].updated_at - newFolders[a].updated_at;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
folders.set(newFolders);
|
||||||
};
|
};
|
||||||
|
|
||||||
const createFolder = async (name = 'Untitled') => {
|
const createFolder = async (name = '📁 Untitled Folder') => {
|
||||||
if (name === '') {
|
if (name === '') {
|
||||||
toast.error($i18n.t('Folder name cannot be empty.'));
|
toast.error($i18n.t('Folder name cannot be empty.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rootFolders = Object.values(folders).filter((folder) => folder.parent_id === null);
|
const rootFolders = Object.values($folders).filter((folder) => folder.parent_id === null);
|
||||||
if (rootFolders.find((folder) => folder.name.toLowerCase() === name.toLowerCase())) {
|
if (rootFolders.find((folder) => folder.name.toLowerCase() === name.toLowerCase())) {
|
||||||
// If a folder with the same name already exists, append a number to the name
|
// If a folder with the same name already exists, append a number to the name
|
||||||
let i = 1;
|
let i = 1;
|
||||||
@ -138,18 +142,17 @@
|
|||||||
|
|
||||||
name = `${name} ${i}`;
|
name = `${name} ${i}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a dummy folder to the list to show the user that the folder is being created
|
// Add a dummy folder to the list to show the user that the folder is being created
|
||||||
const tempId = uuidv4();
|
const tempId = uuidv4();
|
||||||
folders = {
|
folders.set({
|
||||||
...folders,
|
...$folders,
|
||||||
tempId: {
|
tempId: {
|
||||||
id: tempId,
|
id: tempId,
|
||||||
name: name,
|
name: name,
|
||||||
created_at: Date.now(),
|
created_at: Date.now(),
|
||||||
updated_at: Date.now()
|
updated_at: Date.now()
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
const res = await createNewFolder(localStorage.token, name).catch((error) => {
|
const res = await createNewFolder(localStorage.token, name).catch((error) => {
|
||||||
toast.error(`${error}`);
|
toast.error(`${error}`);
|
||||||
@ -162,6 +165,21 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const createChatInFolderHandler = async (event) => {
|
||||||
|
const { folderId } = event.detail;
|
||||||
|
|
||||||
|
pendingFolderId.set(folderId);
|
||||||
|
pendingFolderName.set($folders[folderId].name);
|
||||||
|
|
||||||
|
await goto('/');
|
||||||
|
|
||||||
|
if ($mobile) {
|
||||||
|
showSidebar.set(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
toast.success($i18n.t('Folder selected for next chat'));
|
||||||
|
};
|
||||||
|
|
||||||
const initChannels = async () => {
|
const initChannels = async () => {
|
||||||
await channels.set(await getChannels(localStorage.token));
|
await channels.set(await getChannels(localStorage.token));
|
||||||
};
|
};
|
||||||
@ -181,6 +199,8 @@
|
|||||||
scrollPaginationEnabled.set(true);
|
scrollPaginationEnabled.set(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
refreshSidebar.set(initChatList);
|
||||||
|
|
||||||
const loadMoreChats = async () => {
|
const loadMoreChats = async () => {
|
||||||
chatListLoading = true;
|
chatListLoading = true;
|
||||||
|
|
||||||
@ -751,7 +771,7 @@
|
|||||||
initChatList();
|
initChatList();
|
||||||
}
|
}
|
||||||
} else if (type === 'folder') {
|
} else if (type === 'folder') {
|
||||||
if (folders[id].parent_id === null) {
|
if ($folders[id].parent_id === null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -763,7 +783,7 @@
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
await initFolders();
|
initChatList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
@ -844,9 +864,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if folders}
|
{#if $folders}
|
||||||
<Folders
|
<Folders
|
||||||
{folders}
|
folders={$folders}
|
||||||
on:import={(e) => {
|
on:import={(e) => {
|
||||||
const { folderId, items } = e.detail;
|
const { folderId, items } = e.detail;
|
||||||
importChatHandler(items, false, folderId);
|
importChatHandler(items, false, folderId);
|
||||||
@ -857,6 +877,7 @@
|
|||||||
on:change={async () => {
|
on:change={async () => {
|
||||||
initChatList();
|
initChatList();
|
||||||
}}
|
}}
|
||||||
|
on:createChatInFolder={createChatInFolderHandler}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user