'use client' import React, { useState, useEffect, useCallback } from 'react' import { API, ManagementReview } from '../_types' import { EmptyState, LoadingSpinner, StatusBadge } from './shared' // ============================================================================= // TAB: MANAGEMENT REVIEWS // ============================================================================= export function ReviewsTab() { const [reviews, setReviews] = useState([]) const [loading, setLoading] = useState(true) const [showCreate, setShowCreate] = useState(false) const load = useCallback(async () => { setLoading(true) try { const res = await fetch(`${API}/management-reviews`) if (res.ok) { const data = await res.json() setReviews(data.reviews || []) } } catch { /* ignore */ } setLoading(false) }, []) useEffect(() => { load() }, [load]) const createReview = async (form: Record) => { try { const res = await fetch(`${API}/management-reviews?created_by=admin`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }) if (res.ok) { setShowCreate(false); load() } } catch { /* ignore */ } } const approveReview = async (reviewId: string) => { const nextYear = new Date() nextYear.setFullYear(nextYear.getFullYear() + 1) try { await fetch(`${API}/management-reviews/${reviewId}/approve`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ approved_by: 'admin', next_review_date: nextYear.toISOString().split('T')[0], }), }) load() } catch { /* ignore */ } } if (loading) return return (

{reviews.length} Management-Reviews

{reviews.length === 0 ? ( setShowCreate(true)} /> ) : (
{reviews.map(r => (
{r.review_id} {r.title}
Datum: {new Date(r.review_date).toLocaleDateString('de-DE')} Zeitraum: {new Date(r.review_period_start).toLocaleDateString('de-DE')} - {new Date(r.review_period_end).toLocaleDateString('de-DE')} Vorsitz: {r.chairperson} {r.next_review_date && Naechste Review: {new Date(r.next_review_date).toLocaleDateString('de-DE')}}
{r.status === 'draft' && ( )}
))}
)} {showCreate && ( setShowCreate(false)} onSave={createReview} /> )}
) } function ReviewCreateModal({ onClose, onSave }: { onClose: () => void; onSave: (data: Record) => void }) { const today = new Date().toISOString().split('T')[0] const [form, setForm] = useState({ title: '', review_date: today, review_period_start: '', review_period_end: today, chairperson: '', attendees: [] as Record[], }) return (

Neue Management-Review

setForm({ ...form, title: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" placeholder="Q1 2026 Management Review" />
setForm({ ...form, review_date: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" />
setForm({ ...form, review_period_start: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" />
setForm({ ...form, review_period_end: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" />
setForm({ ...form, chairperson: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" />
) }