import { useState, useEffect } from 'react' import { api } from '../utils/api' import PromptEditModal from '../components/PromptEditModal' import PipelineConfigModal from '../components/PipelineConfigModal' import { Star, Trash2, Edit, Copy } from 'lucide-react' export default function AdminPromptsPage() { const [activeTab, setActiveTab] = useState('prompts') // 'prompts' | 'pipelines' // Prompts state const [prompts, setPrompts] = useState([]) const [filteredPrompts, setFilteredPrompts] = useState([]) const [category, setCategory] = useState('all') const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [editingPrompt, setEditingPrompt] = useState(null) const [showNewPrompt, setShowNewPrompt] = useState(false) // Pipeline configs state const [pipelineConfigs, setPipelineConfigs] = useState([]) const [pipelineLoading, setPipelineLoading] = useState(false) const [editingPipeline, setEditingPipeline] = useState(null) const [showNewPipeline, setShowNewPipeline] = useState(false) const categories = [ { id: 'all', label: 'Alle Kategorien' }, { id: 'körper', label: 'Körper' }, { id: 'ernährung', label: 'Ernährung' }, { id: 'training', label: 'Training' }, { id: 'schlaf', label: 'Schlaf' }, { id: 'vitalwerte', label: 'Vitalwerte' }, { id: 'ziele', label: 'Ziele' }, { id: 'ganzheitlich', label: 'Ganzheitlich' } ] useEffect(() => { loadPrompts() loadPipelineConfigs() }, []) useEffect(() => { if (category === 'all') { setFilteredPrompts(prompts) } else { setFilteredPrompts(prompts.filter(p => p.category === category)) } }, [category, prompts]) const loadPrompts = async () => { try { setLoading(true) const data = await api.listAdminPrompts() setPrompts(data) setError(null) } catch (e) { setError(e.message) } finally { setLoading(false) } } const handleToggleActive = async (prompt) => { try { await api.updatePrompt(prompt.id, { active: !prompt.active }) await loadPrompts() } catch (e) { alert('Fehler: ' + e.message) } } const handleDelete = async (prompt) => { if (!confirm(`Prompt "${prompt.name}" wirklich löschen?`)) return try { await api.deletePrompt(prompt.id) await loadPrompts() } catch (e) { alert('Fehler: ' + e.message) } } const handleDuplicate = async (prompt) => { try { await api.duplicatePrompt(prompt.id) await loadPrompts() } catch (e) { alert('Fehler: ' + e.message) } } const handleMoveUp = async (prompt) => { const idx = filteredPrompts.findIndex(p => p.id === prompt.id) if (idx === 0) return // Already at top const above = filteredPrompts[idx - 1] const newOrder = filteredPrompts.map(p => p.id) newOrder[idx] = above.id newOrder[idx - 1] = prompt.id try { await api.reorderPrompts(newOrder) await loadPrompts() } catch (e) { alert('Fehler: ' + e.message) } } const handleMoveDown = async (prompt) => { const idx = filteredPrompts.findIndex(p => p.id === prompt.id) if (idx === filteredPrompts.length - 1) return // Already at bottom const below = filteredPrompts[idx + 1] const newOrder = filteredPrompts.map(p => p.id) newOrder[idx] = below.id newOrder[idx + 1] = prompt.id try { await api.reorderPrompts(newOrder) await loadPrompts() } catch (e) { alert('Fehler: ' + e.message) } } const handleSavePrompt = async () => { await loadPrompts() setEditingPrompt(null) setShowNewPrompt(false) } // Pipeline Config handlers const loadPipelineConfigs = async () => { try { setPipelineLoading(true) const data = await api.listPipelineConfigs() setPipelineConfigs(data) } catch (e) { setError(e.message) } finally { setPipelineLoading(false) } } const handleDeletePipeline = async (config) => { if (!confirm(`Pipeline-Config "${config.name}" wirklich löschen?`)) return try { await api.deletePipelineConfig(config.id) await loadPipelineConfigs() } catch (e) { alert('Fehler: ' + e.message) } } const handleSetDefaultPipeline = async (config) => { try { await api.setDefaultPipelineConfig(config.id) await loadPipelineConfigs() } catch (e) { alert('Fehler: ' + e.message) } } const handleSavePipeline = async () => { await loadPipelineConfigs() setEditingPipeline(null) setShowNewPipeline(false) } if (loading) { return (
| Titel | Kategorie | Aktiv | Reihenfolge | Aktionen |
|---|---|---|---|---|
|
{prompt.name}
{prompt.description && (
{prompt.description}
)}
{prompt.slug}
|
{prompt.category || 'ganzheitlich'} | handleToggleActive(prompt)} style={{cursor:'pointer'}} /> |
|
|
| Name | Module | Stages | Status | Aktionen |
|---|---|---|---|---|
|
{config.name}
{config.is_default && (
Standard
)}
{config.description && (
{config.description}
)}
|
{activeModules.map(([name]) => name).join(', ')}
{activeModules.length} Module
|
S1: {config.stage1_prompts?.length || 0} Prompts
S2: {config.stage2_prompt ? '✓' : '-'} | S3: {config.stage3_prompt ? '✓' : '-'}
|
{config.active ? 'Aktiv' : 'Inaktiv'} |
{!config.is_default && (
)}
|