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
-
{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
+ setSelectedNode(null)}
+ style={{
+ background: 'none',
+ border: 'none',
+ fontSize: 24,
+ cursor: 'pointer',
+ color: 'var(--text3)',
+ padding: 4,
+ lineHeight: 1
+ }}
+ title="Schließen"
+ >
+ ×
+
+
{/* 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}
+
+ )}
+
+
>