Skip to content

Commit a05cdb1

Browse files
committed
#1203: refactored ActionsMenu and CR actions menu code
1 parent 6fbdb63 commit a05cdb1

3 files changed

Lines changed: 40 additions & 57 deletions

File tree

src/frontend/src/components/ActionsMenu.tsx

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,15 @@ export type ButtonInfo = {
99
onClick: () => void;
1010
disabled?: boolean;
1111
icon?: ReactElement;
12+
dividerTop?: boolean;
1213
};
1314

1415
interface ActionsMenuProps {
1516
buttons: ButtonInfo[];
1617
title?: string;
17-
divider?: boolean;
1818
}
1919

20-
interface menuButtonProps {
21-
divider?: boolean;
22-
index: number;
23-
button: ButtonInfo;
24-
}
25-
26-
const ActionsMenu: React.FC<ActionsMenuProps> = ({ buttons, title = 'Actions', divider = false }) => {
20+
const ActionsMenu: React.FC<ActionsMenuProps> = ({ buttons, title = 'Actions' }) => {
2721
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
2822

2923
const handleClick = (event: React.MouseEvent<HTMLElement>) => {
@@ -36,23 +30,6 @@ const ActionsMenu: React.FC<ActionsMenuProps> = ({ buttons, title = 'Actions', d
3630

3731
const dropdownOpen = Boolean(anchorEl);
3832

39-
const MenuButton: React.FC<menuButtonProps> = ({ divider = false, index, button }) => (
40-
<>
41-
<MenuItem
42-
key={index}
43-
onClick={() => {
44-
handleDropdownClose();
45-
button.onClick();
46-
}}
47-
disabled={button.disabled}
48-
>
49-
<ListItemIcon>{button.icon}</ListItemIcon>
50-
{button.title}
51-
</MenuItem>
52-
{divider ? <Divider /> : <></>}
53-
</>
54-
);
55-
5633
return (
5734
<Box>
5835
<NERButton
@@ -65,10 +42,21 @@ const ActionsMenu: React.FC<ActionsMenuProps> = ({ buttons, title = 'Actions', d
6542
</NERButton>
6643
<Menu open={dropdownOpen} anchorEl={anchorEl} onClose={handleDropdownClose}>
6744
{buttons.map((button, index) => {
68-
return index === buttons.length - 1 ? (
69-
<MenuButton index={index} button={button} />
70-
) : (
71-
<MenuButton index={index} button={button} divider={divider} />
45+
return (
46+
<>
47+
{button.dividerTop ? <Divider /> : <></>}
48+
<MenuItem
49+
key={index}
50+
onClick={() => {
51+
handleDropdownClose();
52+
button.onClick();
53+
}}
54+
disabled={button.disabled}
55+
>
56+
<ListItemIcon>{button.icon}</ListItemIcon>
57+
{button.title}
58+
</MenuItem>
59+
</>
7260
);
7361
})}
7462
</Menu>

src/frontend/src/pages/ChangeRequestDetailPage/ChangeRequestActionMenu.tsx

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import { useHistory } from 'react-router-dom';
1111
import { NERButton } from '../../components/NERButton';
1212
import { useRequestCRReview } from '../../hooks/change-requests.hooks';
1313
import { useToast } from '../../hooks/toasts.hooks';
14-
import { useCurrentUser } from '../../hooks/users.hooks';
14+
import { useCurrentUser, useAllUsers } from '../../hooks/users.hooks';
1515
import { projectWbsPipe } from '../../utils/pipes';
1616
import { routes } from '../../utils/routes';
1717
import { userToAutocompleteOption } from '../../utils/task.utils';
1818
import { useState } from 'react';
19+
import ErrorPage from '../ErrorPage';
20+
import LoadingIndicator from '../../components/LoadingIndicator';
1921

2022
interface ChangeRequestActionMenuProps {
2123
isUserAllowedToReview: boolean;
@@ -24,7 +26,6 @@ interface ChangeRequestActionMenuProps {
2426
changeRequest: ChangeRequest;
2527
handleReviewOpen: () => void;
2628
handleDeleteOpen: () => void;
27-
users: User[];
2829
}
2930

3031
const ChangeRequestActionMenu: React.FC<ChangeRequestActionMenuProps> = ({
@@ -33,35 +34,36 @@ const ChangeRequestActionMenu: React.FC<ChangeRequestActionMenuProps> = ({
3334
isUserAllowedToDelete,
3435
changeRequest,
3536
handleReviewOpen,
36-
handleDeleteOpen,
37-
users
37+
handleDeleteOpen
3838
}: ChangeRequestActionMenuProps) => {
3939
const { mutateAsync: requestCRReview } = useRequestCRReview(changeRequest.crId.toString());
4040
const toast = useToast();
4141
const currentUser = useCurrentUser();
4242
const history = useHistory();
4343
const [reviewerIds, setReviewerIds] = useState<number[]>([]);
44-
44+
const { data: users, isLoading: isLoadingAllUsers, isError: isErrorAllUsers, error: errorAllUsers } = useAllUsers();
45+
if (isErrorAllUsers) return <ErrorPage message={errorAllUsers?.message} />;
46+
if (isLoadingAllUsers || !users) return <LoadingIndicator />;
4547
const handleRequestReviewerClick = async () => {
4648
if (reviewerIds.length === 0) {
4749
toast.error('Must select at least one reviewer to request review from');
48-
return;
49-
}
50-
try {
51-
await requestCRReview({ userIds: reviewerIds });
52-
} catch (e) {
53-
if (e instanceof Error) {
54-
toast.error(e.message);
50+
} else {
51+
try {
52+
await requestCRReview({ userIds: reviewerIds });
53+
} catch (e) {
54+
if (e instanceof Error) {
55+
toast.error(e.message);
56+
}
5557
}
5658
}
5759
};
5860

59-
const isRequestAllowed = changeRequest.submitter.userId === currentUser.userId;
61+
const isRequestAllowed =
62+
changeRequest.submitter.userId === currentUser.userId && changeRequest.status === ChangeRequestStatus.Open;
6063

6164
const UnreviewedActionsDropdown = () => (
6265
<div style={{ marginTop: '10px' }}>
6366
<ActionsMenu
64-
divider={true}
6567
buttons={[
6668
{
6769
title: 'Review',
@@ -73,14 +75,15 @@ const ChangeRequestActionMenu: React.FC<ChangeRequestActionMenuProps> = ({
7375
title: 'Delete',
7476
onClick: handleDeleteOpen,
7577
disabled: !isUserAllowedToDelete,
76-
icon: <DeleteIcon fontSize="small" />
78+
icon: <DeleteIcon fontSize="small" />,
79+
dividerTop: true
7780
}
7881
]}
7982
/>
8083
</div>
8184
);
8285

83-
const RequestReviewerDropdown = () => (
86+
const requestReviewerDropdown = () => (
8487
<>
8588
<Autocomplete
8689
isOptionEqualToValue={(option, value) => option.id === value.id}
@@ -121,12 +124,8 @@ const ChangeRequestActionMenu: React.FC<ChangeRequestActionMenuProps> = ({
121124
</>
122125
);
123126

124-
const RenderUnreviewedActionsDropdown = () =>
125-
isRequestAllowed && changeRequest.status === ChangeRequestStatus.Open ? (
126-
RequestReviewerDropdown()
127-
) : (
128-
<UnreviewedActionsDropdown />
129-
);
127+
const renderUnreviewedActionsDropdown = () =>
128+
isRequestAllowed ? requestReviewerDropdown() : <UnreviewedActionsDropdown />;
130129

131130
const ImplementCrDropdown = () => (
132131
<ActionsMenu
@@ -159,7 +158,7 @@ const ChangeRequestActionMenu: React.FC<ChangeRequestActionMenuProps> = ({
159158
/>
160159
);
161160

162-
return changeRequest.accepted ? <ImplementCrDropdown /> : <>{RenderUnreviewedActionsDropdown()}</>;
161+
return changeRequest.accepted ? <ImplementCrDropdown /> : <>{renderUnreviewedActionsDropdown()}</>;
163162
};
164163

165164
export default ChangeRequestActionMenu;

src/frontend/src/pages/ChangeRequestDetailPage/ChangeRequestDetailsView.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { useSingleProject } from '../../hooks/projects.hooks';
2929
import LoadingIndicator from '../../components/LoadingIndicator';
3030
import ErrorPage from '../ErrorPage';
3131
import PageLayout from '../../components/PageLayout';
32-
import { useAllUsers } from '../../hooks/users.hooks';
3332
import ChangeRequestActionMenu from './ChangeRequestActionMenu';
3433

3534
const buildDetails = (cr: ChangeRequest): ReactElement => {
@@ -88,10 +87,8 @@ const ChangeRequestDetailsView: React.FC<ChangeRequestDetailsProps> = ({
8887
projectNumber: changeRequest.wbsNum.projectNumber,
8988
workPackageNumber: 0
9089
});
91-
const { data: users, isLoading: isLoadingAllUsers, isError: isErrorAllUsers, error: errorAllUsers } = useAllUsers();
9290
if (isError) return <ErrorPage message={error?.message} />;
93-
if (isErrorAllUsers) return <ErrorPage message={errorAllUsers?.message} />;
94-
if (!project || isLoading || isLoadingAllUsers || !users) return <LoadingIndicator />;
91+
if (!project || isLoading) return <LoadingIndicator />;
9592

9693
const { name: projectName } = project;
9794

@@ -107,7 +104,6 @@ const ChangeRequestDetailsView: React.FC<ChangeRequestDetailsProps> = ({
107104
changeRequest={changeRequest}
108105
handleReviewOpen={handleReviewOpen}
109106
handleDeleteOpen={handleDeleteOpen}
110-
users={users}
111107
/>
112108
}
113109
>

0 commit comments

Comments
 (0)