import { Checkbox, checkboxClasses, FormControl, FormControlLabel, FormGroup, InputLabel, inputLabelClasses, MenuItem, OutlinedInput, outlinedInputClasses, Select, selectClasses, styled, } from '@mui/material'; import { Sync as SyncIcon, SyncDisabled as SyncDisabledIcon, } from '@mui/icons-material'; import { v4 as uuidv4 } from 'uuid'; import { BLACK, BLUE, BORDER_RADIUS, GREY, RED, TEXT, UNSELECTED, } from '../../lib/consts/DEFAULT_THEME'; import { UPLOAD_FILE_TYPES_ARRAY } from '../../lib/consts/UPLOAD_FILE_TYPES'; type FileInfoProps = Pick & Partial> & { isReadonly?: boolean; onChange?: FileInfoChangeHandler; }; const FILE_INFO_DEFAULT_PROPS: Partial = { isReadonly: undefined, onChange: undefined, }; const StyledInputLabel = styled(InputLabel)({ color: GREY, [`&.${inputLabelClasses.focused}`]: { backgroundColor: GREY, borderRadius: BORDER_RADIUS, color: BLACK, padding: '.1em .6em', }, }); const StyledOutlinedInput = styled(OutlinedInput)({ color: GREY, [`& .${outlinedInputClasses.notchedOutline}`]: { borderColor: UNSELECTED, }, '&:hover': { [`& .${outlinedInputClasses.notchedOutline}`]: { borderColor: GREY, }, }, [`&.${outlinedInputClasses.focused}`]: { color: TEXT, [`& .${outlinedInputClasses.notchedOutline}`]: { borderColor: GREY, '& legend': { paddingRight: '1.2em', }, }, }, }); const StyledSelect = styled(Select)({ [`& .${selectClasses.icon}`]: { color: GREY, }, }); const FileLocationActiveCheckbox = styled(Checkbox)({ color: RED, [`&.${checkboxClasses.checked}`]: { color: BLUE, }, }); const FileInfo = ( { fileName, fileType, fileLocations, isReadonly, onChange, }: FileInfoProps = FILE_INFO_DEFAULT_PROPS as FileInfoProps, ): JSX.Element => { const idExtension = uuidv4(); const fileNameElementId = `file-name-${idExtension}`; const fileNameElementLabel = 'File name'; const fileTypeElementId = `file-type-${idExtension}`; const fileTypeElementLabel = 'File type'; return ( :not(:first-child)': { marginTop: '1em' } }}> {fileNameElementLabel} onChange?.call(null, { fileName: value }) } /> {fileType && ( {fileTypeElementLabel} } onChange={({ target: { value } }) => onChange?.call(null, { fileType: value as FileType }) } > {UPLOAD_FILE_TYPES_ARRAY.map( ([fileTypeKey, [, fileTypeDisplayString]]) => { return ( {fileTypeDisplayString} ); }, )} )} {fileLocations.map( ( { anvilName, anvilDescription, anvilUUID, isFileLocationActive }, fileLocationIndex, ) => ( } defaultChecked={isFileLocationActive} disabled={isReadonly} icon={} onChange={({ target: { checked } }) => onChange?.call( null, { isFileLocationActive: checked }, { fileLocationIndex }, ) } /> } key={anvilUUID} label={`${anvilName}: ${anvilDescription}`} sx={{ color: TEXT }} value={`${anvilUUID}-sync`} /> ), )} ); }; FileInfo.defaultProps = FILE_INFO_DEFAULT_PROPS; export default FileInfo;