Skip to content

Commit 511a388

Browse files
committed
Rebased all changes from other branch
1 parent e13c2d7 commit 511a388

5 files changed

Lines changed: 82 additions & 75 deletions

File tree

src/frontend/src/components/ChangeRequestDropdown.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Box, FormControl, FormLabel, MenuItem, Select, SelectChangeEvent } from '@mui/material';
1+
import { Box, FormControl, FormHelperText, FormLabel, MenuItem, Select, SelectChangeEvent } from '@mui/material';
22
import { isWithinInterval, subDays } from 'date-fns';
3-
import { Control, Controller } from 'react-hook-form';
3+
import { Control, Controller, FieldErrors } from 'react-hook-form';
44
import { AuthenticatedUser, ChangeRequest, wbsPipe } from 'shared';
55
import { useAllChangeRequests } from '../hooks/change-requests.hooks';
66
import { useCurrentUser } from '../hooks/users.hooks';
@@ -12,7 +12,7 @@ const getFilteredChangeRequests = (changeRequests: ChangeRequest[], user: Authen
1212
const fiveDaysAgo = subDays(today, 5);
1313

1414
const filteredRequests = changeRequests.filter(
15-
(cr) => cr.dateReviewed && cr.accepted && isWithinInterval(cr.dateReviewed, { start: fiveDaysAgo, end: today })
15+
(cr) => cr.dateImplemented && cr.accepted && isWithinInterval(cr.dateImplemented, { start: fiveDaysAgo, end: today })
1616
);
1717

1818
// The current user's CRs should be at the top
@@ -33,9 +33,11 @@ const getFilteredChangeRequests = (changeRequests: ChangeRequest[], user: Authen
3333
interface ChangeRequestDropdownProps {
3434
control: Control<any, any>;
3535
name: string;
36+
errors: FieldErrors<ChangeRequest>;
37+
changeHeight?: number;
3638
}
3739

38-
const ChangeRequestDropdown = ({ control, name }: ChangeRequestDropdownProps) => {
40+
const ChangeRequestDropdown = ({ control, name, errors, changeHeight = 1 }: ChangeRequestDropdownProps) => {
3941
const user = useCurrentUser();
4042
const { isLoading, data: changeRequests } = useAllChangeRequests();
4143
if (isLoading || !changeRequests) return <LoadingIndicator />;
@@ -48,8 +50,8 @@ const ChangeRequestDropdown = ({ control, name }: ChangeRequestDropdownProps) =>
4850
}));
4951

5052
return (
51-
<Box sx={{ display: 'flex', justifyContent: 'end' }}>
52-
<FormControl>
53+
<Box>
54+
<FormControl fullWidth>
5355
<FormLabel sx={{ alignSelf: 'start' }}>Change Request ID</FormLabel>
5456
<Controller
5557
control={control}
@@ -63,7 +65,8 @@ const ChangeRequestDropdown = ({ control, name }: ChangeRequestDropdownProps) =>
6365
onChange={(event: SelectChangeEvent<number>) => onChange(event.target.value)}
6466
size={'small'}
6567
placeholder={'Change Request Id'}
66-
sx={{ width: 200, textAlign: 'left' }}
68+
sx={{ textAlign: 'left', height: changeHeight }}
69+
error={!!errors.crId}
6770
MenuProps={{
6871
anchorOrigin: {
6972
vertical: 'bottom',
@@ -83,6 +86,7 @@ const ChangeRequestDropdown = ({ control, name }: ChangeRequestDropdownProps) =>
8386
</Select>
8487
)}
8588
/>
89+
<FormHelperText error>{errors.crId?.message}</FormHelperText>
8690
</FormControl>
8791
</Box>
8892
);

src/frontend/src/components/NERAutocomplete.tsx

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import {
77
Autocomplete,
88
AutocompleteRenderInputParams,
9-
InputAdornment,
9+
FormHelperText,
1010
SxProps,
1111
TextField,
1212
Theme,
1313
useTheme
1414
} from '@mui/material';
15-
import SearchIcon from '@mui/icons-material/Search';
1615
import { HTMLAttributes } from 'react';
16+
import { FieldError } from 'react-hook-form';
1717

1818
interface NERAutocompleteProps {
1919
id: string;
@@ -25,6 +25,7 @@ interface NERAutocompleteProps {
2525
value?: { label: string; id: string } | null;
2626
listboxProps?: HTMLAttributes<HTMLUListElement>;
2727
filterSelectedOptions?: boolean;
28+
errorMessage?: FieldError;
2829
}
2930

3031
const NERAutocomplete: React.FC<NERAutocompleteProps> = ({
@@ -36,23 +37,17 @@ const NERAutocomplete: React.FC<NERAutocompleteProps> = ({
3637
sx,
3738
value,
3839
listboxProps,
39-
filterSelectedOptions
40+
filterSelectedOptions,
41+
errorMessage
4042
}) => {
4143
const theme = useTheme();
4244

4345
const autocompleteStyle = {
44-
height: '40px',
46+
height: '50%',
4547
backgroundColor: theme.palette.background.default,
4648
width: '100%',
47-
borderRadius: '25px',
4849
border: 0,
49-
'.MuiOutlinedInput-notchedOutline': {
50-
borderColor: 'black',
51-
borderRadius: '25px'
52-
},
53-
'&.Mui-focused .MuiOutlinedInput-notchedOutline': {
54-
borderColor: 'red'
55-
},
50+
borderColor: 'black',
5651
...sx
5752
};
5853

@@ -62,11 +57,7 @@ const NERAutocomplete: React.FC<NERAutocompleteProps> = ({
6257
{...params}
6358
InputProps={{
6459
...params.InputProps,
65-
startAdornment: (
66-
<InputAdornment position="start">
67-
<SearchIcon />
68-
</InputAdornment>
69-
)
60+
sx: { height: '56px' }
7061
}}
7162
placeholder={placeholder}
7263
required
@@ -75,19 +66,22 @@ const NERAutocomplete: React.FC<NERAutocompleteProps> = ({
7566
};
7667

7768
return (
78-
<Autocomplete
79-
isOptionEqualToValue={(option, value) => option.id === value.id}
80-
disablePortal
81-
id={id}
82-
onChange={onChange}
83-
options={options}
84-
sx={autocompleteStyle}
85-
size={size}
86-
renderInput={autocompleteRenderInput}
87-
value={value}
88-
filterSelectedOptions={filterSelectedOptions}
89-
ListboxProps={listboxProps}
90-
/>
69+
<>
70+
<Autocomplete
71+
isOptionEqualToValue={(option, value) => option.id === value.id}
72+
disablePortal
73+
id={id}
74+
onChange={onChange}
75+
options={options}
76+
sx={autocompleteStyle}
77+
size={size}
78+
renderInput={autocompleteRenderInput}
79+
value={value}
80+
filterSelectedOptions={filterSelectedOptions}
81+
ListboxProps={listboxProps}
82+
/>
83+
<FormHelperText error={!!errorMessage}>{errorMessage?.message}</FormHelperText>
84+
</>
9185
);
9286
};
9387

src/frontend/src/pages/ProjectDetailPage/ProjectEdit/ProjectEditContainer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ const ProjectEditContainer: React.FC<ProjectEditContainerProps> = ({ project, ex
174174
<PageLayout
175175
title={`${wbsPipe(project.wbsNum)} - ${project.name}`}
176176
previousPages={[{ name: 'Projects', route: routes.PROJECTS }]}
177-
headerRight={<ChangeRequestDropdown control={control} name="crId" />}
177+
headerRight={<ChangeRequestDropdown control={control} name="crId" errors={errors} />}
178178
>
179179
<form
180180
id="project-edit-form"

src/frontend/src/pages/WorkPackageDetailPage/WorkPackageEditContainer/WorkPackageEditContainer.tsx

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ import { useQuery } from '../../../hooks/utils.hooks';
1414
import { Controller, useFieldArray, useForm } from 'react-hook-form';
1515
import { yupResolver } from '@hookform/resolvers/yup';
1616
import * as yup from 'yup';
17-
import { Box, TextField, Autocomplete, FormControl, Typography } from '@mui/material';
17+
import { TextField, Autocomplete, FormControl } from '@mui/material';
1818
import ReactHookEditableList from '../../../components/ReactHookEditableList';
1919
import { useEditWorkPackage } from '../../../hooks/work-packages.hooks';
20-
import WorkPackageEditDetails from './WorkPackageEditDetails';
20+
import WorkPackageFormDetails from './WorkPackageFormDetails';
2121
import { bulletsToObject, mapBulletsToPayload, startDateTester } from '../../../utils/form';
2222
import NERSuccessButton from '../../../components/NERSuccessButton';
2323
import NERFailButton from '../../../components/NERFailButton';
2424
import { useToast } from '../../../hooks/toasts.hooks';
2525
import { useState } from 'react';
2626
import { useSingleProject } from '../../../hooks/projects.hooks';
2727
import PageLayout from '../../../components/PageLayout';
28-
import ChangeRequestDropdown from '../../../components/ChangeRequestDropdown';
28+
import { Box } from '@mui/system';
2929

3030
const schema = yup.object().shape({
3131
name: yup.string().required('Name is required!'),
@@ -171,7 +171,7 @@ const WorkPackageEditContainer: React.FC<WorkPackageEditContainerProps> = ({ wor
171171
{ name: 'Projects', route: routes.PROJECTS },
172172
{ name: `${projectWbsString} - ${workPackage.projectName}`, route: `${routes.PROJECTS}/${projectWbsString}` }
173173
]}
174-
headerRight={<ChangeRequestDropdown control={control} name="crId" />}
174+
headerRight={<></>}
175175
>
176176
<form
177177
id="work-package-edit-form"
@@ -184,7 +184,7 @@ const WorkPackageEditContainer: React.FC<WorkPackageEditContainerProps> = ({ wor
184184
e.key === 'Enter' && e.preventDefault();
185185
}}
186186
>
187-
<WorkPackageEditDetails
187+
<WorkPackageFormDetails
188188
control={control}
189189
errors={errors}
190190
usersForProjectLead={users}
@@ -216,24 +216,24 @@ const WorkPackageEditContainer: React.FC<WorkPackageEditContainerProps> = ({ wor
216216
/>
217217
</FormControl>
218218
</PageBlock>
219-
<Typography variant="h5">Expected Activities</Typography>
220-
<ReactHookEditableList
221-
name="expectedActivities"
222-
register={register}
223-
ls={expectedActivities}
224-
append={appendExpectedActivity}
225-
remove={removeExpectedActivity}
226-
bulletName="Expected Activity"
227-
/>
228-
<Typography variant="h5">Deliverables</Typography>
229-
<ReactHookEditableList
230-
name="deliverables"
231-
register={register}
232-
ls={deliverables}
233-
append={appendDeliverable}
234-
remove={removeDeliverable}
235-
bulletName="Deliverable"
236-
/>
219+
<PageBlock title="Expected Activities">
220+
<ReactHookEditableList
221+
name="expectedActivities"
222+
register={register}
223+
ls={expectedActivities}
224+
append={appendExpectedActivity}
225+
remove={removeExpectedActivity}
226+
/>
227+
</PageBlock>
228+
<PageBlock title="Deliverables">
229+
<ReactHookEditableList
230+
name="deliverables"
231+
register={register}
232+
ls={deliverables}
233+
append={appendDeliverable}
234+
remove={removeDeliverable}
235+
/>
236+
</PageBlock>
237237
<Box textAlign="right" sx={{ my: 2 }}>
238238
<NERFailButton variant="contained" onClick={exitEditMode} sx={{ mx: 1 }}>
239239
Cancel

src/frontend/src/pages/WorkPackageDetailPage/WorkPackageEditContainer/WorkPackageEditDetails.tsx renamed to src/frontend/src/pages/WorkPackageDetailPage/WorkPackageEditContainer/WorkPackageFormDetails.tsx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
import { User, WorkPackageStage } from 'shared';
77
import { fullNamePipe } from '../../../utils/pipes';
8-
import PageBlock from '../../../layouts/PageBlock';
9-
import { FormControl, FormLabel, Grid, MenuItem, TextField } from '@mui/material';
8+
import { FormControl, FormLabel, Grid, MenuItem, TextField, Typography } from '@mui/material';
109
import ReactHookTextField from '../../../components/ReactHookTextField';
1110
import { Control, Controller, FieldErrorsImpl } from 'react-hook-form';
1211
import { DatePicker } from '@mui/x-date-pickers';
1312
import NERAutocomplete from '../../../components/NERAutocomplete';
1413
import { WorkPackageEditFormPayload } from './WorkPackageEditContainer';
14+
import ChangeRequestDropdown from '../../../components/ChangeRequestDropdown';
15+
import { Box } from '@mui/system';
1516

1617
interface Props {
1718
lead?: string;
@@ -24,7 +25,7 @@ interface Props {
2425
errors: Partial<FieldErrorsImpl<WorkPackageEditFormPayload>>;
2526
}
2627

27-
const WorkPackageEditDetails: React.FC<Props> = ({
28+
const WorkPackageFormDetails: React.FC<Props> = ({
2829
lead,
2930
manager,
3031
setManager,
@@ -45,7 +46,7 @@ const WorkPackageEditDetails: React.FC<Props> = ({
4546

4647
const StageSelect = () => (
4748
<FormControl fullWidth>
48-
<FormLabel>Stage Select</FormLabel>
49+
<FormLabel>Work Package Stage</FormLabel>
4950
<Controller
5051
name="stage"
5152
control={control}
@@ -64,9 +65,12 @@ const WorkPackageEditDetails: React.FC<Props> = ({
6465
);
6566

6667
return (
67-
<PageBlock title="Work Package Details">
68+
<Box>
69+
<Typography variant="h5" sx={{ marginBottom: '10px', color: 'white' }}>
70+
Project Details
71+
</Typography>
6872
<Grid container xs={12}>
69-
<Grid item xs={12} md={5} sx={{ mt: 2, mr: 2 }}>
73+
<Grid item xs={12} md={4} sx={{ mt: 2, mr: 2 }}>
7074
<FormControl fullWidth>
7175
<FormLabel>Work Package Name</FormLabel>
7276
<ReactHookTextField
@@ -77,6 +81,12 @@ const WorkPackageEditDetails: React.FC<Props> = ({
7781
/>
7882
</FormControl>
7983
</Grid>
84+
<Grid item xs={12} md={2} lg={2} sx={{ mt: 2, mr: 2 }}>
85+
<ChangeRequestDropdown control={control} name="crId" errors={errors} changeHeight={56} />
86+
</Grid>
87+
<Grid item xs={12} md={2} sx={{ mt: 2, mr: 2 }}>
88+
<StageSelect />
89+
</Grid>
8090
<Grid item xs={12} md={2} sx={{ mt: 2, mr: 2 }}>
8191
<FormControl fullWidth sx={{ overflow: 'hidden' }}>
8292
<FormLabel sx={{ whiteSpace: 'noWrap' }}>Start Date (YYYY-MM-DD)</FormLabel>
@@ -99,9 +109,6 @@ const WorkPackageEditDetails: React.FC<Props> = ({
99109
/>
100110
</FormControl>
101111
</Grid>
102-
<Grid item xs={12} md={2} sx={{ mt: 2, mr: 2 }}>
103-
<StageSelect />
104-
</Grid>
105112
<Grid item xs={12} md={2} sx={{ mt: 2, mr: 2 }}>
106113
<FormControl fullWidth>
107114
<FormLabel>Duration</FormLabel>
@@ -114,8 +121,8 @@ const WorkPackageEditDetails: React.FC<Props> = ({
114121
/>
115122
</FormControl>
116123
</Grid>
117-
<Grid item xs={12} md={6} sx={{ mt: 1 }}>
118-
<FormLabel> Project Head</FormLabel>
124+
<Grid item xs={12} md={4} sx={{ mt: 1 }}>
125+
<FormLabel> Project Lead</FormLabel>
119126
<NERAutocomplete
120127
sx={{ mt: 1, width: '90%' }}
121128
id="project-lead-autocomplete"
@@ -126,8 +133,10 @@ const WorkPackageEditDetails: React.FC<Props> = ({
126133
value={userToOption(usersForProjectLead.find((user) => user.userId.toString() === lead))}
127134
/>
128135
</Grid>
129-
<Grid item xs={12} md={6} sx={{ mt: 1 }}>
136+
137+
<Grid item xs={12} md={4} sx={{ mt: 1 }}>
130138
<FormLabel>Project Manager</FormLabel>
139+
131140
<NERAutocomplete
132141
sx={{ mt: 1, width: '90%' }}
133142
id="project-manager-autocomplete"
@@ -139,8 +148,8 @@ const WorkPackageEditDetails: React.FC<Props> = ({
139148
/>
140149
</Grid>
141150
</Grid>
142-
</PageBlock>
151+
</Box>
143152
);
144153
};
145154

146-
export default WorkPackageEditDetails;
155+
export default WorkPackageFormDetails;

0 commit comments

Comments
 (0)