feat: grid click handler routes sourceUrl via data-source-url attribute on tiles

- In buildTileHTML, make data-source-url attribute conditional: only add when
  session.sourceUrl is non-empty (local sessions omit the attribute entirely)
- In renderGrid click/keydown handlers, pass sourceUrl with || '' fallback so
  local sessions (where data-source-url is absent) pass empty string to openSession
- Add 2 tests: one verifying data-source-url present for remote sessions,
  one verifying data-source-url absent for local sessions (empty sourceUrl)

Task: task-9-grid-click-routes-source-url
This commit is contained in:
Brian Krabach
2026-03-31 04:01:56 -07:00
parent 28d32d21be
commit ddc52f2b36
2 changed files with 17 additions and 4 deletions
+5 -4
View File
@@ -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 (
`<article class="${classes}" data-session="${escapedName}" data-session-key="${escapeHtml(session.sessionKey || name)}" data-source-url="${escapeHtml(session.sourceUrl || '')}" tabindex="0" role="listitem" aria-label="${escapedName}">` +
`<article class="${classes}" data-session="${escapedName}" data-session-key="${escapeHtml(session.sessionKey || name)}"${sourceUrlAttr} tabindex="0" role="listitem" aria-label="${escapedName}">` +
`<div class="tile-header">` +
`<span class="tile-name">${escapeHtml(name)}${badgeHtml}</span>` +
`<span class="tile-meta">${bellHtml}<span class="tile-time">${escapeHtml(timeStr)}</span></span>` +
@@ -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 || '' });
}
});
});
+12
View File
@@ -496,6 +496,18 @@ test('buildTileHTML wraps snapshot in .tile-body with <pre> 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', () => {