Skip to content

Commit ee56be6

Browse files
authored
Merge branch 'develop' into #1279-only-show-allowed-expense-types
2 parents 32dee70 + 101fe8a commit ee56be6

16 files changed

Lines changed: 92 additions & 45 deletions

File tree

src/backend/src/controllers/reimbursement-requests.controllers.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,10 @@ export default class ReimbursementRequestsController {
182182

183183
const receipt = await ReimbursementRequestService.uploadReceipt(requestId, file, user);
184184

185-
res.header('Access-Control-Allow-Origin', 'true');
185+
const isProd = process.env.NODE_ENV === 'production';
186+
const origin = isProd ? 'https://finishlinebyner.com' : 'http://localhost:3000';
187+
188+
res.header('Access-Control-Allow-Origin', origin);
186189
res.status(200).json(receipt);
187190
} catch (error: unknown) {
188191
next(error);

src/backend/src/services/work-packages.services.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ export default class WorkPackagesService {
154154
throw new HttpException(400, 'A Work Package cannot have its own project as a blocker');
155155
}
156156

157+
blockedBy.forEach((dep: WbsNumber) => {
158+
if (dep.workPackageNumber === 0) {
159+
throw new HttpException(400, 'A Project cannot be a Blocker');
160+
}
161+
});
162+
157163
const wbsElem = await prisma.wBS_Element.findUnique({
158164
where: {
159165
wbsNumber: {
@@ -287,6 +293,12 @@ export default class WorkPackagesService {
287293
// verify user is allowed to edit work packages
288294
if (isGuest(user.role)) throw new AccessDeniedGuestException('edit work packages');
289295

296+
blockedBy.forEach((dep: WbsNumber) => {
297+
if (dep.workPackageNumber === 0) {
298+
throw new HttpException(400, 'A Project cannot be a Blocker');
299+
}
300+
});
301+
290302
const { userId } = user;
291303

292304
// get the original work package so we can compare things

src/frontend/src/hooks/work-packages.hooks.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,6 @@ export const useSingleWorkPackage = (wbsNum: WbsNumber) => {
3737
});
3838
};
3939

40-
/**
41-
* Custom React Hook to supply multiple work packages
42-
*
43-
* @param wbsNums WBS numbers of the requested work packages
44-
*/
45-
export const useManyWorkPackages = (wbsNums: WbsNumber[]) => {
46-
return useQuery<WorkPackage[], Error>(['work packages', wbsNums], async () => {
47-
const workPackagePromises = wbsNums.map(async (wbsNum) => {
48-
const { data } = await getSingleWorkPackage(wbsNum);
49-
return data;
50-
});
51-
const workPackages = await Promise.all(workPackagePromises);
52-
return workPackages;
53-
});
54-
};
55-
5640
/**
5741
* Custom React Hook to create a new work package.
5842
*

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import { useSingleProject } from '../../hooks/projects.hooks';
3434
import LoadingIndicator from '../../components/LoadingIndicator';
3535
import ErrorPage from '../ErrorPage';
3636
import PageLayout from '../../components/PageLayout';
37+
import ContentPasteIcon from '@mui/icons-material/ContentPaste';
38+
import DeleteIcon from '@mui/icons-material/Delete';
3739

3840
const buildDetails = (cr: ChangeRequest): ReactElement => {
3941
switch (cr.type) {
@@ -117,10 +119,16 @@ const ChangeRequestDetailsView: React.FC<ChangeRequestDetailsProps> = ({
117119
</NERButton>
118120
<Menu open={dropdownOpen} anchorEl={anchorEl} onClose={handleDropdownClose}>
119121
<MenuItem onClick={handleReviewOpen} disabled={!isUserAllowedToReview}>
122+
<ListItemIcon>
123+
<ContentPasteIcon fontSize="small" />
124+
</ListItemIcon>
120125
Review
121126
</MenuItem>
122127
<Divider />
123128
<MenuItem disabled={!isUserAllowedToDelete} onClick={handleDeleteOpen}>
129+
<ListItemIcon>
130+
<DeleteIcon fontSize="small" />
131+
</ListItemIcon>
124132
Delete
125133
</MenuItem>
126134
</Menu>

src/frontend/src/pages/ChangeRequestDetailPage/ProposedSolutionForm.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
* See the LICENSE file in the repository root folder for details.
44
*/
55

6-
import { Box, Button, Dialog, DialogContent, DialogTitle } from '@mui/material';
6+
import { Box, Dialog, DialogContent, DialogTitle } from '@mui/material';
77
import CloseIcon from '@mui/icons-material/Close';
8+
import NERSuccessButton from '../../components/NERSuccessButton';
89
import * as yup from 'yup';
910
import { Controller, useForm } from 'react-hook-form';
1011
import { yupResolver } from '@hookform/resolvers/yup';
@@ -190,15 +191,15 @@ const ProposedSolutionForm: React.FC<ProposedSolutionFormProps> = ({
190191
''
191192
) : (
192193
<Box display="flex" flexDirection="row-reverse">
193-
<Button
194+
<NERSuccessButton
194195
color="success"
195196
variant="contained"
196197
type="submit"
197198
form="individual-proposed-solution-form"
198199
sx={{ textTransform: 'none', fontSize: 16, marginTop: 3 }}
199200
>
200201
Add
201-
</Button>
202+
</NERSuccessButton>
202203
</Box>
203204
)}
204205
</form>

src/frontend/src/pages/CreditsPage/CreditsPage.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ const CreditsPage: React.FC = () => {
8484
{ name: 'Yechan Na', color: '#C2B078' },
8585
{ name: 'Liam Kosar', color: '#eb66ff' },
8686
{ name: 'Daniel Yu', color: '#bdc0c7' },
87+
{ name: 'Jake Wu-Chen', color: '#bdc0c7' },
8788
{ name: 'William Seward', color: '#e53774' },
89+
{ name: 'Liu von Engelbrechten', color: '#2969f2' },
8890
{
8991
name: 'Zach Norman',
9092
color: 'transparent',
@@ -95,9 +97,38 @@ const CreditsPage: React.FC = () => {
9597
},
9698
{ name: 'Ethan Mouri', color: '#00bbff' },
9799
{ name: 'Laith Taher', color: '#000080' },
100+
{ name: 'Teera Tesharojanasup', color: '#DC143C', sx: { px: 1, backgroundColor: '#E8D8CC', borderRadius: 10 } },
101+
{ name: 'Griffin Cooper', color: '#02d69a' },
102+
{ name: 'Amani Scarborough', color: '#e34db6' },
103+
{ name: 'Peter Moise', color: '#FF0000' },
98104
{ name: 'Srihari Raman', color: '#FF2400' },
99105
{ name: 'Kaiyang Zheng', color: '#FFFF00' },
100-
{ name: 'Matthew Wang', color: '#c657f2' }
106+
{ name: 'Waasif Mahmood', color: '#114a13' },
107+
{ name: 'Matthew Wang', color: '#c657f2' },
108+
{ name: 'Sharon Yang', color: '#ed8a5f' },
109+
{ name: 'Ha Nguyen', color: '#ff9812' },
110+
{ name: 'Sathvik Charugundla', color: '#ff0000' },
111+
{ name: 'Samantha Moy', color: '#d287fa' },
112+
{ name: 'Benjamin Zhu', color: '#ccccff' },
113+
{ name: 'Stephanie Xu', color: '#ffcd42' },
114+
{ name: 'Hareg Aderie', color: '#34b46c' },
115+
{ name: 'Raymond Tsai', color: '#66cdaa' },
116+
{ name: 'Arinjay Singh', color: '#7bb5dc' },
117+
{ name: 'Aarav Shyamkumar', color: '#FF0000' },
118+
{ name: 'Raghav Mathur', color: '#009933' },
119+
{ name: 'Anika Sharma', color: '#ff0000' },
120+
{
121+
name: 'Kaan Tural',
122+
color: 'transparent',
123+
sx: {
124+
background: 'linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(0,128,255,1) 100%)',
125+
'-webkit-background-clip': 'text',
126+
textShadow: '0 0 5px rgba(255,0,0,1), 0 0 10px rgba(0,128,255,1)'
127+
}
128+
},
129+
{ name: 'Kevin Polackal', color: '#800080' },
130+
{ name: 'Lily Shiomitsu', color: '#008080' },
131+
{ name: 'Kevin Yang', color: '#0000FF' }
101132
];
102133

103134
const snark = ['Add your name!', "Shouldn't you do it yourself?", 'Seriously', 'go', 'do', 'it'];

src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/ReimbursementRequestDetailsView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* See the LICENSE file in the repository root folder for details.
44
*/
55

6+
import { expenseTypePipe } from '../../../utils/pipes';
67
import { Edit } from '@mui/icons-material';
78
import CheckIcon from '@mui/icons-material/Check';
89
import ConfirmationNumberIcon from '@mui/icons-material/ConfirmationNumber';
@@ -118,7 +119,7 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
118119
<VerticalDetailDisplay label="Refund Source" content={`${reimbursementRequest.account}`} />
119120
</Grid>
120121
<Grid item sm={6} xs={12}>
121-
<VerticalDetailDisplay label="Expense Type" content={`${reimbursementRequest.expenseType.name}`} />
122+
<VerticalDetailDisplay label="Expense Type" content={expenseTypePipe(reimbursementRequest.expenseType)} />
122123
</Grid>
123124
<Grid item sm={6} xs={12}>
124125
<VerticalDetailDisplay label="Date Delivered" content={dateUndefinedPipe(reimbursementRequest.dateDelivered)} />

src/frontend/src/pages/FinancePage/ReimbursementRequestForm/ReimbursementFormView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import NERSuccessButton from '../../../components/NERSuccessButton';
2929
import { ReimbursementRequestFormInput } from './ReimbursementRequestForm';
3030
import { useState } from 'react';
3131
import { useToast } from '../../../hooks/toasts.hooks';
32+
import { expenseTypePipe } from '../../../utils/pipes';
3233

3334
interface ReimbursementRequestFormViewProps {
3435
allVendors: Vendor[];
@@ -197,7 +198,7 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
197198
.filter((expenseType) => expenseType.allowed)
198199
.map((expenseType) => (
199200
<MenuItem key={expenseType.expenseTypeId} value={expenseType.expenseTypeId}>
200-
{expenseType.name}
201+
{expenseTypePipe(expenseType)}
201202
</MenuItem>
202203
))}
203204
</Select>

src/frontend/src/pages/FinancePage/ReimbursementRequestForm/ReimbursementRequestForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const ReimbursementRequestForm: React.FC<ReimbursementRequestFormProps> = ({
7575
resolver: yupResolver(schema),
7676
defaultValues: {
7777
vendorId: defaultValues?.vendorId ?? '',
78-
account: defaultValues?.account ?? ClubAccount.CASH,
78+
account: defaultValues?.account ?? ClubAccount.BUDGET,
7979
dateOfExpense: defaultValues?.dateOfExpense ?? new Date(),
8080
expenseTypeId: defaultValues?.expenseTypeId ?? '',
8181
reimbursementProducts: defaultValues?.reimbursementProducts ?? ([] as ReimbursementProductCreateArgs[]),

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/WorkPackageSummary.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import Grid from '@mui/material/Grid';
1818
import { useTheme } from '@mui/material';
1919
import DetailDisplay from '../../../components/DetailDisplay';
2020
import WorkPackageStageChip from '../../../components/WorkPackageStageChip';
21-
import { useManyWorkPackages } from '../../../hooks/work-packages.hooks';
21+
import { useGetBlockingWorkPackages } from '../../../hooks/work-packages.hooks';
2222
import LoadingIndicator from '../../../components/LoadingIndicator';
2323
import ErrorPage from '../../ErrorPage';
2424

@@ -37,7 +37,7 @@ const WorkPackageSummary: React.FC<WorkPackageSummaryProps> = ({ workPackage })
3737
</ul>
3838
);
3939

40-
const { data: dependencies, isError, isLoading, error } = useManyWorkPackages(workPackage.blockedBy);
40+
const { data: dependencies, isError, isLoading, error } = useGetBlockingWorkPackages(workPackage.wbsNum);
4141
const theme = useTheme();
4242

4343
if (!dependencies || isLoading) return <LoadingIndicator />;

0 commit comments

Comments
 (0)