fix(striker-ui): correct, organize file location checkboxes

main
Tsu-ba-me 1 year ago
parent f7350bef9f
commit 22f85171c7
  1. 25
      striker-ui/components/Files/FileEditForm.tsx
  2. 125
      striker-ui/components/Files/FileInfo.tsx
  3. 2
      striker-ui/types/FileLocation.d.ts

@ -195,23 +195,22 @@ const FileEditForm = (
`${API_BASE_URL}/file/${fileOverview.fileUUID}`,
);
fileToEdit.fileLocations = data.map(
([
,
,
,
,
,
fileLocationUUID,
fileLocationActive,
anvilUUID,
anvilName,
anvilDescription,
]) => ({
fileToEdit.fileLocations = data.map<FileLocation>(
({
5: fileLocationUUID,
6: fileLocationActive,
7: anvilUUID,
8: anvilName,
9: anvilDescription,
10: hostUUID,
11: hostName,
}) => ({
anvilDescription,
anvilName,
anvilUUID,
fileLocationUUID,
hostName,
hostUUID,
isFileLocationActive: parseInt(fileLocationActive, 10) === 1,
}),
);

@ -4,20 +4,24 @@ import {
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<FileDetailMetadata, 'fileName' | 'fileLocations'> &
@ -56,6 +60,34 @@ const FileInfo = (
const fileTypeElementId = `file-type-${idExtension}`;
const fileTypeElementLabel = 'File type';
const anFileLocations = useMemo(
() =>
fileLocations.reduce<
Record<
string,
Pick<FileLocation, 'anvilDescription' | 'anvilName' | 'anvilUUID'> & {
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 (
<FormGroup sx={{ '> :not(:first-child)': { marginTop: '1em' } }}>
<FormControl>
@ -100,37 +132,68 @@ const FileInfo = (
</Select>
</FormControl>
)}
{fileLocations.map(
(
{ anvilName, anvilDescription, anvilUUID, isFileLocationActive },
fileLocationIndex,
) => (
<FormControlLabel
control={
<FileLocationActiveCheckbox
checkedIcon={<SyncIcon />}
defaultChecked={isFileLocationActive}
disabled={isReadonly}
icon={<SyncDisabledIcon />}
onChange={({ target: { checked } }) => {
onChange?.call(
null,
{
isFileLocationActive:
checked === isFileLocationActive ? undefined : checked,
},
{ fileLocationIndex },
);
}}
/>
}
key={anvilUUID}
label={`${anvilName}: ${anvilDescription}`}
sx={{ color: TEXT }}
value={`${anvilUUID}-sync`}
/>
),
)}
<List
listItems={anFileLocations}
listProps={{ dense: true, disablePadding: true }}
renderListItem={(anvilUUID, { anvilDescription, anvilName, flocs }) => (
<ExpandablePanel
header={`${anvilName}: ${anvilDescription}`}
panelProps={{ padding: 0, width: '100%' }}
>
<InnerPanelBody>
<Grid
columns={{ xs: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
columnSpacing="1em"
container
direction="row"
>
{flocs.map<ReactElement>(
({
fileLocationUUID: flocUUID,
hostName,
hostUUID,
isFileLocationActive,
}) => (
<Grid item key={`floc-${anvilUUID}-${hostUUID}`} xs={1}>
<FormControlLabel
control={
<FileLocationActiveCheckbox
checkedIcon={<SyncIcon />}
defaultChecked={isFileLocationActive}
disabled={isReadonly}
edge="start"
icon={<SyncDisabledIcon />}
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`}
/>
</Grid>
),
)}
</Grid>
</InnerPanelBody>
</ExpandablePanel>
)}
/>
</FormGroup>
);
};

@ -3,5 +3,7 @@ type FileLocation = {
anvilDescription: string;
anvilUUID: string;
fileLocationUUID: string;
hostName: string;
hostUUID: string;
isFileLocationActive: boolean;
};

Loading…
Cancel
Save