"use client"; // Der FPT-Assistent -- das Herzstück der Anwendung. // // Er ersetzt die frühere Karte «Nächste Schritte». Der Unterschied ist nicht kosmetisch: Die // alte Karte leitete AB, was zu tun wäre, und liess einen damit allein. Hier führt jeder // Schritt sein eigenes Werkzeug mit sich -- und davor eine Seite, die erklärt, worum es // überhaupt geht. // // Zwei Gestaltungsentscheide, die zusammengehören: // // 1. Der Haken ist MANUELL. Das Tool masst sich nicht an zu wissen, wann jemand mit einem // Schritt fertig ist -- «genug geplant» ist eine Einschätzung, keine Messgrösse. // 2. Daneben steht der ABGELEITETE Stand («0 Lebensphasen»). Ein abgehakter Schritt ohne // Substanz fällt so auf, ohne dass das Tool den Haken verweigert. // // Erledigte Schritte rutschen nach unten und werden blass -- oben steht immer das, was als // Nächstes ansteht. import { useState } from "react"; import { Check, ChevronRight, Lock, Sparkles } from "lucide-react"; import { api } from "@/lib/api-client"; import { ASSISTANT_STEPS, stepBlockedReason, stepStatus, type AssistantProgress } from "@/lib/assistant"; import type { PlanInput } from "@/lib/types"; export function Assistant({ plan, progress, onOpenStep, onChanged, }: { plan: PlanInput; progress: AssistantProgress; onOpenStep: (index: number) => void; onChanged: () => void; }) { const [busy, setBusy] = useState(null); const done = progress.filter(Boolean).length; const allDone = done === ASSISTANT_STEPS.length; async function toggle(index: number, next: boolean) { setBusy(index); try { await api.post(`/api/scenarios/${plan.id}/assistant`, { step: index, done: next }); onChanged(); } finally { setBusy(null); } } // Offene zuerst, erledigte darunter -- die Reihenfolge innerhalb der Gruppen bleibt. const ordered = [...ASSISTANT_STEPS].sort((a, b) => { const da = progress[a.index] ? 1 : 0; const db = progress[b.index] ? 1 : 0; return da - db || a.index - b.index; }); return (
FPT-Assistent {done} / {ASSISTANT_STEPS.length}
{ordered.map((step) => { const isDone = progress[step.index] === true; const blocked = stepBlockedReason(plan, step.index); const status = stepStatus(plan, step.index); return (
); })}
{allDone && (

Alle Schritte erledigt. Dein Plan steht – verfeinere ihn jederzeit über die Matrix.

)}
); }