@@ -15,14 +15,15 @@ import { Grid, Typography, useTheme, Link, IconButton } from '@mui/material';
1515import { Box } from '@mui/system' ;
1616import { useState } from 'react' ;
1717import { useHistory } from 'react-router-dom' ;
18- import { ReimbursementRequest } from 'shared' ;
18+ import { ReimbursementRequest , isHead } from 'shared' ;
1919import ActionsMenu , { ButtonInfo } from '../../../components/ActionsMenu' ;
2020import NERModal from '../../../components/NERModal' ;
2121import PageLayout from '../../../components/PageLayout' ;
2222import VerticalDetailDisplay from '../../../components/VerticalDetailDisplay' ;
2323import {
2424 useDeleteReimbursementRequest ,
2525 useDenyReimbursementRequest ,
26+ useLeadershipApproveReimbursementRequest ,
2627 useMarkReimbursementRequestAsDelivered ,
2728 useMarkReimbursementRequestAsReimbursed
2829} from '../../../hooks/finance.hooks' ;
@@ -64,6 +65,7 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
6465 const toast = useToast ( ) ;
6566 const [ showDeleteModal , setShowDeleteModal ] = useState ( false ) ;
6667 const [ showDenyModal , setShowDenyModal ] = useState ( false ) ;
68+ const [ showLeadershipApproveModal , setShowLeadershipApproveModal ] = useState ( false ) ;
6769 const [ showMarkDelivered , setShowMarkDelivered ] = useState ( false ) ;
6870 const [ showMarkReimbursed , setShowMarkReimbursed ] = useState ( false ) ;
6971 const [ showSubmitToSaboModal , setShowSubmitToSaboModal ] = useState ( false ) ;
@@ -75,7 +77,12 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
7577 const { mutateAsync : markReimbursed } = useMarkReimbursementRequestAsReimbursed (
7678 reimbursementRequest . reimbursementRequestId
7779 ) ;
80+ const { mutateAsync : leadershipApproveReimbursementRequest } = useLeadershipApproveReimbursementRequest (
81+ reimbursementRequest . reimbursementRequestId
82+ ) ;
83+
7884 const isSaboSubmitted = isReimbursementRequestSaboSubmitted ( reimbursementRequest ) ;
85+ const isLeadershipApproved = isReimbursementRequestAdvisorApproved ( reimbursementRequest ) ;
7986
8087 const handleDelete = async ( ) => {
8188 try {
@@ -121,6 +128,17 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
121128 }
122129 } ;
123130
131+ const handleLeadershipApprove = async ( ) => {
132+ try {
133+ await leadershipApproveReimbursementRequest ( ) ;
134+ setShowLeadershipApproveModal ( false ) ;
135+ } catch ( e : unknown ) {
136+ if ( e instanceof Error ) {
137+ toast . error ( e . message , 3000 ) ;
138+ }
139+ }
140+ } ;
141+
124142 const DeleteModal = ( ) => {
125143 return (
126144 < NERModal
@@ -151,6 +169,21 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
151169 ) ;
152170 } ;
153171
172+ const LeadershipApproveModal = ( ) => {
173+ return (
174+ < NERModal
175+ open = { showLeadershipApproveModal }
176+ onHide = { ( ) => setShowLeadershipApproveModal ( false ) }
177+ title = "Warning!"
178+ cancelText = "No"
179+ submitText = "Yes"
180+ onSubmit = { handleLeadershipApprove }
181+ >
182+ < Typography > Are you sure you want to approve this reimbursement request?</ Typography >
183+ </ NERModal >
184+ ) ;
185+ } ;
186+
154187 const MarkDeliveredModal = ( ) => (
155188 < NERModal
156189 open = { showMarkDelivered }
@@ -303,6 +336,16 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
303336 icon : isSaboSubmitted ? < Assignment /> : < CheckIcon /> ,
304337 disabled : ! user . isFinance
305338 } ,
339+ {
340+ title : 'Leadership Approve' ,
341+ onClick : ( ) => setShowLeadershipApproveModal ( true ) ,
342+ icon : < CheckIcon /> ,
343+ disabled :
344+ ! isHead ( user . role ) ||
345+ isReimbursementRequestDenied ( reimbursementRequest ) ||
346+ isReimbursementRequestReimbursed ( reimbursementRequest ) ||
347+ isLeadershipApproved
348+ } ,
306349 {
307350 title : 'Deny' ,
308351 onClick : ( ) => setShowDenyModal ( true ) ,
@@ -337,6 +380,7 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
337380 < DenyModal />
338381 < MarkDeliveredModal />
339382 < MarkReimbursedModal />
383+ < LeadershipApproveModal />
340384 < SubmitToSaboModal
341385 open = { showSubmitToSaboModal }
342386 setOpen = { setShowSubmitToSaboModal }
0 commit comments