Grotti 3.6.0: Lauf-Identität nach Filament-Pause, robustere Queue, Projekte/Aufträge list-first und API-Polish.

This commit is contained in:
Dominic Gundel committed 2026-10-25 08:24:24 +01:00
1 parent d1eb87ba25
commit 2b1e36634a
53 files changed
+4254 -636

No files matched your search

+17 -5
View File
@@ -9,7 +9,7 @@
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='brand/favicon-32.png') }}">
<link rel="icon" type="image/png" sizes="512x512" href="{{ url_for('static', filename='brand/favicon.png') }}">
<link rel="apple-touch-icon" href="{{ url_for('static', filename='brand/apple-touch-icon.png') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='grotti.css') }}?v=70">
<link rel="stylesheet" href="{{ url_for('static', filename='grotti.css') }}?v=73">
<link rel="manifest" href="{{ url_for('static', filename='manifest.webmanifest') }}">
<meta name="theme-color" content="#0a0a0c" id="theme-color-meta">
<script>
@@ -82,7 +82,7 @@
<a href="/" class="{{ 'on' if page == 'wand' else '' }}" title="Drucker"><svg class="ico"><use href="#i-printer"/></svg><span>Drucker</span></a>
<a href="/dateien" class="{{ 'on' if page == 'dateien' else '' }} nav-desk" title="Dateien"><svg class="ico"><use href="#i-file"/></svg><span>Dateien</span></a>
<a href="/warteschlange" class="{{ 'on' if page == 'warteschlange' else '' }}" title="Warteschlange"><svg class="ico"><use href="#i-queue"/></svg><span>Warteschlange</span></a>
<a href="/auftraege" class="{{ 'on' if page == 'auftraege' else '' }} nav-desk" title="Aufträge"><svg class="ico"><use href="#i-folder"/></svg><span>Aufträge</span></a>
<a href="/auftraege" class="{{ 'on' if page == 'auftraege' else '' }} nav-desk" title="Aufträge"><svg class="ico"><use href="#i-clipboard"/></svg><span>Aufträge</span></a>
<span class="nav-label nav-desk">Rückschau</span>
<a href="/protokoll" class="{{ 'on' if page == 'protokoll' or page == 'bericht' else '' }} nav-desk" title="Protokoll"><svg class="ico"><use href="#i-list"/></svg><span>Protokoll</span></a>
<a href="/statistik" class="{{ 'on' if page == 'statistik' else '' }} nav-desk" title="Statistik"><svg class="ico"><use href="#i-chart"/></svg><span>Statistik</span></a>
@@ -138,11 +138,14 @@
</nav>
<dialog id="mobile-more-sheet" class="mobile-more-sheet">
<nav aria-label="Weitere Seiten">
<p class="nav-label">Live</p>
<a href="/auftraege">Aufträge</a>
<a href="/projekte">Projekte</a>
<p class="nav-label">Rückschau</p>
<a href="/protokoll">Protokoll</a>
<a href="/statistik">Statistik</a>
<a href="/aktivitaet">Aktivität</a>
<p class="nav-label">Verwalten</p>
<a href="/projekte">Projekte</a>
<a href="/material">Material</a>
<a href="/wartung">Wartung</a>
<a href="/einstellungen">Einstellungen</a>
@@ -466,7 +469,12 @@ async function refreshJetzt() {
}
if (jetztBox) {
jetztBox.classList.toggle("is-empty", !actionItems.length);
setListHtml(document.getElementById("jetzt-list"), actionItems.map(actionItemHtml).join(""));
const jetztList = document.getElementById("jetzt-list");
if (!actionItems.length) {
setListHtml(jetztList, '<li class="queue-empty">Alles erledigt — nichts zu tun.</li>');
} else {
setListHtml(jetztList, actionItems.map(actionItemHtml).join(""));
}
}
const runBox = document.getElementById("run-box");
@@ -607,13 +615,17 @@ refreshJetzt();
(function liveUpdates() {
let streamLive = false;
const sseKinds = {
queue: () => refreshJetzt(),
queue: () => {
refreshJetzt();
if (typeof window.onQueueChanged === "function") window.onQueueChanged();
},
senden: () => refreshJetzt(),
ereignis: () => refreshJetzt(),
aufgaben: () => refreshJetzt(),
drucker: () => {
refreshJetzt();
if (typeof window.onDruckerLive === "function") window.onDruckerLive();
if (typeof window.onQueueChanged === "function") window.onQueueChanged();
},
};