"use client"; import type { DocumentTemplate } from "@/lib/types"; import { TEMPLATE_CATEGORY_LABELS } from "@/lib/types"; import { Loader2, Plus } from "lucide-react"; import { useState, useRef } from "react"; const AVAILABLE_VARIABLES = [ { group: "Akte", vars: ["case.number", "case.title", "case.court", "case.court_ref"] }, { group: "Parteien", vars: ["party.claimant.name", "party.defendant.name", "party.claimant.representative", "party.defendant.representative"] }, { group: "Kanzlei", vars: ["tenant.name", "tenant.address"] }, { group: "Benutzer", vars: ["user.name", "user.email"] }, { group: "Datum", vars: ["date.today", "date.today_long"] }, { group: "Frist", vars: ["deadline.title", "deadline.due_date"] }, ]; interface Props { template?: DocumentTemplate; onSave: (data: Partial) => void; isSaving: boolean; } export function TemplateEditor({ template, onSave, isSaving }: Props) { const [name, setName] = useState(template?.name ?? ""); const [description, setDescription] = useState(template?.description ?? ""); const [category, setCategory] = useState(template?.category ?? "schriftsatz"); const [content, setContent] = useState(template?.content ?? ""); const textareaRef = useRef(null); const insertVariable = (variable: string) => { const el = textareaRef.current; if (!el) return; const placeholder = `{{${variable}}}`; const start = el.selectionStart; const end = el.selectionEnd; const newContent = content.substring(0, start) + placeholder + content.substring(end); setContent(newContent); // Restore cursor position after the inserted text requestAnimationFrame(() => { el.focus(); el.selectionStart = el.selectionEnd = start + placeholder.length; }); }; const handleSave = () => { if (!name.trim()) return; onSave({ name: name.trim(), description: description.trim() || undefined, category: category as DocumentTemplate["category"], content, variables: AVAILABLE_VARIABLES.flatMap((g) => g.vars).filter((v) => content.includes(`{{${v}}}`), ), }); }; return (
{/* Metadata */}
setName(e.target.value)} placeholder="z.B. Klageerwiderung" className="w-full rounded-md border border-neutral-200 px-3 py-2 text-sm focus:border-neutral-400 focus:outline-none" />
setDescription(e.target.value)} placeholder="Optionale Beschreibung" className="w-full rounded-md border border-neutral-200 px-3 py-2 text-sm focus:border-neutral-400 focus:outline-none" />
{/* Variable toolbar */}

Variablen einfügen

{AVAILABLE_VARIABLES.map((group) => (
{group.group} {group.vars.map((v) => ( ))}
))}
{/* Content editor */}