|
162 | 162 | // separator (2-way compare summary) which only makes sense between |
163 | 163 | // adjacent records in flat order — in tree view two consecutive |
164 | 164 | // records can sit in different regions, so the diff is misleading. |
165 | | - function renderRecordItem(rec, idx, treeMode) { |
| 165 | + // Compare-mode merge prepends `<archive_label>/` to every record name and |
| 166 | + // session name (observatory.py compare_archives). Inside an archive column |
| 167 | + // the label is already shown in the column header, so we strip it from the |
| 168 | + // displayed text only — `rec.name` / `session.name` themselves stay |
| 169 | + // prefixed because graph_ref resolution and the global record map depend |
| 170 | + // on the unique name. |
| 171 | + function _stripArchivePrefix(displayed, prefix) { |
| 172 | + if (!prefix) return displayed; |
| 173 | + const head = prefix + '/'; |
| 174 | + return displayed.startsWith(head) ? displayed.slice(head.length) : displayed; |
| 175 | + } |
| 176 | + |
| 177 | + function renderRecordItem(rec, idx, treeMode, displayPrefix) { |
166 | 178 | const isSelected = state.selectedIndices.has(idx); |
167 | 179 | const checkbox = state.selectionMode |
168 | 180 | ? `<input type="checkbox" class="selection-checkbox" ${isSelected ? 'checked' : ''} onclick="toggleSelect(${idx}, event)" style="margin-right:0.5rem;">` |
|
228 | 240 | <div style="display:flex;align-items:center;overflow:hidden;flex:1;"> |
229 | 241 | ${checkbox} |
230 | 242 | <div style="flex:1;min-width:0;"> |
231 | | - <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">${escapeHtml(rec.name || '')}</div> |
| 243 | + <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">${escapeHtml(_stripArchivePrefix(rec.name || '', displayPrefix))}</div> |
232 | 244 | </div> |
233 | 245 | </div> |
234 | 246 | <div class="badges">${badges}</div> |
|
248 | 260 | return false; |
249 | 261 | } |
250 | 262 |
|
251 | | - function _renderSessionDashboardLink(session) { |
| 263 | + function _renderSessionDashboardLink(session, displayPrefix) { |
252 | 264 | const active = _isActiveSession(session.id) ? 'active' : ''; |
253 | | - const label = session.name || session.id || '(unnamed session)'; |
| 265 | + const rawLabel = session.name || session.id || '(unnamed session)'; |
| 266 | + const label = _stripArchivePrefix(rawLabel, displayPrefix); |
254 | 267 | return ` |
255 | 268 | <li class="index-item session-dashboard-link ${active}" |
256 | 269 | onclick="selectSession('${escapeHtml(session.id)}')"> |
|
259 | 272 | `; |
260 | 273 | } |
261 | 274 |
|
262 | | - function renderIndexFlat(records, sessionFilter) { |
| 275 | + function renderIndexFlat(records, sessionFilter, displayPrefix) { |
263 | 276 | let html = ''; |
264 | 277 | const filtered = sessionFilter |
265 | 278 | ? records.map((r, i) => ({rec: r, idx: i})).filter(x => x.rec.session_id === sessionFilter) |
266 | 279 | : records.map((r, i) => ({rec: r, idx: i})); |
267 | 280 | filtered.forEach(({rec, idx}) => { |
268 | | - html += renderRecordItem(rec, idx, false); |
| 281 | + html += renderRecordItem(rec, idx, false, displayPrefix); |
269 | 282 | }); |
270 | 283 | return html; |
271 | 284 | } |
|
277 | 290 | // adjacent records is suppressed in tree view (renderRecordItem |
278 | 291 | // receives treeMode=true) since adjacent records in the records[] |
279 | 292 | // array may not be visually adjacent under the tree. |
280 | | - function renderIndexTree(records, sessionFilter) { |
| 293 | + function renderIndexTree(records, sessionFilter, displayPrefix) { |
281 | 294 | let html = ''; |
282 | 295 |
|
283 | 296 | // Walk records preserving order. Track open region path; when the |
|
328 | 341 | openRegion(stack[i], fullKey); |
329 | 342 | } |
330 | 343 |
|
331 | | - html += renderRecordItem(rec, idx, true); |
| 344 | + html += renderRecordItem(rec, idx, true, displayPrefix); |
332 | 345 | }); |
333 | 346 |
|
334 | 347 | closeTo(0); |
|
337 | 350 |
|
338 | 351 | function _renderArchiveColumn(archive, sessions, records, useTree) { |
339 | 352 | const sessionsInArchive = sessions.filter((s) => s.archive === archive.label); |
| 353 | + const displayPrefix = archive.label; |
340 | 354 | let inner = ''; |
341 | 355 | sessionsInArchive.forEach((session) => { |
342 | | - inner += _renderSessionDashboardLink(session); |
| 356 | + inner += _renderSessionDashboardLink(session, displayPrefix); |
343 | 357 | inner += useTree |
344 | | - ? renderIndexTree(records, session.id) |
345 | | - : renderIndexFlat(records, session.id); |
| 358 | + ? renderIndexTree(records, session.id, displayPrefix) |
| 359 | + : renderIndexFlat(records, session.id, displayPrefix); |
346 | 360 | }); |
347 | 361 | return ` |
348 | 362 | <li class="archive-column"> |
|
0 commit comments