synapse-react-client 4.0.42 → 4.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +6 -20
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +165 -159
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts +3 -2
- package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.js +23 -22
- package/dist/components/AccessRequirementList/AccessRequirementListItem.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.d.ts +4 -3
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js +6 -4
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.d.ts +22 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.js +166 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.js.map +1 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.d.ts +18 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.js +91 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.js.map +1 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.d.ts +33 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.js +49 -0
- package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js +26 -42
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +140 -155
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +43 -60
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts +4 -5
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +5 -5
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +88 -103
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js +14 -30
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItem.d.ts → RequestableAccessRequirementItem.d.ts} +9 -8
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItem.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItem.js → RequestableAccessRequirementItem.js} +16 -16
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItem.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItemView.d.ts → RequestableAccessRequirementItemView.d.ts} +5 -5
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItemView.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItemView.js → RequestableAccessRequirementItemView.js} +3 -4
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItemView.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +94 -110
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +0 -2
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +35 -52
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +79 -95
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts +2 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/RequestDataStep.d.ts +34 -0
- package/dist/components/AccessRequirementList/RequestDataStep.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/RequestDataStep.js +37 -0
- package/dist/components/AccessRequirementList/RequestDataStep.js.map +1 -0
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.d.ts +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
- package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/FormTemplatePreview.js +29 -30
- package/dist/components/FormTemplateEditor/FormTemplatePreview.js.map +1 -1
- package/dist/components/JsonSchemaForm/SchemaStepForm.d.ts +21 -0
- package/dist/components/JsonSchemaForm/SchemaStepForm.d.ts.map +1 -0
- package/dist/components/JsonSchemaForm/SchemaStepForm.js +29 -0
- package/dist/components/JsonSchemaForm/SchemaStepForm.js.map +1 -0
- package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.d.ts +2 -2
- package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.d.ts.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js +11 -10
- package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js.map +1 -1
- package/dist/components/SynapseForm/SynapseForm.js +28 -28
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +5 -4
- package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.d.ts.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +5 -4
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboardRouter.d.ts.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboardRouter.js +15 -15
- package/dist/features/curator/dashboard/CuratorDashboardRouter.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js +15 -14
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js.map +1 -1
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +7 -0
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -1
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +30 -15
- package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -1
- package/dist/mocks/dataaccess/MockDataAccessRequest.d.ts +3 -0
- package/dist/mocks/dataaccess/MockDataAccessRequest.d.ts.map +1 -1
- package/dist/mocks/dataaccess/MockDataAccessRequest.js +24 -12
- package/dist/mocks/dataaccess/MockDataAccessRequest.js.map +1 -1
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +42 -30
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.d.ts +19 -0
- package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.d.ts.map +1 -0
- package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.js +26 -0
- package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/hooks/useDetectSSOCode.d.ts.map +1 -1
- package/dist/utils/hooks/useDetectSSOCode.js +31 -26
- package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
- package/dist/utils/jsonschema/schemaData.d.ts +18 -0
- package/dist/utils/jsonschema/schemaData.d.ts.map +1 -0
- package/dist/utils/jsonschema/schemaData.js +26 -0
- package/dist/utils/jsonschema/schemaData.js.map +1 -0
- package/package.json +2 -2
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.d.ts.map +0 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js.map +0 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts.map +0 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +0 -1
|
@@ -1,48 +1,31 @@
|
|
|
1
1
|
import { useGetDataAccessRequestForUpdate as e } from "../../../../synapse-queries/dataaccess/useAccessRequirements.js";
|
|
2
2
|
import "../../../../synapse-queries/index.js";
|
|
3
|
-
import t from "../../../
|
|
3
|
+
import { DialogBaseTitle as t } from "../../../DialogBase.js";
|
|
4
4
|
import { longFieldLabelSx as n } from "../styles.js";
|
|
5
5
|
import r from "../ManagedACTAccessRequirementFormWikiWrapper.js";
|
|
6
6
|
import { ReviewCollaboratorsAndSigningOfficialAccordion as i } from "../ReviewCollaboratorsAndSigningOfficialAccordion.js";
|
|
7
|
-
import { Box as a, Button as o, DialogActions as s, DialogContent as c,
|
|
8
|
-
import { Fragment as
|
|
7
|
+
import { Box as a, Button as o, DialogActions as s, DialogContent as c, Typography as l } from "@mui/material";
|
|
8
|
+
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
9
|
//#region src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.tsx
|
|
10
|
-
function
|
|
11
|
-
let { managedACTAccessRequirement:
|
|
10
|
+
function p(p) {
|
|
11
|
+
let { managedACTAccessRequirement: m, onHide: h, onBackClicked: g, onCreateDuc: _ } = p, { data: v, isLoading: y } = e(String(m.id), {
|
|
12
12
|
staleTime: Infinity,
|
|
13
13
|
throwOnError: !0
|
|
14
|
-
}),
|
|
15
|
-
return /* @__PURE__ */
|
|
16
|
-
/* @__PURE__ */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
children: [
|
|
23
|
-
|
|
24
|
-
/* @__PURE__ */ m(a, { sx: { flexGrow: 1 } }),
|
|
25
|
-
/* @__PURE__ */ m(u, {
|
|
26
|
-
"aria-label": "Close",
|
|
27
|
-
onClick: v,
|
|
28
|
-
children: /* @__PURE__ */ m(t, {
|
|
29
|
-
icon: "close",
|
|
30
|
-
wrap: !1,
|
|
31
|
-
sx: { color: "grey.700" }
|
|
32
|
-
})
|
|
33
|
-
})
|
|
34
|
-
]
|
|
35
|
-
}) }),
|
|
36
|
-
/* @__PURE__ */ m(c, { children: /* @__PURE__ */ m(r, {
|
|
37
|
-
managedACTAccessRequirementId: String(_.id),
|
|
38
|
-
hideWiki: x,
|
|
39
|
-
children: /* @__PURE__ */ h(a, { children: [
|
|
40
|
-
/* @__PURE__ */ m(f, {
|
|
14
|
+
}), b = v?.accessorChanges ?? [], x = v?.principalInvestigator, S = v?.signingOfficial;
|
|
15
|
+
return /* @__PURE__ */ f(u, { children: [
|
|
16
|
+
/* @__PURE__ */ d(t, {
|
|
17
|
+
title: "Request Access",
|
|
18
|
+
onCancel: h
|
|
19
|
+
}),
|
|
20
|
+
/* @__PURE__ */ d(c, { children: /* @__PURE__ */ d(r, {
|
|
21
|
+
accessRequirement: m,
|
|
22
|
+
children: /* @__PURE__ */ f(a, { children: [
|
|
23
|
+
/* @__PURE__ */ d(l, {
|
|
41
24
|
variant: "headline3",
|
|
42
25
|
sx: { mb: 2 },
|
|
43
26
|
children: "Sign a Data Use Certificate (DUC)"
|
|
44
27
|
}),
|
|
45
|
-
/* @__PURE__ */
|
|
28
|
+
/* @__PURE__ */ d(l, {
|
|
46
29
|
variant: "body1",
|
|
47
30
|
sx: {
|
|
48
31
|
...n,
|
|
@@ -50,7 +33,7 @@ function g(g) {
|
|
|
50
33
|
},
|
|
51
34
|
children: "The DUC may be signed electronically."
|
|
52
35
|
}),
|
|
53
|
-
/* @__PURE__ */
|
|
36
|
+
/* @__PURE__ */ d(l, {
|
|
54
37
|
variant: "body1",
|
|
55
38
|
sx: {
|
|
56
39
|
...n,
|
|
@@ -58,7 +41,7 @@ function g(g) {
|
|
|
58
41
|
},
|
|
59
42
|
children: "Please verify the information of each data requester listed in the previous step. Ensure all email addresses are accurate. You can click the BACK button, below, to modify your list of collaborators and Signing Official if necessary."
|
|
60
43
|
}),
|
|
61
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ d(l, {
|
|
62
45
|
variant: "body1",
|
|
63
46
|
sx: {
|
|
64
47
|
...n,
|
|
@@ -66,7 +49,7 @@ function g(g) {
|
|
|
66
49
|
},
|
|
67
50
|
children: "If any information is incorrect, the request will be rejected."
|
|
68
51
|
}),
|
|
69
|
-
/* @__PURE__ */
|
|
52
|
+
/* @__PURE__ */ f(l, {
|
|
70
53
|
variant: "body1",
|
|
71
54
|
sx: {
|
|
72
55
|
...n,
|
|
@@ -74,40 +57,40 @@ function g(g) {
|
|
|
74
57
|
},
|
|
75
58
|
children: [
|
|
76
59
|
"Click ",
|
|
77
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ d("strong", { children: "Create a DUC" }),
|
|
78
61
|
" to generate a document and review it before sending it to your collaborators, PI, and Signing Official."
|
|
79
62
|
]
|
|
80
63
|
}),
|
|
81
|
-
/* @__PURE__ */
|
|
82
|
-
accessorChanges:
|
|
83
|
-
principalInvestigator:
|
|
84
|
-
signingOfficial:
|
|
85
|
-
isLoading:
|
|
64
|
+
/* @__PURE__ */ d(i, {
|
|
65
|
+
accessorChanges: b,
|
|
66
|
+
principalInvestigator: x,
|
|
67
|
+
signingOfficial: S,
|
|
68
|
+
isLoading: y
|
|
86
69
|
})
|
|
87
70
|
] })
|
|
88
71
|
}) }),
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ f(s, { children: [
|
|
73
|
+
/* @__PURE__ */ d(o, {
|
|
91
74
|
variant: "outlined",
|
|
92
|
-
onClick:
|
|
75
|
+
onClick: g,
|
|
93
76
|
children: "Back"
|
|
94
77
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
96
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ d(a, { sx: { flexGrow: 1 } }),
|
|
79
|
+
/* @__PURE__ */ d(o, {
|
|
97
80
|
variant: "outlined",
|
|
98
|
-
onClick:
|
|
81
|
+
onClick: h,
|
|
99
82
|
children: "Cancel"
|
|
100
83
|
}),
|
|
101
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ d(o, {
|
|
102
85
|
variant: "contained",
|
|
103
|
-
disabled:
|
|
104
|
-
onClick:
|
|
86
|
+
disabled: y,
|
|
87
|
+
onClick: _,
|
|
105
88
|
children: "Create a DUC"
|
|
106
89
|
})
|
|
107
90
|
] })
|
|
108
91
|
] });
|
|
109
92
|
}
|
|
110
93
|
//#endregion
|
|
111
|
-
export {
|
|
94
|
+
export { p as default };
|
|
112
95
|
|
|
113
96
|
//# sourceMappingURL=ReviewDucStep.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewDucStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.tsx"],"sourcesContent":["import { useGetDataAccessRequestForUpdate } from '@/synapse-queries'\nimport {\n Box,\n Button,\n DialogActions,\n DialogContent,\n
|
|
1
|
+
{"version":3,"file":"ReviewDucStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.tsx"],"sourcesContent":["import { useGetDataAccessRequestForUpdate } from '@/synapse-queries'\nimport {\n Box,\n Button,\n DialogActions,\n DialogContent,\n Typography,\n} from '@mui/material'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport ManagedACTAccessRequirementFormWikiWrapper from '../ManagedACTAccessRequirementFormWikiWrapper'\nimport { ReviewCollaboratorsAndSigningOfficialAccordion } from '../ReviewCollaboratorsAndSigningOfficialAccordion'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\nexport type ReviewDucStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n onHide: () => void\n onBackClicked: () => void\n /**\n * Called when the user clicks \"Create a DUC\". The parent advances to the eDUC preview step\n * (PORTALS-4377), where the generated document is displayed for review before signing.\n */\n onCreateDuc: () => void\n}\n\n/**\n * Wizard step shown after accessors/files (PORTALS-4375) and before the eDUC preview (PORTALS-4377).\n * Lets the user confirm their collaborators, PI, and Signing Official before generating the DUC.\n */\nexport default function ReviewDucStep(props: ReviewDucStepProps) {\n const { managedACTAccessRequirement, onHide, onBackClicked, onCreateDuc } =\n props\n\n const { data: dataAccessRequest, isLoading } =\n useGetDataAccessRequestForUpdate(String(managedACTAccessRequirement.id), {\n staleTime: Infinity,\n throwOnError: true,\n })\n\n const accessorChanges = dataAccessRequest?.accessorChanges ?? []\n const pi = dataAccessRequest?.principalInvestigator\n const so = dataAccessRequest?.signingOfficial\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <ManagedACTAccessRequirementFormWikiWrapper\n accessRequirement={managedACTAccessRequirement}\n >\n <Box>\n <Typography variant={'headline3'} sx={{ mb: 2 }}>\n Sign a Data Use Certificate (DUC)\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n The DUC may be signed electronically.\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Please verify the information of each data requester listed in the\n previous step. Ensure all email addresses are accurate. You can\n click the BACK button, below, to modify your list of collaborators\n and Signing Official if necessary.\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n If any information is incorrect, the request will be rejected.\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 3 }}>\n Click <strong>Create a DUC</strong> to generate a document and\n review it before sending it to your collaborators, PI, and Signing\n Official.\n </Typography>\n\n <ReviewCollaboratorsAndSigningOfficialAccordion\n accessorChanges={accessorChanges}\n principalInvestigator={pi}\n signingOfficial={so}\n isLoading={isLoading}\n />\n </Box>\n </ManagedACTAccessRequirementFormWikiWrapper>\n </DialogContent>\n <DialogActions>\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n <Box sx={{ flexGrow: 1 }} />\n <Button variant={'outlined'} onClick={onHide}>\n Cancel\n </Button>\n <Button\n variant={'contained'}\n disabled={isLoading}\n onClick={onCreateDuc}\n >\n Create a DUC\n </Button>\n </DialogActions>\n </>\n )\n}\n"],"mappings":";;;;;;;;;AA6BA,SAAwB,EAAc,GAA2B;CAC/D,IAAM,EAAE,gCAA6B,WAAQ,kBAAe,mBAC1D,GAEI,EAAE,MAAM,GAAmB,iBAC/B,EAAiC,OAAO,EAA4B,EAAE,GAAG;EACvE,WAAW;EACX,cAAc;CAChB,CAAC,GAEG,IAAkB,GAAmB,mBAAmB,CAAC,GACzD,IAAK,GAAmB,uBACxB,IAAK,GAAmB;CAE9B,OACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAiB,OAAO;GAAkB,UAAU;EAAS,CAAA;EAC7D,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GACE,mBAAmB;aAEnB,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAY,SAAS;KAAa,IAAI,EAAE,IAAI,EAAE;eAAG;IAErC,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAS;KAAS,IAAI;MAAE,GAAG;MAAkB,IAAI;KAAE;eAAG;IAEtD,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAS;KAAS,IAAI;MAAE,GAAG;MAAkB,IAAI;KAAE;eAAG;IAKtD,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAS;KAAS,IAAI;MAAE,GAAG;MAAkB,IAAI;KAAE;eAAG;IAEtD,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAS;KAAS,IAAI;MAAE,GAAG;MAAkB,IAAI;KAAE;eAA/D;MAAkE;MAC1D,kBAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA;MAAC;KAGzB;;IAEZ,kBAAC,GAAD;KACmB;KACjB,uBAAuB;KACvB,iBAAiB;KACN;IACZ,CAAA;GACE,EAAA,CAAA;EACqC,CAAA,EAC/B,CAAA;EACf,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IAAQ,SAAS;IAAY,SAAS;cAAe;GAE7C,CAAA;GACR,kBAAC,GAAD,EAAK,IAAI,EAAE,UAAU,EAAE,EAAI,CAAA;GAC3B,kBAAC,GAAD;IAAQ,SAAS;IAAY,SAAS;cAAQ;GAEtC,CAAA;GACR,kBAAC,GAAD;IACE,SAAS;IACT,UAAU;IACV,SAAS;cACV;GAEO,CAAA;EACK,EAAA,CAAA;CACf,EAAA,CAAA;AAEN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignatureStatusStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SignatureStatusStep.d.ts","sourceRoot":"","sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"names":[],"mappings":"AAkCA,OAAO,EAEL,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAKxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAYlE,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;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CA0P1E"}
|
|
@@ -2,20 +2,20 @@ import { PRODUCTION_ENDPOINT_CONFIG as e } from "../../../../utils/functions/get
|
|
|
2
2
|
import t from "../../../../synapse-client/index.js";
|
|
3
3
|
import { useSubmitDataAccessRequest as n } from "../../../../synapse-queries/dataaccess/useDataAccessSubmission.js";
|
|
4
4
|
import { useGetDataAccessRequestForUpdate as r, useUpdateDataAccessRequest as i } from "../../../../synapse-queries/dataaccess/useAccessRequirements.js";
|
|
5
|
-
import { useGetDataAccessRequestPreview as
|
|
5
|
+
import { useGetDataAccessRequestPreview as ee, useGetDataAccessRequestSignatureStatus as te, useGetDataAccessRequestSignatureUpdatable as ne, useGetDataAccessRequestSignedFileHandleId as a } from "../../../../synapse-queries/dataaccess/useEDuc.js";
|
|
6
6
|
import "../../../../synapse-queries/index.js";
|
|
7
|
-
import o from "../../../
|
|
7
|
+
import { DialogBaseTitle as o } from "../../../DialogBase.js";
|
|
8
8
|
import { formatDate as s } from "../../../../utils/functions/DateFormatter.js";
|
|
9
9
|
import { longFieldLabelSx as c } from "../styles.js";
|
|
10
10
|
import { useState as l } from "react";
|
|
11
|
-
import { Alert as u, Box as d, Button as f, DialogActions as
|
|
12
|
-
import { Fragment as
|
|
13
|
-
import { FileHandleAssociateType as
|
|
14
|
-
import { EDucSignerStatusStatusEnum as
|
|
15
|
-
import { CheckCircleOutline as
|
|
16
|
-
import
|
|
11
|
+
import { Alert as u, Box as d, Button as f, DialogActions as p, DialogContent as m, Link as h, Skeleton as g, Stack as re, Typography as _ } from "@mui/material";
|
|
12
|
+
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
13
|
+
import { FileHandleAssociateType as x } from "@sage-bionetworks/synapse-types";
|
|
14
|
+
import { EDucSignerStatusStatusEnum as S } from "@sage-bionetworks/synapse-client";
|
|
15
|
+
import { CheckCircleOutline as C, HourglassEmpty as w, OpenInNew as T, Refresh as E } from "@mui/icons-material";
|
|
16
|
+
import D from "dayjs";
|
|
17
17
|
//#region src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx
|
|
18
|
-
var
|
|
18
|
+
var O = {
|
|
19
19
|
mx: 0,
|
|
20
20
|
my: .5,
|
|
21
21
|
pl: 1.5,
|
|
@@ -23,58 +23,42 @@ var k = {
|
|
|
23
23
|
borderColor: "grey.300",
|
|
24
24
|
color: "grey.700"
|
|
25
25
|
};
|
|
26
|
-
function
|
|
27
|
-
let { managedACTAccessRequirement: s, subjectId:
|
|
26
|
+
function k(e) {
|
|
27
|
+
let { managedACTAccessRequirement: s, subjectId: S, subjectType: D, onHide: O, onBackClicked: k, onSubmissionCreated: A, viewDucHrefOverride: j } = e, { data: M, isLoading: ae } = r(String(s.id), {
|
|
28
28
|
staleTime: Infinity,
|
|
29
29
|
throwOnError: !0
|
|
30
|
-
}),
|
|
31
|
-
onSuccess: (e) =>
|
|
32
|
-
onError: (e) =>
|
|
33
|
-
}),
|
|
34
|
-
if (!
|
|
35
|
-
|
|
36
|
-
let e = await
|
|
37
|
-
...
|
|
38
|
-
ducFileHandleId:
|
|
30
|
+
}), N = M?.id ?? "", { data: P, isLoading: F, isRefetching: I, error: L, refetch: R } = te(N, { enabled: !!N }), z = P?.signerStatus ?? [], B = z.filter((e) => e.status === "done").length, V = z.length, H = V > 0 && B === V, U = z.filter((e) => e.status !== "done"), { data: W } = ne(N, { enabled: !!N && !H }), { data: G } = ee(N, { enabled: !!N && !j }), K = j ?? (G?.fileHandleId && N ? t.getPortalFileHandleServletUrl(G.fileHandleId, N, x.DataAccessRequestAttachment) : void 0), { data: q } = a(N, { enabled: !!N && H }), [J, Y] = l(), [X, Z] = l(), { mutateAsync: oe, isPending: se } = i({ onError: (e) => Y(e.reason) }), { mutate: ce, isPending: Q } = n({
|
|
31
|
+
onSuccess: (e) => A(e.submissionId),
|
|
32
|
+
onError: (e) => Z(e.reason)
|
|
33
|
+
}), le = ae || F || I || !M || !H || !q?.fileHandleId || se || Q, $ = async () => {
|
|
34
|
+
if (!M || !q?.fileHandleId) return;
|
|
35
|
+
Y(void 0), Z(void 0);
|
|
36
|
+
let e = await oe({
|
|
37
|
+
...M,
|
|
38
|
+
ducFileHandleId: q.fileHandleId
|
|
39
39
|
}).catch(() => null);
|
|
40
|
-
e &&
|
|
40
|
+
e && ce({
|
|
41
41
|
request: {
|
|
42
42
|
requestId: e.id,
|
|
43
43
|
requestEtag: e.etag,
|
|
44
|
-
subjectId:
|
|
45
|
-
subjectType:
|
|
44
|
+
subjectId: S,
|
|
45
|
+
subjectType: D
|
|
46
46
|
},
|
|
47
47
|
accessRequirementId: String(s.id)
|
|
48
48
|
});
|
|
49
49
|
};
|
|
50
|
-
return /* @__PURE__ */
|
|
51
|
-
/* @__PURE__ */
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
children: [
|
|
58
|
-
"Request Access",
|
|
59
|
-
/* @__PURE__ */ x(d, { sx: { flexGrow: 1 } }),
|
|
60
|
-
/* @__PURE__ */ x(h, {
|
|
61
|
-
"aria-label": "Close",
|
|
62
|
-
onClick: k,
|
|
63
|
-
children: /* @__PURE__ */ x(o, {
|
|
64
|
-
icon: "close",
|
|
65
|
-
wrap: !1,
|
|
66
|
-
sx: { color: "grey.700" }
|
|
67
|
-
})
|
|
68
|
-
})
|
|
69
|
-
]
|
|
70
|
-
}) }),
|
|
71
|
-
/* @__PURE__ */ S(p, { children: [
|
|
72
|
-
/* @__PURE__ */ x(y, {
|
|
50
|
+
return /* @__PURE__ */ b(v, { children: [
|
|
51
|
+
/* @__PURE__ */ y(o, {
|
|
52
|
+
title: "Request Access",
|
|
53
|
+
onCancel: O
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ b(m, { children: [
|
|
56
|
+
/* @__PURE__ */ y(_, {
|
|
73
57
|
variant: "headline3",
|
|
74
58
|
sx: { mb: 2 },
|
|
75
59
|
children: "Sign a Data Use Certificate (DUC)"
|
|
76
60
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ y(_, {
|
|
78
62
|
variant: "body1",
|
|
79
63
|
sx: {
|
|
80
64
|
...c,
|
|
@@ -82,7 +66,7 @@ function A(e) {
|
|
|
82
66
|
},
|
|
83
67
|
children: "Your DUC has been emailed to your Collaborators. Once all signatures (including the Signing Official) have been collected, you can submit the Data Access Request."
|
|
84
68
|
}),
|
|
85
|
-
|
|
69
|
+
k && P && !H && W && /* @__PURE__ */ b(_, {
|
|
86
70
|
variant: "body1",
|
|
87
71
|
sx: {
|
|
88
72
|
...c,
|
|
@@ -91,26 +75,26 @@ function A(e) {
|
|
|
91
75
|
children: [
|
|
92
76
|
"You can update the list of Collaborators by pressing",
|
|
93
77
|
" ",
|
|
94
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ y("strong", { children: "Back" }),
|
|
95
79
|
". Your changes will be applied to this signature request, so anyone who has already signed will not need to sign again."
|
|
96
80
|
]
|
|
97
81
|
}),
|
|
98
|
-
|
|
82
|
+
F && /* @__PURE__ */ y(g, {
|
|
99
83
|
variant: "rectangular",
|
|
100
84
|
width: "100%",
|
|
101
85
|
height: 120,
|
|
102
86
|
"data-testid": "SignatureStatusStep-loading"
|
|
103
87
|
}),
|
|
104
|
-
|
|
88
|
+
L && /* @__PURE__ */ b(u, {
|
|
105
89
|
severity: "error",
|
|
106
90
|
children: [
|
|
107
|
-
/* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
|
|
91
|
+
/* @__PURE__ */ y("strong", { children: "Sorry, we couldn't load the current signature status." }),
|
|
92
|
+
/* @__PURE__ */ y("br", {}),
|
|
93
|
+
L.reason
|
|
110
94
|
]
|
|
111
95
|
}),
|
|
112
|
-
!
|
|
113
|
-
/* @__PURE__ */
|
|
96
|
+
!F && !L && P && /* @__PURE__ */ b(v, { children: [
|
|
97
|
+
/* @__PURE__ */ b(re, {
|
|
114
98
|
direction: "row",
|
|
115
99
|
sx: {
|
|
116
100
|
alignItems: "center",
|
|
@@ -118,15 +102,15 @@ function A(e) {
|
|
|
118
102
|
mb: 1
|
|
119
103
|
},
|
|
120
104
|
children: [
|
|
121
|
-
|
|
122
|
-
/* @__PURE__ */
|
|
105
|
+
H ? /* @__PURE__ */ y(C, { color: "success" }) : /* @__PURE__ */ y(w, { sx: { color: "grey.700" } }),
|
|
106
|
+
/* @__PURE__ */ y(_, {
|
|
123
107
|
variant: "body1",
|
|
124
108
|
sx: { fontWeight: 700 },
|
|
125
|
-
children:
|
|
109
|
+
children: H ? "All signatures collected." : `${B} out of ${V} signatures collected.`
|
|
126
110
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
|
|
129
|
-
href:
|
|
111
|
+
/* @__PURE__ */ y(d, { sx: { flexGrow: 1 } }),
|
|
112
|
+
K && /* @__PURE__ */ b(h, {
|
|
113
|
+
href: K,
|
|
130
114
|
target: "_blank",
|
|
131
115
|
rel: "noopener",
|
|
132
116
|
sx: {
|
|
@@ -134,93 +118,93 @@ function A(e) {
|
|
|
134
118
|
alignItems: "center",
|
|
135
119
|
gap: .5
|
|
136
120
|
},
|
|
137
|
-
children: ["View DUC", /* @__PURE__ */
|
|
121
|
+
children: ["View DUC", /* @__PURE__ */ y(T, { fontSize: "small" })]
|
|
138
122
|
})
|
|
139
123
|
]
|
|
140
124
|
}),
|
|
141
|
-
|
|
125
|
+
U.length > 0 && /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(_, {
|
|
142
126
|
variant: "body1",
|
|
143
127
|
sx: { mb: 1 },
|
|
144
128
|
children: "You're still waiting for signatures from"
|
|
145
|
-
}), /* @__PURE__ */
|
|
129
|
+
}), /* @__PURE__ */ y(d, {
|
|
146
130
|
component: "ul",
|
|
147
131
|
sx: {
|
|
148
132
|
mt: 0,
|
|
149
133
|
mb: 2,
|
|
150
134
|
pl: 3
|
|
151
135
|
},
|
|
152
|
-
children:
|
|
136
|
+
children: U.map((e, t) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ y(ie, { signer: e }) }, e.userId ?? `${e.name}-${t}`))
|
|
153
137
|
})] }),
|
|
154
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ y(f, {
|
|
155
139
|
variant: "outlined",
|
|
156
|
-
startIcon: /* @__PURE__ */
|
|
157
|
-
loading:
|
|
140
|
+
startIcon: /* @__PURE__ */ y(E, {}),
|
|
141
|
+
loading: I,
|
|
158
142
|
onClick: () => {
|
|
159
|
-
|
|
143
|
+
R();
|
|
160
144
|
},
|
|
161
145
|
children: "Refresh"
|
|
162
146
|
})
|
|
163
147
|
] }),
|
|
164
|
-
|
|
148
|
+
J && /* @__PURE__ */ b(u, {
|
|
165
149
|
severity: "error",
|
|
166
150
|
sx: { mt: 2 },
|
|
167
151
|
children: [
|
|
168
|
-
/* @__PURE__ */
|
|
169
|
-
/* @__PURE__ */
|
|
170
|
-
|
|
152
|
+
/* @__PURE__ */ y("strong", { children: "Sorry, we couldn't save your change." }),
|
|
153
|
+
/* @__PURE__ */ y("br", {}),
|
|
154
|
+
J
|
|
171
155
|
]
|
|
172
156
|
}),
|
|
173
|
-
|
|
157
|
+
X && /* @__PURE__ */ b(u, {
|
|
174
158
|
severity: "error",
|
|
175
159
|
sx: { mt: 2 },
|
|
176
160
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
-
/* @__PURE__ */
|
|
179
|
-
|
|
161
|
+
/* @__PURE__ */ y("strong", { children: "Sorry, we couldn't submit your request." }),
|
|
162
|
+
/* @__PURE__ */ y("br", {}),
|
|
163
|
+
X
|
|
180
164
|
]
|
|
181
165
|
})
|
|
182
166
|
] }),
|
|
183
|
-
/* @__PURE__ */
|
|
184
|
-
|
|
167
|
+
/* @__PURE__ */ b(p, { children: [
|
|
168
|
+
k && /* @__PURE__ */ y(f, {
|
|
185
169
|
variant: "outlined",
|
|
186
|
-
onClick:
|
|
170
|
+
onClick: k,
|
|
187
171
|
children: "Back"
|
|
188
172
|
}),
|
|
189
|
-
/* @__PURE__ */
|
|
190
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ y(d, { sx: { flexGrow: 1 } }),
|
|
174
|
+
/* @__PURE__ */ y(f, {
|
|
191
175
|
variant: "contained",
|
|
192
|
-
disabled:
|
|
193
|
-
loading:
|
|
176
|
+
disabled: le,
|
|
177
|
+
loading: Q,
|
|
194
178
|
onClick: () => {
|
|
195
|
-
|
|
179
|
+
$();
|
|
196
180
|
},
|
|
197
181
|
children: "Submit"
|
|
198
182
|
})
|
|
199
183
|
] })
|
|
200
184
|
] });
|
|
201
185
|
}
|
|
202
|
-
function
|
|
203
|
-
return !e.status || e.status ===
|
|
186
|
+
function A(e) {
|
|
187
|
+
return !e.status || e.status === S.pending || e.status === S.done ? "" : e.status === S.declined && e.declinedOn ? ` (declined ${s(D(e.declinedOn))})` : ` (${e.status})`;
|
|
204
188
|
}
|
|
205
|
-
function
|
|
189
|
+
function ie(t) {
|
|
206
190
|
let { signer: n } = t, r = n.name ?? "Unnamed signer";
|
|
207
|
-
return /* @__PURE__ */
|
|
191
|
+
return /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ b(_, {
|
|
208
192
|
variant: "body1",
|
|
209
193
|
component: "span",
|
|
210
|
-
children: [n.userId ? /* @__PURE__ */
|
|
194
|
+
children: [n.userId ? /* @__PURE__ */ y(h, {
|
|
211
195
|
href: `${e.PORTAL}Profile:${n.userId}`,
|
|
212
196
|
target: "_blank",
|
|
213
197
|
rel: "noopener",
|
|
214
198
|
children: r
|
|
215
|
-
}) : /* @__PURE__ */
|
|
216
|
-
}), n.declinedReason && /* @__PURE__ */
|
|
199
|
+
}) : /* @__PURE__ */ y(v, { children: r }), A(n)]
|
|
200
|
+
}), n.declinedReason && /* @__PURE__ */ y(_, {
|
|
217
201
|
variant: "body1",
|
|
218
202
|
component: "blockquote",
|
|
219
|
-
sx:
|
|
203
|
+
sx: O,
|
|
220
204
|
children: n.declinedReason
|
|
221
205
|
})] });
|
|
222
206
|
}
|
|
223
207
|
//#endregion
|
|
224
|
-
export {
|
|
208
|
+
export { k as default };
|
|
225
209
|
|
|
226
210
|
//# sourceMappingURL=SignatureStatusStep.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignatureStatusStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"sourcesContent":["import {\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureStatus,\n useGetDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestSignedFileHandleId,\n useSubmitDataAccessRequest,\n useUpdateDataAccessRequest,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport {\n CheckCircleOutline,\n HourglassEmpty,\n OpenInNew,\n Refresh,\n} from '@mui/icons-material'\nimport {\n Alert,\n Box,\n Button,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Link,\n Skeleton,\n Stack,\n SxProps,\n Typography,\n} from '@mui/material'\nimport {\n EDucSignerStatus,\n EDucSignerStatusStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport IconSvg from '../../../IconSvg/IconSvg'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\n/** Browser defaults indent a blockquote far too much for a nested list item. */\nconst declinedReasonSx: SxProps = {\n mx: 0,\n my: 0.5,\n pl: 1.5,\n borderLeft: '3px solid',\n borderColor: 'grey.300',\n color: 'grey.700',\n}\n\nexport type SignatureStatusStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n subjectId: string\n subjectType: RestrictableObjectType\n onHide: () => void\n /**\n * Called when the user clicks the Back button. When omitted, the Back button is hidden —\n * used when the step is reached via direct entry (e.g. a deep-link route) rather than\n * through the wizard flow, so there is no meaningful previous step to return to.\n */\n onBackClicked?: () => void\n onSubmissionCreated: (submissionId: string) => void\n /**\n * Optional href override for the \"View DUC\" link. When set, the preview file handle fetch\n * is skipped and this URL is used directly. Used by stories and tests where the portal\n * servlet is not available.\n */\n viewDucHrefOverride?: string\n}\n\n/**\n * Wizard step shown after the user has routed the eDUC for electronic signature\n * (PORTALS-4380). Polls the DocuSign envelope status, lists the pending signers,\n * and enables submission once every signer has signed.\n */\nexport default function SignatureStatusStep(props: SignatureStatusStepProps) {\n const {\n managedACTAccessRequirement,\n subjectId,\n subjectType,\n onHide,\n onBackClicked,\n onSubmissionCreated,\n viewDucHrefOverride,\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\n const {\n data: signatureStatus,\n isLoading: isLoadingStatus,\n isRefetching: isRefetchingStatus,\n error: statusError,\n refetch: refetchStatus,\n } = useGetDataAccessRequestSignatureStatus(requestId, {\n enabled: Boolean(requestId),\n })\n\n const signers: EDucSignerStatus[] = signatureStatus?.signerStatus ?? []\n const collectedCount = signers.filter(s => s.status === 'done').length\n const totalCount = signers.length\n const allCollected = totalCount > 0 && collectedCount === totalCount\n const outstandingSigners = signers.filter(s => s.status !== 'done')\n\n // Whether going Back could still deliver edits to this envelope is the server's call -- it knows\n // every state DocuSign will refuse to correct. Only the copy below depends on it, so a stale or\n // failed answer simply withholds the guidance rather than blocking the step.\n const { data: isEnvelopeUpdatable } =\n useGetDataAccessRequestSignatureUpdatable(requestId, {\n enabled: Boolean(requestId) && !allCollected,\n })\n\n const { data: previewFileHandle } = useGetDataAccessRequestPreview(\n requestId,\n { enabled: Boolean(requestId) && !viewDucHrefOverride },\n )\n const viewDucHref =\n viewDucHrefOverride ??\n (previewFileHandle?.fileHandleId && requestId\n ? SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandle.fileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n )\n : undefined)\n\n const { data: signedFileHandle } = useGetDataAccessRequestSignedFileHandleId(\n requestId,\n { enabled: Boolean(requestId) && allCollected },\n )\n\n const [updateDarError, setUpdateDarError] = useState<string | undefined>()\n const [submitDarError, setSubmitDarError] = useState<string | undefined>()\n\n const { mutateAsync: updateDarAsync, isPending: isUpdating } =\n useUpdateDataAccessRequest({\n onError: e => setUpdateDarError(e.reason),\n })\n\n const { mutate: submit, isPending: isSubmitting } =\n useSubmitDataAccessRequest({\n onSuccess: submission => onSubmissionCreated(submission.submissionId),\n onError: e => setSubmitDarError(e.reason),\n })\n\n const isSubmitDisabled =\n isLoadingDar ||\n isLoadingStatus ||\n isRefetchingStatus ||\n !dataAccessRequest ||\n !allCollected ||\n !signedFileHandle?.fileHandleId ||\n isUpdating ||\n isSubmitting\n\n const handleSubmit = async () => {\n if (!dataAccessRequest || !signedFileHandle?.fileHandleId) return\n setUpdateDarError(undefined)\n setSubmitDarError(undefined)\n const updated = await updateDarAsync({\n ...dataAccessRequest,\n ducFileHandleId: signedFileHandle.fileHandleId,\n }).catch(() => null)\n if (!updated) return\n submit({\n request: {\n requestId: updated.id,\n requestEtag: updated.etag,\n subjectId,\n subjectType,\n },\n accessRequirementId: String(managedACTAccessRequirement.id),\n })\n }\n\n return (\n <>\n <DialogTitle>\n <Stack direction=\"row\" sx={{ alignItems: 'center', gap: '5px' }}>\n Request Access\n <Box sx={{ flexGrow: 1 }} />\n <IconButton aria-label={'Close'} onClick={onHide}>\n <IconSvg icon={'close'} wrap={false} sx={{ color: 'grey.700' }} />\n </IconButton>\n </Stack>\n </DialogTitle>\n <DialogContent>\n <Typography variant={'headline3'} sx={{ mb: 2 }}>\n Sign a Data Use Certificate (DUC)\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Your DUC has been emailed to your Collaborators. Once all signatures\n (including the Signing Official) have been collected, you can submit\n the Data Access Request.\n </Typography>\n {/* Editing is only worth offering while signatures are still outstanding -- once every\n signer is done the user should simply submit. Withheld until both the status and the\n precheck resolve, so the copy neither appears and then vanishes nor promises that\n existing signatures carry over when the server has already ruled that out. */}\n {onBackClicked &&\n signatureStatus &&\n !allCollected &&\n isEnvelopeUpdatable && (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 3 }}>\n You can update the list of Collaborators by pressing{' '}\n <strong>Back</strong>. Your changes will be applied to this\n signature request, so anyone who has already signed will not need\n to sign again.\n </Typography>\n )}\n\n {isLoadingStatus && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={120}\n data-testid={'SignatureStatusStep-loading'}\n />\n )}\n\n {statusError && (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load the current signature status.\n </strong>\n <br />\n {statusError.reason}\n </Alert>\n )}\n\n {!isLoadingStatus && !statusError && signatureStatus && (\n <>\n <Stack\n direction={'row'}\n sx={{ alignItems: 'center', gap: 1, mb: 1 }}\n >\n {allCollected ? (\n <CheckCircleOutline color={'success'} />\n ) : (\n <HourglassEmpty sx={{ color: 'grey.700' }} />\n )}\n <Typography variant={'body1'} sx={{ fontWeight: 700 }}>\n {allCollected\n ? 'All signatures collected.'\n : `${collectedCount} out of ${totalCount} signatures collected.`}\n </Typography>\n <Box sx={{ flexGrow: 1 }} />\n {viewDucHref && (\n <Link\n href={viewDucHref}\n target={'_blank'}\n rel={'noopener'}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n View DUC\n <OpenInNew fontSize={'small'} />\n </Link>\n )}\n </Stack>\n\n {outstandingSigners.length > 0 && (\n <>\n <Typography variant={'body1'} sx={{ mb: 1 }}>\n You're still waiting for signatures from\n </Typography>\n <Box component={'ul'} sx={{ mt: 0, mb: 2, pl: 3 }}>\n {outstandingSigners.map((signer, index) => (\n <li key={signer.userId ?? `${signer.name}-${index}`}>\n <SignerLine signer={signer} />\n </li>\n ))}\n </Box>\n </>\n )}\n\n <Button\n variant={'outlined'}\n startIcon={<Refresh />}\n loading={isRefetchingStatus}\n onClick={() => {\n refetchStatus()\n }}\n >\n Refresh\n </Button>\n </>\n )}\n\n {updateDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't save your change.</strong>\n <br />\n {updateDarError}\n </Alert>\n )}\n {submitDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't submit your request.</strong>\n <br />\n {submitDarError}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n {onBackClicked && (\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n )}\n <Box sx={{ flexGrow: 1 }} />\n <Button\n variant={'contained'}\n disabled={isSubmitDisabled}\n loading={isSubmitting}\n onClick={() => {\n handleSubmit()\n }}\n >\n Submit\n </Button>\n </DialogActions>\n </>\n )\n}\n\n/**\n * Only surface non-pending problem states inline; pending is implied by the section header. A\n * decline carries a timestamp, which folds into the label so the row doesn't read \"(declined)\"\n * and then repeat itself underneath.\n */\nfunction getSignerStatusLabel(signer: EDucSignerStatus): string {\n if (\n !signer.status ||\n signer.status === EDucSignerStatusStatusEnum.pending ||\n signer.status === EDucSignerStatusStatusEnum.done\n ) {\n return ''\n }\n if (\n signer.status === EDucSignerStatusStatusEnum.declined &&\n signer.declinedOn\n ) {\n return ` (declined ${formatDate(dayjs(signer.declinedOn))})`\n }\n return ` (${signer.status})`\n}\n\nfunction SignerLine(props: { signer: EDucSignerStatus }) {\n const { signer } = props\n const displayName = signer.name ?? 'Unnamed signer'\n const nameNode = signer.userId ? (\n <Link\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Profile:${signer.userId}`}\n target={'_blank'}\n rel={'noopener'}\n >\n {displayName}\n </Link>\n ) : (\n <>{displayName}</>\n )\n return (\n <>\n <Typography variant={'body1'} component={'span'}>\n {nameNode}\n {getSignerStatusLabel(signer)}\n </Typography>\n {/* The reason is the signer's own words, so it is quoted rather than restated as UI copy. */}\n {signer.declinedReason && (\n <Typography\n variant={'body1'}\n component={'blockquote'}\n sx={declinedReasonSx}\n >\n {signer.declinedReason}\n </Typography>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SignatureStatusStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"sourcesContent":["import {\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureStatus,\n useGetDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestSignedFileHandleId,\n useSubmitDataAccessRequest,\n useUpdateDataAccessRequest,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport {\n CheckCircleOutline,\n HourglassEmpty,\n OpenInNew,\n Refresh,\n} from '@mui/icons-material'\nimport {\n Alert,\n Box,\n Button,\n DialogActions,\n DialogContent,\n Link,\n Skeleton,\n Stack,\n SxProps,\n Typography,\n} from '@mui/material'\nimport {\n EDucSignerStatus,\n EDucSignerStatusStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\n/** Browser defaults indent a blockquote far too much for a nested list item. */\nconst declinedReasonSx: SxProps = {\n mx: 0,\n my: 0.5,\n pl: 1.5,\n borderLeft: '3px solid',\n borderColor: 'grey.300',\n color: 'grey.700',\n}\n\nexport type SignatureStatusStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n subjectId: string\n subjectType: RestrictableObjectType\n onHide: () => void\n /**\n * Called when the user clicks the Back button. When omitted, the Back button is hidden —\n * used when the step is reached via direct entry (e.g. a deep-link route) rather than\n * through the wizard flow, so there is no meaningful previous step to return to.\n */\n onBackClicked?: () => void\n onSubmissionCreated: (submissionId: string) => void\n /**\n * Optional href override for the \"View DUC\" link. When set, the preview file handle fetch\n * is skipped and this URL is used directly. Used by stories and tests where the portal\n * servlet is not available.\n */\n viewDucHrefOverride?: string\n}\n\n/**\n * Wizard step shown after the user has routed the eDUC for electronic signature\n * (PORTALS-4380). Polls the DocuSign envelope status, lists the pending signers,\n * and enables submission once every signer has signed.\n */\nexport default function SignatureStatusStep(props: SignatureStatusStepProps) {\n const {\n managedACTAccessRequirement,\n subjectId,\n subjectType,\n onHide,\n onBackClicked,\n onSubmissionCreated,\n viewDucHrefOverride,\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\n const {\n data: signatureStatus,\n isLoading: isLoadingStatus,\n isRefetching: isRefetchingStatus,\n error: statusError,\n refetch: refetchStatus,\n } = useGetDataAccessRequestSignatureStatus(requestId, {\n enabled: Boolean(requestId),\n })\n\n const signers: EDucSignerStatus[] = signatureStatus?.signerStatus ?? []\n const collectedCount = signers.filter(s => s.status === 'done').length\n const totalCount = signers.length\n const allCollected = totalCount > 0 && collectedCount === totalCount\n const outstandingSigners = signers.filter(s => s.status !== 'done')\n\n // Whether going Back could still deliver edits to this envelope is the server's call -- it knows\n // every state DocuSign will refuse to correct. Only the copy below depends on it, so a stale or\n // failed answer simply withholds the guidance rather than blocking the step.\n const { data: isEnvelopeUpdatable } =\n useGetDataAccessRequestSignatureUpdatable(requestId, {\n enabled: Boolean(requestId) && !allCollected,\n })\n\n const { data: previewFileHandle } = useGetDataAccessRequestPreview(\n requestId,\n { enabled: Boolean(requestId) && !viewDucHrefOverride },\n )\n const viewDucHref =\n viewDucHrefOverride ??\n (previewFileHandle?.fileHandleId && requestId\n ? SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandle.fileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n )\n : undefined)\n\n const { data: signedFileHandle } = useGetDataAccessRequestSignedFileHandleId(\n requestId,\n { enabled: Boolean(requestId) && allCollected },\n )\n\n const [updateDarError, setUpdateDarError] = useState<string | undefined>()\n const [submitDarError, setSubmitDarError] = useState<string | undefined>()\n\n const { mutateAsync: updateDarAsync, isPending: isUpdating } =\n useUpdateDataAccessRequest({\n onError: e => setUpdateDarError(e.reason),\n })\n\n const { mutate: submit, isPending: isSubmitting } =\n useSubmitDataAccessRequest({\n onSuccess: submission => onSubmissionCreated(submission.submissionId),\n onError: e => setSubmitDarError(e.reason),\n })\n\n const isSubmitDisabled =\n isLoadingDar ||\n isLoadingStatus ||\n isRefetchingStatus ||\n !dataAccessRequest ||\n !allCollected ||\n !signedFileHandle?.fileHandleId ||\n isUpdating ||\n isSubmitting\n\n const handleSubmit = async () => {\n if (!dataAccessRequest || !signedFileHandle?.fileHandleId) return\n setUpdateDarError(undefined)\n setSubmitDarError(undefined)\n const updated = await updateDarAsync({\n ...dataAccessRequest,\n ducFileHandleId: signedFileHandle.fileHandleId,\n }).catch(() => null)\n if (!updated) return\n submit({\n request: {\n requestId: updated.id,\n requestEtag: updated.etag,\n subjectId,\n subjectType,\n },\n accessRequirementId: String(managedACTAccessRequirement.id),\n })\n }\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <Typography variant={'headline3'} sx={{ mb: 2 }}>\n Sign a Data Use Certificate (DUC)\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Your DUC has been emailed to your Collaborators. Once all signatures\n (including the Signing Official) have been collected, you can submit\n the Data Access Request.\n </Typography>\n {/* Editing is only worth offering while signatures are still outstanding -- once every\n signer is done the user should simply submit. Withheld until both the status and the\n precheck resolve, so the copy neither appears and then vanishes nor promises that\n existing signatures carry over when the server has already ruled that out. */}\n {onBackClicked &&\n signatureStatus &&\n !allCollected &&\n isEnvelopeUpdatable && (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 3 }}>\n You can update the list of Collaborators by pressing{' '}\n <strong>Back</strong>. Your changes will be applied to this\n signature request, so anyone who has already signed will not need\n to sign again.\n </Typography>\n )}\n\n {isLoadingStatus && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={120}\n data-testid={'SignatureStatusStep-loading'}\n />\n )}\n\n {statusError && (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load the current signature status.\n </strong>\n <br />\n {statusError.reason}\n </Alert>\n )}\n\n {!isLoadingStatus && !statusError && signatureStatus && (\n <>\n <Stack\n direction={'row'}\n sx={{ alignItems: 'center', gap: 1, mb: 1 }}\n >\n {allCollected ? (\n <CheckCircleOutline color={'success'} />\n ) : (\n <HourglassEmpty sx={{ color: 'grey.700' }} />\n )}\n <Typography variant={'body1'} sx={{ fontWeight: 700 }}>\n {allCollected\n ? 'All signatures collected.'\n : `${collectedCount} out of ${totalCount} signatures collected.`}\n </Typography>\n <Box sx={{ flexGrow: 1 }} />\n {viewDucHref && (\n <Link\n href={viewDucHref}\n target={'_blank'}\n rel={'noopener'}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n View DUC\n <OpenInNew fontSize={'small'} />\n </Link>\n )}\n </Stack>\n\n {outstandingSigners.length > 0 && (\n <>\n <Typography variant={'body1'} sx={{ mb: 1 }}>\n You're still waiting for signatures from\n </Typography>\n <Box component={'ul'} sx={{ mt: 0, mb: 2, pl: 3 }}>\n {outstandingSigners.map((signer, index) => (\n <li key={signer.userId ?? `${signer.name}-${index}`}>\n <SignerLine signer={signer} />\n </li>\n ))}\n </Box>\n </>\n )}\n\n <Button\n variant={'outlined'}\n startIcon={<Refresh />}\n loading={isRefetchingStatus}\n onClick={() => {\n refetchStatus()\n }}\n >\n Refresh\n </Button>\n </>\n )}\n\n {updateDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't save your change.</strong>\n <br />\n {updateDarError}\n </Alert>\n )}\n {submitDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't submit your request.</strong>\n <br />\n {submitDarError}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n {onBackClicked && (\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n )}\n <Box sx={{ flexGrow: 1 }} />\n <Button\n variant={'contained'}\n disabled={isSubmitDisabled}\n loading={isSubmitting}\n onClick={() => {\n handleSubmit()\n }}\n >\n Submit\n </Button>\n </DialogActions>\n </>\n )\n}\n\n/**\n * Only surface non-pending problem states inline; pending is implied by the section header. A\n * decline carries a timestamp, which folds into the label so the row doesn't read \"(declined)\"\n * and then repeat itself underneath.\n */\nfunction getSignerStatusLabel(signer: EDucSignerStatus): string {\n if (\n !signer.status ||\n signer.status === EDucSignerStatusStatusEnum.pending ||\n signer.status === EDucSignerStatusStatusEnum.done\n ) {\n return ''\n }\n if (\n signer.status === EDucSignerStatusStatusEnum.declined &&\n signer.declinedOn\n ) {\n return ` (declined ${formatDate(dayjs(signer.declinedOn))})`\n }\n return ` (${signer.status})`\n}\n\nfunction SignerLine(props: { signer: EDucSignerStatus }) {\n const { signer } = props\n const displayName = signer.name ?? 'Unnamed signer'\n const nameNode = signer.userId ? (\n <Link\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Profile:${signer.userId}`}\n target={'_blank'}\n rel={'noopener'}\n >\n {displayName}\n </Link>\n ) : (\n <>{displayName}</>\n )\n return (\n <>\n <Typography variant={'body1'} component={'span'}>\n {nameNode}\n {getSignerStatusLabel(signer)}\n </Typography>\n {/* The reason is the signer's own words, so it is quoted rather than restated as UI copy. */}\n {signer.declinedReason && (\n <Typography\n variant={'body1'}\n component={'blockquote'}\n sx={declinedReasonSx}\n >\n {signer.declinedReason}\n </Typography>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types';
|
|
2
|
+
import { RequestableAccessRequirement } from '../RequestDataStep';
|
|
2
3
|
/**
|
|
3
4
|
* The part of an access requirement that every data access request step needs. Satisfied by any access requirement
|
|
4
5
|
* type that supports the data access request flow.
|
|
5
6
|
*/
|
|
6
|
-
export type RequestFlowAccessRequirement = Pick<
|
|
7
|
+
export type RequestFlowAccessRequirement = Pick<RequestableAccessRequirement, 'id' | 'concreteType'> & Partial<Pick<ManagedACTAccessRequirement, 'eDucTemplateId'>>;
|
|
7
8
|
/**
|
|
8
9
|
* The part of an access requirement that determines how accessors are collected and which documents are requested.
|
|
9
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestFlowTypes.d.ts","sourceRoot":"","sources":["../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"requestFlowTypes.d.ts","sourceRoot":"","sources":["../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAA;AAEjE;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,IAAI,GAAG,cAAc,CACtB,GACC,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,4BAA4B,GACtE,OAAO,CACL,IAAI,CACF,2BAA2B,EACzB,yBAAyB,GACzB,4BAA4B,GAC5B,eAAe,GACf,yBAAyB,CAC5B,CACF,CAAA"}
|