# Feature: Prompt-Zuordnung zu Verlaufsseiten **Labels:** feature, ux, enhancement **Priority:** Medium (Phase 1-2) **Related:** Issue #28 (Unified Prompt System - Complete) ## Beschreibung KI-Prompts sollen flexibel auf verschiedenen Verlaufsseiten verfΓΌgbar gemacht werden kΓΆnnen. Jeder Prompt kann auf mehreren Seiten gleichzeitig angeboten werden (Mehrfachauswahl). ## Problem (aktueller Stand) **Aktuell:** - Prompts sind nur ΓΌber die zentrale Analyse-Seite (π Analyse) verfΓΌgbar - Kein kontextbezogener Zugriff auf relevante Analysen - User muss immer zur Analyse-Seite navigieren **Beispiel-Szenario:** ``` User ist auf: Gewicht β Verlauf Will: Gewichtstrend analysieren Muss: Zur Analyse-Seite β Prompt auswΓ€hlen β ZurΓΌck ``` **WΓΌnschenswert:** ``` User ist auf: Gewicht β Verlauf Sieht: "π€ KI-Analyse" Button mit relevanten Prompts Kann: Direkt "Gewichtstrend-Analyse" starten ``` ## GewΓΌnschtes Verhalten ### 1. Prompt-Konfiguration erweitern **Admin β KI-Prompts β Prompt bearbeiten:** ``` βββββββββββββββββββββββββββββββββββββββββββββββ β Prompt bearbeiten: Gewichtstrend-Analyse β βββββββββββββββββββββββββββββββββββββββββββββββ€ β Name: Gewichtstrend-Analyse β β Slug: weight_trend β β Type: Pipeline β β β β π VerfΓΌgbar auf Seiten: β β βββββββββββββββββββββββββββββββββββββββββββ β β β β Analyse (Hauptseite) β β β β β Gewicht β Verlauf β β β β β UmfΓ€nge β Verlauf β β β β β Caliper β Verlauf β β β β β AktivitΓ€t β Verlauf β β β β β ErnΓ€hrung β Verlauf β β β β β Schlaf β Verlauf β β β β β Vitalwerte β Verlauf β β β β β Dashboard β β β βββββββββββββββββββββββββββββββββββββββββββ β β β β [Speichern] [Abbrechen] β βββββββββββββββββββββββββββββββββββββββββββββββ ``` **Mehrfachauswahl:** - Ein Prompt kann auf mehreren Seiten gleichzeitig verfΓΌgbar sein - Mindestens eine Seite muss ausgewΓ€hlt sein - Default: "Analyse (Hauptseite)" ist immer vorausgewΓ€hlt ### 2. UI auf Verlaufsseiten **Gewicht β Verlauf:** ``` βββββββββββββββββββββββββββββββββββββββββββββββ β π Gewicht - Verlauf β β [Filter: 7d] [30d] [90d] [Alle] β βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β [Chart: Gewichtsverlauf] β β β βββββββββββββββββββββββββββββββββββββββββββββββ€ β π€ KI-Analysen β β βββββββββββββββββββββββββββββββββββββββββββ β β β Gewichtstrend-Analyse [βΆ Starten]β β β β KΓΆrperkomposition-Check [βΆ Starten]β β β βββββββββββββββββββββββββββββββββββββββββββ β β β β [EintrΓ€ge-Tabelle...] β βββββββββββββββββββββββββββββββββββββββββββββββ ``` **Features:** - Kompaktes Widget unterhalb des Charts - Nur relevante Prompts werden angezeigt - Button startet Analyse inline (Modal oder expandierend) - Ergebnis wird direkt auf der Seite angezeigt ### 3. Inline-Analyse Anzeige **Option A: Modal (empfohlen fΓΌr MVP):** ``` Click auf [βΆ Starten] β βββββββββββββββββββββββββββββββββββββββββββββββ β β Gewichtstrend-Analyse β βββββββββββββββββββββββββββββββββββββββββββββββ€ β [Spinner] Analysiere Gewichtsdaten... β β β β [Nach Abschluss:] β β Analyse-Text... β β β β π Verwendete Werte (12) [π¬ Experten] β β [Value Table...] β β β β [SchlieΓen] [In Verlauf speichern] β βββββββββββββββββββββββββββββββββββββββββββββββ ``` **Option B: Expandierend (spΓ€ter):** ``` Click auf [βΆ Starten] β Widget expandiert nach unten Zeigt Analyse-Ergebnis inline [β³ Einklappen] Button ``` ## Technische Umsetzung ### 1. Datenbankschema erweitern **Tabelle: `ai_prompts`** ```sql ALTER TABLE ai_prompts ADD COLUMN available_on JSONB DEFAULT '["analysis"]'; COMMENT ON COLUMN ai_prompts.available_on IS 'Array of page slugs where prompt is available. Values: analysis, weight_history, circ_history, caliper_history, activity_history, nutrition_history, sleep_history, vitals_history, dashboard'; -- Migration 022 ``` **Beispiel-Werte:** ```json { "slug": "weight_trend", "name": "Gewichtstrend-Analyse", "available_on": ["analysis", "weight_history"] } { "slug": "pipeline_master", "name": "VollstΓ€ndige Analyse", "available_on": ["analysis", "dashboard"] } { "slug": "nutrition_check", "name": "ErnΓ€hrungs-Check", "available_on": ["analysis", "nutrition_history", "activity_history"] } ``` ### 2. Backend API erweitern **Neuer Endpoint: GET /api/prompts/for-page/{page_slug}** ```python @router.get("/for-page/{page_slug}") def get_prompts_for_page(page_slug: str, session: dict = Depends(require_auth)): """Get all prompts available for a specific page. Args: page_slug: Page identifier (e.g., 'weight_history', 'analysis') Returns: List of prompts with available_on containing page_slug """ with get_db() as conn: cur = get_cursor(conn) cur.execute( """SELECT id, name, slug, type, description, available_on FROM ai_prompts WHERE available_on @> %s ORDER BY name""", (json.dumps([page_slug]),) ) return [r2d(row) for row in cur.fetchall()] ``` **Beispiel-Aufruf:** ```javascript // In WeightPage.jsx const prompts = await api.getPromptsForPage('weight_history') // Returns: [{slug: 'weight_trend', name: 'Gewichtstrend-Analyse', ...}] ``` **Prompt CRUD erweitern:** ```python @router.put("/unified/{id}") def update_unified_prompt(id: str, p: UnifiedPromptCreate, session=Depends(require_admin)): # ... existing code ... cur.execute( """UPDATE ai_prompts SET name=%s, slug=%s, template=%s, ..., available_on=%s WHERE id=%s""", (..., json.dumps(p.available_on), id) ) ``` ### 3. Frontend: Prompt-Editor erweitern **UnifiedPromptModal.jsx:** ```javascript const PAGE_OPTIONS = [ { value: 'analysis', label: 'π Analyse (Hauptseite)', default: true }, { value: 'weight_history', label: 'βοΈ Gewicht β Verlauf' }, { value: 'circ_history', label: 'π UmfΓ€nge β Verlauf' }, { value: 'caliper_history', label: 'π Caliper β Verlauf' }, { value: 'activity_history', label: 'π AktivitΓ€t β Verlauf' }, { value: 'nutrition_history', label: 'π ErnΓ€hrung β Verlauf' }, { value: 'sleep_history', label: 'π΄ Schlaf β Verlauf' }, { value: 'vitals_history', label: 'β€οΈ Vitalwerte β Verlauf' }, { value: 'dashboard', label: 'π Dashboard' }, ] // In form: