import { IconButton } from '@/components/@extended'; import { LabeledInput, LabeledInputProps } from '@/components/ra-inputs/LabeledInput'; import { SearchInput } from '@/components/ra-inputs/SearchInput'; import { useDialogState } from '@/hooks'; import { AddCircleRounded } from '@mui/icons-material'; import { Stack } from '@mui/material'; import _ from 'lodash'; import { FilterPayload, Identifier, useInput } from 'ra-core'; import { ReactElement, useCallback, useMemo } from 'react'; import { EntityField, EntityLookupDialog, RecordRepresentationType } from './common'; type ReferenceLookupInputProps = { filter?: FilterPayload; filterDefaultValues?: object; filters?: ReactElement | ReactElement[]; recordRepresentation?: RecordRepresentationType; reference: string; } & LabeledInputProps; function ReferenceLookupInput(props: ReferenceLookupInputProps): JSX.Element { const { children, filter: propFilter, filterDefaultValues, filters: propFilters, recordRepresentation, reference, source } = props; const { field } = useInput({ source }); const { value, onChange } = field ?? {}; const hasValue = !_.isEmpty(value); const { open, handleOpen, handleClose } = useDialogState(false); const filter = useMemo( () => !_.isEmpty(value) ? _.chain(propFilter ?? {}) .clone() .extend({ id__ne: value }) .value() : propFilter, [propFilter, value] ); const filters = useMemo( () => propFilters ?? [], [propFilters] ); const onAdd = useCallback( (ids: Identifier[]) => { const id = _.first(ids); handleClose(); onChange(id); return id; }, [onChange, handleClose] ); const onDelete = useCallback(() => onChange(null), [onChange]); return ( {hasValue ? ( ) : null} {!hasValue && ( )} {children} ); } export { ReferenceLookupInput }; export type { ReferenceLookupInputProps };