synapse-react-client 4.0.43 → 4.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +29 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +48 -16
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/components/GridLoadingState.d.ts +2 -2
- package/dist/components/DataGrid/components/GridLoadingState.d.ts.map +1 -1
- package/dist/components/DataGrid/components/GridLoadingState.js +2 -2
- package/dist/components/DataGrid/components/GridLoadingState.js.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +2 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +11 -10
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.d.ts +10 -0
- package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.d.ts.map +1 -0
- package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.js +81 -0
- package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.js.map +1 -0
- package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.d.ts +9 -0
- package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.d.ts.map +1 -0
- package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.js +32 -0
- package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.js.map +1 -0
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts +0 -2
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js +74 -151
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/TanStackTable/TanStackTableUtils.d.ts.map +1 -1
- package/dist/components/TanStackTable/TanStackTableUtils.js +8 -5
- package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.d.ts +5 -0
- package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.d.ts.map +1 -0
- package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.js +20 -0
- package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.js.map +1 -0
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +183 -188
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.d.ts +25 -0
- package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.d.ts.map +1 -0
- package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.js +125 -0
- package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.js.map +1 -0
- package/dist/mocks/dataaccess/MockSubmission.d.ts +76 -0
- package/dist/mocks/dataaccess/MockSubmission.d.ts.map +1 -1
- package/dist/mocks/dataaccess/MockSubmission.js +108 -63
- package/dist/mocks/dataaccess/MockSubmission.js.map +1 -1
- package/dist/style/components/_submission-page.scss +0 -4
- package/dist/style/main.css +1 -1
- package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.d.ts +37 -0
- package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.d.ts.map +1 -0
- package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.js +35 -0
- package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.js.map +1 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.d.ts.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.js +21 -19
- package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts +2 -2
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +135 -135
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubmissionPage.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport { CancelDataAccessRequestConfirmationModal } from '@/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal'\nimport { ApproveSubmissionConfirmationModal } from '@/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal'\nimport { displayToast } from '@/components/ToastMessage'\nimport {\n useGetAccessRequirementACL,\n useGetAccessRequirements,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport useGetDataAccessSubmission from '@/synapse-queries/dataaccess/useDataAccessSubmission'\nimport { useGetThreadForSubmission } from '@/synapse-queries/forum/useThread'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user'\nimport { useGetUserAccessApproval } from '@/synapse-queries/dataaccess/useAccessApprovals'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport { Button, Grid, Skeleton, Stack, Typography } from '@mui/material'\nimport {\n ACCESS_TYPE,\n FileHandleAssociateType,\n ManagedACTAccessRequirement,\n Submission,\n SubmissionState,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport { isEmpty, toLower, upperFirst } from 'lodash-es'\nimport { Fragment, ReactNode, useMemo, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { SynapseErrorBoundary } from '../../error/ErrorBanner'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserOrTeamBadge from '../../UserOrTeamBadge/UserOrTeamBadge'\nimport { FileHandleLink } from '../../widgets/FileHandleLink'\nimport RejectDataAccessRequestModal from '../RejectDataAccessRequestModal'\nimport { DiscussionThread } from '@/components/Forum'\n\ndayjs.extend(duration)\n\nexport type SubmissionPageProps = {\n /** The ID of the submission to view */\n submissionId: string | number\n /** If true, display reviewer controls on the page */\n isReviewer: boolean // There is currently no API to check if a user has review permissions on a specific submission ID\n}\n\nconst THREAD_BODY =\n 'Use this thread to communicate with the reviewers about this access request.'\n\nfunction DataAccessSubmissionFileHandleLink(props: {\n submissionId: string\n fileHandleId: string\n}) {\n const { submissionId, fileHandleId } = props\n const fileHandleAssociation = useMemo(\n () => ({\n fileHandleId: fileHandleId,\n associateObjectId: submissionId,\n associateObjectType:\n FileHandleAssociateType.DataAccessSubmissionAttachment,\n }),\n [fileHandleId, submissionId],\n )\n return (\n <FileHandleLink\n key={fileHandleId}\n showDownloadIcon={true}\n fileHandleAssociation={fileHandleAssociation}\n />\n )\n}\n\ntype AccessRequirementWikiType = {\n accessRequirementId: string\n}\n\nfunction AccessRequirementWiki(props: AccessRequirementWikiType) {\n const { data: wikiPageKey } = useGetAccessRequirementWikiPageKey(\n props.accessRequirementId,\n {\n throwOnError: true,\n },\n )\n\n return wikiPageKey ? (\n <div className=\"AccessRequirementWikiContainer\">\n <div className=\"AccessRequirementWikiContent\">\n <Typography variant=\"headline1\">Access Requirement</Typography>\n <hr />\n <MarkdownSynapse\n wikiId={wikiPageKey?.wikiPageId}\n ownerId={wikiPageKey?.ownerObjectId}\n objectType={wikiPageKey?.ownerObjectType}\n />\n </div>\n </div>\n ) : (\n <Skeleton width={'100%'} height={'600px'} />\n )\n}\n\n/**\n * returns true iff the userId is a requester and/or listed on the accessor changes on the submission.\n * @param userId\n * @param submission\n */\nfunction isRequesterOnSubmission(userId: string, submission: Submission) {\n return (\n submission.submittedBy === userId ||\n Boolean(submission.accessorChanges.find(acc => acc.userId === userId))\n )\n}\n\n/**\n * Page for a Data Access Submission. Supports the following user types:\n * - ACT member or other designated reviewer can view, and choose to approve or reject.\n * - Data Access Request submitter can view and modify their own submission.\n * - Data Access Request requester (who is not a submitter) can view their own submission.\n */\nexport default function SubmissionPage(props: SubmissionPageProps) {\n const { submissionId, isReviewer } = props\n const [showRejectionDialog, setShowRejectionDialog] = useState(false)\n\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n\n const { data: submission, isLoading: isLoadingSubmission } =\n useGetDataAccessSubmission(submissionId, {\n throwOnError: true,\n })\n const isRequester = Boolean(\n submission &&\n currentUserProfile &&\n isRequesterOnSubmission(currentUserProfile.ownerId, submission),\n )\n\n const { data: accessApproval, isLoading: isLoadingAccessApproval } =\n useGetUserAccessApproval(String(submissionId), {\n enabled:\n isRequester &&\n submission &&\n submission.state === SubmissionState.APPROVED,\n })\n\n const isExpired = Boolean(\n accessApproval && dayjs(accessApproval.expiredOn).isBefore(dayjs()),\n )\n\n const isSubmitter =\n submission && submission.submittedBy === currentUserProfile?.ownerId\n\n const { data: accessRequirement } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n parseInt(submission?.accessRequirementId!),\n { enabled: !!submission },\n )\n\n const { data: acl, isLoading: isLoadingACL } = useGetAccessRequirementACL(\n submission?.accessRequirementId!,\n { enabled: !!submission, throwOnError: true },\n )\n\n const { data: thread } = useGetThreadForSubmission(submissionId)\n\n const [showUpdateRequestDialog, setShowUpdateRequestDialog] = useState(false)\n const [\n showCancelRequestConfirmationDialog,\n setShowCancelRequestConfirmationDialog,\n ] = useState(false)\n const [showApprovalConfirmation, setShowApprovalConfirmation] =\n useState(false)\n\n const navigate = useNavigate()\n\n const reviewerIds = acl?.resourceAccess\n .filter(ra => ra.accessType.includes(ACCESS_TYPE.REVIEW_SUBMISSIONS))\n .map(ra => ra.principalId)\n\n const displayedSubmissionState: ReactNode = useMemo(() => {\n if (submission && !isLoadingAccessApproval) {\n if (isExpired) {\n return 'Expired'\n }\n return submission.state\n }\n return <Skeleton width={100} />\n }, [isExpired, isLoadingAccessApproval, submission])\n\n return (\n <Grid container={true} spacing={4} className=\"SubmissionPage\">\n {showUpdateRequestDialog && accessRequirement && (\n <AccessRequirementList\n renderAsModal={true}\n accessRequirementFromProps={[accessRequirement]}\n onHide={() => setShowUpdateRequestDialog(false)}\n onSubmissionCreated={submissionId => {\n setShowUpdateRequestDialog(false)\n displayToast('Data access request submitted', 'success', {\n primaryButtonConfig: {\n text: 'View Request',\n onClick: () => {\n navigate('/submissions/' + submissionId)\n },\n },\n })\n }}\n />\n )}\n <ApproveSubmissionConfirmationModal\n open={showApprovalConfirmation}\n onClose={() => {\n setShowApprovalConfirmation(false)\n }}\n submissionId={String(submissionId)}\n />\n {showRejectionDialog && (\n <RejectDataAccessRequestModal\n // Previously, we used a 'key' prop to reset the modal form when it was opened,\n // but removing the key and re-rendering the JSX achieves the same functionality in a more straightforward way.\n submissionId={submissionId}\n open={showRejectionDialog}\n onClose={() => setShowRejectionDialog(false)}\n />\n )}\n <Grid\n className=\"SubmissionSummary\"\n size={{\n xs: 12,\n sm: 4,\n lg: 3,\n }}\n >\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Status\n </Typography>\n <Typography\n variant=\"headline3\"\n sx={{ textTransform: 'uppercase' }}\n gutterBottom\n >\n {displayedSubmissionState}\n </Typography>\n <br />\n {isLoadingSubmission && <Skeleton width={200} />}\n {submission &&\n isReviewer &&\n submission.state === SubmissionState.SUBMITTED && (\n <div className=\"ButtonContainer\">\n <Button\n onClick={() => {\n setShowApprovalConfirmation(true)\n }}\n color=\"success\"\n variant=\"contained\"\n >\n Approve\n </Button>\n <Button\n onClick={() => {\n setShowRejectionDialog(true)\n }}\n color=\"error\"\n variant=\"contained\"\n >\n Reject\n </Button>\n </div>\n )}\n\n {submission && isSubmitter && (\n <div className=\"ButtonContainer\">\n <CancelDataAccessRequestConfirmationModal\n open={showCancelRequestConfirmationDialog}\n submissionId={String(submissionId)}\n accessRequirementId={submission?.accessRequirementId || ''}\n onClose={() => setShowCancelRequestConfirmationDialog(false)}\n />\n {submission.state === SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowCancelRequestConfirmationDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n Cancel Request\n </Button>\n )}\n {submission.state !== SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowUpdateRequestDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n {submission.state === SubmissionState.APPROVED\n ? 'Update'\n : 'Modify'}{' '}\n Request\n </Button>\n )}\n </div>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Access Requirement Name\n </Typography>\n\n <Typography variant=\"smallText1\" gutterBottom>\n {accessRequirement?.name ?? <Skeleton width={100} />}\n </Typography>\n <br />\n\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Assigned Reviewer\n </Typography>\n <Stack>\n {isLoadingACL && <Skeleton width={100} />}\n {!isLoadingACL &&\n !isEmpty(reviewerIds) &&\n reviewerIds!.map(id => {\n return <UserOrTeamBadge key={id} principalId={id} />\n })}\n {!isLoadingACL && isEmpty(reviewerIds) && (\n <UserOrTeamBadge principalId={ACT_TEAM_ID} />\n )}\n </Stack>\n <br />\n </>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Conditions\n </Typography>\n {accessRequirement ? (\n <Typography variant=\"smallText1\" component={'div'} gutterBottom>\n <ul>\n <li>\n Expiration period:{' '}\n {dayjs\n .duration({\n milliseconds: accessRequirement.expirationPeriod,\n })\n .asDays()}{' '}\n day(s)\n {accessRequirement.expirationPeriod === 0 && ' (no expiration)'}\n </li>\n\n {accessRequirement.isCertifiedUserRequired && (\n <li>User must be Certified</li>\n )}\n {accessRequirement.isValidatedProfileRequired && (\n <li>User Profile must be Validated</li>\n )}\n {accessRequirement.isDUCRequired && <li>DUC is required</li>}\n {accessRequirement.isIDURequired && <li>IDU is required</li>}\n {accessRequirement.isIDUPublic && (\n <li>IDU will be made public</li>\n )}\n {accessRequirement.isIRBApprovalRequired && (\n <li>IRB Approval is required</li>\n )}\n {accessRequirement.areOtherAttachmentsRequired && (\n <li>Other attachments are required</li>\n )}\n </ul>\n </Typography>\n ) : (\n <Skeleton width={100} />\n )}\n <br />\n <div className=\"SubmissionSummaryGrid\">\n <Typography variant=\"dataFieldKey\">Submitted By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.submittedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography variant=\"dataFieldKey\">Submitted On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.submittedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\">Modified By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.modifiedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n <Typography variant=\"dataFieldKey\">Modified On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.modifiedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Data Requesters\n {`${submission ? ` (${submission.accessorChanges.length})` : ''}`}\n </Typography>\n {submission ? (\n submission.accessorChanges.map(accessorChange => (\n <Fragment key={accessorChange.userId}>\n <Typography className=\"Key DataAccessor\" variant=\"smallText1\">\n <span style={{ whiteSpace: 'nowrap' }}>\n <UserBadge\n key={accessorChange.userId}\n userId={accessorChange.userId}\n />\n </span>\n </Typography>\n <Typography className=\"Value DataAccessor\" variant=\"smallText1\">\n {upperFirst(\n toLower(\n accessorChange.type.substring(\n 0,\n accessorChange.type.indexOf('_'),\n ),\n ),\n )}\n </Typography>\n </Fragment>\n ))\n ) : (\n <Skeleton width={100} />\n )}\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Institution\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot.institution\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Project Lead\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot.projectLead\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </div>\n </Grid>\n <Grid\n size={{\n xs: 12,\n sm: 8,\n lg: 9,\n }}\n >\n <Stack sx={{ gap: 2 }}>\n <SynapseErrorBoundary>\n {submission ? (\n <AccessRequirementWiki\n accessRequirementId={submission.accessRequirementId}\n />\n ) : (\n <></>\n )}\n </SynapseErrorBoundary>\n {submission?.rejectedReason && (\n <section>\n <Typography variant=\"headline1\" gutterBottom>\n Reason for rejection given by reviewer\n </Typography>\n <hr />\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {submission.rejectedReason}\n </Typography>\n </section>\n )}\n <section>\n <Typography variant=\"headline1\">\n Contents of the Access Request\n <hr />\n </Typography>\n <Stack\n sx={{\n gap: 2,\n }}\n >\n {submission?.researchProjectSnapshot\n ?.intendedDataUseStatement && (\n <section>\n <Typography variant=\"headline2\" gutterBottom>\n Intended Data Use Statement\n </Typography>\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {\n submission.researchProjectSnapshot\n .intendedDataUseStatement\n }\n </Typography>\n </section>\n )}\n <Typography variant=\"headline2\" gutterBottom>\n Documents\n </Typography>\n {submission?.ducFileHandleId && (\n <section>\n <Typography variant=\"smallText2\">\n Data Use Certificate (DUC)\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.ducFileHandleId}\n />\n </section>\n )}\n {submission?.irbFileHandleId && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n IRB Approval Letter\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.irbFileHandleId}\n />\n </section>\n )}\n {submission?.attachments && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n Other Attachments\n </Typography>\n {submission.attachments.map(fileHandleId => (\n <Fragment key={fileHandleId}>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={fileHandleId}\n />\n <br />\n </Fragment>\n ))}\n </section>\n )}\n </Stack>\n </section>\n {thread?.id && (\n <DiscussionThread\n threadId={thread.id}\n limit={25}\n emptyBodyContent={THREAD_BODY}\n />\n )}\n </Stack>\n </Grid>\n </Grid>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SubmissionPage.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport { CancelDataAccessRequestConfirmationModal } from '@/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal'\nimport { ApproveSubmissionConfirmationModal } from '@/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal'\nimport { displayToast } from '@/components/ToastMessage'\nimport {\n useGetAccessRequirementACL,\n useGetAccessRequirements,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport useGetDataAccessSubmission from '@/synapse-queries/dataaccess/useDataAccessSubmission'\nimport { useGetThreadForSubmission } from '@/synapse-queries/forum/useThread'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user'\nimport { useGetUserAccessApproval } from '@/synapse-queries/dataaccess/useAccessApprovals'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Button,\n Grid,\n Skeleton,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n ACCESS_TYPE,\n ManagedACTAccessRequirement,\n Submission,\n SubmissionState,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport { isEmpty, toLower, upperFirst } from 'lodash-es'\nimport { Fragment, ReactNode, useMemo, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { SynapseErrorBoundary } from '../../error/ErrorBanner'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserOrTeamBadge from '../../UserOrTeamBadge/UserOrTeamBadge'\nimport { DataAccessSubmissionFileHandleLink } from './DataAccessSubmissionFileHandleLink'\nimport { SubmissionSchemaAnswers } from './SubmissionSchemaAnswers'\nimport RejectDataAccessRequestModal from '../RejectDataAccessRequestModal'\nimport { DiscussionThread } from '@/components/Forum'\n\ndayjs.extend(duration)\n\nexport type SubmissionPageProps = {\n /** The ID of the submission to view */\n submissionId: string | number\n /** If true, display reviewer controls on the page */\n isReviewer: boolean // There is currently no API to check if a user has review permissions on a specific submission ID\n}\n\nconst THREAD_BODY =\n 'Use this thread to communicate with the reviewers about this access request.'\n\ntype AccessRequirementWikiType = {\n accessRequirementId: string\n}\n\nfunction AccessRequirementWiki(props: AccessRequirementWikiType) {\n const { data: wikiPageKey } = useGetAccessRequirementWikiPageKey(\n props.accessRequirementId,\n {\n throwOnError: true,\n },\n )\n\n return wikiPageKey ? (\n <Accordion\n className=\"AccessRequirementWikiContainer\"\n disableGutters\n square\n variant=\"outlined\"\n slotProps={{ transition: { unmountOnExit: true } }}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"headline1\" component=\"h2\">\n Access Requirement Wiki\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <MarkdownSynapse\n wikiId={wikiPageKey?.wikiPageId}\n ownerId={wikiPageKey?.ownerObjectId}\n objectType={wikiPageKey?.ownerObjectType}\n />\n </AccordionDetails>\n </Accordion>\n ) : (\n <Skeleton width={'100%'} height={'64px'} />\n )\n}\n\n/**\n * returns true iff the userId is a requester and/or listed on the accessor changes on the submission.\n * @param userId\n * @param submission\n */\nfunction isRequesterOnSubmission(userId: string, submission: Submission) {\n return (\n submission.submittedBy === userId ||\n Boolean(submission.accessorChanges.find(acc => acc.userId === userId))\n )\n}\n\n/**\n * Page for a Data Access Submission. Supports the following user types:\n * - ACT member or other designated reviewer can view, and choose to approve or reject.\n * - Data Access Request submitter can view and modify their own submission.\n * - Data Access Request requester (who is not a submitter) can view their own submission.\n */\nexport default function SubmissionPage(props: SubmissionPageProps) {\n const { submissionId, isReviewer } = props\n const [showRejectionDialog, setShowRejectionDialog] = useState(false)\n\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n\n const { data: submission, isLoading: isLoadingSubmission } =\n useGetDataAccessSubmission(submissionId, {\n throwOnError: true,\n })\n const isRequester = Boolean(\n submission &&\n currentUserProfile &&\n isRequesterOnSubmission(currentUserProfile.ownerId, submission),\n )\n\n const { data: accessApproval, isLoading: isLoadingAccessApproval } =\n useGetUserAccessApproval(String(submissionId), {\n enabled:\n isRequester &&\n submission &&\n submission.state === SubmissionState.APPROVED,\n })\n\n const isExpired = Boolean(\n accessApproval && dayjs(accessApproval.expiredOn).isBefore(dayjs()),\n )\n\n const isSubmitter =\n submission && submission.submittedBy === currentUserProfile?.ownerId\n\n const { data: accessRequirement } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n parseInt(submission?.accessRequirementId!),\n { enabled: !!submission },\n )\n\n const { data: acl, isLoading: isLoadingACL } = useGetAccessRequirementACL(\n submission?.accessRequirementId!,\n { enabled: !!submission, throwOnError: true },\n )\n\n const { data: thread } = useGetThreadForSubmission(submissionId)\n\n const [showUpdateRequestDialog, setShowUpdateRequestDialog] = useState(false)\n const [\n showCancelRequestConfirmationDialog,\n setShowCancelRequestConfirmationDialog,\n ] = useState(false)\n const [showApprovalConfirmation, setShowApprovalConfirmation] =\n useState(false)\n\n const navigate = useNavigate()\n\n const reviewerIds = acl?.resourceAccess\n .filter(ra => ra.accessType.includes(ACCESS_TYPE.REVIEW_SUBMISSIONS))\n .map(ra => ra.principalId)\n\n const displayedSubmissionState: ReactNode = useMemo(() => {\n if (submission && !isLoadingAccessApproval) {\n if (isExpired) {\n return 'Expired'\n }\n return submission.state\n }\n return <Skeleton width={100} />\n }, [isExpired, isLoadingAccessApproval, submission])\n\n const hasSchemaAnswers =\n !!submission?.schemaData && Object.keys(submission.schemaData).length > 0\n const hasDocuments = Boolean(\n submission?.ducFileHandleId ||\n submission?.irbFileHandleId ||\n submission?.attachments,\n )\n // A schema-driven submission may carry its documents only as form answers, so an empty\n // Documents heading would sit directly above them.\n const showDocumentsHeading = hasDocuments || !submission?.schemaData\n\n return (\n <Grid container={true} spacing={4} className=\"SubmissionPage\">\n {showUpdateRequestDialog && accessRequirement && (\n <AccessRequirementList\n renderAsModal={true}\n accessRequirementFromProps={[accessRequirement]}\n onHide={() => setShowUpdateRequestDialog(false)}\n onSubmissionCreated={submissionId => {\n setShowUpdateRequestDialog(false)\n displayToast('Data access request submitted', 'success', {\n primaryButtonConfig: {\n text: 'View Request',\n onClick: () => {\n navigate('/submissions/' + submissionId)\n },\n },\n })\n }}\n />\n )}\n <ApproveSubmissionConfirmationModal\n open={showApprovalConfirmation}\n onClose={() => {\n setShowApprovalConfirmation(false)\n }}\n submissionId={String(submissionId)}\n />\n {showRejectionDialog && (\n <RejectDataAccessRequestModal\n // Previously, we used a 'key' prop to reset the modal form when it was opened,\n // but removing the key and re-rendering the JSX achieves the same functionality in a more straightforward way.\n submissionId={submissionId}\n open={showRejectionDialog}\n onClose={() => setShowRejectionDialog(false)}\n />\n )}\n <Grid\n className=\"SubmissionSummary\"\n size={{\n xs: 12,\n sm: 4,\n lg: 3,\n }}\n >\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Status\n </Typography>\n <Typography\n variant=\"headline3\"\n sx={{ textTransform: 'uppercase' }}\n gutterBottom\n >\n {displayedSubmissionState}\n </Typography>\n <br />\n {isLoadingSubmission && <Skeleton width={200} />}\n {submission &&\n isReviewer &&\n submission.state === SubmissionState.SUBMITTED && (\n <div className=\"ButtonContainer\">\n <Button\n onClick={() => {\n setShowApprovalConfirmation(true)\n }}\n color=\"success\"\n variant=\"contained\"\n >\n Approve\n </Button>\n <Button\n onClick={() => {\n setShowRejectionDialog(true)\n }}\n color=\"error\"\n variant=\"contained\"\n >\n Reject\n </Button>\n </div>\n )}\n\n {submission && isSubmitter && (\n <div className=\"ButtonContainer\">\n <CancelDataAccessRequestConfirmationModal\n open={showCancelRequestConfirmationDialog}\n submissionId={String(submissionId)}\n accessRequirementId={submission?.accessRequirementId || ''}\n onClose={() => setShowCancelRequestConfirmationDialog(false)}\n />\n {submission.state === SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowCancelRequestConfirmationDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n Cancel Request\n </Button>\n )}\n {submission.state !== SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowUpdateRequestDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n {submission.state === SubmissionState.APPROVED\n ? 'Update'\n : 'Modify'}{' '}\n Request\n </Button>\n )}\n </div>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Access Requirement Name\n </Typography>\n\n <Typography variant=\"smallText1\" gutterBottom>\n {accessRequirement?.name ?? <Skeleton width={100} />}\n </Typography>\n <br />\n\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Assigned Reviewer\n </Typography>\n <Stack>\n {isLoadingACL && <Skeleton width={100} />}\n {!isLoadingACL &&\n !isEmpty(reviewerIds) &&\n reviewerIds!.map(id => {\n return <UserOrTeamBadge key={id} principalId={id} />\n })}\n {!isLoadingACL && isEmpty(reviewerIds) && (\n <UserOrTeamBadge principalId={ACT_TEAM_ID} />\n )}\n </Stack>\n <br />\n </>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Conditions\n </Typography>\n {accessRequirement ? (\n <Typography variant=\"smallText1\" component={'div'} gutterBottom>\n <ul>\n <li>\n Expiration period:{' '}\n {dayjs\n .duration({\n milliseconds: accessRequirement.expirationPeriod,\n })\n .asDays()}{' '}\n day(s)\n {accessRequirement.expirationPeriod === 0 && ' (no expiration)'}\n </li>\n\n {accessRequirement.isCertifiedUserRequired && (\n <li>User must be Certified</li>\n )}\n {accessRequirement.isValidatedProfileRequired && (\n <li>User Profile must be Validated</li>\n )}\n {accessRequirement.isDUCRequired && <li>DUC is required</li>}\n {accessRequirement.isIDURequired && <li>IDU is required</li>}\n {accessRequirement.isIDUPublic && (\n <li>IDU will be made public</li>\n )}\n {accessRequirement.isIRBApprovalRequired && (\n <li>IRB Approval is required</li>\n )}\n {accessRequirement.areOtherAttachmentsRequired && (\n <li>Other attachments are required</li>\n )}\n </ul>\n </Typography>\n ) : (\n <Skeleton width={100} />\n )}\n <br />\n <div className=\"SubmissionSummaryGrid\">\n <Typography variant=\"dataFieldKey\">Submitted By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.submittedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography variant=\"dataFieldKey\">Submitted On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.submittedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\">Modified By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.modifiedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n <Typography variant=\"dataFieldKey\">Modified On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.modifiedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Data Requesters\n {`${submission ? ` (${submission.accessorChanges.length})` : ''}`}\n </Typography>\n {submission ? (\n submission.accessorChanges.map(accessorChange => (\n <Fragment key={accessorChange.userId}>\n <Typography className=\"Key DataAccessor\" variant=\"smallText1\">\n <span style={{ whiteSpace: 'nowrap' }}>\n <UserBadge\n key={accessorChange.userId}\n userId={accessorChange.userId}\n />\n </span>\n </Typography>\n <Typography className=\"Value DataAccessor\" variant=\"smallText1\">\n {upperFirst(\n toLower(\n accessorChange.type.substring(\n 0,\n accessorChange.type.indexOf('_'),\n ),\n ),\n )}\n </Typography>\n </Fragment>\n ))\n ) : (\n <Skeleton width={100} />\n )}\n {(!submission || submission.researchProjectSnapshot) && (\n <>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Institution\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot?.institution\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Project Lead\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot?.projectLead\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n </div>\n </Grid>\n <Grid\n size={{\n xs: 12,\n sm: 8,\n lg: 9,\n }}\n >\n <Stack sx={{ gap: 2 }}>\n <SynapseErrorBoundary>\n {submission ? (\n <AccessRequirementWiki\n accessRequirementId={submission.accessRequirementId}\n />\n ) : (\n <></>\n )}\n </SynapseErrorBoundary>\n {submission?.rejectedReason && (\n <section>\n <Typography variant=\"headline1\" gutterBottom>\n Reason for rejection given by reviewer\n </Typography>\n <hr />\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {submission.rejectedReason}\n </Typography>\n </section>\n )}\n <section>\n <Typography variant=\"headline1\">\n Contents of the Access Request\n <hr />\n </Typography>\n <Stack\n sx={{\n gap: 2,\n }}\n >\n {submission?.researchProjectSnapshot\n ?.intendedDataUseStatement && (\n <section>\n <Typography variant=\"headline2\" gutterBottom>\n Intended Data Use Statement\n </Typography>\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {\n submission.researchProjectSnapshot\n .intendedDataUseStatement\n }\n </Typography>\n </section>\n )}\n {showDocumentsHeading && (\n <Typography variant=\"headline2\" gutterBottom>\n Documents\n </Typography>\n )}\n {submission?.ducFileHandleId && (\n <section>\n <Typography variant=\"smallText2\">\n Data Use Certificate (DUC)\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.ducFileHandleId}\n />\n </section>\n )}\n {submission?.irbFileHandleId && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n IRB Approval Letter\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.irbFileHandleId}\n />\n </section>\n )}\n {submission?.attachments && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n Other Attachments\n </Typography>\n {submission.attachments.map(fileHandleId => (\n <Fragment key={fileHandleId}>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={fileHandleId}\n />\n <br />\n </Fragment>\n ))}\n </section>\n )}\n {submission && hasSchemaAnswers && (\n <SubmissionSchemaAnswers submission={submission} />\n )}\n </Stack>\n </section>\n {thread?.id && (\n <DiscussionThread\n threadId={thread.id}\n limit={25}\n emptyBodyContent={THREAD_BODY}\n />\n )}\n </Stack>\n </Grid>\n </Grid>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GeneratedSubmissionForm } from '@/synapse-queries/dataaccess/useGeneratedSubmissionForm';
|
|
2
|
+
import { Submission } from '@sage-bionetworks/synapse-types';
|
|
3
|
+
export declare const NO_RESPONSE_TEXT = "No response";
|
|
4
|
+
export declare const OTHER_RESPONSES_TITLE = "Other responses";
|
|
5
|
+
export type SubmissionSchemaAnswerListProps = {
|
|
6
|
+
submissionId: string;
|
|
7
|
+
schemaData: Record<string, unknown>;
|
|
8
|
+
/** The generated form to group and label answers by. Without it, answers are listed by key. */
|
|
9
|
+
form: GeneratedSubmissionForm | undefined;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Answers grouped and labelled by the steps of `form`. Answers the form does not place in a step
|
|
13
|
+
* are listed under {@link OTHER_RESPONSES_TITLE} so a reviewer never misses submitted data.
|
|
14
|
+
*/
|
|
15
|
+
export declare function SubmissionSchemaAnswerList(props: SubmissionSchemaAnswerListProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export type SubmissionSchemaAnswersProps = {
|
|
17
|
+
submission: Submission;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Read-only view of a submission's `schemaData`, grouped and labelled by the steps of the
|
|
21
|
+
* FormTemplate version the submission was made against. If that form cannot be generated, the
|
|
22
|
+
* error is shown alongside the answers listed by key.
|
|
23
|
+
*/
|
|
24
|
+
export declare function SubmissionSchemaAnswers(props: SubmissionSchemaAnswersProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=SubmissionSchemaAnswers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmissionSchemaAnswers.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EAExB,MAAM,yDAAyD,CAAA;AAOhE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAI5D,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAC7C,eAAO,MAAM,qBAAqB,oBAAoB,CAAA;AA0ItD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,+FAA+F;IAC/F,IAAI,EAAE,uBAAuB,GAAG,SAAS,CAAA;CAC1C,CAAA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,2CAyCvC;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,2CAoB1E"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ErrorBanner as e } from "../../error/ErrorBanner.js";
|
|
2
|
+
import { SUBMISSION_CONTEXT_PROPERTY as t, listResolvedSchemaProperties as n } from "../../../utils/jsonschema/submissionContext.js";
|
|
3
|
+
import { useGeneratedSubmissionForm as r } from "../../../synapse-queries/dataaccess/useGeneratedSubmissionForm.js";
|
|
4
|
+
import { detectFieldType as i } from "../../FormTemplateEditor/schemaFieldUtils.js";
|
|
5
|
+
import { DataAccessSubmissionFileHandleLink as a } from "./DataAccessSubmissionFileHandleLink.js";
|
|
6
|
+
import { useMemo as o } from "react";
|
|
7
|
+
import { Skeleton as s, Stack as c, Typography as l } from "@mui/material";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
//#region src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx
|
|
10
|
+
var f = "No response", p = "Other responses", m = /^\d+$/, h = {};
|
|
11
|
+
function g(e) {
|
|
12
|
+
return e == null || e === "" || Array.isArray(e) && e.length === 0;
|
|
13
|
+
}
|
|
14
|
+
function _(e) {
|
|
15
|
+
return (typeof e == "string" || typeof e == "number") && m.test(String(e));
|
|
16
|
+
}
|
|
17
|
+
function v(e, t) {
|
|
18
|
+
let n = e?.oneOf?.find((e) => typeof e == "object" && e.const === t);
|
|
19
|
+
return n?.title ? n.title : typeof t == "boolean" ? t ? "Yes" : "No" : typeof t == "object" ? JSON.stringify(t) : String(t);
|
|
20
|
+
}
|
|
21
|
+
function y(e) {
|
|
22
|
+
let { submissionId: t, value: n, subSchema: r } = e;
|
|
23
|
+
if (g(n)) return /* @__PURE__ */ u(l, {
|
|
24
|
+
variant: "body1",
|
|
25
|
+
color: "text.secondary",
|
|
26
|
+
children: f
|
|
27
|
+
});
|
|
28
|
+
if (i(r) === "file" && _(n)) return /* @__PURE__ */ u(a, {
|
|
29
|
+
submissionId: t,
|
|
30
|
+
fileHandleId: String(n)
|
|
31
|
+
});
|
|
32
|
+
let o = r?.items;
|
|
33
|
+
return /* @__PURE__ */ u(l, {
|
|
34
|
+
variant: "body1",
|
|
35
|
+
style: { whiteSpace: "pre-line" },
|
|
36
|
+
children: Array.isArray(n) ? n.map((e) => v(o, e)).join(", ") : v(r, n)
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function b(e, t, n) {
|
|
40
|
+
return {
|
|
41
|
+
propertyKey: e,
|
|
42
|
+
label: n ?? t?.title ?? e,
|
|
43
|
+
subSchema: t
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function x({ jsonSchema: e, uiSchema: t }) {
|
|
47
|
+
return {
|
|
48
|
+
title: String(e.title ?? ""),
|
|
49
|
+
description: e.description,
|
|
50
|
+
fields: (t["ui:order"] ?? []).map((n) => b(n, e.properties?.[n], t[n]?.["ui:title"]))
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function S(e, r) {
|
|
54
|
+
let i = e ? e.steps.map(x) : [], a = new Set([t, ...i.flatMap((e) => e.fields.map((e) => e.propertyKey))]), o = new Map(e ? n(e.schema).map((e) => [e.propertyKey, e]) : []), s = Object.keys(r).filter((e) => !a.has(e)).map((e) => b(e, o.get(e)?.subSchema));
|
|
55
|
+
return s.length > 0 ? [...i, {
|
|
56
|
+
title: p,
|
|
57
|
+
fields: s
|
|
58
|
+
}] : i;
|
|
59
|
+
}
|
|
60
|
+
function C(e) {
|
|
61
|
+
let { submissionId: t, schemaData: n, form: r } = e;
|
|
62
|
+
return /* @__PURE__ */ u(c, {
|
|
63
|
+
sx: { gap: 4 },
|
|
64
|
+
children: o(() => S(r, n), [r, n]).map((e, r) => /* @__PURE__ */ d(c, {
|
|
65
|
+
component: "section",
|
|
66
|
+
sx: { gap: 2 },
|
|
67
|
+
children: [/* @__PURE__ */ d(c, {
|
|
68
|
+
sx: { gap: .5 },
|
|
69
|
+
children: [/* @__PURE__ */ u(l, {
|
|
70
|
+
variant: "headline3",
|
|
71
|
+
children: e.title
|
|
72
|
+
}), e.description && /* @__PURE__ */ u(l, {
|
|
73
|
+
variant: "body1",
|
|
74
|
+
color: "text.secondary",
|
|
75
|
+
children: e.description
|
|
76
|
+
})]
|
|
77
|
+
}), /* @__PURE__ */ u(c, {
|
|
78
|
+
component: "dl",
|
|
79
|
+
sx: {
|
|
80
|
+
gap: 2,
|
|
81
|
+
m: 0
|
|
82
|
+
},
|
|
83
|
+
children: e.fields.map((e) => /* @__PURE__ */ d(c, {
|
|
84
|
+
sx: { gap: .5 },
|
|
85
|
+
children: [/* @__PURE__ */ u(l, {
|
|
86
|
+
variant: "smallText2",
|
|
87
|
+
component: "dt",
|
|
88
|
+
children: e.label
|
|
89
|
+
}), /* @__PURE__ */ u(l, {
|
|
90
|
+
component: "dd",
|
|
91
|
+
sx: { m: 0 },
|
|
92
|
+
children: /* @__PURE__ */ u(y, {
|
|
93
|
+
submissionId: t,
|
|
94
|
+
value: n[e.propertyKey],
|
|
95
|
+
subSchema: e.subSchema
|
|
96
|
+
})
|
|
97
|
+
})]
|
|
98
|
+
}, e.propertyKey))
|
|
99
|
+
})]
|
|
100
|
+
}, r))
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function w(t) {
|
|
104
|
+
let { submission: n } = t, i = n.schemaData ?? h, { form: a, isLoading: o, error: f } = r(n);
|
|
105
|
+
return /* @__PURE__ */ d(c, {
|
|
106
|
+
component: "section",
|
|
107
|
+
sx: { gap: 2 },
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ u(l, {
|
|
110
|
+
variant: "headline2",
|
|
111
|
+
children: "Form Responses"
|
|
112
|
+
}),
|
|
113
|
+
f && /* @__PURE__ */ u(e, { error: f }),
|
|
114
|
+
o ? /* @__PURE__ */ u(s, { width: 300 }) : /* @__PURE__ */ u(C, {
|
|
115
|
+
submissionId: n.id,
|
|
116
|
+
schemaData: i,
|
|
117
|
+
form: a
|
|
118
|
+
})
|
|
119
|
+
]
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { f as NO_RESPONSE_TEXT, p as OTHER_RESPONSES_TITLE, C as SubmissionSchemaAnswerList, w as SubmissionSchemaAnswers };
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=SubmissionSchemaAnswers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmissionSchemaAnswers.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/error/ErrorBanner'\nimport { detectFieldType } from '@/components/FormTemplateEditor/schemaFieldUtils'\nimport {\n GeneratedSubmissionForm,\n useGeneratedSubmissionForm,\n} from '@/synapse-queries/dataaccess/useGeneratedSubmissionForm'\nimport {\n listResolvedSchemaProperties,\n SUBMISSION_CONTEXT_PROPERTY,\n} from '@/utils/jsonschema/submissionContext'\nimport { Skeleton, Stack, Typography } from '@mui/material'\nimport { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport { Submission } from '@sage-bionetworks/synapse-types'\nimport { ReactNode, useMemo } from 'react'\nimport { DataAccessSubmissionFileHandleLink } from './DataAccessSubmissionFileHandleLink'\n\nexport const NO_RESPONSE_TEXT = 'No response'\nexport const OTHER_RESPONSES_TITLE = 'Other responses'\nconst NUMERIC_ID_PATTERN = /^\\d+$/\nconst NO_SCHEMA_DATA: Record<string, unknown> = {}\n\ntype AnsweredField = {\n propertyKey: string\n label: string\n subSchema: RJSFSchema | undefined\n}\n\ntype AnswerGroup = {\n title: string\n description?: string\n fields: AnsweredField[]\n}\n\nfunction isEmptyAnswer(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n )\n}\n\n/**\n * Whether `value` has the shape of a numeric ID. This does not establish what the ID refers to:\n * that comes from the schema declaring a file field. `schemaData` is written by the submitter, so\n * even then only a well-formed ID may be turned into a download request made with the reviewer's\n * credentials.\n */\nfunction isNumericId(value: unknown): value is string | number {\n return (\n (typeof value === 'string' || typeof value === 'number') &&\n NUMERIC_ID_PATTERN.test(String(value))\n )\n}\n\n/** An answer's display text: a choice's `oneOf` title when declared, otherwise the stored value. */\nfunction formatAnswer(subSchema: RJSFSchema | undefined, value: unknown) {\n const option = subSchema?.oneOf?.find(\n o => typeof o === 'object' && o.const === value,\n ) as RJSFSchema | undefined\n if (option?.title) return option.title\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | bigint)\n}\n\nfunction SchemaAnswerValue(props: {\n submissionId: string\n value: unknown\n subSchema: RJSFSchema | undefined\n}): ReactNode {\n const { submissionId, value, subSchema } = props\n if (isEmptyAnswer(value)) {\n return (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {NO_RESPONSE_TEXT}\n </Typography>\n )\n }\n if (detectFieldType(subSchema) === 'file' && isNumericId(value)) {\n return (\n <DataAccessSubmissionFileHandleLink\n submissionId={submissionId}\n fileHandleId={String(value)}\n />\n )\n }\n const itemSchema = subSchema?.items as RJSFSchema | undefined\n const text = Array.isArray(value)\n ? value.map(item => formatAnswer(itemSchema, item)).join(', ')\n : formatAnswer(subSchema, value)\n return (\n <Typography variant=\"body1\" style={{ whiteSpace: 'pre-line' }}>\n {text}\n </Typography>\n )\n}\n\nfunction toAnsweredField(\n propertyKey: string,\n subSchema: RJSFSchema | undefined,\n uiTitle?: string,\n): AnsweredField {\n return {\n propertyKey,\n label: uiTitle ?? subSchema?.title ?? propertyKey,\n subSchema,\n }\n}\n\nfunction toStepGroup({\n jsonSchema,\n uiSchema,\n}: GeneratedSubmissionForm['steps'][number]): AnswerGroup {\n return {\n title: String(jsonSchema.title ?? ''),\n description: jsonSchema.description,\n fields: (uiSchema['ui:order'] ?? []).map(propertyKey =>\n toAnsweredField(\n propertyKey,\n jsonSchema.properties?.[propertyKey] as RJSFSchema | undefined,\n (uiSchema[propertyKey] as UiSchema | undefined)?.['ui:title'],\n ),\n ),\n }\n}\n\nfunction buildAnswerGroups(\n form: GeneratedSubmissionForm | undefined,\n schemaData: Record<string, unknown>,\n): AnswerGroup[] {\n const stepGroups = form ? form.steps.map(toStepGroup) : []\n const placedKeys = new Set([\n SUBMISSION_CONTEXT_PROPERTY,\n ...stepGroups.flatMap(g => g.fields.map(f => f.propertyKey)),\n ])\n const schemaPropertiesByKey = new Map(\n form\n ? listResolvedSchemaProperties(form.schema).map(p => [p.propertyKey, p])\n : [],\n )\n const unplacedFields = Object.keys(schemaData)\n .filter(key => !placedKeys.has(key))\n .map(propertyKey =>\n toAnsweredField(\n propertyKey,\n schemaPropertiesByKey.get(propertyKey)?.subSchema,\n ),\n )\n\n return unplacedFields.length > 0\n ? [...stepGroups, { title: OTHER_RESPONSES_TITLE, fields: unplacedFields }]\n : stepGroups\n}\n\nexport type SubmissionSchemaAnswerListProps = {\n submissionId: string\n schemaData: Record<string, unknown>\n /** The generated form to group and label answers by. Without it, answers are listed by key. */\n form: GeneratedSubmissionForm | undefined\n}\n\n/**\n * Answers grouped and labelled by the steps of `form`. Answers the form does not place in a step\n * are listed under {@link OTHER_RESPONSES_TITLE} so a reviewer never misses submitted data.\n */\nexport function SubmissionSchemaAnswerList(\n props: SubmissionSchemaAnswerListProps,\n) {\n const { submissionId, schemaData, form } = props\n const groups = useMemo(\n () => buildAnswerGroups(form, schemaData),\n [form, schemaData],\n )\n\n return (\n <Stack sx={{ gap: 4 }}>\n {groups.map((group, index) => (\n // Step titles are not unique, and the list is derived rather than reordered.\n <Stack component=\"section\" key={index} sx={{ gap: 2 }}>\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"headline3\">{group.title}</Typography>\n {group.description && (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {group.description}\n </Typography>\n )}\n </Stack>\n <Stack component=\"dl\" sx={{ gap: 2, m: 0 }}>\n {group.fields.map(field => (\n <Stack key={field.propertyKey} sx={{ gap: 0.5 }}>\n <Typography variant=\"smallText2\" component=\"dt\">\n {field.label}\n </Typography>\n <Typography component=\"dd\" sx={{ m: 0 }}>\n <SchemaAnswerValue\n submissionId={submissionId}\n value={schemaData[field.propertyKey]}\n subSchema={field.subSchema}\n />\n </Typography>\n </Stack>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n )\n}\n\nexport type SubmissionSchemaAnswersProps = {\n submission: Submission\n}\n\n/**\n * Read-only view of a submission's `schemaData`, grouped and labelled by the steps of the\n * FormTemplate version the submission was made against. If that form cannot be generated, the\n * error is shown alongside the answers listed by key.\n */\nexport function SubmissionSchemaAnswers(props: SubmissionSchemaAnswersProps) {\n const { submission } = props\n const schemaData = submission.schemaData ?? NO_SCHEMA_DATA\n const { form, isLoading, error } = useGeneratedSubmissionForm(submission)\n\n return (\n <Stack component=\"section\" sx={{ gap: 2 }}>\n <Typography variant=\"headline2\">Form Responses</Typography>\n {error && <ErrorBanner error={error} />}\n {isLoading ? (\n <Skeleton width={300} />\n ) : (\n <SubmissionSchemaAnswerList\n submissionId={submission.id}\n schemaData={schemaData}\n form={form}\n />\n )}\n </Stack>\n )\n}\n"],"mappings":"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"}
|
|
@@ -70,5 +70,81 @@ export declare const mockCancelledSubmission: {
|
|
|
70
70
|
subjectId: string;
|
|
71
71
|
subjectType: RestrictableObjectType.ENTITY;
|
|
72
72
|
};
|
|
73
|
+
/** A submission against a JsonSchemaAccessRequirement that collected no first-class fields. */
|
|
74
|
+
export declare const mockSchemaDataSubmission: {
|
|
75
|
+
id: string;
|
|
76
|
+
accessRequirementId: string;
|
|
77
|
+
accessRequirementVersion: number;
|
|
78
|
+
formTemplateRef: {
|
|
79
|
+
templateId: string;
|
|
80
|
+
templateVersionNumber: number;
|
|
81
|
+
};
|
|
82
|
+
requestId: string;
|
|
83
|
+
accessorChanges: {
|
|
84
|
+
userId: string;
|
|
85
|
+
type: AccessType.GAIN_ACCESS;
|
|
86
|
+
}[];
|
|
87
|
+
schemaData: {
|
|
88
|
+
"x-synapse-submissionContext": "REQUEST";
|
|
89
|
+
projectTitle: string;
|
|
90
|
+
dataUsePurpose: string;
|
|
91
|
+
signedDataUseAgreement: string;
|
|
92
|
+
};
|
|
93
|
+
isRenewalSubmission: false;
|
|
94
|
+
submittedOn: string;
|
|
95
|
+
modifiedOn: string;
|
|
96
|
+
submittedBy: string;
|
|
97
|
+
modifiedBy: string;
|
|
98
|
+
state: SubmissionState.SUBMITTED;
|
|
99
|
+
etag: string;
|
|
100
|
+
subjectId: string;
|
|
101
|
+
subjectType: RestrictableObjectType.ENTITY;
|
|
102
|
+
};
|
|
103
|
+
/** A renewal against a JsonSchemaAccessRequirement that also carries first-class fields. */
|
|
104
|
+
export declare const mockSchemaDataAndFirstClassSubmission: {
|
|
105
|
+
id: string;
|
|
106
|
+
accessRequirementId: string;
|
|
107
|
+
formTemplateRef: {
|
|
108
|
+
templateId: string;
|
|
109
|
+
templateVersionNumber: number;
|
|
110
|
+
};
|
|
111
|
+
isRenewalSubmission: true;
|
|
112
|
+
schemaData: {
|
|
113
|
+
"x-synapse-submissionContext": "RENEWAL";
|
|
114
|
+
irbApprovalNumber: string;
|
|
115
|
+
projectTitle: string;
|
|
116
|
+
dataUsePurpose: string;
|
|
117
|
+
signedDataUseAgreement: string;
|
|
118
|
+
};
|
|
119
|
+
accessRequirementVersion: number;
|
|
120
|
+
requestId: string;
|
|
121
|
+
ducFileHandleId: string;
|
|
122
|
+
irbFileHandleId: string;
|
|
123
|
+
attachments: string[];
|
|
124
|
+
accessorChanges: {
|
|
125
|
+
userId: string;
|
|
126
|
+
type: AccessType.GAIN_ACCESS;
|
|
127
|
+
}[];
|
|
128
|
+
researchProjectSnapshot: {
|
|
129
|
+
id: string;
|
|
130
|
+
accessRequirementId: string;
|
|
131
|
+
institution: string;
|
|
132
|
+
projectLead: string;
|
|
133
|
+
intendedDataUseStatement: string;
|
|
134
|
+
createdOn: string;
|
|
135
|
+
modifiedOn: string;
|
|
136
|
+
createdBy: string;
|
|
137
|
+
modifiedBy: string;
|
|
138
|
+
etag: string;
|
|
139
|
+
};
|
|
140
|
+
submittedOn: string;
|
|
141
|
+
modifiedOn: string;
|
|
142
|
+
submittedBy: string;
|
|
143
|
+
modifiedBy: string;
|
|
144
|
+
state: SubmissionState.SUBMITTED;
|
|
145
|
+
etag: string;
|
|
146
|
+
subjectId: string;
|
|
147
|
+
subjectType: RestrictableObjectType.ENTITY;
|
|
148
|
+
};
|
|
73
149
|
export declare const mockSubmissions: Submission[];
|
|
74
150
|
//# sourceMappingURL=MockSubmission.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockSubmission.d.ts","sourceRoot":"","sources":["../../../src/mocks/dataaccess/MockSubmission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MockSubmission.d.ts","sourceRoot":"","sources":["../../../src/mocks/dataaccess/MockSubmission.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,eAAe,EAChB,MAAM,iCAAiC,CAAA;AAGxC,eAAO,MAAM,sBAAsB,EAAE,UA0CpC,CAAA;AACD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Cd,CAAA;AAEtB,eAAO,MAAM,sBAAsB,EAAE,UAmCpC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,UA+ChC,CAAA;AAED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Cd,CAAA;AAEtB,+FAA+F;AAC/F,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BI,CAAA;AAEzC,4FAA4F;AAC5F,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWT,CAAA;AAEzC,eAAO,MAAM,eAAe,EAAE,UAAU,EAQvC,CAAA"}
|