import { Button } from "@repo/shadcn-ui/components/button"; import type { ReactNode } from "react"; import { useFieldPickerController } from "../hooks/use-field-picker-controller"; import type { FieldPickerSelection } from "./field-picker-list"; import { FormActions, FormBody, FormDialog } from "./form-dialog"; /** Selección provisional y alta opcional compartidas, independientes de catálogos y endpoints. */ export function FieldPickerDialog(props: { items: readonly { id: string }[]; canAdd: (ids: readonly string[]) => boolean; onConfirm: (ids: readonly string[]) => boolean; onClose: () => void; labels: { title: string; cancel: string; help: string; destination: string; selected: (count: number) => string; limit: string; invalid: string; create: string; confirm: string; }; renderList: (selection: FieldPickerSelection) => ReactNode; quickCreate?: | { disabled?: boolean | undefined; render: (callbacks: { onOpenChange: (open: boolean) => void; onSaved: (id: string) => void; }) => ReactNode; } | undefined; }) { const c = useFieldPickerController({ fields: props.items, canAdd: props.canAdd, onConfirm: props.onConfirm, onClose: props.onClose, }); return ( { if (!open) { props.onClose(); } }} open title={props.labels.title} wide >

{props.labels.help}

{props.labels.destination}

{props.renderList({ disabled: c.disabled, onToggle: c.toggle, selectedIds: c.selectedIds })}

{props.labels.selected(c.selectedIds.length)}

{props.items.some((field) => !c.selectedIds.includes(field.id) && c.disabled(field.id)) && (

{props.labels.limit}

)} {!c.canConfirm && c.selectedIds.length > 0 && (

{props.labels.invalid}

)}
c.setCreatingField(true)} type="button" variant="outline" > {props.labels.create} ) } > {props.quickCreate && c.creatingField && props.quickCreate.render({ onOpenChange: c.setCreatingField, onSaved: c.selectCreated })}
); }