fix(ui): show services in settings page

This commit is contained in:
William Valentin
2026-02-14 09:19:57 -08:00
parent 9475ca29f3
commit 4bb4ad4fba
2 changed files with 32 additions and 15 deletions
+1
View File
@@ -71,6 +71,7 @@
"src/gateway/handlers/handlers.test.ts", "src/gateway/handlers/handlers.test.ts",
"src/gateway/server.ts", "src/gateway/server.ts",
"src/gateway/ui/pages/dashboard.js", "src/gateway/ui/pages/dashboard.js",
"src/gateway/ui/pages/settings.js",
"src/gateway/ui/style.css" "src/gateway/ui/style.css"
], ],
"test_status": "pnpm test:run src/gateway/handlers/services.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing" "test_status": "pnpm test:run src/gateway/handlers/services.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
+31 -15
View File
@@ -17,13 +17,14 @@ let _el = null;
async function loadSettings() { async function loadSettings() {
if (!_client || !_el) {return;} if (!_client || !_el) {return;}
let config, tools, channels; let config, tools, channels;
let services;
try { try {
[config, tools, channels] = await Promise.all([ [config, tools, services] = await Promise.all([
_client.call('config.get'), _client.call('config.get'),
_client.call('tools.list'), _client.call('tools.list'),
_client.call('system.channels'), _client.call('system.services'),
]); ]);
} catch (err) { } catch (err) {
_el.innerHTML = ` _el.innerHTML = `
@@ -45,8 +46,8 @@ async function loadSettings() {
// Build tool list // Build tool list
const toolList = tools?.tools ?? []; const toolList = tools?.tools ?? [];
// Build channel list // Build services list
const channelList = channels?.channels ?? []; const serviceList = services?.services ?? [];
_el.innerHTML = ` _el.innerHTML = `
<h1 class="page-title">Settings</h1> <h1 class="page-title">Settings</h1>
@@ -95,18 +96,33 @@ async function loadSettings() {
` : '<div class="empty-state">No tools available</div>'} ` : '<div class="empty-state">No tools available</div>'}
</div> </div>
<h2 class="section-title">Channels</h2> <h2 class="section-title">Services</h2>
<div class="settings-section"> <div class="settings-section">
${channelList.length > 0 ? ` ${serviceList.length > 0 ? `
<div class="channels-grid"> <div class="services-grid">
${channelList.map(ch => ` ${serviceList.map(svc => {
<div class="channel-card"> const typeIcon = svc.type === 'channel' ? '📡' : svc.type === 'automation' ? '⚙️' : '🔧';
<span class="channel-dot ${ch.status}"></span> const statusClass = svc.status === 'connected'
<span class="channel-name">${escapeHtml(ch.name)}</span> ? 'connected'
</div> : svc.status === 'configured'
`).join('')} ? 'configured'
: svc.status === 'error'
? 'error'
: svc.status === 'not_configured'
? 'not-configured'
: 'disconnected';
const itemCount = svc.itemCount ? ` (${svc.itemCount})` : '';
return `
<div class="service-card service-${statusClass}">
<span class="service-type-icon">${typeIcon}</span>
<span class="service-name">${escapeHtml(svc.name)}${itemCount}</span>
<span class="service-status">${escapeHtml(svc.status)}</span>
<span class="service-description text-muted text-xs">${escapeHtml(svc.description ?? '')}</span>
</div>
`;
}).join('')}
</div> </div>
` : '<div class="text-muted text-sm">No channels registered</div>'} ` : '<div class="text-muted text-sm">No services found</div>'}
</div> </div>
<h2 class="section-title">Configuration (read-only)</h2> <h2 class="section-title">Configuration (read-only)</h2>