diff --git a/muxplex/frontend/app.js b/muxplex/frontend/app.js index 5326634..f635687 100644 --- a/muxplex/frontend/app.js +++ b/muxplex/frontend/app.js @@ -474,8 +474,9 @@ function buildTileHTML(session, index, mobile) { const snapshot = session.snapshot || ''; const lastLines = snapshot.split('\n').slice(-20).join('\n'); + const sourceUrlAttr = session.sourceUrl ? ` data-source-url="${escapeHtml(session.sourceUrl)}"` : ''; return ( - `
` + + `
` + `
` + `${escapeHtml(name)}${badgeHtml}` + `${bellHtml}${escapeHtml(timeStr)}` + @@ -895,10 +896,10 @@ function renderGrid(sessions) { // Bind interaction handlers on each tile document.querySelectorAll('.session-tile').forEach(function(tile) { - on(tile, 'click', function() { openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl }); }); - on(tile, 'keydown', function(e) { + on(tile, 'click', () => openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl || '' })); + on(tile, 'keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') { - openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl }); + openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl || '' }); } }); }); diff --git a/muxplex/frontend/tests/test_app.mjs b/muxplex/frontend/tests/test_app.mjs index a0a33de..5f0e085 100644 --- a/muxplex/frontend/tests/test_app.mjs +++ b/muxplex/frontend/tests/test_app.mjs @@ -496,6 +496,18 @@ test('buildTileHTML wraps snapshot in .tile-body with
 as direct child', ()
   );
 });
 
+test('buildTileHTML includes data-source-url attribute when session has sourceUrl', () => {
+  const session = { name: 'work-project', sourceUrl: 'http://work:8088', snapshot: '' };
+  const html = app.buildTileHTML(session, 0, false);
+  assert.ok(html.includes('data-source-url="http://work:8088"'), 'article should have data-source-url with the session sourceUrl');
+});
+
+test('buildTileHTML does not include data-source-url for local sessions (empty sourceUrl)', () => {
+  const session = { name: 'local-session', sourceUrl: '', snapshot: '' };
+  const html = app.buildTileHTML(session, 0, false);
+  assert.ok(!html.includes('data-source-url'), 'local sessions should not have data-source-url attribute');
+});
+
 // --- renderGrid ---
 
 test('renderGrid clears grid and shows empty-state when sessions array is empty', () => {