Public: anyone can read this; the crew can change it.
"Delete this board" goes through the confirm page, which names the board and says what goes with it #7987
Check · Review · Land · Live done — Landed and live in production.
"Delete this board" on `/boards/<slug>` now opens the confirm page first, the way deleting a label or a webhook already does. It used to be a plain POST form that removed the board in one click.
shipped production is serving it deploy 8d74cf9
"Delete this board" on /boards/<slug> now opens the confirm page first, the way deleting a label or a webhook already does. It used to be a plain POST form that removed the board in one click.
src/web/pages/boards-view.ts: the button is nowconfirmAction({ action: "/boards/<slug>/delete", verb: "Delete this board" }), so it links to/-/confirm?to=%2Fboards%2F<slug>%2Fdelete.src/web/pages/search.ts: one newDESTRUCTIVEentry for^/boards/([^/]+)/delete$, placed right after the labels entry so it does not collide with the invite-revoke entry that another issue adds at the end of the list. The page says "Delete the board <slug>?" (slug decoded, then escaped like every other title) with the detail "Its panels and pins go with it. Nothing it reads is touched." The button reads "Delete board" and no phrase has to be typed.boardPostis unchanged, so the confirm page's form still posts to/boards/<slug>/delete.test/boards-page.test.ts: a new test makes a board, checks that its page links the button to the confirm page and no longer has a direct delete form, then checks that the confirm page answers 200 with the title, the detail and the form posting to the delete route. It fails without the change.test/boards-store.test.ts: one assertion changed because the test itself was wrong after this change. "keep every form" expected anaction="/boards/fleet-health/delete"form on the board page; it now expects the confirm link for delete and still checks every other form.
bun scripts/gate.ts, bun scripts/design-lint.ts and bun x tsc --noEmit are clean, and bun test test/boards-page.test.ts test/boards-store.test.ts passes. The earlier run that found the stale assertion also covered boards-doors, boards-view-fields, board, confirm-parent-timing and web-ui. scripts/fast.ts called the diff too broad (983 files), so I chose these files by hand.
Not done: a malformed % in to= would make decodeURIComponent throw. The confirm entries that already decode a name share this, so I left it as it is.
To try it: as an admin, open any board, click "Delete this board", read the confirm page, then confirm.
🤖 Generated with Claude Code
Approved. "Delete this board" is now a confirmAction link to /-/confirm, which works with JavaScript off. The preview confirm page answers 200 with "Delete the board <slug>?" and the form posts to the delete route. The new DESTRUCTIVE entry follows the existing pattern, and the terminal already asks y/n before deleting. The new test would fail without the change, and the changed assertion in boards-store.test.ts was genuinely stale. I did not run the tests myself. Two things I would do next: (1) show the board title as well as the slug on the confirm page, since people know the board by its title; (2) wrap decodeURIComponent in the DESTRUCTIVE entries so a malformed % in to= gives the 404 page and not a 500. The pull already notes this one as shared by the existing entries.
"Delete this board" on
/boards/<slug>now opens the confirm page first, the way deleting a label or a webhook already does. It used to be a plain POST form that removed the board in one click.src/web/pages/boards-view.ts: the button is nowconfirmAction({ action: "/boards/<slug>/delete", verb: "Delete this board" }), so it links to/-/confirm?to=%2Fboards%2F<slug>%2Fdelete.src/web/pages/search.ts: one newDESTRUCTIVEentry for^/boards/([^/]+)/delete$, placed right after the labels entry so it does not collide with the invite-revoke entry that another issue adds at the end of the list. The page says "Delete the board <slug>?" (slug decoded, then escaped like every other title) with the detail "Its panels and pins go with it. Nothing it reads is touched." The button reads "Delete board" and no phrase has to be typed.boardPostis unchanged, so the confirm page's form still posts to/boards/<slug>/delete.test/boards-page.test.ts: a new test makes a board, checks that its page links the button to the confirm page and no longer has a direct delete form, then checks that the confirm page answers 200 with the title, the detail and the form posting to the delete route. It fails without the change.test/boards-store.test.ts: one assertion changed because the test itself was wrong after this change. "keep every form" expected anaction="/boards/fleet-health/delete"form on the board page; it now expects the confirm link for delete and still checks every other form.bun scripts/gate.ts,bun scripts/design-lint.tsandbun x tsc --noEmitare clean, andbun test test/boards-page.test.ts test/boards-store.test.tspasses. The earlier run that found the stale assertion also coveredboards-doors,boards-view-fields,board,confirm-parent-timingandweb-ui.scripts/fast.tscalled the diff too broad (983 files), so I chose these files by hand.Not done: a malformed
%into=would makedecodeURIComponentthrow. The confirm entries that already decode a name share this, so I left it as it is.To try it: as an admin, open any board, click "Delete this board", read the confirm page, then confirm.
🤖 Generated with Claude Code
Closes #7963