This PR breaks the large web and player bootstrap files into smaller modules with clearer ownership.

Web changes:

Split shared helpers, bootstrap logic, route groups, and upload-sync behavior out of web.js.
Kept web.js focused on wiring and server startup.
Fixed screen playlist reassignment so changing a screen’s playlist now triggers a refresh.
Fixed single-slide playlist refresh behavior so updates do not get stuck behind the current slide.
Player changes:

Split websocket/runtime handling into runtime.js.
Split playlist assembly and revision hashing into playlist.js.
Split onboarding and player HTTP routes into dedicated modules.
Split render utilities and template loading into render-helpers.js.
Kept player.js mostly as startup/orchestration.
Validation:

Rebuilt both services with Docker Compose.
Smoke-checked web and player routes after the refactor.
Verified get_errors was clean on the touched modules.
This commit is contained in:
2026-07-20 23:58:27 +01:00
parent 480ccdbe9c
commit 2ea8d389fa
321 changed files with 12687 additions and 7080 deletions
+12 -9
View File
@@ -3,14 +3,17 @@
<h2>Users</h2>
<p>Create accounts, rename users, reset passwords, and remove unused logins.</p>
</div>
<div class="page-toolbar">
<a class="button-link" href="/admin/users/new">Add user</a>
</div>
</div>
<div class="card">
<h3>Existing users</h3>
<table class="table-cards users-table">
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Existing users</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/users/new">Add user</a>
</div>
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0 users-table">
<thead>
<tr>
<th>User</th>
@@ -24,7 +27,6 @@
<tr>
<td data-label="User">
<div class="user-cell">
<div class="user-avatar user-avatar--small" aria-hidden="true">{{usernameInitial name}}</div>
<div>
<strong>{{username}}</strong>
{{#if isCurrentUser}}
@@ -43,9 +45,9 @@
<td data-label="Actions">
<div class="actions users-row-actions">
{{#unless isCurrentUser}}
<a class="button-link list-action" href="/admin/users/{{id}}/edit">Edit</a>
<a class="btn btn-sm btn-primary" href="/admin/users/{{id}}/edit">Edit</a>
<form method="post" action="/admin/users/{{id}}/delete" class="inline-form" data-confirm-message="Delete {{username}}?">
<button type="submit" class="button-link list-action is-danger">Delete</button>
<button type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>
{{else}}
<span class="empty">Protected</span>
@@ -59,4 +61,5 @@
{{/if}}
</tbody>
</table>
</div>
</div>