From 228010a6d3de77771dedb9b5fd2cfbd4c3486914 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 9 Apr 2026 15:52:19 +0200 Subject: [PATCH] feat: Part 3 - End Node Template Editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Neue Features:** - End Node Output Mode: AUTO vs. TEMPLATE - Jinja2 Template Editor mit Syntax-Beispiel - Placeholder Picker Modal (dynamische Node-Liste) - Template Serialisierung/Deserialisierung **Komponenten (NEU):** 1. EndNodeConfig.jsx (~150 Zeilen) - Output Mode Toggle (AUTO/TEMPLATE) - Template Textarea (monospace, 12 Zeilen) - Placeholder-Button (öffnet Picker) - Help-Text mit Beispiel-Syntax - Auto-Insert Default Template beim Wechsel zu TEMPLATE 2. PlaceholderPicker.jsx (~260 Zeilen) - Modal mit Suchfunktion - Dynamische Placeholder-Liste aus Workflow-Nodes - Kategorien: Global, Node Outputs, Signals - Click-to-Insert (schließt Modal automatisch) - Icons pro Node-Typ (🚀🤖⚡🔀🏁) **Integration:** - WorkflowEditorPage.jsx - EndNodeConfig im Config Panel (wenn type='end') - PlaceholderPicker State + Modal - handlePlaceholderSelect (fügt in Template ein) **Serialisierung:** - workflowSerializer.js - Serialize: output_mode + template für End Nodes - Deserialize: output_mode + template laden - Fallback: auto Mode wenn nicht gesetzt **Backend Status:** - ✅ Backend bereits fertig (execute_end_node() in workflow_executor.py) - ✅ Beide Modi (AUTO/TEMPLATE) funktionieren - ✅ Jinja2 Template Rendering implementiert **Part 3 Status:** Frontend Complete - ✅ End Node Config UI - ✅ Template Editor - ✅ Placeholder Picker - ⏸️ Testing ausstehend **Nächster Schritt:** Browser-Test auf dev.mitai.jinkendo.de Version: v0.9p Date: 2026-04-09 Co-Authored-By: Claude Opus 4.6 --- backend/version.py | 2 +- .../workflow/panels/EndNodeConfig.jsx | 162 +++++++++++ .../workflow/panels/PlaceholderPicker.jsx | 265 ++++++++++++++++++ frontend/src/pages/WorkflowEditorPage.jsx | 29 ++ frontend/src/utils/workflowSerializer.js | 10 + 5 files changed, 467 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/workflow/panels/EndNodeConfig.jsx create mode 100644 frontend/src/components/workflow/panels/PlaceholderPicker.jsx diff --git a/backend/version.py b/backend/version.py index 14cd65c..d29eab6 100644 --- a/backend/version.py +++ b/backend/version.py @@ -7,7 +7,7 @@ Semantic Versioning: MAJOR.MINOR.PATCH - PATCH: Bugfix, kleine Änderung, Refactor """ -APP_VERSION = "0.9o" +APP_VERSION = "0.9p" BUILD_DATE = "2026-04-09" DB_SCHEMA_VERSION = "20260406e" # Migration 041 diff --git a/frontend/src/components/workflow/panels/EndNodeConfig.jsx b/frontend/src/components/workflow/panels/EndNodeConfig.jsx new file mode 100644 index 0000000..fcaedf6 --- /dev/null +++ b/frontend/src/components/workflow/panels/EndNodeConfig.jsx @@ -0,0 +1,162 @@ +/** + * EndNodeConfig - Konfiguration für End Nodes + * + * Props: + * - node: React Flow Node object (type='end') + * - onChange: (nodeId, updates) => void + * - onOpenPlaceholderPicker: () => void (optional, für späteren Placeholder Picker) + * + * Features: + * - Output Mode: AUTO (concatenate all analyses) vs. TEMPLATE (custom Jinja2 template) + * - Template Editor (Textarea für Jinja2 syntax) + */ +export function EndNodeConfig({ node, onChange, onOpenPlaceholderPicker }) { + const outputMode = node.data.output_mode || 'auto' + const template = node.data.template || '' + + const handleModeChange = (e) => { + const newMode = e.target.value + onChange(node.id, { output_mode: newMode }) + + // Wenn zu TEMPLATE gewechselt wird und kein Template vorhanden, Beispiel einfügen + if (newMode === 'template' && !template) { + onChange(node.id, { + output_mode: newMode, + template: '# Finale Analyse\n\n{{ analysis_core }}\n\n---\nGeneriert mit Workflow Engine' + }) + } + } + + const handleTemplateChange = (e) => { + onChange(node.id, { template: e.target.value }) + } + + return ( +
+

End Node Konfiguration

+ + + + +
+ {outputMode === 'auto' && ( + <> + AUTO-Modus: Alle analysis_core Werte werden automatisch + zusammengefasst (backward compatible). + + )} + {outputMode === 'template' && ( + <> + TEMPLATE-Modus: Verwende Jinja2-Syntax für eigenes Output-Format. + Verfügbare Variablen: Alle Node-IDs und deren Outputs. + + )} +
+ + {outputMode === 'template' && ( + <> + +