diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte index 8e48faa430..08ec980135 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte @@ -19,13 +19,13 @@ Upload } from '@lucide/svelte'; import { - BackendIcon, DropdownMenuActions, Logo, ModelAvatar, ModelContext, ModelId, - ModelLoadControl + ModelLoadControl, + ModelsSection } from '$lib/components/app'; import { DialogConfirmDownload } from '$lib/components/app/dialogs'; import { Badge } from '$lib/components/ui/badge'; @@ -62,9 +62,8 @@ let deleteOpen = $state(false); /** Repos whose quants are folded away; the rest show them. */ const collapsedQuants = new SvelteSet(); - const collapsedSections = new SvelteSet(['hidden']); - /** Families start collapsed, this tracks the ones the user opened. */ - const expandedFamilies = new SvelteSet(); + /** Families start open, this tracks the ones folded away. */ + const collapsedFamilies = new SvelteSet(); /** Sections that list their models straight, without folding them into families. */ const FLAT_SECTIONS = new Set(['favorites', 'loaded']); let sections = $derived( @@ -80,19 +79,11 @@ deleteOpen = true; } - function toggleSection(key: string): void { - if (collapsedSections.has(key)) { - collapsedSections.delete(key); - } else { - collapsedSections.add(key); - } - } - function toggleFamily(key: string): void { - if (expandedFamilies.has(key)) { - expandedFamilies.delete(key); + if (collapsedFamilies.has(key)) { + collapsedFamilies.delete(key); } else { - expandedFamilies.add(key); + collapsedFamilies.add(key); } } @@ -352,54 +343,8 @@ {/if} {/snippet} -{#snippet sectionRow(group: ModelsTableGroup)} - {@const isExpanded = !collapsedSections.has(group.key)} - -
-
toggleSection(group.key)} - onkeydown={(event) => event.key === 'Enter' && toggleSection(group.key)} - role="button" - tabindex="0" - > - - {#if group.kind === 'provider'} - - {:else if group.kind === 'favorites'} - - {:else if group.kind === 'loaded'} - - {:else if group.kind === 'hidden'} - - {:else if group.kind === 'local'} - - {/if} - - {group.label} - - {group.items.length} - - - - - - - - - - {#if isExpanded} - - {:else} - - {/if} - -
-
-{/snippet} - -{#snippet familyRow(family: ModelFamilyGroup, indent = 0)} - {@const isExpanded = expandedFamilies.has(family.key)} +{#snippet familyRow(family: ModelFamilyGroup)} + {@const isExpanded = !collapsedFamilies.has(family.key)} {@const countLabel = `${family.entries.length} model${family.entries.length === 1 ? '' : 's'}`}
@@ -410,7 +355,7 @@ role="button" tabindex="0" > - + - - {family.label} + {family.label} - {countLabel} - + {countLabel} @@ -473,25 +416,42 @@
{#each sections as group (group.key)} {#if group.items.length > 0} - {@render sectionRow(group)} + {#snippet groupIcon()} + {#if group.kind === 'favorites'} + + {:else if group.kind === 'loaded'} + + {:else if group.kind === 'hidden'} + + {:else if group.kind === 'local'} + + {/if} + {/snippet} - {#if !collapsedSections.has(group.key)} + {#if group.flat} {#each group.items as entry (entry.key)} - {@render entryTree(entry, 40)} + {@render entryTree(entry, 16)} {/each} {/if} {#each group.families as family (family.key)} - {@render familyRow(family, 20)} + {@render familyRow(family)} - {#if expandedFamilies.has(family.key)} + {#if !collapsedFamilies.has(family.key)} {#each family.entries as entry (entry.key)} - {@render entryTree(entry, 40)} + {@render entryTree(entry, 16)} {/each} {/if} {/each} - {/if} + {/if} {/each}