import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, Icon, Image, Text, Tooltip, } from "@prismicio/editor-ui"; import { FieldType } from "@prismicio/types-internal/lib/customtypes"; import { ReactNode } from "react"; import { Field, FieldVariant, groupField, nestableFields, uidField, } from "@/domain/fields"; export type AddFieldDropdownProps = { disabled?: boolean; onSelectField: (fieldType: FieldType | FieldVariant) => void; fields: Field[]; open?: boolean; onOpenChange?: (open: boolean) => void; } & ( | { trigger: ReactNode; triggerDataTestId?: never } | { trigger?: never; triggerDataTestId: string } ); export function AddFieldDropdown(props: AddFieldDropdownProps) { const { open, onOpenChange, disabled = false, onSelectField, fields, triggerDataTestId = "add-field", trigger, } = props; const singleFieldsToRender = fields.filter( (field) => nestableFields.some( (nestableField) => nestableField.name === field.name, ) || field.name === uidField.name, ); const groupFieldToRender = fields.find( (field) => field.name === groupField.name, ); return ( {trigger ?? ( )} Single fields {singleFieldsToRender.map((field) => ( ))} {groupFieldToRender && ( <> Set of fields { } )} ); } interface AddFieldDropdownItemProps { onSelectField: AddFieldDropdownProps["onSelectField"]; field: Field; } function AddFieldDropdownItem(props: AddFieldDropdownItemProps) { const { field, onSelectField } = props; const { type, variant, name, icon, description, thumbnail } = field; return ( } description={description} onSelect={() => onSelectField(variant ?? type)} renderTooltip={(trigger) => ( How it will look for content editors. } align="start" side="left" sideOffset={4} animation="none" > {trigger} )} > {name} ); }