Release v2.4.2

This commit is contained in:
2026-08-03 12:45:27 +01:00
parent 2b9cabdab2
commit e95928f31c
141 changed files with 7694 additions and 5078 deletions
+110 -86
View File
@@ -10,7 +10,7 @@
<link rel="preload" href="/assets/adminlte/bootstrap-icons/fonts/bootstrap-icons.woff" as="font" type="font/woff" crossorigin="anonymous" />
<link rel="stylesheet" href="/assets/adminlte/bootstrap-icons/css/bootstrap-icons.min.css" />
<link rel="stylesheet" href="/assets/adminlte/css/adminlte.min.css" />
<link rel="stylesheet" href="/assets/css/theme-custom.css" />
<link rel="stylesheet" href="/assets/css/theme-custom.css?v={{appVersion}}" />
{{#if stylesheets.length}}
{{#each stylesheets}}
<link rel="stylesheet" href="{{assetHref this}}" />
@@ -25,11 +25,35 @@
<script src="/assets/js/admin/admin-page.js"></script>
<script src="/assets/js/system-status.js"></script>
{{else if authShell}}
<div id="app-toast-container" class="toast-container app-toast-container position-fixed end-0 p-3">
{{#if message}}
<div class="toast shadow-lg border-0" id="app-toast" role="status" aria-live="polite" aria-atomic="true" data-bs-autohide="true" data-bs-delay="4000" data-toast-variant="{{#if messageVariant}}{{messageVariant}}{{else}}warning{{/if}}" data-toast-created-at="">
<div class="toast-header border-0 text-bg-{{#if messageVariant}}{{messageVariant}}{{else}}warning{{/if}}">
{{#if (eq messageVariant 'success')}}
<i class="bi bi-check-circle-fill me-2"></i>
{{else if (eq messageVariant 'warning')}}
<i class="bi bi-exclamation-triangle-fill me-2"></i>
{{else if (eq messageVariant 'danger')}}
<i class="bi bi-x-circle-fill me-2"></i>
{{else if (eq messageVariant 'primary')}}
<i class="bi bi-bell-fill me-2"></i>
{{else}}
<i class="bi bi-info-circle-fill me-2"></i>
{{/if}}
<strong class="me-auto">Pulse</strong>
<small class="toast-time text-nowrap">just now</small>
<button type="button" class="btn-close btn-close-white ms-2" data-bs-dismiss="toast" aria-label="Dismiss notification"></button>
</div>
<div class="toast-body">{{message}}</div>
</div>
{{/if}}
</div>
<main class="login-page d-flex align-items-center justify-content-center min-vh-100 p-3">
<div class="login-box">
{{{body}}}
</div>
</main>
<script src="/assets/js/toast.js"></script>
<script src="/assets/js/admin/admin-page.js"></script>
<script src="/assets/js/system-status.js"></script>
{{else}}
@@ -167,14 +191,6 @@
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'announcements.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'announcements')}}active{{/if}}" href="/announcements">
<i class="nav-icon bi bi-megaphone"></i>
<p>Announcements</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'screens.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'screens')}}active{{/if}}" href="/screens">
@@ -215,88 +231,96 @@
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'announcements.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'announcements')}}active{{/if}}" href="/announcements">
<i class="nav-icon bi bi-megaphone"></i>
<p>Announcements</p>
</a>
</li>
{{/if}}
{{#if (anyPermission currentUser 'rss-feeds.read' 'schedules.read' 'api-sources.read')}}
<li class="nav-header">DATA SOURCES</li>
{{#if (hasPermission currentUser 'rss-feeds.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'rss-feeds')}}active{{/if}}" href="/data-sources/rss-feeds">
<i class="nav-icon bi bi-rss"></i>
<p>RSS feeds</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'schedules.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'schedules')}}active{{/if}}" href="/data-sources/schedules">
<i class="nav-icon bi bi-calendar-event"></i>
<p>Schedules</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'api-sources.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'api-sources')}}active{{/if}}" href="/data-sources/api-sources">
<i class="nav-icon bi bi-braces"></i>
<p>API sources</p>
</a>
</li>
{{/if}}
{{/if}}
{{#if (hasPermission currentUser 'rss-feeds.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'rss-feeds')}}active{{/if}}" href="/data-sources/rss-feeds">
<i class="nav-icon bi bi-rss"></i>
<p>RSS feeds</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'api-sources.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'api-sources')}}active{{/if}}" href="/data-sources/api-sources">
<i class="nav-icon bi bi-braces"></i>
<p>API sources</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'timetables.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'timetables')}}active{{/if}}" href="/data-sources/timetables">
<i class="nav-icon bi bi-calendar-event"></i>
<p>Timetables</p>
</a>
</li>
{{/if}}
{{#if (anyPermission currentUser 'background-tasks.read' 'scheduled-tasks.read' 'users.read' 'rbac.read' 'fonts.read')}}
<li class="nav-header">SETTINGS</li>
{{#if (hasPermission currentUser 'users.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'users')}}active{{/if}}" href="/users">
<i class="nav-icon bi bi-people"></i>
<p>Users</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'rbac.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'rbac')}}active{{/if}}" href="/rbac">
<i class="nav-icon bi bi-shield-lock"></i>
<p>Roles and permissions</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'fonts.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'fonts')}}active{{/if}}" href="/settings/fonts">
<i class="nav-icon bi bi-type"></i>
<p>Fonts</p>
</a>
</li>
{{/if}}
{{#if (anyPermission currentUser 'background-tasks.read' 'scheduled-tasks.read')}}
<li class="nav-item has-treeview{{#if backgroundTasksMenuOpen}} menu-open{{/if}}">
<a class="nav-link{{#if backgroundTasksMenuOpen}} active{{/if}}" href="#">
<i class="nav-icon bi bi-pen"></i>
<p>
Tasks
<i class="nav-arrow bi bi-chevron-right"></i>
</p>
</a>
{{#if (anyPermission currentUser 'background-tasks.read')}}
<ul class="nav nav-treeview">
<li class="nav-item">
<a class="nav-link {{#if (eq active 'background-tasks')}}active{{/if}}" href="/settings/tasks-background">
<i class="nav-icon bi bi-list-ol"></i>
<p>Task queue</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'scheduled-tasks.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'background-tasks-scheduled')}}active{{/if}}" href="/settings/tasks-scheduled">
<i class="nav-icon bi bi-calendar-event"></i>
<p>Scheduled tasks</p>
</a>
</li>
{{/if}}
</ul>
</li>
{{/if}}
{{/if}}
{{#if (hasPermission currentUser 'users.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'users')}}active{{/if}}" href="/users">
<i class="nav-icon bi bi-people"></i>
<p>Users</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'rbac.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'rbac')}}active{{/if}}" href="/rbac">
<i class="nav-icon bi bi-shield-lock"></i>
<p>Roles and permissions</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'fonts.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'fonts')}}active{{/if}}" href="/settings/fonts">
<i class="nav-icon bi bi-type"></i>
<p>Fonts</p>
</a>
</li>
{{/if}}
{{#if (anyPermission currentUser 'background-tasks.read' 'scheduled-tasks.read')}}
<li class="nav-item has-treeview{{#if backgroundTasksMenuOpen}} menu-open{{/if}}">
<a class="nav-link{{#if backgroundTasksMenuOpen}} active{{/if}}" href="#">
<i class="nav-icon bi bi-pen"></i>
<p>
Tasks
<i class="nav-arrow bi bi-chevron-right"></i>
</p>
</a>
{{#if (anyPermission currentUser 'background-tasks.read')}}
<ul class="nav nav-treeview">
<li class="nav-item">
<a class="nav-link {{#if (eq active 'background-tasks')}}active{{/if}}" href="/settings/tasks-background">
<i class="nav-icon bi bi-list-ol"></i>
<p>Task queue</p>
</a>
</li>
{{/if}}
{{#if (hasPermission currentUser 'scheduled-tasks.read')}}
<li class="nav-item">
<a class="nav-link {{#if (eq active 'background-tasks-scheduled')}}active{{/if}}" href="/settings/tasks-scheduled">
<i class="nav-icon bi bi-calendar-event"></i>
<p>Scheduled tasks</p>
</a>
</li>
{{/if}}
</ul>
</li>
{{/if}}
</ul>
</nav>