Mark whiteboard as (alpha); add the Phase 5 button-assignment UI
Build and push server image / test (push) Successful in 22s
Build and push server image / build-and-push (push) Successful in 1m59s
Build and push server image / deploy (push) Successful in 52s

Whiteboard rendering isn't fully reliable yet -- tag it (alpha)
everywhere it's user-facing (widget label, add-widget button, dialog
title, Settings' WebDAV section) via one shared WIDGET_LABELS map
(moved to common.js so both the Layout canvas and the new Configuration
tab section can use it).

Button assignments: a new "Button assignments" card on the
Configuration tab lets you assign an ordered list of (widget, action)
bindings to each physical NEXT/BACK button -- add/remove/reorder, all
autosaved. Backed by new GET/PUT /api/frames/{id}/buttons endpoints;
PUT replaces a button's whole list in one atomic, fully-validated call
rather than separate add/remove/reorder endpoints. Device-side
consumption already existed (routers/device.py's _run_button_actions);
this is the UI for what was previously only reachable via the default
migration mapping.
This commit is contained in:
2026-07-24 17:13:51 -04:00
parent 9c8a87e90d
commit 8b9f636cce
9 changed files with 454 additions and 5 deletions
@@ -1,4 +1,4 @@
<h2 class="dialog-title">Whiteboard widget</h2>
<h2 class="dialog-title">Whiteboard widget (alpha)</h2>
<section class="card">
<h2 class="card-title">Whiteboard source</h2>
+33
View File
@@ -53,6 +53,39 @@
<button type="submit">Save</button>
</form>
</section>
<section class="card">
<h2 class="card-title">Button assignments</h2>
<p class="sub">What the frame's physical NEXT and BACK buttons do --
assign one or more widget actions to each, in the order they
should run. A button with several actions runs all of them, in
order, then the panel redraws once.</p>
<p class="sub" id="button-assign-empty-hint" style="display: none;">
Add a widget on the Layout tab first -- there's nothing to assign
a button to yet.</p>
<div id="button-assign-groups">
<div class="button-assign-group">
<h3 class="button-assign-label">NEXT button</h3>
<ul class="button-action-list" id="button-actions-next"></ul>
<div class="button-action-add">
<select id="button-add-widget-next"></select>
<select id="button-add-action-next"></select>
<button type="button" class="secondary btn-inline" id="button-add-next">Add</button>
</div>
</div>
<div class="button-assign-group" style="margin-top: 20px;">
<h3 class="button-assign-label">BACK button</h3>
<ul class="button-action-list" id="button-actions-back"></ul>
<div class="button-action-add">
<select id="button-add-widget-back"></select>
<select id="button-add-action-back"></select>
<button type="button" class="secondary btn-inline" id="button-add-back">Add</button>
</div>
</div>
</div>
</section>
</div>
<div class="side-col">
+1 -1
View File
@@ -71,7 +71,7 @@
you're linked to from that frame's Calendar tab, so a frame only
shows calendars people have actually chosen to share with it.</p>
<h2 class="card-title" style="margin-top: 24px;">Whiteboard (WebDAV)</h2>
<h2 class="card-title" style="margin-top: 24px;">Whiteboard (WebDAV) (alpha)</h2>
<p class="sub">Credentials for whiteboard frame mode -- fetching a
specific file (e.g. a Nextcloud Whiteboard board) over WebDAV.
Any WebDAV server works, not just Nextcloud.</p>