pin the app types on the four locked screens that had none

The allow-list existed on fourteen screens and was missing from every other one, which the previous
commit turned from fifty lines into one. These four are locked — the user cannot change what is in
the panel — so an appType that stops resolving strands them on the empty teal box in PanelSlot with
no picker and no way back.

Checked against what is actually persisted rather than against the defaults: `screens/desktop` holds
`officerdev/desktop` and `screens/files` holds `officerdev/file-browser`, both already inside the
list they are now being given. `screens/terminal` and `screens/dashboards` have no row at all — those
screens have never been opened on this machine — so they seed from the default, which also matches.
Nothing is rewritten by this.

Browser and Email stay unguarded on purpose. Their panels resolve through `components`, which
PanelSlot keys on the *panel id*, and their layouts carry `appType: null` — the app type is never
consulted, so pinning it would pin nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 10:10:14 +00:00
co-authored by Claude Opus 5
parent 99ee9dbb88
commit 653201f268
4 changed files with 19 additions and 3 deletions
@@ -18,6 +18,7 @@ export const DashboardsScreen = () => {
<WorkspaceView
workspace={workspace}
locked
appTypes={{ allowed: ['dashboard-list', 'dashboard-preview'], fallback: 'dashboard-preview' }}
mobilePanelId={mobilePanelId}
onMobilePanelChange={(id) => {
if (!id)
@@ -8,7 +8,11 @@ export const DesktopScreen = () => {
return (
<div className="h-full w-full">
<WorkspaceView workspace={workspace} locked />
<WorkspaceView
workspace={workspace}
locked
appTypes={{ allowed: ['officerdev/desktop'], fallback: 'officerdev/desktop' }}
/>
</div>
);
};
@@ -9,7 +9,14 @@ export const FilesScreen = () => {
return (
<div className="h-full w-full">
<WorkspaceView workspace={workspace} locked ephemeral={ephemeral} />
{/* The file-viewer panels `ephemeral` adds are a layout of their own, rendered beside this one —
they never enter `workspace.value`, so the allow-list does not have to know about them. */}
<WorkspaceView
workspace={workspace}
locked
appTypes={{ allowed: ['officerdev/file-browser'], fallback: 'officerdev/file-browser' }}
ephemeral={ephemeral}
/>
</div>
);
};
@@ -8,7 +8,11 @@ export const TerminalScreen = () => {
return (
<div className="h-full w-full">
<WorkspaceView workspace={workspace} locked />
<WorkspaceView
workspace={workspace}
locked
appTypes={{ allowed: ['officerdev/terminal'], fallback: 'officerdev/terminal' }}
/>
</div>
);
};