Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 56 additions & 149 deletions packages/client/package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions packages/client/src/graphql/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export type MutationCreateStudyArgs = {

export type MutationCreateStudyDownloadArgs = {
downloadRequest: CreateStudyDownloadRequest;
textOnly?: InputMaybe<Scalars['Boolean']['input']>;
};


Expand Down
4 changes: 2 additions & 2 deletions packages/client/src/graphql/study/study.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ query getStudyDownloads($study: ID!) {
}
}

mutation createStudyDownload($downloadRequest: CreateStudyDownloadRequest!) {
createStudyDownload(downloadRequest: $downloadRequest) {
mutation createStudyDownload($downloadRequest: CreateStudyDownloadRequest!, $textOnly: Boolean!) {
createStudyDownload(downloadRequest: $downloadRequest, textOnly: $textOnly) {
_id,
status,
date
Expand Down
6 changes: 4 additions & 2 deletions packages/client/src/graphql/study/study.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export type GetStudyDownloadsQuery = { __typename?: 'Query', getStudyDownloads:

export type CreateStudyDownloadMutationVariables = Types.Exact<{
downloadRequest: Types.CreateStudyDownloadRequest;
textOnly: Types.Scalars['Boolean']['input'];
}>;


Expand Down Expand Up @@ -259,8 +260,8 @@ export type GetStudyDownloadsQueryHookResult = ReturnType<typeof useGetStudyDown
export type GetStudyDownloadsLazyQueryHookResult = ReturnType<typeof useGetStudyDownloadsLazyQuery>;
export type GetStudyDownloadsQueryResult = Apollo.QueryResult<GetStudyDownloadsQuery, GetStudyDownloadsQueryVariables>;
export const CreateStudyDownloadDocument = gql`
mutation createStudyDownload($downloadRequest: CreateStudyDownloadRequest!) {
createStudyDownload(downloadRequest: $downloadRequest) {
mutation createStudyDownload($downloadRequest: CreateStudyDownloadRequest!, $textOnly: Boolean!) {
createStudyDownload(downloadRequest: $downloadRequest, textOnly: $textOnly) {
_id
status
date
Expand All @@ -283,6 +284,7 @@ export type CreateStudyDownloadMutationFn = Apollo.MutationFunction<CreateStudyD
* const [createStudyDownloadMutation, { data, loading, error }] = useCreateStudyDownloadMutation({
* variables: {
* downloadRequest: // value for 'downloadRequest'
* textOnly: // value for 'textOnly'
* },
* });
*/
Expand Down
93 changes: 90 additions & 3 deletions packages/client/src/pages/studies/StudyControl.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
import { Typography, Box, IconButton } from '@mui/material';
import {
Typography,
Box,
IconButton,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Stack,
Checkbox,
FormControlLabel
} from '@mui/material';
import { useStudy } from '../../context/Study.context';
import { DataGrid, GridColDef, GridRowId } from '@mui/x-data-grid';
import DeleteIcon from '@mui/icons-material/DeleteOutlined';
import { GridActionsCellItem } from '@mui/x-data-grid-pro';
import { Study } from '../../graphql/graphql';
import { useCreateStudyDownloadMutation, useDeleteStudyMutation } from '../../graphql/study/study';
import { useEffect } from 'react';
import { useEffect, useState } from 'react';
import { useConfirmation } from '../../context/Confirmation.context';
import { useTranslation } from 'react-i18next';
import { useSnackbar } from '../../context/Snackbar.context';
Expand All @@ -19,7 +31,10 @@ export const StudyControl: React.FC = () => {
const { t } = useTranslation();
const { pushSnackbarMessage } = useSnackbar();

const [createDownloadMutation, createDownloadResults] = useCreateStudyDownloadMutation();
const [downloadConfirmationOpen, setDownloadConfirmationOpen] = useState<boolean>(false);
const [targetStudy, setTargetStudy] = useState<Study | null>(null);

const [_createDownloadMutation, createDownloadResults] = useCreateStudyDownloadMutation();

const handleDelete = async (id: GridRowId) => {
// Execute delete mutation
Expand All @@ -44,6 +59,9 @@ export const StudyControl: React.FC = () => {
}, [deleteStudyResults.called, deleteStudyResults.data, deleteStudyResults.error]);

const handleDownloadRequest = (study: Study) => {
setDownloadConfirmationOpen(true);
setTargetStudy(study);
/*
confirmation.pushConfirmationRequest({
title: t('components.studyDownload.downloadTitle'),
message: t('components.studyDownload.downloadDescription'),
Expand All @@ -58,6 +76,7 @@ export const StudyControl: React.FC = () => {
},
onCancel: () => {}
});
*/
};

// Share the results with the user
Expand Down Expand Up @@ -113,10 +132,78 @@ export const StudyControl: React.FC = () => {

return (
<>
{targetStudy && (
<DownloadConfirmation
open={downloadConfirmationOpen}
targetStudy={targetStudy}
close={() => setDownloadConfirmationOpen(false)}
/>
)}
<Typography variant="h3">{t('menu.studyControl')}</Typography>
<Box sx={{ maxWidth: '1000px', margin: 'auto' }}>
<DataGrid rows={studies || []} columns={columns} getRowId={(row: Study) => row._id} />
</Box>
</>
);
};

interface DownloadConfirmationProps {
open: boolean;
targetStudy: Study;
close: () => void;
}

const DownloadConfirmation: React.FC<DownloadConfirmationProps> = ({ open, targetStudy, close }) => {
const { t } = useTranslation();
const title = t('components.studyDownload.downloadTitle');
const message = t('components.studyDownload.downloadDescription');
const [createDownloadMutation, createDownloadResults] = useCreateStudyDownloadMutation();
const { pushSnackbarMessage } = useSnackbar();
const [textOnly, setTextOnly] = useState<boolean>(false);

// Share the results with the user
useEffect(() => {
if (createDownloadResults.data) {
pushSnackbarMessage(t('components.studyDownload.downloadStartedSuccess'), 'success');
} else if (createDownloadResults.error) {
pushSnackbarMessage(t('components.studyDownload.downloadFailed'), 'error');
}
}, [createDownloadResults.data, createDownloadResults.error]);

const handleConfirmation = () => {
createDownloadMutation({
variables: {
downloadRequest: {
study: targetStudy._id
},
textOnly
}
});
close();
};

const handleCancel = () => {
close();
};

return (
<Dialog sx={{ '& .MuiDialog-paper': { width: '80%', maxHeight: 435 } }} maxWidth="xs" open={open}>
<DialogTitle>{title}</DialogTitle>
<DialogContent>
<Stack>
<Typography>{message}</Typography>
<FormControlLabel
control={<Checkbox value={textOnly} onChange={(event) => setTextOnly(event.target.checked)} />}
label="Text Only"
/>
</Stack>
</DialogContent>
<DialogActions>
<Button autoFocus onClick={handleCancel}>
{t('common.cancel')}
</Button>
<Button onClick={handleConfirmation}> {t('common.ok')}</Button>
</DialogActions>
</Dialog>
);
};
Loading
Loading