synapse-react-client 4.0.44 → 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/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/SetManagedAccessRequirementFields.d.ts.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js +57 -55
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- 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/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/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/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/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/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/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 +2 -2
- package/dist/testutils/ReactQueryMockUtils.js +0 -676
- package/dist/testutils/ReactQueryMockUtils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useShowAccessRequirementWikiInWizard } from './AccessRequirementListUtils'\nimport { hasAccessorRequirement } from '../SetBasicAccessRequirementFields/GovernanceUtils'\nimport {\n getFirstRequestStep,\n getNextRequestStep,\n getPreviousRequestStep,\n isRequestableAccessRequirement,\n RequestableAccessRequirement,\n RequestDataStep,\n} from './RequestDataStep'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport JsonSchemaRequestWizard from './JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport ReviewDucStep from './ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep'\nimport EDucPreviewStep from './ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep'\nimport ManualUploadDucStep from './ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep'\nimport SignatureStatusStep from './ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n /**\n * Optionally open the wizard directly at a specific ManagedACTAccessRequirement step instead of\n * the default access requirement list. Useful for deep-link routes and for resuming an in-progress\n * eDUC signature flow (jump straight to `RequestDataStep.SIGNATURE_STATUS`).\n *\n * The `accessRequirement` is bundled with the step because every wizard step\n * requires it — passing them together prevents entering a step with no AR selected.\n *\n * Does not affect the traditional-DUC (non-eDUC) flow, which is entered from the AR list.\n */\n initialWizardEntry?: {\n step: RequestDataStep\n accessRequirement: RequestableAccessRequirement\n }\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n accessRequirement?: RequestableAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n *\n * ### Wizard entry\n *\n * By default the component opens on the AR list ({@link RequestDataStep.SHOW_ALL_ARS}) and the user\n * navigates into the ManagedACT wizard by clicking Request Access on a specific AR.\n *\n * To open the wizard directly at a specific step (for example, to resume an in-progress eDUC signature\n * flow or to serve a deep-link route), pass {@link AccessRequirementListProps.initialWizardEntry} with\n * the target step and the {@link RequestableAccessRequirement} the wizard should operate on.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n initialWizardEntry,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n initialWizardEntry?.step ?? RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [accessRequirementInWizard, setAccessRequirementInWizard] = useState<\n RequestableAccessRequirement | undefined\n >(initialWizardEntry?.accessRequirement)\n const managedACTAccessRequirement =\n accessRequirementInWizard?.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? accessRequirementInWizard\n : undefined\n const jsonSchemaAccessRequirement =\n accessRequirementInWizard?.concreteType ===\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? accessRequirementInWizard\n : undefined\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const showAccessRequirementWikiInWizard =\n useShowAccessRequirementWikiInWizard(accessRequirementInWizard)\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n accessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (accessRequirement) {\n // required for every wizard step\n setAccessRequirementInWizard(accessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n // Each callback is invoked from the step being rendered, so `requestDataStep` is the step being navigated away from\n const goToNextRequestStep = () =>\n requestDataStepCallback({\n step: getNextRequestStep(accessRequirementInWizard!, requestDataStep),\n })\n const goToPreviousRequestStep = () =>\n requestDataStepCallback({\n step: getPreviousRequestStep(accessRequirementInWizard!, requestDataStep),\n })\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n isRequestableAccessRequirement(accessRequirement) &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n hasAccessorRequirement(accessRequirement) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n hasAccessorRequirement(accessRequirement) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n RequestDataStep.REVIEW_DUC,\n RequestDataStep.EDUC_PREVIEW,\n ].includes(requestDataStep) && showAccessRequirementWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n step: getNextRequestStep(\n managedACTAccessRequirement!,\n requestDataStep,\n ),\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={goToPreviousRequestStep}\n onEDucContinue={\n managedACTAccessRequirement?.eDucTemplateId\n ? goToNextRequestStep\n : undefined\n }\n />\n )\n break\n case RequestDataStep.REVIEW_DUC:\n renderContent = (\n <ReviewDucStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onCreateDuc={goToNextRequestStep}\n />\n )\n break\n case RequestDataStep.EDUC_PREVIEW:\n renderContent = (\n <EDucPreviewStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onSendForSignature={() => {\n // The signature-status step isn't useful right after routing (0 signatures collected,\n // Submit necessarily disabled), so surface a toast and close the wizard. The user can\n // resume from their in-flight requests table when signatures are ready.\n displayToast(\n 'Your DUC has been emailed to your collaborators. You can check signature progress in your access request history.',\n 'info',\n {\n primaryButtonConfig: {\n text: 'View Request History',\n // Resolves to a same-origin path on synapse.org and to the absolute synapse.org URL when embedded in a portal.\n href: `${getEndpoint(BackendDestinationEnum.PORTAL_ENDPOINT)}RequestHistory:default`,\n },\n dismissOnPrimaryButtonClick: true,\n },\n )\n onHide()\n }}\n onManualUpload={goToNextRequestStep}\n />\n )\n break\n case RequestDataStep.MANUAL_UPLOAD_DUC:\n renderContent = (\n <ManualUploadDucStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n />\n )\n break\n case RequestDataStep.SIGNATURE_STATUS:\n renderContent = (\n <SignatureStatusStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onBackClicked={() => {\n // Back from SIGNATURE_STATUS returns to the first step of the request so the user can\n // modify the request. EDUC_PREVIEW is skipped because Send-for-signature toasts and\n // closes the wizard, so users only reach this step from the row-level \"Review\n // Signatures and Submit\" entry point.\n requestDataStepCallback({\n step: getFirstRequestStep(accessRequirementInWizard!),\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n />\n )\n break\n case RequestDataStep.SCHEMA_DRIVEN_REQUEST:\n renderContent = (\n <JsonSchemaRequestWizard\n accessRequirement={jsonSchemaAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onEDucContinue={\n jsonSchemaAccessRequirement?.eDucTemplateId\n ? goToNextRequestStep\n : undefined\n }\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? getFirstRequestStep(accessRequirement)\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useShowAccessRequirementWikiInWizard } from './AccessRequirementListUtils'\nimport { hasAccessorRequirement } from '../SetBasicAccessRequirementFields/GovernanceUtils'\nimport {\n isRequestableAccessRequirement,\n RequestableAccessRequirement,\n} from '@/utils/types/RequestableAccessRequirement'\nimport {\n getFirstRequestStep,\n getNextRequestStep,\n getPreviousRequestStep,\n RequestDataStep,\n} from './RequestDataStep'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport JsonSchemaRequestWizard from './JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport ReviewDucStep from './ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep'\nimport EDucPreviewStep from './ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep'\nimport ManualUploadDucStep from './ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep'\nimport SignatureStatusStep from './ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n /**\n * Optionally open the wizard directly at a specific ManagedACTAccessRequirement step instead of\n * the default access requirement list. Useful for deep-link routes and for resuming an in-progress\n * eDUC signature flow (jump straight to `RequestDataStep.SIGNATURE_STATUS`).\n *\n * The `accessRequirement` is bundled with the step because every wizard step\n * requires it — passing them together prevents entering a step with no AR selected.\n *\n * Does not affect the traditional-DUC (non-eDUC) flow, which is entered from the AR list.\n */\n initialWizardEntry?: {\n step: RequestDataStep\n accessRequirement: RequestableAccessRequirement\n }\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n accessRequirement?: RequestableAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n *\n * ### Wizard entry\n *\n * By default the component opens on the AR list ({@link RequestDataStep.SHOW_ALL_ARS}) and the user\n * navigates into the ManagedACT wizard by clicking Request Access on a specific AR.\n *\n * To open the wizard directly at a specific step (for example, to resume an in-progress eDUC signature\n * flow or to serve a deep-link route), pass {@link AccessRequirementListProps.initialWizardEntry} with\n * the target step and the {@link RequestableAccessRequirement} the wizard should operate on.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n initialWizardEntry,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n initialWizardEntry?.step ?? RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [accessRequirementInWizard, setAccessRequirementInWizard] = useState<\n RequestableAccessRequirement | undefined\n >(initialWizardEntry?.accessRequirement)\n const managedACTAccessRequirement =\n accessRequirementInWizard?.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? accessRequirementInWizard\n : undefined\n const jsonSchemaAccessRequirement =\n accessRequirementInWizard?.concreteType ===\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? accessRequirementInWizard\n : undefined\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const showAccessRequirementWikiInWizard =\n useShowAccessRequirementWikiInWizard(accessRequirementInWizard)\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n accessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (accessRequirement) {\n // required for every wizard step\n setAccessRequirementInWizard(accessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n // Each callback is invoked from the step being rendered, so `requestDataStep` is the step being navigated away from\n const goToNextRequestStep = () =>\n requestDataStepCallback({\n step: getNextRequestStep(accessRequirementInWizard!, requestDataStep),\n })\n const goToPreviousRequestStep = () =>\n requestDataStepCallback({\n step: getPreviousRequestStep(accessRequirementInWizard!, requestDataStep),\n })\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n isRequestableAccessRequirement(accessRequirement) &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n hasAccessorRequirement(accessRequirement) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n hasAccessorRequirement(accessRequirement) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n RequestDataStep.REVIEW_DUC,\n RequestDataStep.EDUC_PREVIEW,\n ].includes(requestDataStep) && showAccessRequirementWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n step: getNextRequestStep(\n managedACTAccessRequirement!,\n requestDataStep,\n ),\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={goToPreviousRequestStep}\n onEDucContinue={\n managedACTAccessRequirement?.eDucTemplateId\n ? goToNextRequestStep\n : undefined\n }\n />\n )\n break\n case RequestDataStep.REVIEW_DUC:\n renderContent = (\n <ReviewDucStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onCreateDuc={goToNextRequestStep}\n />\n )\n break\n case RequestDataStep.EDUC_PREVIEW:\n renderContent = (\n <EDucPreviewStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onSendForSignature={() => {\n // The signature-status step isn't useful right after routing (0 signatures collected,\n // Submit necessarily disabled), so surface a toast and close the wizard. The user can\n // resume from their in-flight requests table when signatures are ready.\n displayToast(\n 'Your DUC has been emailed to your collaborators. You can check signature progress in your access request history.',\n 'info',\n {\n primaryButtonConfig: {\n text: 'View Request History',\n // Resolves to a same-origin path on synapse.org and to the absolute synapse.org URL when embedded in a portal.\n href: `${getEndpoint(BackendDestinationEnum.PORTAL_ENDPOINT)}RequestHistory:default`,\n },\n dismissOnPrimaryButtonClick: true,\n },\n )\n onHide()\n }}\n onManualUpload={goToNextRequestStep}\n />\n )\n break\n case RequestDataStep.MANUAL_UPLOAD_DUC:\n renderContent = (\n <ManualUploadDucStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onBackClicked={goToPreviousRequestStep}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n />\n )\n break\n case RequestDataStep.SIGNATURE_STATUS:\n renderContent = (\n <SignatureStatusStep\n managedACTAccessRequirement={accessRequirementInWizard!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onBackClicked={() => {\n // Back from SIGNATURE_STATUS returns to the first step of the request so the user can\n // modify the request. EDUC_PREVIEW is skipped because Send-for-signature toasts and\n // closes the wizard, so users only reach this step from the row-level \"Review\n // Signatures and Submit\" entry point.\n requestDataStepCallback({\n step: getFirstRequestStep(accessRequirementInWizard!),\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n />\n )\n break\n case RequestDataStep.SCHEMA_DRIVEN_REQUEST:\n renderContent = (\n <JsonSchemaRequestWizard\n accessRequirement={jsonSchemaAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onEDucContinue={\n jsonSchemaAccessRequirement?.eDucTemplateId\n ? goToNextRequestStep\n : undefined\n }\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? getFirstRequestStep(accessRequirement)\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AccessRequirement, RestrictableObjectType } from '@sage-bionetworks/synapse-types';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { RequestableAccessRequirement } from '
|
|
3
|
+
import { RequestableAccessRequirement } from '@/utils/types/RequestableAccessRequirement';
|
|
4
4
|
export type AccessRequirementListItemProps = {
|
|
5
5
|
accessRequirement: AccessRequirement;
|
|
6
6
|
onHide: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementListItem.d.ts","sourceRoot":"","sources":["../../../src/components/AccessRequirementList/AccessRequirementListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EAMjB,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"AccessRequirementListItem.d.ts","sourceRoot":"","sources":["../../../src/components/AccessRequirementList/AccessRequirementListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EAMjB,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAA;AAMzF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,eAAe,EAAE,CAAC,iBAAiB,EAAE,4BAA4B,KAAK,IAAI,CAAA;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC,CAAA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GACpC,KAAK,CAAC,SAAS,CA4CjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementListItem.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementListItem.tsx"],"sourcesContent":["import {\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n AccessRequirement,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport React from 'react'\nimport { RequestableAccessRequirement } from '
|
|
1
|
+
{"version":3,"file":"AccessRequirementListItem.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementListItem.tsx"],"sourcesContent":["import {\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n AccessRequirement,\n JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport React from 'react'\nimport { RequestableAccessRequirement } from '@/utils/types/RequestableAccessRequirement'\nimport UnmanagedACTAccessRequirementItem from './RequirementItem/UnmanagedACTAccessRequirementItem'\nimport RequestableAccessRequirementItem from './ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItem'\nimport SelfSignAccessRequirementItem from './RequirementItem/SelfSignAccessRequirementItem'\nimport LockAccessRequirementItem from './RequirementItem/LockAccessRequirementItem'\n\nexport type AccessRequirementListItemProps = {\n accessRequirement: AccessRequirement\n onHide: () => void\n onRequestAccess: (accessRequirement: RequestableAccessRequirement) => void\n subjectId?: string\n subjectType?: RestrictableObjectType\n}\n\n/**\n * Renders an individual AR item for the AccessRequirementList\n */\nexport function AccessRequirementListItem(\n props: AccessRequirementListItemProps,\n): React.ReactNode {\n const { accessRequirement, subjectId, subjectType, onHide, onRequestAccess } =\n props\n switch (accessRequirement.concreteType) {\n case SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n case TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n return (\n <SelfSignAccessRequirementItem\n accessRequirement={accessRequirement}\n onHide={onHide}\n />\n )\n case ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n return (\n <UnmanagedACTAccessRequirementItem\n accessRequirement={accessRequirement}\n onHide={onHide}\n subjectId={subjectId}\n subjectType={subjectType}\n />\n )\n case MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n case JSON_SCHEMA_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n return (\n <RequestableAccessRequirementItem\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onRejectTerms={onHide}\n onRequestAccess={() => {\n onRequestAccess(accessRequirement)\n }}\n />\n )\n case LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE:\n return <LockAccessRequirementItem />\n // case not supported yet\n default:\n console.warn(\n 'Unsupported access requirement type:',\n (accessRequirement as AccessRequirement).concreteType,\n )\n return <></>\n }\n}\n"],"mappings":";;;;;;;;AA4BA,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,sBAAmB,cAAW,gBAAa,WAAQ,uBACzD;CACF,QAAQ,EAAkB,cAA1B;EACE,KAAK;EACL,KAAK,GACH,OACE,kBAAC,GAAD;GACqB;GACX;EACT,CAAA;EAEL,KAAK,GACH,OACE,kBAAC,GAAD;GACqB;GACX;GACG;GACE;EACd,CAAA;EAEL,KAAK;EACL,KAAK,GACH,OACE,kBAAC,GAAD;GACqB;GACR;GACE;GACb,eAAe;GACf,uBAAuB;IACrB,EAAgB,CAAiB;GACnC;EACD,CAAA;EAEL,KAAK,GACH,OAAO,kBAAC,GAAD,CAA4B,CAAA;EAErC,SAKE,OAJA,QAAQ,KACN,wCACC,EAAwC,YAC3C,GACO,kBAAA,GAAA,CAAI,CAAA;CACf;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EDucPreviewStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.tsx"],"names":[],"mappings":"AAmCA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAIlE,eAAO,MAAM,8BAA8B,kCAAkC,CAAA;AAE7E,eAAO,MAAM,4BAA4B,8CACI,CAAA;AAC7C,eAAO,MAAM,6BAA6B,sBAAsB,CAAA;AAChE,eAAO,MAAM,wBAAwB,iBAAiB,CAAA;AAEtD,eAAO,MAAM,4BAA4B,yBAAyB,CAAA;AAClE,eAAO,MAAM,mCAAmC,+BAA+B,CAAA;AAW/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,2BAA2B,EAAE,4BAA4B,CAAA;IACzD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"EDucPreviewStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.tsx"],"names":[],"mappings":"AAmCA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAIlE,eAAO,MAAM,8BAA8B,kCAAkC,CAAA;AAE7E,eAAO,MAAM,4BAA4B,8CACI,CAAA;AAC7C,eAAO,MAAM,6BAA6B,sBAAsB,CAAA;AAChE,eAAO,MAAM,wBAAwB,iBAAiB,CAAA;AAEtD,eAAO,MAAM,4BAA4B,yBAAyB,CAAA;AAClE,eAAO,MAAM,mCAAmC,+BAA+B,CAAA;AAW/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,2BAA2B,EAAE,4BAA4B,CAAA;IACzD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAiYlE"}
|
|
@@ -15,10 +15,10 @@ import { FileHandleAssociateType as pe } from "@sage-bionetworks/synapse-types";
|
|
|
15
15
|
//#region src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.tsx
|
|
16
16
|
var g = "500px", _ = "Send for electronic signature", v = "Keep your existing DUC or send a new one?", y = "Keep Existing DUC", b = "Send new DUC", x = "Restart DUC signing?", S = "I understand, send new DUC", me = "Sorry, we couldn't check the status of your existing signature request.", he = "Sorry, we couldn't apply your changes to your existing signature request.", ge = "Sorry, we couldn't cancel your existing signature request.", _e = "Sorry, we couldn't send your DUC for electronic signature.";
|
|
17
17
|
function C(u) {
|
|
18
|
-
let { managedACTAccessRequirement: C, onHide: ye, onBackClicked: be, onSendForSignature: E, onManualUpload: xe, previewSrcOverride: D } = u, { data: O, isLoading:
|
|
18
|
+
let { managedACTAccessRequirement: C, onHide: ye, onBackClicked: be, onSendForSignature: E, onManualUpload: xe, previewSrcOverride: D } = u, { data: O, isLoading: k } = t(String(C.id), {
|
|
19
19
|
staleTime: Infinity,
|
|
20
20
|
throwOnError: !0
|
|
21
|
-
}),
|
|
21
|
+
}), A = O?.id, j = String(C.id), M = !!O?.eDucSignatureEnvelopeId, { data: Se, isLoading: Ce, error: N } = r(A ?? "", { enabled: !!A }), P = Se?.fileHandleId, { blobUrl: F, error: I } = ce(D || !P || !A ? void 0 : e.getPortalFileHandleServletUrl(P, A, pe.DataAccessRequestAttachment)), { mutateAsync: we, isPending: Te, error: L, reset: Ee } = n(), { mutate: De, isPending: Oe, error: R, reset: ke } = ne({ onSuccess: () => E() }), { mutateAsync: Ae, isPending: je, error: z, reset: Me } = re(), { mutate: B, isPending: Ne, error: V, reset: Pe } = te({ onSuccess: () => E() }), { data: H, isLoading: Fe } = ee(A ?? "", { enabled: !!A }), U = H?.remaining != null && H.remaining <= 0, W = U && !M, [G, K] = o(null), [Ie, q] = o(!1), J = Te || Oe || je || Ne, Y = k || !!A && Ce || !D && !!P && !F && !I, X = Y || !D && !F || J, Le = X || Fe || W, Z = L && {
|
|
22
22
|
title: me,
|
|
23
23
|
reason: L.reason
|
|
24
24
|
} || R && {
|
|
@@ -30,23 +30,35 @@ function C(u) {
|
|
|
30
30
|
} || V && {
|
|
31
31
|
title: _e,
|
|
32
32
|
reason: V.reason
|
|
33
|
-
} ||
|
|
33
|
+
} || Ie && {
|
|
34
34
|
title: "Sorry, you've used all of your electronic signature requests.",
|
|
35
35
|
reason: /* @__PURE__ */ m(a, { quota: H?.quota })
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
},
|
|
39
|
-
if (!
|
|
40
|
-
if (
|
|
41
|
-
B(
|
|
36
|
+
}, Re = () => {
|
|
37
|
+
Ee(), ke(), Me(), Pe(), q(!1);
|
|
38
|
+
}, ze = async () => {
|
|
39
|
+
if (!A) return;
|
|
40
|
+
if (Re(), !M) {
|
|
41
|
+
B({
|
|
42
|
+
requestId: A,
|
|
43
|
+
accessRequirementId: j
|
|
44
|
+
});
|
|
42
45
|
return;
|
|
43
46
|
}
|
|
44
|
-
let e = await
|
|
47
|
+
let e = await we(A).catch(() => null);
|
|
45
48
|
e !== null && (e ? K("keepOrReplace") : U ? q(!0) : K("restartSigning"));
|
|
46
|
-
},
|
|
47
|
-
|
|
49
|
+
}, Be = () => {
|
|
50
|
+
A && (K(null), De({
|
|
51
|
+
requestId: A,
|
|
52
|
+
accessRequirementId: j
|
|
53
|
+
}));
|
|
48
54
|
}, Q = async () => {
|
|
49
|
-
|
|
55
|
+
A && (K(null), await Ae({
|
|
56
|
+
requestId: A,
|
|
57
|
+
accessRequirementId: j
|
|
58
|
+
}).then(() => !0, () => !1) && B({
|
|
59
|
+
requestId: A,
|
|
60
|
+
accessRequirementId: j
|
|
61
|
+
}));
|
|
50
62
|
}, $ = () => {
|
|
51
63
|
K(null);
|
|
52
64
|
};
|
|
@@ -116,9 +128,9 @@ function C(u) {
|
|
|
116
128
|
component: "span",
|
|
117
129
|
children: /* @__PURE__ */ m(l, {
|
|
118
130
|
variant: "contained",
|
|
119
|
-
disabled:
|
|
131
|
+
disabled: Le,
|
|
120
132
|
onClick: () => {
|
|
121
|
-
|
|
133
|
+
ze();
|
|
122
134
|
},
|
|
123
135
|
children: J ? "Sending..." : _
|
|
124
136
|
})
|
|
@@ -179,7 +191,7 @@ function C(u) {
|
|
|
179
191
|
}),
|
|
180
192
|
/* @__PURE__ */ m(l, {
|
|
181
193
|
variant: "contained",
|
|
182
|
-
onClick:
|
|
194
|
+
onClick: Be,
|
|
183
195
|
children: y
|
|
184
196
|
})
|
|
185
197
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EDucPreviewStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport { CANCEL_BUTTON_TEXT } from '@/components/ConfirmationDialog/ConfirmationDialog'\nimport { DialogBase } from '@/components/DialogBase'\nimport {\n useCheckDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureQuota,\n useInitiateDataAccessRequestSignature,\n useUpdateDataAccessRequestSignature,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport {\n Alert,\n Box,\n Button,\n ButtonProps,\n DialogActions,\n DialogContent,\n Divider,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { FileHandleAssociateType } from '@sage-bionetworks/synapse-types'\nimport { ReactNode, useState } from 'react'\nimport { useFetchBlobUrl } from '@/utils/hooks/useFetchBlobUrl'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport {\n SIGNATURE_QUOTA_EXHAUSTED_TITLE,\n SignatureQuotaExhaustedMessage,\n} from '../eDucSignatureUtils'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\nconst PDF_PREVIEW_HEIGHT = '500px'\n\nexport const SEND_FOR_SIGNATURE_BUTTON_TEXT = 'Send for electronic signature'\n\nexport const KEEP_OR_REPLACE_DIALOG_TITLE =\n 'Keep your existing DUC or send a new one?'\nexport const KEEP_EXISTING_DUC_BUTTON_TEXT = 'Keep Existing DUC'\nexport const SEND_NEW_DUC_BUTTON_TEXT = 'Send new DUC'\n\nexport const RESTART_SIGNING_DIALOG_TITLE = 'Restart DUC signing?'\nexport const RESTART_SIGNING_CONFIRM_BUTTON_TEXT = 'I understand, send new DUC'\n\nconst PRECHECK_ERROR_TITLE =\n \"Sorry, we couldn't check the status of your existing signature request.\"\nconst UPDATE_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't apply your changes to your existing signature request.\"\nconst VOID_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't cancel your existing signature request.\"\nconst INITIATE_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't send your DUC for electronic signature.\"\n\nexport type EDucPreviewStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n onHide: () => void\n onBackClicked: () => void\n onSendForSignature: () => void\n onManualUpload: () => void\n /**\n * Optional iframe `src` override for demos and stories. When set, the blob fetch is skipped\n * and this URL is used directly as the iframe src. Production callers should not set this.\n */\n previewSrcOverride?: string\n}\n\n/**\n * Wizard step shown after the \"Review / Create a DUC\" step (PORTALS-4414).\n * Displays the generated eDUC document in an iframe so the user can review it\n * before sending it for electronic signature (PORTALS-4378) or manually printing and\n * uploading a signed PDF (PORTALS-4379).\n */\nexport default function EDucPreviewStep(props: EDucPreviewStepProps) {\n const {\n managedACTAccessRequirement,\n onHide,\n onBackClicked,\n onSendForSignature,\n onManualUpload,\n previewSrcOverride,\n } = props\n\n const { data: dataAccessRequest, isLoading: isLoadingDar } =\n useGetDataAccessRequestForUpdate(String(managedACTAccessRequirement.id), {\n staleTime: Infinity,\n throwOnError: true,\n })\n\n const requestId = dataAccessRequest?.id\n const hasSignatureEnvelope = Boolean(\n dataAccessRequest?.eDucSignatureEnvelopeId,\n )\n\n // Once the user commits to sending, the preview query must not run again: GET\n // /dataAccessRequest/{id}/preview has server-side side effects (it creates a signature envelope\n // and resets the DAR to draft), and every signature mutation invalidates the DAR query key --\n // which would otherwise refetch the preview between the DELETE and the POST below. PLFM-9938\n // tracks making that endpoint side-effect free; until it lands the call stays a query (callers\n // read it declaratively) and this latch is what keeps it from firing at the wrong moment.\n //\n // This latches for the lifetime of the step rather than clearing when a send fails. Re-enabling\n // the query would refetch it (the preview is stale the moment it lands), firing those side\n // effects behind an error message -- worst of all after a successful void, where it would mint a\n // replacement envelope the user never asked for. The already-fetched preview stays on screen, and\n // leaving and re-entering the step regenerates it.\n const [hasStartedSendSequence, setHasStartedSendSequence] = useState(false)\n\n const {\n data: previewFileHandle,\n isLoading: isLoadingPreview,\n error: previewError,\n } = useGetDataAccessRequestPreview(requestId ?? '', {\n enabled: Boolean(requestId) && !hasStartedSendSequence,\n })\n\n const previewFileHandleId = previewFileHandle?.fileHandleId\n const { blobUrl, error: blobError } = useFetchBlobUrl(\n previewSrcOverride || !previewFileHandleId || !requestId\n ? undefined\n : SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n ),\n )\n\n const {\n mutateAsync: checkSignatureUpdatable,\n isPending: isCheckingSignatureUpdatable,\n error: precheckError,\n reset: resetPrecheck,\n } = useCheckDataAccessRequestSignatureUpdatable()\n\n const {\n mutate: updateSignature,\n isPending: isUpdatingSignature,\n error: updateSignatureError,\n reset: resetUpdateSignature,\n } = useUpdateDataAccessRequestSignature({\n onSuccess: () => onSendForSignature(),\n })\n\n const {\n mutateAsync: voidSignature,\n isPending: isVoidingSignature,\n error: voidSignatureError,\n reset: resetVoidSignature,\n } = useVoidDataAccessRequestSignature()\n\n const {\n mutate: initiateSignature,\n isPending: isInitiatingSignature,\n error: initiateSignatureError,\n reset: resetInitiateSignature,\n } = useInitiateDataAccessRequestSignature({\n onSuccess: () => onSendForSignature(),\n })\n\n // Preflight the quota so we can disable the send-for-signature action when the user is at\n // or over their limit. A fetch error falls back to the current enabled behavior so a quota\n // service outage doesn't spuriously block valid requests.\n const { data: signatureQuota, isLoading: isLoadingQuota } =\n useGetDataAccessRequestSignatureQuota(requestId ?? '', {\n enabled: Boolean(requestId),\n })\n const isAtOrOverQuota =\n signatureQuota?.remaining != null && signatureQuota.remaining <= 0\n // Only routing a new envelope spends a quota unit. With no envelope in flight, routing a new one\n // is the only thing Send can do, so an exhausted quota blocks the button outright. With one in\n // flight, Send may instead correct that envelope for free -- and only the server's precheck knows\n // which -- so the button stays enabled and the confirmation it opens gates the paid path.\n const isSendBlockedByQuota = isAtOrOverQuota && !hasSignatureEnvelope\n\n // Which send-confirmation the precheck selected, or `null` for none. Once an envelope exists,\n // Send always stops for an explicit decision from the user: either they choose between keeping\n // and replacing it, or they acknowledge that replacing it is the only option left.\n const [openConfirmation, setOpenConfirmation] = useState<\n 'keepOrReplace' | 'restartSigning' | null\n >(null)\n // Set when the server rejects an update that the client expected to succeed, leaving a recreate\n // -- which the user has no quota for -- as the only way forward.\n const [isRecreateBlockedByQuota, setIsRecreateBlockedByQuota] =\n useState(false)\n\n // The precheck and the mutation it selects are presented as a single action, so the button\n // stays in its sending state for the whole sequence rather than flickering between calls.\n const isSendingForSignature =\n isCheckingSignatureUpdatable ||\n isUpdatingSignature ||\n isVoidingSignature ||\n isInitiatingSignature\n\n const isLoading =\n isLoadingDar ||\n (Boolean(requestId) && isLoadingPreview) ||\n (!previewSrcOverride && !!previewFileHandleId && !blobUrl && !blobError)\n const actionsDisabled =\n isLoading || (!previewSrcOverride && !blobUrl) || isSendingForSignature\n // The quota governs what Send is allowed to do, so keep it disabled until that answer lands\n // rather than letting the user start a send we may be about to block. Deliberately not folded\n // into `isLoading`: the preview skeleton shouldn't wait on the quota, and the manual\n // print-and-upload path spends no quota and stays available throughout.\n const isSendDisabled =\n actionsDisabled || isLoadingQuota || isSendBlockedByQuota\n\n const sendError =\n (precheckError && {\n title: PRECHECK_ERROR_TITLE,\n reason: precheckError.reason,\n }) ||\n (updateSignatureError && {\n title: UPDATE_SIGNATURE_ERROR_TITLE,\n reason: updateSignatureError.reason,\n }) ||\n (voidSignatureError && {\n title: VOID_SIGNATURE_ERROR_TITLE,\n reason: voidSignatureError.reason,\n }) ||\n (initiateSignatureError && {\n title: INITIATE_SIGNATURE_ERROR_TITLE,\n reason: initiateSignatureError.reason,\n }) ||\n (isRecreateBlockedByQuota && {\n title: SIGNATURE_QUOTA_EXHAUSTED_TITLE,\n reason: <SignatureQuotaExhaustedMessage quota={signatureQuota?.quota} />,\n })\n\n const resetSendErrors = () => {\n resetPrecheck()\n resetUpdateSignature()\n resetVoidSignature()\n resetInitiateSignature()\n setIsRecreateBlockedByQuota(false)\n }\n\n const handleSendForSignature = async () => {\n if (!requestId) return\n resetSendErrors()\n setHasStartedSendSequence(true)\n\n if (!hasSignatureEnvelope) {\n initiateSignature(requestId)\n return\n }\n\n // `null` means the precheck itself failed; its error is surfaced by the alert below.\n const canUpdateEnvelope = await checkSignatureUpdatable(requestId).catch(\n () => null,\n )\n if (canUpdateEnvelope === null) {\n return\n }\n if (canUpdateEnvelope) {\n // Only the user knows whether their edits are material enough to warrant re-signing, so\n // the choice between correcting and replacing the envelope is theirs.\n setOpenConfirmation('keepOrReplace')\n } else if (isAtOrOverQuota) {\n // Replacing spends a routing the user doesn't have, so there is nothing to confirm.\n setIsRecreateBlockedByQuota(true)\n } else {\n setOpenConfirmation('restartSigning')\n }\n }\n\n const handleKeepExistingDuc = () => {\n if (!requestId) return\n setOpenConfirmation(null)\n updateSignature(requestId)\n }\n\n const handleSendNewDuc = async () => {\n if (!requestId) return\n setOpenConfirmation(null)\n const isVoided = await voidSignature(requestId).then(\n () => true,\n () => false,\n )\n if (!isVoided) {\n return\n }\n initiateSignature(requestId)\n }\n\n // Dismissing leaves the request untouched, so the user is still free to fall back to the\n // manual print-and-upload path.\n const handleCancelConfirmation = () => {\n setOpenConfirmation(null)\n }\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <Typography variant={'body1'} sx={{ fontWeight: 700, mb: 1 }}>\n Take a minute to preview your DUC\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Please ensure that all information is correct, as incorrect\n information will result in the rejection of your access request. Use\n the Back button to return to previous steps and modify any details.\n </Typography>\n\n {isLoading && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={PDF_PREVIEW_HEIGHT}\n data-testid={'EDucPreviewStep-loading'}\n />\n )}\n {!isLoading && (previewError || blobError) && (\n <Alert severity={'error'}>\n <strong>Sorry, we couldn't load your DUC preview.</strong>\n <br />\n {previewError?.reason ?? blobError?.message}\n </Alert>\n )}\n {!isLoading &&\n !previewError &&\n !blobError &&\n (previewSrcOverride || blobUrl) && (\n <iframe\n title={'eDUC preview'}\n src={previewSrcOverride ?? blobUrl}\n style={{ border: 0, width: '100%', height: PDF_PREVIEW_HEIGHT }}\n />\n )}\n\n <Box\n sx={{\n mt: 3,\n border: '1px solid',\n borderColor: 'grey.300',\n borderRadius: 1,\n }}\n >\n <ActionRow\n title={'Email DUC to Collaborators'}\n description={\n 'Complete and sign the DUC online by emailing a secure DocuSign link to your listed collaborators. Notifications will be sent directly to the email address associated with their Synapse accounts. This is fastest way to get access.'\n }\n action={\n <Tooltip\n title={\n isSendBlockedByQuota ? (\n <SignatureQuotaExhaustedMessage\n quota={signatureQuota?.quota}\n />\n ) : (\n ''\n )\n }\n arrow\n disableHoverListener={!isSendBlockedByQuota}\n disableFocusListener={!isSendBlockedByQuota}\n disableTouchListener={!isSendBlockedByQuota}\n >\n {/* Tooltip wrapper Box is needed because MUI Tooltip does not fire on disabled children directly. */}\n <Box component={'span'}>\n <Button\n variant={'contained'}\n disabled={isSendDisabled}\n onClick={() => {\n handleSendForSignature()\n }}\n >\n {isSendingForSignature\n ? 'Sending...'\n : SEND_FOR_SIGNATURE_BUTTON_TEXT}\n </Button>\n </Box>\n </Tooltip>\n }\n />\n <Divider />\n <ActionRow\n title={'Print and upload a PDF instead'}\n description={\n 'Download the DUC, sign it by hand, and upload the completed document.'\n }\n action={\n <Button\n variant={'outlined'}\n disabled={actionsDisabled}\n onClick={onManualUpload}\n >\n Manually print and upload PDF\n </Button>\n }\n />\n </Box>\n {sendError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>{sendError.title}</strong>\n <br />\n {sendError.reason}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n </DialogActions>\n <DialogBase\n open={openConfirmation === 'keepOrReplace'}\n title={KEEP_OR_REPLACE_DIALOG_TITLE}\n content={\n <>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n Your DUC was already signed and submitted. If your changes\n don't affect what's on it, you can keep it and resubmit.\n If they do, you'll need a new DUC, and your PI or Project\n Lead, Signing Official, and any named Collaborators will need to\n sign again.\n </Typography>\n <RemainingEDucAllowance remaining={signatureQuota?.remaining} />\n </>\n }\n onCancel={handleCancelConfirmation}\n actions={\n <>\n <Button variant={'outlined'} onClick={handleCancelConfirmation}>\n {CANCEL_BUTTON_TEXT}\n </Button>\n <SendNewDucButton\n quota={signatureQuota?.quota}\n isAtOrOverQuota={isAtOrOverQuota}\n variant={'outlined'}\n onClick={() => {\n handleSendNewDuc()\n }}\n >\n {SEND_NEW_DUC_BUTTON_TEXT}\n </SendNewDucButton>\n <Button variant={'contained'} onClick={handleKeepExistingDuc}>\n {KEEP_EXISTING_DUC_BUTTON_TEXT}\n </Button>\n </>\n }\n />\n <ConfirmationDialog\n open={openConfirmation === 'restartSigning'}\n title={RESTART_SIGNING_DIALOG_TITLE}\n content={\n <>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n Your DUC was already submitted for review, so it can't be\n edited. To submit your changes, we'll close the current DUC\n and send a new one for signature. Your PI or Project Lead, Signing\n Official, and any named Collaborators will need to sign again.\n </Typography>\n <RemainingEDucAllowance remaining={signatureQuota?.remaining} />\n </>\n }\n confirmButtonProps={{ children: RESTART_SIGNING_CONFIRM_BUTTON_TEXT }}\n onConfirm={() => {\n handleSendNewDuc()\n }}\n onCancel={handleCancelConfirmation}\n />\n </>\n )\n}\n\n/**\n * The month's remaining electronic DUC allowance. Omitted rather than guessed at when the quota\n * request has not resolved.\n */\nfunction RemainingEDucAllowance(props: { remaining: number | undefined }) {\n const { remaining } = props\n if (remaining == null) {\n return null\n }\n return (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mt: 2 }}>\n You can create <strong>{remaining}</strong> more electronic{' '}\n {remaining === 1 ? 'DUC' : 'DUCs'} this month.\n </Typography>\n )\n}\n\n/**\n * The \"send a new DUC\" action, disabled with an explanation when the user has no routings left.\n * Replacing an envelope always spends one, so this is the only action in the keep-or-replace\n * dialog that the quota can block.\n */\nfunction SendNewDucButton(\n props: ButtonProps & { quota: number | undefined; isAtOrOverQuota: boolean },\n) {\n const { quota, isAtOrOverQuota, ...buttonProps } = props\n return (\n <Tooltip\n title={\n isAtOrOverQuota ? <SignatureQuotaExhaustedMessage quota={quota} /> : ''\n }\n arrow\n disableHoverListener={!isAtOrOverQuota}\n disableFocusListener={!isAtOrOverQuota}\n disableTouchListener={!isAtOrOverQuota}\n >\n {/* Tooltip wrapper Box is needed because MUI Tooltip does not fire on disabled children directly. */}\n <Box component={'span'}>\n <Button {...buttonProps} disabled={isAtOrOverQuota} />\n </Box>\n </Tooltip>\n )\n}\n\nfunction ActionRow(props: {\n title: string\n description: string\n action: ReactNode\n}) {\n const { title, description, action } = props\n return (\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n sx={{ alignItems: { sm: 'center' }, gap: 2, p: 2 }}\n >\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant={'body1'} sx={{ fontWeight: 700, mb: 0.5 }}>\n {title}\n </Typography>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n {description}\n </Typography>\n </Box>\n <Box sx={{ flexShrink: 0 }}>{action}</Box>\n </Stack>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EDucPreviewStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport { CANCEL_BUTTON_TEXT } from '@/components/ConfirmationDialog/ConfirmationDialog'\nimport { DialogBase } from '@/components/DialogBase'\nimport {\n useCheckDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureQuota,\n useInitiateDataAccessRequestSignature,\n useUpdateDataAccessRequestSignature,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport {\n Alert,\n Box,\n Button,\n ButtonProps,\n DialogActions,\n DialogContent,\n Divider,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { FileHandleAssociateType } from '@sage-bionetworks/synapse-types'\nimport { ReactNode, useState } from 'react'\nimport { useFetchBlobUrl } from '@/utils/hooks/useFetchBlobUrl'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport {\n SIGNATURE_QUOTA_EXHAUSTED_TITLE,\n SignatureQuotaExhaustedMessage,\n} from '../eDucSignatureUtils'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\nconst PDF_PREVIEW_HEIGHT = '500px'\n\nexport const SEND_FOR_SIGNATURE_BUTTON_TEXT = 'Send for electronic signature'\n\nexport const KEEP_OR_REPLACE_DIALOG_TITLE =\n 'Keep your existing DUC or send a new one?'\nexport const KEEP_EXISTING_DUC_BUTTON_TEXT = 'Keep Existing DUC'\nexport const SEND_NEW_DUC_BUTTON_TEXT = 'Send new DUC'\n\nexport const RESTART_SIGNING_DIALOG_TITLE = 'Restart DUC signing?'\nexport const RESTART_SIGNING_CONFIRM_BUTTON_TEXT = 'I understand, send new DUC'\n\nconst PRECHECK_ERROR_TITLE =\n \"Sorry, we couldn't check the status of your existing signature request.\"\nconst UPDATE_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't apply your changes to your existing signature request.\"\nconst VOID_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't cancel your existing signature request.\"\nconst INITIATE_SIGNATURE_ERROR_TITLE =\n \"Sorry, we couldn't send your DUC for electronic signature.\"\n\nexport type EDucPreviewStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n onHide: () => void\n onBackClicked: () => void\n onSendForSignature: () => void\n onManualUpload: () => void\n /**\n * Optional iframe `src` override for demos and stories. When set, the blob fetch is skipped\n * and this URL is used directly as the iframe src. Production callers should not set this.\n */\n previewSrcOverride?: string\n}\n\n/**\n * Wizard step shown after the \"Review / Create a DUC\" step (PORTALS-4414).\n * Displays the generated eDUC document in an iframe so the user can review it\n * before sending it for electronic signature (PORTALS-4378) or manually printing and\n * uploading a signed PDF (PORTALS-4379).\n */\nexport default function EDucPreviewStep(props: EDucPreviewStepProps) {\n const {\n managedACTAccessRequirement,\n onHide,\n onBackClicked,\n onSendForSignature,\n onManualUpload,\n previewSrcOverride,\n } = props\n\n const { data: dataAccessRequest, isLoading: isLoadingDar } =\n useGetDataAccessRequestForUpdate(String(managedACTAccessRequirement.id), {\n staleTime: Infinity,\n throwOnError: true,\n })\n\n const requestId = dataAccessRequest?.id\n const accessRequirementId = String(managedACTAccessRequirement.id)\n // Set only once a routing has actually been sent -- generating the preview leaves the request\n // untouched -- so this cleanly separates a first send from a re-send. The signature mutations\n // invalidate this query, so a send from an earlier pass through the wizard is reflected here.\n const hasSignatureEnvelope = Boolean(\n dataAccessRequest?.eDucSignatureEnvelopeId,\n )\n\n const {\n data: previewFileHandle,\n isLoading: isLoadingPreview,\n error: previewError,\n } = useGetDataAccessRequestPreview(requestId ?? '', {\n enabled: Boolean(requestId),\n })\n\n const previewFileHandleId = previewFileHandle?.fileHandleId\n const { blobUrl, error: blobError } = useFetchBlobUrl(\n previewSrcOverride || !previewFileHandleId || !requestId\n ? undefined\n : SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n ),\n )\n\n const {\n mutateAsync: checkSignatureUpdatable,\n isPending: isCheckingSignatureUpdatable,\n error: precheckError,\n reset: resetPrecheck,\n } = useCheckDataAccessRequestSignatureUpdatable()\n\n const {\n mutate: updateSignature,\n isPending: isUpdatingSignature,\n error: updateSignatureError,\n reset: resetUpdateSignature,\n } = useUpdateDataAccessRequestSignature({\n onSuccess: () => onSendForSignature(),\n })\n\n const {\n mutateAsync: voidSignature,\n isPending: isVoidingSignature,\n error: voidSignatureError,\n reset: resetVoidSignature,\n } = useVoidDataAccessRequestSignature()\n\n const {\n mutate: initiateSignature,\n isPending: isInitiatingSignature,\n error: initiateSignatureError,\n reset: resetInitiateSignature,\n } = useInitiateDataAccessRequestSignature({\n onSuccess: () => onSendForSignature(),\n })\n\n // Preflight the quota so we can disable the send-for-signature action when the user is at\n // or over their limit. A fetch error falls back to the current enabled behavior so a quota\n // service outage doesn't spuriously block valid requests.\n const { data: signatureQuota, isLoading: isLoadingQuota } =\n useGetDataAccessRequestSignatureQuota(requestId ?? '', {\n enabled: Boolean(requestId),\n })\n const isAtOrOverQuota =\n signatureQuota?.remaining != null && signatureQuota.remaining <= 0\n // Only routing a new envelope spends a quota unit. With no envelope in flight, routing a new one\n // is the only thing Send can do, so an exhausted quota blocks the button outright. With one in\n // flight, Send may instead correct that envelope for free -- and only the server's precheck knows\n // which -- so the button stays enabled and the confirmation it opens gates the paid path.\n const isSendBlockedByQuota = isAtOrOverQuota && !hasSignatureEnvelope\n\n // Which send-confirmation the precheck selected, or `null` for none. Once an envelope exists,\n // Send always stops for an explicit decision from the user: either they choose between keeping\n // and replacing it, or they acknowledge that replacing it is the only option left.\n const [openConfirmation, setOpenConfirmation] = useState<\n 'keepOrReplace' | 'restartSigning' | null\n >(null)\n // Set when the server rejects an update that the client expected to succeed, leaving a recreate\n // -- which the user has no quota for -- as the only way forward.\n const [isRecreateBlockedByQuota, setIsRecreateBlockedByQuota] =\n useState(false)\n\n // The precheck and the mutation it selects are presented as a single action, so the button\n // stays in its sending state for the whole sequence rather than flickering between calls.\n const isSendingForSignature =\n isCheckingSignatureUpdatable ||\n isUpdatingSignature ||\n isVoidingSignature ||\n isInitiatingSignature\n\n const isLoading =\n isLoadingDar ||\n (Boolean(requestId) && isLoadingPreview) ||\n (!previewSrcOverride && !!previewFileHandleId && !blobUrl && !blobError)\n const actionsDisabled =\n isLoading || (!previewSrcOverride && !blobUrl) || isSendingForSignature\n // The quota governs what Send is allowed to do, so keep it disabled until that answer lands\n // rather than letting the user start a send we may be about to block. Deliberately not folded\n // into `isLoading`: the preview skeleton shouldn't wait on the quota, and the manual\n // print-and-upload path spends no quota and stays available throughout.\n const isSendDisabled =\n actionsDisabled || isLoadingQuota || isSendBlockedByQuota\n\n const sendError =\n (precheckError && {\n title: PRECHECK_ERROR_TITLE,\n reason: precheckError.reason,\n }) ||\n (updateSignatureError && {\n title: UPDATE_SIGNATURE_ERROR_TITLE,\n reason: updateSignatureError.reason,\n }) ||\n (voidSignatureError && {\n title: VOID_SIGNATURE_ERROR_TITLE,\n reason: voidSignatureError.reason,\n }) ||\n (initiateSignatureError && {\n title: INITIATE_SIGNATURE_ERROR_TITLE,\n reason: initiateSignatureError.reason,\n }) ||\n (isRecreateBlockedByQuota && {\n title: SIGNATURE_QUOTA_EXHAUSTED_TITLE,\n reason: <SignatureQuotaExhaustedMessage quota={signatureQuota?.quota} />,\n })\n\n const resetSendErrors = () => {\n resetPrecheck()\n resetUpdateSignature()\n resetVoidSignature()\n resetInitiateSignature()\n setIsRecreateBlockedByQuota(false)\n }\n\n const handleSendForSignature = async () => {\n if (!requestId) return\n resetSendErrors()\n\n // Routing creates the envelope as well as sending it, so with nothing in flight there is no\n // existing envelope to reconcile against.\n if (!hasSignatureEnvelope) {\n initiateSignature({ requestId, accessRequirementId })\n return\n }\n\n // `null` means the precheck itself failed; its error is surfaced by the alert below.\n const canUpdateEnvelope = await checkSignatureUpdatable(requestId).catch(\n () => null,\n )\n if (canUpdateEnvelope === null) {\n return\n }\n if (canUpdateEnvelope) {\n // Only the user knows whether their edits are material enough to warrant re-signing, so\n // the choice between correcting and replacing the envelope is theirs.\n setOpenConfirmation('keepOrReplace')\n } else if (isAtOrOverQuota) {\n // Replacing spends a routing the user doesn't have, so there is nothing to confirm.\n setIsRecreateBlockedByQuota(true)\n } else {\n setOpenConfirmation('restartSigning')\n }\n }\n\n const handleKeepExistingDuc = () => {\n if (!requestId) return\n setOpenConfirmation(null)\n updateSignature({ requestId, accessRequirementId })\n }\n\n const handleSendNewDuc = async () => {\n if (!requestId) return\n setOpenConfirmation(null)\n const isVoided = await voidSignature({\n requestId,\n accessRequirementId,\n }).then(\n () => true,\n () => false,\n )\n if (!isVoided) {\n return\n }\n initiateSignature({ requestId, accessRequirementId })\n }\n\n // Dismissing leaves the request untouched, so the user is still free to fall back to the\n // manual print-and-upload path.\n const handleCancelConfirmation = () => {\n setOpenConfirmation(null)\n }\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <Typography variant={'body1'} sx={{ fontWeight: 700, mb: 1 }}>\n Take a minute to preview your DUC\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Please ensure that all information is correct, as incorrect\n information will result in the rejection of your access request. Use\n the Back button to return to previous steps and modify any details.\n </Typography>\n\n {isLoading && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={PDF_PREVIEW_HEIGHT}\n data-testid={'EDucPreviewStep-loading'}\n />\n )}\n {!isLoading && (previewError || blobError) && (\n <Alert severity={'error'}>\n <strong>Sorry, we couldn't load your DUC preview.</strong>\n <br />\n {previewError?.reason ?? blobError?.message}\n </Alert>\n )}\n {!isLoading &&\n !previewError &&\n !blobError &&\n (previewSrcOverride || blobUrl) && (\n <iframe\n title={'eDUC preview'}\n src={previewSrcOverride ?? blobUrl}\n style={{ border: 0, width: '100%', height: PDF_PREVIEW_HEIGHT }}\n />\n )}\n\n <Box\n sx={{\n mt: 3,\n border: '1px solid',\n borderColor: 'grey.300',\n borderRadius: 1,\n }}\n >\n <ActionRow\n title={'Email DUC to Collaborators'}\n description={\n 'Complete and sign the DUC online by emailing a secure DocuSign link to your listed collaborators. Notifications will be sent directly to the email address associated with their Synapse accounts. This is fastest way to get access.'\n }\n action={\n <Tooltip\n title={\n isSendBlockedByQuota ? (\n <SignatureQuotaExhaustedMessage\n quota={signatureQuota?.quota}\n />\n ) : (\n ''\n )\n }\n arrow\n disableHoverListener={!isSendBlockedByQuota}\n disableFocusListener={!isSendBlockedByQuota}\n disableTouchListener={!isSendBlockedByQuota}\n >\n {/* Tooltip wrapper Box is needed because MUI Tooltip does not fire on disabled children directly. */}\n <Box component={'span'}>\n <Button\n variant={'contained'}\n disabled={isSendDisabled}\n onClick={() => {\n handleSendForSignature()\n }}\n >\n {isSendingForSignature\n ? 'Sending...'\n : SEND_FOR_SIGNATURE_BUTTON_TEXT}\n </Button>\n </Box>\n </Tooltip>\n }\n />\n <Divider />\n <ActionRow\n title={'Print and upload a PDF instead'}\n description={\n 'Download the DUC, sign it by hand, and upload the completed document.'\n }\n action={\n <Button\n variant={'outlined'}\n disabled={actionsDisabled}\n onClick={onManualUpload}\n >\n Manually print and upload PDF\n </Button>\n }\n />\n </Box>\n {sendError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>{sendError.title}</strong>\n <br />\n {sendError.reason}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n </DialogActions>\n <DialogBase\n open={openConfirmation === 'keepOrReplace'}\n title={KEEP_OR_REPLACE_DIALOG_TITLE}\n content={\n <>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n Your DUC was already signed and submitted. If your changes\n don't affect what's on it, you can keep it and resubmit.\n If they do, you'll need a new DUC, and your PI or Project\n Lead, Signing Official, and any named Collaborators will need to\n sign again.\n </Typography>\n <RemainingEDucAllowance remaining={signatureQuota?.remaining} />\n </>\n }\n onCancel={handleCancelConfirmation}\n actions={\n <>\n <Button variant={'outlined'} onClick={handleCancelConfirmation}>\n {CANCEL_BUTTON_TEXT}\n </Button>\n <SendNewDucButton\n quota={signatureQuota?.quota}\n isAtOrOverQuota={isAtOrOverQuota}\n variant={'outlined'}\n onClick={() => {\n handleSendNewDuc()\n }}\n >\n {SEND_NEW_DUC_BUTTON_TEXT}\n </SendNewDucButton>\n <Button variant={'contained'} onClick={handleKeepExistingDuc}>\n {KEEP_EXISTING_DUC_BUTTON_TEXT}\n </Button>\n </>\n }\n />\n <ConfirmationDialog\n open={openConfirmation === 'restartSigning'}\n title={RESTART_SIGNING_DIALOG_TITLE}\n content={\n <>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n Your DUC was already submitted for review, so it can't be\n edited. To submit your changes, we'll close the current DUC\n and send a new one for signature. Your PI or Project Lead, Signing\n Official, and any named Collaborators will need to sign again.\n </Typography>\n <RemainingEDucAllowance remaining={signatureQuota?.remaining} />\n </>\n }\n confirmButtonProps={{ children: RESTART_SIGNING_CONFIRM_BUTTON_TEXT }}\n onConfirm={() => {\n handleSendNewDuc()\n }}\n onCancel={handleCancelConfirmation}\n />\n </>\n )\n}\n\n/**\n * The month's remaining electronic DUC allowance. Omitted rather than guessed at when the quota\n * request has not resolved.\n */\nfunction RemainingEDucAllowance(props: { remaining: number | undefined }) {\n const { remaining } = props\n if (remaining == null) {\n return null\n }\n return (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mt: 2 }}>\n You can create <strong>{remaining}</strong> more electronic{' '}\n {remaining === 1 ? 'DUC' : 'DUCs'} this month.\n </Typography>\n )\n}\n\n/**\n * The \"send a new DUC\" action, disabled with an explanation when the user has no routings left.\n * Replacing an envelope always spends one, so this is the only action in the keep-or-replace\n * dialog that the quota can block.\n */\nfunction SendNewDucButton(\n props: ButtonProps & { quota: number | undefined; isAtOrOverQuota: boolean },\n) {\n const { quota, isAtOrOverQuota, ...buttonProps } = props\n return (\n <Tooltip\n title={\n isAtOrOverQuota ? <SignatureQuotaExhaustedMessage quota={quota} /> : ''\n }\n arrow\n disableHoverListener={!isAtOrOverQuota}\n disableFocusListener={!isAtOrOverQuota}\n disableTouchListener={!isAtOrOverQuota}\n >\n {/* Tooltip wrapper Box is needed because MUI Tooltip does not fire on disabled children directly. */}\n <Box component={'span'}>\n <Button {...buttonProps} disabled={isAtOrOverQuota} />\n </Box>\n </Tooltip>\n )\n}\n\nfunction ActionRow(props: {\n title: string\n description: string\n action: ReactNode\n}) {\n const { title, description, action } = props\n return (\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n sx={{ alignItems: { sm: 'center' }, gap: 2, p: 2 }}\n >\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant={'body1'} sx={{ fontWeight: 700, mb: 0.5 }}>\n {title}\n </Typography>\n <Typography variant={'body1'} sx={longFieldLabelSx}>\n {description}\n </Typography>\n </Box>\n <Box sx={{ flexShrink: 0 }}>{action}</Box>\n </Stack>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManualUploadDucStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAGL,sBAAsB,EAEvB,MAAM,iCAAiC,CAAA;AAOxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAElE,MAAM,MAAM,wBAAwB,GAAG;IACrC,2BAA2B,EAAE,4BAA4B,CAAA;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,sBAAsB,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"ManualUploadDucStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAGL,sBAAsB,EAEvB,MAAM,iCAAiC,CAAA;AAOxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAElE,MAAM,MAAM,wBAAwB,GAAG;IACrC,2BAA2B,EAAE,4BAA4B,CAAA;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,sBAAsB,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CA4R1E"}
|