import { autocompleteClasses, Box, BoxProps, Modal, ModalProps, useTheme } from "@mui/material"; import React, { MutableRefObject, ReactNode, useEffect, useState } from "react"; import { AutocompleteClientComponent, IAutocompleteClientComponentProps } from "."; import { ModalBoxStyledComponent } from "../modal/modalBox"; export enum AutocompleteClientExtOptionType { newItem, item, } export interface IAutocompleteClientExtOption { id: string, type: AutocompleteClientExtOptionType, data: T | undefined, } export type AutocompleteClientComponentExtProps = { addOption?: { el?: ReactNode, closeRef?: MutableRefObject<(() => void) | null | undefined>, dialogProps?: { modalProps?: Omit, wrapperProps?: BoxProps, } } } & IAutocompleteClientComponentProps, MaxDepth> export const AutocompleteClientComponentExt = (props: AutocompleteClientComponentExtProps) => { const { addOption, onGetData, getOptionKey, isOptionEqualToValue, renderOption, updateOptionsRef: updateDataRef, ...rest } = props const theme = useTheme() const [_anchorEl, setAnchorEl] = React.useState(null); const [openPreviewModal, setOpenPreviewModal] = useState(false); // EXPORTED METHOD... useEffect(() => { if (addOption?.closeRef) addOption.closeRef.current = _closeDialog }, []) const _closeDialog = () => { setOpenPreviewModal(false) setAnchorEl(null) } // ...EXPORTED METHOD return <> { setOpenPreviewModal(false) setAnchorEl(null) }} style={{ padding: 20, ...addOption?.dialogProps?.modalProps?.style, }} > {addOption?.el} , MaxDepth> {...rest} onGetData={async (filter: string, key: boolean) => { const userOptions = await onGetData?.(filter, key) const result = userOptions ?? [] if (addOption) { result.unshift({ id: '##new', type: AutocompleteClientExtOptionType.newItem, data: undefined, } as IAutocompleteClientExtOption) } return result }} getOptionKey={getOptionKey ?? ((option: string | IAutocompleteClientExtOption) => (option as IAutocompleteClientExtOption).id)} isOptionEqualToValue={isOptionEqualToValue ?? ((option: IAutocompleteClientExtOption, value: string | IAutocompleteClientExtOption) => { return option.id == (value as IAutocompleteClientExtOption).id })} renderOption={renderOption ?? ((props, option, state, ownerState) => { const { key, ...optionProps } = props; const { selected } = state; if (option.type == AutocompleteClientExtOptionType.newItem) { return ( { setAnchorEl(null) setOpenPreviewModal(true) }} > {''} ); } return ( {ownerState.getOptionLabel(option)} ); })} /> }