import { Checkbox, checkboxClasses, FormControl, FormControlLabel, FormGroup, Grid, styled, } from '@mui/material'; import { Sync as SyncIcon, SyncDisabled as SyncDisabledIcon, } from '@mui/icons-material'; import { ReactElement, useMemo } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { BLUE, RED, TEXT } from '../../lib/consts/DEFAULT_THEME'; import { UPLOAD_FILE_TYPES_ARRAY } from '../../lib/consts/UPLOAD_FILE_TYPES'; import List from '../List'; import MenuItem from '../MenuItem'; import OutlinedInput from '../OutlinedInput'; import OutlinedInputLabel from '../OutlinedInputLabel'; import { ExpandablePanel, InnerPanelBody } from '../Panels'; import Select from '../Select'; type FileInfoProps = Pick & Partial> & { isReadonly?: boolean; onChange?: FileInfoChangeHandler; }; const FILE_INFO_DEFAULT_PROPS: Partial = { isReadonly: undefined, onChange: undefined, }; 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'; const anFileLocations = useMemo( () => fileLocations.reduce< Record< string, Pick & { flocs: FileLocation[]; } > >((previous, fileLocation) => { const { anvilDescription, anvilName, anvilUUID } = fileLocation; if (!previous[anvilUUID]) { previous[anvilUUID] = { anvilDescription, anvilName, anvilUUID, flocs: [], }; } previous[anvilUUID].flocs.push(fileLocation); return previous; }, {}), [fileLocations], ); return ( :not(:first-child)': { marginTop: '1em' } }}> {fileNameElementLabel} { onChange?.call(null, { fileName: value === fileName ? undefined : value, }); }} /> {fileType && ( {fileTypeElementLabel} )} ( {flocs.map( ({ fileLocationUUID: flocUUID, hostName, hostUUID, isFileLocationActive, }) => ( } defaultChecked={isFileLocationActive} disabled={isReadonly} edge="start" icon={} onChange={({ target: { checked } }) => { onChange?.call( null, { isFileLocationActive: checked === isFileLocationActive ? undefined : checked, }, { fileLocationIndex: fileLocations.findIndex( ({ fileLocationUUID }) => flocUUID === fileLocationUUID, ), }, ); }} /> } label={hostName} sx={{ color: TEXT }} value={`${hostUUID}-sync`} /> ), )} )} /> ); }; FileInfo.defaultProps = FILE_INFO_DEFAULT_PROPS; export default FileInfo;