Commit Graph

80 Commits

Author SHA1 Message Date
Erik Thiele
94bfe865ef chore: Version auf 6.2.1 heben
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 12:49:19 +02:00
Erik Thiele
03d663588c chore: .env ignorieren, Konfiguration und Verlauf nachziehen
- .gitignore: .env aufgenommen, damit lokale Zugangsdaten (OpenAI,
  Brandfetch) nicht versehentlich versioniert werden
- config.json: Screen 'videosysteme' an Standort Karlsruhe, dazu eine
  Zeitsteuerung am Priority-Eintrag (Mo 08:00-09:00)
- history.json: zugehoerige Verlaufseintraege

Reine Laufzeit- und Konfigurationsdaten, keine Codeaenderung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 12:36:04 +02:00
Erik Thiele
848bcf93ab feat: Willkommensseite auf mehreren Screens anzeigen
Die Willkommensseite ging bisher fest in die Lobby-Playlist. Welche
Screens Begruessungsschirme sind, ist aber eine Eigenschaft der
Installation und nicht des einzelnen Kundenbesuchs - deshalb ein Flag
pro Screen statt einer Auswahl bei jedem Vorgang.

- Neue Screen-Einstellung "welcome_enabled" (Checkbox im Tab
  Einstellungen). Die generierte welcome.html wird in jeden markierten
  Screen des Standorts geschrieben und dort an Position 0 gesetzt.
- welcome_target_screens() faellt nur auf "lobby" zurueck, wenn kein
  Screen des Standorts den Schluessel besitzt. Bestehende Standorte
  verhalten sich damit ohne Konfigurationsaufwand unveraendert.
- add_customer_to_playlists() (frueher add_customer_to_lobby_playlist)
  raeumt welcome.html aus allen Screens des Standorts und fuegt sie nur
  in den Zielscreens wieder ein. Ein abgewaehlter Screen bleibt so nicht
  mit einer alten Begruessung stehen.
- Eingefuegt wird ein Dict statt eines Strings, damit der Eintrag
  enabled und schedule tragen kann.
- Optionales "Anzeigen bis" im Formular: setzt eine Zeitsteuerung, die
  Seite verschwindet danach auf allen Screens von selbst.
- Das Formular zeigt die aktuellen Zielscreens an und meldet
  verstaendlich, wenn keiner markiert ist.
- screens.setdefault("lobby", {}) entfernt - das legte an Standorten
  ohne Lobby stillschweigend einen Screen an. Es werden nur noch
  vorhandene Screens bespielt.

Die Seite referenziert alle Bilder absolut (/static/..., /media/...),
ist also ortsunabhaengig; je Screen liegt eine identische Kopie.

README, AGENTS.md und die Hilfeseite nachgezogen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 12:26:22 +02:00
Erik Thiele
3761497421 chore: Version auf 6.2.0 heben
Die Zeitsteuerung fuer Playlist-Eintraege ist seit 6.1.0 dazugekommen.
AGENTS.md versieht Feature-Abschnitte mit einer Versionsangabe - der
Abschnitt "Zeitsteuerung" traegt sie jetzt nach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 20:51:24 +02:00
Erik Thiele
5dda8abe2e docs: Zeitsteuerung in AGENTS.md und DESIGN.md nachziehen
AGENTS.md:
- Helper-Liste nannte playlist_item_enabled(), die es nicht mehr gibt;
  ersetzt durch is_item_active() und die neuen Schedule-Helfer
- Playlist-Items: auch Datei-Eintraege koennen Dicts sein, save_playlist
  kopiert bestehende Dicts, daher ueberlebt schedule das Umsortieren
- Neuer Abschnitt "Zeitsteuerung": Format, Auswertungsregeln,
  Reload-Kopplung ueber playlist_hash() und die beteiligten Stellen.
  Festgehalten sind besonders die Punkte, die man beim Umbau kaputt
  macht: unlesbare Angaben blenden nicht aus, Mitternachtsfenster
  gehoert zum Starttag, daily ignoriert days.

DESIGN.md:
- Playlist-Grid war mit 6 Spalten dokumentiert, tatsaechlich sind es 7
  (Edit-Button fehlte). Dazu die Regel, dass Statusmarkierungen in den
  .playlist-name-Span gehoeren - als Geschwisterelement verschieben sie
  die gesamte Zeile.
- Cards: festgehalten, dass .card global gestylt ist und deshalb nicht
  zum Gruppieren von Formularfeldern taugt; dafuer schlichte Zeilen mit
  <hr> + <h3>.
