You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(ui): GitHub-style type-to-confirm on every delete (v2.1.21)
Every destructive action now requires typing a confirmation phrase before the
red button activates — a misclick can't delete the wrong thing.
- Single named resource (container/image/volume/network/server/key/registry/
file/compose project) → retype that resource's own name/id.
- Bulk / prune / clear-all (no single name) → type the word 'delete'.
New shared showDeleteConfirm() helper in api.js; swept all 14 page files plus
edge-notifier-panel. Also gated 3 notification-settings clears that previously
deleted saved config with no confirmation at all, and replaced the notifier
agent's bare browser confirm() with the typed gate. Server-context banner still
shows where the delete lands. Non-destructive actions (start/stop/restart, grant,
update, save, hide) intentionally stay one-click.
Verified e2e in a container: keystone gate (disabled until exact match) and a
real Delete Server (keyed on the id) both pass.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,17 @@
2
2
3
3
---
4
4
5
+
## [2.1.21] - 2026-06-25
6
+
7
+
### Added — GitHub-style "type to confirm" on every delete
8
+
- Every destructive action now requires you to **type a confirmation phrase** before the red button activates — the same safety pattern GitHub uses for deleting a repo. A misclick can no longer delete the wrong thing: the **Delete** button stays disabled until what you type matches.
9
+
-**For a single named resource** (a container, image, volume, network, server, SSH key, registry, file, or compose project) you retype that resource's **own name/id** — so you literally confirm *which* one you're deleting. **For bulk / prune / clear-all** actions (no single name) you type the word **`delete`**.
10
+
- New shared `showDeleteConfirm()` helper in the UI; all confirmation dialogs were swept to use it. Coverage: Remove Container (single + bulk), Remove/Force-Remove Image, Remove Volume(s), Remove Network(s), Delete Server (Servers list + Settings), Delete SSH key, Delete registry, Delete file(s), Compose **Down** and **Delete project** (the project-delete modal keeps its volumes/files options and the server banner, now gated on the project name), Build-record deletes / Clear-all / Prune build cache, Cleanup **Prune** and **Full System Prune**, Clear audit log, and the notifier-agent **Remove** (was a bare browser `confirm()` — now the typed gate, keyed on the server id). The notification-settings **Clear SMTP / Clear Telegram / Clear notification-log** buttons — which previously deleted saved config with *no* confirmation at all — are now gated too.
11
+
- The existing **server-context banner** (🖥 Local / 🔐 remote host) still shows at the top of each dialog, so you also see *where* the delete will land. Non-destructive actions (Start/Stop/Restart, Grant Docker, Update, Save config, Hide-from-history) are intentionally left as one-click confirms.
12
+
- Built and audited by a parallel sweep across all 14 page files plus a completeness pass; verified e2e in a container — the keystone gate (disabled → stays disabled on a wrong phrase → enables on exact match → fires → closes) and a real wired delete (Delete Server, keyed on the server id, actually removes the server) both pass.
13
+
14
+
---
15
+
5
16
## [2.1.20] - 2026-06-25
6
17
7
18
### Added — Per-server access password (a 2nd gate to switch servers)
showConfirm('Remove from History',`Remove "${img.tag}" from build history? (Image will not be deleted)`,async()=>{
198
+
showDeleteConfirm('Remove from History',{message: `Remove "${img.tag}" from build history? (Image will not be deleted)`,phrase: 'delete',onConfirm:async()=>{
showConfirm(`Full System Prune`,`Are you absolutely sure? This will delete ALL unused data${includeVols ? ' INCLUDING VOLUMES.' : '.'}`,async()=>{
122
+
showDeleteConfirm(`Full System Prune`,{message: `Are you absolutely sure? This will delete ALL unused data${includeVols ? ' INCLUDING VOLUMES.' : '.'}`,phrase: 'delete',onConfirm:async()=>{
123
123
try{
124
124
showToast(`Starting full system prune...`,'warn');
<label style="display:flex;gap:8px;align-items:flex-start;font-weight:400"><input type="checkbox" id="del-files" checked> Remove the project files ${isRemote ? '(the folder on the remote server)' : '(DockGate-managed files)'}</label>
404
404
<label style="display:flex;gap:8px;align-items:flex-start;font-weight:400;color:var(--danger,#f85149)"><input type="checkbox" id="del-vols"> Also delete data volumes — <strong>irreversible data loss</strong></label>
0 commit comments