Files
coder/site
Jake Howell 79724ab0ba chore(site): migrate all <Dialog />s off MUI (#27506)
> 🤖 This PR was modified by Coder Agents on behalf of Jake Howell.

Removes Material UI from every dialog, moving them onto the internal
shadcn/radix `Dialog` primitives. After this change there are **no**
`@mui/material/Dialog` usages left in `site/src`.

## Changes

- Consolidated `components/Dialogs/*` → `components/Dialog/*` and folded
the old `ConfirmDeleteDialog` into `ConfirmDialog` (`type="delete"`).
- Rewrote `ConfirmDialog`, `DeleteDialog`, `WorkspaceDeleteDialog`,
`ScheduleDialog`, and `AnnouncementBannerDialog` onto the internal
primitives (native `Input`/`Label`/`Checkbox`/`Link` instead of MUI).
- Finished the migration for the last two MUI hold-outs:
`UpdateBuildParametersDialog` and `MissingTemplateVariablesDialog`.
- Dialog prop types now compose the rendered component's props
(`ComponentProps<typeof Dialog>` / MUI `DialogProps`) instead of
hand-rolled `{ open; onOpenChange }` shapes.

## Testing

AI-Driven manual dogfood sweep in a live instance (premium license),
driven in a browser. Each dialog checked for logical rendering (layout,
variant styling, buttons, no overlap/blank/console error) and function
(open, primary action, cancel/close, guard states):

| Dialog / surface | How tested | Result |
| --- | --- | --- |
| `ConfirmDialog` (delete / info / success) | Token delete,
update-confirm, change-version | ✅ |
| `DeleteDialog` (type-to-confirm) | Delete user, group, license,
provider, OAuth2 app | ✅ |
| `WorkspaceDeleteDialog` | Workspace actions → Delete (+ orphan path
via failed workspace) | ✅ |
| `ScheduleDialog` | Template schedule → dormancy/deletion warning | ✅ |
| `AnnouncementBannerDialog` | Deployment → Appearance → New banner
(live preview + color) | ✅ |
| `ChangeWorkspaceVersionDialog` | Workspace actions → Change version |
✅ |
| `DownloadLogsDialog` | Workspace actions → Download logs | ✅ |
| Batch delete (workspaces) | Workspaces list → multi-select → Delete |
✅ |
| `TemplatePageHeader` delete | Template → Delete (cancelled) | ✅ |
| `FileDialog` (create/rename/delete) | Template editor file tree | ✅ |
| `MissingTemplateVariablesDialog` *(migrated)* | Editor → add variable
→ Build | ✅ |
| `PublishTemplateVersionDialog` | Editor → Publish | ✅ |
| `UpdateBuildParametersDialog` *(migrated)* | Classic flow + required
param → workspace Update (renders + submits) | ✅ |
| Update-confirmation (`WorkspaceUpdateDialogs`) | Workspace Update | ✅
|
| Suspend/activate confirm | Users → member row | ✅ |
| `ResetPasswordDialog` | Users → member → Reset password | ✅ |
| Token delete confirm | Settings → Tokens | ✅ |
| Create-token confirm | Token create flow | ✅ |
| SSH key regenerate confirm | Settings → SSH Keys | ✅ |
| Change-login-type confirm | Settings → Security | ✅ |
| Secret delete | Settings → Secrets | ✅ |
| Group delete | Admin → Groups | ✅ |
| Org member remove | Admin → Organization → Members | ✅ |
| License remove | Deployment → Licenses (cancelled) | ✅ |
| Announcement banner delete | Deployment → Appearance | ✅ |
| OAuth2 app delete | Deployment → OAuth2 apps | ✅ |
| `ModelFormDialogs` (form + delete) | AI → Models | ✅ |
| Provider delete | AI → Providers | ✅ |
| Gateway key create/delete | AI → Gateway keys | ✅ |
| `MCPServerFormDialogs` delete | AI → MCP servers | ✅ |
| Personal skill (create form + delete) | Agents → Personal Skills | ✅ |
| Spend user-override (add + delete) | AI → Spend | ✅ |

Human tested:

- [x] template version promote/archive
- [x] external-auth/OAuth2-provider delete 
- [x] custom-role delete
- [x] cancel-provisioner-job

Things that have a chance to bleed:

- tasks dialogs
- dormant inline confirm

Should be known that each of these renders through the already-verified
`ConfirmDialog`/`DeleteDialog`, so the underlying component is covered
even where the specific trigger wasn't reachable.

<details>
<summary>Plan &amp; decision log</summary>

**Goal:** finish the de-MUI migration everywhere and confirm every
affected modal renders logically and functions.

**Phase 1 - complete the migration**

- Confirmed only two files still rendered MUI `Dialog`
(`UpdateBuildParametersDialog`, `MissingTemplateVariablesDialog`);
ported both to the internal primitives, preserving the `{ open, onClose,
... }` public API (mapped to `onOpenChange` internally) so call sites
were unchanged. radix now wires `aria-labelledby`/`aria-describedby`,
removing a duplicated element id.

**Phase 2 - sighting sweep (live browser, premium license)**

- Batch A (workspaces/tasks): 4 PASS, rest state-gated.
- Batch B (templates): `MissingTemplateVariablesDialog`, `FileDialog`,
`PublishTemplateVersionDialog`, template delete - all PASS.
- `UpdateBuildParametersDialog`: reached by enabling classic parameter
flow + pushing a version with a required parameter - PASS (renders +
submits).
- Batch C (users/org/settings): 10 PASS.
- Batch D (deployment/AI): 10 PASS.

**Decisions**

- Kept `ConfirmDialog`-wrapper prop types explicit (composing
`DialogProps` there reintroduced a MUI smell).
- Dropped the unused `ConfirmDialogType` export (knip) and updated the
`WorkspacePage` orphan-delete test: the radix `Checkbox` puts the test
id on the `role=checkbox` button itself, so the previous
`within(...).getByRole` no longer matched.

</details>
2026-07-31 03:23:00 +00:00
..
…
…
…
…