- Schedule-Badge dokumentiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 19:55:18 +02:00
Erik Thiele
90baa6130f docs: Zeitsteuerung in README und Hilfeseite dokumentieren
README:
- Feature-Liste und Routen-Tabelle ergaenzt
  (POST /admin/<site>/update-playlist-item/<screen>)
- Neuer Abschnitt "Playlist-Eintraege" mit dem Dict-Format fuer URL- und
  Datei-Eintraege sowie dem schedule-Objekt: Felder, Beispiele und die
  Verhaltensregeln (nur Uhrzeit bei daily/weekly, days nur bei weekly,
  Fenster ueber Mitternacht gehoert zum Starttag, unlesbare Angaben
  blenden nicht aus, Aktiv-Zustand fliesst in den Playlist-Hash ein)
- Helper-Liste aktualisiert: playlist_item_enabled() gibt es nicht mehr,
  dafuer is_item_active(), _schedule_time(), _window_start_date(),
  _in_validity_range() und der Filter schedule_text()

Hilfeseite (/admin/help):
- Neuer Abschnitt "Zeitsteuerung" mit Modus-Tabelle, Beispielen und den
  Punkten, ueber die man sonst stolpert
- Playlist-Abschnitt: Edit-Button gilt jetzt fuer alle Eintragstypen,
  "Zeit"-Badge erklaert
- Priority-Abschnitt: Zeitsteuerung steht dort ebenfalls zur Verfuegung

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 19:52:58 +02:00
Erik Thiele
29caaa2e0e chore: .DS_Store aus der Versionierung nehmen
Die Datei stand bereits in .gitignore, war aber weiterhin getrackt -
Ignore-Regeln greifen bei bereits versionierten Dateien nicht. Lokal
bleibt sie erhalten, nur der Repo-Eintrag entfaellt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 19:45:19 +02:00
Erik Thiele
f540458b74 fix: Zeitsteuerung reparieren und vervollstaendigen
Der vorige Commit 26efed8 war nicht lauffaehig - fehlgeschlagene
Patch-Anwendungen hatten Zeilen aus ihren Bloecken geschoben.

Reparaturen:
- admin(): zerschossene Playlist-Schleife neu aufgebaut
- player(): return render_template war in den else-Zweig gerutscht,
  wodurch die View bei aktiver Priority-Playlist None lieferte (HTTP 500)
- playlist_item_enabled() existierte nicht mehr (umbenannt zu
  is_item_active), zwei Aufrufe im Player blieben stehen -> NameError
- update_playlist_item(): Absturz bei new_url=null, und der
  enabled-Status ging beim Bearbeiten verloren
- Dateityp-Erkennung mit else-Fallback, ftype konnte ungebunden bleiben

Zeitsteuerung:
- Zeitfenster ueber Mitternacht (22:00-02:00) funktionieren; bei weekly
  gehoert ein solches Fenster zum Wochentag seines Starts
- Optionaler Gueltigkeitszeitraum (valid_from/valid_until) fuer daily
  und weekly, beide Grenzen einzeln optional und inklusiv
- daily/weekly speichern nur noch die Uhrzeit ("08:00") statt eines
  Zeitstempels mit bedeutungslosem Datumsanteil; _schedule_time() liest
  weiterhin auch Altbestaende mit vollem ISO-Zeitstempel
- playlist_hash() bezieht den ausgewerteten Aktiv-Zustand ein, sonst
  bemerkt der Player ein ablaufendes Zeitfenster erst beim naechsten
  Reload aus anderem Grund
- Zeitsteuerung auch fuer Datei-Eintraege, nicht nur URLs
- Neuer Filter schedule_text fuer den Tooltip am "Zeit"-Badge

Oberflaeche:
- required lag auf ausgeblendeten Feldern und blockierte das Absenden
  des Formulars "URL hinzufuegen" ohne sichtbare Meldung
- updateScheduleDaysVisibility() war innerhalb von DOMContentLoaded
  definiert, der Edit-Handler darueber -> ReferenceError bei jedem Klick
- data-schedule mit tojson zerlegte das Attribut, da tojson " nicht
  escaped
- Zeitsteuerungs-Block als schlichte Formularzeilen statt als card, die
  global den roten Rand und grauen Header erhaelt
