""" FILE: app/frontend/ui_callbacks.py DESCRIPTION: Event-Handler für UI-Interaktionen. Implementiert den Übergang vom Graphen zum Editor (State Transfer). VERSION: 2.6.0 STATUS: Active DEPENDENCIES: streamlit, os, ui_utils LAST_ANALYSIS: 2025-12-15 """ import streamlit as st import os from ui_utils import build_markdown_doc def switch_to_editor_callback(note_payload): """ Callback für den 'Bearbeiten'-Button im Graphen. Versucht, die Datei direkt aus dem Vault (Dateisystem) zu lesen. Das garantiert, dass Frontmatter und Inhalt vollständig sind (Single Source of Truth). """ # 1. Pfad ermitteln (Priorität auf 'path' aus Qdrant) origin_fname = note_payload.get('path') # Fallback für Legacy-Datenfelder if not origin_fname: origin_fname = note_payload.get('file_path') or note_payload.get('filename') content = "" file_loaded = False # 2. Versuch: Direkt von der Festplatte lesen # Wir prüfen, ob der Pfad existiert und lesen den aktuellen Stand der Datei. if origin_fname and os.path.exists(origin_fname): try: with open(origin_fname, "r", encoding="utf-8") as f: content = f.read() file_loaded = True except Exception as e: # Fehler im Terminal loggen, aber UI nicht crashen lassen print(f"Fehler beim Lesen von {origin_fname}: {e}") # 3. Fallback: Inhalt aus Qdrant nehmen (wenn Datei nicht zugreifbar) if not file_loaded: # Wir nehmen 'fulltext' aus dem Payload content = note_payload.get('fulltext', '') if not content: # Letzter Ausweg: Metadaten nehmen und Dummy-Content bauen content = build_markdown_doc(note_payload, "Inhalt konnte nicht geladen werden (Datei nicht gefunden).") else: # Check: Hat der Text ein Frontmatter? Wenn nein, rekonstruieren wir es. if not content.strip().startswith("---"): content = build_markdown_doc(note_payload, content) # Notfall-Pfad Konstruktion (falls gar kein Pfad im System ist) if not origin_fname and 'note_id' in note_payload: origin_fname = f"{note_payload['note_id']}.md" # 4. Daten an den Editor übergeben # Wir nutzen den Chat-Verlauf als Transportmittel für den State st.session_state.messages.append({ "role": "assistant", "intent": "INTERVIEW", "content": content, "query_id": f"edit_{note_payload.get('note_id', 'unknown')}", # Trigger für den Editor "origin_filename": origin_fname, "origin_note_id": note_payload.get('note_id') }) # 5. Modus umschalten (wechselt den Tab beim nächsten Rerun) st.session_state["sidebar_mode_selection"] = "📝 Manueller Editor"