Skip to content

Commit bcdb591

Browse files
Samuel ShresthaSamuel Shrestha
authored andcommitted
review request changes
1 parent 650bcd0 commit bcdb591

3 files changed

Lines changed: 54 additions & 22 deletions

File tree

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/BOMTableWrapper.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import { useToast } from '../../../../hooks/toasts.hooks';
1111
import { useAssignMaterialToAssembly, useDeleteAssembly, useDeleteMaterial } from '../../../../hooks/bom.hooks';
1212
import LoadingIndicator from '../../../../components/LoadingIndicator';
1313
import EditMaterialModal from './MaterialForm/EditMaterialModal';
14-
import { Button, Link, Typography } from '@mui/material';
14+
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
15+
import { Button, Link, Tooltip, Typography } from '@mui/material';
1516
import { bomBaseColDef } from '../../../../utils/bom.utils';
1617
import NERModal from '../../../../components/NERModal';
1718
import { renderStatusBOM } from './BOMTableCustomCells';
@@ -300,7 +301,20 @@ const BOMTableWrapper: React.FC<BOMTableWrapperProps> = ({
300301
type: 'string',
301302
sortable: false,
302303
filterable: false,
303-
hide: hideColumn[3]
304+
hide: hideColumn[3],
305+
renderCell: (params) => {
306+
const material = materials.find((m) => m.materialId === params.row.materialId);
307+
return (
308+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
309+
<Typography variant="body2">{params.value}</Typography>
310+
{material?.isCopied && (
311+
<Tooltip title="Copied from another BOM">
312+
<ContentCopyIcon sx={{ fontSize: 14, color: 'warning.main' }} />
313+
</Tooltip>
314+
)}
315+
</Box>
316+
);
317+
}
304318
},
305319
{
306320
...bomBaseColDef,

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,10 @@ const MaterialFormView: React.FC<MaterialFormViewProps> = ({
547547
</Box>
548548
</Grid>
549549
)}
550-
<SelectMaterialToCopyModal
551-
open={copyModalOpen}
552-
onHide={() => setCopyModalOpen(false)}
553-
onSelect={handleCopySelect}
550+
<SelectMaterialToCopyModal
551+
open={copyModalOpen}
552+
onHide={() => setCopyModalOpen(false)}
553+
onSelect={handleCopySelect}
554554
assemblies={assemblies ?? []}
555555
/>
556556
</NERFormModal>

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/SelectMaterialToCopyModal.tsx

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React, { useEffect, useMemo, useState } from 'react';
2-
import { Autocomplete, Box, CircularProgress, Stack, TextField, Typography } from '@mui/material';
2+
import { Autocomplete, Box, CircularProgress, InputAdornment, Stack, TextField, Typography } from '@mui/material';
33
import { useForm } from 'react-hook-form';
44
import { useQuery } from 'react-query';
5-
import { Car, Material, ProjectPreview, WbsNumber } from 'shared';
5+
import { Assembly, Car, Material, ProjectPreview, WbsNumber } from 'shared';
66

77
import NERFormModal from '../../../../../components/NERFormModal';
88
import NERAutocomplete from '../../../../../components/NERAutocomplete';
99

1010
import { useGetAllCars } from '../../../../../hooks/cars.hooks';
1111
import { useAllProjects } from '../../../../../hooks/projects.hooks';
1212
import { getMaterialsForWbsElement } from '../../../../../apis/bom.api';
13+
import SearchIcon from '@mui/icons-material/Search';
1314

1415
type AutocompleteOption = { label: string; id: string };
1516

@@ -22,12 +23,13 @@ interface SelectMaterialToCopyModalProps {
2223
open: boolean;
2324
onHide: () => void;
2425
onSelect: (material: Material) => void;
26+
assemblies: Assembly[];
2527
}
2628

2729
type FormValues = Record<string, never>;
2830

2931
const carToOption = (car: Car): AutocompleteOption => ({
30-
label: String(car.wbsNum.carNumber),
32+
label: `Car ${car.wbsNum.carNumber} - ${car.name}`,
3133
id: car.wbsElementId
3234
});
3335

@@ -36,18 +38,6 @@ const projectToOption = (project: ProjectPreview): AutocompleteOption => ({
3638
id: project.wbsElementId
3739
});
3840

39-
const materialToOption = (material: Material): AutocompleteOption => ({
40-
label: [
41-
material.name,
42-
material.manufacturerName,
43-
material.materialTypeName,
44-
material.assemblyId ? `Assembly: ${material.assemblyId}` : undefined
45-
]
46-
.filter(Boolean)
47-
.join(' – '),
48-
id: material.materialId
49-
});
50-
5141
const searchResultToOption = ({ material, project }: SearchResult): AutocompleteOption => ({
5242
label: `${material.name}${project.wbsNum.carNumber}.${project.wbsNum.projectNumber} - ${project.name}`,
5343
id: material.materialId
@@ -64,7 +54,7 @@ const getLatestCar = (cars: Car[]): Car | null => {
6454
return [...cars].sort((a, b) => b.wbsNum.carNumber - a.wbsNum.carNumber)[0];
6555
};
6656

67-
const SelectMaterialToCopyModal: React.FC<SelectMaterialToCopyModalProps> = ({ open, onHide, onSelect }) => {
57+
const SelectMaterialToCopyModal: React.FC<SelectMaterialToCopyModalProps> = ({ open, onHide, onSelect, assemblies }) => {
6858
const { reset, handleSubmit } = useForm<FormValues>();
6959

7060
const [selectedCar, setSelectedCar] = useState<Car | null>(null);
@@ -93,6 +83,23 @@ const SelectMaterialToCopyModal: React.FC<SelectMaterialToCopyModalProps> = ({ o
9383
return projectToProjectWbs(selectedProject);
9484
}, [selectedProject]);
9585

86+
const assemblyNameById = useMemo(
87+
() => new Map(assemblies.map((assembly) => [assembly.assemblyId, assembly.name])),
88+
[assemblies]
89+
);
90+
91+
const materialToOption = (material: Material): AutocompleteOption => ({
92+
label: [
93+
material.name,
94+
material.manufacturerName,
95+
material.materialTypeName,
96+
material.assemblyId ? `Assembly: ${assemblyNameById.get(material.assemblyId) ?? material.assemblyId}` : undefined
97+
]
98+
.filter(Boolean)
99+
.join(' – '),
100+
id: material.materialId
101+
});
102+
96103
const projectMaterialsQuery = useQuery<Material[], Error>(
97104
['materials', 'project', selectedProject?.wbsElementId ?? 'none'],
98105
async () => {
@@ -263,6 +270,17 @@ const SelectMaterialToCopyModal: React.FC<SelectMaterialToCopyModalProps> = ({ o
263270
{...params}
264271
placeholder={selectedCar ? 'Search materials by name…' : 'Select a car first'}
265272
fullWidth
273+
InputProps={{
274+
...params.InputProps,
275+
startAdornment: (
276+
<>
277+
<InputAdornment position="start">
278+
<SearchIcon />
279+
</InputAdornment>
280+
{params.InputProps.startAdornment}
281+
</>
282+
)
283+
}}
266284
/>
267285
)}
268286
/>

0 commit comments

Comments
 (0)