Skip to content

Manage a remote in a pane, not in a dialog - #293

Closed
pcarrier wants to merge 1 commit into
mainfrom
pane
Closed

pcarrier wants to merge 1 commit into
mainfrom
pane

Conversation

@pcarrier

Copy link
Copy Markdown
Contributor

The panels behind Manage — a server's applications, its connected clients, its units, its extensions — were a modal on top of a modal, so they were the least durable thing on the screen. Anything that closed an overlay closed them; one of the things that closes an overlay is a window asking to be raised; and enabling an application in the Session tab starts an application that does exactly that. The panel dismissed itself one second after being used, and the way back in was two dialogs.

They are now a BSP tile like any other: manage:<conn>:. It splits next to whatever it manages, it survives focus going elsewhere, the URL hash and the tab registry restore it, and it parks in the dock as a card. The card is a placeholder rather than a live panel — a parked tile that kept its client watch would cost a catalog a second for a picture nobody is reading.

The trailing colon in the assignment is load-bearing: parseTileAssignment splits on the first ":" after the prefix, so "manage:hound" parses as nothing at all, and a tile that fails to parse renders an empty pane.

ConnectionControl (the nested overlay) goes away with its only caller, and RemotesOverlay loses the props that fed it. What it gains is onManage, so a shell with nowhere to put a tile shows no button.

e2e: remote-panels now asserts pane content and a hash that survives a reload instead of a second dialog. Every Manage locator is tightened to /^Manage$/ — a parked manage card is a button whose name ends in the same word, and it sits under the modal backdrop unclickably.

@indent

indent Bot commented Aug 19, 2026

Copy link
Copy Markdown
PR Summary

Moves "Manage a remote" out of a modal-on-modal and into a first-class BSP tile addressed as manage:<conn>:. The old nested overlay was the least durable thing on screen — enabling an application in the Session tab raises a window, and a window raise closes whatever overlay is up, so the panel dismissed itself right after being used. As a tile it survives focus changes, restores from the URL hash + tab registry, and parks in the dock as a placeholder card.

  • Adds a manage tile kind (manageAssignment, MANAGE_PREFIX) threaded through parseTileAssignment/isTileAssignment/isContentAssignment and both bsp barrels; the trailing colon is load-bearing so the connection parses as the whole address.
  • New ManageTile.tsx hosts ConnectionPanels as pane content and draws a placeholder card in preview (dock) mode instead of keeping live client/unit watches alive.
  • Deletes ConnectionControl.tsx and drops RemotesOverlay's workspace/sessions/surfaces/readOnlyConnections props in favor of an onManage(name) callback that opens the tile and closes the dialog.
  • Threads read-only (.ro share) awareness through as isConnectionReadOnly so the clients tab isn't offered where the client-control family is dropped; wires the tile into BlitTile, the Cmd+K switcher, and tileDisplay cards.
  • e2e Manage locators tightened to /^Manage$/, and remote-panels now asserts pane content plus a tile= hash that survives reload instead of a second dialog.

Issues

Review closed.

View session

The panels behind Manage — a server's applications, its connected
clients, its units, its extensions — were a modal on top of a modal, so
they were the least durable thing on the screen. Anything that closed an
overlay closed them; one of the things that closes an overlay is a window
asking to be raised; and enabling an application in the Session tab
starts an application that does exactly that. The panel dismissed itself
one second after being used, and the way back in was two dialogs.

They are now a BSP tile like any other: `manage:<conn>:`. It splits next
to whatever it manages, it survives focus going elsewhere, the URL hash
and the tab registry restore it, and it parks in the dock as a card. The
card is a placeholder rather than a live panel — a parked tile that kept
its client watch would cost a catalog a second for a picture nobody is
reading.

The trailing colon in the assignment is load-bearing: parseTileAssignment
splits on the first ":" after the prefix, so "manage:hound" parses as
nothing at all, and a tile that fails to parse renders an empty pane.

ConnectionControl (the nested overlay) goes away with its only caller,
and RemotesOverlay loses the props that fed it. What it gains is
`onManage`, so a shell with nowhere to put a tile shows no button.

e2e: remote-panels now asserts pane content and a hash that survives a
reload instead of a second dialog. Every Manage locator is tightened to
/^Manage$/ — a parked manage card is a button whose name ends in the same
word, and it sits under the modal backdrop unclickably.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown

🔗 Preview: https://blit-3568jp1xk-indent.vercel.app

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown

Coverage

Crate Lines Functions Regions
alacritty-driver 75.7% (934/1234) 78.7% (74/94) 79.0% (1521/1926)
browser 0.0% (0/825) 0.0% (0/69) 0.0% (0/1404)
cli 39.1% (5731/14667) 45.4% (571/1258) 39.9% (8942/22384)
compositor 35.1% (6042/17209) 49.7% (501/1009) 34.9% (8306/23786)
desktop 77.6% (4164/5366) 70.4% (367/521) 74.0% (5772/7804)
fonts 85.3% (756/886) 89.9% (71/79) 86.4% (1485/1719)
fssync 92.4% (5507/5961) 94.4% (501/531) 92.6% (10169/10981)
gateway 34.0% (669/1966) 40.2% (68/169) 31.4% (1029/3279)
git 87.7% (4643/5295) 90.2% (378/419) 87.5% (7409/8463)
guest 82.2% (2217/2697) 80.0% (252/315) 81.1% (3718/4584)
lsp 77.2% (2688/3483) 79.4% (262/330) 74.9% (4210/5619)
proxy 19.2% (172/898) 20.5% (26/127) 21.0% (293/1392)
remote 91.6% (16924/18477) 94.4% (1190/1261) 89.1% (27521/30882)
sd-notify 73.9% (68/92) 100.0% (6/6) 83.2% (109/131)
server 56.2% (32150/57159) 63.3% (2761/4360) 57.5% (48711/84730)
ssh 32.2% (165/512) 48.2% (27/56) 31.4% (261/830)
upsidedown 31.4% (391/1247) 27.8% (55/198) 34.8% (797/2287)
webrtc-forwarder 8.5% (238/2805) 10.7% (22/205) 6.3% (289/4595)
webserver 64.4% (1250/1941) 67.6% (173/256) 66.6% (2099/3151)
Total 59.4% (84709/142720) 64.9% (7305/11263) 60.3% (132641/219947)

@blacksmith-sh

blacksmith-sh Bot commented Aug 19, 2026

Copy link
Copy Markdown

Found 7 test failures on Blacksmith runners:

Failures

Test View Logs
[chromium] › tests/
pane-tools.spec.ts:311:7 › Parked terminal does not resurrect › closing the session tha
t displaced a parked one shows it, not an empty pane
View Logs
[chromium] › tests/
parked-drag.spec.ts:50:7 › Parked pane drag › a parked terminal is inert and drags into
the main view
View Logs
[chromium] › tests/
parked-drag.spec.ts:94:7 › Parked pane drag › a parked card drags into a specific BSP p
ane
View Logs
[chromium] › tests/
text-prediction.spec.ts:102:7 › host text prediction › a Backspace through the field de
letes one character, not none or two
View Logs
[chromium] › tests/
touch-draggables.spec.ts:205:7 › Touch drag on list rows › a swipe across a dock card s
till dismisses it
View Logs
Parked pane drag/a parked card drags into a specific BSP pane View Logs
Parked pane drag/a parked terminal is inert and drags into the main view View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant