Drei zusammenhaengende Verbesserungen am Quellen-Health-Bereich:
1. shared/services/source_suggester.py:
- sync mit Monitor commit 49c5572.
- Neue Funktion generate_strategy_escalation_suggestions: erzeugt
deactivate-Vorschlaege fuer Quellen mit fetch_strategy=googlebot|
paywall, deren Reachability-Check trotzdem error meldet.
2. source-health.js: Loesung-suchen-Button erweitert.
Bisher nur bei status=error AND check_type=reachability. Jetzt auch
bei status=warning AND check_type=feed_validity (z.B. "Feed
erreichbar aber leer"). Backend-Endpoint /api/sources/health/
search-fix wird in beiden Faellen aufgerufen, Claude sucht eine
bessere URL fuer die Quelle.
3. source-health.js: Trend-Delta im Counter.
Liest healthHistoryCache[1] (vorletzter Run) und vergleicht mit
aktuellen errors/warnings/ok. Zeigt z.B. "3 Fehler (+2)" rot oder
"143 Warnungen (-15)" gruen. Bei steigenden ok-Counts ist Plus
gruen, bei steigenden Fehlern ist Plus rot. Wenn der vorletzte
Run nicht verfuegbar (Initial-Lauf): kein Delta.
Cache-Buster source-health.js auf 20260509l gebumpt.
Splittet die Quellen-Health-Section in drei eigene Sub-Tabs auf, damit
der User je nach Aufgabe nur den relevanten Bereich sieht und nicht
durch die ganze Seite scrollen muss.
dashboard.html:
- Innerhalb von <div id=sub-source-health>: neue nav-tabs healthSubTabs
mit drei Buttons (Vorschläge / Health-Status / Verlauf).
- Drei Pane-Container ht-suggestions / ht-checks / ht-verlauf,
jeweils per inline-style display kontrolliert.
source-health.js:
- setupHealthSubTabs(): Click-Handler fuer den Tab-Wechsel
(toggle .active auf den Buttons + display none/block auf den Panes).
- renderHealthDashboard splittet jetzt in drei innerHTML-Calls,
einen pro Pane:
paneSuggestions <- Vorschlaege offen
paneChecks <- Counter + Filter + Tabelle + Mehr-laden
paneVerlauf <- erledigte Vorschlaege + Run-Verlauf
- Tab-Label "Vorschlaege" wird mit Counter angereichert (z.B.
"Vorschlaege (24 offen)"), wenn welche offen sind.
- LUCIDE_ICONS-Konstante mit Inline-SVG fuer check, x, search,
refresh. Emojis und HTML-Entities (✓ × ) ersetzt.
Inline-SVG statt CDN-Library, damit keine externe Abhaengigkeit.
Cache-Buster fuer source-health.js auf 20260509i gebumpt.
Vier UX-Hebel zusammengelegt, alle reines Frontend:
1. Vorschlaege-Tabelle: Beschreibung als Einzeiler mit Ellipsis;
voller Text im title-Tooltip. Spart bei 24 offenen Vorschlaegen
~25 Bildschirmhoehen.
2. Verlauf-Card: standardmaessig eingeklappt via <details>-Element.
Header zeigt nur "Verlauf (N erledigte Vorschlaege - klick zum
Aufklappen)". Klick expandiert die Tabelle.
3. Health-Tabelle: Spalten Domain und Sprache aus der Tabelle raus,
beide als Tooltip auf dem Quellen-Namen. Tabelle hat statt 8
Spalten nur noch 6, ist schmaler und besser lesbar.
4. Aktionen-Spalten: Text-Buttons ("Annehmen", "Ablehnen", "Lösung
suchen") durch kompakte Icon-Buttons ersetzt (✓ ✗ 🔍).
Funktion identisch, Tooltip via title-Attribut.
Cache-Buster fuer source-health.js auf 20260509h gebumpt.
Schritt 1 der Quellen-Health-Aufraeumung. Drei UX-Verbesserungen, kein Daten-Eingriff:
1. Default-Filter "Nur Probleme" (errors + warnings, ohne OK).
- Neuer Status-Filter-Wert "issues" als virtuelles Frontend-Konstrukt.
- applyHealthFilter behandelt "issues" als status != ok.
- Default in healthFilters ist jetzt "issues". User sieht beim
Tab-Klick sofort die kritischen 146 Eintraege statt der 281
gruenen OK-Zeilen.
2. Counter aufgegliedert nach check_type.
- Backend (/api/sources/health): zusaetzliches Feld "breakdown"
mit der GROUP-BY (check_type, status) Aggregation.
- Frontend rendert pro Status-Zeile die feine Aufschluesselung,
z.B. "143 Warnungen (112 Aktualität, 27 Feed-Validität, 3 Duplikat,
1 Erreichbarkeit)".
- Hilft dem Admin, sofort zu sehen wo das Problem liegt.
3. Filter-Hint bei Pagination + leeren Treffern.
- Wenn der aktuelle Filter ueber die geladenen 100 Items keinen
Treffer findet UND has_more=true, zeigt das Frontend einen
Hinweis-Link "Alle X Health-Checks laden und Filter erneut
anwenden".
- Loest das Edge-Problem, dass z.B. Filter "Nur OK" auf den
Default-100 (errors first) leer schien.
Cache-Buster fuer source-health.js auf 20260509g gebumpt.
Echter Bottleneck war der DOM-Render von 519 Tabellen-Zeilen, nicht
das Backend (45ms). Backend-Slim und Cache aus dem letzten Commit
haben Bandbreite und wiederholte Klicks beschleunigt, aber der erste
Klick blieb langsam, weil weiterhin alle 519 Items in einem
innerHTML-Schub gerendert wurden.
Lösung: Server-Side-Pagination.
Backend (/api/sources/health):
- Neue Query-Param: limit (default 100, max 5000), offset (default 0)
- Counters errors/warnings/ok/total_checks aus separater GROUP-BY-
Aggregat-Query über den GESAMTEN Bestand, nicht über die Page.
- Neues Feld all_orgs in der Antwort: alle Tenants mit Health-Checks,
damit das Filter-Dropdown auch im Pagination-Modus die volle
Org-Liste hat.
- Neue Felder limit, offset, has_more.
Frontend (source-health.js):
- healthLoadLimit (default 100), wird durch loadMoreHealth() um 200
hochgesetzt oder durch loadAllHealth() auf alles gesetzt.
- Cache-Key beinhaltet jetzt auch das aktuelle Limit, damit beim
Mehr-laden nicht aus altem Cache bedient wird.
- Org-Liste kommt aus healthData.all_orgs statt aus den geladenen
Page-Items, sonst wäre sie nach Pagination unvollständig.
- Footer mit zwei Buttons ("+200 laden", "Alle N weiteren laden")
unter der Tabelle, nur sichtbar bei has_more=true.
- Counter-Anzeige: "X / Y angezeigt (von Z insgesamt)".
Cache-Buster für source-health.js auf 20260509f gebumpt.
Tab "Quellen Health" lädt deutlich schneller:
1. /api/sources/health: SELECT reduziert auf nur die im Frontend wirklich
gerenderten Felder. Weg sind: h.id, s.url, s.source_type, s.category,
s.bias, h.details, h.checked_at. Response-Größe sinkt damit von ~198 KB
auf grob die Hälfte (bei 519 Health-Checks) ohne UI-Verlust.
2. source-health.js: 60-Sekunden In-Memory-Cache fürs loadHealthData.
Tab hin und her klicken ist damit instant statt jedes Mal voller
Reload + Render der 519 Tabellen-Zeilen.
Bei Mutationen (Vorschlag annehmen/ablehnen, run-stream beendet,
search-fix) wird mit loadHealthData(true) der Cache umgangen,
damit frische Daten gezeigt werden.
3. dashboard.html: Cache-Buster für source-health.js auf 20260509e gebumpt.
- Neuer Endpoint /health/run-stream mit Server-Sent Events
- Frontend zeigt Fortschrittsbalken: 4/12 + Quellenname + Prozent
- Status-Icons pro Quelle (Fehler/Warnung/OK)
- Phase Vorschläge wird separat angezeigt
- Ergebnis-Zusammenfassung verschwindet nach 5 Sekunden
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Button erscheint neben Annehmen/Ablehnen bei deactivate_source-
Vorschlägen mit source_id. Startet Sonnet WebSearch-Recherche
nach Alternativen bevor man deaktiviert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
`...` innerhalb von ${} Expressions ist kein valides JS und
verhinderte Variablen-Substitution + crashte das Script in manchen
Browsern, wodurch alle Quellen-Tabs nicht funktionierten.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- formatDate() in source-health.js zu formatDateTime() umbenannt,
damit app.js formatDate() nicht überschrieben wird
- searchFix(): data-Attribute statt inline onclick-String (XSS-sicher)
- searchFix(btn): expliziter Parameter statt implizites event.target
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POST /health/search-fix/{source_id}: Sonnet recherchiert Alternativen
- Button "Lösung suchen" bei Erreichbarkeits-Fehlern im Health-Tab
- Gefundene Lösungen werden automatisch als Vorschläge gespeichert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Neuer Sub-Tab "Quellen-Health" mit Vorschlägen + Check-Ergebnissen
- API: GET /health, GET /suggestions, PUT /suggestions/{id}, POST /health/run
- Vorschläge annehmen/ablehnen mit Auto-Ausführung
- Badge-Styles für Health-Status und Prioritäten
- Umlaute in Source-Modal und Dashboard korrigiert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>