synapse-react-client 4.0.42 → 4.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +6 -20
  3. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
  4. package/dist/components/AccessRequirementList/AccessRequirementList.js +165 -159
  5. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  6. package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts +3 -2
  7. package/dist/components/AccessRequirementList/AccessRequirementListItem.d.ts.map +1 -1
  8. package/dist/components/AccessRequirementList/AccessRequirementListItem.js +23 -22
  9. package/dist/components/AccessRequirementList/AccessRequirementListItem.js.map +1 -1
  10. package/dist/components/AccessRequirementList/AccessRequirementListUtils.d.ts +4 -3
  11. package/dist/components/AccessRequirementList/AccessRequirementListUtils.d.ts.map +1 -1
  12. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js +6 -4
  13. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  14. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.d.ts +22 -0
  15. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.d.ts.map +1 -0
  16. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.js +166 -0
  17. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/JsonSchemaRequestWizard.js.map +1 -0
  18. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.d.ts +18 -0
  19. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.d.ts.map +1 -0
  20. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.js +91 -0
  21. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/RequesterInformationFields.js.map +1 -0
  22. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.d.ts +33 -0
  23. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.d.ts.map +1 -0
  24. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.js +49 -0
  25. package/dist/components/AccessRequirementList/JsonSchemaAccessRequirementRequestFlow/requesterInformation.js.map +1 -0
  26. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.d.ts.map +1 -1
  27. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js +26 -42
  28. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
  29. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
  30. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +140 -155
  31. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  32. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
  33. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +43 -60
  34. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
  35. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts +4 -5
  36. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts.map +1 -1
  37. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +5 -5
  38. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
  39. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
  40. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +88 -103
  41. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
  42. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.d.ts.map +1 -1
  43. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js +14 -30
  44. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
  45. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItem.d.ts → RequestableAccessRequirementItem.d.ts} +9 -8
  46. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItem.d.ts.map +1 -0
  47. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItem.js → RequestableAccessRequirementItem.js} +16 -16
  48. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItem.js.map +1 -0
  49. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItemView.d.ts → RequestableAccessRequirementItemView.d.ts} +5 -5
  50. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItemView.d.ts.map +1 -0
  51. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/{ManagedACTAccessRequirementItemView.js → RequestableAccessRequirementItemView.js} +3 -4
  52. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestableAccessRequirementItemView.js.map +1 -0
  53. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
  54. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +94 -110
  55. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  56. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +0 -2
  57. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -1
  58. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +35 -52
  59. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -1
  60. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
  61. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +79 -95
  62. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
  63. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts +2 -1
  64. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts.map +1 -1
  65. package/dist/components/AccessRequirementList/RequestDataStep.d.ts +34 -0
  66. package/dist/components/AccessRequirementList/RequestDataStep.d.ts.map +1 -0
  67. package/dist/components/AccessRequirementList/RequestDataStep.js +37 -0
  68. package/dist/components/AccessRequirementList/RequestDataStep.js.map +1 -0
  69. package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.d.ts +1 -1
  70. package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
  71. package/dist/components/DataGrid/DataGridWebSocket.d.ts +29 -1
  72. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  73. package/dist/components/DataGrid/DataGridWebSocket.js +48 -16
  74. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  75. package/dist/components/DataGrid/components/GridLoadingState.d.ts +2 -2
  76. package/dist/components/DataGrid/components/GridLoadingState.d.ts.map +1 -1
  77. package/dist/components/DataGrid/components/GridLoadingState.js +2 -2
  78. package/dist/components/DataGrid/components/GridLoadingState.js.map +1 -1
  79. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  80. package/dist/components/DataGrid/useDataGridWebsocket.js +2 -1
  81. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  82. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  83. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +11 -10
  84. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  85. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts.map +1 -1
  86. package/dist/components/FormTemplateEditor/FormTemplatePreview.js +29 -30
  87. package/dist/components/FormTemplateEditor/FormTemplatePreview.js.map +1 -1
  88. package/dist/components/JsonSchemaForm/SchemaStepForm.d.ts +21 -0
  89. package/dist/components/JsonSchemaForm/SchemaStepForm.d.ts.map +1 -0
  90. package/dist/components/JsonSchemaForm/SchemaStepForm.js +29 -0
  91. package/dist/components/JsonSchemaForm/SchemaStepForm.js.map +1 -0
  92. package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.d.ts +2 -2
  93. package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.d.ts.map +1 -1
  94. package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js +11 -10
  95. package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js.map +1 -1
  96. package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.d.ts +10 -0
  97. package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.d.ts.map +1 -0
  98. package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.js +81 -0
  99. package/dist/components/SetManagedAccessRequirementFields/DataUseCertificateFields.js.map +1 -0
  100. package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.d.ts +9 -0
  101. package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.d.ts.map +1 -0
  102. package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.js +32 -0
  103. package/dist/components/SetManagedAccessRequirementFields/ExpirationPeriodField.js.map +1 -0
  104. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts +0 -2
  105. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
  106. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js +74 -151
  107. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  108. package/dist/components/SynapseForm/SynapseForm.js +28 -28
  109. package/dist/components/TanStackTable/TanStackTableUtils.d.ts.map +1 -1
  110. package/dist/components/TanStackTable/TanStackTableUtils.js +8 -5
  111. package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
  112. package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.d.ts +5 -0
  113. package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.d.ts.map +1 -0
  114. package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.js +20 -0
  115. package/dist/components/dataaccess/SubmissionPage/DataAccessSubmissionFileHandleLink.js.map +1 -0
  116. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  117. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +183 -188
  118. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  119. package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.d.ts +25 -0
  120. package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.d.ts.map +1 -0
  121. package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.js +125 -0
  122. package/dist/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.js.map +1 -0
  123. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  124. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +5 -4
  125. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  126. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.d.ts.map +1 -1
  127. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +5 -4
  128. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
  129. package/dist/features/curator/dashboard/CuratorDashboardRouter.d.ts.map +1 -1
  130. package/dist/features/curator/dashboard/CuratorDashboardRouter.js +15 -15
  131. package/dist/features/curator/dashboard/CuratorDashboardRouter.js.map +1 -1
  132. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.d.ts.map +1 -1
  133. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js +15 -14
  134. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js.map +1 -1
  135. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +7 -0
  136. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -1
  137. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +30 -15
  138. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -1
  139. package/dist/mocks/dataaccess/MockDataAccessRequest.d.ts +3 -0
  140. package/dist/mocks/dataaccess/MockDataAccessRequest.d.ts.map +1 -1
  141. package/dist/mocks/dataaccess/MockDataAccessRequest.js +24 -12
  142. package/dist/mocks/dataaccess/MockDataAccessRequest.js.map +1 -1
  143. package/dist/mocks/dataaccess/MockSubmission.d.ts +76 -0
  144. package/dist/mocks/dataaccess/MockSubmission.d.ts.map +1 -1
  145. package/dist/mocks/dataaccess/MockSubmission.js +108 -63
  146. package/dist/mocks/dataaccess/MockSubmission.js.map +1 -1
  147. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
  148. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +42 -30
  149. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  150. package/dist/style/components/_submission-page.scss +0 -4
  151. package/dist/style/main.css +1 -1
  152. package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.d.ts +19 -0
  153. package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.d.ts.map +1 -0
  154. package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.js +26 -0
  155. package/dist/synapse-queries/dataaccess/useGeneratedRequestForm.js.map +1 -0
  156. package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.d.ts +37 -0
  157. package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.d.ts.map +1 -0
  158. package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.js +35 -0
  159. package/dist/synapse-queries/dataaccess/useGeneratedSubmissionForm.js.map +1 -0
  160. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
  161. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
  162. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  163. package/dist/synapse-queries/termsOfService/useTermsOfService.d.ts.map +1 -1
  164. package/dist/synapse-queries/termsOfService/useTermsOfService.js +21 -19
  165. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  166. package/dist/tsconfig.build.tsbuildinfo +1 -1
  167. package/dist/utils/functions/EntityTypeUtils.d.ts +2 -2
  168. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  169. package/dist/utils/functions/EntityTypeUtils.js +135 -135
  170. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  171. package/dist/utils/hooks/useDetectSSOCode.d.ts.map +1 -1
  172. package/dist/utils/hooks/useDetectSSOCode.js +31 -26
  173. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  174. package/dist/utils/jsonschema/schemaData.d.ts +18 -0
  175. package/dist/utils/jsonschema/schemaData.d.ts.map +1 -0
  176. package/dist/utils/jsonschema/schemaData.js +26 -0
  177. package/dist/utils/jsonschema/schemaData.js.map +1 -0
  178. package/package.json +2 -2
  179. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.d.ts.map +0 -1
  180. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js.map +0 -1
  181. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts.map +0 -1
  182. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SubmissionPage.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport { CancelDataAccessRequestConfirmationModal } from '@/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal'\nimport { ApproveSubmissionConfirmationModal } from '@/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal'\nimport { displayToast } from '@/components/ToastMessage'\nimport {\n useGetAccessRequirementACL,\n useGetAccessRequirements,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport useGetDataAccessSubmission from '@/synapse-queries/dataaccess/useDataAccessSubmission'\nimport { useGetThreadForSubmission } from '@/synapse-queries/forum/useThread'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user'\nimport { useGetUserAccessApproval } from '@/synapse-queries/dataaccess/useAccessApprovals'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport { Button, Grid, Skeleton, Stack, Typography } from '@mui/material'\nimport {\n ACCESS_TYPE,\n FileHandleAssociateType,\n ManagedACTAccessRequirement,\n Submission,\n SubmissionState,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport { isEmpty, toLower, upperFirst } from 'lodash-es'\nimport { Fragment, ReactNode, useMemo, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { SynapseErrorBoundary } from '../../error/ErrorBanner'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserOrTeamBadge from '../../UserOrTeamBadge/UserOrTeamBadge'\nimport { FileHandleLink } from '../../widgets/FileHandleLink'\nimport RejectDataAccessRequestModal from '../RejectDataAccessRequestModal'\nimport { DiscussionThread } from '@/components/Forum'\n\ndayjs.extend(duration)\n\nexport type SubmissionPageProps = {\n /** The ID of the submission to view */\n submissionId: string | number\n /** If true, display reviewer controls on the page */\n isReviewer: boolean // There is currently no API to check if a user has review permissions on a specific submission ID\n}\n\nconst THREAD_BODY =\n 'Use this thread to communicate with the reviewers about this access request.'\n\nfunction DataAccessSubmissionFileHandleLink(props: {\n submissionId: string\n fileHandleId: string\n}) {\n const { submissionId, fileHandleId } = props\n const fileHandleAssociation = useMemo(\n () => ({\n fileHandleId: fileHandleId,\n associateObjectId: submissionId,\n associateObjectType:\n FileHandleAssociateType.DataAccessSubmissionAttachment,\n }),\n [fileHandleId, submissionId],\n )\n return (\n <FileHandleLink\n key={fileHandleId}\n showDownloadIcon={true}\n fileHandleAssociation={fileHandleAssociation}\n />\n )\n}\n\ntype AccessRequirementWikiType = {\n accessRequirementId: string\n}\n\nfunction AccessRequirementWiki(props: AccessRequirementWikiType) {\n const { data: wikiPageKey } = useGetAccessRequirementWikiPageKey(\n props.accessRequirementId,\n {\n throwOnError: true,\n },\n )\n\n return wikiPageKey ? (\n <div className=\"AccessRequirementWikiContainer\">\n <div className=\"AccessRequirementWikiContent\">\n <Typography variant=\"headline1\">Access Requirement</Typography>\n <hr />\n <MarkdownSynapse\n wikiId={wikiPageKey?.wikiPageId}\n ownerId={wikiPageKey?.ownerObjectId}\n objectType={wikiPageKey?.ownerObjectType}\n />\n </div>\n </div>\n ) : (\n <Skeleton width={'100%'} height={'600px'} />\n )\n}\n\n/**\n * returns true iff the userId is a requester and/or listed on the accessor changes on the submission.\n * @param userId\n * @param submission\n */\nfunction isRequesterOnSubmission(userId: string, submission: Submission) {\n return (\n submission.submittedBy === userId ||\n Boolean(submission.accessorChanges.find(acc => acc.userId === userId))\n )\n}\n\n/**\n * Page for a Data Access Submission. Supports the following user types:\n * - ACT member or other designated reviewer can view, and choose to approve or reject.\n * - Data Access Request submitter can view and modify their own submission.\n * - Data Access Request requester (who is not a submitter) can view their own submission.\n */\nexport default function SubmissionPage(props: SubmissionPageProps) {\n const { submissionId, isReviewer } = props\n const [showRejectionDialog, setShowRejectionDialog] = useState(false)\n\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n\n const { data: submission, isLoading: isLoadingSubmission } =\n useGetDataAccessSubmission(submissionId, {\n throwOnError: true,\n })\n const isRequester = Boolean(\n submission &&\n currentUserProfile &&\n isRequesterOnSubmission(currentUserProfile.ownerId, submission),\n )\n\n const { data: accessApproval, isLoading: isLoadingAccessApproval } =\n useGetUserAccessApproval(String(submissionId), {\n enabled:\n isRequester &&\n submission &&\n submission.state === SubmissionState.APPROVED,\n })\n\n const isExpired = Boolean(\n accessApproval && dayjs(accessApproval.expiredOn).isBefore(dayjs()),\n )\n\n const isSubmitter =\n submission && submission.submittedBy === currentUserProfile?.ownerId\n\n const { data: accessRequirement } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n parseInt(submission?.accessRequirementId!),\n { enabled: !!submission },\n )\n\n const { data: acl, isLoading: isLoadingACL } = useGetAccessRequirementACL(\n submission?.accessRequirementId!,\n { enabled: !!submission, throwOnError: true },\n )\n\n const { data: thread } = useGetThreadForSubmission(submissionId)\n\n const [showUpdateRequestDialog, setShowUpdateRequestDialog] = useState(false)\n const [\n showCancelRequestConfirmationDialog,\n setShowCancelRequestConfirmationDialog,\n ] = useState(false)\n const [showApprovalConfirmation, setShowApprovalConfirmation] =\n useState(false)\n\n const navigate = useNavigate()\n\n const reviewerIds = acl?.resourceAccess\n .filter(ra => ra.accessType.includes(ACCESS_TYPE.REVIEW_SUBMISSIONS))\n .map(ra => ra.principalId)\n\n const displayedSubmissionState: ReactNode = useMemo(() => {\n if (submission && !isLoadingAccessApproval) {\n if (isExpired) {\n return 'Expired'\n }\n return submission.state\n }\n return <Skeleton width={100} />\n }, [isExpired, isLoadingAccessApproval, submission])\n\n return (\n <Grid container={true} spacing={4} className=\"SubmissionPage\">\n {showUpdateRequestDialog && accessRequirement && (\n <AccessRequirementList\n renderAsModal={true}\n accessRequirementFromProps={[accessRequirement]}\n onHide={() => setShowUpdateRequestDialog(false)}\n onSubmissionCreated={submissionId => {\n setShowUpdateRequestDialog(false)\n displayToast('Data access request submitted', 'success', {\n primaryButtonConfig: {\n text: 'View Request',\n onClick: () => {\n navigate('/submissions/' + submissionId)\n },\n },\n })\n }}\n />\n )}\n <ApproveSubmissionConfirmationModal\n open={showApprovalConfirmation}\n onClose={() => {\n setShowApprovalConfirmation(false)\n }}\n submissionId={String(submissionId)}\n />\n {showRejectionDialog && (\n <RejectDataAccessRequestModal\n // Previously, we used a 'key' prop to reset the modal form when it was opened,\n // but removing the key and re-rendering the JSX achieves the same functionality in a more straightforward way.\n submissionId={submissionId}\n open={showRejectionDialog}\n onClose={() => setShowRejectionDialog(false)}\n />\n )}\n <Grid\n className=\"SubmissionSummary\"\n size={{\n xs: 12,\n sm: 4,\n lg: 3,\n }}\n >\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Status\n </Typography>\n <Typography\n variant=\"headline3\"\n sx={{ textTransform: 'uppercase' }}\n gutterBottom\n >\n {displayedSubmissionState}\n </Typography>\n <br />\n {isLoadingSubmission && <Skeleton width={200} />}\n {submission &&\n isReviewer &&\n submission.state === SubmissionState.SUBMITTED && (\n <div className=\"ButtonContainer\">\n <Button\n onClick={() => {\n setShowApprovalConfirmation(true)\n }}\n color=\"success\"\n variant=\"contained\"\n >\n Approve\n </Button>\n <Button\n onClick={() => {\n setShowRejectionDialog(true)\n }}\n color=\"error\"\n variant=\"contained\"\n >\n Reject\n </Button>\n </div>\n )}\n\n {submission && isSubmitter && (\n <div className=\"ButtonContainer\">\n <CancelDataAccessRequestConfirmationModal\n open={showCancelRequestConfirmationDialog}\n submissionId={String(submissionId)}\n accessRequirementId={submission?.accessRequirementId || ''}\n onClose={() => setShowCancelRequestConfirmationDialog(false)}\n />\n {submission.state === SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowCancelRequestConfirmationDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n Cancel Request\n </Button>\n )}\n {submission.state !== SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowUpdateRequestDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n {submission.state === SubmissionState.APPROVED\n ? 'Update'\n : 'Modify'}{' '}\n Request\n </Button>\n )}\n </div>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Access Requirement Name\n </Typography>\n\n <Typography variant=\"smallText1\" gutterBottom>\n {accessRequirement?.name ?? <Skeleton width={100} />}\n </Typography>\n <br />\n\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Assigned Reviewer\n </Typography>\n <Stack>\n {isLoadingACL && <Skeleton width={100} />}\n {!isLoadingACL &&\n !isEmpty(reviewerIds) &&\n reviewerIds!.map(id => {\n return <UserOrTeamBadge key={id} principalId={id} />\n })}\n {!isLoadingACL && isEmpty(reviewerIds) && (\n <UserOrTeamBadge principalId={ACT_TEAM_ID} />\n )}\n </Stack>\n <br />\n </>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Conditions\n </Typography>\n {accessRequirement ? (\n <Typography variant=\"smallText1\" component={'div'} gutterBottom>\n <ul>\n <li>\n Expiration period:{' '}\n {dayjs\n .duration({\n milliseconds: accessRequirement.expirationPeriod,\n })\n .asDays()}{' '}\n day(s)\n {accessRequirement.expirationPeriod === 0 && ' (no expiration)'}\n </li>\n\n {accessRequirement.isCertifiedUserRequired && (\n <li>User must be Certified</li>\n )}\n {accessRequirement.isValidatedProfileRequired && (\n <li>User Profile must be Validated</li>\n )}\n {accessRequirement.isDUCRequired && <li>DUC is required</li>}\n {accessRequirement.isIDURequired && <li>IDU is required</li>}\n {accessRequirement.isIDUPublic && (\n <li>IDU will be made public</li>\n )}\n {accessRequirement.isIRBApprovalRequired && (\n <li>IRB Approval is required</li>\n )}\n {accessRequirement.areOtherAttachmentsRequired && (\n <li>Other attachments are required</li>\n )}\n </ul>\n </Typography>\n ) : (\n <Skeleton width={100} />\n )}\n <br />\n <div className=\"SubmissionSummaryGrid\">\n <Typography variant=\"dataFieldKey\">Submitted By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.submittedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography variant=\"dataFieldKey\">Submitted On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.submittedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\">Modified By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.modifiedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n <Typography variant=\"dataFieldKey\">Modified On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.modifiedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Data Requesters\n {`${submission ? ` (${submission.accessorChanges.length})` : ''}`}\n </Typography>\n {submission ? (\n submission.accessorChanges.map(accessorChange => (\n <Fragment key={accessorChange.userId}>\n <Typography className=\"Key DataAccessor\" variant=\"smallText1\">\n <span style={{ whiteSpace: 'nowrap' }}>\n <UserBadge\n key={accessorChange.userId}\n userId={accessorChange.userId}\n />\n </span>\n </Typography>\n <Typography className=\"Value DataAccessor\" variant=\"smallText1\">\n {upperFirst(\n toLower(\n accessorChange.type.substring(\n 0,\n accessorChange.type.indexOf('_'),\n ),\n ),\n )}\n </Typography>\n </Fragment>\n ))\n ) : (\n <Skeleton width={100} />\n )}\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Institution\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot.institution\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Project Lead\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot.projectLead\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </div>\n </Grid>\n <Grid\n size={{\n xs: 12,\n sm: 8,\n lg: 9,\n }}\n >\n <Stack sx={{ gap: 2 }}>\n <SynapseErrorBoundary>\n {submission ? (\n <AccessRequirementWiki\n accessRequirementId={submission.accessRequirementId}\n />\n ) : (\n <></>\n )}\n </SynapseErrorBoundary>\n {submission?.rejectedReason && (\n <section>\n <Typography variant=\"headline1\" gutterBottom>\n Reason for rejection given by reviewer\n </Typography>\n <hr />\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {submission.rejectedReason}\n </Typography>\n </section>\n )}\n <section>\n <Typography variant=\"headline1\">\n Contents of the Access Request\n <hr />\n </Typography>\n <Stack\n sx={{\n gap: 2,\n }}\n >\n {submission?.researchProjectSnapshot\n ?.intendedDataUseStatement && (\n <section>\n <Typography variant=\"headline2\" gutterBottom>\n Intended Data Use Statement\n </Typography>\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {\n submission.researchProjectSnapshot\n .intendedDataUseStatement\n }\n </Typography>\n </section>\n )}\n <Typography variant=\"headline2\" gutterBottom>\n Documents\n </Typography>\n {submission?.ducFileHandleId && (\n <section>\n <Typography variant=\"smallText2\">\n Data Use Certificate (DUC)\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.ducFileHandleId}\n />\n </section>\n )}\n {submission?.irbFileHandleId && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n IRB Approval Letter\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.irbFileHandleId}\n />\n </section>\n )}\n {submission?.attachments && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n Other Attachments\n </Typography>\n {submission.attachments.map(fileHandleId => (\n <Fragment key={fileHandleId}>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={fileHandleId}\n />\n <br />\n </Fragment>\n ))}\n </section>\n )}\n </Stack>\n </section>\n {thread?.id && (\n <DiscussionThread\n threadId={thread.id}\n limit={25}\n emptyBodyContent={THREAD_BODY}\n />\n )}\n </Stack>\n </Grid>\n </Grid>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SubmissionPage.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport { CancelDataAccessRequestConfirmationModal } from '@/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal'\nimport { ApproveSubmissionConfirmationModal } from '@/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal'\nimport { displayToast } from '@/components/ToastMessage'\nimport {\n useGetAccessRequirementACL,\n useGetAccessRequirements,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport useGetDataAccessSubmission from '@/synapse-queries/dataaccess/useDataAccessSubmission'\nimport { useGetThreadForSubmission } from '@/synapse-queries/forum/useThread'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user'\nimport { useGetUserAccessApproval } from '@/synapse-queries/dataaccess/useAccessApprovals'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Button,\n Grid,\n Skeleton,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n ACCESS_TYPE,\n ManagedACTAccessRequirement,\n Submission,\n SubmissionState,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport { isEmpty, toLower, upperFirst } from 'lodash-es'\nimport { Fragment, ReactNode, useMemo, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { SynapseErrorBoundary } from '../../error/ErrorBanner'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserOrTeamBadge from '../../UserOrTeamBadge/UserOrTeamBadge'\nimport { DataAccessSubmissionFileHandleLink } from './DataAccessSubmissionFileHandleLink'\nimport { SubmissionSchemaAnswers } from './SubmissionSchemaAnswers'\nimport RejectDataAccessRequestModal from '../RejectDataAccessRequestModal'\nimport { DiscussionThread } from '@/components/Forum'\n\ndayjs.extend(duration)\n\nexport type SubmissionPageProps = {\n /** The ID of the submission to view */\n submissionId: string | number\n /** If true, display reviewer controls on the page */\n isReviewer: boolean // There is currently no API to check if a user has review permissions on a specific submission ID\n}\n\nconst THREAD_BODY =\n 'Use this thread to communicate with the reviewers about this access request.'\n\ntype AccessRequirementWikiType = {\n accessRequirementId: string\n}\n\nfunction AccessRequirementWiki(props: AccessRequirementWikiType) {\n const { data: wikiPageKey } = useGetAccessRequirementWikiPageKey(\n props.accessRequirementId,\n {\n throwOnError: true,\n },\n )\n\n return wikiPageKey ? (\n <Accordion\n className=\"AccessRequirementWikiContainer\"\n disableGutters\n square\n variant=\"outlined\"\n slotProps={{ transition: { unmountOnExit: true } }}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"headline1\" component=\"h2\">\n Access Requirement Wiki\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <MarkdownSynapse\n wikiId={wikiPageKey?.wikiPageId}\n ownerId={wikiPageKey?.ownerObjectId}\n objectType={wikiPageKey?.ownerObjectType}\n />\n </AccordionDetails>\n </Accordion>\n ) : (\n <Skeleton width={'100%'} height={'64px'} />\n )\n}\n\n/**\n * returns true iff the userId is a requester and/or listed on the accessor changes on the submission.\n * @param userId\n * @param submission\n */\nfunction isRequesterOnSubmission(userId: string, submission: Submission) {\n return (\n submission.submittedBy === userId ||\n Boolean(submission.accessorChanges.find(acc => acc.userId === userId))\n )\n}\n\n/**\n * Page for a Data Access Submission. Supports the following user types:\n * - ACT member or other designated reviewer can view, and choose to approve or reject.\n * - Data Access Request submitter can view and modify their own submission.\n * - Data Access Request requester (who is not a submitter) can view their own submission.\n */\nexport default function SubmissionPage(props: SubmissionPageProps) {\n const { submissionId, isReviewer } = props\n const [showRejectionDialog, setShowRejectionDialog] = useState(false)\n\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n\n const { data: submission, isLoading: isLoadingSubmission } =\n useGetDataAccessSubmission(submissionId, {\n throwOnError: true,\n })\n const isRequester = Boolean(\n submission &&\n currentUserProfile &&\n isRequesterOnSubmission(currentUserProfile.ownerId, submission),\n )\n\n const { data: accessApproval, isLoading: isLoadingAccessApproval } =\n useGetUserAccessApproval(String(submissionId), {\n enabled:\n isRequester &&\n submission &&\n submission.state === SubmissionState.APPROVED,\n })\n\n const isExpired = Boolean(\n accessApproval && dayjs(accessApproval.expiredOn).isBefore(dayjs()),\n )\n\n const isSubmitter =\n submission && submission.submittedBy === currentUserProfile?.ownerId\n\n const { data: accessRequirement } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n parseInt(submission?.accessRequirementId!),\n { enabled: !!submission },\n )\n\n const { data: acl, isLoading: isLoadingACL } = useGetAccessRequirementACL(\n submission?.accessRequirementId!,\n { enabled: !!submission, throwOnError: true },\n )\n\n const { data: thread } = useGetThreadForSubmission(submissionId)\n\n const [showUpdateRequestDialog, setShowUpdateRequestDialog] = useState(false)\n const [\n showCancelRequestConfirmationDialog,\n setShowCancelRequestConfirmationDialog,\n ] = useState(false)\n const [showApprovalConfirmation, setShowApprovalConfirmation] =\n useState(false)\n\n const navigate = useNavigate()\n\n const reviewerIds = acl?.resourceAccess\n .filter(ra => ra.accessType.includes(ACCESS_TYPE.REVIEW_SUBMISSIONS))\n .map(ra => ra.principalId)\n\n const displayedSubmissionState: ReactNode = useMemo(() => {\n if (submission && !isLoadingAccessApproval) {\n if (isExpired) {\n return 'Expired'\n }\n return submission.state\n }\n return <Skeleton width={100} />\n }, [isExpired, isLoadingAccessApproval, submission])\n\n const hasSchemaAnswers =\n !!submission?.schemaData && Object.keys(submission.schemaData).length > 0\n const hasDocuments = Boolean(\n submission?.ducFileHandleId ||\n submission?.irbFileHandleId ||\n submission?.attachments,\n )\n // A schema-driven submission may carry its documents only as form answers, so an empty\n // Documents heading would sit directly above them.\n const showDocumentsHeading = hasDocuments || !submission?.schemaData\n\n return (\n <Grid container={true} spacing={4} className=\"SubmissionPage\">\n {showUpdateRequestDialog && accessRequirement && (\n <AccessRequirementList\n renderAsModal={true}\n accessRequirementFromProps={[accessRequirement]}\n onHide={() => setShowUpdateRequestDialog(false)}\n onSubmissionCreated={submissionId => {\n setShowUpdateRequestDialog(false)\n displayToast('Data access request submitted', 'success', {\n primaryButtonConfig: {\n text: 'View Request',\n onClick: () => {\n navigate('/submissions/' + submissionId)\n },\n },\n })\n }}\n />\n )}\n <ApproveSubmissionConfirmationModal\n open={showApprovalConfirmation}\n onClose={() => {\n setShowApprovalConfirmation(false)\n }}\n submissionId={String(submissionId)}\n />\n {showRejectionDialog && (\n <RejectDataAccessRequestModal\n // Previously, we used a 'key' prop to reset the modal form when it was opened,\n // but removing the key and re-rendering the JSX achieves the same functionality in a more straightforward way.\n submissionId={submissionId}\n open={showRejectionDialog}\n onClose={() => setShowRejectionDialog(false)}\n />\n )}\n <Grid\n className=\"SubmissionSummary\"\n size={{\n xs: 12,\n sm: 4,\n lg: 3,\n }}\n >\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Status\n </Typography>\n <Typography\n variant=\"headline3\"\n sx={{ textTransform: 'uppercase' }}\n gutterBottom\n >\n {displayedSubmissionState}\n </Typography>\n <br />\n {isLoadingSubmission && <Skeleton width={200} />}\n {submission &&\n isReviewer &&\n submission.state === SubmissionState.SUBMITTED && (\n <div className=\"ButtonContainer\">\n <Button\n onClick={() => {\n setShowApprovalConfirmation(true)\n }}\n color=\"success\"\n variant=\"contained\"\n >\n Approve\n </Button>\n <Button\n onClick={() => {\n setShowRejectionDialog(true)\n }}\n color=\"error\"\n variant=\"contained\"\n >\n Reject\n </Button>\n </div>\n )}\n\n {submission && isSubmitter && (\n <div className=\"ButtonContainer\">\n <CancelDataAccessRequestConfirmationModal\n open={showCancelRequestConfirmationDialog}\n submissionId={String(submissionId)}\n accessRequirementId={submission?.accessRequirementId || ''}\n onClose={() => setShowCancelRequestConfirmationDialog(false)}\n />\n {submission.state === SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowCancelRequestConfirmationDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n Cancel Request\n </Button>\n )}\n {submission.state !== SubmissionState.SUBMITTED && (\n <Button\n onClick={() => {\n setShowUpdateRequestDialog(true)\n }}\n color=\"primary\"\n variant=\"outlined\"\n >\n {submission.state === SubmissionState.APPROVED\n ? 'Update'\n : 'Modify'}{' '}\n Request\n </Button>\n )}\n </div>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Access Requirement Name\n </Typography>\n\n <Typography variant=\"smallText1\" gutterBottom>\n {accessRequirement?.name ?? <Skeleton width={100} />}\n </Typography>\n <br />\n\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Assigned Reviewer\n </Typography>\n <Stack>\n {isLoadingACL && <Skeleton width={100} />}\n {!isLoadingACL &&\n !isEmpty(reviewerIds) &&\n reviewerIds!.map(id => {\n return <UserOrTeamBadge key={id} principalId={id} />\n })}\n {!isLoadingACL && isEmpty(reviewerIds) && (\n <UserOrTeamBadge principalId={ACT_TEAM_ID} />\n )}\n </Stack>\n <br />\n </>\n )}\n <Typography variant=\"dataFieldKey\" gutterBottom>\n Conditions\n </Typography>\n {accessRequirement ? (\n <Typography variant=\"smallText1\" component={'div'} gutterBottom>\n <ul>\n <li>\n Expiration period:{' '}\n {dayjs\n .duration({\n milliseconds: accessRequirement.expirationPeriod,\n })\n .asDays()}{' '}\n day(s)\n {accessRequirement.expirationPeriod === 0 && ' (no expiration)'}\n </li>\n\n {accessRequirement.isCertifiedUserRequired && (\n <li>User must be Certified</li>\n )}\n {accessRequirement.isValidatedProfileRequired && (\n <li>User Profile must be Validated</li>\n )}\n {accessRequirement.isDUCRequired && <li>DUC is required</li>}\n {accessRequirement.isIDURequired && <li>IDU is required</li>}\n {accessRequirement.isIDUPublic && (\n <li>IDU will be made public</li>\n )}\n {accessRequirement.isIRBApprovalRequired && (\n <li>IRB Approval is required</li>\n )}\n {accessRequirement.areOtherAttachmentsRequired && (\n <li>Other attachments are required</li>\n )}\n </ul>\n </Typography>\n ) : (\n <Skeleton width={100} />\n )}\n <br />\n <div className=\"SubmissionSummaryGrid\">\n <Typography variant=\"dataFieldKey\">Submitted By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.submittedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography variant=\"dataFieldKey\">Submitted On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.submittedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n {isReviewer && (\n <>\n <Typography variant=\"dataFieldKey\">Modified By</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n <UserBadge userId={submission.modifiedBy} />\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n <Typography variant=\"dataFieldKey\">Modified On</Typography>\n <Typography variant=\"smallText1\">\n {submission ? (\n formatDate(dayjs(submission.modifiedOn))\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Data Requesters\n {`${submission ? ` (${submission.accessorChanges.length})` : ''}`}\n </Typography>\n {submission ? (\n submission.accessorChanges.map(accessorChange => (\n <Fragment key={accessorChange.userId}>\n <Typography className=\"Key DataAccessor\" variant=\"smallText1\">\n <span style={{ whiteSpace: 'nowrap' }}>\n <UserBadge\n key={accessorChange.userId}\n userId={accessorChange.userId}\n />\n </span>\n </Typography>\n <Typography className=\"Value DataAccessor\" variant=\"smallText1\">\n {upperFirst(\n toLower(\n accessorChange.type.substring(\n 0,\n accessorChange.type.indexOf('_'),\n ),\n ),\n )}\n </Typography>\n </Fragment>\n ))\n ) : (\n <Skeleton width={100} />\n )}\n {(!submission || submission.researchProjectSnapshot) && (\n <>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Institution\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot?.institution\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n <Typography className=\"Key\" variant=\"dataFieldKey\">\n Project Lead\n </Typography>\n <Typography className=\"Value\" variant=\"smallText1\">\n {submission ? (\n submission.researchProjectSnapshot?.projectLead\n ) : (\n <Skeleton width={100} />\n )}\n </Typography>\n </>\n )}\n </div>\n </Grid>\n <Grid\n size={{\n xs: 12,\n sm: 8,\n lg: 9,\n }}\n >\n <Stack sx={{ gap: 2 }}>\n <SynapseErrorBoundary>\n {submission ? (\n <AccessRequirementWiki\n accessRequirementId={submission.accessRequirementId}\n />\n ) : (\n <></>\n )}\n </SynapseErrorBoundary>\n {submission?.rejectedReason && (\n <section>\n <Typography variant=\"headline1\" gutterBottom>\n Reason for rejection given by reviewer\n </Typography>\n <hr />\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {submission.rejectedReason}\n </Typography>\n </section>\n )}\n <section>\n <Typography variant=\"headline1\">\n Contents of the Access Request\n <hr />\n </Typography>\n <Stack\n sx={{\n gap: 2,\n }}\n >\n {submission?.researchProjectSnapshot\n ?.intendedDataUseStatement && (\n <section>\n <Typography variant=\"headline2\" gutterBottom>\n Intended Data Use Statement\n </Typography>\n <Typography\n variant=\"body1\"\n style={{ whiteSpace: 'pre-line' }}\n gutterBottom\n >\n {\n submission.researchProjectSnapshot\n .intendedDataUseStatement\n }\n </Typography>\n </section>\n )}\n {showDocumentsHeading && (\n <Typography variant=\"headline2\" gutterBottom>\n Documents\n </Typography>\n )}\n {submission?.ducFileHandleId && (\n <section>\n <Typography variant=\"smallText2\">\n Data Use Certificate (DUC)\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.ducFileHandleId}\n />\n </section>\n )}\n {submission?.irbFileHandleId && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n IRB Approval Letter\n </Typography>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={submission.irbFileHandleId}\n />\n </section>\n )}\n {submission?.attachments && (\n <section>\n <Typography variant=\"smallText2\" gutterBottom>\n Other Attachments\n </Typography>\n {submission.attachments.map(fileHandleId => (\n <Fragment key={fileHandleId}>\n <DataAccessSubmissionFileHandleLink\n submissionId={submission.id}\n fileHandleId={fileHandleId}\n />\n <br />\n </Fragment>\n ))}\n </section>\n )}\n {submission && hasSchemaAnswers && (\n <SubmissionSchemaAnswers submission={submission} />\n )}\n </Stack>\n </section>\n {thread?.id && (\n <DiscussionThread\n threadId={thread.id}\n limit={25}\n emptyBodyContent={THREAD_BODY}\n />\n )}\n </Stack>\n </Grid>\n </Grid>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { GeneratedSubmissionForm } from '@/synapse-queries/dataaccess/useGeneratedSubmissionForm';
2
+ import { Submission } from '@sage-bionetworks/synapse-types';
3
+ export declare const NO_RESPONSE_TEXT = "No response";
4
+ export declare const OTHER_RESPONSES_TITLE = "Other responses";
5
+ export type SubmissionSchemaAnswerListProps = {
6
+ submissionId: string;
7
+ schemaData: Record<string, unknown>;
8
+ /** The generated form to group and label answers by. Without it, answers are listed by key. */
9
+ form: GeneratedSubmissionForm | undefined;
10
+ };
11
+ /**
12
+ * Answers grouped and labelled by the steps of `form`. Answers the form does not place in a step
13
+ * are listed under {@link OTHER_RESPONSES_TITLE} so a reviewer never misses submitted data.
14
+ */
15
+ export declare function SubmissionSchemaAnswerList(props: SubmissionSchemaAnswerListProps): import("react/jsx-runtime").JSX.Element;
16
+ export type SubmissionSchemaAnswersProps = {
17
+ submission: Submission;
18
+ };
19
+ /**
20
+ * Read-only view of a submission's `schemaData`, grouped and labelled by the steps of the
21
+ * FormTemplate version the submission was made against. If that form cannot be generated, the
22
+ * error is shown alongside the answers listed by key.
23
+ */
24
+ export declare function SubmissionSchemaAnswers(props: SubmissionSchemaAnswersProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=SubmissionSchemaAnswers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubmissionSchemaAnswers.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EAExB,MAAM,yDAAyD,CAAA;AAOhE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAI5D,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAC7C,eAAO,MAAM,qBAAqB,oBAAoB,CAAA;AA0ItD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,+FAA+F;IAC/F,IAAI,EAAE,uBAAuB,GAAG,SAAS,CAAA;CAC1C,CAAA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,2CAyCvC;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,2CAoB1E"}
@@ -0,0 +1,125 @@
1
+ import { ErrorBanner as e } from "../../error/ErrorBanner.js";
2
+ import { SUBMISSION_CONTEXT_PROPERTY as t, listResolvedSchemaProperties as n } from "../../../utils/jsonschema/submissionContext.js";
3
+ import { useGeneratedSubmissionForm as r } from "../../../synapse-queries/dataaccess/useGeneratedSubmissionForm.js";
4
+ import { detectFieldType as i } from "../../FormTemplateEditor/schemaFieldUtils.js";
5
+ import { DataAccessSubmissionFileHandleLink as a } from "./DataAccessSubmissionFileHandleLink.js";
6
+ import { useMemo as o } from "react";
7
+ import { Skeleton as s, Stack as c, Typography as l } from "@mui/material";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
+ //#region src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx
10
+ var f = "No response", p = "Other responses", m = /^\d+$/, h = {};
11
+ function g(e) {
12
+ return e == null || e === "" || Array.isArray(e) && e.length === 0;
13
+ }
14
+ function _(e) {
15
+ return (typeof e == "string" || typeof e == "number") && m.test(String(e));
16
+ }
17
+ function v(e, t) {
18
+ let n = e?.oneOf?.find((e) => typeof e == "object" && e.const === t);
19
+ return n?.title ? n.title : typeof t == "boolean" ? t ? "Yes" : "No" : typeof t == "object" ? JSON.stringify(t) : String(t);
20
+ }
21
+ function y(e) {
22
+ let { submissionId: t, value: n, subSchema: r } = e;
23
+ if (g(n)) return /* @__PURE__ */ u(l, {
24
+ variant: "body1",
25
+ color: "text.secondary",
26
+ children: f
27
+ });
28
+ if (i(r) === "file" && _(n)) return /* @__PURE__ */ u(a, {
29
+ submissionId: t,
30
+ fileHandleId: String(n)
31
+ });
32
+ let o = r?.items;
33
+ return /* @__PURE__ */ u(l, {
34
+ variant: "body1",
35
+ style: { whiteSpace: "pre-line" },
36
+ children: Array.isArray(n) ? n.map((e) => v(o, e)).join(", ") : v(r, n)
37
+ });
38
+ }
39
+ function b(e, t, n) {
40
+ return {
41
+ propertyKey: e,
42
+ label: n ?? t?.title ?? e,
43
+ subSchema: t
44
+ };
45
+ }
46
+ function x({ jsonSchema: e, uiSchema: t }) {
47
+ return {
48
+ title: String(e.title ?? ""),
49
+ description: e.description,
50
+ fields: (t["ui:order"] ?? []).map((n) => b(n, e.properties?.[n], t[n]?.["ui:title"]))
51
+ };
52
+ }
53
+ function S(e, r) {
54
+ let i = e ? e.steps.map(x) : [], a = new Set([t, ...i.flatMap((e) => e.fields.map((e) => e.propertyKey))]), o = new Map(e ? n(e.schema).map((e) => [e.propertyKey, e]) : []), s = Object.keys(r).filter((e) => !a.has(e)).map((e) => b(e, o.get(e)?.subSchema));
55
+ return s.length > 0 ? [...i, {
56
+ title: p,
57
+ fields: s
58
+ }] : i;
59
+ }
60
+ function C(e) {
61
+ let { submissionId: t, schemaData: n, form: r } = e;
62
+ return /* @__PURE__ */ u(c, {
63
+ sx: { gap: 4 },
64
+ children: o(() => S(r, n), [r, n]).map((e, r) => /* @__PURE__ */ d(c, {
65
+ component: "section",
66
+ sx: { gap: 2 },
67
+ children: [/* @__PURE__ */ d(c, {
68
+ sx: { gap: .5 },
69
+ children: [/* @__PURE__ */ u(l, {
70
+ variant: "headline3",
71
+ children: e.title
72
+ }), e.description && /* @__PURE__ */ u(l, {
73
+ variant: "body1",
74
+ color: "text.secondary",
75
+ children: e.description
76
+ })]
77
+ }), /* @__PURE__ */ u(c, {
78
+ component: "dl",
79
+ sx: {
80
+ gap: 2,
81
+ m: 0
82
+ },
83
+ children: e.fields.map((e) => /* @__PURE__ */ d(c, {
84
+ sx: { gap: .5 },
85
+ children: [/* @__PURE__ */ u(l, {
86
+ variant: "smallText2",
87
+ component: "dt",
88
+ children: e.label
89
+ }), /* @__PURE__ */ u(l, {
90
+ component: "dd",
91
+ sx: { m: 0 },
92
+ children: /* @__PURE__ */ u(y, {
93
+ submissionId: t,
94
+ value: n[e.propertyKey],
95
+ subSchema: e.subSchema
96
+ })
97
+ })]
98
+ }, e.propertyKey))
99
+ })]
100
+ }, r))
101
+ });
102
+ }
103
+ function w(t) {
104
+ let { submission: n } = t, i = n.schemaData ?? h, { form: a, isLoading: o, error: f } = r(n);
105
+ return /* @__PURE__ */ d(c, {
106
+ component: "section",
107
+ sx: { gap: 2 },
108
+ children: [
109
+ /* @__PURE__ */ u(l, {
110
+ variant: "headline2",
111
+ children: "Form Responses"
112
+ }),
113
+ f && /* @__PURE__ */ u(e, { error: f }),
114
+ o ? /* @__PURE__ */ u(s, { width: 300 }) : /* @__PURE__ */ u(C, {
115
+ submissionId: n.id,
116
+ schemaData: i,
117
+ form: a
118
+ })
119
+ ]
120
+ });
121
+ }
122
+ //#endregion
123
+ export { f as NO_RESPONSE_TEXT, p as OTHER_RESPONSES_TITLE, C as SubmissionSchemaAnswerList, w as SubmissionSchemaAnswers };
124
+
125
+ //# sourceMappingURL=SubmissionSchemaAnswers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubmissionSchemaAnswers.js","names":[],"sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionSchemaAnswers.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/error/ErrorBanner'\nimport { detectFieldType } from '@/components/FormTemplateEditor/schemaFieldUtils'\nimport {\n GeneratedSubmissionForm,\n useGeneratedSubmissionForm,\n} from '@/synapse-queries/dataaccess/useGeneratedSubmissionForm'\nimport {\n listResolvedSchemaProperties,\n SUBMISSION_CONTEXT_PROPERTY,\n} from '@/utils/jsonschema/submissionContext'\nimport { Skeleton, Stack, Typography } from '@mui/material'\nimport { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport { Submission } from '@sage-bionetworks/synapse-types'\nimport { ReactNode, useMemo } from 'react'\nimport { DataAccessSubmissionFileHandleLink } from './DataAccessSubmissionFileHandleLink'\n\nexport const NO_RESPONSE_TEXT = 'No response'\nexport const OTHER_RESPONSES_TITLE = 'Other responses'\nconst NUMERIC_ID_PATTERN = /^\\d+$/\nconst NO_SCHEMA_DATA: Record<string, unknown> = {}\n\ntype AnsweredField = {\n propertyKey: string\n label: string\n subSchema: RJSFSchema | undefined\n}\n\ntype AnswerGroup = {\n title: string\n description?: string\n fields: AnsweredField[]\n}\n\nfunction isEmptyAnswer(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n )\n}\n\n/**\n * Whether `value` has the shape of a numeric ID. This does not establish what the ID refers to:\n * that comes from the schema declaring a file field. `schemaData` is written by the submitter, so\n * even then only a well-formed ID may be turned into a download request made with the reviewer's\n * credentials.\n */\nfunction isNumericId(value: unknown): value is string | number {\n return (\n (typeof value === 'string' || typeof value === 'number') &&\n NUMERIC_ID_PATTERN.test(String(value))\n )\n}\n\n/** An answer's display text: a choice's `oneOf` title when declared, otherwise the stored value. */\nfunction formatAnswer(subSchema: RJSFSchema | undefined, value: unknown) {\n const option = subSchema?.oneOf?.find(\n o => typeof o === 'object' && o.const === value,\n ) as RJSFSchema | undefined\n if (option?.title) return option.title\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value as string | number | bigint)\n}\n\nfunction SchemaAnswerValue(props: {\n submissionId: string\n value: unknown\n subSchema: RJSFSchema | undefined\n}): ReactNode {\n const { submissionId, value, subSchema } = props\n if (isEmptyAnswer(value)) {\n return (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {NO_RESPONSE_TEXT}\n </Typography>\n )\n }\n if (detectFieldType(subSchema) === 'file' && isNumericId(value)) {\n return (\n <DataAccessSubmissionFileHandleLink\n submissionId={submissionId}\n fileHandleId={String(value)}\n />\n )\n }\n const itemSchema = subSchema?.items as RJSFSchema | undefined\n const text = Array.isArray(value)\n ? value.map(item => formatAnswer(itemSchema, item)).join(', ')\n : formatAnswer(subSchema, value)\n return (\n <Typography variant=\"body1\" style={{ whiteSpace: 'pre-line' }}>\n {text}\n </Typography>\n )\n}\n\nfunction toAnsweredField(\n propertyKey: string,\n subSchema: RJSFSchema | undefined,\n uiTitle?: string,\n): AnsweredField {\n return {\n propertyKey,\n label: uiTitle ?? subSchema?.title ?? propertyKey,\n subSchema,\n }\n}\n\nfunction toStepGroup({\n jsonSchema,\n uiSchema,\n}: GeneratedSubmissionForm['steps'][number]): AnswerGroup {\n return {\n title: String(jsonSchema.title ?? ''),\n description: jsonSchema.description,\n fields: (uiSchema['ui:order'] ?? []).map(propertyKey =>\n toAnsweredField(\n propertyKey,\n jsonSchema.properties?.[propertyKey] as RJSFSchema | undefined,\n (uiSchema[propertyKey] as UiSchema | undefined)?.['ui:title'],\n ),\n ),\n }\n}\n\nfunction buildAnswerGroups(\n form: GeneratedSubmissionForm | undefined,\n schemaData: Record<string, unknown>,\n): AnswerGroup[] {\n const stepGroups = form ? form.steps.map(toStepGroup) : []\n const placedKeys = new Set([\n SUBMISSION_CONTEXT_PROPERTY,\n ...stepGroups.flatMap(g => g.fields.map(f => f.propertyKey)),\n ])\n const schemaPropertiesByKey = new Map(\n form\n ? listResolvedSchemaProperties(form.schema).map(p => [p.propertyKey, p])\n : [],\n )\n const unplacedFields = Object.keys(schemaData)\n .filter(key => !placedKeys.has(key))\n .map(propertyKey =>\n toAnsweredField(\n propertyKey,\n schemaPropertiesByKey.get(propertyKey)?.subSchema,\n ),\n )\n\n return unplacedFields.length > 0\n ? [...stepGroups, { title: OTHER_RESPONSES_TITLE, fields: unplacedFields }]\n : stepGroups\n}\n\nexport type SubmissionSchemaAnswerListProps = {\n submissionId: string\n schemaData: Record<string, unknown>\n /** The generated form to group and label answers by. Without it, answers are listed by key. */\n form: GeneratedSubmissionForm | undefined\n}\n\n/**\n * Answers grouped and labelled by the steps of `form`. Answers the form does not place in a step\n * are listed under {@link OTHER_RESPONSES_TITLE} so a reviewer never misses submitted data.\n */\nexport function SubmissionSchemaAnswerList(\n props: SubmissionSchemaAnswerListProps,\n) {\n const { submissionId, schemaData, form } = props\n const groups = useMemo(\n () => buildAnswerGroups(form, schemaData),\n [form, schemaData],\n )\n\n return (\n <Stack sx={{ gap: 4 }}>\n {groups.map((group, index) => (\n // Step titles are not unique, and the list is derived rather than reordered.\n <Stack component=\"section\" key={index} sx={{ gap: 2 }}>\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"headline3\">{group.title}</Typography>\n {group.description && (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {group.description}\n </Typography>\n )}\n </Stack>\n <Stack component=\"dl\" sx={{ gap: 2, m: 0 }}>\n {group.fields.map(field => (\n <Stack key={field.propertyKey} sx={{ gap: 0.5 }}>\n <Typography variant=\"smallText2\" component=\"dt\">\n {field.label}\n </Typography>\n <Typography component=\"dd\" sx={{ m: 0 }}>\n <SchemaAnswerValue\n submissionId={submissionId}\n value={schemaData[field.propertyKey]}\n subSchema={field.subSchema}\n />\n </Typography>\n </Stack>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n )\n}\n\nexport type SubmissionSchemaAnswersProps = {\n submission: Submission\n}\n\n/**\n * Read-only view of a submission's `schemaData`, grouped and labelled by the steps of the\n * FormTemplate version the submission was made against. If that form cannot be generated, the\n * error is shown alongside the answers listed by key.\n */\nexport function SubmissionSchemaAnswers(props: SubmissionSchemaAnswersProps) {\n const { submission } = props\n const schemaData = submission.schemaData ?? NO_SCHEMA_DATA\n const { form, isLoading, error } = useGeneratedSubmissionForm(submission)\n\n return (\n <Stack component=\"section\" sx={{ gap: 2 }}>\n <Typography variant=\"headline2\">Form Responses</Typography>\n {error && <ErrorBanner error={error} />}\n {isLoading ? (\n <Skeleton width={300} />\n ) : (\n <SubmissionSchemaAnswerList\n submissionId={submission.id}\n schemaData={schemaData}\n form={form}\n />\n )}\n </Stack>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"AAgJA;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,mDA6J1C"}
1
+ {"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"AAiJA;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,mDAgK1C"}
@@ -4,7 +4,8 @@ import { useListAllUserDataAccessRequests as n, useVoidDataAccessRequestSignatur
4
4
  import "../../../synapse-queries/index.js";
5
5
  import { SkeletonTable as i } from "../../Skeleton/SkeletonTable.js";
6
6
  import "../../Skeleton/index.js";
7
- import a, { RequestDataStep as o } from "../../AccessRequirementList/AccessRequirementList.js";
7
+ import { getFirstRequestStep as a } from "../../AccessRequirementList/RequestDataStep.js";
8
+ import o from "../../AccessRequirementList/AccessRequirementList.js";
8
9
  import s from "../../TanStackTable/StyledTanStackTable.js";
9
10
  import c from "../../TanStackTable/ColumnHeader.js";
10
11
  import { USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH as l, USER_ACCESS_HISTORY_REQUEST_SUBPATH as u } from "./RouteConstants.js";
@@ -154,12 +155,12 @@ function I() {
154
155
  fullWidth: !0
155
156
  })]
156
157
  }),
157
- N && /* @__PURE__ */ T(a, {
158
+ N && /* @__PURE__ */ T(o, {
158
159
  renderAsModal: !0,
159
160
  onHide: () => D(void 0),
160
161
  initialWizardEntry: {
161
- step: o.UPDATE_RESEARCH_PROJECT,
162
- managedACTAccessRequirement: N
162
+ step: a(N),
163
+ accessRequirement: N
163
164
  }
164
165
  }),
165
166
  /* @__PURE__ */ E(_, {
@@ -1 +1 @@
1
- {"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList, {\n RequestDataStep,\n} from '@/components/AccessRequirementList/AccessRequirementList'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'declined',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n declined: 'Signature declined',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,\n * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is\n * still filtered client-side because the list endpoint has no server-side status filter.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests({ isEDuc: true })\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<ManagedACTAccessRequirement>(\n modifyingArId ?? '',\n { enabled: Boolean(modifyingArId), staleTime: Infinity },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn&apos;t load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n managedACTAccessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (cancellingSummary?.requestId) {\n voidSignature(cancellingSummary.requestId)\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList from '@/components/AccessRequirementList/AccessRequirementList'\nimport {\n getFirstRequestStep,\n RequestableAccessRequirement,\n} from '@/components/AccessRequirementList/RequestDataStep'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'declined',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n declined: 'Signature declined',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,\n * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is\n * still filtered client-side because the list endpoint has no server-side status filter.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests({ isEDuc: true })\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<RequestableAccessRequirement>(\n modifyingArId ?? '',\n {\n enabled: Boolean(modifyingArId),\n staleTime: Infinity,\n },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn&apos;t load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: getFirstRequestStep(modifyAccessRequirement),\n accessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (cancellingSummary?.requestId) {\n voidSignature(cancellingSummary.requestId)\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserAccessRequestHistoryPlace.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"names":[],"mappings":"AAmCA,KAAK,sBAAsB,GAAG;IAC5B,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6GAA6G;IAC7G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAsKD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,sBAAsB,2CAuB1E;AAED,eAAe,6BAA6B,CAAA"}
1
+ {"version":3,"file":"UserAccessRequestHistoryPlace.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"names":[],"mappings":"AAkCA,KAAK,sBAAsB,GAAG;IAC5B,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6GAA6G;IAC7G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAsKD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,sBAAsB,2CAuB1E;AAED,eAAe,6BAA6B,CAAA"}
@@ -3,7 +3,8 @@ import "../../../utils/AppUtils/index.js";
3
3
  import { useGetAccessRequirements as t } from "../../../synapse-queries/dataaccess/useAccessRequirements.js";
4
4
  import { useListAllUserDataAccessRequests as n } from "../../../synapse-queries/dataaccess/useEDuc.js";
5
5
  import "../../../synapse-queries/index.js";
6
- import r, { RequestDataStep as i } from "../../AccessRequirementList/AccessRequirementList.js";
6
+ import { RequestDataStep as r } from "../../AccessRequirementList/RequestDataStep.js";
7
+ import i from "../../AccessRequirementList/AccessRequirementList.js";
7
8
  import { Breadcrumbs as a } from "../../Breadcrumbs/Breadcrumbs.js";
8
9
  import o from "../SubmissionPage/SubmissionPage.js";
9
10
  import { REQUEST_ID_PARAM as s, SUBMISSION_ID_PARAM as c, USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH as l, USER_ACCESS_HISTORY_REQUEST_SUBPATH as u, USER_ACCESS_HISTORY_SUBMISSION_SUBPATH as d } from "./RouteConstants.js";
@@ -29,14 +30,14 @@ function O() {
29
30
  return s || l && d ? null : !c || !l || !u ? /* @__PURE__ */ g(v, {
30
31
  to: "/",
31
32
  replace: !0
32
- }) : /* @__PURE__ */ g(r, {
33
+ }) : /* @__PURE__ */ g(i, {
33
34
  renderAsModal: !0,
34
35
  onHide: () => {
35
36
  a("/");
36
37
  },
37
38
  initialWizardEntry: {
38
- step: i.SIGNATURE_STATUS,
39
- managedACTAccessRequirement: u
39
+ step: r.SIGNATURE_STATUS,
40
+ accessRequirement: u
40
41
  }
41
42
  });
42
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UserAccessRequestHistoryPlace.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"sourcesContent":["import {\n BreadcrumbItem,\n Breadcrumbs,\n} from '@/components/Breadcrumbs/Breadcrumbs'\nimport { useListAllUserDataAccessRequests } from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport { AuthenticationGuard } from '@/utils/AppUtils'\nimport { Box } from '@mui/material'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport { useMemo } from 'react'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n Navigate,\n Outlet,\n RouteObject,\n RouterProvider,\n useLocation,\n useNavigate,\n useParams,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport AccessRequirementList, {\n RequestDataStep,\n} from '../../AccessRequirementList/AccessRequirementList'\nimport SubmissionPage from '../SubmissionPage/SubmissionPage'\nimport {\n REQUEST_ID_PARAM,\n SUBMISSION_ID_PARAM,\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n USER_ACCESS_HISTORY_SUBMISSION_SUBPATH,\n} from './RouteConstants'\nimport { UserAccessRequestHistoryPage } from './UserAccessRequestHistoryPage'\n\ntype ReviewerDashboardProps = {\n /** Used to determine the base path for the component. Default is RequestHistory:default */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For demo/test purposes only. */\n useMemoryRouter?: boolean\n}\n\nfunction UserSubmissionPageRouteRenderer() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n if (!submissionId) {\n return <Navigate to=\"/\" />\n }\n return <SubmissionPage submissionId={submissionId} isReviewer={false} />\n}\n\n/**\n * Deep-link route element for `/request/:requestId/signature`. Rendered inside\n * `UserAccessRequestHistoryPage`'s `<Outlet />` so the page stays mounted while the dialog is open.\n * Looks up the request in the user's own access-request list, then mounts the signature-status\n * wizard step for the AR. Requests that don't belong to the user (or don't exist) redirect back\n * to the history index. The surrounding `AuthenticationGuard` handles unauthenticated visitors.\n */\nfunction RequestSignatureRouteRenderer() {\n const { requestId } = useParams<{ [REQUEST_ID_PARAM]: string }>()\n const navigate = useNavigate()\n\n const { data: summaries, isLoading: isLoadingSummaries } =\n useListAllUserDataAccessRequests({ isEDuc: true })\n const summary = summaries?.find(s => s.requestId === requestId)\n const accessRequirementId = summary?.accessRequirementId\n\n const { data: accessRequirement, isLoading: isLoadingAr } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n accessRequirementId ?? '',\n { enabled: Boolean(accessRequirementId), staleTime: Infinity },\n )\n\n // Wait for the summary + AR to load before mounting the dialog. `UserAccessRequestHistoryPage`\n // renders its own skeletons in the meantime, so no visible spinner is needed here.\n if (isLoadingSummaries || (accessRequirementId && isLoadingAr)) {\n return null\n }\n\n // Summary not found in the user's own requests, or its access requirement failed to load.\n if (!summary || !accessRequirementId || !accessRequirement) {\n return <Navigate to=\"/\" replace />\n }\n\n return (\n <AccessRequirementList\n renderAsModal\n onHide={() => {\n void navigate('/')\n }}\n initialWizardEntry={{\n step: RequestDataStep.SIGNATURE_STATUS,\n managedACTAccessRequirement: accessRequirement,\n }}\n />\n )\n}\n\n/**\n * Layout for UserAccessRequestHistory pages. Includes header with title.\n * @constructor\n */\nfunction UserAccessRequestHistoryPageLayout() {\n return (\n <>\n <div className=\"pageHeader\">\n <div className=\"grid\">\n <h3 className=\"pageHeaderTitle\">Access Requests</h3>\n </div>\n </div>\n <Box sx={{ px: 5, py: 3 }}>\n <Outlet />\n </Box>\n </>\n )\n}\n\n/**\n * Breadcrumb layout for UserAccessRequestHistory pages. Displays breadcrumbs for navigation.\n */\nfunction UserAccessRequestHistoryBreadcrumbLayout() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n const location = useLocation()\n\n const breadcrumbItems: BreadcrumbItem[] = [\n {\n text: 'Access Request History',\n to: '/',\n current: location.pathname === '/',\n },\n ]\n if (submissionId) {\n const submissionPath = `/${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}/${submissionId}`\n breadcrumbItems.push({\n text: `Request #${submissionId}`,\n to: submissionPath,\n current: location.pathname === submissionPath,\n })\n }\n\n return (\n <>\n <Breadcrumbs\n items={breadcrumbItems}\n sx={{\n mt: 2,\n mb: 4,\n ['& .MuiLink-root']: {\n color: 'text.secondary',\n letterSpacing: 0,\n '&:visited': {\n color: 'text.secondary',\n },\n },\n '& .MuiSvgIcon-root': {\n color: 'grey.500',\n },\n }}\n />\n <Outlet />\n </>\n )\n}\n\nconst routes: RouteObject[] = [\n {\n element: <UserAccessRequestHistoryPageLayout />,\n children: [\n {\n path: '/',\n children: [\n {\n // Keep the history page mounted across the index ↔ signature-deep-link transition.\n element: <UserAccessRequestHistoryPage />,\n children: [\n { index: true, element: null },\n {\n path: `${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/:${REQUEST_ID_PARAM}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`,\n element: (\n <AuthenticationGuard>\n <RequestSignatureRouteRenderer />\n </AuthenticationGuard>\n ),\n },\n ],\n },\n {\n // Do not display the breadcrumbs on the `index` page\n element: <UserAccessRequestHistoryBreadcrumbLayout />,\n children: [\n {\n path: `${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}`,\n children: [\n {\n path: `:${SUBMISSION_ID_PARAM}`,\n element: <UserSubmissionPageRouteRenderer />,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n]\n\n/**\n * Component that renders User Access Request history table & submission page. Handles routing internally.\n */\nexport function UserAccessRequestHistoryPlace(props: ReviewerDashboardProps) {\n const {\n routerBaseName = '/RequestHistory:default',\n useMemoryRouter = false,\n } = props\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n\nexport default UserAccessRequestHistoryPlace\n"],"mappings":"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"}
1
+ {"version":3,"file":"UserAccessRequestHistoryPlace.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"sourcesContent":["import {\n BreadcrumbItem,\n Breadcrumbs,\n} from '@/components/Breadcrumbs/Breadcrumbs'\nimport { useListAllUserDataAccessRequests } from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport { AuthenticationGuard } from '@/utils/AppUtils'\nimport { Box } from '@mui/material'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport { useMemo } from 'react'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n Navigate,\n Outlet,\n RouteObject,\n RouterProvider,\n useLocation,\n useNavigate,\n useParams,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport AccessRequirementList from '../../AccessRequirementList/AccessRequirementList'\nimport { RequestDataStep } from '../../AccessRequirementList/RequestDataStep'\nimport SubmissionPage from '../SubmissionPage/SubmissionPage'\nimport {\n REQUEST_ID_PARAM,\n SUBMISSION_ID_PARAM,\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n USER_ACCESS_HISTORY_SUBMISSION_SUBPATH,\n} from './RouteConstants'\nimport { UserAccessRequestHistoryPage } from './UserAccessRequestHistoryPage'\n\ntype ReviewerDashboardProps = {\n /** Used to determine the base path for the component. Default is RequestHistory:default */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For demo/test purposes only. */\n useMemoryRouter?: boolean\n}\n\nfunction UserSubmissionPageRouteRenderer() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n if (!submissionId) {\n return <Navigate to=\"/\" />\n }\n return <SubmissionPage submissionId={submissionId} isReviewer={false} />\n}\n\n/**\n * Deep-link route element for `/request/:requestId/signature`. Rendered inside\n * `UserAccessRequestHistoryPage`'s `<Outlet />` so the page stays mounted while the dialog is open.\n * Looks up the request in the user's own access-request list, then mounts the signature-status\n * wizard step for the AR. Requests that don't belong to the user (or don't exist) redirect back\n * to the history index. The surrounding `AuthenticationGuard` handles unauthenticated visitors.\n */\nfunction RequestSignatureRouteRenderer() {\n const { requestId } = useParams<{ [REQUEST_ID_PARAM]: string }>()\n const navigate = useNavigate()\n\n const { data: summaries, isLoading: isLoadingSummaries } =\n useListAllUserDataAccessRequests({ isEDuc: true })\n const summary = summaries?.find(s => s.requestId === requestId)\n const accessRequirementId = summary?.accessRequirementId\n\n const { data: accessRequirement, isLoading: isLoadingAr } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n accessRequirementId ?? '',\n { enabled: Boolean(accessRequirementId), staleTime: Infinity },\n )\n\n // Wait for the summary + AR to load before mounting the dialog. `UserAccessRequestHistoryPage`\n // renders its own skeletons in the meantime, so no visible spinner is needed here.\n if (isLoadingSummaries || (accessRequirementId && isLoadingAr)) {\n return null\n }\n\n // Summary not found in the user's own requests, or its access requirement failed to load.\n if (!summary || !accessRequirementId || !accessRequirement) {\n return <Navigate to=\"/\" replace />\n }\n\n return (\n <AccessRequirementList\n renderAsModal\n onHide={() => {\n void navigate('/')\n }}\n initialWizardEntry={{\n step: RequestDataStep.SIGNATURE_STATUS,\n accessRequirement,\n }}\n />\n )\n}\n\n/**\n * Layout for UserAccessRequestHistory pages. Includes header with title.\n * @constructor\n */\nfunction UserAccessRequestHistoryPageLayout() {\n return (\n <>\n <div className=\"pageHeader\">\n <div className=\"grid\">\n <h3 className=\"pageHeaderTitle\">Access Requests</h3>\n </div>\n </div>\n <Box sx={{ px: 5, py: 3 }}>\n <Outlet />\n </Box>\n </>\n )\n}\n\n/**\n * Breadcrumb layout for UserAccessRequestHistory pages. Displays breadcrumbs for navigation.\n */\nfunction UserAccessRequestHistoryBreadcrumbLayout() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n const location = useLocation()\n\n const breadcrumbItems: BreadcrumbItem[] = [\n {\n text: 'Access Request History',\n to: '/',\n current: location.pathname === '/',\n },\n ]\n if (submissionId) {\n const submissionPath = `/${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}/${submissionId}`\n breadcrumbItems.push({\n text: `Request #${submissionId}`,\n to: submissionPath,\n current: location.pathname === submissionPath,\n })\n }\n\n return (\n <>\n <Breadcrumbs\n items={breadcrumbItems}\n sx={{\n mt: 2,\n mb: 4,\n ['& .MuiLink-root']: {\n color: 'text.secondary',\n letterSpacing: 0,\n '&:visited': {\n color: 'text.secondary',\n },\n },\n '& .MuiSvgIcon-root': {\n color: 'grey.500',\n },\n }}\n />\n <Outlet />\n </>\n )\n}\n\nconst routes: RouteObject[] = [\n {\n element: <UserAccessRequestHistoryPageLayout />,\n children: [\n {\n path: '/',\n children: [\n {\n // Keep the history page mounted across the index ↔ signature-deep-link transition.\n element: <UserAccessRequestHistoryPage />,\n children: [\n { index: true, element: null },\n {\n path: `${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/:${REQUEST_ID_PARAM}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`,\n element: (\n <AuthenticationGuard>\n <RequestSignatureRouteRenderer />\n </AuthenticationGuard>\n ),\n },\n ],\n },\n {\n // Do not display the breadcrumbs on the `index` page\n element: <UserAccessRequestHistoryBreadcrumbLayout />,\n children: [\n {\n path: `${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}`,\n children: [\n {\n path: `:${SUBMISSION_ID_PARAM}`,\n element: <UserSubmissionPageRouteRenderer />,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n]\n\n/**\n * Component that renders User Access Request history table & submission page. Handles routing internally.\n */\nexport function UserAccessRequestHistoryPlace(props: ReviewerDashboardProps) {\n const {\n routerBaseName = '/RequestHistory:default',\n useMemoryRouter = false,\n } = props\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n\nexport default UserAccessRequestHistoryPlace\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CuratorDashboardRouter.d.ts","sourceRoot":"","sources":["../../../../src/features/curator/dashboard/CuratorDashboardRouter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAA;AAWlD,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;IAC1D,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2GAA2G;IAC3G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,KAAK,EAAE,2BAA2B,2CA0CnC"}
1
+ {"version":3,"file":"CuratorDashboardRouter.d.ts","sourceRoot":"","sources":["../../../../src/features/curator/dashboard/CuratorDashboardRouter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAA;AAYlD,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;IAC1D,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2GAA2G;IAC3G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,KAAK,EAAE,2BAA2B,2CA2CnC"}
@@ -2,20 +2,20 @@ import e from "../../entity/metadata-task/create-task/EditCurationTaskPage.js";
2
2
  import t from "./CuratorDashboard.js";
3
3
  import n from "../../../components/layout/SWCPageLayout.js";
4
4
  import { useMemo as r } from "react";
5
- import { jsx as i } from "react/jsx-runtime";
6
- import { Outlet as a, RouterProvider as o, createBrowserRouter as s, createMemoryRouter as c } from "react-router";
7
- import { RouterProvider as l } from "react-router/dom";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { Outlet as o, RouterProvider as s, ScrollRestoration as c, createBrowserRouter as l, createMemoryRouter as u } from "react-router";
7
+ import { RouterProvider as d } from "react-router/dom";
8
8
  //#region src/features/curator/dashboard/CuratorDashboardRouter.tsx
9
- function u(u) {
10
- let { routerBaseName: d = "/CuratorDashboard:0", useMemoryRouter: f = !1 } = u, p = r(() => [{
9
+ function f(f) {
10
+ let { routerBaseName: p = "/CuratorDashboard:0", useMemoryRouter: m = !1 } = f, h = r(() => [{
11
11
  path: "/",
12
- element: /* @__PURE__ */ i(n, {
12
+ element: /* @__PURE__ */ a(n, {
13
13
  header: { title: "Curator Dashboard" },
14
- children: /* @__PURE__ */ i("div", {
14
+ children: [/* @__PURE__ */ i("div", {
15
15
  className: "pageContent",
16
16
  style: { marginTop: "2rem" },
17
- children: /* @__PURE__ */ i(a, {})
18
- })
17
+ children: /* @__PURE__ */ i(o, {})
18
+ }), /* @__PURE__ */ i(c, { getKey: (e) => e.pathname })]
19
19
  }),
20
20
  children: [{
21
21
  index: !0,
@@ -24,14 +24,14 @@ function u(u) {
24
24
  path: "edit/:taskId",
25
25
  element: /* @__PURE__ */ i(e, {})
26
26
  }]
27
- }], []), m = r(() => f ? c(p, { basename: d }) : s(p, { basename: d }), [
28
- f,
29
- p,
30
- d
27
+ }], []), g = r(() => m ? u(h, { basename: p }) : l(h, { basename: p }), [
28
+ m,
29
+ h,
30
+ p
31
31
  ]);
32
- return i(f ? o : l, { router: m });
32
+ return i(m ? s : d, { router: g });
33
33
  }
34
34
  //#endregion
35
- export { u as default };
35
+ export { f as default };
36
36
 
37
37
  //# sourceMappingURL=CuratorDashboardRouter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CuratorDashboardRouter.js","names":[],"sources":["../../../../src/features/curator/dashboard/CuratorDashboardRouter.tsx"],"sourcesContent":["import EditCurationTaskPage from '@/features/entity/metadata-task/create-task/EditCurationTaskPage'\nimport CuratorDashboardContent from './CuratorDashboard'\nimport { PropsWithChildren, useMemo } from 'react'\nimport { Outlet } from 'react-router'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n RouteObject,\n RouterProvider,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport SWCPageLayout from '@/components/layout/SWCPageLayout'\n\nexport type CuratorDashboardRouterProps = PropsWithChildren<{\n /** Used to determine the base path for the component. Default is CuratorDashboard:0 */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For testing purposes only. */\n useMemoryRouter?: boolean\n}>\n\n/**\n * A router wrapper for the CuratorDashboard, which applies a router around the component to support using react-router APIs\n * from within the dashboard.\n */\nexport default function CuratorDashboardRouter(\n props: CuratorDashboardRouterProps,\n) {\n const { routerBaseName = '/CuratorDashboard:0', useMemoryRouter = false } =\n props\n\n const routes: RouteObject[] = useMemo(\n () => [\n {\n path: '/',\n element: (\n <SWCPageLayout header={{ title: 'Curator Dashboard' }}>\n <div className=\"pageContent\" style={{ marginTop: '2rem' }}>\n <Outlet />\n </div>\n </SWCPageLayout>\n ),\n children: [\n { index: true, element: <CuratorDashboardContent /> },\n { path: 'edit/:taskId', element: <EditCurationTaskPage /> },\n ],\n },\n ],\n [],\n )\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routes, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n"],"mappings":";;;;;;;;AAwBA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,oBAAiB,uBAAuB,qBAAkB,OAChE,GAEI,IAAwB,QACtB,CACJ;EACE,MAAM;EACN,SACE,kBAAC,GAAD;GAAe,QAAQ,EAAE,OAAO,oBAAoB;aAClD,kBAAC,OAAD;IAAK,WAAU;IAAc,OAAO,EAAE,WAAW,OAAO;cACtD,kBAAC,GAAD,CAAS,CAAA;GACN,CAAA;EACQ,CAAA;EAEjB,UAAU,CACR;GAAE,OAAO;GAAM,SAAS,kBAAC,GAAD,CAA0B,CAAA;EAAE,GACpD;GAAE,MAAM;GAAgB,SAAS,kBAAC,GAAD,CAAuB,CAAA;EAAE,CAC5D;CACF,CACF,GACA,CAAC,CACH,GAEM,IAAS,QACT,IACK,EAAmB,GAAQ,EAChC,UAAU,EACZ,CAAC,IAEM,EAAoB,GAAQ,EACjC,UAAU,EACZ,CAAC,GAEF;EAAC;EAAiB;EAAQ;CAAc,CAAC;CAM5C,OAHS,EADL,IACM,IAGF,GAHC,EAAwB,UAAS,CAAA;AAI5C"}
1
+ {"version":3,"file":"CuratorDashboardRouter.js","names":[],"sources":["../../../../src/features/curator/dashboard/CuratorDashboardRouter.tsx"],"sourcesContent":["import EditCurationTaskPage from '@/features/entity/metadata-task/create-task/EditCurationTaskPage'\nimport CuratorDashboardContent from './CuratorDashboard'\nimport { PropsWithChildren, useMemo } from 'react'\nimport { Outlet } from 'react-router'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n RouteObject,\n RouterProvider,\n ScrollRestoration,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport SWCPageLayout from '@/components/layout/SWCPageLayout'\n\nexport type CuratorDashboardRouterProps = PropsWithChildren<{\n /** Used to determine the base path for the component. Default is CuratorDashboard:0 */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For testing purposes only. */\n useMemoryRouter?: boolean\n}>\n\n/**\n * A router wrapper for the CuratorDashboard, which applies a router around the component to support using react-router APIs\n * from within the dashboard.\n */\nexport default function CuratorDashboardRouter(\n props: CuratorDashboardRouterProps,\n) {\n const { routerBaseName = '/CuratorDashboard:0', useMemoryRouter = false } =\n props\n\n const routes: RouteObject[] = useMemo(\n () => [\n {\n path: '/',\n element: (\n <SWCPageLayout header={{ title: 'Curator Dashboard' }}>\n <div className=\"pageContent\" style={{ marginTop: '2rem' }}>\n <Outlet />\n </div>\n <ScrollRestoration getKey={location => location.pathname} />\n </SWCPageLayout>\n ),\n children: [\n { index: true, element: <CuratorDashboardContent /> },\n { path: 'edit/:taskId', element: <EditCurationTaskPage /> },\n ],\n },\n ],\n [],\n )\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routes, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n"],"mappings":";;;;;;;;AAyBA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,oBAAiB,uBAAuB,qBAAkB,OAChE,GAEI,IAAwB,QACtB,CACJ;EACE,MAAM;EACN,SACE,kBAAC,GAAD;GAAe,QAAQ,EAAE,OAAO,oBAAoB;aAApD,CACE,kBAAC,OAAD;IAAK,WAAU;IAAc,OAAO,EAAE,WAAW,OAAO;cACtD,kBAAC,GAAD,CAAS,CAAA;GACN,CAAA,GACL,kBAAC,GAAD,EAAmB,SAAQ,MAAY,EAAS,SAAW,CAAA,CAC9C;;EAEjB,UAAU,CACR;GAAE,OAAO;GAAM,SAAS,kBAAC,GAAD,CAA0B,CAAA;EAAE,GACpD;GAAE,MAAM;GAAgB,SAAS,kBAAC,GAAD,CAAuB,CAAA;EAAE,CAC5D;CACF,CACF,GACA,CAAC,CACH,GAEM,IAAS,QACT,IACK,EAAmB,GAAQ,EAChC,UAAU,EACZ,CAAC,IAEM,EAAoB,GAAQ,EACjC,UAAU,EACZ,CAAC,GAEF;EAAC;EAAiB;EAAQ;CAAc,CAAC;CAM5C,OAHS,EADL,IACM,IAGF,GAHC,EAAwB,UAAS,CAAA;AAI5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataTasksPageRouter.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPageRouter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAA;AAUlD,MAAM,MAAM,4BAA4B,GAAG,iBAAiB,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,2GAA2G;IAC3G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CA4CpC"}
1
+ {"version":3,"file":"MetadataTasksPageRouter.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPageRouter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAA;AAYlD,MAAM,MAAM,4BAA4B,GAAG,iBAAiB,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,2GAA2G;IAC3G,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CAkDpC"}