diff --git a/muxplex/frontend/app.js b/muxplex/frontend/app.js index e4cbbb9..15161a6 100644 --- a/muxplex/frontend/app.js +++ b/muxplex/frontend/app.js @@ -760,8 +760,8 @@ function renderGrid(sessions) { // Build status tiles for auth_failed/unreachable sessions even when no regular sessions exist var statusTilesHtml = ''; (sessions || []).forEach(function(session) { - if (session.status === 'auth_failed') statusTilesHtml += buildStatusTileHTML(session.name, 'Auth required', 'auth'); - else if (session.status === 'unreachable') statusTilesHtml += buildStatusTileHTML(session.name, 'Offline', 'offline'); + if (session.status === 'auth_failed') statusTilesHtml += buildStatusTileHTML(session.deviceName, 'Auth required', 'auth'); + else if (session.status === 'unreachable') statusTilesHtml += buildStatusTileHTML(session.deviceName, 'Offline', 'offline'); }); if (grid) grid.innerHTML = statusTilesHtml; // Only show empty-state when there are truly no tiles at all @@ -803,8 +803,8 @@ function renderGrid(sessions) { // Append status tiles for auth_failed and unreachable sessions var statusTilesHtml = ''; (sessions || []).forEach(function(session) { - if (session.status === 'auth_failed') statusTilesHtml += buildStatusTileHTML(session.name, 'Auth required', 'auth'); - else if (session.status === 'unreachable') statusTilesHtml += buildStatusTileHTML(session.name, 'Offline', 'offline'); + if (session.status === 'auth_failed') statusTilesHtml += buildStatusTileHTML(session.deviceName, 'Auth required', 'auth'); + else if (session.status === 'unreachable') statusTilesHtml += buildStatusTileHTML(session.deviceName, 'Offline', 'offline'); }); if (grid) grid.innerHTML = html + statusTilesHtml; diff --git a/muxplex/frontend/tests/test_app.mjs b/muxplex/frontend/tests/test_app.mjs index 7a76b8f..40b99d5 100644 --- a/muxplex/frontend/tests/test_app.mjs +++ b/muxplex/frontend/tests/test_app.mjs @@ -626,7 +626,7 @@ test('renderGrid includes auth tile HTML when a session has auth_failed status', const sessions = [ { name: 'my-session', snapshot: 'hello' }, - { name: 'Workstation', status: 'auth_failed' }, + { deviceName: 'Workstation', status: 'auth_failed' }, ]; app.renderGrid(sessions); @@ -651,7 +651,7 @@ test('renderGrid includes offline tile HTML when a session has unreachable statu const sessions = [ { name: 'my-session', snapshot: 'hello' }, - { name: 'Dev Server', status: 'unreachable' }, + { deviceName: 'Dev Server', status: 'unreachable' }, ]; app.renderGrid(sessions); @@ -4730,3 +4730,31 @@ test('updateFaviconBadge does not show activity for only-hidden sessions with be app._setServerSettings(null); app._setCurrentSessions([]); }); + +// --- renderGrid: status tiles use deviceName not name --- + +test('renderGrid status tiles use session.deviceName not session.name for offline devices', () => { + // Status entries (unreachable/auth_failed) have deviceName but no name. + // buildStatusTileHTML must receive session.deviceName so the tile shows the device label. + const grid = { innerHTML: '' }; + const emptyState = { style: {}, classList: { add() {}, remove() {} } }; + const origGetById = globalThis.document.getElementById; + globalThis.document.getElementById = (id) => { + if (id === 'session-grid') return grid; + if (id === 'empty-state') return emptyState; + return null; + }; + + // An unreachable device: has deviceName but no name (as federation returns it) + app.renderGrid([{ status: 'unreachable', deviceName: 'my-server', remoteId: 1 }]); + + assert.ok(grid.innerHTML.includes('my-server'), + 'offline status tile HTML must include the deviceName "my-server"'); + + // Also verify an auth_failed device shows its deviceName + app.renderGrid([{ status: 'auth_failed', deviceName: 'auth-box', remoteId: 2 }]); + assert.ok(grid.innerHTML.includes('auth-box'), + 'auth_failed status tile HTML must include the deviceName "auth-box"'); + + globalThis.document.getElementById = origGetById; +});