From b779c2f2a8a9cf71096fce1144508dcf77258eba Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 9 Apr 2026 16:04:39 +0200 Subject: [PATCH] fix: Part 3 - PlaceholderPicker enhancements (4 critical fixes) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **User Feedback Issues Fixed:** 1. **Registrierte Platzhalter fehlten** ❌ → ✅ - PlaceholderPicker lädt jetzt ~120+ Platzhalter vom Backend - Endpoint: GET /api/prompts/placeholders (get_placeholder_catalog) - Kategorisiert nach: Profil, Körper, Ernährung, Training, etc. - Icons pro Kategorie (👤 💪 🍎 🏃 😴 ❤️ 🎯) 2. **Node-Namen nicht sichtbar** ❌ → ✅ - Vorher: "{{ node_2.analysis_core }}" - Jetzt: "Körper-Analyse (node_2) - Hauptausgabe" - Node-Label wird in Beschreibung angezeigt 3. **Cursor-Position ignoriert** ❌ → ✅ - Platzhalter werden jetzt an Cursor-Position eingefügt - textareaRef von WorkflowEditorPage an EndNodeConfig übergeben - textarea.selectionStart/End für exakte Position - Cursor wird nach Einfügen an korrekte Stelle gesetzt - Focus zurück auf Textarea 4. **Fragen-Kontext unklar** ⚠️ → ✅ - Signal-Platzhalter zeigen jetzt Frage-Text - Format: "Körper-Analyse - Signal: Ist Gewichtstrend positiv?" - Frage wird auf 50 Zeichen gekürzt wenn zu lang **Komponenten-Änderungen:** PlaceholderPicker.jsx: - useEffect zum Laden von Backend-Platzhaltern - Gruppierung nach Kategorien (System + Workflow) - System-Platzhalter: ~120+ aus placeholder_registrations - Workflow-Platzhalter: Node Outputs + Signals - Bessere Beschreibungen mit Node-Label - Stats-Anzeige: "X Platzhalter gefunden (Y Workflow, Z System)" - Loading State während Backend-Call EndNodeConfig.jsx: - useRef für Textarea - textareaRef Prop (optional, Fallback zu lokalem ref) - ref an Textarea gebunden WorkflowEditorPage.jsx: - useRef Hook importiert - endNodeTextareaRef erstellt - handlePlaceholderSelect umgebaut: - Liest selectionStart vom Textarea - Fügt an Cursor-Position ein (before + placeholder + after) - Setzt Cursor nach Platzhalter - Fokussiert Textarea wieder - Fallback: Am Ende einfügen wenn ref nicht verfügbar - textareaRef an EndNodeConfig übergeben **UX-Verbesserungen:** - Suchfunktion durchsucht jetzt auch Kategorie-Namen - Sticky Category Headers beim Scrollen - Example-Werte in Beschreibung (wenn vorhanden) - AutoFocus auf Suchfeld beim Öffnen - Gruppiert: Workflow-Outputs immer oben, dann System-Platzhalter **Testing Required:** - [ ] End Node öffnen → Template Mode → Platzhalter-Button klicken - [ ] Prüfen: ~120+ Platzhalter sichtbar (nicht nur 2-3 Workflow-Outputs) - [ ] Prüfen: Node-Namen in Beschreibungen ("Körper-Analyse (node_2)") - [ ] Cursor an beliebige Stelle setzen → Platzhalter einfügen - [ ] Prüfen: Einfügen an Cursor-Position (nicht am Ende) Part 3 Bugfixes - User Feedback Complete Co-Authored-By: Claude Opus 4.6 --- .../workflow/panels/EndNodeConfig.jsx | 10 +- .../workflow/panels/PlaceholderPicker.jsx | 285 +++++++++++++----- frontend/src/pages/WorkflowEditorPage.jsx | 27 +- 3 files changed, 236 insertions(+), 86 deletions(-) diff --git a/frontend/src/components/workflow/panels/EndNodeConfig.jsx b/frontend/src/components/workflow/panels/EndNodeConfig.jsx index fcaedf6..7a596f2 100644 --- a/frontend/src/components/workflow/panels/EndNodeConfig.jsx +++ b/frontend/src/components/workflow/panels/EndNodeConfig.jsx @@ -1,3 +1,5 @@ +import { useRef } from 'react' + /** * EndNodeConfig - Konfiguration für End Nodes * @@ -5,12 +7,17 @@ * - node: React Flow Node object (type='end') * - onChange: (nodeId, updates) => void * - onOpenPlaceholderPicker: () => void (optional, für späteren Placeholder Picker) + * - textareaRef: React ref für Textarea (für Cursor-Position beim Einfügen) * * Features: * - Output Mode: AUTO (concatenate all analyses) vs. TEMPLATE (custom Jinja2 template) * - Template Editor (Textarea für Jinja2 syntax) + * - Cursor-Positionserhaltung beim Platzhalter-Einfügen */ -export function EndNodeConfig({ node, onChange, onOpenPlaceholderPicker }) { +export function EndNodeConfig({ node, onChange, onOpenPlaceholderPicker, textareaRef }) { + const localTextareaRef = useRef(null) + const activeRef = textareaRef || localTextareaRef + const outputMode = node.data.output_mode || 'auto' const template = node.data.template || '' @@ -99,6 +106,7 @@ export function EndNodeConfig({ node, onChange, onOpenPlaceholderPicker }) { )}