Refactor web server and release workflow

This commit is contained in:
2026-07-14 18:35:24 +01:00
parent 9070ded66d
commit 4e0e87c86c
76 changed files with 616 additions and 84 deletions
+43
View File
@@ -0,0 +1,43 @@
<div class="page-header">
<div>
<h2>Add user</h2>
<p>Create a new login for the web UI.</p>
</div>
</div>
<div class="card user-create-card">
<form method="post" action="/admin/users" class="user-create-form">
<section class="user-create-section">
<h3>Account details</h3>
<div class="user-create-fields">
<label>
Username
<input type="text" name="username" autocomplete="username" required />
</label>
<label>
Name
<input type="text" name="name" autocomplete="name" required />
</label>
</div>
</section>
<section class="user-create-section">
<h3>Set password</h3>
<div class="user-create-fields">
<label>
Password
<input type="password" name="password" autocomplete="new-password" minlength="8" required />
</label>
<label>
Confirm password
<input type="password" name="confirm_password" autocomplete="new-password" minlength="8" required />
</label>
</div>
</section>
<div class="actions user-create-actions">
<button type="submit" class="user-create-button">Create user</button>
<a class="button-link secondary" href="/admin/users">Back to users</a>
</div>
</form>
</div>
+49
View File
@@ -0,0 +1,49 @@
<div class="page-header">
<div>
<h2>Edit user</h2>
<p>Update the name or password for {{user.username}}.</p>
</div>
</div>
<div class="card user-edit-card">
<div class="user-edit-header">
<div class="user-cell">
<div class="user-avatar" aria-hidden="true">{{usernameInitial user.username}}</div>
<div>
<strong>{{user.username}}</strong>
{{#if user.isCurrentUser}}
<div class="subtle">Current signed-in user</div>
{{/if}}
</div>
</div>
<a class="button-link secondary" href="/admin/users">Back to users</a>
</div>
<div class="user-edit-grid">
<form method="post" action="/admin/users/{{user.id}}/username" class="card user-edit-panel">
<h3>Edit user</h3>
<label>
Username
<input type="text" name="username" value="{{user.username}}" autocomplete="username" required disabled />
</label>
<label>
Name
<input type="text" name="name" value="{{user.name}}" autocomplete="name" required />
</label>
<button type="submit" class="user-edit-button">Save changes</button>
</form>
<form method="post" action="/admin/users/{{user.id}}/password" class="card user-edit-panel">
<h3>Reset password</h3>
<label>
New password
<input type="password" name="password" autocomplete="new-password" minlength="8" required />
</label>
<label>
Confirm password
<input type="password" name="confirm_password" autocomplete="new-password" minlength="8" required />
</label>
<button type="submit" class="user-edit-button">Save password</button>
</form>
</div>
</div>
+62
View File
@@ -0,0 +1,62 @@
<div class="page-header">
<div>
<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">
<thead>
<tr>
<th>User</th>
<th>Name</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if users.length}}
{{#each users}}
<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}}
<div class="subtle">Current signed-in user</div>
{{/if}}
</div>
</div>
</td>
<td data-label="Name">
<div class="user-cell">
<div>
<strong>{{#if name}}{{name}}{{else}}-{{/if}}</strong>
</div>
</div>
</td>
<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>
<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>
</form>
{{else}}
<span class="empty">Protected</span>
{{/unless}}
</div>
</td>
</tr>
{{/each}}
{{else}}
<tr><td colspan="3" class="empty">No users found.</td></tr>
{{/if}}
</tbody>
</table>
</div>