diff --git a/frontend/src/pages/AdminPromptsPage.jsx b/frontend/src/pages/AdminPromptsPage.jsx index 2defd60..67cb553 100644 --- a/frontend/src/pages/AdminPromptsPage.jsx +++ b/frontend/src/pages/AdminPromptsPage.jsx @@ -1,4 +1,5 @@ import { useState, useEffect } from 'react' +import { useNavigate } from 'react-router-dom' import { api } from '../utils/api' import UnifiedPromptModal from '../components/UnifiedPromptModal' import { Star, Trash2, Edit, Copy, Filter, ArrowDownToLine } from 'lucide-react' @@ -9,9 +10,10 @@ import { Star, Trash2, Edit, Copy, Filter, ArrowDownToLine } from 'lucide-react' * Manages both base and pipeline-type prompts in one interface. */ export default function AdminPromptsPage() { + const navigate = useNavigate() const [prompts, setPrompts] = useState([]) const [filteredPrompts, setFilteredPrompts] = useState([]) - const [typeFilter, setTypeFilter] = useState('all') // 'all' | 'base' | 'pipeline' + const [typeFilter, setTypeFilter] = useState('all') // 'all' | 'base' | 'pipeline' | 'workflow' const [category, setCategory] = useState('all') const [loading, setLoading] = useState(true) const [error, setError] = useState(null) @@ -44,6 +46,8 @@ export default function AdminPromptsPage() { filtered = filtered.filter(p => p.type === 'base') } else if (typeFilter === 'pipeline') { filtered = filtered.filter(p => p.type === 'pipeline') + } else if (typeFilter === 'workflow') { + filtered = filtered.filter(p => p.type === 'workflow') } // Filter by category @@ -256,6 +260,13 @@ export default function AdminPromptsPage() { > + Neuer Prompt + @@ -329,6 +340,13 @@ export default function AdminPromptsPage() { > Pipelines ({prompts.filter(p => p.type === 'pipeline' || !p.type).length}) +
{ + async function loadPrompts() { + try { + const prompts = await api.listAdminPrompts() + // Filter nur type='base' Prompts + const basisPrompts = prompts.filter(p => p.type === 'base') + setAvailablePrompts(basisPrompts) + } catch (e) { + console.error('Failed to load prompts:', e) + } + } + loadPrompts() + }, []) // Load workflow wenn ID vorhanden useEffect(() => { @@ -237,10 +253,17 @@ export default function WorkflowEditorPage() { Neu - {currentPrompt && (
{error && ( -
+
❌ {error} + {validationErrors.length > 0 && ( +
+ Tipp: Behebe die Validierungsfehler unten, um speichern zu können. +
+ )}
)} @@ -316,21 +344,86 @@ export default function WorkflowEditorPage() { {/* Config Panel */} {selectedNode && (
-

{selectedNode.data.label}

+
+

Node-Konfiguration

+ +
{/* Basis-Konfiguration */}
- + handleNodeUpdate(selectedNode.id, { label: e.target.value })} + placeholder="z.B. Gewichtsanalyse" + style={{ + width: '100%', + padding: '8px', + borderRadius: '4px', + border: '1px solid var(--border)', + background: 'var(--surface)', + color: 'var(--text1)', + fontSize: '14px' + }} /> +
+ Änderungen werden automatisch übernommen +
{/* Type-spezifische Konfiguration */} {selectedNode.type === 'analysis' && ( <> +
+ + + {selectedNode.data.prompt_name && ( +
+ Gewählt: {selectedNode.data.prompt_name} +
+ )} +
+