import FormControl, { FormControlProps } from '@mui/material/FormControl'; import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import cloneDeep from 'lodash/cloneDeep'; import React, { ReactNode } from 'react'; import { FieldProps, connectField, filterDOMProps, joinName, useField } from 'uniforms'; export type ListAddFieldProps = FieldProps< unknown, IconButtonProps, { fullWidth?: FormControlProps['fullWidth']; icon?: ReactNode; initialCount?: number; margin?: FormControlProps['margin']; variant?: FormControlProps['variant']; } >; function ListAdd({ disabled, fullWidth = true, icon = '+', initialCount, margin = 'dense', name, readOnly, value, variant, ...props }: ListAddFieldProps) { const nameParts = joinName(null, name); const parentName = joinName(nameParts.slice(0, -1)); const parent = useField< { initialCount?: number; maxCount?: number }, unknown[] >(parentName, { initialCount }, { absoluteName: true })[0]; const limitNotReached = !disabled && !(parent.maxCount! <= parent.value!.length); return ( { if (!readOnly) { parent.onChange(parent.value!.concat([cloneDeep(value)])); } }} > {icon} ); } export default connectField(ListAdd, { initialValue: false, kind: 'leaf' });