- Zeitsteuerung auch in der Priority-Playlist

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 19:42:03 +02:00
Erik Thiele
26efed87a5 feat: Add time-based scheduling for playlist items 2026-08-29 16:29:40 +02:00
Erik Thiele
7870c889f8 README: OpenAI API-Key-Doku ergänzt 2026-07-22 13:16:20 +02:00
Erik Thiele
6f82bda70c OpenAI-Key aus env var statt Hardcode: OPENAI_API_KEY in generate_welcome_page.py, docker-compose reicht Variable durch 2026-07-22 12:51:52 +02:00
Erik Thiele
bf95b3173b Doku: Link-Icon für Passthrough-Status in Playlist-Zeile beschrieben 2026-07-10 17:46:52 +02:00
Erik Thiele
22104b54cd Query-Parameter-Passthrough per URL steuerbar (Checkbox im Edit-Modal), Standard aus, sichtbar via Link-Icon in Playlist
- Neue Config-Felder: passthrough_params (true/false) pro URL-Item
- Edit-Modal in admin.html + priority.html mit Checkbox
- Player checkt item.passthrough === true vor appendParams()
- Default: false (keine Parameter-Übergabe ohne Checkbox)
- Link-Icon (ti-link / ti-link-off) in Playlist-Zeile als Status-Indikator
- Doku: help.html, README.md, AGENTS.md
2026-07-10 17:44:57 +02:00
Erik Thiele
6efce5b2ee AGENTS.md: Query-Parameter-Passthrough dokumentiert 2026-07-10 17:20:55 +02:00
Erik Thiele
5ee9e0b373 Query-Parameter der Player-URL an Playlist-URLs übergeben
- player_params als dict(request.args) an player.html übergeben
- appendParams() fügt Parameter an iframe.src + Overlay-URLs an
- Funktioniert mit & ohne bestehende Query-Parameter in der Ziel-URL
- Beispiel: /player/stuttgart/lobby?customer=acme → https://dashboard?customer=acme
2026-07-10 17:20:37 +02:00
Erik Thiele
fca129b367 Fix: Leeres Span für Edit-Spalte bei Nicht-URL-Items (Grid-Alignment) 2026-07-10 16:50:01 +02:00
Erik Thiele
1480960801 Button-Reihenfolge: Löschen vor Edit in der Playlist-Zeile 2026-07-10 16:47:41 +02:00
Erik Thiele
b8093521a0 Fix: Edit-Button-Klick-Handler vor DOMContentLoaded ziehen
Die globale Event-Delegation lag versehentlich innerhalb
des DOMContentLoaded-Callbacks. Wenn initSortable fehlschlug,
wurde der Click-Handler nie registriert.
- editState + document click handler jetzt global (vor DOMContentLoaded)
- Duplicate Code entfernt
- Debug-alerts entfernt
2026-07-10 16:40:59 +02:00
Erik Thiele
be00342109 Debug: inline onclick alert test 2026-07-10 16:37:47 +02:00
Erik Thiele
a8cbeb089f Debug: Edit-Button mit globaler Event-Delegation + alert() 2026-07-10 16:35:34 +02:00
Erik Thiele
f1c36f3c99 Switch to event delegation for edit button (robuster) + btn-outline-secondary 2026-07-10 16:34:16 +02:00
Erik Thiele
f8b7a94845 Use 'Edit' text instead of pencil emoji for URL edit button 2026-07-10 16:25:13 +02:00
Erik Thiele
ce4cd4486b URLs in Playlist inline bearbeiten (Edit-Button + Modal)
- Neue Route POST /admin/<site>/update-playlist-item/<screen>
- Bearbeiten-Button (✎) für URL-Items in admin.html + priority.html
- Modal mit URL + Zoom-Feld, Validierung und Speichern
- Grid um Edit-Spalte erweitert (28px|1fr|90px|80px|40px|50px|32px)
2026-07-10 16:24:47 +02:00
Erik Thiele
106ec2d897 Fix: Trusted-Device-Cookie überlebt jetzt den Logout
- resp.delete_cookie('mfa_trust') aus /logout entfernt
- Cookie wird nur noch bei MFA-Deaktivierung/Passwort-Reset gelöscht
- Debug-Prints entfernt, users.json aufgeräumt
2026-07-10 16:17:08 +02:00
Erik Thiele
b9e7b2e074 Fix: Trusted-Device-Cookie wurde nicht korrekt gespeichert
- Cookie path explizit auf '/' gesetzt
- login_user() vor Cookie-Setzung aufgerufen (konsistenter Zustand)
- Kein Überschreiben der Response mehr bei must_change_password
2026-07-10 15:44:00 +02:00
Erik Thiele
bfbd970f3b Fix: Passwort-Reset deaktiviert jetzt auch MFA
Beim Admin-Passwort-Reset werden mfa_enabled, mfa_secret,
mfa_recovery_codes und trusted_devices zurückgesetzt.
2026-07-10 15:33:37 +02:00
Erik Thiele
23a33955aa MFA: Trusted Device Feature — Gerät für X Tage merken, überspringt MFA
- User kann nach TOTP-Eingabe das Gerät für 1–30 Tage speichern
- Cookie mfa_trust mit zufälligem Token, gespeichert in trusted_devices[]
- Nächstes POST /login: Cookie prüfen → gültiges Token → MFA überspringen
- Abgelaufene Einträge werden beim Login automatisch bereinigt
- Logout + MFA-Deaktivierung löschen Cookie + trusted_devices
- mfa_verify.html: checkbox + days-select (1/3/7/14/30 Tage)
2026-07-10 15:27:17 +02:00
Erik Thiele
317f2a6eb2 Doku: README, AGENTS und Hilfeseite aktualisiert
- README: Willkommensseite-Sektion mit Ansprechpartner/Markdown/Layout
- AGENTS: generate_welcome_html Signatur + Verhalten dokumentiert
- help.html: Ansprechpartner-Felder, Markdown-Hilfe, Portrait-Layout
2026-07-04 10:34:11 +02:00
Erik Thiele
a0753ea4c3 Willkommensseite: Kontaktinfo linksbündig mit Aufzählungen, Portrait-Modus verbessert
- md_to_html: Listen-Support (- /*) und Zeilenumbrüche erhalten
- Kein Firmenname mehr unter den Logos (customer-name entfernt)
- text-align: left + align-items: stretch für linksbündige Texte
- Feste Logo-Höhe 120px für gleiche Text-Startposition
- Portrait-Modus: Text links vom Logo (via order), gap 40px
- Schrift 1.3rem, margin-top 24px, Listeneinzug entfernt
- Reset-Button im Willkommensseite-Formular
- Markdown-Hilfetext aktualisiert
2026-07-04 10:31:02 +02:00
Erik Thiele
c1a043fc75 Ansprechpartner-Felder für Willkommensseite mit Markdown-Support 2026-07-04 09:14:38 +02:00
Erik Thiele
b1f525c714 proxyfix 2026-06-30 19:11:44 +02:00
Erik Thiele
f8c0d7d72c Session-Log aus Tracking entfernt 2026-06-30 19:02:27 +02:00
Erik Thiele
cdcf2f50c6 Doku aktualisiert 2026-06-30 19:01:15 +02:00
Erik Thiele
3a07df31cf Info Tab und MFA 2026-06-28 15:15:58 +02:00
Erik Thiele
297b52e50c Info Tab und MFA 2026-06-28 15:14:06 +02:00
Erik Thiele
1243910d4b Ergänzung Active Button 2026-06-26 15:10:38 +02:00
Erik Thiele
22ed03c8fa Fehler behoben Stay on first slide 2026-06-22 21:39:20 +02:00
Erik Thiele
ab83c19997 Fehler bei Stay on first site 2026-06-22 17:01:32 +02:00
Erik Thiele
259626afbc Fehler bei "Stay on first slide" 2026-06-22 16:55:44 +02:00
Erik Thiele
6eed62d990 Darkmode Problem gelöst 2026-06-22 08:42:18 +02:00
Erik Thiele
3de4d5e1dc Darkmode Problem 2026-06-22 08:37:38 +02:00
Erik Thiele
589b5a58ed Standort löschen für nicht admins ausgeblendet 2026-06-21 18:12:10 +02:00
Erik Thiele
a5653b2d99 neuer api key 2026-06-21 17:56:58 +02:00
Erik Thiele
e83d24a3c3 README: Docker-Setup mit Bind-Mounts und chown-Anleitung 2026-06-21 17:27:17 +02:00
Erik Thiele
dd6bcd9d54 Dockerfile: fix home dir for app user (/home/app) 2026-06-21 16:52:48 +02:00
Erik Thiele
928ea92aed Admin Dashboard, Hilfe-Seite, Dockerfile Fixes (gunicorn, UID 1000, HOME) 2026-06-21 16:46:06 +02:00
Erik Thiele
9ccbd1d896 neues gitignore 2026-06-20 16:56:32 +02:00
Erik Thiele
4a428c0d6d dockerfile verbessert 2026-06-20 16:54:54 +02:00
Erik Thiele
3eb5cf9d8d neues dockerfile mit gunicorn Server 2026-06-20 16:49:48 +02:00
Erik Thiele
e18414ab79 Admin Dashboard und Hilfeseite 2026-06-20 16:40:02 +02:00