Bump version to 1.4.6

This commit is contained in:
2026-07-22 01:26:04 +01:00
parent 370ec81c33
commit 9f08ccfea1
20 changed files with 363 additions and 163 deletions
+27 -10
View File
@@ -8,13 +8,22 @@
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Saved sizes</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/canvas-sizes/new">Add canvas size</a>
</div>
{{#if (hasPermission currentUser 'canvas-sizes.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/canvas-sizes/new">Add canvas size</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0">
<thead><tr><th>Name</th><th>Dimensions</th><th>Templates</th><th>Actions</th></tr></thead>
<thead>
<tr>
<th>Name</th>
<th>Dimensions</th>
<th>Templates</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if canvasSizes.length}}
{{#each canvasSizes}}
@@ -23,12 +32,20 @@
<td data-label="Dimensions">{{width}}x{{height}}</td>
<td data-label="Templates">{{templateCount}}</td>
<td data-label="Actions">
<div class="actions">
<a class="btn btn-sm btn-primary" href="/admin/canvas-sizes/{{id}}/edit">Edit</a>
<form class="inline-form" method="post" action="/admin/canvas-sizes/{{id}}/delete" data-confirm-message="Delete this canvas size?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</div>
{{#if (anyPermission ../currentUser 'canvas-sizes.update' 'canvas-sizes.delete')}}
<div class="actions">
{{#if (hasPermission ../currentUser 'canvas-sizes.update')}}
<a class="btn btn-sm btn-primary" href="/admin/canvas-sizes/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'canvas-sizes.delete')}}
<form class="inline-form" method="post" action="/admin/canvas-sizes/{{id}}/delete" data-confirm-message="Delete this canvas size?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
{{/if}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}
+1 -1
View File
@@ -51,7 +51,7 @@
{{#if connectedAt}}
<div>{{connectedAtLabel}}</div>
{{#if lastSeenAt}}
<div class="subtle"><i>{{lastSeenAtLabel}}</i></div>
<div class="subtle connected-updated-secondary">{{lastSeenAtLabel}}</div>
{{/if}}
{{else}}
<span class="empty">Unknown</span>
+26 -10
View File
@@ -8,13 +8,21 @@
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Existing playlists</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/playlists/new">Create playlist</a>
</div>
{{#if (hasPermission currentUser 'playlists.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/playlists/new">Create playlist</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0">
<thead><tr><th>Name</th><th>Slides</th><th>Actions</th></tr></thead>
<thead>
<tr>
<th>Name</th>
<th>Slides</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if playlists.length}}
{{#each playlists}}
@@ -22,12 +30,20 @@
<td data-label="Name">{{name}}</td>
<td data-label="Slides"><span class="chip">{{slideCount}} slide{{#unless slideCountIsOne}}s{{/unless}}</span></td>
<td data-label="Actions">
<div class="actions">
<a class="btn btn-sm btn-primary" href="/admin/playlists/{{id}}/edit">Edit</a>
<form class="inline-form" method="post" action="/admin/playlists/{{id}}/delete" data-confirm-message="Delete this playlist?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</div>
{{#if (anyPermission ../currentUser 'playlists.update' 'playlists.delete')}}
<div class="actions">
{{#if (hasPermission ../currentUser 'playlists.update')}}
<a class="btn btn-sm btn-primary" href="/admin/playlists/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'playlists.delete')}}
<form class="inline-form" method="post" action="/admin/playlists/{{id}}/delete" data-confirm-message="Delete this playlist?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
{{/if}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}
+31 -32
View File
@@ -5,13 +5,16 @@
</div>
</div>
<div class="row g-4">
<div class="col-12 col-xl-4 d-flex flex-column gap-4">
<div class="card card-outline card-primary admin-form-card">
<div class="card-header">
<h3 class="card-title">Role details</h3>
</div>
<form method="post" action="/admin/rbac/{{role.id}}" id="role-details-form" data-async-save data-async-save-close-url="/admin/rbac">
<form method="post" action="/admin/rbac/{{role.id}}" id="role-edit-form" data-async-save data-async-save-close-url="/admin/rbac">
<input type="hidden" name="permissions_present" value="1" />
<input type="hidden" name="users_present" value="1" />
<div class="row g-4">
<div class="col-12 col-xl-4 d-flex flex-column gap-4">
<div class="card card-outline card-primary admin-form-card">
<div class="card-header">
<h3 class="card-title">Role details</h3>
</div>
<div class="card-body">
<div class="mb-3">
<label for="role-name-edit" class="form-label">Role Name</label>
@@ -22,24 +25,20 @@
<textarea id="role-description-edit" name="description" class="form-control" rows="5">{{role.description}}</textarea>
</div>
</div>
<div class="card-footer d-flex justify-content-end">
<div class="card-footer d-flex justify-content-end gap-2 flex-wrap">
<div class="btn-group" role="group" aria-label="Role actions">
{{{saveActionButtons formId="role-details-form" saveLabel="Save" saveAndCloseLabel="Save and Close" saveAndCloseValue="close" showSaveAndNew=false}}}
{{{saveActionButtons formId="role-edit-form" saveLabel="Save" saveAndCloseLabel="Save and Close" saveAndCloseValue="close" showSaveAndNew=false}}}
</div>
{{#unless role.user_count}}
<form method="post" action="/admin/rbac/{{role.id}}/delete" class="inline-form" data-confirm-message="Delete {{role.name}}?">
<button type="submit" class="btn btn-danger">Delete</button>
</form>
<button type="submit" class="btn btn-danger" form="role-delete-form">Delete</button>
{{/unless}}
</div>
</form>
</div>
<div class="card card-outline card-secondary admin-form-card">
<div class="card-header">
<h3 class="card-title">Users</h3>
</div>
<form method="post" action="/admin/rbac/{{role.id}}/users" id="role-users-form" data-async-save data-async-save-close-url="/admin/rbac/{{role.id}}/edit">
<div class="card card-outline card-secondary admin-form-card">
<div class="card-header">
<h3 class="card-title">Users</h3>
</div>
<div class="card-body p-0">
<div class="px-3 pt-3">
<p class="text-body-secondary mb-3">Choose the users who should belong to this role.</p>
@@ -74,17 +73,15 @@
<div class="alert alert-warning mb-0">Create at least one user before assigning this role.</div>
</div>
{{/if}}
</div>
</form>
</div>
</div>
<div class="col-12 col-xl-8 d-flex flex-column gap-4">
<div class="card card-outline card-secondary admin-form-card">
<div class="card-header">
<h3 class="card-title">Permissions</h3>
</div>
</div>
<form method="post" action="/admin/rbac/{{role.id}}/permissions" id="role-permissions-form" data-async-save data-async-save-close-url="/admin/rbac/{{role.id}}/edit">
</div>
<div class="col-12 col-xl-8 d-flex flex-column gap-4">
<div class="card card-outline card-secondary admin-form-card">
<div class="card-header">
<h3 class="card-title">Permissions</h3>
</div>
<div class="card-body">
<p class="text-body-secondary mb-3">Each section below is a resource. Pick the actions this role should have for that resource.</p>
{{#if permissionGroups.length}}
@@ -125,10 +122,12 @@
</div>
<div class="card-footer d-flex justify-content-end">
<div class="btn-group" role="group" aria-label="Permission actions">
{{{saveActionButtons formId="role-permissions-form" saveLabel="Save" saveAndCloseLabel="Save and Close" saveAndCloseValue="close" showSaveAndNew=false}}}
{{{saveActionButtons formId="role-edit-form" saveLabel="Save" saveAndCloseLabel="Save and Close" saveAndCloseValue="close" showSaveAndNew=false}}}
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</form>
<form method="post" action="/admin/rbac/{{role.id}}/delete" id="role-delete-form" class="d-none" data-confirm-message="Delete {{role.name}}?"></form>
+21 -13
View File
@@ -10,9 +10,11 @@
<div class="card card-outline card-primary admin-form-card">
<div class="card-header">
<h3 class="card-title">Existing roles</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/rbac/new">Add role</a>
</div>
{{#if (hasPermission currentUser 'rbac.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/rbac/new">Add role</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0 users-table">
@@ -46,16 +48,22 @@
<td data-label="Users">{{user_count}}</td>
<td data-label="Permissions">{{permission_count}}</td>
<td data-label="Actions">
<div class="actions users-row-actions">
<a class="btn btn-sm btn-primary" href="/admin/rbac/{{id}}/edit">Edit</a>
{{#unless user_count}}
<form method="post" action="/admin/rbac/{{id}}/delete" class="inline-form" data-confirm-message="Delete {{name}}?">
<button type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>
{{else}}
<span class="empty">In use</span>
{{/unless}}
</div>
{{#if (anyPermission ../currentUser 'rbac.update' 'rbac.delete')}}
<div class="actions users-row-actions">
{{#if (hasPermission ../currentUser 'rbac.update')}}
<a class="btn btn-sm btn-primary" href="/admin/rbac/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'rbac.delete')}}
{{#unless user_count}}
<form method="post" action="/admin/rbac/{{id}}/delete" class="inline-form" data-confirm-message="Delete {{name}}?">
<button type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>
{{else}}
<span class="empty">In use</span>
{{/unless}}
{{/if}}
</div>
{{/if}}
</td>
</tr>
{{/each}}
+28 -10
View File
@@ -8,13 +8,23 @@
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Existing screens</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/screens/new">Add screen</a>
</div>
{{#if (hasPermission currentUser 'screens.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/screens/new">Add screen</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0">
<thead><tr><th>Name</th><th>Player URL</th><th>Playlist</th><th>Connected clients</th><th>Actions</th></tr></thead>
<thead>
<tr>
<th>Name</th>
<th>Player URL</th>
<th>Playlist</th>
<th>Connected clients</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if screens.length}}
{{#each screens}}
@@ -30,12 +40,20 @@
{{/if}}
</td>
<td data-label="Actions">
<div class="actions">
<a class="btn btn-sm btn-primary" href="/admin/screens/{{id}}/edit">Edit</a>
<form class="inline-form" method="post" action="/admin/screens/{{id}}/delete" data-confirm-message="Delete this screen?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</div>
{{#if (anyPermission ../currentUser 'screens.update' 'screens.delete')}}
<div class="actions">
{{#if (hasPermission ../currentUser 'screens.update')}}
<a class="btn btn-sm btn-primary" href="/admin/screens/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'screens.delete')}}
<form class="inline-form" method="post" action="/admin/screens/{{id}}/delete" data-confirm-message="Delete this screen?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
{{/if}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}
+26 -10
View File
@@ -8,13 +8,21 @@
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Existing slides</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/slides/new">Create slide</a>
</div>
{{#if (hasPermission currentUser 'slides.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/slides/new">Create slide</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0">
<thead><tr><th>Title</th><th>Template</th><th>Actions</th></tr></thead>
<thead>
<tr>
<th>Title</th>
<th>Template</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if slides.length}}
{{#each slides}}
@@ -22,12 +30,20 @@
<td data-label="Title">{{title}}</td>
<td data-label="Template">{{template_name}}</td>
<td data-label="Actions">
<div class="actions">
<a class="btn btn-sm btn-primary" href="/admin/slides/{{id}}/edit">Edit</a>
<form class="inline-form" method="post" action="/admin/slides/{{id}}/delete" data-confirm-message="Delete this slide?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</div>
{{#if (anyPermission ../currentUser 'slides.update' 'slides.delete')}}
<div class="actions">
{{#if (hasPermission ../currentUser 'slides.update')}}
<a class="btn btn-sm btn-primary" href="/admin/slides/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'slides.delete')}}
<form class="inline-form" method="post" action="/admin/slides/{{id}}/delete" data-confirm-message="Delete this slide?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
{{/if}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}
+27 -10
View File
@@ -8,13 +8,22 @@
<div class="card card-outline card-primary">
<div class="card-header">
<h3 class="card-title">Existing templates</h3>
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/templates/new">Create template</a>
</div>
{{#if (hasPermission currentUser 'templates.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/templates/new">Create template</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0">
<thead><tr><th>Name</th><th>Canvas</th><th>Regions</th><th>Actions</th></tr></thead>
<thead>
<tr>
<th>Name</th>
<th>Canvas</th>
<th>Regions</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{#if templates.length}}
{{#each templates}}
@@ -23,12 +32,20 @@
<td data-label="Canvas">{{canvas_size_width}}x{{canvas_size_height}}</td>
<td data-label="Regions">{{regionCount}}</td>
<td data-label="Actions">
<div class="actions">
<a class="btn btn-sm btn-primary" href="/admin/templates/{{id}}/edit">Edit</a>
<form class="inline-form" method="post" action="/admin/templates/{{id}}/delete" data-confirm-message="Delete this template?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</div>
{{#if (anyPermission ../currentUser 'templates.update' 'templates.delete')}}
<div class="actions">
{{#if (hasPermission ../currentUser 'templates.update')}}
<a class="btn btn-sm btn-primary" href="/admin/templates/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'templates.delete')}}
<form class="inline-form" method="post" action="/admin/templates/{{id}}/delete" data-confirm-message="Delete this template?">
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
{{/if}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}
+23 -13
View File
@@ -8,9 +8,11 @@
<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>
{{#if (hasPermission currentUser 'users.create')}}
<div class="card-tools">
<a class="btn btn-primary btn-sm" href="/admin/users/new">Add user</a>
</div>
{{/if}}
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped w-100 mb-0 users-table">
@@ -61,16 +63,24 @@
</div>
</td>
<td data-label="Actions">
<div class="actions users-row-actions">
{{#unless isCurrentUser}}
<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="btn btn-sm btn-danger">Delete</button>
</form>
{{else}}
<span class="empty">Protected</span>
{{/unless}}
</div>
{{#if (anyPermission ../currentUser 'users.update' 'users.delete')}}
<div class="actions users-row-actions">
{{#unless isCurrentUser}}
{{#if (hasPermission ../currentUser 'users.update')}}
<a class="btn btn-sm btn-primary" href="/admin/users/{{id}}/edit">Edit</a>
{{/if}}
{{#if (hasPermission ../currentUser 'users.delete')}}
<form method="post" action="/admin/users/{{id}}/delete" class="inline-form" data-confirm-message="Delete {{username}}?">
<button type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>
{{/if}}
{{else}}
<span class="empty">Protected</span>
{{/unless}}
</div>
{{else}}
<span class="empty">-</span>
{{/if}}
</td>
</tr>
{{/each}}