diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index dd0f860b09..22765a151e 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -73,6 +73,8 @@ let modelOrderList: string[] = []; let defaultModelIds: string[] = []; let defaultPinnedModelIds: string[] = []; + let defaultModelIdSet = new Set(); + let defaultPinnedModelIdSet = new Set(); let workspaceModels: ModelListItem[] = []; let baseModels: ModelListItem[] = []; @@ -123,8 +125,8 @@ return 'text-gray-500 dark:text-gray-400'; }; - const isDefaultModel = (model) => defaultModelIds.includes(model.id); - const isDefaultPinnedModel = (model) => defaultPinnedModelIds.includes(model.id); + $: defaultModelIdSet = new Set(defaultModelIds); + $: defaultPinnedModelIdSet = new Set(defaultPinnedModelIds); $: if (models) { const modelOrder = new Map(modelOrderList.map((id, idx) => [id, idx])); @@ -138,6 +140,8 @@ if (viewOption === 'hidden') return m?.meta?.hidden === true; if (viewOption === 'public') return isPublicModel(m); if (viewOption === 'private') return !isPublicModel(m); + if (viewOption === 'selected') return defaultModelIdSet.has(m.id); + if (viewOption === 'pinned') return defaultPinnedModelIdSet.has(m.id); return true; // All }) .sort((a, b) => { @@ -348,28 +352,30 @@ }; const toggleDefaultModelHandler = async (model) => { - const nextDefaultModelIds = isDefaultModel(model) + const isSelected = defaultModelIdSet.has(model.id); + const nextDefaultModelIds = isSelected ? defaultModelIds.filter((id) => id !== model.id) : [...new Set([...defaultModelIds, model.id])]; await saveModelDefaults( nextDefaultModelIds, defaultPinnedModelIds, - isDefaultModel(model) + isSelected ? $i18n.t('Model removed from selected models') : $i18n.t('Model added to selected models') ); }; const toggleDefaultPinnedModelHandler = async (model) => { - const nextDefaultPinnedModelIds = isDefaultPinnedModel(model) + const isPinned = defaultPinnedModelIdSet.has(model.id); + const nextDefaultPinnedModelIds = isPinned ? defaultPinnedModelIds.filter((id) => id !== model.id) : [...new Set([...defaultPinnedModelIds, model.id])]; await saveModelDefaults( defaultModelIds, nextDefaultPinnedModelIds, - isDefaultPinnedModel(model) + isPinned ? $i18n.t('Model removed from pinned models') : $i18n.t('Model added to pinned models') ); @@ -945,7 +951,7 @@ {modelAccessLabel(model)} - {#if isDefaultModel(model)} + {#if defaultModelIdSet.has(model.id)} @@ -953,7 +959,7 @@ {/if} - {#if isDefaultPinnedModel(model)} + {#if defaultPinnedModelIdSet.has(model.id)} @@ -1018,8 +1024,8 @@ privacyHandler={() => { toggleModelPrivacyHandler(model); }} - isDefaultSelected={isDefaultModel(model)} - isDefaultPinned={isDefaultPinnedModel(model)} + isDefaultSelected={defaultModelIdSet.has(model.id)} + isDefaultPinned={defaultPinnedModelIdSet.has(model.id)} defaultSelectedHandler={() => { toggleDefaultModelHandler(model); }} diff --git a/src/lib/components/admin/Settings/Models/AdminViewSelector.svelte b/src/lib/components/admin/Settings/Models/AdminViewSelector.svelte index 8574677a96..0751e8fc1e 100644 --- a/src/lib/components/admin/Settings/Models/AdminViewSelector.svelte +++ b/src/lib/components/admin/Settings/Models/AdminViewSelector.svelte @@ -19,7 +19,9 @@ { value: 'visible', label: $i18n.t('Visible') }, { value: 'hidden', label: $i18n.t('Hidden') }, { value: 'public', label: $i18n.t('Public') }, - { value: 'private', label: $i18n.t('Private') } + { value: 'private', label: $i18n.t('Private') }, + { value: 'selected', label: $i18n.t('Selected') }, + { value: 'pinned', label: $i18n.t('Pinned') } ]; diff --git a/src/lib/components/workspace/Prompts/PromptEditor.svelte b/src/lib/components/workspace/Prompts/PromptEditor.svelte index 7a27f98b26..c0d79ff6ad 100644 --- a/src/lib/components/workspace/Prompts/PromptEditor.svelte +++ b/src/lib/components/workspace/Prompts/PromptEditor.svelte @@ -28,7 +28,6 @@ import dayjs from 'dayjs'; import localizedFormat from 'dayjs/plugin/localizedFormat'; import PromptHistoryMenu from './PromptHistoryMenu.svelte'; - import Badge from '$lib/components/common/Badge.svelte'; import Tags from '$lib/components/common/Tags.svelte'; dayjs.extend(localizedFormat); @@ -396,7 +395,7 @@ {$i18n.t('Back')} -
+
-
+
{#if selectedHistoryEntry.id === prompt?.version_id} - + + {$i18n.t('Live')} + {:else} -
+ {#if entry.id === prompt?.version_id} + + {$i18n.t('Live')} + + {/if} +
+ +
+ {#if entry.user} + {entry.user.name} (e.target.src = '/user.png')} + /> + {entry.user.name} + • + {/if} + {renderDate(entry.created_at)} +
+ {/each} {#if historyLoading}