11import 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' ;
33import { useForm } from 'react-hook-form' ;
44import { useQuery } from 'react-query' ;
5- import { Car , Material , ProjectPreview , WbsNumber } from 'shared' ;
5+ import { Assembly , Car , Material , ProjectPreview , WbsNumber } from 'shared' ;
66
77import NERFormModal from '../../../../../components/NERFormModal' ;
88import NERAutocomplete from '../../../../../components/NERAutocomplete' ;
99
1010import { useGetAllCars } from '../../../../../hooks/cars.hooks' ;
1111import { useAllProjects } from '../../../../../hooks/projects.hooks' ;
1212import { getMaterialsForWbsElement } from '../../../../../apis/bom.api' ;
13+ import SearchIcon from '@mui/icons-material/Search' ;
1314
1415type 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
2729type FormValues = Record < string , never > ;
2830
2931const 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-
5141const 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