'use client' import React, { useState, useEffect, useCallback } from 'react' import { API, SecurityObjective } from '../_types' import { EmptyState, LoadingSpinner, StatusBadge } from './shared' // ============================================================================= // TAB: OBJECTIVES // ============================================================================= export function ObjectivesTab() { const [objectives, setObjectives] = useState([]) const [loading, setLoading] = useState(true) const [showCreate, setShowCreate] = useState(false) const load = useCallback(async () => { setLoading(true) try { const res = await fetch(`${API}/objectives`) if (res.ok) { const data = await res.json() setObjectives(data.objectives || []) } } catch { /* ignore */ } setLoading(false) }, []) useEffect(() => { load() }, [load]) const createObjective = async (form: Record) => { try { const res = await fetch(`${API}/objectives?created_by=admin`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }) if (res.ok) { setShowCreate(false); load() } } catch { /* ignore */ } } if (loading) return const active = objectives.filter(o => o.status === 'active') const achieved = objectives.filter(o => o.status === 'achieved') return (
Aktiv: {active.length} Erreicht: {achieved.length}
{objectives.length === 0 ? ( setShowCreate(true)} /> ) : (
{objectives.map(o => (
{o.objective_id} {o.title}
{o.progress_percentage}%
= 100 ? 'bg-green-500' : 'bg-purple-500'}`} style={{ width: `${Math.min(100, o.progress_percentage)}%` }} />
KPI: {o.kpi_name} — Ziel: {o.kpi_target} {o.kpi_unit} Verantwortlich: {o.owner} Zieldatum: {new Date(o.target_date).toLocaleDateString('de-DE')} Messung: {o.measurement_frequency}
))}
)} {showCreate && ( setShowCreate(false)} onSave={createObjective} /> )}
) } function ObjectiveCreateModal({ onClose, onSave }: { onClose: () => void; onSave: (data: Record) => void }) { const [form, setForm] = useState({ objective_id: '', title: '', description: '', category: 'confidentiality', specific: '', measurable: '', achievable: '', relevant: '', time_bound: '', kpi_name: '', kpi_target: 95, kpi_unit: '%', measurement_frequency: 'monthly', owner: '', target_date: '', related_controls: [] as string[], related_risks: [] as string[], }) return (

Neues Sicherheitsziel (SMART)

setForm({ ...form, objective_id: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" placeholder="OBJ-001" />
setForm({ ...form, title: e.target.value })} className="w-full border rounded-lg px-3 py-2 text-sm" />