import { Button } from "@govoplan/core-webui"; import { Dialog } from "@govoplan/core-webui"; import { DismissibleAlert } from "@govoplan/core-webui"; import type { TemplateNamespace, TemplatePlaceholder, UndefinedPlaceholder } from "../utils/templatePlaceholders"; export type TemplateFieldOption = { name: string; label: string; }; export function TemplateFieldChipList({ namespace, fields, usedPlaceholders = [], empty, disabled = false, onInsert }: { namespace: TemplateNamespace; fields: TemplateFieldOption[]; usedPlaceholders?: TemplatePlaceholder[]; empty: string; disabled?: boolean; onInsert: (namespace: TemplateNamespace, name: string) => void; }) { if (fields.length === 0) return

{empty}

; return (
{fields.map((field) => { const used = usedPlaceholders.some((placeholder) => placeholder.validNamespace && placeholder.namespace === namespace && placeholder.name === field.name); return ( ); })}
); } export function UndefinedPlaceholderList({ items, empty = "No undefined placeholders detected.", onSelect }: { items: UndefinedPlaceholder[]; empty?: string; onSelect: (item: UndefinedPlaceholder) => void; }) { if (items.length === 0) return

{empty}

; return (
{items.map((item) => ( ))}
); } export function UndefinedPlaceholderDecisionDialog({ field, contextLabel = "template", removeLabel = "Remove placeholder", onCancel, onRemove, onAddField, addDisabled = false }: { field: UndefinedPlaceholder | null; contextLabel?: string; removeLabel?: string; onCancel: () => void; onRemove: (field: UndefinedPlaceholder) => void; onAddField: (field: UndefinedPlaceholder) => void; addDisabled?: boolean; }) { return ( ) : undefined} > {field && ( <>

The {contextLabel} uses {`{{${field.raw}}}`}, but it cannot be matched to a known field.

{field.reason === "invalid-namespace" && ( Use the namespace global: or local:. )} {field.reason === "missing-field" && (

You can add {field.name} as a campaign field, remove this placeholder, or continue editing.

)} )}
); }