Skip to content

Commit 78b6dc6

Browse files
committed
refactor: #3884 addressed PR feedback on state management and added placeholder
1 parent 2241c2e commit 78b6dc6

3 files changed

Lines changed: 43 additions & 27 deletions

File tree

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/CopyBOM/CopyBOMModal.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { ProjectPreview, WbsNumber, wbsPipe } from 'shared';
1+
import { WbsNumber, wbsPipe } from 'shared';
22
import CopyBOMView from './CopyBOMView';
33
import { useGetAllCars } from '../../../../../hooks/cars.hooks';
44
import { useAllProjects } from '../../../../../hooks/projects.hooks';
55
import { useCopyMaterialsToProject } from '../../../../../hooks/bom.hooks';
6-
import React, { useState } from 'react';
6+
import React from 'react';
77
import ErrorPage from '../../../../ErrorPage';
88
import LoadingIndicator from '../../../../../components/LoadingIndicator';
99

@@ -14,8 +14,6 @@ export interface CopyBOMModalProps {
1414
}
1515

1616
const CopyBOMModal: React.FC<CopyBOMModalProps> = ({ open, onHide, destinationWbsNum }) => {
17-
const [selectedProject, setSelectedProject] = useState<ProjectPreview | null>(null);
18-
1917
const { data: cars, isLoading: isLoadingCars, isError: carsIsError, error: carsError } = useGetAllCars();
2018
const { data: projects, isLoading: isLoadingProjects, isError: projectsIsError, error: projectsError } = useAllProjects();
2119
const { mutateAsync: copyMaterials } = useCopyMaterialsToProject();
@@ -38,8 +36,6 @@ const CopyBOMModal: React.FC<CopyBOMModalProps> = ({ open, onHide, destinationWb
3836
onHide={onHide}
3937
cars={cars}
4038
projects={projects}
41-
selectedProject={selectedProject}
42-
setSelectedProject={setSelectedProject}
4339
onCopy={handleCopy}
4440
/>
4541
);

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/CopyBOM/CopyBOMProjectSection.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import { Typography } from '@mui/material';
3-
import { DataGrid, GridColDef, GridSelectionModel } from '@mui/x-data-grid';
3+
import { DataGrid, GridColDef } from '@mui/x-data-grid';
44
import { useState } from 'react';
55
import { ProjectPreview } from 'shared';
66
import LoadingIndicator from '../../../../../components/LoadingIndicator';
@@ -20,7 +20,7 @@ const columns: GridColDef[] = [
2020
];
2121

2222
const CopyBOMProjectSection: React.FC<CopyBOMProjectSectionProps> = ({ selectedProject, onSelectionChange }) => {
23-
const [selectionModel, setSelectionModel] = useState<GridSelectionModel>([]);
23+
const [selectedMaterialIds, setSelectedMaterialIds] = useState<string[]>([]);
2424
const {
2525
data: materials,
2626
isLoading: isLoadingMaterials,
@@ -38,7 +38,7 @@ const CopyBOMProjectSection: React.FC<CopyBOMProjectSectionProps> = ({ selectedP
3838
React.useEffect(() => {
3939
if (materials) {
4040
const allIds = materials.map((m) => m.materialId);
41-
setSelectionModel(allIds);
41+
setSelectedMaterialIds(allIds);
4242
onSelectionChange(allIds);
4343
}
4444
}, [materials, onSelectionChange]);
@@ -58,17 +58,18 @@ const CopyBOMProjectSection: React.FC<CopyBOMProjectSectionProps> = ({ selectedP
5858
return (
5959
<>
6060
<Typography sx={{ mb: 1 }} variant="body2">
61-
{selectionModel.length} material{selectionModel.length !== 1 ? 's' : ''} selected
61+
{selectedMaterialIds.length} material{selectedMaterialIds.length !== 1 ? 's' : ''} selected
6262
</Typography>
6363
<DataGrid
6464
rows={rows}
6565
columns={columns}
6666
checkboxSelection
6767
autoHeight
68-
selectionModel={selectionModel}
68+
selectionModel={selectedMaterialIds}
6969
onSelectionModelChange={(newModel) => {
70-
setSelectionModel(newModel);
71-
onSelectionChange(newModel as string[]);
70+
const ids = newModel as string[];
71+
setSelectedMaterialIds(ids);
72+
onSelectionChange(ids);
7273
}}
7374
rowsPerPageOptions={[100]}
7475
hideFooterPagination

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/CopyBOM/CopyBOMView.tsx

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React, { useState } from 'react';
2-
import { Grid } from '@mui/material';
1+
import React, { useRef, useState } from 'react';
2+
import { Box, Grid } from '@mui/material';
33
import { Car, ProjectPreview, wbsPipe } from 'shared';
44
import NERModal from '../../../../../components/NERModal';
55
import NERAutocomplete from '../../../../../components/NERAutocomplete';
@@ -10,8 +10,6 @@ interface CopyBOMViewProps {
1010
onHide: () => void;
1111
cars: Car[];
1212
projects: ProjectPreview[];
13-
selectedProject: ProjectPreview | null;
14-
setSelectedProject: (project: ProjectPreview | null) => void;
1513
onCopy: (materialIds: string[]) => Promise<void>;
1614
}
1715

@@ -20,12 +18,12 @@ const CopyBOMView: React.FC<CopyBOMViewProps> = ({
2018
onHide,
2119
cars,
2220
projects,
23-
selectedProject,
24-
setSelectedProject,
2521
onCopy
2622
}) => {
2723
const [selectedCar, setSelectedCar] = useState<Car | null>(null);
28-
const [selectedMaterialIds, setSelectedMaterialIds] = useState<string[]>([]);
24+
const [selectedProject, setSelectedProject] = useState<ProjectPreview | null>(null);
25+
const [hasSelection, setHasSelection] = useState(false);
26+
const selectedMaterialIdsRef = useRef<string[]>([]);
2927

3028
const carOptions = cars.map((car) => ({
3129
label: `${car.wbsNum.carNumber} - ${car.name}`,
@@ -42,7 +40,7 @@ const CopyBOMView: React.FC<CopyBOMViewProps> = ({
4240
}));
4341

4442
const handleSubmit = async () => {
45-
await onCopy(selectedMaterialIds);
43+
await onCopy(selectedMaterialIdsRef.current);
4644
};
4745

4846
return (
@@ -53,7 +51,7 @@ const CopyBOMView: React.FC<CopyBOMViewProps> = ({
5351
submitText="Copy BOM"
5452
cancelText="Cancel"
5553
onSubmit={handleSubmit}
56-
disabled={selectedMaterialIds.length === 0}
54+
disabled={!hasSelection}
5755
showCloseButton
5856
paperProps={{ minWidth: '700px' }}
5957
>
@@ -96,11 +94,32 @@ const CopyBOMView: React.FC<CopyBOMViewProps> = ({
9694
/>
9795
</Grid>
9896

99-
{selectedProject && (
100-
<Grid item xs={12}>
101-
<CopyBOMProjectSection selectedProject={selectedProject} onSelectionChange={setSelectedMaterialIds} />
102-
</Grid>
103-
)}
97+
<Grid item xs={12}>
98+
{selectedProject ? (
99+
<CopyBOMProjectSection
100+
selectedProject={selectedProject}
101+
onSelectionChange={(ids) => {
102+
selectedMaterialIdsRef.current = ids;
103+
setHasSelection(ids.length > 0);
104+
}}
105+
/>
106+
) : (
107+
<Box
108+
sx={{
109+
height: '300px',
110+
border: '1px dashed',
111+
borderColor: 'grey.400',
112+
borderRadius: '4px',
113+
display: 'flex',
114+
alignItems: 'center',
115+
justifyContent: 'center',
116+
color: 'grey.500'
117+
}}
118+
>
119+
Select a project to view its materials
120+
</Box>
121+
)}
122+
</Grid>
104123
</Grid>
105124
</NERModal>
106125
);

0 commit comments

Comments
 (0)