Skip to content

Commit 16c4f16

Browse files
authored
Merge PR #471: Fix terminal grid rendering across tabs
Fix terminal grid rendering across tabs
2 parents c7d5b27 + 2752696 commit 16c4f16

1 file changed

Lines changed: 23 additions & 22 deletions

File tree

client/app.js

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -491,14 +491,15 @@ class ClaudeOrchestrator {
491491
this.sessions.delete(sessionId);
492492
this.visibleTerminals.delete(sessionId);
493493

494-
// Remove terminal wrapper from UI
495-
const wrapper = document.getElementById(`wrapper-${sessionId}`);
494+
// Remove terminal wrapper from UI (scope to the active grid to avoid cross-tab collisions)
495+
const grid = this.getTerminalGrid();
496+
const wrapper = grid ? grid.querySelector(`#wrapper-${sessionId}`) : document.getElementById(`wrapper-${sessionId}`);
496497
if (wrapper) {
497498
console.log(`Removing terminal wrapper from DOM: ${sessionId}`);
498499
wrapper.remove();
499500
} else {
500501
// Fallback for older DOM shapes
501-
const terminalElement = document.getElementById(`terminal-${sessionId}`);
502+
const terminalElement = grid ? grid.querySelector(`#terminal-${sessionId}`) : document.getElementById(`terminal-${sessionId}`);
502503
if (terminalElement) {
503504
console.log(`Removing terminal element from DOM: ${sessionId}`);
504505
terminalElement.remove();
@@ -3214,10 +3215,10 @@ class ClaudeOrchestrator {
32143215
this.renderTerminalsWithVisibility(allSessions);
32153216
}
32163217

3217-
renderTerminalsWithVisibility(sessionIds) {
3218-
// Render all terminals but apply visibility using CSS (don't destroy DOM)
3219-
this.activeView = sessionIds.filter(id => this.isSessionVisibleInCurrentView(id));
3220-
const grid = this.getTerminalGrid();
3218+
renderTerminalsWithVisibility(sessionIds) {
3219+
// Render all terminals but apply visibility using CSS (don't destroy DOM)
3220+
this.activeView = sessionIds.filter(id => this.isSessionVisibleInCurrentView(id));
3221+
const grid = this.getTerminalGrid();
32213222

32223223
if (!grid) {
32233224
console.error('Terminal grid not found!');
@@ -3236,9 +3237,9 @@ class ClaudeOrchestrator {
32363237

32373238
sessionIds.forEach((sessionId) => {
32383239
const session = this.sessions.get(sessionId);
3239-
const isVisible = this.isSessionVisibleInCurrentView(sessionId);
3240-
const wrapperId = `wrapper-${sessionId}`;
3241-
let wrapper = document.getElementById(wrapperId);
3240+
const isVisible = this.isSessionVisibleInCurrentView(sessionId);
3241+
const wrapperId = `wrapper-${sessionId}`;
3242+
let wrapper = grid.querySelector(`#${wrapperId}`);
32423243

32433244
console.log(`📍 ${sessionId}: session=${!!session}, visible=${isVisible}, exists=${!!wrapper}`);
32443245

@@ -3251,23 +3252,23 @@ class ClaudeOrchestrator {
32513252
grid.appendChild(wrapper);
32523253
console.log(`✅ Appended terminal to grid: ${sessionId}`);
32533254

3254-
// Initialize terminal for newly created element
3255+
// Initialize terminal for newly created element (scope query to wrapper/grid to avoid cross-tab collisions)
32553256
setTimeout(() => {
3256-
const terminalEl = document.getElementById(`terminal-${sessionId}`);
3257+
const terminalEl = wrapper?.querySelector?.(`#terminal-${sessionId}`) || grid.querySelector(`#terminal-${sessionId}`);
32573258
if (terminalEl && !this.terminalManager.terminals.has(sessionId)) {
32583259
this.terminalManager.createTerminal(sessionId, session);
32593260
}
32603261
}, 50);
32613262
}
3262-
} else {
3263-
// Show existing wrapper
3264-
wrapper.style.display = '';
3265-
this.updateTerminalTicketLabel(sessionId);
3266-
3267-
// Refit terminal if it exists
3268-
if (this.terminalManager.terminals.has(sessionId)) {
3269-
requestAnimationFrame(() => {
3270-
this.terminalManager.fitTerminal(sessionId);
3263+
} else {
3264+
// Show existing wrapper
3265+
wrapper.style.display = '';
3266+
this.updateTerminalTicketLabel(sessionId);
3267+
3268+
// Refit terminal if it exists
3269+
if (this.terminalManager.terminals.has(sessionId)) {
3270+
requestAnimationFrame(() => {
3271+
this.terminalManager.fitTerminal(sessionId);
32713272
});
32723273
}
32733274
}
@@ -3285,7 +3286,7 @@ class ClaudeOrchestrator {
32853286

32863287
showClaudeOnly() {
32873288
this.setViewMode('claude');
3288-
}
3289+
}
32893290

32903291
showServersOnly() {
32913292
this.setViewMode('server');

0 commit comments

Comments
 (0)