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:
@@ -474,8 +474,9 @@ function buildTileHTML(session, index, mobile) {
|
|||||||
const snapshot = session.snapshot || '';
|
const snapshot = session.snapshot || '';
|
||||||
const lastLines = snapshot.split('\n').slice(-20).join('\n');
|
const lastLines = snapshot.split('\n').slice(-20).join('\n');
|
||||||
|
|
||||||
|
const sourceUrlAttr = session.sourceUrl ? ` data-source-url="${escapeHtml(session.sourceUrl)}"` : '';
|
||||||
return (
|
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">` +
|
`<div class="tile-header">` +
|
||||||
`<span class="tile-name">${escapeHtml(name)}${badgeHtml}</span>` +
|
`<span class="tile-name">${escapeHtml(name)}${badgeHtml}</span>` +
|
||||||
`<span class="tile-meta">${bellHtml}<span class="tile-time">${escapeHtml(timeStr)}</span></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
|
// Bind interaction handlers on each tile
|
||||||
document.querySelectorAll('.session-tile').forEach(function(tile) {
|
document.querySelectorAll('.session-tile').forEach(function(tile) {
|
||||||
on(tile, 'click', function() { openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl }); });
|
on(tile, 'click', () => openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl || '' }));
|
||||||
on(tile, 'keydown', function(e) {
|
on(tile, 'keydown', (e) => {
|
||||||
if (e.key === 'Enter' || e.key === ' ') {
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl });
|
openSession(tile.dataset.session, { sourceUrl: tile.dataset.sourceUrl || '' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 ---
|
// --- renderGrid ---
|
||||||
|
|
||||||
test('renderGrid clears grid and shows empty-state when sessions array is empty', () => {
|
test('renderGrid clears grid and shows empty-state when sessions array is empty', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user