Commit graph

111 Commits

Autor SHA1 Nachricht Datum
Claude Dev
9591784ee4 fix: Karten-Höhe auf gs-h=8 zurückgesetzt (war auf 4 gefallen)
HTML-Attribut wieder an den DEFAULT_LAYOUT in layout.js angeglichen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:45:34 +01:00
Claude Dev
a9f22108da fix: Chat-Overlay Breite auf 85vw
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:35:46 +01:00
Claude Dev
cc5da6723f fix: Chat-Overlay Breite auf 70% der Fenstergröße
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:34:12 +01:00
Claude Dev
cd027c0bec fix: Chat-Vollbild als zentriertes großes Overlay statt echtem Fullscreen
700px breit, 80vh hoch, zentriert, mit Rand und abgerundeten Ecken.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:31:31 +01:00
Claude Dev
4a0577d3f4 feat: Vollbild-Modus für Chat-Assistent
Neuer Button zwischen Reload und Schließen. Toggled zwischen
normalem Fenster und Vollbild. Icon wechselt zwischen Expand/Collapse.
Schließen und Reset beenden Vollbild automatisch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:29:05 +01:00
Claude Dev
ed1b87437a fix: Chat-Button höher positioniert um Gridstack-Resize-Handle nicht zu verdecken
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 13:26:56 +01:00
Claude Dev
7503f63b0d feat: Neuer-Chat-Button im Chat-Header
Reload-Button (kreisförmiger Pfeil) neben dem Schließen-Button.
Wird erst sichtbar nach der ersten Nachricht. Setzt Konversation
zurück, leert den Verlauf und zeigt die Begrüßung erneut.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 12:49:06 +01:00
Claude Dev
1c9777e533 fix: Quellenübersicht-Stats in eigene Zeile unter den Header verschoben
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 12:18:06 +01:00
Claude Dev
996ee71622 feat: Artikel- und Quellen-Anzahl im zugeklappten Quellenübersicht-Header anzeigen
Zeigt "X Artikel aus Y Quellen" direkt im Header der Quellenübersicht-Kachel,
sodass die Info auch ohne Aufklappen sichtbar ist.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 11:55:15 +01:00
Claude Dev
7de1f0b66c Revert "Fortschrittsbalken: stetiger Creep statt fixer Sprünge"
This reverts commit ff7322e143.
2026-03-13 23:16:38 +01:00
Claude Dev
9931cc2ed3 Revert "Fortschrittsbalken: globaler Creep statt Phasen-Deckel"
This reverts commit 6ce24e80bb.
2026-03-13 23:16:38 +01:00
Claude Dev
6ce24e80bb Fortschrittsbalken: globaler Creep statt Phasen-Deckel
Phasen haben nur noch Mindest-Floors (queued 2%, recherche 12%,
analyse 35%, faktencheck 65%), keinen Deckel mehr. Der Balken
kriecht global asymptotisch Richtung 95% (0.5% des Restwegs pro
500ms), sodass er nie stehenbleibt. Phasenwechsel geben sichtbare
Boosts nach oben, complete snappt auf 100%.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 23:14:22 +01:00
Claude Dev
ff7322e143 Fortschrittsbalken: stetiger Creep statt fixer Sprünge
Balken kriecht jetzt asymptotisch innerhalb jeder Phase
(queued 2-10%, recherche 12-30%, analyse 33-60%, faktencheck 65-92%)
statt bei Phasenwechsel hart zu springen. 3% des Restwegs pro
500ms-Tick sorgt für gleichmäßige Bewegung unabhängig von der
Phasendauer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:51:51 +01:00
Claude Dev
f9ebd7b289 Faktencheck: Ursprungsquellen bei fehlender URL anzeigen statt blind herabstufen 2026-03-13 19:54:18 +01:00
Claude Dev
2792e916c2 Telegram-Kategorie-Checkboxen: Nutzer koennen bei Lage-Erstellung einzelne Telegram-Quellkategorien auswaehlen 2026-03-13 19:08:36 +01:00
Claude Dev
bb3711a471 Fix: app.js wiederherstellen und Telegram-Patches korrekt anwenden 2026-03-13 13:19:34 +01:00
Claude Dev
01cad9dac5 Telegram-Kanaele als Quelle: Parser, Pipeline, UI-Checkbox, Validate-Endpoint
- Neuer source_type telegram_channel in models.py (Source + Incident)
- DB-Migration: include_telegram Spalte fuer incidents
- feeds/telegram_parser.py: Telethon-basierter Parser (analog RSS)
- Orchestrator: Telegram-Pipeline parallel zu RSS + WebSearch
- sources.py: POST /api/sources/telegram/validate Endpoint
- incidents.py: include_telegram in Create/Update/Response
- dashboard.html: Telegram-Checkbox + Filter-Option
- app.js: FormData, EditModal, SourceStats, TypeLabels
- config.py: TELEGRAM_API_ID, API_HASH, SESSION_PATH
- requirements.txt: telethon hinzugefuegt
2026-03-13 13:10:24 +01:00
claude-dev
c3680c3673 Add image attachments to feedback form (JPEG/PNG)
- File input in feedback modal (max 3 images, 5 MB each)
- Frontend validation for file count and size
- Backend: multipart/form-data with UploadFile, MIME attachments
- Images attached to feedback email as base64-encoded attachments
- Only JPEG and PNG allowed (validated server-side)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:35:47 +01:00
claude-dev
22f817c42c Reset tile scroll positions when switching incidents
Reset scrollTop on summary-content and factcheck-list containers
so scroll position from previous incident is not preserved.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:19:53 +01:00
claude-dev
ca3ff1520d Clear old content immediately when switching incidents
Prevents brief flash of previous incident content (Lagebild,
Faktencheck, Quellen, Timeline, title) while new data loads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:18:55 +01:00
claude-dev
25029c2b6a Fix missing quotes in getElementById call
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:14:10 +01:00
claude-dev
1172899dbc Fix scroll-to-factcheck: use scroll event lock during rendering
The double-rAF callbacks from resizeTileToContent fire after the
initial scrollTop=0 reset. Add a scroll event listener that forces
scrollTop=0 during the entire rendering phase, then remove it after
3 animation frames (covering all double-rAF resize callbacks).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:12:50 +01:00
claude-dev
ee6cbee6f2 Fix scroll-to-factcheck: disable GridStack animation during incident switch
Remove grid-stack-animate class before rendering to prevent CSS
transitions from causing browser scroll-follow to repositioned tiles.
Re-enable animation after content is loaded and scroll is reset.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:10:28 +01:00
claude-dev
d31ec2a9a8 fix: overflow:hidden VOR Display-Wechsel und GridStack-Init setzen
Der Scroll zum Faktencheck wurde durch den display:none->flex Wechsel
und/oder GridStack-Init ausgeloest. overflow:hidden wird jetzt ganz
am Anfang von selectIncident gesetzt, BEVOR das incident-view
sichtbar wird. Erst 500ms nach Abschluss aller Render-Operationen
wird overflow wiederhergestellt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:02:56 +01:00
claude-dev
163c0c1e8b fix: Scroll-Lock per Event-Listener statt overflow:hidden
Scroll-Event-Listener setzt scrollTop=0 bei jedem Scroll-Versuch
waehrend 500ms nach dem Laden. Verhindert zuverlaessig, dass
GridStack, Leaflet oder Fokus-Aenderungen den View verschieben.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:58:54 +01:00
claude-dev
e745814230 fix: Scroll-Block bis 300ms nach Rendering (GridStack-Resizes abwarten)
overflow:hidden bleibt 300ms nach loadIncidentDetail aktiv, damit
die verzögerten GridStack resizeTileToContent-Operationen keinen
Scroll zum Faktencheck ausloesen koennen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:56:20 +01:00
claude-dev
d983042503 fix: Scroll-Ruckeln beseitigt - overflow:hidden waehrend Rendering
Statt den Scroll nach unten mit Timeouts zurueckzukaempfen, wird
overflow:hidden auf main-content gesetzt bevor das Rendering startet.
Nach Abschluss wird scrollTop=0 gesetzt und overflow wiederhergestellt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:54:45 +01:00
claude-dev
376f0d093b fix: Scroll-to-Top bei Lagewechsel verstaerkt (sofort + rAF + setTimeout)
Scroll-Reset erfolgt nun an 4 Zeitpunkten um sicherzustellen, dass
der Hauptbereich nach oben scrollt, auch wenn GridStack oder andere
asynchrone Rendering-Operationen den Scroll verschieben.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:38:05 +01:00
claude-dev
144787f1e7 fix: Modal nicht mehr per Backdrop-Klick schliessbar + Scroll-to-Top bei Lagewechsel
1. Modal (Anlegen/Bearbeiten) schliesst nur noch ueber den X-Button,
   nicht mehr durch Klick auf den dunklen Hintergrund
2. Beim Anklicken einer Lage in der Sidebar scrollt der Hauptbereich
   nach oben statt zum Faktencheck-Bereich

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:33:15 +01:00
claude-dev
62aa63c7fb Bestätigungstext beim Ausschließen von Quellen erweitert
Klarerer Hinweis: betrifft alle eigenen Recherchen, nicht andere Nutzer der Organisation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:12:25 +01:00
claude-dev
6f2aac7313 Domain-ausschließen-Formular aus Toolbar entfernt
Redundant - jede Domain hat bereits einen eigenen Ausschließen-Button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:40:30 +01:00
claude-dev
5e19736a25 Per-User Domain-Ausschlüsse + Grundquellen-Schutz
- Neue Tabelle user_excluded_domains für benutzerspezifische Ausschlüsse
- Domain-Ausschlüsse wirken nur für den jeweiligen User, nicht org-weit
- user_id wird durch die gesamte Pipeline geschleust (Orchestrator → Researcher → RSS-Parser)
- Grundquellen (is_global) können nicht mehr bearbeitet/gelöscht werden im Frontend
- Grundquelle-Badge bei globalen Quellen statt Edit/Delete-Buttons
- Filter Von mir ausgeschlossen im Quellen-Modal

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:30:21 +01:00
claude-dev
18954cf70e Wording: Domain sperren → Domain ausschließen
Einheitliche Umbenennung in UI-Texten, Kommentaren und Docstrings:
- Sperren → Ausschließen
- Gesperrt → Ausgeschlossen
- Entsperren → Ausschluss aufheben

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:02:36 +01:00
claude-dev
bcad3e9f3c Theme-Toggle als Schalter + Karten-Vollbild + Zoom-Begrenzung
- Theme-Toggle: Button durch Sun/Moon-Slider ersetzt (Dark Mode Standard)
- Karte: Fullscreen-Overlay mit Expand-Icon, Escape zum Schließen
- Karte: Zoom-Limits (minZoom:2, maxBounds, noWrap)
- Karte: Button 'Orte erkennen' -> 'Orte einlesen', rechts ausgerichtet

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:18:04 +01:00
claude-dev
5ae61a1379 Geoparsing von spaCy auf Haiku umgestellt
- geoparsing.py: Komplett-Rewrite (spaCy NER + Nominatim -> Haiku + geonamescache)
- orchestrator.py: incident_context an geoparse_articles, category in INSERT
- incidents.py: incident_context aus DB laden und an Geoparsing uebergeben
- public_api.py: Locations aggregiert im Lagebild-Endpoint
- components.js: response-Kategorie neben retaliation (beide akzeptiert)
- requirements.txt: spaCy und geopy entfernt

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:00:40 +01:00
claude-dev
3c4170bead Karte: Standard-Höhe auf h:8 (640px) erhöht
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:42:38 +01:00
claude-dev
ba8f807c96 Fix: Refresh-Verlauf zeigte Zeiten 1 Stunde in der Zukunft
parseUTC() hängte blind ein 'Z' (UTC) an alle Timestamps, aber
die DB speichert Lokalzeit (Europe/Berlin). Bei CET (UTC+1) wurden
alle Zeiten 1 Stunde zu spät angezeigt.

