From 9a9b5ef699cd2b1023deccd62f0ba98ce7903284 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 28 Dec 2025 15:45:45 -0500 Subject: [PATCH] feat: add sidebar toggle to workspace and admin models pages (#20176) --- .../components/admin/Settings/Models.svelte | 17 ++++++++++++ .../admin/Settings/Models/ModelMenu.svelte | 26 ++++++++++++++++++- .../chat/ModelSelector/ModelItemMenu.svelte | 9 ++++--- src/lib/components/workspace/Models.svelte | 17 ++++++++++++ .../workspace/Models/ModelMenu.svelte | 26 ++++++++++++++++++- 5 files changed, 89 insertions(+), 6 deletions(-) diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 1c1fc6512b..d107e09f70 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -17,6 +17,7 @@ } from '$lib/apis/models'; import { copyToClipboard } from '$lib/utils'; import { page } from '$app/stores'; + import { updateUserSettings } from '$lib/apis/users'; import { getModels } from '$lib/apis'; import Search from '$lib/components/icons/Search.svelte'; @@ -218,6 +219,19 @@ saveAs(blob, `${model.id}-${Date.now()}.json`); }; + const pinModelHandler = async (modelId) => { + let pinnedModels = $settings?.pinnedModels ?? []; + + if (pinnedModels.includes(modelId)) { + pinnedModels = pinnedModels.filter((id) => id !== modelId); + } else { + pinnedModels = [...new Set([...pinnedModels, modelId])]; + } + + settings.set({ ...$settings, pinnedModels: pinnedModels }); + await updateUserSettings(localStorage.token, { ui: $settings }); + }; + onMount(async () => { await init(); const id = $page.url.searchParams.get('id'); @@ -427,6 +441,9 @@ hideHandler={() => { hideModelHandler(model); }} + pinModelHandler={() => { + pinModelHandler(model.id); + }} copyLinkHandler={() => { copyLinkHandler(model); }} diff --git a/src/lib/components/admin/Settings/Models/ModelMenu.svelte b/src/lib/components/admin/Settings/Models/ModelMenu.svelte index b7e694b165..d4cd48a37d 100644 --- a/src/lib/components/admin/Settings/Models/ModelMenu.svelte +++ b/src/lib/components/admin/Settings/Models/ModelMenu.svelte @@ -13,8 +13,10 @@ import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import Download from '$lib/components/icons/Download.svelte'; import ArrowUpCircle from '$lib/components/icons/ArrowUpCircle.svelte'; + import Pin from '$lib/components/icons/Pin.svelte'; + import PinSlash from '$lib/components/icons/PinSlash.svelte'; - import { config } from '$lib/stores'; + import { config, settings } from '$lib/stores'; import Link from '$lib/components/icons/Link.svelte'; const i18n = getContext('i18n'); @@ -24,6 +26,7 @@ export let exportHandler: Function; export let hideHandler: Function; + export let pinModelHandler: Function; export let copyLinkHandler: Function; export let cloneHandler: Function; @@ -104,6 +107,27 @@ + { + pinModelHandler(model?.id); + }} + > + {#if ($settings?.pinnedModels ?? []).includes(model?.id)} + + {:else} + + {/if} + +
+ {#if ($settings?.pinnedModels ?? []).includes(model?.id)} + {$i18n.t('Hide from Sidebar')} + {:else} + {$i18n.t('Keep in Sidebar')} + {/if} +
+
+ { diff --git a/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte b/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte index 64e79dbcbb..5f795a6709 100644 --- a/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte +++ b/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte @@ -5,9 +5,10 @@ import { getContext } from 'svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + import Pin from '$lib/components/icons/Pin.svelte'; + import PinSlash from '$lib/components/icons/PinSlash.svelte'; + import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import Link from '$lib/components/icons/Link.svelte'; - import Eye from '$lib/components/icons/Eye.svelte'; - import EyeSlash from '$lib/components/icons/EyeSlash.svelte'; import { settings } from '$lib/stores'; const i18n = getContext('i18n'); @@ -63,9 +64,9 @@ }} > {#if ($settings?.pinnedModels ?? []).includes(model?.id)} - + {:else} - + {/if}
diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 7f42c2da4d..10e8c70a81 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -24,6 +24,7 @@ import { getModels } from '$lib/apis'; import { getGroups } from '$lib/apis/groups'; + import { updateUserSettings } from '$lib/apis/users'; import { capitalizeFirstLetter, copyToClipboard } from '$lib/utils'; @@ -215,6 +216,19 @@ saveAs(blob, `${model.id}-${Date.now()}.json`); }; + const pinModelHandler = async (modelId) => { + let pinnedModels = $settings?.pinnedModels ?? []; + + if (pinnedModels.includes(modelId)) { + pinnedModels = pinnedModels.filter((id) => id !== modelId); + } else { + pinnedModels = [...new Set([...pinnedModels, modelId])]; + } + + settings.set({ ...$settings, pinnedModels: pinnedModels }); + await updateUserSettings(localStorage.token, { ui: $settings }); + }; + onMount(async () => { viewOption = localStorage.workspaceViewOption ?? ''; page = 1; @@ -547,6 +561,9 @@ hideHandler={() => { hideModelHandler(model); }} + pinModelHandler={() => { + pinModelHandler(model.id); + }} copyLinkHandler={() => { copyLinkHandler(model); }} diff --git a/src/lib/components/workspace/Models/ModelMenu.svelte b/src/lib/components/workspace/Models/ModelMenu.svelte index 825250e6af..30712eef5c 100644 --- a/src/lib/components/workspace/Models/ModelMenu.svelte +++ b/src/lib/components/workspace/Models/ModelMenu.svelte @@ -13,8 +13,10 @@ import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import Download from '$lib/components/icons/Download.svelte'; import ArrowUpCircle from '$lib/components/icons/ArrowUpCircle.svelte'; + import Pin from '$lib/components/icons/Pin.svelte'; + import PinSlash from '$lib/components/icons/PinSlash.svelte'; - import { config, user as currentUser } from '$lib/stores'; + import { config, user as currentUser, settings } from '$lib/stores'; import Link from '$lib/components/icons/Link.svelte'; const i18n = getContext('i18n'); @@ -29,6 +31,7 @@ export let copyLinkHandler: Function; export let hideHandler: Function; + export let pinModelHandler: Function; export let deleteHandler: Function; export let onClose: Function; @@ -124,6 +127,27 @@
+ { + pinModelHandler(model?.id); + }} + > + {#if ($settings?.pinnedModels ?? []).includes(model?.id)} + + {:else} + + {/if} + +
+ {#if ($settings?.pinnedModels ?? []).includes(model?.id)} + {$i18n.t('Hide from Sidebar')} + {:else} + {$i18n.t('Keep in Sidebar')} + {/if} +
+
+ {