From 2bc4a01edc56e0fd6428003373630afeacc7de89 Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Tue, 8 Sep 2026 23:56:52 +0200 Subject: [PATCH] feat(ui): edit doors from the admin page (add Edit action) The PUT /api/v1/doors/{id} endpoint already existed and preserves the controller token when it isn't resent, but the admin UI only exposed create / reveal-token / delete. Add a per-row Edit (pencil) button that reuses the door dialog as create-or-update (saveDoor: POST when new, PUT when editing), so a door's Home Assistant webhook URL / boltcards base / timeout can be changed without deleting + recreating (which would churn the controller token the reader uses). Bump to 0.0.3. Co-Authored-By: Claude Opus 4.8 --- config.json | 2 +- static/js/index.js | 31 ++++++++++++++++++++++++------- templates/access/index.html | 16 ++++++++++++++-- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/config.json b/config.json index 4a86116..fffc80c 100644 --- a/config.json +++ b/config.json @@ -2,7 +2,7 @@ "name": "Access", "short_description": "NFC door access — authorize Bolt Card taps and unlock via Home Assistant", "tile": "/access/static/image/access.png", - "version": "0.0.2", + "version": "0.0.3", "min_lnbits_version": "1.3.0", "contributors": [ { diff --git a/static/js/index.js b/static/js/index.js index 62083e8..24e5d8f 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -75,14 +75,31 @@ window.app = Vue.createApp({ ) this.logs = data }, - async createDoor() { + editDoor(door) { + // Prefill the dialog for an update. Drop controller_token so it's left + // untouched server-side (api_door_update keeps it when not resent). + const { controller_token, ...data } = door + this.doorDialog = { show: true, data } + }, + async saveDoor() { + // POST to create, PUT to update an existing door (data.id present). + const d = this.doorDialog.data try { - await LNbits.api.request( - 'POST', - '/access/api/v1/doors', - this.adminkey, - this.doorDialog.data - ) + if (d.id) { + await LNbits.api.request( + 'PUT', + `/access/api/v1/doors/${d.id}`, + this.adminkey, + d + ) + } else { + await LNbits.api.request( + 'POST', + '/access/api/v1/doors', + this.adminkey, + d + ) + } this.doorDialog = { show: false, data: { unlock_timeout_ms: 2500 } } await this.loadDoors() } catch (e) { diff --git a/templates/access/index.html b/templates/access/index.html index fc77efb..bcc7f3d 100644 --- a/templates/access/index.html +++ b/templates/access/index.html @@ -34,6 +34,14 @@ > + Edit door -
New door
+
+ {% raw %}{{ doorDialog.data.id ? 'Edit door' : 'New door' }}{% endraw %} +
Cancel - Create + {% raw %}{{ doorDialog.data.id ? 'Save' : 'Create' }}{% endraw %}