From 43da6b86769a089e25305d17883ea13df756af33 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Fri, 23 Jan 2026 15:09:50 +0100 Subject: [PATCH] feat: UI improvements --- .../app/chat/ChatForm/ChatForm.svelte | 4 +- .../ChatFormActionFileAttachments.svelte | 9 +- .../ChatFormActions/ChatFormActions.svelte | 10 +- .../webui/src/lib/components/app/index.ts | 1 + .../app/mcp/McpActiveServersAvatars.svelte | 67 ++++++++ .../lib/components/app/mcp/McpSelector.svelte | 160 ++++++++---------- .../mcp/McpServerCard/McpServerCard.svelte | 5 +- .../McpServerCard/McpServerCardActions.svelte | 4 +- .../app/mcp/McpSettingsSection.svelte | 70 ++++++-- .../components/app/misc/SearchInput.svelte | 2 +- .../app/misc/SearchableDropdownMenu.svelte | 2 +- .../app/models/ModelsSelector.svelte | 4 +- .../lib/components/ui/button/button.svelte | 3 +- .../server/webui/src/lib/stores/mcp.svelte.ts | 36 +++- 14 files changed, 252 insertions(+), 125 deletions(-) create mode 100644 tools/server/webui/src/lib/components/app/mcp/McpActiveServersAvatars.svelte diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte index 7e469682c2..768c9f5b4f 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte @@ -304,11 +304,11 @@ />
{ - return !hasVisionModality - ? 'Text files and PDFs supported. Images, audio, and video require vision models.' - : 'Add files, prompts and MCP Servers'; - }); + const fileUploadTooltipText = 'Add files, system prompt or MCP Servers';
@@ -46,8 +42,9 @@ +{/if} diff --git a/tools/server/webui/src/lib/components/app/mcp/McpSelector.svelte b/tools/server/webui/src/lib/components/app/mcp/McpSelector.svelte index b94aaf7101..3c3d156b65 100644 --- a/tools/server/webui/src/lib/components/app/mcp/McpSelector.svelte +++ b/tools/server/webui/src/lib/components/app/mcp/McpSelector.svelte @@ -1,13 +1,13 @@ {#if hasMcpServers} @@ -112,7 +79,7 @@ bind:searchValue={searchQuery} placeholder="Search servers..." emptyMessage="No servers found" - isEmpty={filteredMcpServers().length === 0} + isEmpty={filteredMcpServers.length === 0} {disabled} onOpenChange={handleDropdownOpen} > @@ -154,37 +121,58 @@ {/snippet} - {#each filteredMcpServers() as server (server.id)} - {@const healthState = mcpStore.getHealthCheckState(server.id)} - {@const hasError = healthState.status === HealthCheckStatus.Error} - {@const isEnabledForChat = isServerEnabledForChat(server.id)} +
+ {#if isLoading} + {#each mcpServers as server (server.id)} +
+
+ + +
+ +
+ {/each} + {:else} + {#each filteredMcpServers as server (server.id)} + {@const healthState = mcpStore.getHealthCheckState(server.id)} + {@const hasError = healthState.status === HealthCheckStatus.Error} + {@const isEnabledForChat = isServerEnabledForChat(server.id)} -
-
- {#if getFaviconUrl(server.url)} - { - (e.currentTarget as HTMLImageElement).style.display = 'none'; - }} +
- toggleServerForChat(server.id)} - disabled={hasError} - /> -
- {/each} + + {/each} + {/if} +
{#snippet footer()} diff --git a/tools/server/webui/src/lib/components/app/mcp/McpServerCard/McpServerCard.svelte b/tools/server/webui/src/lib/components/app/mcp/McpServerCard/McpServerCard.svelte index c44249acc9..e39a11d341 100644 --- a/tools/server/webui/src/lib/components/app/mcp/McpServerCard/McpServerCard.svelte +++ b/tools/server/webui/src/lib/components/app/mcp/McpServerCard/McpServerCard.svelte @@ -18,12 +18,13 @@ interface Props { server: MCPServerSettingsEntry; faviconUrl: string | null; + enabled?: boolean; onToggle: (enabled: boolean) => void; onUpdate: (updates: Partial) => void; onDelete: () => void; } - let { server, faviconUrl, onToggle, onUpdate, onDelete }: Props = $props(); + let { server, faviconUrl, enabled, onToggle, onUpdate, onDelete }: Props = $props(); let healthState = $derived(mcpStore.getHealthCheckState(server.id)); let displayName = $derived(getMcpServerLabel(server, healthState)); @@ -116,7 +117,7 @@ + +
{/if} - {#if servers.length > 0} + {#if rawServers.length > 0}
- {#each servers as server (server.id)} - mcpStore.updateServer(server.id, { enabled })} - onUpdate={(updates) => mcpStore.updateServer(server.id, updates)} - onDelete={() => mcpStore.removeServer(server.id)} - /> - {/each} + {#if isLoading} + + {#each rawServers as server (server.id)} + + +
+
+ + + +
+ +
+ + +
+ + + +
+ + +
+ + +
+ + + + + +
+ + + +
+
+ {/each} + {:else} + {#each servers as server (server.id)} + await conversationsStore.toggleMcpServerForChat(server.id)} + onUpdate={(updates) => mcpStore.updateServer(server.id, updates)} + onDelete={() => mcpStore.removeServer(server.id)} + /> + {/each} + {/if}
{/if}
diff --git a/tools/server/webui/src/lib/components/app/misc/SearchInput.svelte b/tools/server/webui/src/lib/components/app/misc/SearchInput.svelte index 15cd6abaa9..9a8088d9da 100644 --- a/tools/server/webui/src/lib/components/app/misc/SearchInput.svelte +++ b/tools/server/webui/src/lib/components/app/misc/SearchInput.svelte @@ -46,7 +46,7 @@
-
+
{@render children()} {#if isEmpty} diff --git a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte index 7e183bd979..cdbb294125 100644 --- a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte +++ b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte @@ -277,7 +277,7 @@