UI-Fixes (Button-Wrap, Suchfeld-Icon, Log-Farben, Nav-Persistenz), manueller Check-Trigger, echter Live-Refresh
- section-head: Button ("+ Neue Zugangsdaten" etc.) rutscht bei langer
Beschreibung nicht mehr in die nächste Zeile — bleibt immer rechts oben,
der Beschreibungstext wickelt stattdessen innerhalb seiner eigenen Spalte.
- Suchfeld-Icon überlappte den Platzhaltertext: eine spätere, generische
Input-Regel mit gleicher Spezifität hat die padding-left-Regel des
Lupe-Icons überschrieben (reine Reihenfolge-im-Stylesheet-Sache) — Selektor
spezifischer gemacht.
- Live-Log: Neustart-bezogene Zeilen (manueller Neustart, automatischer
PoE-Restart bei Ausfall) werden jetzt orange markiert statt farblos.
- Aufgeklappte Nav-Gruppen bleiben über Seitenwechsel hinweg erhalten
(localStorage), zusätzlich zur automatischen Aufklappung der Gruppe der
aktuell aktiven Seite.
- Datei-Auswahl (Import) im Dark Mode gestylt (Text + Button), inkl.
color-scheme-bewusster Browser-Widgets.
- Manueller "Jetzt prüfen"-Trigger (Icon neben dem globalen Timer, nur
Admins): startet rpi-check.service neu -> frisches Logfile + sofortiger
Durchlauf, Countdown synchronisiert sich auf den manuellen Zeitpunkt.
- Dashboard und Live-Log aktualisieren sich jetzt per AJAX im Hintergrund
(kein voller Seiten-Reload mehr): neue Route /dashboard/tiles liefert das
Kachel-Fragment (_dashboard_tiles.html, von index.html eingebunden und vom
Live-Update nachgeladen), get_log() liefert den aktuellen Dateinamen als
Header mit, damit die Anzeige nach einem Service-Neustart aktuell bleibt.
- Root-Cause für "Intervall bleibt immer bei 300s": in der WSL-Testumgebung
lief poe_wrapper.py nur als manuell gestarteter Hintergrundprozess statt
als echter rpi-check.service — "systemctl restart" lief dadurch ins Leere.
Echten systemd-Service in WSL eingerichtet und Intervalländerung end-to-end
verifiziert (Log-Zeilenabstand folgt jetzt dem neu gesetzten Intervall).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -429,12 +429,16 @@ button { font-family: inherit; }
|
||||
|
||||
.section-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
gap: 16px;
|
||||
margin-bottom: 18px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
/* Beschreibungstext darf mehrzeilig umbrechen, ohne dass der Button
|
||||
(z.B. "+ Neue Zugangsdaten") mit in die nächste Zeile rutscht — der
|
||||
bleibt immer rechts oben in derselben Zeile. */
|
||||
.section-head > div:first-child { flex: 1 1 auto; min-width: 0; }
|
||||
.section-head > .btn { flex-shrink: 0; }
|
||||
|
||||
.section-head h2 { font-size: 20px; }
|
||||
.section-head .hint { color: var(--text-faint); font-size: 12.5px; margin-top: 3px; }
|
||||
@@ -529,6 +533,22 @@ button { font-family: inherit; }
|
||||
100% { box-shadow: 0 0 0 0 rgba(47,208,122,0); }
|
||||
}
|
||||
|
||||
.timer-pill-refresh {
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
width: 18px; height: 18px;
|
||||
margin-left: 2px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
background: none;
|
||||
color: var(--text-faint);
|
||||
cursor: pointer;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.timer-pill-refresh svg { width: 12px; height: 12px; }
|
||||
.timer-pill-refresh:hover { color: var(--accent-strong); background: var(--accent-dim); }
|
||||
.timer-pill-refresh.spinning svg { animation: spin 0.8s linear infinite; }
|
||||
@keyframes spin { to { transform: rotate(360deg); } }
|
||||
|
||||
/* ==========================================================================
|
||||
Device grid (dashboard)
|
||||
========================================================================== */
|
||||
@@ -663,7 +683,7 @@ button { font-family: inherit; }
|
||||
color: var(--text-faint);
|
||||
pointer-events: none;
|
||||
}
|
||||
.search-input input { padding-left: 34px; }
|
||||
.search-input input[type="text"] { padding-left: 34px; }
|
||||
|
||||
table.data-table {
|
||||
width: 100%;
|
||||
@@ -753,6 +773,40 @@ input[type="text"], input[type="password"], input[type="number"], input[type="em
|
||||
transition: border-color 0.15s ease, box-shadow 0.15s ease;
|
||||
}
|
||||
input::placeholder { color: var(--text-faint); }
|
||||
|
||||
/* Datei-Auswahl (z.B. Import/Export) — der native Button/"keine Datei
|
||||
ausgewählt"-Text folgt sonst nicht dem Farbschema und ist im Dark Mode
|
||||
kaum lesbar (dunkler Text auf dunklem Grund). */
|
||||
input[type="file"] {
|
||||
width: 100%;
|
||||
background: var(--bg-input);
|
||||
border: 1px solid var(--border);
|
||||
color: var(--text);
|
||||
border-radius: 9px;
|
||||
font-size: 13px;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
input[type="file"]::file-selector-button,
|
||||
input[type="file"]::-webkit-file-upload-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
background: var(--bg-card-hover);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 7px;
|
||||
padding: 7px 12px;
|
||||
margin-right: 10px;
|
||||
font-size: 12.5px;
|
||||
font-weight: 600;
|
||||
font-family: inherit;
|
||||
cursor: pointer;
|
||||
transition: background 0.15s ease, border-color 0.15s ease;
|
||||
}
|
||||
input[type="file"]::file-selector-button:hover,
|
||||
input[type="file"]::-webkit-file-upload-button:hover {
|
||||
background: var(--bg-card);
|
||||
border-color: var(--text-faint);
|
||||
}
|
||||
input:focus, select:focus, textarea:focus {
|
||||
outline: none;
|
||||
border-color: var(--accent);
|
||||
@@ -974,7 +1028,7 @@ select {
|
||||
.log-line.online { color: #4ade80; }
|
||||
.log-line.offline { color: #f87171; }
|
||||
.log-line.sep { color: #3a4050; }
|
||||
.log-line.manual { color: #ffb454; }
|
||||
.log-line.restart { color: #ffb454; }
|
||||
|
||||
/* ==========================================================================
|
||||
Permission checklists (Gruppen)
|
||||
|
||||
Reference in New Issue
Block a user