Skip to content

Commit 7812c54

Browse files
committed
show receipt previews whilst editing
1 parent 3b40e85 commit 7812c54

5 files changed

Lines changed: 51 additions & 17 deletions

File tree

src/frontend/src/pages/FinancePage/CreateReimbursementRequest.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import ReimbursementRequestForm, {
1111
} from './ReimbursementRequestForm/ReimbursementRequestForm';
1212

1313
const CreateReimbursementRequestPage: React.FC = () => {
14-
const { mutateAsync: createReimbursementRequest } = useCreateReimbursementRequest();
15-
const { mutateAsync: uploadReceipts } = useUploadManyReceipts();
14+
const { isLoading: createReimbursementRequestIsLoading, mutateAsync: createReimbursementRequest } =
15+
useCreateReimbursementRequest();
16+
const { isLoading: receiptsIsLoading, mutateAsync: uploadReceipts } = useUploadManyReceipts();
1617
const history = useHistory();
1718

1819
const onSubmit = async (data: ReimbursementRequestDataSubmission): Promise<string> => {
@@ -28,12 +29,19 @@ const CreateReimbursementRequestPage: React.FC = () => {
2829
history.goBack();
2930
};
3031

32+
const isSubmitting = createReimbursementRequestIsLoading || receiptsIsLoading;
33+
3134
return (
3235
<PageLayout
3336
title="Create Reimbursement Request"
3437
previousPages={[{ name: 'Reimbursement Requests', route: routes.REIMBURSEMENT_REQUESTS }]}
3538
>
36-
<ReimbursementRequestForm onFormExit={onCancel} submitText="Submit" submitData={onSubmit} />
39+
<ReimbursementRequestForm
40+
onFormExit={onCancel}
41+
submitText="Submit"
42+
submitData={onSubmit}
43+
isSubmitting={isSubmitting}
44+
/>
3745
</PageLayout>
3846
);
3947
};

src/frontend/src/pages/FinancePage/EditReimbursementRequest/EditReimbursementRequest.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,19 @@ const EditReimbursementRequestPage: React.FC<{}> = () => {
2323
const { id } = useParams<{ id: string }>();
2424
const history = useHistory();
2525

26-
const { isLoading: editReimbursementRequestIsLoading } = useEditReimbursementRequest(id);
27-
const { isLoading: uploadReceiptsIsLoading } = useUploadManyReceipts();
26+
const { isLoading: editReimbursementRequestIsLoading, mutateAsync: editReimbursementRequest } = useEditReimbursementRequest(id);
27+
const { isLoading: uploadReceiptsIsLoading, mutateAsync: uploadReceipts } = useUploadManyReceipts();
2828
const { isLoading: getIsLoading, isError, error, data: reimbursementRequest } = useSingleReimbursementRequest(id);
29-
const { mutateAsync: editReimbursementRequest } = useEditReimbursementRequest(id);
30-
const { mutateAsync: uploadReceipts } = useUploadManyReceipts();
3129
const { mutateAsync: markPendingFinance } = useMarkPendingFinance(id);
3230
const { mutateAsync: leadershipApproveReimbursementRequest } = useLeadershipApproveReimbursementRequest(id);
3331
const user = useCurrentUser();
3432
const toast = useToast();
3533

3634
if (isError) return <ErrorPage error={error} />;
3735

38-
if (getIsLoading || editReimbursementRequestIsLoading || uploadReceiptsIsLoading || !reimbursementRequest)
39-
return <LoadingIndicator />;
36+
if (getIsLoading || !reimbursementRequest) return <LoadingIndicator />;
37+
38+
const isSubmitting = editReimbursementRequestIsLoading || uploadReceiptsIsLoading;
4039

4140
const onCancel = () => {
4241
history.goBack();
@@ -90,6 +89,7 @@ const EditReimbursementRequestPage: React.FC<{}> = () => {
9089
onSubmitData={onSubmitEditData}
9190
onExitEditPage={onCancel}
9291
onSubmitToFinance={onSubmitToFinance}
92+
isSubmitting={isSubmitting}
9393
/>
9494
);
9595
};

src/frontend/src/pages/FinancePage/EditReimbursementRequest/EditReimbursementRequestRenderedDefaultValues.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const EditReimbursementRequestRenderedDefaultValues: React.FC<{
1212
onSubmitData: (data: ReimbursementRequestDataSubmission) => Promise<string>;
1313
onExitEditPage: () => void;
1414
onSubmitToFinance?: (data: ReimbursementRequestDataSubmission) => Promise<void>;
15-
}> = ({ reimbursementRequest, onSubmitData, onExitEditPage, onSubmitToFinance }) => {
15+
isSubmitting?: boolean;
16+
}> = ({ reimbursementRequest, onSubmitData, onExitEditPage, onSubmitToFinance, isSubmitting }) => {
1617
const previousPage = `${routes.REIMBURSEMENT_REQUESTS}/my-requests/${reimbursementRequest.reimbursementRequestId}`;
1718
const isLeadershipApproved = isReimbursementRequestLeadershipApproved(reimbursementRequest);
1819

@@ -35,6 +36,7 @@ const EditReimbursementRequestRenderedDefaultValues: React.FC<{
3536
submitData={onSubmitData}
3637
isLeadershipApproved={isLeadershipApproved}
3738
onSubmitToFinance={onSubmitToFinance}
39+
isSubmitting={isSubmitting}
3840
defaultValues={{
3941
vendorId: reimbursementRequest.vendor.vendorId,
4042
indexCodeId: reimbursementRequest.indexCode.indexCodeId,

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import { Link as RouterLink } from 'react-router-dom';
5252
import { routes } from '../../../utils/routes';
5353
import { wbsNumComparator } from 'shared/src/validate-wbs';
5454
import { codeAndRefundSourceName, accountCodePipe } from '../../../utils/pipes';
55+
import { imagePreviewUrl } from '../../../utils/reimbursement-request.utils';
5556
import { useCreateVendor } from '../../../hooks/finance.hooks';
5657
import { useGetFinanceDelegates } from '../../../hooks/organizations.hooks';
5758
import LoadingIndicator from '../../../components/LoadingIndicator';
@@ -85,6 +86,7 @@ interface ReimbursementRequestFormViewProps {
8586
isEditing?: boolean;
8687
isLeadershipApproved?: boolean;
8788
onSubmitToFinance?: (data: ReimbursementRequestFormInput) => void;
89+
isSubmitting?: boolean;
8890
}
8991

9092
const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps> = ({
@@ -109,7 +111,8 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
109111
onFormExit,
110112
isEditing = false,
111113
isLeadershipApproved = false,
112-
onSubmitToFinance
114+
onSubmitToFinance,
115+
isSubmitting = false
113116
}) => {
114117
const [datePickerOpen, setDatePickerOpen] = useState(false);
115118
const [showAddRefundSourceModal, setShowAddRefundSourceModal] = useState(false);
@@ -742,8 +745,11 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
742745
<Grid container spacing={2}>
743746
{receiptFiles.map((receiptFile, index) => {
744747
let previewUrl = '';
748+
// if file is newly uploaded, show local preview, else show google drive preview
745749
if (receiptFile.file) {
746750
previewUrl = URL.createObjectURL(receiptFile.file);
751+
} else if (receiptFile.googleFileId) {
752+
previewUrl = imagePreviewUrl(receiptFile.googleFileId);
747753
}
748754

749755
return (
@@ -784,6 +790,7 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
784790
</IconButton>
785791
</Box>
786792
{previewUrl &&
793+
receiptFile.file &&
787794
(receiptFile.name.toLowerCase().endsWith('.png') ||
788795
receiptFile.name.toLowerCase().endsWith('.jpg') ||
789796
receiptFile.name.toLowerCase().endsWith('.jpeg')) && (
@@ -803,7 +810,21 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
803810
}}
804811
/>
805812
)}
806-
{!previewUrl && !receiptFile.googleFileId && (
813+
{previewUrl && receiptFile.googleFileId && (
814+
<Box
815+
component="iframe"
816+
src={previewUrl}
817+
title={receiptFile.name}
818+
sx={{
819+
width: '100%',
820+
height: '150px',
821+
border: 'none',
822+
borderRadius: '4px',
823+
bgcolor: 'rgba(0,0,0,0.2)'
824+
}}
825+
/>
826+
)}
827+
{!previewUrl && (
807828
<Typography variant="caption" color="text.secondary" sx={{ fontSize: '0.7rem' }}>
808829
Preview not available
809830
</Typography>
@@ -871,19 +892,19 @@ const ReimbursementRequestFormView: React.FC<ReimbursementRequestFormViewProps>
871892
<NERSuccessButton
872893
variant="contained"
873894
type="submit"
874-
disabled={!hasSecureSettingsSet}
895+
disabled={!hasSecureSettingsSet || isSubmitting}
875896
sx={{ background: '#dd524c', color: 'white', borderRadius: '10px' }}
876897
>
877-
{submitText}
898+
{isSubmitting ? 'Submitting...' : submitText}
878899
</NERSuccessButton>
879900
{(isHead(user.role) || (isEditing && isLeadershipApproved)) && onSubmitToFinance && (
880901
<NERSuccessButton
881902
variant="contained"
882903
onClick={handleSubmit(onSubmitToFinance)}
883-
disabled={!hasSecureSettingsSet}
904+
disabled={!hasSecureSettingsSet || isSubmitting}
884905
sx={{ background: '#dd524c', color: 'white', borderRadius: '10px' }}
885906
>
886-
Save and Submit to Finance
907+
{isSubmitting ? 'Submitting...' : 'Save and Submit to Finance'}
887908
</NERSuccessButton>
888909
)}
889910
</Box>

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ interface ReimbursementRequestFormProps {
4848
defaultValues?: ReimbursementRequestFormInput;
4949
isLeadershipApproved?: boolean;
5050
onSubmitToFinance?: (data: ReimbursementRequestDataSubmission) => Promise<void>;
51+
isSubmitting?: boolean;
5152
}
5253

5354
const RECEIPTS_REQUIRED = import.meta.env.VITE_RR_RECEIPT_REQUIREMENT || 'disabled';
@@ -138,7 +139,8 @@ const ReimbursementRequestForm: React.FC<ReimbursementRequestFormProps> = ({
138139
submitData,
139140
onFormExit,
140141
isLeadershipApproved = false,
141-
onSubmitToFinance
142+
onSubmitToFinance,
143+
isSubmitting = false
142144
}) => {
143145
const {
144146
handleSubmit,
@@ -363,6 +365,7 @@ const ReimbursementRequestForm: React.FC<ReimbursementRequestFormProps> = ({
363365
isEditing={!!defaultValues}
364366
isLeadershipApproved={isLeadershipApproved}
365367
onSubmitToFinance={onSubmitToFinanceWrapper}
368+
isSubmitting={isSubmitting}
366369
/>
367370
);
368371
};

0 commit comments

Comments
 (0)