'use client' import React, { useState, useEffect, useCallback, useRef } from 'react' import { useParams } from 'next/navigation' interface OrderData { client: { company: string; contact: string; email: string; phone: string; address: string } order: { number: string; received_date: string; description: string; scope: string[] } offer: { date: string; number: string; amount: string; status: string; accepted_date: string } notes: string } const EMPTY: OrderData = { client: { company: '', contact: '', email: '', phone: '', address: '' }, order: { number: '', received_date: '', description: '', scope: [] }, offer: { date: '', number: '', amount: '', status: 'offen', accepted_date: '' }, notes: '', } const SCOPE_OPTIONS = [ 'Risikobeurteilung', 'Normenrecherche', 'Betriebsanleitung', 'CE-Kennzeichnung', 'Schulung', ] const STATUS_OPTIONS = [ { value: 'offen', label: 'Offen' }, { value: 'angenommen', label: 'Angenommen' }, { value: 'abgelehnt', label: 'Abgelehnt' }, { value: 'storniert', label: 'Storniert' }, ] const STATUS_COLORS: Record = { offen: 'bg-gray-100 text-gray-700', angenommen: 'bg-green-100 text-green-700', abgelehnt: 'bg-red-100 text-red-700', storniert: 'bg-gray-100 text-gray-500', } export default function OrderPage() { const params = useParams() const projectId = params.projectId as string const [data, setData] = useState(EMPTY) const [loading, setLoading] = useState(true) const [saveState, setSaveState] = useState<'idle' | 'saving' | 'saved'>('idle') const timerRef = useRef | null>(null) const existingMetaRef = useRef>({}) useEffect(() => { fetch(`/api/sdk/v1/iace/projects/${projectId}`) .then((r) => r.ok ? r.json() : null) .then((json) => { if (!json) return const proj = json.project || json const meta = proj.metadata || {} existingMetaRef.current = meta if (meta.order_data) setData({ ...EMPTY, ...meta.order_data }) }) .catch(() => {}) .finally(() => setLoading(false)) }, [projectId]) const save = useCallback(async (next: OrderData) => { setSaveState('saving') try { const merged = { ...existingMetaRef.current, order_data: next } await fetch(`/api/sdk/v1/iace/projects/${projectId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ metadata: merged }), }) existingMetaRef.current = merged setSaveState('saved') setTimeout(() => setSaveState('idle'), 2000) } catch { setSaveState('idle') } }, [projectId]) const update = useCallback((next: OrderData) => { setData(next) if (timerRef.current) clearTimeout(timerRef.current) timerRef.current = setTimeout(() => save(next), 800) }, [save]) const setClient = (k: keyof OrderData['client'], v: string) => update({ ...data, client: { ...data.client, [k]: v } }) const setOrder = (k: keyof OrderData['order'], v: string) => update({ ...data, order: { ...data.order, [k]: v } }) const setOffer = (k: keyof OrderData['offer'], v: string) => update({ ...data, offer: { ...data.offer, [k]: v } }) const toggleScope = (s: string) => { const cur = data.order.scope const next = cur.includes(s) ? cur.filter((x) => x !== s) : [...cur, s] update({ ...data, order: { ...data.order, scope: next } }) } if (loading) { return (
) } return (
{/* Header */}

Auftrag

Auftraggeber und Auftragsdaten erfassen

{saveState === 'saving' ? 'Speichert...' : 'Gespeichert'}
{/* Auftraggeber */}
setClient('company', v)} /> setClient('contact', v)} /> setClient('email', v)} /> setClient('phone', v)} />