From 35b1e177b2c06bfb73a8457996ce4e451287c394 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Wed, 23 Sep 2026 10:21:07 +0200 Subject: [PATCH] ui : indent the model tree per level and fix the family row cells Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../ModelsManagerModelsTable.svelte | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) 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 f7fe3abfe4..f34359d3df 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte @@ -65,7 +65,10 @@ let deleteOpen = $state(false); /** Repos whose quants are folded away; the rest show them. */ const collapsedQuants = new SvelteSet(); + /** Header mode: families start open, this tracks the ones folded away. */ const collapsedFamilies = new SvelteSet(); + /** Row mode: families start collapsed, this tracks the ones opened. */ + const expandedFamilies = new SvelteSet(); /** Sections rendered as collapsible table rows instead of headers. */ let collapsibleRows = $state(false); const collapsedSections = new SvelteSet(['hidden']); @@ -97,11 +100,17 @@ } } + function isFamilyExpanded(key: string): boolean { + return collapsibleRows ? expandedFamilies.has(key) : !collapsedFamilies.has(key); + } + function toggleFamily(key: string): void { - if (collapsedFamilies.has(key)) { - collapsedFamilies.delete(key); + const folded = collapsibleRows ? expandedFamilies : collapsedFamilies; + + if (folded.has(key)) { + folded.delete(key); } else { - collapsedFamilies.add(key); + folded.add(key); } } @@ -190,7 +199,7 @@ /> {/snippet} -{#snippet row(option: ModelOption)} +{#snippet row(option: ModelOption, indent = 0)} {@const isLoaded = isLoadedOption(option)} {@const favorite = isFavorite(option)} {@const canLoad = getBackendCapabilities(getBackend(option.backendId)).loadUnload} @@ -209,7 +218,7 @@ role="button" tabindex="0" > - + {/snippet} -{#snippet repoRow(entry: ModelQuantGroup)} +{#snippet repoRow(entry: ModelQuantGroup, indent = 0)} {@const isExpanded = !collapsedQuants.has(entry.key)} {@const anyLoaded = entry.quants.some(isLoadedOption)} @@ -256,7 +265,7 @@ role="button" tabindex="0" > - + @@ -301,7 +310,7 @@ {/snippet} -{#snippet quantRow(option: ModelOption)} +{#snippet quantRow(option: ModelOption, indent = 0)} {@const favorite = isFavorite(option)} {@const canLoad = getBackendCapabilities(getBackend(option.backendId)).loadUnload} {@const isLoaded = isLoadedOption(option)} @@ -312,7 +321,7 @@
- + {quant} {option.model} @@ -347,17 +356,17 @@
{/snippet} -{#snippet entryTree(entry: ModelQuantGroup)} +{#snippet entryTree(entry: ModelQuantGroup, indent = 0)} {#if entry.quants.length > 1} - {@render repoRow(entry)} + {@render repoRow(entry, indent)} {#if !collapsedQuants.has(entry.key)} {#each entry.quants as quant (quant.id)} - {@render quantRow(quant)} + {@render quantRow(quant, indent + 24)} {/each} {/if} {:else} - {@render row(entry.base)} + {@render row(entry.base, indent)} {/if} {/snippet} @@ -407,8 +416,8 @@ {/snippet} -{#snippet familyRow(family: ModelFamilyGroup)} - {@const isExpanded = !collapsedFamilies.has(family.key)} +{#snippet familyRow(family: ModelFamilyGroup, indent = 0)} + {@const isExpanded = isFamilyExpanded(family.key)}
{#if collapsibleRows} - + @@ -432,9 +441,11 @@ {:else} - {family.label} + + {family.label} - {family.entries.length} models + {family.entries.length} models + {/if} @@ -509,21 +520,19 @@ {@render sectionRow(group)} {#if !collapsedSections.has(group.key)} -
- {#each group.families as family (family.key)} - {@render familyRow(family)} + {#each group.families as family (family.key)} + {@render familyRow(family, 20)} - {#if !collapsedFamilies.has(family.key)} - {#each family.entries as entry (entry.key)} - {@render entryTree(entry)} - {/each} - {/if} - {/each} + {#if isFamilyExpanded(family.key)} + {#each family.entries as entry (entry.key)} + {@render entryTree(entry, 40)} + {/each} + {/if} + {/each} - {#each group.singles as entry (entry.key)} - {@render entryTree(entry)} - {/each} -
+ {#each group.singles as entry (entry.key)} + {@render entryTree(entry, 40)} + {/each} {/if} {:else} {/if}