"use client"; import type { CatalogueCategory, PoTerm } from "@/lib/terms"; /** * Dynamic PO Terms & Conditions editor (issue #11). A list of rows, each a * category + a clause; "+ Add term" appends a row. Both fields are comboboxes * (native ) so you can pick a catalogued category/clause or type a * new one-off value. Controlled by the parent form, which serialises `value` * into the submitted FormData (`termsJson`). */ export function PoTermsEditor({ value, onChange, catalogue, accent = "neutral", }: { value: PoTerm[]; onChange: (v: PoTerm[]) => void; catalogue: CatalogueCategory[]; // The manager-edit form uses an amber theme; everything else neutral. accent?: "neutral" | "amber"; }) { const input = accent === "amber" ? "w-full rounded-lg border border-amber-300 bg-amber-50 px-3 py-2 text-sm focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-400/30" : "w-full rounded-lg border border-neutral-300 px-3 py-2.5 text-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500/20"; function update(i: number, patch: Partial) { onChange(value.map((row, idx) => (idx === i ? { ...row, ...patch } : row))); } function remove(i: number) { onChange(value.filter((_, idx) => idx !== i)); } function add() { onChange([...value, { category: "", text: "" }]); } const clausesFor = (categoryName: string) => catalogue.find((c) => c.name.toLowerCase() === categoryName.trim().toLowerCase())?.clauses ?? []; return (
{/* Shared category suggestions */} {catalogue.map((c) => ( {value.length === 0 && (

No terms added. Use “+ Add term” below.

)} {value.map((row, i) => (
update(i, { category: e.target.value })} placeholder="Category" autoComplete="off" className={`${input} sm:w-56`} /> update(i, { text: e.target.value })} placeholder="Type a clause or pick one…" autoComplete="off" className={input} /> {clausesFor(row.category).map((c) => (
))}
); }