diff --git a/docs/issues/issue-51-prompt-page-assignment.md b/docs/issues/issue-51-prompt-page-assignment.md new file mode 100644 index 0000000..4fc7c72 --- /dev/null +++ b/docs/issues/issue-51-prompt-page-assignment.md @@ -0,0 +1,425 @@ +# 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: +