Neue Logik: Timestamps mit 'Z' oder '+' werden direkt geparst.
Timestamps ohne Zeitzonen-Info werden als Europe/Berlin interpretiert
mit korrektem Offset (auch bei Sommer-/Winterzeit-Wechsel).

Betrifft: Refresh-Verlauf, Artikel-Zeitstempel, Snapshots, Lagebild-Stand

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:33:04 +01:00
claude-dev
1c7adafa70 Fix: Progress-Timer zeigte negative Zahlen (-58:-10)
Ursache: Server sendete started_at als Lokalzeit (Europe/Berlin),
aber der Client interpretierte es als UTC via parseUTC().
Bei UTC+1 lag die Startzeit dadurch 1 Stunde in der Zukunft.

- orchestrator.py: started_at in WebSocket-Nachrichten als echtes UTC
  (ISO 8601 mit Z-Suffix) senden, DB-Timestamps bleiben Lokalzeit
- components.js: elapsed auf min. 0 clampen als Sicherheitsnetz

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:51:33 +01:00
claude-dev
ac3291f608 fix: Alle Zeitanzeigen fest auf Europe/Berlin Zeitzone
Alle toLocaleTimeString/toLocaleDateString-Aufrufe und
getHours/getMinutes-Zugriffe verwenden jetzt fix die
Zeitzone Europe/Berlin statt der Browser-Zeitzone.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:31:21 +01:00
claude-dev
46cbf94a49 UI: Email-Dropdown im Header mit Org-Name und Lizenztyp
- Klick auf Email öffnet Dropdown mit Organisation und Lizenzinfo
- Org-Name und Lizenz-Badge nicht mehr direkt sichtbar im Header
- Dropdown schliesst bei Klick ausserhalb
- Barrierefreie ARIA-Attribute

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:00:31 +01:00
claude-dev
32f0281a96 Refactor: Email statt Username als Anzeige-Identifier
- Header zeigt volle Email statt Username
- Lagen-Karten/Sidebar zeigen Email-Prefix (vor dem @) als Ersteller
- Feedback-Emails nutzen Email-Prefix statt Username
- Login/Notification-Emails nutzen Email-Prefix als Anrede
- DB-Queries holen email statt username für Ersteller-Anzeige

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 18:55:24 +01:00
claude-dev
faa273f0de Fix: Barrierefreiheit "Größere Schrift" funktioniert jetzt
CSS zoom statt font-size auf Root, da alle Schriftgrößen in px definiert
sind und font-size:115% auf :root keine Wirkung hatte.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 18:02:53 +01:00
claude-dev
70ef7a1dd0 Revert: Englische Sprachintegration (i18n DE/EN) komplett entfernen
Frontend-Dateien auf Zustand vor i18n zurückgesetzt.
lang.js entfernt, CSP bereinigt. Backend-Umlaut-Fix bleibt erhalten.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:39:16 +01:00
claude-dev
b604a80842 i18n: Fix gray map tiles, translate A11y/Notification panels, remaining strings
- Fix gray map on EN: always use tile.openstreetmap.de (org has rate limits)
- Add A11yManager._updateLabels() for live language switch of accessibility panel
- Add NotificationCenter._updateLabels() for notification panel translation
- Replace all remaining hardcoded de-DE locales with dynamic locale switch
- Translate sidebar stats, source discovery toasts, session expiry warning
- Translate source form hints, type labels, article progress counter
- Add 15+ new translation keys for missing strings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:36:28 +01:00
claude-dev
28458118d4 i18n: Fix last hardcoded German error string in export function
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:13:54 +01:00
claude-dev
44997d511b i18n: Complete DE/EN language switcher integration
- Add LangManager with 270+ translation keys, anti-flicker lang detection
- Replace all hardcoded German strings in app.js, components.js, dashboard.html, index.html
- Dynamic getter properties for fact-check labels, category badges
- Language-aware map tiles (DE/EN OSM servers), CSP updated for tile.openstreetmap.org
- Lang switcher in header bar and login page
- Locale-aware date formatting, translateApiError for backend messages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:13:11 +01:00
claude-dev
1644f8786c Add i18n translation dictionary and LangManager singleton (DE/EN)
Provides full German/English translation support for the OSINT dashboard
with anti-flicker init, DOM hydration via data-i18n attributes, placeholder
replacement, API error translation, and locale-aware map tile URLs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:45:59 +01:00
claude-dev
e91829d215 Karte: Deutsche OSM-Kacheln, einheitlich fuer beide Themes
- tile.openstreetmap.de statt OSM/CartoDB: deutsche Ortsnamen
- Graue Vierecke behoben (Subdomain 'd' existierte nicht bei OSM)
- Gleiche helle Karte in Dark und Light Mode
- CSP img-src auf neuen Tile-Server aktualisiert

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:08:45 +01:00
claude-dev
559ace2f02 WCAG 2.1 AA: Focus-Styles, ARIA-Attribute, Tastatur-Navigation, Formvalidierung
- Default :focus-visible auf allen interaktiven Elementen (WCAG 2.4.7)
- A11y-Panel: role=group, Esc/Pfeiltasten, Fokus-Management
- Checkbox sr-only statt display:none (Screenreader-zugaenglich)
- Toggle-Switch Focus-Indikator
- aria-required, aria-expanded, aria-haspopup auf Formularen/Dropdowns
- Export-Dropdown: role=menu/menuitem/separator
- Sidebar: aria-expanded auf Sektionen, aria-hidden auf Chevrons
- Globaler Esc-Handler mit korrekter Schliess-Reihenfolge
- Formvalidierung: aria-invalid, aria-describedby, Fokus auf Fehler
- Notification-Items: role=button, tabindex=0
- Badges: aria-label/aria-hidden fuer Screenreader
- SR-Announcement bei Sidebar-Lage-Auswahl

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 12:53:13 +01:00
claude-dev
a6c24366a0 Quellenverwaltung: Boulevard-Kategorie, Duplikat-Prüfung, Domain-Normalisierung
- Boulevard als Kategorie in HTML-Dropdowns, JS-Labels und Pydantic-Validierung
- create_source: URL-Duplikat-Prüfung (409 Conflict bei existierender URL)
- create_source + update_source: Domain via _DOMAIN_ALIASES normalisieren
- System-Quellen (auto-entdeckt) sind jetzt von allen Nutzern editierbar

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 23:45:01 +01:00