Wenn ein Fall aus der Queue entfernt wird (Cancel, Fehler, Abschluss),
bleiben die #-Nummern der verbleibenden Eintraege jetzt nicht mehr
stecken. _reindexQueuePositions() sortiert nach alter Position und
nummeriert sequentiell neu (#1, #2, ...).
Aufgerufen in: handleRefreshCancelled, handleRefreshError,
handleRefreshComplete.
Nutzer koennen per Klick auf Chips Anweisungen zur Beschreibung
hinzufuegen: Zusammenfassung, Vergleichstabelle, Zeitverlauf,
Pro/Contra oder eigene Tabellen. Format: [TABELLE: ...] und
[ZUSAMMENFASSUNG]. Mehrere Anweisungen moeglich. Analyzer-Prompts
beachten diese Anweisungen verbindlich. Beschreibung-generieren
bewahrt bestehende Direktiven.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Beim Zurueckwechseln auf eine laufende Lage wird der gespeicherte
State (minimized/offen) direkt aus _progressState wiederhergestellt.
War das Popup offen -> offen. War es minimiert -> Mini-Bar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Confirm-Dialog z-index ueber Progress-Popup (10000 > 9000)
2. Progress-Popup wird ausgeblendet waehrend Confirm-Dialog offen
3. Kein dunkler-werdendes Overlay bei mehrfachem Abbrechen-Klick
4. Abbrechen funktioniert jetzt auch fuer Lagen in der Warteschlange
(werden direkt aus der Queue entfernt statt auf Start zu warten)
5. Cancel-Status wird im Popup-Titel angezeigt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
handleRefreshError und handleRefreshCancelled haben den Sidebar-
Refresh-Status (Gold-Rand, Spinner-Text) nicht entfernt. Dadurch
blieben Lagen faeelschlicherweise als laufend markiert.
Jetzt wird bei Error/Cancel: _removeSidebarRefreshStatus() aufgerufen,
_progressState geloescht, und Sidebar neu gerendert.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
API /incidents/refreshing gibt jetzt auch queued IDs mit Position
und den aktuell laufenden Task zurueck.
Frontend nutzt started_at aus der API fuer Timer-Wiederherstellung.
Queued Lagen werden mit korrekter Position wiederhergestellt.
Aktiv laufender Task wird als researching angezeigt statt queued.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Progress-State wird jetzt fuer alle refreshenden Lagen angelegt,
nicht nur fuer die aktuell ausgewaehlte. Sidebar-Update passiert
vor dem Early-Return fuer nicht-aktuelle Lagen.
Bei WebSocket-Reconnect (auch nach Ctrl+Shift+R) wird der State
fuer bereits laufende Refreshes korrekt wiederhergestellt.
Sidebar-Cleanup bei Refresh-Abschluss fuer alle Lagen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
renderIncidentItem() baut den Refresh-Status (Gold-Rand, Spinner,
Statustext, Warteschlange-Position) direkt ins HTML ein. Ueberlebt
jetzt renderSidebar()-Aufrufe bei Lagenwechsel und Aktualisierungen.
Sidebar wird nach jedem WebSocket-Status-Update neu gerendert,
damit der Status fuer ALLE Lagen immer sichtbar bleibt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Aktualisierungen starten minimiert (Mini-Bar), Popup nur per Klick.
Verhindert Ueberlagerung von Bearbeiten/Export-Buttons.
2. Erster Durchlauf: Bearbeiten/Export/Archivieren/Loeschen gesperrt,
nur Abbrechen moeglich.
3. Sidebar: Warteschlange-Lagen zeigen Position (#1, #2...) mit
eigenem visuellen Stil (gedimmt, pulsierender Dot).
4. Sidebar-Status (Recherchiert/Analysiert/Faktencheck) wird fuer
ALLE laufenden Lagen angezeigt, nicht nur die aktuelle.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ladebalken ersetzt durch zentriertes Popup-Fenster mit Checkbox-Checkliste
(Warteschlange, Recherche, Analyse, Faktencheck) und Echtzeit-Timer.
Erster Durchlauf: Popup nicht wegklickbar, Blur-Effekt auf Kacheln.
Aktualisierung: Popup minimierbar zu kompakter Status-Leiste.
Timer laeuft pro Lage im Hintergrund weiter bei Lagenwechsel.
Gesamtzeit wird am Ende im Abschluss-Popup angezeigt.
Sidebar: Animierter Gold-Rand und Fortschrittstext (Recherchiert/
Analysiert/Faktencheck) unter dem Lage-Namen bei laufendem Refresh.
Zusaetzlicher Cancel-Checkpoint im Orchestrator nach Uebersetzung.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
stopPropagation auf dem Dropdown-Container verhindert, dass der
globale Click-Listener das Menue schliesst wenn man den Org-Switcher
bedient.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ermoeglicht dem Global Admin (is_global_admin Flag) zwischen
Organisationen zu wechseln. Neue Endpoints: GET /api/auth/organizations,
POST /api/auth/switch-org. Org-Dropdown im Header-Menue, nur fuer
Global Admin sichtbar. Komplett herausnehmbar (Flag + Code-Bloecke).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Beschreibungs-Textarea waechst automatisch mit dem Inhalt (min 80px).
Greift beim Tippen, nach Beschreibung generieren und im Edit-Modus.
Emdashes (U+2014) durch Doppelpunkte ersetzt.
Button wird beim Bearbeiten einer Lage korrekt aktiviert (Titel per
JS gesetzt loest kein input-Event aus). Im Create-Modus explizit
disabled nach form.reset().
Hinweistext zur guten Beschreibung erscheint jetzt als Tooltip am
i-Icon neben dem Label, konsistent mit allen anderen Formularfeldern.
Tooltip-Text wechselt weiterhin je nach Typ (Live/Recherche).
KI-gestütztes Prompt Enhancement: Button generiert per Haiku aus dem
Titel eine strukturierte Beschreibung. Unterscheidet zwischen
Live-Monitoring (kompakte Vorfallsbeschreibung) und Recherche
(strukturiertes Briefing mit Schwerpunkten und Suchbegriffen).
- Neuer Endpoint POST /api/incidents/enhance-description
- Button erscheint für beide Lage-Typen, aktiv ab 3 Zeichen Titel
- Info-Hinweis wechselt je nach Typ mit Beispiel
- Spinner-Animation während der Generierung
Bei Klick auf Aktualisieren bleibt der Progress-Indikator aktiv,
auch wenn die Recherche in der Warteschlange landet. Statt einer
Warning-Meldung wird eine Info-Meldung angezeigt. Erneutes Klicken
bestaetigt, dass die Aktualisierung bereits in Bearbeitung ist.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
_applyLayout entfernte Widgets ohne die Card-Elemente vorher zu parken.
Beim Wiederherstellen eines Layouts mit versteckten Kacheln (z.B. Timeline)
gingen die DOM-Elemente verloren, was zu null-Referenz-Fehlern fuehrte.
Fixes:
- layout.js: Cards in tile-parking retten bevor Widget entfernt wird
- app.js: Null-Guards in rerenderTimeline und _updateTimelineCount
Stellt das Original-Verhalten wieder her: Der Typ wird aus den
Auto-Discovery-Daten gelesen, nicht aus dem versteckten Select-Element.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Das readonly Input zeigt dem Nutzer den erkannten Quellentyp (RSS-Feed,
Web-Quelle, Telegram) nach der Auto-Erkennung an. Der hidden Select
dient weiterhin als Datenspeicher für saveSource().
Telegram-Pfad setzt jetzt ebenfalls src-type-display.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
discoverSource() und editSource() referenzierten ein nicht existierendes
DOM-Element src-type-display, was beim Hinzufügen/Bearbeiten von Quellen
den Fehler "Cannot set properties of null (setting value)" auslöste.
src-type-select wird bereits korrekt mit Null-Check gesetzt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4 feste Farbstufen (primary/secondary/tertiary/mentioned) mit
variablen Labels pro Lage, die von Haiku generiert werden.
- DB: category_labels Spalte in incidents, alte Kategorien migriert
(target->primary, response/retaliation->secondary, actor->tertiary)
- Geoparsing: generate_category_labels() + neuer Prompt mit neuen Keys
- QC: Kategorieprüfung auf neue Keys umgestellt
- Orchestrator: Tuple-Rückgabe + Labels in DB speichern
- API: category_labels im Locations- und Lagebild-Response
- Frontend: Dynamische Legende aus API-Labels mit Fallback-Defaults
- Migrationsskript für bestehende Lagen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
- 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>
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>
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>
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>
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>