Release 1.5.13

This commit is contained in:
2026-07-26 20:26:01 +01:00
parent 4afaeaafb1
commit 815c808d73
59 changed files with 1418 additions and 3042 deletions
+3 -3
View File
@@ -22,9 +22,9 @@
<table class="table table-striped w-100 mb-0" data-table-searchable>
<thead>
<tr>
<th>Name</th>
<th>Dimensions</th>
<th>Templates</th>
<th data-table-sort-key="name">Name</th>
<th data-table-sort-key="dimensions">Dimensions</th>
<th data-table-sort-key="templates">Templates</th>
<th>Actions</th>
</tr>
</thead>
+6 -6
View File
@@ -19,12 +19,12 @@
<table id="dashboard-clients-table" class="table table-striped w-100 mb-0" data-has-actions-column="{{#if (hasPermission currentUser 'clients.allow')}}true{{else}}false{{/if}}" data-table-searchable>
<thead>
<tr>
<th>Client</th>
<th>Current Screen</th>
<th>Current Slide</th>
<th>IP</th>
<th>Viewport</th>
<th>Connected/Updated</th>
<th data-table-sort-key="client">Client</th>
<th data-table-sort-key="screen">Current Screen</th>
<th data-table-sort-key="slide">Current Slide</th>
<th data-table-sort-key="ip">IP</th>
<th data-table-sort-key="viewport">Viewport</th>
<th data-table-sort-key="connected">Connected/Updated</th>
{{#if (hasPermission currentUser 'clients.allow')}}<th>Actions</th>{{/if}}
</tr>
</thead>
+53 -34
View File
@@ -10,7 +10,7 @@
<div>
<span class="dashboard-hero-kicker">Live overview</span>
<h3 class="dashboard-hero-title">Keep the control surface focused on live state and actions.</h3>
<p class="dashboard-hero-copy">Use the cards below for the current totals, then jump to the screens table when you need a deeper look at playback and connection state.</p>
<p class="dashboard-hero-copy">Use the cards below for the current totals, then open the screen snapshot when you want a quick read on playlist assignment and live connections.</p>
</div>
<div class="dashboard-hero-stats">
{{#if (hasPermission currentUser "playlists.read")}}
@@ -63,6 +63,22 @@
><i class="bi bi-arrow-repeat me-1" aria-hidden="true"></i>Reload all clients</button>
<span class="dashboard-action-help">Restart every connected player page.</span>
</form>
<form
method="post"
action="/commands"
class="dashboard-action-form"
data-confirm-message="Pause all connected clients?"
data-async-command
>
<input type="hidden" name="command" value="pause" />
<input type="hidden" name="paused" value="true" />
<button
type="submit"
class="btn btn-info dashboard-action-button"
id="dashboard-pause-all-button"
><i class="bi bi-pause-fill me-1" aria-hidden="true"></i>Pause all clients</button>
<span class="dashboard-action-help">Freeze playback on every connected player.</span>
</form>
<form
method="post"
action="/commands"
@@ -91,46 +107,49 @@
{{#if (hasPermission currentUser "screens.read")}}
<div class="row">
<div class="col-12">
<div class="card card-outline card-secondary dashboard-table-card">
<div class="card-header">
<div class="card card-outline card-secondary dashboard-screen-card-shell">
<div class="card-header dashboard-screen-card-header">
<div class="dashboard-card-heading">
<h3 class="card-title">Current screens</h3>
<h3 class="card-title">Screen snapshot</h3>
<p class="dashboard-card-subtitle">Player URL, playlist assignment,
and live connection count.</p>
and live connection count without the spreadsheet feel.</p>
</div>
<a class="btn btn-sm btn-outline-primary" href="/screens">Manage screens</a>
</div>
<div class="card-body table-responsive p-0">
<table
id="dashboard-screens-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></tr></thead>
<tbody>
{{#if screens.length}}
{{#each screens}}
<tr data-client-key="{{id}}">
<td data-label="Name">{{name}}</td>
<td data-label="Player URL"><a
href="{{playerUrl slug}}"
target="_blank"
>{{playerUrl slug}}</a></td>
<td data-label="Playlist">{{playlist_name}}</td>
<td data-label="Connected clients">
<div class="card-body">
<div id="dashboard-screens-grid" class="dashboard-screen-grid">
{{#if screens.length}}
{{#each screens}}
<article class="dashboard-screen-tile" data-screen-key="{{id}}">
<div class="dashboard-screen-tile-top">
<div class="dashboard-screen-tile-text">
<h4 class="dashboard-screen-name">{{name}}</h4>
<a class="dashboard-screen-link" href="{{playerUrl slug}}" target="_blank">{{playerUrl slug}}</a>
</div>
<span class="dashboard-screen-pill {{#if player_connection_count}}is-live{{else}}is-idle{{/if}}">
{{#if player_connection_count}}
<div class="connection-count">{{player_connection_count}}
connected</div>
{{player_connection_count}} live
{{else}}
<span class="empty">No clients connected.</span>
No clients
{{/if}}
</td>
</tr>
{{/each}}
{{else}}
<tr><td colspan="4" class="empty">No screens yet.</td></tr>
{{/if}}
</tbody>
</table>
</span>
</div>
<dl class="dashboard-screen-meta">
<div>
<dt>Playlist</dt>
<dd>{{#if playlist_name}}{{playlist_name}}{{else}}Unassigned{{/if}}</dd>
</div>
<div>
<dt>Connections</dt>
<dd>{{#if player_connection_count}}{{player_connection_count}} connected{{else}}No clients connected{{/if}}</dd>
</div>
</dl>
</article>
{{/each}}
{{else}}
<div class="empty dashboard-screen-empty">No screens yet.</div>
{{/if}}
</div>
</div>
</div>
</div>
+2 -2
View File
@@ -22,8 +22,8 @@
<table class="table table-striped w-100 mb-0" data-table-searchable>
<thead>
<tr>
<th>Name</th>
<th>Slides</th>
<th data-table-sort-key="name">Name</th>
<th data-table-sort-key="slides">Slides</th>
<th>Actions</th>
</tr>
</thead>
+3 -3
View File
@@ -22,9 +22,9 @@
<table class="table table-striped w-100 mb-0" data-table-searchable>
<thead>
<tr>
<th>Name</th>
<th>Player URL</th>
<th>Playlist</th>
<th data-table-sort-key="name">Name</th>
<th data-table-sort-key="url">Player URL</th>
<th data-table-sort-key="playlist">Playlist</th>
<th>Connected clients</th>
<th>Actions</th>
</tr>
+2 -2
View File
@@ -23,8 +23,8 @@
<thead>
<tr>
<th data-sortable="false">Thumbnail</th>
<th>Title</th>
<th>Template</th>
<th data-table-sort-key="title">Title</th>
<th data-table-sort-key="template">Template</th>
<th>Actions</th>
</tr>
</thead>
+4 -4
View File
@@ -22,10 +22,10 @@
<table class="table table-striped w-100 mb-0" data-table-searchable>
<thead>
<tr>
<th>Name</th>
<th>Canvas</th>
<th>Regions</th>
<th>Slides used by</th>
<th data-table-sort-key="name">Name</th>
<th data-table-sort-key="canvas">Canvas</th>
<th data-table-sort-key="regions">Regions</th>
<th data-table-sort-key="slides">Slides used by</th>
<th>Actions</th>
</tr>
</thead>