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}
);
}