import { useEffect, useMemo, useState } from "react"; import { Button } from "@govoplan/core-webui"; import { Dialog } from "@govoplan/core-webui"; import { DismissibleAlert, i18nMessage } 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 = "i18n:govoplan-campaign.no_undefined_placeholders_detected.1cbdf41b", 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 = "i18n:govoplan-campaign.remove_placeholder.3f575c72", localFields = [], globalFields = [], onCancel, onRemove, onReplace, onAddField, addDisabled = false }: {field: UndefinedPlaceholder | null;contextLabel?: string;removeLabel?: string;localFields?: TemplateFieldOption[];globalFields?: TemplateFieldOption[];onCancel: () => void;onRemove: (field: UndefinedPlaceholder) => void;onReplace?: (field: UndefinedPlaceholder, namespace: TemplateNamespace, name: string) => void;onAddField: (field: UndefinedPlaceholder) => void;addDisabled?: boolean;}) { const replacementOptions = useMemo( () => [ ...localFields.map((item) => ({ namespace: "local" as const, ...item })), ...globalFields.map((item) => ({ namespace: "global" as const, ...item }))], [globalFields, localFields] ); const [replacement, setReplacement] = useState(""); const firstReplacement = replacementOptions[0]; const effectiveReplacement = replacement || (firstReplacement ? `${firstReplacement.namespace}:${firstReplacement.name}` : ""); useEffect(() => { setReplacement(firstReplacement ? `${firstReplacement.namespace}:${firstReplacement.name}` : ""); }, [field?.raw, firstReplacement?.namespace, firstReplacement?.name]); function replaceWithSelected() { if (!field || !onReplace || !effectiveReplacement) return; const separator = effectiveReplacement.indexOf(":"); if (separator < 0) return; const namespace = effectiveReplacement.slice(0, separator) as TemplateNamespace; const name = effectiveReplacement.slice(separator + 1); onReplace(field, namespace, name); } return ( {onReplace && replacementOptions.length > 0 && } : undefined}> {field && <>

i18n:govoplan-campaign.the.93ef0dd8 {contextLabel} uses {i18nMessage("i18n:govoplan-campaign.value.91317e63", { value0: field.raw })}i18n:govoplan-campaign.but_it_cannot_be_matched_to_a_known_field.e75c4dde

{field.reason === "invalid-namespace" && i18n:govoplan-campaign.use_the_namespace.a4c2669d global: or local:. } {field.reason === "missing-field" &&

i18n:govoplan-campaign.you_can_add.66093419 {field.name} i18n:govoplan-campaign.as_a_campaign_field_remove_this_placeholder_or_c.6bf2dea8

} {onReplace && replacementOptions.length > 0 && } }
); }