synapse-react-client 4.0.43 → 4.0.45
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.d.ts +1 -1
- package/dist/SWC.index.js +2 -2
- package/dist/SWC.index.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +2 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +126 -125
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +28 -16
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +99 -97
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/RequestDataStep.d.ts +1 -4
- package/dist/components/AccessRequirementList/RequestDataStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/RequestDataStep.js +15 -18
- package/dist/components/AccessRequirementList/RequestDataStep.js.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.d.ts.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +52 -49
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +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/FormTemplateEditor/useSaveFormTemplate.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/useSaveFormTemplate.js.map +1 -1
- package/dist/components/FormTemplateReferenceField/FormTemplatePreviewDialog.d.ts +9 -0
- package/dist/components/FormTemplateReferenceField/FormTemplatePreviewDialog.d.ts.map +1 -0
- package/dist/components/FormTemplateReferenceField/FormTemplatePreviewDialog.js +45 -0
- package/dist/components/FormTemplateReferenceField/FormTemplatePreviewDialog.js.map +1 -0
- package/dist/components/FormTemplateReferenceField/FormTemplateReferenceField.d.ts +22 -0
- package/dist/components/FormTemplateReferenceField/FormTemplateReferenceField.d.ts.map +1 -0
- package/dist/components/FormTemplateReferenceField/FormTemplateReferenceField.js +139 -0
- package/dist/components/FormTemplateReferenceField/FormTemplateReferenceField.js.map +1 -0
- package/dist/components/Forum/ForumTable.d.ts +17 -5
- package/dist/components/Forum/ForumTable.d.ts.map +1 -1
- package/dist/components/Forum/ForumTable.js +94 -77
- package/dist/components/Forum/ForumTable.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.d.ts.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +142 -108
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/AccessorRequirements.d.ts.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/AccessorRequirements.js +15 -15
- package/dist/components/SetBasicAccessRequirementFields/AccessorRequirements.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 +79 -154
- 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/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +4 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +5 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -1
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +37 -26
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -1
- 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/mocks/msw/handlers/discussionHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/discussionHandlers.js +40 -33
- package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
- package/dist/style/components/_submission-page.scss +0 -4
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts +10 -0
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +486 -482
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-client/index.js +3 -3
- package/dist/synapse-queries/KeyFactory.d.ts +13 -1
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +11 -1
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/dataaccess/index.js +4 -4
- package/dist/synapse-queries/dataaccess/useAccessRequirements.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js +4 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.d.ts +19 -5
- package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.js +29 -21
- package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts +12 -0
- package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/useFormTemplate.js +52 -30
- package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +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/forum/useForum.d.ts +5 -1
- package/dist/synapse-queries/forum/useForum.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useForum.js +23 -1
- package/dist/synapse-queries/forum/useForum.js.map +1 -1
- 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/index.js +185 -184
- package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts +5 -3
- package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts.map +1 -1
- package/dist/synapse-queries/jsonschema/useCreateJsonSchema.js +12 -15
- package/dist/synapse-queries/jsonschema/useCreateJsonSchema.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/featureflag/FeatureFlags.d.ts.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.js.map +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/dist/utils/functions/getEndpoint.d.ts +1 -0
- package/dist/utils/functions/getEndpoint.d.ts.map +1 -1
- package/dist/utils/functions/getEndpoint.js +3 -3
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/types/RequestableAccessRequirement.d.ts +8 -0
- package/dist/utils/types/RequestableAccessRequirement.d.ts.map +1 -0
- package/dist/utils/types/RequestableAccessRequirement.js +9 -0
- package/dist/utils/types/RequestableAccessRequirement.js.map +1 -0
- package/package.json +3 -3
- package/dist/testutils/ReactQueryMockUtils.js +0 -676
- package/dist/testutils/ReactQueryMockUtils.js.map +0 -1
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,EAAM,OAAO,CAAQ;AASrB,IAAM,IACJ;AAMF,SAAS,EAAsB,GAAkC;CAC/D,IAAM,EAAE,MAAM,MAAgB,EAC5B,EAAM,qBACN,EACE,cAAc,GAChB,CACF;CAEA,OAAO,IACL,kBAAC,GAAD;EACE,WAAU;EACV,gBAAA;EACA,QAAA;EACA,SAAQ;EACR,WAAW,EAAE,YAAY,EAAE,eAAe,GAAK,EAAE;YALnD,CAOE,kBAAC,GAAD;GAAkB,YAAY,kBAAC,GAAD,CAAiB,CAAA;aAC7C,kBAAC,GAAD;IAAY,SAAQ;IAAY,WAAU;cAAK;GAEnC,CAAA;EACI,CAAA,GAClB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GACE,QAAQ,GAAa;GACrB,SAAS,GAAa;GACtB,YAAY,GAAa;EAC1B,CAAA,EACe,CAAA,CACT;MAEX,kBAAC,GAAD;EAAU,OAAO;EAAQ,QAAQ;CAAS,CAAA;AAE9C;AAOA,SAAS,EAAwB,GAAgB,GAAwB;CACvE,OACE,EAAW,gBAAgB,KAC3B,EAAQ,EAAW,gBAAgB,MAAK,MAAO,EAAI,WAAW,CAAM;AAExE;AAQA,SAAwB,EAAe,GAA4B;CACjE,IAAM,EAAE,iBAAc,kBAAe,GAC/B,CAAC,GAAqB,KAA0B,EAAS,EAAK,GAE9D,EAAE,MAAM,MAAuB,GAAyB,GAExD,EAAE,MAAM,GAAY,WAAW,MACnC,GAA2B,GAAc,EACvC,cAAc,GAChB,CAAC,GACG,IAAc,GAClB,KACA,KACA,EAAwB,EAAmB,SAAS,CAAU,IAG1D,EAAE,MAAM,GAAgB,WAAW,MACvC,EAAyB,OAAO,CAAY,GAAG,EAC7C,SACE,KACA,KACA,EAAW,UAAU,EAAgB,SACzC,CAAC,GAEG,IAAY,GAChB,KAAkB,EAAM,EAAe,SAAS,EAAE,SAAS,EAAM,CAAC,IAG9D,IACJ,KAAc,EAAW,gBAAgB,GAAoB,SAEzD,EAAE,MAAM,MACZ,EACE,SAAS,GAAY,mBAAoB,GACzC,EAAE,SAAS,CAAC,CAAC,EAAW,CAC1B,GAEI,EAAE,MAAM,GAAK,WAAW,MAAiB,EAC7C,GAAY,qBACZ;EAAE,SAAS,CAAC,CAAC;EAAY,cAAc;CAAK,CAC9C,GAEM,EAAE,MAAM,MAAW,EAA0B,CAAY,GAEzD,CAAC,IAAyB,KAA8B,EAAS,EAAK,GACtE,CACJ,IACA,KACE,EAAS,EAAK,GACZ,CAAC,GAA0B,KAC/B,EAAS,EAAK,GAEV,KAAW,EAAY,GAEvB,IAAc,GAAK,eACtB,QAAO,MAAM,EAAG,WAAW,SAAS,GAAY,kBAAkB,CAAC,EACnE,KAAI,MAAM,EAAG,WAAW,GAErB,KAAsC,SACtC,KAAc,CAAC,IACb,IACK,YAEF,EAAW,QAEb,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA,GAC7B;EAAC;EAAW;EAAyB;CAAU,CAAC,GAE7C,KACJ,CAAC,CAAC,GAAY,cAAc,OAAO,KAAK,EAAW,UAAU,EAAE,SAAS,GAQpE,KAPe,GACnB,GAAY,mBACZ,GAAY,mBACZ,GAAY,gBAI+B,CAAC,GAAY;CAE1D,OACE,kBAAC,GAAD;EAAM,WAAW;EAAM,SAAS;EAAG,WAAU;YAA7C;GACG,MAA2B,KAC1B,kBAAC,GAAD;IACE,eAAe;IACf,4BAA4B,CAAC,CAAiB;IAC9C,cAAc,EAA2B,EAAK;IAC9C,sBAAqB,MAAgB;KAEnC,AADA,EAA2B,EAAK,GAChC,EAAa,iCAAiC,WAAW,EACvD,qBAAqB;MACnB,MAAM;MACN,eAAe;OACb,GAAS,kBAAkB,CAAY;MACzC;KACF,EACF,CAAC;IACH;GACD,CAAA;GAEH,kBAAC,IAAD;IACE,MAAM;IACN,eAAe;KACb,EAA4B,EAAK;IACnC;IACA,cAAc,OAAO,CAAY;GAClC,CAAA;GACA,KACC,kBAAC,GAAD;IAGgB;IACd,MAAM;IACN,eAAe,EAAuB,EAAK;GAC5C,CAAA;GAEH,kBAAC,GAAD;IACE,WAAU;IACV,MAAM;KACJ,IAAI;KACJ,IAAI;KACJ,IAAI;IACN;cANF;KAQE,kBAAC,GAAD;MAAY,SAAQ;MAAe,cAAA;gBAAa;KAEpC,CAAA;KACZ,kBAAC,GAAD;MACE,SAAQ;MACR,IAAI,EAAE,eAAe,YAAY;MACjC,cAAA;gBAEC;KACS,CAAA;KACZ,kBAAC,MAAD,CAAK,CAAA;KACJ,KAAuB,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;KAC9C,KACC,KACA,EAAW,UAAU,EAAgB,aACnC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,eAAe;QACb,EAA4B,EAAI;OAClC;OACA,OAAM;OACN,SAAQ;iBACT;MAEO,CAAA,GACR,kBAAC,GAAD;OACE,eAAe;QACb,EAAuB,EAAI;OAC7B;OACA,OAAM;OACN,SAAQ;iBACT;MAEO,CAAA,CACL;;KAGR,KAAc,KACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,IAAD;QACE,MAAM;QACN,cAAc,OAAO,CAAY;QACjC,qBAAqB,GAAY,uBAAuB;QACxD,eAAe,EAAuC,EAAK;OAC5D,CAAA;OACA,EAAW,UAAU,EAAgB,aACpC,kBAAC,GAAD;QACE,eAAe;SACb,EAAuC,EAAI;QAC7C;QACA,OAAM;QACN,SAAQ;kBACT;OAEO,CAAA;OAET,EAAW,UAAU,EAAgB,aACpC,kBAAC,GAAD;QACE,eAAe;SACb,EAA2B,EAAI;QACjC;QACA,OAAM;QACN,SAAQ;kBALV;SAOG,EAAW,UAAU,EAAgB,WAClC,WACA;SAAU;SAAI;QAEZ;;MAEP;;KAEP,kBAAC,GAAD;MAAY,SAAQ;MAAe,cAAA;gBAAa;KAEpC,CAAA;KAEZ,kBAAC,GAAD;MAAY,SAAQ;MAAa,cAAA;gBAC9B,GAAmB,QAAQ,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;KACzC,CAAA;KACZ,kBAAC,MAAD,CAAK,CAAA;KAEJ,KACC,kBAAA,GAAA,EAAA,UAAA;MACE,kBAAC,GAAD;OAAY,SAAQ;OAAe,cAAA;iBAAa;MAEpC,CAAA;MACZ,kBAAC,GAAD,EAAA,UAAA;OACG,KAAgB,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;OACvC,CAAC,KACA,CAAC,EAAQ,CAAW,KACpB,EAAa,KAAI,MACR,kBAAC,GAAD,EAA0B,aAAa,EAAK,GAAtB,CAAsB,CACpD;OACF,CAAC,KAAgB,EAAQ,CAAW,KACnC,kBAAC,GAAD,EAAiB,aAAA,OAA2B,CAAA;MAEzC,EAAA,CAAA;MACP,kBAAC,MAAD,CAAK,CAAA;KACL,EAAA,CAAA;KAEJ,kBAAC,GAAD;MAAY,SAAQ;MAAe,cAAA;gBAAa;KAEpC,CAAA;KACX,IACC,kBAAC,GAAD;MAAY,SAAQ;MAAa,WAAW;MAAO,cAAA;gBACjD,kBAAC,MAAD,EAAA,UAAA;OACE,kBAAC,MAAD,EAAA,UAAA;QAAI;QACiB;QAClB,EACE,SAAS,EACR,cAAc,EAAkB,iBAClC,CAAC,EACA,OAAO;QAAG;QAAI;QAEhB,EAAkB,qBAAqB,KAAK;OAC3C,EAAA,CAAA;OAEH,EAAkB,2BACjB,kBAAC,MAAD,EAAA,UAAI,yBAA0B,CAAA;OAE/B,EAAkB,8BACjB,kBAAC,MAAD,EAAA,UAAI,iCAAkC,CAAA;OAEvC,EAAkB,iBAAiB,kBAAC,MAAD,EAAA,UAAI,kBAAmB,CAAA;OAC1D,EAAkB,iBAAiB,kBAAC,MAAD,EAAA,UAAI,kBAAmB,CAAA;OAC1D,EAAkB,eACjB,kBAAC,MAAD,EAAA,UAAI,0BAA2B,CAAA;OAEhC,EAAkB,yBACjB,kBAAC,MAAD,EAAA,UAAI,2BAA4B,CAAA;OAEjC,EAAkB,+BACjB,kBAAC,MAAD,EAAA,UAAI,iCAAkC,CAAA;MAEtC,EAAA,CAAA;KACM,CAAA,IAEZ,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;KAEzB,kBAAC,MAAD,CAAK,CAAA;KACL,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAY,SAAQ;kBAAe;OAAwB,CAAA;OAC3D,kBAAC,GAAD;QAAY,SAAQ;kBACjB,IACC,kBAAC,GAAD,EAAW,QAAQ,EAAW,YAAc,CAAA,IAE5C,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;OAEf,CAAA;OACZ,kBAAC,GAAD;QAAY,SAAQ;kBAAe;OAAwB,CAAA;OAC3D,kBAAC,GAAD;QAAY,SAAQ;kBACjB,IACC,EAAW,EAAM,EAAW,WAAW,CAAC,IAExC,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;OAEf,CAAA;OACX,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,SAAQ;kBAAe;OAAuB,CAAA,GAC1D,kBAAC,GAAD;QAAY,SAAQ;kBACjB,IACC,kBAAC,GAAD,EAAW,QAAQ,EAAW,WAAa,CAAA,IAE3C,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;OAEf,CAAA,CACZ,EAAA,CAAA;OAEJ,kBAAC,GAAD;QAAY,SAAQ;kBAAe;OAAuB,CAAA;OAC1D,kBAAC,GAAD;QAAY,SAAQ;kBACjB,IACC,EAAW,EAAM,EAAW,UAAU,CAAC,IAEvC,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;OAEf,CAAA;OACZ,kBAAC,GAAD;QAAY,WAAU;QAAM,SAAQ;kBAApC,CAAmD,mBAEhD,GAAG,IAAa,KAAK,EAAW,gBAAgB,OAAO,KAAK,IACnD;;OACX,IACC,EAAW,gBAAgB,KAAI,MAC7B,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,WAAU;QAAmB,SAAQ;kBAC/C,kBAAC,QAAD;SAAM,OAAO,EAAE,YAAY,SAAS;mBAClC,kBAAC,GAAD,EAEE,QAAQ,EAAe,OACxB,GAFM,EAAe,MAErB;QACG,CAAA;OACI,CAAA,GACZ,kBAAC,GAAD;QAAY,WAAU;QAAqB,SAAQ;kBAChD,EACC,EACE,EAAe,KAAK,UAClB,GACA,EAAe,KAAK,QAAQ,GAAG,CACjC,CACF,CACF;OACU,CAAA,CACJ,EAAA,GAnBK,EAAe,MAmBpB,CACX,IAED,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;QAEvB,CAAC,KAAc,EAAW,4BAC1B,kBAAA,GAAA,EAAA,UAAA;QACE,kBAAC,GAAD;SAAY,WAAU;SAAM,SAAQ;mBAAe;QAEvC,CAAA;QACZ,kBAAC,GAAD;SAAY,WAAU;SAAQ,SAAQ;mBACnC,IACC,EAAW,yBAAyB,cAEpC,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;QAEf,CAAA;QACZ,kBAAC,GAAD;SAAY,WAAU;SAAM,SAAQ;mBAAe;QAEvC,CAAA;QACZ,kBAAC,GAAD;SAAY,WAAU;SAAQ,SAAQ;mBACnC,IACC,EAAW,yBAAyB,cAEpC,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA;QAEf,CAAA;OACZ,EAAA,CAAA;MAED;;IACD;;GACN,kBAAC,GAAD;IACE,MAAM;KACJ,IAAI;KACJ,IAAI;KACJ,IAAI;IACN;cAEA,kBAAC,GAAD;KAAO,IAAI,EAAE,KAAK,EAAE;eAApB;MACE,kBAAC,GAAD,EAAA,UACG,IACC,kBAAC,GAAD,EACE,qBAAqB,EAAW,oBACjC,CAAA,IAED,kBAAA,GAAA,CAAI,CAAA,EAEc,CAAA;MACrB,GAAY,kBACX,kBAAC,WAAD,EAAA,UAAA;OACE,kBAAC,GAAD;QAAY,SAAQ;QAAY,cAAA;kBAAa;OAEjC,CAAA;OACZ,kBAAC,MAAD,CAAK,CAAA;OACL,kBAAC,GAAD;QACE,SAAQ;QACR,OAAO,EAAE,YAAY,WAAW;QAChC,cAAA;kBAEC,EAAW;OACF,CAAA;MACL,EAAA,CAAA;MAEX,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,SAAQ;iBAApB,CAAgC,kCAE9B,kBAAC,MAAD,CAAK,CAAA,CACK;UACZ,kBAAC,GAAD;OACE,IAAI,EACF,KAAK,EACP;iBAHF;QAKG,GAAY,yBACT,4BACF,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;SAAY,cAAA;mBAAa;QAEjC,CAAA,GACZ,kBAAC,GAAD;SACE,SAAQ;SACR,OAAO,EAAE,YAAY,WAAW;SAChC,cAAA;mBAGE,EAAW,wBACR;QAEK,CAAA,CACL,EAAA,CAAA;QAEV,MACC,kBAAC,GAAD;SAAY,SAAQ;SAAY,cAAA;mBAAa;QAEjC,CAAA;QAEb,GAAY,mBACX,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;mBAAa;QAErB,CAAA,GACZ,kBAAC,GAAD;SACE,cAAc,EAAW;SACzB,cAAc,EAAW;QAC1B,CAAA,CACM,EAAA,CAAA;QAEV,GAAY,mBACX,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;SAAa,cAAA;mBAAa;QAElC,CAAA,GACZ,kBAAC,GAAD;SACE,cAAc,EAAW;SACzB,cAAc,EAAW;QAC1B,CAAA,CACM,EAAA,CAAA;QAEV,GAAY,eACX,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;SAAa,cAAA;mBAAa;QAElC,CAAA,GACX,EAAW,YAAY,KAAI,MAC1B,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SACE,cAAc,EAAW;SACX;QACf,CAAA,GACD,kBAAC,MAAD,CAAK,CAAA,CACG,EAAA,GANK,CAML,CACX,CACM,EAAA,CAAA;QAEV,KAAc,MACb,kBAAC,IAAD,EAAqC,cAAa,CAAA;OAE/C;QACA,EAAA,CAAA;MACR,GAAQ,MACP,kBAAC,GAAD;OACE,UAAU,EAAO;OACjB,OAAO;OACP,kBAAkB;MACnB,CAAA;KAEE;;GACH,CAAA;EACF;;AAEV"}
|
|
@@ -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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"}
|
package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"AA+IA;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,mDAsK1C"}
|
|
@@ -184,7 +184,10 @@ function I() {
|
|
|
184
184
|
color: "error",
|
|
185
185
|
loading: R,
|
|
186
186
|
onClick: () => {
|
|
187
|
-
O?.requestId && L(
|
|
187
|
+
O?.requestId && O.accessRequirementId && L({
|
|
188
|
+
requestId: O.requestId,
|
|
189
|
+
accessRequirementId: O.accessRequirementId
|
|
190
|
+
});
|
|
188
191
|
},
|
|
189
192
|
children: "Cancel Request"
|
|
190
193
|
})] })
|
package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport {\n getFirstRequestStep,\n RequestableAccessRequirement,\n} from '@/components/AccessRequirementList/RequestDataStep'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'declined',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n declined: 'Signature declined',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,\n * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is\n * still filtered client-side because the list endpoint has no server-side status filter.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests({ isEDuc: true })\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<RequestableAccessRequirement>(\n modifyingArId ?? '',\n {\n enabled: Boolean(modifyingArId),\n staleTime: Infinity,\n },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: getFirstRequestStep(modifyAccessRequirement),\n accessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (cancellingSummary?.requestId) {\n voidSignature(cancellingSummary.requestId)\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport { getFirstRequestStep } from '@/components/AccessRequirementList/RequestDataStep'\nimport { RequestableAccessRequirement } from '@/utils/types/RequestableAccessRequirement'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'declined',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n declined: 'Signature declined',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,\n * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is\n * still filtered client-side because the list endpoint has no server-side status filter.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests({ isEDuc: true })\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<RequestableAccessRequirement>(\n modifyingArId ?? '',\n {\n enabled: Boolean(modifyingArId),\n staleTime: Infinity,\n },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: getFirstRequestStep(modifyAccessRequirement),\n accessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (\n cancellingSummary?.requestId &&\n cancellingSummary.accessRequirementId\n ) {\n voidSignature({\n requestId: cancellingSummary.requestId,\n accessRequirementId: cancellingSummary.accessRequirementId,\n })\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,11 @@ export declare const mockJsonSchemaAR1: JsonSchemaAccessRequirement;
|
|
|
5
5
|
/** AR 2: Clinical Trial Data Access — references the Clinical Trial FormTemplate. Requires an uploaded DUC. */
|
|
6
6
|
export declare const mockJsonSchemaAR2: JsonSchemaAccessRequirement;
|
|
7
7
|
export declare const mockJsonSchemaAccessRequirements: JsonSchemaAccessRequirement[];
|
|
8
|
+
/**
|
|
9
|
+
* {@link mockJsonSchemaAR2} with the subjects, access type, and whole-day expiration period that the
|
|
10
|
+
* access requirement editor needs to load an existing AR.
|
|
11
|
+
*/
|
|
12
|
+
export declare const mockEditableJsonSchemaAR: JsonSchemaAccessRequirement;
|
|
8
13
|
/**
|
|
9
14
|
* A wiki for {@link mockJsonSchemaAR1}. It is intentionally not registered with the shared access requirement wiki
|
|
10
15
|
* mocks, so that the AR is wiki-less by default.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockJsonSchemaAccessRequirements.d.ts","sourceRoot":"","sources":["../../../src/mocks/accessRequirement/mockJsonSchemaAccessRequirements.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,
|
|
1
|
+
{"version":3,"file":"mockJsonSchemaAccessRequirements.d.ts","sourceRoot":"","sources":["../../../src/mocks/accessRequirement/mockJsonSchemaAccessRequirements.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAI5B,MAAM,kCAAkC,CAAA;AAIzC,OAAO,EAEL,QAAQ,EACR,WAAW,EACZ,MAAM,iCAAiC,CAAA;AAKxC,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,EAAE,2BAiB/B,CAAA;AAED,+GAA+G;AAC/G,eAAO,MAAM,iBAAiB,EAAE,2BAkB/B,CAAA;AAED,eAAO,MAAM,gCAAgC,EAAE,2BAA2B,EAGzE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,2BAWtC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAWvC,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,WAI1C,CAAA"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { DAY_IN_MS as e } from "../../utils/SynapseConstants.js";
|
|
2
|
+
import { MOCK_DUC_TEMPLATE_FILE_HANDLE_ID as t } from "../mock_file_handle.js";
|
|
3
|
+
import { MOCK_FILE_ENTITY_ID as n } from "../entity/mockFileEntity.js";
|
|
4
|
+
import { ObjectType as r } from "@sage-bionetworks/synapse-types";
|
|
5
|
+
import { JsonSchemaAccessRequirementAccessTypeEnum as i, JsonSchemaAccessRequirementConcreteTypeEnum as a, RestrictableObjectDescriptorTypeEnum as o } from "@sage-bionetworks/synapse-client";
|
|
4
6
|
//#region src/mocks/accessRequirement/mockJsonSchemaAccessRequirements.ts
|
|
5
|
-
var
|
|
7
|
+
var s = (/* @__PURE__ */ new Date()).toISOString(), c = "1234567", l = {
|
|
6
8
|
id: 9e3,
|
|
7
9
|
name: "Genomics Data Access",
|
|
8
10
|
etag: "etag-ar-9000",
|
|
9
11
|
versionNumber: 1,
|
|
10
|
-
createdOn:
|
|
11
|
-
modifiedOn:
|
|
12
|
-
createdBy:
|
|
13
|
-
modifiedBy:
|
|
14
|
-
concreteType:
|
|
12
|
+
createdOn: s,
|
|
13
|
+
modifiedOn: s,
|
|
14
|
+
createdBy: c,
|
|
15
|
+
modifiedBy: c,
|
|
16
|
+
concreteType: a.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,
|
|
15
17
|
formTemplateRef: {
|
|
16
18
|
templateId: "template-1",
|
|
17
19
|
templateVersionNumber: 1
|
|
@@ -21,16 +23,16 @@ var r = (/* @__PURE__ */ new Date()).toISOString(), i = "1234567", a = {
|
|
|
21
23
|
isValidatedProfileRequired: !1,
|
|
22
24
|
isTwoFaRequired: !1,
|
|
23
25
|
isDUCRequired: !1
|
|
24
|
-
},
|
|
26
|
+
}, u = {
|
|
25
27
|
id: 9001,
|
|
26
28
|
name: "Clinical Trial Data Access",
|
|
27
29
|
etag: "etag-ar-9001",
|
|
28
30
|
versionNumber: 1,
|
|
29
|
-
createdOn:
|
|
30
|
-
modifiedOn:
|
|
31
|
-
createdBy:
|
|
32
|
-
modifiedBy:
|
|
33
|
-
concreteType:
|
|
31
|
+
createdOn: s,
|
|
32
|
+
modifiedOn: s,
|
|
33
|
+
createdBy: c,
|
|
34
|
+
modifiedBy: c,
|
|
35
|
+
concreteType: a.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,
|
|
34
36
|
formTemplateRef: {
|
|
35
37
|
templateId: "template-2",
|
|
36
38
|
templateVersionNumber: 1
|
|
@@ -40,23 +42,32 @@ var r = (/* @__PURE__ */ new Date()).toISOString(), i = "1234567", a = {
|
|
|
40
42
|
isValidatedProfileRequired: !0,
|
|
41
43
|
isTwoFaRequired: !0,
|
|
42
44
|
isDUCRequired: !0,
|
|
43
|
-
ducTemplateFileHandleId:
|
|
44
|
-
},
|
|
45
|
+
ducTemplateFileHandleId: t
|
|
46
|
+
}, d = [l, u], f = {
|
|
47
|
+
...u,
|
|
48
|
+
accessType: i.DOWNLOAD,
|
|
49
|
+
subjectIds: [{
|
|
50
|
+
id: n,
|
|
51
|
+
type: o.ENTITY
|
|
52
|
+
}],
|
|
53
|
+
subjectsDefinedByAnnotations: !1,
|
|
54
|
+
expirationPeriod: 180 * e
|
|
55
|
+
}, p = {
|
|
45
56
|
id: "9000",
|
|
46
57
|
etag: "etag-wiki-9000",
|
|
47
|
-
createdOn:
|
|
48
|
-
createdBy:
|
|
49
|
-
modifiedOn:
|
|
50
|
-
modifiedBy:
|
|
58
|
+
createdOn: s,
|
|
59
|
+
createdBy: c,
|
|
60
|
+
modifiedOn: s,
|
|
61
|
+
modifiedBy: c,
|
|
51
62
|
title: "",
|
|
52
63
|
markdown: "**Access to these genomics data is controlled.**\n\nTo request access, provide the information that is requested in the following steps, including a description of your proposed research.",
|
|
53
64
|
attachmentFileHandleIds: []
|
|
54
|
-
},
|
|
55
|
-
wikiPageId:
|
|
56
|
-
ownerObjectId: String(
|
|
57
|
-
ownerObjectType:
|
|
65
|
+
}, m = {
|
|
66
|
+
wikiPageId: p.id,
|
|
67
|
+
ownerObjectId: String(l.id),
|
|
68
|
+
ownerObjectType: r.ACCESS_REQUIREMENT
|
|
58
69
|
};
|
|
59
70
|
//#endregion
|
|
60
|
-
export {
|
|
71
|
+
export { f as mockEditableJsonSchemaAR, l as mockJsonSchemaAR1, p as mockJsonSchemaAR1WikiPage, m as mockJsonSchemaAR1WikiPageKey, u as mockJsonSchemaAR2, d as mockJsonSchemaAccessRequirements };
|
|
61
72
|
|
|
62
73
|
//# sourceMappingURL=mockJsonSchemaAccessRequirements.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockJsonSchemaAccessRequirements.js","names":[],"sources":["../../../src/mocks/accessRequirement/mockJsonSchemaAccessRequirements.ts"],"sourcesContent":["import {\n JsonSchemaAccessRequirement,\n JsonSchemaAccessRequirementConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { MOCK_DUC_TEMPLATE_FILE_HANDLE_ID } from '@/mocks/mock_file_handle'\nimport {\n ObjectType,\n WikiPage,\n WikiPageKey,\n} from '@sage-bionetworks/synapse-types'\n\nconst now = new Date().toISOString()\nconst actUserId = '1234567'\n\n/** AR 1: Genomics Data Access — references the Genomics FormTemplate. No DUC required. */\nexport const mockJsonSchemaAR1: JsonSchemaAccessRequirement = {\n id: 9000,\n name: 'Genomics Data Access',\n etag: 'etag-ar-9000',\n versionNumber: 1,\n createdOn: now,\n modifiedOn: now,\n createdBy: actUserId,\n modifiedBy: actUserId,\n concreteType:\n JsonSchemaAccessRequirementConcreteTypeEnum.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,\n formTemplateRef: { templateId: 'template-1', templateVersionNumber: 1 },\n expirationPeriod: 31536000000, // 1 year\n isCertifiedUserRequired: true,\n isValidatedProfileRequired: false,\n isTwoFaRequired: false,\n isDUCRequired: false,\n}\n\n/** AR 2: Clinical Trial Data Access — references the Clinical Trial FormTemplate. Requires an uploaded DUC. */\nexport const mockJsonSchemaAR2: JsonSchemaAccessRequirement = {\n id: 9001,\n name: 'Clinical Trial Data Access',\n etag: 'etag-ar-9001',\n versionNumber: 1,\n createdOn: now,\n modifiedOn: now,\n createdBy: actUserId,\n modifiedBy: actUserId,\n concreteType:\n JsonSchemaAccessRequirementConcreteTypeEnum.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,\n formTemplateRef: { templateId: 'template-2', templateVersionNumber: 1 },\n expirationPeriod: 15768000000, // 6 months\n isCertifiedUserRequired: true,\n isValidatedProfileRequired: true,\n isTwoFaRequired: true,\n isDUCRequired: true,\n ducTemplateFileHandleId: MOCK_DUC_TEMPLATE_FILE_HANDLE_ID,\n}\n\nexport const mockJsonSchemaAccessRequirements: JsonSchemaAccessRequirement[] = [\n mockJsonSchemaAR1,\n mockJsonSchemaAR2,\n]\n\n/**\n * A wiki for {@link mockJsonSchemaAR1}. It is intentionally not registered with the shared access requirement wiki\n * mocks, so that the AR is wiki-less by default.\n */\nexport const mockJsonSchemaAR1WikiPage: WikiPage = {\n id: '9000',\n etag: 'etag-wiki-9000',\n createdOn: now,\n createdBy: actUserId,\n modifiedOn: now,\n modifiedBy: actUserId,\n title: '',\n markdown:\n '**Access to these genomics data is controlled.**\\n\\nTo request access, provide the information that is requested in the following steps, including a description of your proposed research.',\n attachmentFileHandleIds: [],\n}\n\nexport const mockJsonSchemaAR1WikiPageKey: WikiPageKey = {\n wikiPageId: mockJsonSchemaAR1WikiPage.id,\n ownerObjectId: String(mockJsonSchemaAR1.id),\n ownerObjectType: ObjectType.ACCESS_REQUIREMENT,\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"mockJsonSchemaAccessRequirements.js","names":[],"sources":["../../../src/mocks/accessRequirement/mockJsonSchemaAccessRequirements.ts"],"sourcesContent":["import {\n JsonSchemaAccessRequirement,\n JsonSchemaAccessRequirementAccessTypeEnum,\n JsonSchemaAccessRequirementConcreteTypeEnum,\n RestrictableObjectDescriptorTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { MOCK_FILE_ENTITY_ID } from '@/mocks/entity/mockFileEntity'\nimport { MOCK_DUC_TEMPLATE_FILE_HANDLE_ID } from '@/mocks/mock_file_handle'\nimport { DAY_IN_MS } from '@/utils/SynapseConstants'\nimport {\n ObjectType,\n WikiPage,\n WikiPageKey,\n} from '@sage-bionetworks/synapse-types'\n\nconst now = new Date().toISOString()\nconst actUserId = '1234567'\n\n/** AR 1: Genomics Data Access — references the Genomics FormTemplate. No DUC required. */\nexport const mockJsonSchemaAR1: JsonSchemaAccessRequirement = {\n id: 9000,\n name: 'Genomics Data Access',\n etag: 'etag-ar-9000',\n versionNumber: 1,\n createdOn: now,\n modifiedOn: now,\n createdBy: actUserId,\n modifiedBy: actUserId,\n concreteType:\n JsonSchemaAccessRequirementConcreteTypeEnum.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,\n formTemplateRef: { templateId: 'template-1', templateVersionNumber: 1 },\n expirationPeriod: 31536000000, // 1 year\n isCertifiedUserRequired: true,\n isValidatedProfileRequired: false,\n isTwoFaRequired: false,\n isDUCRequired: false,\n}\n\n/** AR 2: Clinical Trial Data Access — references the Clinical Trial FormTemplate. Requires an uploaded DUC. */\nexport const mockJsonSchemaAR2: JsonSchemaAccessRequirement = {\n id: 9001,\n name: 'Clinical Trial Data Access',\n etag: 'etag-ar-9001',\n versionNumber: 1,\n createdOn: now,\n modifiedOn: now,\n createdBy: actUserId,\n modifiedBy: actUserId,\n concreteType:\n JsonSchemaAccessRequirementConcreteTypeEnum.org_sagebionetworks_repo_model_JsonSchemaAccessRequirement,\n formTemplateRef: { templateId: 'template-2', templateVersionNumber: 1 },\n expirationPeriod: 15768000000, // 6 months\n isCertifiedUserRequired: true,\n isValidatedProfileRequired: true,\n isTwoFaRequired: true,\n isDUCRequired: true,\n ducTemplateFileHandleId: MOCK_DUC_TEMPLATE_FILE_HANDLE_ID,\n}\n\nexport const mockJsonSchemaAccessRequirements: JsonSchemaAccessRequirement[] = [\n mockJsonSchemaAR1,\n mockJsonSchemaAR2,\n]\n\n/**\n * {@link mockJsonSchemaAR2} with the subjects, access type, and whole-day expiration period that the\n * access requirement editor needs to load an existing AR.\n */\nexport const mockEditableJsonSchemaAR: JsonSchemaAccessRequirement = {\n ...mockJsonSchemaAR2,\n accessType: JsonSchemaAccessRequirementAccessTypeEnum.DOWNLOAD,\n subjectIds: [\n {\n id: MOCK_FILE_ENTITY_ID,\n type: RestrictableObjectDescriptorTypeEnum.ENTITY,\n },\n ],\n subjectsDefinedByAnnotations: false,\n expirationPeriod: 180 * DAY_IN_MS,\n}\n\n/**\n * A wiki for {@link mockJsonSchemaAR1}. It is intentionally not registered with the shared access requirement wiki\n * mocks, so that the AR is wiki-less by default.\n */\nexport const mockJsonSchemaAR1WikiPage: WikiPage = {\n id: '9000',\n etag: 'etag-wiki-9000',\n createdOn: now,\n createdBy: actUserId,\n modifiedOn: now,\n modifiedBy: actUserId,\n title: '',\n markdown:\n '**Access to these genomics data is controlled.**\\n\\nTo request access, provide the information that is requested in the following steps, including a description of your proposed research.',\n attachmentFileHandleIds: [],\n}\n\nexport const mockJsonSchemaAR1WikiPageKey: WikiPageKey = {\n wikiPageId: mockJsonSchemaAR1WikiPage.id,\n ownerObjectId: String(mockJsonSchemaAR1.id),\n ownerObjectType: ObjectType.ACCESS_REQUIREMENT,\n}\n"],"mappings":";;;;;;AAeA,IAAM,qBAAM,IAAI,KAAK,GAAE,YAAY,GAC7B,IAAY,WAGL,IAAiD;CAC5D,IAAI;CACJ,MAAM;CACN,MAAM;CACN,eAAe;CACf,WAAW;CACX,YAAY;CACZ,WAAW;CACX,YAAY;CACZ,cACE,EAA4C;CAC9C,iBAAiB;EAAE,YAAY;EAAc,uBAAuB;CAAE;CACtE,kBAAkB;CAClB,yBAAyB;CACzB,4BAA4B;CAC5B,iBAAiB;CACjB,eAAe;AACjB,GAGa,IAAiD;CAC5D,IAAI;CACJ,MAAM;CACN,MAAM;CACN,eAAe;CACf,WAAW;CACX,YAAY;CACZ,WAAW;CACX,YAAY;CACZ,cACE,EAA4C;CAC9C,iBAAiB;EAAE,YAAY;EAAc,uBAAuB;CAAE;CACtE,kBAAkB;CAClB,yBAAyB;CACzB,4BAA4B;CAC5B,iBAAiB;CACjB,eAAe;CACf,yBAAyB;AAC3B,GAEa,IAAkE,CAC7E,GACA,CACF,GAMa,IAAwD;CACnE,GAAG;CACH,YAAY,EAA0C;CACtD,YAAY,CACV;EACE,IAAI;EACJ,MAAM,EAAqC;CAC7C,CACF;CACA,8BAA8B;CAC9B,kBAAkB,MAAM;AAC1B,GAMa,IAAsC;CACjD,IAAI;CACJ,MAAM;CACN,WAAW;CACX,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,OAAO;CACP,UACE;CACF,yBAAyB,CAAC;AAC5B,GAEa,IAA4C;CACvD,YAAY,EAA0B;CACtC,eAAe,OAAO,EAAkB,EAAE;CAC1C,iBAAiB,EAAW;AAC9B"}
|