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