synapse-react-client 4.0.17 → 4.0.18

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 (225) hide show
  1. package/README.md +5 -3
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +1 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/assets/homepage/BlinkingLiveIcon.d.ts +1 -1
  6. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  7. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  8. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  9. package/dist/components/AccessRequirementList/RequirementItem/CertificationRequirement.js.map +1 -1
  10. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  11. package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
  12. package/dist/components/AccessRequirementList/RequirementItem/ValidationRequirement.js.map +1 -1
  13. package/dist/components/AccessTokenPage/CreateAccessTokenModal.d.ts.map +1 -1
  14. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +56 -54
  15. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  16. package/dist/components/Authentication/PasswordField.d.ts +1 -1
  17. package/dist/components/Authentication/PasswordField.d.ts.map +1 -1
  18. package/dist/components/Authentication/PasswordField.js.map +1 -1
  19. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  20. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +1 -2
  21. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  22. package/dist/components/Authentication/UsernamePasswordForm.d.ts.map +1 -1
  23. package/dist/components/Authentication/UsernamePasswordForm.js +32 -29
  24. package/dist/components/Authentication/UsernamePasswordForm.js.map +1 -1
  25. package/dist/components/CardContainer/CardLink.d.ts +2 -2
  26. package/dist/components/CardContainer/CardLink.d.ts.map +1 -1
  27. package/dist/components/CardDeck/CardDeckCardProps.d.ts.map +1 -1
  28. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  29. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.d.ts.map +1 -1
  30. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +106 -103
  31. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  32. package/dist/components/ChallengeTeamWizard/MembershipRequestForm.d.ts.map +1 -1
  33. package/dist/components/ChallengeTeamWizard/MembershipRequestForm.js.map +1 -1
  34. package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.d.ts.map +1 -1
  35. package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.js.map +1 -1
  36. package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
  37. package/dist/components/CreateProjectModal/CreateProjectModal.js +4 -4
  38. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  39. package/dist/components/CreateTableViewWizard/TableNameForm.js +6 -6
  40. package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
  41. package/dist/components/CrispChat/CrispChat.js +4 -4
  42. package/dist/components/CrispChat/CrispChat.js.map +1 -1
  43. package/dist/components/DataGrid/utils/json-rx/JsonRxResponseComplete.js.map +1 -1
  44. package/dist/components/DownloadCart/RequestDownloadCard.js +14 -14
  45. package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
  46. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  47. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  48. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
  49. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  50. package/dist/components/EntityCitation/EntityCitationUtils.js.map +1 -1
  51. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  52. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  53. package/dist/components/EntityFinder/EntityIdTextField.d.ts +17 -0
  54. package/dist/components/EntityFinder/EntityIdTextField.d.ts.map +1 -0
  55. package/dist/components/EntityFinder/EntityIdTextField.js +35 -0
  56. package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -0
  57. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.d.ts.map +1 -1
  58. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js +22 -16
  59. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js.map +1 -1
  60. package/dist/components/FeaturedDataTabs/FacetPlotsCardGrid.js.map +1 -1
  61. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  62. package/dist/components/FullWidthAlert/FullWidthAlert.d.ts.map +1 -1
  63. package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
  64. package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.d.ts.map +1 -1
  65. package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.js.map +1 -1
  66. package/dist/components/Markdown/widget/MarkdownSynapsePlot.js.map +1 -1
  67. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  68. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  69. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  70. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  71. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +1 -1
  72. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
  73. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +1 -1
  74. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
  75. package/dist/components/PortalList/CreatePortalModal.d.ts.map +1 -1
  76. package/dist/components/PortalList/CreatePortalModal.js +34 -33
  77. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  78. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  79. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  80. package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
  81. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  82. package/dist/components/Resources/Resources.Desktop.js.map +1 -1
  83. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  84. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.d.ts.map +1 -1
  85. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  86. package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.d.ts.map +1 -1
  87. package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js.map +1 -1
  88. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
  89. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  90. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  91. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
  92. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +1 -1
  93. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  94. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  95. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  96. package/dist/components/SynapseTable/SynapseTableUtils.d.ts.map +1 -1
  97. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  98. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  99. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  100. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.d.ts.map +1 -1
  101. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  102. package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
  103. package/dist/components/TextField/TextField.css +1 -1
  104. package/dist/components/TextField/TextField.d.ts +14 -3
  105. package/dist/components/TextField/TextField.d.ts.map +1 -1
  106. package/dist/components/TextField/TextField.js +41 -43
  107. package/dist/components/TextField/TextField.js.map +1 -1
  108. package/dist/components/TextField/TextField.module.js +3 -4
  109. package/dist/components/TextField/TextField.module.js.map +1 -1
  110. package/dist/components/TextField/TextField.module.scss +18 -10
  111. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.d.ts.map +1 -1
  112. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js +20 -16
  113. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  114. package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
  115. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  116. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Desktop.js.map +1 -1
  117. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  118. package/dist/components/UserSearchBox/UserSearchBox.d.ts.map +1 -1
  119. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  120. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  121. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  122. package/dist/components/doi/CreateOrUpdateDoiModal.js +13 -13
  123. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  124. package/dist/components/entity/page/title_bar/TitleBarProperties.js +23 -23
  125. package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +1 -1
  126. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  127. package/dist/components/index.js +17 -17
  128. package/dist/components/styled/StyledFormControl.d.ts +15 -0
  129. package/dist/components/styled/StyledFormControl.d.ts.map +1 -1
  130. package/dist/components/styled/StyledFormControl.js +1 -0
  131. package/dist/components/styled/StyledFormControl.js.map +1 -1
  132. package/dist/components/styled/index.js +3 -3
  133. package/dist/components/utils/ConditionalWrapper.d.ts.map +1 -1
  134. package/dist/components/utils/ConditionalWrapper.js.map +1 -1
  135. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  136. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  137. package/dist/components/widgets/facet-nav/FacetNavPanel.js +69 -62
  138. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  139. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +1 -0
  140. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  141. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +27 -26
  142. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  143. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts +1 -0
  144. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts.map +1 -1
  145. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js +2 -1
  146. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js.map +1 -1
  147. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
  148. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  149. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +44 -43
  150. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  151. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts +13 -0
  152. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -0
  153. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +398 -0
  154. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -0
  155. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  156. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -19
  157. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  158. package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
  159. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +46 -25
  160. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
  161. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts +0 -1
  162. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts.map +1 -1
  163. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js +20 -22
  164. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  165. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  166. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +25 -27
  167. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  168. package/dist/features/entity/metadata-task/utils/constants.d.ts +26 -0
  169. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  170. package/dist/features/entity/metadata-task/utils/constants.js +2 -2
  171. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  172. package/dist/index.js +17 -17
  173. package/dist/mockServiceWorker.js +6 -8
  174. package/dist/mocks/curation/mockCurationTask.d.ts +2 -2
  175. package/dist/mocks/curation/mockCurationTask.d.ts.map +1 -1
  176. package/dist/mocks/curation/mockCurationTask.js +9 -5
  177. package/dist/mocks/curation/mockCurationTask.js.map +1 -1
  178. package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts +1 -1
  179. package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts.map +1 -1
  180. package/dist/mocks/msw/handlers/featureFlagHandlers.js +1 -1
  181. package/dist/mocks/msw/handlers/featureFlagHandlers.js.map +1 -1
  182. package/dist/style/components/_cards.scss +0 -3
  183. package/dist/style/components/_data-grid-extra.scss +2 -2
  184. package/dist/style/components/_login.scss +6 -2
  185. package/dist/style/main.css +1 -1
  186. package/dist/synapse-client/SynapseClient.d.ts +2 -1
  187. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  188. package/dist/synapse-client/SynapseClient.js.map +1 -1
  189. package/dist/synapse-queries/QueryFilterUtils.js.map +1 -1
  190. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -0
  191. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  192. package/dist/synapse-queries/curation/task/useCurationTask.js +16 -6
  193. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  194. package/dist/synapse-queries/dataaccess/useAccessRequirements.d.ts.map +1 -1
  195. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  196. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  197. package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts +1 -1
  198. package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts.map +1 -1
  199. package/dist/synapse-queries/featureflags/useGetFeatureFlag.js.map +1 -1
  200. package/dist/synapse-queries/file/useFiles.d.ts.map +1 -1
  201. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  202. package/dist/synapse-queries/termsOfService/useTermsOfService.d.ts.map +1 -1
  203. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  204. package/dist/synapse-queries/user/useGetUserChallenges.d.ts.map +1 -1
  205. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  206. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  207. package/dist/theme/palette/Palettes.d.ts +2 -2
  208. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  209. package/dist/theme/palette/Palettes.js +2 -2
  210. package/dist/theme/palette/Palettes.js.map +1 -1
  211. package/dist/tsconfig.build.tsbuildinfo +1 -1
  212. package/dist/types/ThemeTypes.d.ts +5 -6
  213. package/dist/utils/AppUtils/session/SynapseSessionManager.d.ts.map +1 -1
  214. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  215. package/dist/utils/featureflag/FeatureFlags.d.ts +12 -0
  216. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -0
  217. package/dist/utils/featureflag/FeatureFlags.js +8 -0
  218. package/dist/utils/featureflag/FeatureFlags.js.map +1 -0
  219. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  220. package/dist/utils/functions/queryUtils.js.map +1 -1
  221. package/dist/utils/hooks/useGetInfoFromIds.d.ts.map +1 -1
  222. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  223. package/dist/utils/slots/SlotUtils.d.ts.map +1 -1
  224. package/dist/utils/slots/SlotUtils.js.map +1 -1
  225. package/package.json +7 -8
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![npm version](https://badge.fury.io/js/synapse-react-client.svg)](https://badge.fury.io/js/synapse-react-client)
2
- [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
2
+ [![code style: oxfmt](https://img.shields.io/badge/code_style-oxfmt-blue.svg?style=flat-square)](https://github.com/oxc-project/oxc)
3
3
 
4
4
  ## Synapse React Client
5
5
 
@@ -69,8 +69,10 @@ For a list of variables you can override, see [`src/style/abstracts/_variables.s
69
69
  Override the variables by importing the SCSS in your project like so:
70
70
 
71
71
  ```scss
72
- @use 'synapse-react-client/dist/style/main.scss' with ($primary-action-color:
73
- $-my-primary-color, $secondary-action-color: $-my-secondary-color, // ...any other overrides continue);
72
+ @use 'synapse-react-client/dist/style/main.scss' with (
73
+ $primary-action-color: $-my-primary-color,
74
+ $secondary-action-color: $-my-secondary-color // ...any other overrides continue
75
+ );
74
76
  @use 'synapse-react-client/dist/template_style/Index.scss';
75
77
  ```
76
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"SWC.index.d.ts","sourceRoot":"","sources":["../src/SWC.index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAEL,qBAAqB,EACtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAA;AACnD,OAAO,QAAQ,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC/B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAEL,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAGxD,OAAO,mBAAmB,CAAA;AAK1B,QAAA,MAAM,YAAY;;CAEjB,CAAA;AAED,QAAA,MAAM,cAAc;;;;;CAKnB,CAAA;AAED,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmMtB,CAAA;AAED,QAAA,MAAM,SAAS;;;;;;CAMd,CAAA;AAGD,QAAA,MAAM,yBAAyB,QAAkB,CAAA;AAEjD,OAAO,EACL,SAAS,EACT,UAAU,EACV,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,UAAU,EACV,qBAAqB,GACtB,CAAA"}
1
+ {"version":3,"file":"SWC.index.d.ts","sourceRoot":"","sources":["../src/SWC.index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAEL,qBAAqB,EACtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAA;AACnD,OAAO,QAAQ,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC/B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAEL,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAGxD,OAAO,mBAAmB,CAAA;AAK1B,QAAA,MAAM,YAAY;;CAEjB,CAAA;AAED,QAAA,MAAM,cAAc;;;;;CAKnB,CAAA;AAED,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2LtB,CAAA;AAED,QAAA,MAAM,SAAS;;;;;;CAMd,CAAA;AAGD,QAAA,MAAM,yBAAyB,QAAkB,CAAA;AAEjD,OAAO,EACL,SAAS,EACT,UAAU,EACV,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,UAAU,EACV,qBAAqB,GACtB,CAAA"}
package/dist/SWC.index.js CHANGED
@@ -110,7 +110,7 @@ var x = { BackendDestinationEnum: r }, S = {
110
110
  sendSearchResultsReturnedEvent: y,
111
111
  sendSearchResultReturnedEvent: v,
112
112
  sendSearchResultClickedEvent: _
113
- }, T = "4.0.17";
113
+ }, T = "4.0.18";
114
114
  //#endregion
115
115
  export { w as Analytics, a as HttpClient, d as Palettes, o as SynapseClient, C as SynapseComponents, n as SynapseConstants, S as SynapseContext, x as SynapseEnums, m as SynapseQueries, T as SynapseReactClientVersion, p as SynapseSessionManager, i as xssOptions };
116
116
 
@@ -1 +1 @@
1
- {"version":3,"file":"SWC.index.js","names":[],"sources":["../src/SWC.index.ts"],"sourcesContent":["/**\n * SWC.index.ts represents the entry point for the Synapse React Client library as it is published to NPM and\n * used by SynapseWebClient.\n *\n * If you wish to export a component or other object to be used by SynapseWebClient, you should add it to this file.\n */\n\nimport { lazy } from 'react'\nimport {\n displayToast,\n SynapseToastContainer,\n} from './components/ToastMessage/ToastMessage'\nimport SynapseClient, { HttpClient } from './synapse-client'\nimport * as SynapseQueries from './synapse-queries'\nimport Palettes from './theme/palette/Palettes'\nimport { SynapseConstants } from './utils'\nimport { sendAnalyticsEvent } from './utils/analytics/sendAnalyticsEvent'\nimport {\n sendSearchQuerySubmittedEvent,\n sendSearchResultClickedEvent,\n sendSearchResultReturnedEvent,\n sendSearchResultsReturnedEvent,\n} from './utils/analytics/sendSearchEvent'\nimport { FullContextProvider } from './utils/context/FullContextProvider'\nimport {\n SynapseContextConsumer,\n SynapseContextProvider,\n useSynapseContext,\n} from './utils/context/SynapseContext'\nimport { BackendDestinationEnum } from './utils/functions'\nimport { xssOptions } from './utils/functions/SanitizeHtmlUtils'\nimport { getCurrentCookiePreferences } from './utils/hooks'\nimport { SynapseSessionManager } from './utils/AppUtils'\n\n// Also include scss in the bundle\nimport './style/main.scss'\n\n// Injected at build time by Vite's `define`\ndeclare const __SRC_VERSION__: string\n\nconst SynapseEnums = {\n BackendDestinationEnum,\n}\n\nconst SynapseContext = {\n FullContextProvider,\n SynapseContextProvider,\n SynapseContextConsumer,\n useSynapseContext,\n}\n\nconst SynapseComponents = {\n AccessRequirementAclEditor: lazy(\n () => import('./components/AccessRequirementAclEditor'),\n ),\n AccessRequirementList: lazy(\n () => import('./components/AccessRequirementList/AccessRequirementList'),\n ),\n AccessRequirementRelatedProjectsList: lazy(\n () => import('./components/AccessRequirementRelatedProjectsList'),\n ),\n AccountLevelBadges: lazy(\n () => import('./components/AccountLevelBadges/AccountLevelBadges'),\n ),\n AddToDownloadListConfirmationAlert: lazy(\n () =>\n import(\n './components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\n ),\n ),\n AvailableEvaluationQueueList: lazy(\n () =>\n import('./components/ChallengeSubmission/AvailableEvaluationQueueList'),\n ),\n CertificationQuiz: lazy(\n () => import('./components/CertificationQuiz/CertificationQuiz'),\n ),\n CookiesNotification: lazy(() => import('./components/CookiesNotification')),\n CreateOrUpdateAccessRequirementWizard: lazy(\n () => import('./components/CreateOrUpdateAccessRequirementWizard'),\n ),\n CreateOrUpdateDoiModal: lazy(\n () => import('./components/doi/CreateOrUpdateDoiModal'),\n ),\n CreateTableViewWizard: lazy(\n () => import('./components/CreateTableViewWizard/CreateTableViewWizard'),\n ),\n CreatedByModifiedBy: lazy(\n () => import('./components/entity/page/CreatedByModifiedBy'),\n ),\n CsvPreview: lazy(() => import('./components/table/CsvPreview/CsvPreview')),\n CuratorDashboard: lazy(\n () => import('./features/curator/dashboard/CuratorDashboard'),\n ),\n DatasetItemsEditor: lazy(\n () => import('./components/SynapseTable/datasets/DatasetItemsEditor'),\n ),\n DiscussionThread: lazy(() => import('./components/Forum/DiscussionThread')),\n DownloadCartPage: lazy(\n () => import('./components/DownloadCart/DownloadCartPage'),\n ),\n EntityAclEditorModal: lazy(\n () => import('./components/EntityAclEditor/EntityAclEditorModal'),\n ),\n EntityActionMenu: lazy(\n () => import('./components/entity/page/action_menu/EntityActionMenu'),\n ),\n EntityBadgeIcons: lazy(\n () => import('./components/EntityBadgeIcons/EntityBadgeIcons'),\n ),\n EntityCitation: lazy(() => import('./components/EntityCitation')),\n EntityFinder: lazy(() => import('./components/EntityFinder/EntityFinder')),\n EntityForm: lazy(() => import('./components/EntityForm/EntityForm')),\n EntityHeaderTable: lazy(() => import('./components/EntityHeaderTable')),\n EntityModal: lazy(() => import('./components/entity/metadata/EntityModal')),\n EntityPageBreadcrumbs: lazy(\n () => import('./components/entity/page/breadcrumbs/EntityPageBreadcrumbs'),\n ),\n EntityPageTitleBar: lazy(\n () => import('./components/entity/page/title_bar/EntityPageTitleBar'),\n ),\n EntityTreeTable: lazy(\n () => import('./components/EntityTreeTable/EntityTreeTable'),\n ),\n EntityTypeIcon: lazy(() => import('./components/EntityIcon')),\n EntityUploadModal: lazy(\n () => import('./components/EntityUpload/EntityUploadModal'),\n ),\n EntityViewScopeEditorModal: lazy(\n () =>\n import('./components/EntityViewScopeEditor/EntityViewScopeEditorModal'),\n ),\n CreateProjectModal: lazy(() =>\n import('./components/CreateProjectModal/CreateProjectModal').then(m => ({\n default: m.CreateProjectModal,\n })),\n ),\n ErrorPage: lazy(() => import('./components/error/ErrorPage')),\n EvaluationCard: lazy(() => import('./components/Evaluation/EvaluationCard')),\n EvaluationEditorPage: lazy(\n () => import('./components/Evaluation/EvaluationEditorPage'),\n ),\n FavoritesPage: lazy(() => import('./components/favorites/FavoritesPage')),\n ForumSearch: lazy(() => import('./components/ForumSearch/ForumSearch')),\n FullWidthAlert: lazy(\n () => import('./components/FullWidthAlert/FullWidthAlert'),\n ),\n GoogleAnalytics: lazy(\n () => import('./components/GoogleAnalytics/GoogleAnalytics'),\n ),\n GovernanceMarkdownGithub: lazy(\n () => import('./components/Markdown/GovernanceMarkdownGithub'),\n ),\n GridPage: lazy(() => import('./features/curator/GridPage/GridPage')),\n HasAccess: lazy(() => import('./components/HasAccess/HasAccessV2')),\n HelpPopover: lazy(() => import('./components/HelpPopover/HelpPopover')),\n HtmlPreview: lazy(\n () => import('./components/FilePreview/HtmlPreview/HtmlPreview'),\n ),\n IDUReport: lazy(() => import('./components/IDUReport/IDUReport')),\n IconSvg: lazy(() => import('./components/IconSvg/IconSvg')),\n MetadataTasksPage: lazy(\n () =>\n import('./features/entity/metadata-task/components/MetadataTasksPage'),\n ),\n OAuthManagement: lazy(\n () => import('./components/OAuthClientManagement/OAuthManagement'),\n ),\n OrientationBanner: lazy(\n () => import('./components/OrientationBanner/OrientationBanner'),\n ),\n PageProgress: lazy(() => import('./components/PageProgress/PageProgress')),\n ProjectDataAvailability: lazy(\n () => import('./components/ProjectStorage/ProjectDataAvailability'),\n ),\n ProvenanceGraph: lazy(\n () => import('./components/ProvenanceGraph/ProvenanceGraph'),\n ),\n QueryWrapperPlotNav: lazy(\n () => import('./components/QueryWrapperPlotNav/QueryWrapperPlotNav'),\n ),\n RejectProfileValidationRequestModal: lazy(\n () => import('./components/dataaccess/RejectProfileValidationRequestModal'),\n ),\n ReviewerDashboard: lazy(\n () => import('./components/dataaccess/ReviewerDashboard'),\n ),\n SearchQueryWrapperPlotNav: lazy(\n () =>\n import(\n './components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav'\n ),\n ),\n ShareThisPage: lazy(() => import('./components/ShareThisPage')),\n SkeletonButton: lazy(() => import('./components/Skeleton/SkeletonButton')),\n SqlDefinedTableEditorModal: lazy(\n () =>\n import('./components/SqlDefinedTableEditor/SqlDefinedTableEditorModal'),\n ),\n StandaloneQueryWrapper: lazy(\n () => import('./components/StandaloneQueryWrapper/StandaloneQueryWrapper'),\n ),\n StatisticsPlot: lazy(() => import('./components/StatisticsPlot')),\n SubmissionViewScopeEditorModal: lazy(\n () =>\n import(\n './components/SubmissionViewScopeEditor/SubmissionViewScopeEditorModal'\n ),\n ),\n SubscriptionPage: lazy(() => import('./components/SubscriptionPage')),\n SynapseChat: lazy(() => import('./components/SynapseChat/SynapseChat')),\n SynapseGrid: lazy(() => import('./components/DataGrid/SynapseGrid')),\n SynapseFooter: lazy(() => import('./components/SynapseFooter/SynapseFooter')),\n SynapseHomepageV2: lazy(\n () => import('./components/SynapseHomepageV2/SynapseHomepageV2'),\n ),\n SynapseNavDrawer: lazy(\n () => import('./components/SynapseNavDrawer/SynapseNavDrawer'),\n ),\n SynapsePlansPage: lazy(\n () => import('./components/SynapseHomepageV2/SynapsePlansPage'),\n ),\n SynapsePortalBanners: lazy(\n () => import('./components/SynapsePortalBanners/SynapsePortalBanners'),\n ),\n SynapseSearchPage: lazy(\n () => import('./components/SynapseSearchPageResults/SynapseSearchPage'),\n ),\n SynapseToastContainer,\n TableColumnSchemaEditor: lazy(\n () =>\n import('./components/TableColumnSchemaEditor/TableColumnSchemaEditor'),\n ),\n TrashCanList: lazy(() => import('./components/trash/TrashCanList')),\n UserAccessRequestHistoryPlace: lazy(\n () =>\n import(\n './components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace'\n ),\n ),\n UserCard: lazy(() => import('./components/UserCard/UserCard')),\n UserProfileLinks: lazy(\n () => import('./components/UserProfileLinks/UserProfileLinks'),\n ),\n displayToast,\n getCurrentCookiePreferences,\n}\n\nconst Analytics = {\n sendAnalyticsEvent,\n sendSearchQuerySubmittedEvent,\n sendSearchResultsReturnedEvent,\n sendSearchResultReturnedEvent,\n sendSearchResultClickedEvent,\n}\n\n// Include the version in the build\nconst SynapseReactClientVersion = __SRC_VERSION__\n\nexport {\n Analytics,\n HttpClient,\n SynapseReactClientVersion,\n SynapseComponents,\n SynapseConstants,\n SynapseClient,\n SynapseContext,\n SynapseEnums,\n SynapseQueries,\n Palettes,\n xssOptions,\n SynapseSessionManager,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SWC.index.js","names":[],"sources":["../src/SWC.index.ts"],"sourcesContent":["/**\n * SWC.index.ts represents the entry point for the Synapse React Client library as it is published to NPM and\n * used by SynapseWebClient.\n *\n * If you wish to export a component or other object to be used by SynapseWebClient, you should add it to this file.\n */\n\nimport { lazy } from 'react'\nimport {\n displayToast,\n SynapseToastContainer,\n} from './components/ToastMessage/ToastMessage'\nimport SynapseClient, { HttpClient } from './synapse-client'\nimport * as SynapseQueries from './synapse-queries'\nimport Palettes from './theme/palette/Palettes'\nimport { SynapseConstants } from './utils'\nimport { sendAnalyticsEvent } from './utils/analytics/sendAnalyticsEvent'\nimport {\n sendSearchQuerySubmittedEvent,\n sendSearchResultClickedEvent,\n sendSearchResultReturnedEvent,\n sendSearchResultsReturnedEvent,\n} from './utils/analytics/sendSearchEvent'\nimport { FullContextProvider } from './utils/context/FullContextProvider'\nimport {\n SynapseContextConsumer,\n SynapseContextProvider,\n useSynapseContext,\n} from './utils/context/SynapseContext'\nimport { BackendDestinationEnum } from './utils/functions'\nimport { xssOptions } from './utils/functions/SanitizeHtmlUtils'\nimport { getCurrentCookiePreferences } from './utils/hooks'\nimport { SynapseSessionManager } from './utils/AppUtils'\n\n// Also include scss in the bundle\nimport './style/main.scss'\n\n// Injected at build time by Vite's `define`\ndeclare const __SRC_VERSION__: string\n\nconst SynapseEnums = {\n BackendDestinationEnum,\n}\n\nconst SynapseContext = {\n FullContextProvider,\n SynapseContextProvider,\n SynapseContextConsumer,\n useSynapseContext,\n}\n\nconst SynapseComponents = {\n AccessRequirementAclEditor: lazy(\n () => import('./components/AccessRequirementAclEditor'),\n ),\n AccessRequirementList: lazy(\n () => import('./components/AccessRequirementList/AccessRequirementList'),\n ),\n AccessRequirementRelatedProjectsList: lazy(\n () => import('./components/AccessRequirementRelatedProjectsList'),\n ),\n AccountLevelBadges: lazy(\n () => import('./components/AccountLevelBadges/AccountLevelBadges'),\n ),\n AddToDownloadListConfirmationAlert: lazy(\n () =>\n import('./components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'),\n ),\n AvailableEvaluationQueueList: lazy(\n () =>\n import('./components/ChallengeSubmission/AvailableEvaluationQueueList'),\n ),\n CertificationQuiz: lazy(\n () => import('./components/CertificationQuiz/CertificationQuiz'),\n ),\n CookiesNotification: lazy(() => import('./components/CookiesNotification')),\n CreateOrUpdateAccessRequirementWizard: lazy(\n () => import('./components/CreateOrUpdateAccessRequirementWizard'),\n ),\n CreateOrUpdateDoiModal: lazy(\n () => import('./components/doi/CreateOrUpdateDoiModal'),\n ),\n CreateTableViewWizard: lazy(\n () => import('./components/CreateTableViewWizard/CreateTableViewWizard'),\n ),\n CreatedByModifiedBy: lazy(\n () => import('./components/entity/page/CreatedByModifiedBy'),\n ),\n CsvPreview: lazy(() => import('./components/table/CsvPreview/CsvPreview')),\n CuratorDashboard: lazy(\n () => import('./features/curator/dashboard/CuratorDashboard'),\n ),\n DatasetItemsEditor: lazy(\n () => import('./components/SynapseTable/datasets/DatasetItemsEditor'),\n ),\n DiscussionThread: lazy(() => import('./components/Forum/DiscussionThread')),\n DownloadCartPage: lazy(\n () => import('./components/DownloadCart/DownloadCartPage'),\n ),\n EntityAclEditorModal: lazy(\n () => import('./components/EntityAclEditor/EntityAclEditorModal'),\n ),\n EntityActionMenu: lazy(\n () => import('./components/entity/page/action_menu/EntityActionMenu'),\n ),\n EntityBadgeIcons: lazy(\n () => import('./components/EntityBadgeIcons/EntityBadgeIcons'),\n ),\n EntityCitation: lazy(() => import('./components/EntityCitation')),\n EntityFinder: lazy(() => import('./components/EntityFinder/EntityFinder')),\n EntityForm: lazy(() => import('./components/EntityForm/EntityForm')),\n EntityHeaderTable: lazy(() => import('./components/EntityHeaderTable')),\n EntityModal: lazy(() => import('./components/entity/metadata/EntityModal')),\n EntityPageBreadcrumbs: lazy(\n () => import('./components/entity/page/breadcrumbs/EntityPageBreadcrumbs'),\n ),\n EntityPageTitleBar: lazy(\n () => import('./components/entity/page/title_bar/EntityPageTitleBar'),\n ),\n EntityTreeTable: lazy(\n () => import('./components/EntityTreeTable/EntityTreeTable'),\n ),\n EntityTypeIcon: lazy(() => import('./components/EntityIcon')),\n EntityUploadModal: lazy(\n () => import('./components/EntityUpload/EntityUploadModal'),\n ),\n EntityViewScopeEditorModal: lazy(\n () =>\n import('./components/EntityViewScopeEditor/EntityViewScopeEditorModal'),\n ),\n CreateProjectModal: lazy(() =>\n import('./components/CreateProjectModal/CreateProjectModal').then(m => ({\n default: m.CreateProjectModal,\n })),\n ),\n ErrorPage: lazy(() => import('./components/error/ErrorPage')),\n EvaluationCard: lazy(() => import('./components/Evaluation/EvaluationCard')),\n EvaluationEditorPage: lazy(\n () => import('./components/Evaluation/EvaluationEditorPage'),\n ),\n FavoritesPage: lazy(() => import('./components/favorites/FavoritesPage')),\n ForumSearch: lazy(() => import('./components/ForumSearch/ForumSearch')),\n FullWidthAlert: lazy(\n () => import('./components/FullWidthAlert/FullWidthAlert'),\n ),\n GoogleAnalytics: lazy(\n () => import('./components/GoogleAnalytics/GoogleAnalytics'),\n ),\n GovernanceMarkdownGithub: lazy(\n () => import('./components/Markdown/GovernanceMarkdownGithub'),\n ),\n GridPage: lazy(() => import('./features/curator/GridPage/GridPage')),\n HasAccess: lazy(() => import('./components/HasAccess/HasAccessV2')),\n HelpPopover: lazy(() => import('./components/HelpPopover/HelpPopover')),\n HtmlPreview: lazy(\n () => import('./components/FilePreview/HtmlPreview/HtmlPreview'),\n ),\n IDUReport: lazy(() => import('./components/IDUReport/IDUReport')),\n IconSvg: lazy(() => import('./components/IconSvg/IconSvg')),\n MetadataTasksPage: lazy(\n () =>\n import('./features/entity/metadata-task/components/MetadataTasksPage'),\n ),\n OAuthManagement: lazy(\n () => import('./components/OAuthClientManagement/OAuthManagement'),\n ),\n OrientationBanner: lazy(\n () => import('./components/OrientationBanner/OrientationBanner'),\n ),\n PageProgress: lazy(() => import('./components/PageProgress/PageProgress')),\n ProjectDataAvailability: lazy(\n () => import('./components/ProjectStorage/ProjectDataAvailability'),\n ),\n ProvenanceGraph: lazy(\n () => import('./components/ProvenanceGraph/ProvenanceGraph'),\n ),\n QueryWrapperPlotNav: lazy(\n () => import('./components/QueryWrapperPlotNav/QueryWrapperPlotNav'),\n ),\n RejectProfileValidationRequestModal: lazy(\n () => import('./components/dataaccess/RejectProfileValidationRequestModal'),\n ),\n ReviewerDashboard: lazy(\n () => import('./components/dataaccess/ReviewerDashboard'),\n ),\n SearchQueryWrapperPlotNav: lazy(\n () =>\n import('./components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav'),\n ),\n ShareThisPage: lazy(() => import('./components/ShareThisPage')),\n SkeletonButton: lazy(() => import('./components/Skeleton/SkeletonButton')),\n SqlDefinedTableEditorModal: lazy(\n () =>\n import('./components/SqlDefinedTableEditor/SqlDefinedTableEditorModal'),\n ),\n StandaloneQueryWrapper: lazy(\n () => import('./components/StandaloneQueryWrapper/StandaloneQueryWrapper'),\n ),\n StatisticsPlot: lazy(() => import('./components/StatisticsPlot')),\n SubmissionViewScopeEditorModal: lazy(\n () =>\n import('./components/SubmissionViewScopeEditor/SubmissionViewScopeEditorModal'),\n ),\n SubscriptionPage: lazy(() => import('./components/SubscriptionPage')),\n SynapseChat: lazy(() => import('./components/SynapseChat/SynapseChat')),\n SynapseGrid: lazy(() => import('./components/DataGrid/SynapseGrid')),\n SynapseFooter: lazy(() => import('./components/SynapseFooter/SynapseFooter')),\n SynapseHomepageV2: lazy(\n () => import('./components/SynapseHomepageV2/SynapseHomepageV2'),\n ),\n SynapseNavDrawer: lazy(\n () => import('./components/SynapseNavDrawer/SynapseNavDrawer'),\n ),\n SynapsePlansPage: lazy(\n () => import('./components/SynapseHomepageV2/SynapsePlansPage'),\n ),\n SynapsePortalBanners: lazy(\n () => import('./components/SynapsePortalBanners/SynapsePortalBanners'),\n ),\n SynapseSearchPage: lazy(\n () => import('./components/SynapseSearchPageResults/SynapseSearchPage'),\n ),\n SynapseToastContainer,\n TableColumnSchemaEditor: lazy(\n () =>\n import('./components/TableColumnSchemaEditor/TableColumnSchemaEditor'),\n ),\n TrashCanList: lazy(() => import('./components/trash/TrashCanList')),\n UserAccessRequestHistoryPlace: lazy(\n () =>\n import('./components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace'),\n ),\n UserCard: lazy(() => import('./components/UserCard/UserCard')),\n UserProfileLinks: lazy(\n () => import('./components/UserProfileLinks/UserProfileLinks'),\n ),\n displayToast,\n getCurrentCookiePreferences,\n}\n\nconst Analytics = {\n sendAnalyticsEvent,\n sendSearchQuerySubmittedEvent,\n sendSearchResultsReturnedEvent,\n sendSearchResultReturnedEvent,\n sendSearchResultClickedEvent,\n}\n\n// Include the version in the build\nconst SynapseReactClientVersion = __SRC_VERSION__\n\nexport {\n Analytics,\n HttpClient,\n SynapseReactClientVersion,\n SynapseComponents,\n SynapseConstants,\n SynapseClient,\n SynapseContext,\n SynapseEnums,\n SynapseQueries,\n Palettes,\n xssOptions,\n SynapseSessionManager,\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { SvgIconProps } from '@mui/material/SvgIcon';
3
3
  export declare const LiveIcon: (props: SvgIconProps) => React.ReactNode;
4
- export declare const BlinkingLiveIcon: import("@emotion/styled").StyledComponent<import("@mui/material").SvgIconOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<React.SVGProps<SVGSVGElement>, "color" | "fontSize" | "shapeRendering" | "sx" | "classes" | "className" | "style" | "children" | "htmlColor" | "inheritViewBox" | "titleAccess" | "viewBox"> & {
4
+ export declare const BlinkingLiveIcon: import("@emotion/styled").StyledComponent<import("@mui/material").SvgIconOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<React.SVGProps<SVGSVGElement>, "color" | "fontSize" | "shapeRendering" | "sx" | "classes" | "className" | "style" | "children" | "viewBox" | "htmlColor" | "inheritViewBox" | "titleAccess"> & {
5
5
  component?: React.ElementType;
6
6
  } & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
7
7
  export default BlinkingLiveIcon;
@@ -1 +1 @@
1
- {"version":3,"file":"AccessRequirementAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/AccessRequirementAclEditor/AccessRequirementAclEditor.tsx"],"names":[],"mappings":"AA8BA,eAAO,MAAM,+BAA+B,yCACJ,CAAA;AAQxC,MAAM,MAAM,gCAAgC,GAAG;IAE7C,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,MAAM,CAAA;IAE3B,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,0BAA0B,8IAmLtC,CAAA"}
1
+ {"version":3,"file":"AccessRequirementAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/AccessRequirementAclEditor/AccessRequirementAclEditor.tsx"],"names":[],"mappings":"AA8BA,eAAO,MAAM,+BAA+B,yCACJ,CAAA;AAQxC,MAAM,MAAM,gCAAgC,GAAG;IAE7C,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,MAAM,CAAA;IAE3B,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,0BAA0B,8IA4KtC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccessRequirementAclEditor.js","names":[],"sources":["../../../src/components/AccessRequirementAclEditor/AccessRequirementAclEditor.tsx"],"sourcesContent":["import {\n useCreateAccessRequirementACL,\n useDeleteAccessRequirementACL,\n useGetAccessRequirementACL,\n useUpdateAccessRequirementACL,\n} from '@/synapse-queries'\nimport { spreadSx } from '@/theme/spreadSx'\nimport { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Box, Stack, Typography } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { ACCESS_TYPE, AccessControlList } from '@sage-bionetworks/synapse-types'\nimport { consolidateResourceAccessList } from '@/utils/functions/AccessControlListUtils'\nimport { isEqual } from 'lodash-es'\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { AclEditor } from '../AclEditor/AclEditor'\nimport useUpdateAcl from '../AclEditor/useUpdateAcl'\n\nconst textSx = {\n variant: 'body1',\n lineHeight: '20px',\n color: 'grey.800',\n}\n\nexport const EMPTY_RESOURCE_ACCESS_LIST_TEXT =\n 'Only ACT has permissions on this AR.'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_REVIEW_SUBMISSIONS',\n 'IS_EXEMPTION_ELIGIBLE',\n 'CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE',\n]\n\nexport type AccessRequirementAclEditorHandle = {\n /* Allow the parent component to trigger saving the ACL, so this may be embedded in an arbitrary modal. */\n save: () => void\n}\n\nexport type AccessRequirementAclEditorProps = {\n accessRequirementId: string\n /* Called when ACL has been saved or an error has been returned */\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const AccessRequirementAclEditor = forwardRef(\n function AccessRequirementAclEditor(\n props: AccessRequirementAclEditorProps,\n ref: ForwardedRef<AccessRequirementAclEditorHandle>,\n ) {\n const { accessRequirementId, onSaveComplete } = props\n const [error, setError] = useState<string | null>(null)\n\n const onMutationSuccess = () => {\n setError(null)\n onSaveComplete(true)\n }\n\n const onMutationError = (error: SynapseClientError) => {\n setError(error.reason)\n onSaveComplete(false)\n }\n\n const { data: originalAcl, isLoading: isLoadingOriginalAcl } =\n useGetAccessRequirementACL(accessRequirementId, {\n // Infinite staleTime ensures this won't get re-fetched unless explicitly invalidated by the mutation\n staleTime: Infinity,\n })\n\n const consolidatedOriginalResourceAccess = useMemo(\n () => consolidateResourceAccessList(originalAcl?.resourceAccess ?? []),\n [originalAcl],\n )\n\n const {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n } = useUpdateAcl({\n onChange: () => setError(null),\n onError: setError,\n })\n\n // set resourceAccessList when the fetched acl changes\n useEffect(() => {\n if (originalAcl) {\n resetDirtyState()\n setResourceAccessList(consolidatedOriginalResourceAccess)\n }\n }, [\n originalAcl,\n consolidatedOriginalResourceAccess,\n resetDirtyState,\n setResourceAccessList,\n ])\n\n const { mutate: deleteAcl } = useDeleteAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n const { mutate: createAcl } = useCreateAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n const { mutate: updateAcl } = useUpdateAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n useImperativeHandle(\n ref,\n () => {\n return {\n save() {\n const updatedAcl: AccessControlList | null =\n resourceAccessList.length === 0\n ? null\n : {\n ...originalAcl,\n id: originalAcl?.id || accessRequirementId,\n resourceAccess: resourceAccessList,\n }\n const aclIsUnchanged =\n (originalAcl === null && updatedAcl == null) ||\n // ignore properties that will change when the ACL is saved (etag, modifiedOn)\n (isEqual(\n consolidatedOriginalResourceAccess,\n resourceAccessList,\n ) &&\n originalAcl?.id === updatedAcl?.id)\n\n if (aclIsUnchanged) {\n // noop\n onSaveComplete(true)\n } else if (originalAcl === null && updatedAcl !== null) {\n createAcl(updatedAcl)\n } else if (updatedAcl === null) {\n deleteAcl(accessRequirementId)\n } else {\n updateAcl(updatedAcl)\n }\n },\n }\n },\n [\n accessRequirementId,\n originalAcl,\n resourceAccessList,\n createAcl,\n deleteAcl,\n onSaveComplete,\n updateAcl,\n ],\n )\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Guide to AR permissions\n </Typography>\n <Typography\n sx={spreadSx(\n {\n mb: '10px',\n },\n textSx,\n )}\n >\n <span style={{ fontStyle: 'italic' }}>Can Review</span> means a user\n or team has access request review permission for this AR.\n </Typography>\n <Typography\n sx={spreadSx(\n {\n mb: '10px',\n },\n textSx,\n )}\n >\n <span style={{ fontStyle: 'italic' }}>Exempt Eligible</span> users\n and teams can bypass access requirements for entities they have been\n granted &quot;edit and delete&quot; permission on, via the\n &quot;Sharing Settings&quot; dialog in the Project Settings.\n </Typography>\n <Typography sx={{ ...textSx, color: 'grey.900' }}>\n ACT members always retain the ability to review or modify Access\n Requirements.\n </Typography>\n </Box>\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={EMPTY_RESOURCE_ACCESS_LIST_TEXT}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(id, [ACCESS_TYPE.REVIEW_SUBMISSIONS])\n }\n updateResourceAccessItem={updateResourceAccessItem}\n removeResourceAccessItem={removeResourceAccessItem}\n showAddRemovePublicButton={false}\n showNotifyCheckbox={false}\n isInherited={false}\n />\n {error && <Alert severity=\"error\">{error}</Alert>}\n </Stack>\n )\n },\n)\n"],"mappings":";;;;;;;;;;;;AAwBA,IAAM,IAAS;CACb,SAAS;CACT,YAAY;CACZ,OAAO;CACR,EAEY,IACX,wCAEI,IAA+C;CACnD;CACA;CACA;CACD,EAaY,IAA6B,EACxC,SACE,GACA,GACA;CACA,IAAM,EAAE,wBAAqB,sBAAmB,GAC1C,CAAC,GAAO,KAAY,EAAwB,KAAK,EAEjD,UAA0B;AAE9B,EADA,EAAS,KAAK,EACd,EAAe,GAAK;IAGhB,KAAmB,MAA8B;AAErD,EADA,EAAS,EAAM,OAAO,EACtB,EAAe,GAAM;IAGjB,EAAE,MAAM,GAAa,WAAW,MACpC,EAA2B,GAAqB,EAE9C,WAAW,UACZ,CAAC,EAEE,IAAqC,QACnC,EAA8B,GAAa,kBAAkB,EAAE,CAAC,EACtE,CAAC,EAAY,CACd,EAEK,EACJ,uBACA,0BACA,0BACA,6BACA,6BACA,uBACE,EAAa;EACf,gBAAgB,EAAS,KAAK;EAC9B,SAAS;EACV,CAAC;AAGF,SAAgB;AACd,EAAI,MACF,GAAiB,EACjB,EAAsB,EAAmC;IAE1D;EACD;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC,EAEI,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC,EAEI,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC;AAgDF,QA9CA,EACE,UAES,EACL,OAAO;EACL,IAAM,IACJ,EAAmB,WAAW,IAC1B,OACA;GACE,GAAG;GACH,IAAI,GAAa,MAAM;GACvB,gBAAgB;GACjB;AAUP,EARG,MAAgB,QAAQ,KAAc,QAEtC,EACC,GACA,EACD,IACC,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GACX,MAAgB,QAAQ,MAAe,OAChD,EAAU,EAAW,GACZ,MAAe,OACxB,EAAU,EAAoB,GAE9B,EAAU,EAAW;IAG1B,GAEH;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAGC,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH;GAME,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,SAAQ;KACR,IAAI,EACF,IAAI,QACL;eACF;KAEY,CAAA;IACb,kBAAC,GAAD;KACE,IAAI,EACF,EACE,IAAI,QACL,EACD,EACD;eANH,CAQE,kBAAC,QAAD;MAAM,OAAO,EAAE,WAAW,UAAU;gBAAE;MAAiB,CAAA,EAAA,0EAE5C;;IACb,kBAAC,GAAD;KACE,IAAI,EACF,EACE,IAAI,QACL,EACD,EACD;eANH,CAQE,kBAAC,QAAD;MAAM,OAAO,EAAE,WAAW,UAAU;gBAAE;MAAsB,CAAA,EAAA,sLAIjD;;IACb,kBAAC,GAAD;KAAY,IAAI;MAAE,GAAG;MAAQ,OAAO;MAAY;eAAE;KAGrC,CAAA;IACT,EAAA,CAAA;GACN,kBAAC,GAAD;IACsB;IACO;IAC3B,WAAW;IACX,SAAS;IACT,WAAW;IACX,sBAAqB,MACnB,EAAsB,GAAI,CAAC,EAAY,mBAAmB,CAAC;IAEnC;IACA;IAC1B,2BAA2B;IAC3B,oBAAoB;IACpB,aAAa;IACb,CAAA;GACD,KAAS,kBAAC,GAAD;IAAO,UAAS;cAAS;IAAc,CAAA;GAC3C;;EAGb"}
1
+ {"version":3,"file":"AccessRequirementAclEditor.js","names":[],"sources":["../../../src/components/AccessRequirementAclEditor/AccessRequirementAclEditor.tsx"],"sourcesContent":["import {\n useCreateAccessRequirementACL,\n useDeleteAccessRequirementACL,\n useGetAccessRequirementACL,\n useUpdateAccessRequirementACL,\n} from '@/synapse-queries'\nimport { spreadSx } from '@/theme/spreadSx'\nimport { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Box, Stack, Typography } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { ACCESS_TYPE, AccessControlList } from '@sage-bionetworks/synapse-types'\nimport { consolidateResourceAccessList } from '@/utils/functions/AccessControlListUtils'\nimport { isEqual } from 'lodash-es'\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { AclEditor } from '../AclEditor/AclEditor'\nimport useUpdateAcl from '../AclEditor/useUpdateAcl'\n\nconst textSx = {\n variant: 'body1',\n lineHeight: '20px',\n color: 'grey.800',\n}\n\nexport const EMPTY_RESOURCE_ACCESS_LIST_TEXT =\n 'Only ACT has permissions on this AR.'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_REVIEW_SUBMISSIONS',\n 'IS_EXEMPTION_ELIGIBLE',\n 'CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE',\n]\n\nexport type AccessRequirementAclEditorHandle = {\n /* Allow the parent component to trigger saving the ACL, so this may be embedded in an arbitrary modal. */\n save: () => void\n}\n\nexport type AccessRequirementAclEditorProps = {\n accessRequirementId: string\n /* Called when ACL has been saved or an error has been returned */\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const AccessRequirementAclEditor = forwardRef(\n function AccessRequirementAclEditor(\n props: AccessRequirementAclEditorProps,\n ref: ForwardedRef<AccessRequirementAclEditorHandle>,\n ) {\n const { accessRequirementId, onSaveComplete } = props\n const [error, setError] = useState<string | null>(null)\n\n const onMutationSuccess = () => {\n setError(null)\n onSaveComplete(true)\n }\n\n const onMutationError = (error: SynapseClientError) => {\n setError(error.reason)\n onSaveComplete(false)\n }\n\n const { data: originalAcl, isLoading: isLoadingOriginalAcl } =\n useGetAccessRequirementACL(accessRequirementId, {\n // Infinite staleTime ensures this won't get re-fetched unless explicitly invalidated by the mutation\n staleTime: Infinity,\n })\n\n const consolidatedOriginalResourceAccess = useMemo(\n () => consolidateResourceAccessList(originalAcl?.resourceAccess ?? []),\n [originalAcl],\n )\n\n const {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n } = useUpdateAcl({\n onChange: () => setError(null),\n onError: setError,\n })\n\n // set resourceAccessList when the fetched acl changes\n useEffect(() => {\n if (originalAcl) {\n resetDirtyState()\n setResourceAccessList(consolidatedOriginalResourceAccess)\n }\n }, [\n originalAcl,\n consolidatedOriginalResourceAccess,\n resetDirtyState,\n setResourceAccessList,\n ])\n\n const { mutate: deleteAcl } = useDeleteAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n const { mutate: createAcl } = useCreateAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n const { mutate: updateAcl } = useUpdateAccessRequirementACL({\n onSuccess: () => onMutationSuccess(),\n onError: error => onMutationError(error),\n })\n\n useImperativeHandle(ref, () => {\n return {\n save() {\n const updatedAcl: AccessControlList | null =\n resourceAccessList.length === 0\n ? null\n : {\n ...originalAcl,\n id: originalAcl?.id || accessRequirementId,\n resourceAccess: resourceAccessList,\n }\n const aclIsUnchanged =\n (originalAcl === null && updatedAcl == null) ||\n // ignore properties that will change when the ACL is saved (etag, modifiedOn)\n (isEqual(consolidatedOriginalResourceAccess, resourceAccessList) &&\n originalAcl?.id === updatedAcl?.id)\n\n if (aclIsUnchanged) {\n // noop\n onSaveComplete(true)\n } else if (originalAcl === null && updatedAcl !== null) {\n createAcl(updatedAcl)\n } else if (updatedAcl === null) {\n deleteAcl(accessRequirementId)\n } else {\n updateAcl(updatedAcl)\n }\n },\n }\n }, [\n accessRequirementId,\n originalAcl,\n resourceAccessList,\n createAcl,\n deleteAcl,\n onSaveComplete,\n updateAcl,\n ])\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Guide to AR permissions\n </Typography>\n <Typography\n sx={spreadSx(\n {\n mb: '10px',\n },\n textSx,\n )}\n >\n <span style={{ fontStyle: 'italic' }}>Can Review</span> means a user\n or team has access request review permission for this AR.\n </Typography>\n <Typography\n sx={spreadSx(\n {\n mb: '10px',\n },\n textSx,\n )}\n >\n <span style={{ fontStyle: 'italic' }}>Exempt Eligible</span> users\n and teams can bypass access requirements for entities they have been\n granted &quot;edit and delete&quot; permission on, via the\n &quot;Sharing Settings&quot; dialog in the Project Settings.\n </Typography>\n <Typography sx={{ ...textSx, color: 'grey.900' }}>\n ACT members always retain the ability to review or modify Access\n Requirements.\n </Typography>\n </Box>\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={EMPTY_RESOURCE_ACCESS_LIST_TEXT}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(id, [ACCESS_TYPE.REVIEW_SUBMISSIONS])\n }\n updateResourceAccessItem={updateResourceAccessItem}\n removeResourceAccessItem={removeResourceAccessItem}\n showAddRemovePublicButton={false}\n showNotifyCheckbox={false}\n isInherited={false}\n />\n {error && <Alert severity=\"error\">{error}</Alert>}\n </Stack>\n )\n },\n)\n"],"mappings":";;;;;;;;;;;;AAwBA,IAAM,IAAS;CACb,SAAS;CACT,YAAY;CACZ,OAAO;CACR,EAEY,IACX,wCAEI,IAA+C;CACnD;CACA;CACA;CACD,EAaY,IAA6B,EACxC,SACE,GACA,GACA;CACA,IAAM,EAAE,wBAAqB,sBAAmB,GAC1C,CAAC,GAAO,KAAY,EAAwB,KAAK,EAEjD,UAA0B;AAE9B,EADA,EAAS,KAAK,EACd,EAAe,GAAK;IAGhB,KAAmB,MAA8B;AAErD,EADA,EAAS,EAAM,OAAO,EACtB,EAAe,GAAM;IAGjB,EAAE,MAAM,GAAa,WAAW,MACpC,EAA2B,GAAqB,EAE9C,WAAW,UACZ,CAAC,EAEE,IAAqC,QACnC,EAA8B,GAAa,kBAAkB,EAAE,CAAC,EACtE,CAAC,EAAY,CACd,EAEK,EACJ,uBACA,0BACA,0BACA,6BACA,6BACA,uBACE,EAAa;EACf,gBAAgB,EAAS,KAAK;EAC9B,SAAS;EACV,CAAC;AAGF,SAAgB;AACd,EAAI,MACF,GAAiB,EACjB,EAAsB,EAAmC;IAE1D;EACD;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC,EAEI,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC,EAEI,EAAE,QAAQ,MAAc,EAA8B;EAC1D,iBAAiB,GAAmB;EACpC,UAAS,MAAS,EAAgB,EAAM;EACzC,CAAC;AAyCF,QAvCA,EAAoB,UACX,EACL,OAAO;EACL,IAAM,IACJ,EAAmB,WAAW,IAC1B,OACA;GACE,GAAG;GACH,IAAI,GAAa,MAAM;GACvB,gBAAgB;GACjB;AAOP,EALG,MAAgB,QAAQ,KAAc,QAEtC,EAAQ,GAAoC,EAAmB,IAC9D,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GACX,MAAgB,QAAQ,MAAe,OAChD,EAAU,EAAW,GACZ,MAAe,OACxB,EAAU,EAAoB,GAE9B,EAAU,EAAW;IAG1B,GACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAGA,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH;GAME,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,SAAQ;KACR,IAAI,EACF,IAAI,QACL;eACF;KAEY,CAAA;IACb,kBAAC,GAAD;KACE,IAAI,EACF,EACE,IAAI,QACL,EACD,EACD;eANH,CAQE,kBAAC,QAAD;MAAM,OAAO,EAAE,WAAW,UAAU;gBAAE;MAAiB,CAAA,EAAA,0EAE5C;;IACb,kBAAC,GAAD;KACE,IAAI,EACF,EACE,IAAI,QACL,EACD,EACD;eANH,CAQE,kBAAC,QAAD;MAAM,OAAO,EAAE,WAAW,UAAU;gBAAE;MAAsB,CAAA,EAAA,sLAIjD;;IACb,kBAAC,GAAD;KAAY,IAAI;MAAE,GAAG;MAAQ,OAAO;MAAY;eAAE;KAGrC,CAAA;IACT,EAAA,CAAA;GACN,kBAAC,GAAD;IACsB;IACO;IAC3B,WAAW;IACX,SAAS;IACT,WAAW;IACX,sBAAqB,MACnB,EAAsB,GAAI,CAAC,EAAY,mBAAmB,CAAC;IAEnC;IACA;IAC1B,2BAA2B;IAC3B,oBAAoB;IACpB,aAAa;IACb,CAAA;GACD,KAAS,kBAAC,GAAD;IAAO,UAAS;cAAS;IAAc,CAAA;GAC3C;;EAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ManagedACTAccessRequirement,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useCanShowManagedACTWikiInWizard } from './AccessRequirementListUtils'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\n/**\n * Represents a distinct screen in the wizard used to apply to a ManagedACTAccessRequirement\n */\nenum RequestDataStep {\n SHOW_ALL_ARS = 0,\n UPDATE_RESEARCH_PROJECT = 1,\n UPDATE_ACCESSORS_AND_FILES = 2,\n PROMPT_CANCEL = 3,\n PROMPT_LOGIN = 4,\n COMPLETE = 5,\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n managedACTAccessRequirement?: ManagedACTAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [managedACTAccessRequirement, setManagedACTAccessRequirement] =\n useState<ManagedACTAccessRequirement>()\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const canShowManagedACTWikiInWizard = useCanShowManagedACTWikiInWizard()\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n managedACTAccessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (managedACTAccessRequirement) {\n // required for step 1, 2 form\n setManagedACTAccessRequirement(managedACTAccessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n ].includes(requestDataStep) && canShowManagedACTWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n managedACTAccessRequirement,\n step: RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={() => {\n requestDataStepCallback({\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n })\n }}\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? RequestDataStep.UPDATE_RESEARCH_PROJECT\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n managedACTAccessRequirement: accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ManagedACTAccessRequirement,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useCanShowManagedACTWikiInWizard } from './AccessRequirementListUtils'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\n/**\n * Represents a distinct screen in the wizard used to apply to a ManagedACTAccessRequirement\n */\nenum RequestDataStep {\n SHOW_ALL_ARS = 0,\n UPDATE_RESEARCH_PROJECT = 1,\n UPDATE_ACCESSORS_AND_FILES = 2,\n PROMPT_CANCEL = 3,\n PROMPT_LOGIN = 4,\n COMPLETE = 5,\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n managedACTAccessRequirement?: ManagedACTAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [managedACTAccessRequirement, setManagedACTAccessRequirement] =\n useState<ManagedACTAccessRequirement>()\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const canShowManagedACTWikiInWizard = useCanShowManagedACTWikiInWizard()\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n managedACTAccessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (managedACTAccessRequirement) {\n // required for step 1, 2 form\n setManagedACTAccessRequirement(managedACTAccessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n ].includes(requestDataStep) && canShowManagedACTWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n managedACTAccessRequirement,\n step: RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={() => {\n requestDataStepCallback({\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n })\n }}\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? RequestDataStep.UPDATE_RESEARCH_PROJECT\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n managedACTAccessRequirement: accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CertificationRequirement.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/CertificationRequirement.tsx"],"sourcesContent":["import { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Link, Typography } from '@mui/material'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\n/**\n * When creating requests for access requirements on a particular file, one or more access requirements may require that the\n * user is certified.\n *\n * This component checks if the user is certified, and if not, provides a link on how to begin certification.\n */\nexport default function CertificationRequirement() {\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n const requirementItemState: RequirementItemStatus = isLoading\n ? RequirementItemStatus.LOADING\n : userBundle?.isCertified\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n\n return (\n <RequirementItem status={requirementItemState}>\n <Typography variant=\"body1\">\n You must first become a{' '}\n <Link href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Quiz:`}>\n certified user\n </Link>\n </Typography>\n {isLoading && <span className=\"spinner\" />}\n {userBundle?.isCertified && (\n <Typography variant={'body1'}>You are a certified user</Typography>\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAwB,IAA2B;CACjD,IAAM,EAAE,MAAM,GAAY,iBAAc,GAAyB;AAQjE,QACE,kBAAC,GAAD;EAAiB,QAPiC,IAChD,EAAsB,UACtB,GAAY,cACZ,EAAsB,WACtB,EAAsB;YAGxB;GACE,kBAAC,GAAD;IAAY,SAAQ;cAApB;KAA4B;KACF;KACxB,kBAAC,GAAD;MAAM,MAAM,GAAG,EAA2B,OAAO;gBAAQ;MAElD,CAAA;KACI;;GACZ,KAAa,kBAAC,QAAD,EAAM,WAAU,WAAY,CAAA;GACzC,GAAY,eACX,kBAAC,GAAD;IAAY,SAAS;cAAS;IAAqC,CAAA;GAErD"}
1
+ {"version":3,"file":"CertificationRequirement.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/CertificationRequirement.tsx"],"sourcesContent":["import { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Link, Typography } from '@mui/material'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\n/**\n * When creating requests for access requirements on a particular file, one or more access requirements may require that the\n * user is certified.\n *\n * This component checks if the user is certified, and if not, provides a link on how to begin certification.\n */\nexport default function CertificationRequirement() {\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n const requirementItemState: RequirementItemStatus = isLoading\n ? RequirementItemStatus.LOADING\n : userBundle?.isCertified\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n\n return (\n <RequirementItem status={requirementItemState}>\n <Typography variant=\"body1\">\n You must first become a{' '}\n <Link href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Quiz:`}>\n certified user\n </Link>\n </Typography>\n {isLoading && <span className=\"spinner\" />}\n {userBundle?.isCertified && (\n <Typography variant={'body1'}>You are a certified user</Typography>\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAwB,IAA2B;CACjD,IAAM,EAAE,MAAM,GAAY,iBAAc,GAAyB;AAQjE,QACE,kBAAC,GAAD;EAAiB,QAPiC,IAChD,EAAsB,UACtB,GAAY,cACV,EAAsB,WACtB,EAAsB;YAG1B;GACE,kBAAC,GAAD;IAAY,SAAQ;cAApB;KAA4B;KACF;KACxB,kBAAC,GAAD;MAAM,MAAM,GAAG,EAA2B,OAAO;gBAAQ;MAElD,CAAA;KACI;;GACZ,KAAa,kBAAC,QAAD,EAAM,WAAU,WAAY,CAAA;GACzC,GAAY,eACX,kBAAC,GAAD;IAAY,SAAS;cAAS;IAAqC,CAAA;GAErD"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelfSignAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.tsx"],"sourcesContent":["import {\n useCreateAccessApproval,\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n useGetCurrentUserBundle,\n useGetCurrentUserProfile,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isTermsOfUseAccessRequirement } from '@/utils/types/IsType'\nimport { Alert, Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ApprovalState,\n CreateAccessApprovalRequest,\n SelfSignAccessRequirement,\n TermsOfUseAccessRequirement,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type SelfSignAccessRequirementItemProps = {\n accessRequirement: SelfSignAccessRequirement | TermsOfUseAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for an self-sign Access Requirement, including {@link SelfSignAccessRequirement} or\n * {@link TermsOfUseAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link RequestDataAccess}\n */\nexport default function SelfSignAccessRequirementItem(\n props: SelfSignAccessRequirementItemProps,\n) {\n const { accessRequirement, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n const isTermsOfUse = isTermsOfUseAccessRequirement(accessRequirement)\n\n const { data: user } = useGetCurrentUserProfile()\n const { data: userBundle } = useGetCurrentUserBundle()\n\n const certificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isCertifiedUserRequired &&\n !userBundle.isCertified\n const verificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isValidatedProfileRequired &&\n !userBundle.isVerified\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // TermsOfUse ARs may have the terms embedded in the AR or an associated Wiki.\n )\n\n const [showTerms, setShowTerms] = useState<boolean>(false)\n\n const {\n mutate: createAccessApproval,\n isPending: createAccessApprovalIsPending,\n error,\n } = useCreateAccessApproval({\n onError: err => {\n console.error('Error creating access approval: ', err)\n },\n })\n\n const onAcceptClicked = () => {\n const accessApprovalRequest: CreateAccessApprovalRequest = {\n requirementId: accessRequirement?.id,\n submitterId: user?.ownerId!,\n accessorId: user?.ownerId!,\n state: ApprovalState.APPROVED,\n }\n\n createAccessApproval(accessApprovalRequest)\n }\n\n let renderedTerms = <></>\n if (isTermsOfUse && accessRequirement.termsOfUse) {\n renderedTerms = <MarkdownSynapse markdown={accessRequirement.termsOfUse} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n let acceptButtonText = 'I Accept Terms of Use'\n let acceptButtonDisabled = false\n if (certificationRequirementNotMet || verificationRequirementNotMet) {\n acceptButtonDisabled = true\n acceptButtonText = `You must ${\n certificationRequirementNotMet ? 'be certified' : ''\n }${\n certificationRequirementNotMet && verificationRequirementNotMet\n ? ' and '\n : ''\n }${\n verificationRequirementNotMet ? 'have a validated user profile' : ''\n } to accept`\n }\n\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n disabled: createAccessApprovalIsPending || acceptButtonDisabled,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n return (\n <RequirementItem\n data-testid=\"SelfSignAccessRequirementItem\"\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n You have accepted the terms of use.{' '}\n <Link role=\"button\" onClick={() => setShowTerms(!showTerms)}>\n {showTerms ? 'Hide Terms' : 'View Terms'}\n </Link>\n </Typography>\n {showTerms && <Box sx={{ my: 1 }}>{renderedTerms}</Box>}\n </>\n ) : (\n renderedTerms\n )}\n {error && <Alert severity=\"error\">{error.reason}</Alert>}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,GAChC,EAAE,uBAAoB,GAAmB,EACzC,IAAe,EAA8B,EAAkB,EAE/D,EAAE,MAAM,MAAS,GAA0B,EAC3C,EAAE,MAAM,MAAe,GAAyB,EAEhD,IACJ,KACA,KACA,CAAC,KACD,EAAkB,2BAClB,CAAC,EAAW,aACR,IACJ,KACA,KACA,CAAC,KACD,EAAkB,8BAClB,CAAC,EAAW,YAER,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,IAAa,GAAyB,YAEtC,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,CAAC,GAAW,KAAgB,EAAkB,GAAM,EAEpD,EACJ,QAAQ,GACR,WAAW,GACX,aACE,EAAwB,EAC1B,UAAS,MAAO;AACd,UAAQ,MAAM,oCAAoC,EAAI;IAEzD,CAAC,EAEI,UAAwB;AAQ5B,IAAqB;GANnB,eAAe,GAAmB;GAClC,aAAa,GAAM;GACnB,YAAY,GAAM;GAClB,OAAO,EAAc;GAGF,CAAsB;IAGzC,IAAgB,kBAAA,GAAA,EAAK,CAAA;AACzB,CAAI,KAAgB,EAAkB,aACpC,IAAgB,kBAAC,GAAD,EAAiB,UAAU,EAAkB,YAAc,CAAA,GAClE,MACT,IACE,kBAAC,GAAD;EACE,QAAQ,GAAU;EAClB,SAAS,GAAU;EACnB,YAAY,GAAU;EACtB,CAAA;CAGN,IAAI;AAEJ,KAAI,KAAmB,CAAC,GAAY;EAClC,IAAI,IAAmB,yBACnB,IAAuB;AAc3B,GAbI,KAAkC,OACpC,IAAuB,IACvB,IAAmB,YACjB,IAAiC,iBAAiB,KAElD,KAAkC,IAC9B,UACA,KAEJ,IAAgC,kCAAkC,GACnE,cAGH,IAAU,CACR;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU,KAAiC;GAC5C,EACD;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACX,CACF;;AAGH,QACE,kBAAC,GAAD;EACE,eAAY;EACZ,QACE,IACI,EAAsB,UACtB,IACA,EAAsB,WACtB,EAAsB;EAEnB;YATX,CAWG,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IAA8B;IACQ;IACpC,kBAAC,GAAD;KAAM,MAAK;KAAS,eAAe,EAAa,CAAC,EAAU;eACxD,IAAY,eAAe;KACvB,CAAA;IACI;MACZ,KAAa,kBAAC,GAAD;GAAK,IAAI,EAAE,IAAI,GAAG;aAAG;GAAoB,CAAA,CACtD,EAAA,CAAA,GAEH,GAED,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS,EAAM;GAAe,CAAA,CACxC"}
1
+ {"version":3,"file":"SelfSignAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.tsx"],"sourcesContent":["import {\n useCreateAccessApproval,\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n useGetCurrentUserBundle,\n useGetCurrentUserProfile,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isTermsOfUseAccessRequirement } from '@/utils/types/IsType'\nimport { Alert, Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ApprovalState,\n CreateAccessApprovalRequest,\n SelfSignAccessRequirement,\n TermsOfUseAccessRequirement,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type SelfSignAccessRequirementItemProps = {\n accessRequirement: SelfSignAccessRequirement | TermsOfUseAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for an self-sign Access Requirement, including {@link SelfSignAccessRequirement} or\n * {@link TermsOfUseAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link RequestDataAccess}\n */\nexport default function SelfSignAccessRequirementItem(\n props: SelfSignAccessRequirementItemProps,\n) {\n const { accessRequirement, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n const isTermsOfUse = isTermsOfUseAccessRequirement(accessRequirement)\n\n const { data: user } = useGetCurrentUserProfile()\n const { data: userBundle } = useGetCurrentUserBundle()\n\n const certificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isCertifiedUserRequired &&\n !userBundle.isCertified\n const verificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isValidatedProfileRequired &&\n !userBundle.isVerified\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // TermsOfUse ARs may have the terms embedded in the AR or an associated Wiki.\n )\n\n const [showTerms, setShowTerms] = useState<boolean>(false)\n\n const {\n mutate: createAccessApproval,\n isPending: createAccessApprovalIsPending,\n error,\n } = useCreateAccessApproval({\n onError: err => {\n console.error('Error creating access approval: ', err)\n },\n })\n\n const onAcceptClicked = () => {\n const accessApprovalRequest: CreateAccessApprovalRequest = {\n requirementId: accessRequirement?.id,\n submitterId: user?.ownerId!,\n accessorId: user?.ownerId!,\n state: ApprovalState.APPROVED,\n }\n\n createAccessApproval(accessApprovalRequest)\n }\n\n let renderedTerms = <></>\n if (isTermsOfUse && accessRequirement.termsOfUse) {\n renderedTerms = <MarkdownSynapse markdown={accessRequirement.termsOfUse} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n let acceptButtonText = 'I Accept Terms of Use'\n let acceptButtonDisabled = false\n if (certificationRequirementNotMet || verificationRequirementNotMet) {\n acceptButtonDisabled = true\n acceptButtonText = `You must ${\n certificationRequirementNotMet ? 'be certified' : ''\n }${\n certificationRequirementNotMet && verificationRequirementNotMet\n ? ' and '\n : ''\n }${\n verificationRequirementNotMet ? 'have a validated user profile' : ''\n } to accept`\n }\n\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n disabled: createAccessApprovalIsPending || acceptButtonDisabled,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n return (\n <RequirementItem\n data-testid=\"SelfSignAccessRequirementItem\"\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n You have accepted the terms of use.{' '}\n <Link role=\"button\" onClick={() => setShowTerms(!showTerms)}>\n {showTerms ? 'Hide Terms' : 'View Terms'}\n </Link>\n </Typography>\n {showTerms && <Box sx={{ my: 1 }}>{renderedTerms}</Box>}\n </>\n ) : (\n renderedTerms\n )}\n {error && <Alert severity=\"error\">{error.reason}</Alert>}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,GAChC,EAAE,uBAAoB,GAAmB,EACzC,IAAe,EAA8B,EAAkB,EAE/D,EAAE,MAAM,MAAS,GAA0B,EAC3C,EAAE,MAAM,MAAe,GAAyB,EAEhD,IACJ,KACA,KACA,CAAC,KACD,EAAkB,2BAClB,CAAC,EAAW,aACR,IACJ,KACA,KACA,CAAC,KACD,EAAkB,8BAClB,CAAC,EAAW,YAER,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,IAAa,GAAyB,YAEtC,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,CAAC,GAAW,KAAgB,EAAkB,GAAM,EAEpD,EACJ,QAAQ,GACR,WAAW,GACX,aACE,EAAwB,EAC1B,UAAS,MAAO;AACd,UAAQ,MAAM,oCAAoC,EAAI;IAEzD,CAAC,EAEI,UAAwB;AAQ5B,IAAqB;GANnB,eAAe,GAAmB;GAClC,aAAa,GAAM;GACnB,YAAY,GAAM;GAClB,OAAO,EAAc;GAGF,CAAsB;IAGzC,IAAgB,kBAAA,GAAA,EAAK,CAAA;AACzB,CAAI,KAAgB,EAAkB,aACpC,IAAgB,kBAAC,GAAD,EAAiB,UAAU,EAAkB,YAAc,CAAA,GAClE,MACT,IACE,kBAAC,GAAD;EACE,QAAQ,GAAU;EAClB,SAAS,GAAU;EACnB,YAAY,GAAU;EACtB,CAAA;CAGN,IAAI;AAEJ,KAAI,KAAmB,CAAC,GAAY;EAClC,IAAI,IAAmB,yBACnB,IAAuB;AAc3B,GAbI,KAAkC,OACpC,IAAuB,IACvB,IAAmB,YACjB,IAAiC,iBAAiB,KAElD,KAAkC,IAC9B,UACA,KAEJ,IAAgC,kCAAkC,GACnE,cAGH,IAAU,CACR;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU,KAAiC;GAC5C,EACD;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACX,CACF;;AAGH,QACE,kBAAC,GAAD;EACE,eAAY;EACZ,QACE,IACI,EAAsB,UACtB,IACE,EAAsB,WACtB,EAAsB;EAErB;YATX,CAWG,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IAA8B;IACQ;IACpC,kBAAC,GAAD;KAAM,MAAK;KAAS,eAAe,EAAa,CAAC,EAAU;eACxD,IAAY,eAAe;KACvB,CAAA;IACI;MACZ,KAAa,kBAAC,GAAD;GAAK,IAAI,EAAE,IAAI,GAAG;aAAG;GAAoB,CAAA,CACtD,EAAA,CAAA,GAEH,GAED,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS,EAAM;GAAe,CAAA,CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"UnmanagedACTAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.tsx"],"sourcesContent":["import {\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ACTAccessRequirement,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type UnmanagedACTAccessRequirementItemProps = {\n subjectId?: string\n subjectType?: RestrictableObjectType\n accessRequirement: ACTAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for the deprecated {@link ACTAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link ManagedACTAccessRequirementItem}\n *\n * For {@link SelfSignAccessRequirement} and {@link TermsOfUseAccessRequirement}, see {@link SelfSignAccessRequirementItem}\n */\nexport default function UnmanagedACTAccessRequirementItem(\n props: UnmanagedACTAccessRequirementItemProps,\n) {\n const { accessRequirement, subjectId, subjectType, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // ACT ARs may have the contact info embedded in the AR or may have an associated Wiki.\n )\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const [showACTContactInfoInstructions, setShowACTContactInfoInstructions] =\n useState<boolean>(false)\n\n let acceptButtonText = ''\n if (\n typeof window !== 'undefined' &&\n (window.location.hostname === 'www.synapse.org' ||\n window.location.hostname === 'staging.synapse.org')\n ) {\n acceptButtonText = 'Request access'\n } else {\n acceptButtonText = 'Request access via Synapse.org'\n }\n\n const gotoSynapseAccessRequirementPage = () => {\n const subjectTypeFilter = subjectType ? `&TYPE=${subjectType}` : ''\n const subjectIdFilter = subjectId ? `&ID=${subjectId}` : ''\n window.open(\n `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}AccessRequirement:AR_ID=${accessRequirement.id}${subjectTypeFilter}${subjectIdFilter}`,\n )\n }\n const onAcceptClicked = () => {\n gotoSynapseAccessRequirementPage()\n // PORTALS-1483: and close the dialog.\n if (onHide) {\n onHide()\n }\n }\n\n const actContactInfo = accessRequirement.actContactInfo\n\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n let renderedTerms = <></>\n if (actContactInfo) {\n renderedTerms = <MarkdownSynapse markdown={actContactInfo} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n return (\n <RequirementItem\n data-testid={'UnmanagedACTAccessRequirementItem'}\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n Your data access request has been approved.{' '}\n <Link\n role={'button'}\n onClick={() =>\n setShowACTContactInfoInstructions(\n !showACTContactInfoInstructions,\n )\n }\n >\n {showACTContactInfoInstructions\n ? 'Hide Instructions'\n : 'View Instructions'}\n </Link>\n </Typography>\n {showACTContactInfoInstructions && (\n <Box sx={{ my: 1 }}>{renderedTerms}</Box>\n )}\n </>\n ) : (\n renderedTerms\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;AA8BA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,gBAAa,cAAW,GACxD,EAAE,uBAAoB,GAAmB,EAEzC,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,IAAa,GAAyB,YAEtC,CAAC,GAAgC,KACrC,EAAkB,GAAM,EAEtB,IAAmB;AACvB,CAOE,IANA,OAAO,SAAW,QACjB,OAAO,SAAS,aAAa,qBAC5B,OAAO,SAAS,aAAa,yBAEZ,mBAEA;CAGrB,IAAM,UAAyC;EAC7C,IAAM,IAAoB,IAAc,SAAS,MAAgB,IAC3D,IAAkB,IAAY,OAAO,MAAc;AACzD,SAAO,KACL,GAAG,EAA2B,OAAO,0BAA0B,EAAkB,KAAK,IAAoB,IAC3G;IAEG,UAAwB;AAG5B,EAFA,GAAkC,EAE9B,KACF,GAAQ;IAIN,IAAiB,EAAkB,gBAErC;AAEJ,CAAI,KAAmB,CAAC,MACtB,IAAU,CACR;EACE,SAAS;EACT,SAAS;EACT,UAAU;EACX,EACD;EACE,SAAS;EACT,SAAS;EACT,UAAU;EACX,CACF;CAGH,IAAI,IAAgB,kBAAA,GAAA,EAAK,CAAA;AAYzB,QAXI,IACF,IAAgB,kBAAC,GAAD,EAAiB,UAAU,GAAkB,CAAA,GACpD,MACT,IACE,kBAAC,GAAD;EACE,QAAQ,GAAU;EAClB,SAAS,GAAU;EACnB,YAAY,GAAU;EACtB,CAAA,GAIJ,kBAAC,GAAD;EACE,eAAa;EACb,QACE,IACI,EAAsB,UACtB,IACA,EAAsB,WACtB,EAAsB;EAEnB;YAER,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IAA8B;IACgB;IAC5C,kBAAC,GAAD;KACE,MAAM;KACN,eACE,EACE,CAAC,EACF;eAGF,IACG,sBACA;KACC,CAAA;IACI;MACZ,KACC,kBAAC,GAAD;GAAK,IAAI,EAAE,IAAI,GAAG;aAAG;GAAoB,CAAA,CAE1C,EAAA,CAAA,GAEH;EAEc,CAAA"}
1
+ {"version":3,"file":"UnmanagedACTAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.tsx"],"sourcesContent":["import {\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ACTAccessRequirement,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type UnmanagedACTAccessRequirementItemProps = {\n subjectId?: string\n subjectType?: RestrictableObjectType\n accessRequirement: ACTAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for the deprecated {@link ACTAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link ManagedACTAccessRequirementItem}\n *\n * For {@link SelfSignAccessRequirement} and {@link TermsOfUseAccessRequirement}, see {@link SelfSignAccessRequirementItem}\n */\nexport default function UnmanagedACTAccessRequirementItem(\n props: UnmanagedACTAccessRequirementItemProps,\n) {\n const { accessRequirement, subjectId, subjectType, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // ACT ARs may have the contact info embedded in the AR or may have an associated Wiki.\n )\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const [showACTContactInfoInstructions, setShowACTContactInfoInstructions] =\n useState<boolean>(false)\n\n let acceptButtonText = ''\n if (\n typeof window !== 'undefined' &&\n (window.location.hostname === 'www.synapse.org' ||\n window.location.hostname === 'staging.synapse.org')\n ) {\n acceptButtonText = 'Request access'\n } else {\n acceptButtonText = 'Request access via Synapse.org'\n }\n\n const gotoSynapseAccessRequirementPage = () => {\n const subjectTypeFilter = subjectType ? `&TYPE=${subjectType}` : ''\n const subjectIdFilter = subjectId ? `&ID=${subjectId}` : ''\n window.open(\n `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}AccessRequirement:AR_ID=${accessRequirement.id}${subjectTypeFilter}${subjectIdFilter}`,\n )\n }\n const onAcceptClicked = () => {\n gotoSynapseAccessRequirementPage()\n // PORTALS-1483: and close the dialog.\n if (onHide) {\n onHide()\n }\n }\n\n const actContactInfo = accessRequirement.actContactInfo\n\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n let renderedTerms = <></>\n if (actContactInfo) {\n renderedTerms = <MarkdownSynapse markdown={actContactInfo} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n return (\n <RequirementItem\n data-testid={'UnmanagedACTAccessRequirementItem'}\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n Your data access request has been approved.{' '}\n <Link\n role={'button'}\n onClick={() =>\n setShowACTContactInfoInstructions(\n !showACTContactInfoInstructions,\n )\n }\n >\n {showACTContactInfoInstructions\n ? 'Hide Instructions'\n : 'View Instructions'}\n </Link>\n </Typography>\n {showACTContactInfoInstructions && (\n <Box sx={{ my: 1 }}>{renderedTerms}</Box>\n )}\n </>\n ) : (\n renderedTerms\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;AA8BA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,gBAAa,cAAW,GACxD,EAAE,uBAAoB,GAAmB,EAEzC,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,IAAa,GAAyB,YAEtC,CAAC,GAAgC,KACrC,EAAkB,GAAM,EAEtB,IAAmB;AACvB,CAOE,IANA,OAAO,SAAW,QACjB,OAAO,SAAS,aAAa,qBAC5B,OAAO,SAAS,aAAa,yBAEZ,mBAEA;CAGrB,IAAM,UAAyC;EAC7C,IAAM,IAAoB,IAAc,SAAS,MAAgB,IAC3D,IAAkB,IAAY,OAAO,MAAc;AACzD,SAAO,KACL,GAAG,EAA2B,OAAO,0BAA0B,EAAkB,KAAK,IAAoB,IAC3G;IAEG,UAAwB;AAG5B,EAFA,GAAkC,EAE9B,KACF,GAAQ;IAIN,IAAiB,EAAkB,gBAErC;AAEJ,CAAI,KAAmB,CAAC,MACtB,IAAU,CACR;EACE,SAAS;EACT,SAAS;EACT,UAAU;EACX,EACD;EACE,SAAS;EACT,SAAS;EACT,UAAU;EACX,CACF;CAGH,IAAI,IAAgB,kBAAA,GAAA,EAAK,CAAA;AAYzB,QAXI,IACF,IAAgB,kBAAC,GAAD,EAAiB,UAAU,GAAkB,CAAA,GACpD,MACT,IACE,kBAAC,GAAD;EACE,QAAQ,GAAU;EAClB,SAAS,GAAU;EACnB,YAAY,GAAU;EACtB,CAAA,GAIJ,kBAAC,GAAD;EACE,eAAa;EACb,QACE,IACI,EAAsB,UACtB,IACE,EAAsB,WACtB,EAAsB;EAErB;YAER,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IAA8B;IACgB;IAC5C,kBAAC,GAAD;KACE,MAAM;KACN,eACE,EACE,CAAC,EACF;eAGF,IACG,sBACA;KACC,CAAA;IACI;MACZ,KACC,kBAAC,GAAD;GAAK,IAAI,EAAE,IAAI,GAAG;aAAG;GAAoB,CAAA,CAE1C,EAAA,CAAA,GAEH;EAEc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationRequirement.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/ValidationRequirement.tsx"],"sourcesContent":["import { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useOneSageURL } from '@/utils/hooks/useOneSageURL'\nimport { Link, Typography } from '@mui/material'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\n/**\n * When creating requests for access requirements on a particular file, one or more access requirements may require that the\n * user has a validated profile.\n *\n * This component checks if the user has a validated profile, and if not, provides a link on how to begin profile validation.\n */\nexport default function ValidationRequirement() {\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n const validationURL = useOneSageURL(\n '/authenticated/myaccount',\n undefined,\n 'trust',\n )\n\n return (\n <RequirementItem\n status={\n isLoading\n ? RequirementItemStatus.LOADING\n : userBundle!.isVerified\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n >\n <Typography variant={'body1'}>\n You must first apply to have your{' '}\n <Link href={validationURL.toString()} target={'_blank'}>\n user profile validated\n </Link>\n </Typography>\n {isLoading && <span className=\"spinner\" />}\n {userBundle?.isVerified && (\n <Typography variant={'body1'}>\n Your user profile is validated.\n </Typography>\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAwB,IAAwB;CAC9C,IAAM,EAAE,MAAM,GAAY,iBAAc,GAAyB,EAC3D,IAAgB,EACpB,4BACA,KAAA,GACA,QACD;AAED,QACE,kBAAC,GAAD;EACE,QACE,IACI,EAAsB,UACtB,EAAY,aACZ,EAAsB,WACtB,EAAsB;YAN9B;GASE,kBAAC,GAAD;IAAY,SAAS;cAArB;KAA8B;KACM;KAClC,kBAAC,GAAD;MAAM,MAAM,EAAc,UAAU;MAAE,QAAQ;gBAAU;MAEjD,CAAA;KACI;;GACZ,KAAa,kBAAC,QAAD,EAAM,WAAU,WAAY,CAAA;GACzC,GAAY,cACX,kBAAC,GAAD;IAAY,SAAS;cAAS;IAEjB,CAAA;GAEC"}
1
+ {"version":3,"file":"ValidationRequirement.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/ValidationRequirement.tsx"],"sourcesContent":["import { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useOneSageURL } from '@/utils/hooks/useOneSageURL'\nimport { Link, Typography } from '@mui/material'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\n/**\n * When creating requests for access requirements on a particular file, one or more access requirements may require that the\n * user has a validated profile.\n *\n * This component checks if the user has a validated profile, and if not, provides a link on how to begin profile validation.\n */\nexport default function ValidationRequirement() {\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n const validationURL = useOneSageURL(\n '/authenticated/myaccount',\n undefined,\n 'trust',\n )\n\n return (\n <RequirementItem\n status={\n isLoading\n ? RequirementItemStatus.LOADING\n : userBundle!.isVerified\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n >\n <Typography variant={'body1'}>\n You must first apply to have your{' '}\n <Link href={validationURL.toString()} target={'_blank'}>\n user profile validated\n </Link>\n </Typography>\n {isLoading && <span className=\"spinner\" />}\n {userBundle?.isVerified && (\n <Typography variant={'body1'}>\n Your user profile is validated.\n </Typography>\n )}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAwB,IAAwB;CAC9C,IAAM,EAAE,MAAM,GAAY,iBAAc,GAAyB,EAC3D,IAAgB,EACpB,4BACA,KAAA,GACA,QACD;AAED,QACE,kBAAC,GAAD;EACE,QACE,IACI,EAAsB,UACtB,EAAY,aACV,EAAsB,WACtB,EAAsB;YANhC;GASE,kBAAC,GAAD;IAAY,SAAS;cAArB;KAA8B;KACM;KAClC,kBAAC,GAAD;MAAM,MAAM,EAAc,UAAU;MAAE,QAAQ;gBAAU;MAEjD,CAAA;KACI;;GACZ,KAAa,kBAAC,QAAD,EAAM,WAAU,WAAY,CAAA;GACzC,GAAY,cACX,kBAAC,GAAD;IAAY,SAAS;cAAS;IAEjB,CAAA;GAEC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CreateAccessTokenModal.d.ts","sourceRoot":"","sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"names":[],"mappings":"AAiBA,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAiKxE"}
1
+ {"version":3,"file":"CreateAccessTokenModal.d.ts","sourceRoot":"","sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"names":[],"mappings":"AAiBA,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAmKxE"}
@@ -49,60 +49,62 @@ function _(_) {
49
49
  variant: "body1",
50
50
  children: "This token grants access to your account functions and should be treated like a password."
51
51
  })
52
- ] }) : /* @__PURE__ */ m("div", { children: [
53
- /* @__PURE__ */ p(a, {
54
- autoFocus: !0,
55
- label: "Token Name",
56
- value: b,
57
- onChange: P,
58
- placeholder: "e.g. Synapse command line access on my laptop",
59
- sx: { mb: 2 }
60
- }),
61
- /* @__PURE__ */ p(d, {
62
- variant: "label",
63
- children: "Token Permissions"
64
- }),
65
- /* @__PURE__ */ m(u, {
66
- sx: {
67
- gap: 2,
68
- my: 1
69
- },
70
- children: [
71
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
72
- control: /* @__PURE__ */ p(c, {}),
73
- label: h.view.displayName,
74
- checked: S,
75
- onChange: () => C(!S)
76
- }), /* @__PURE__ */ m(d, {
77
- variant: "smallText1",
78
- sx: { color: "grey.700" },
79
- children: [h.view.description, ". Required to use Synapse programmatic clients."]
80
- })] }),
81
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
82
- control: /* @__PURE__ */ p(c, {}),
83
- label: h.download.displayName,
84
- checked: w,
85
- onChange: () => T(!w)
86
- }), /* @__PURE__ */ p(d, {
87
- variant: "smallText1",
88
- sx: { color: "grey.700" },
89
- children: h.download.description
90
- })] }),
91
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
92
- control: /* @__PURE__ */ p(c, {}),
93
- label: h.modify.displayName,
94
- checked: E,
95
- onChange: () => D(!E)
96
- }), /* @__PURE__ */ p(d, {
97
- variant: "smallText1",
98
- sx: { color: "grey.700" },
99
- children: h.modify.description
100
- })] })
101
- ]
102
- }),
103
- O && /* @__PURE__ */ p(e, { error: O }),
104
- M && /* @__PURE__ */ p(e, { error: M.reason })
105
- ] });
52
+ ] }) : /* @__PURE__ */ m(u, {
53
+ gap: 2,
54
+ children: [
55
+ /* @__PURE__ */ p(a, {
56
+ autoFocus: !0,
57
+ label: "Token Name",
58
+ value: b,
59
+ onChange: P,
60
+ placeholder: "e.g. Synapse command line access on my laptop",
61
+ sx: { mb: 2 }
62
+ }),
63
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(d, {
64
+ variant: "label",
65
+ children: "Token Permissions"
66
+ }), /* @__PURE__ */ m(u, {
67
+ sx: {
68
+ gap: 2,
69
+ my: 1
70
+ },
71
+ children: [
72
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
73
+ control: /* @__PURE__ */ p(c, {}),
74
+ label: h.view.displayName,
75
+ checked: S,
76
+ onChange: () => C(!S)
77
+ }), /* @__PURE__ */ m(d, {
78
+ variant: "smallText1",
79
+ sx: { color: "grey.700" },
80
+ children: [h.view.description, ". Required to use Synapse programmatic clients."]
81
+ })] }),
82
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
83
+ control: /* @__PURE__ */ p(c, {}),
84
+ label: h.download.displayName,
85
+ checked: w,
86
+ onChange: () => T(!w)
87
+ }), /* @__PURE__ */ p(d, {
88
+ variant: "smallText1",
89
+ sx: { color: "grey.700" },
90
+ children: h.download.description
91
+ })] }),
92
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(l, {
93
+ control: /* @__PURE__ */ p(c, {}),
94
+ label: h.modify.displayName,
95
+ checked: E,
96
+ onChange: () => D(!E)
97
+ }), /* @__PURE__ */ p(d, {
98
+ variant: "smallText1",
99
+ sx: { color: "grey.700" },
100
+ children: h.modify.description
101
+ })] })
102
+ ]
103
+ })] }),
104
+ O && /* @__PURE__ */ p(e, { error: O }),
105
+ M && /* @__PURE__ */ p(e, { error: M.reason })
106
+ ]
107
+ });
106
108
  return /* @__PURE__ */ p(n, {
107
109
  open: !0,
108
110
  title: "Create New Personal Access Token",
@@ -1 +1 @@
1
- {"version":3,"file":"CreateAccessTokenModal.js","names":[],"sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"sourcesContent":["import { useCreatePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'\nimport {\n AccessTokenGenerationRequest,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport { ChangeEvent, useState } from 'react'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport { CopyToClipboardInput } from '../CopyToClipboardInput/CopyToClipboardInput'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport loadingScreen from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\n\nconst INVALID_INPUT_MSG =\n 'You must provide a token name and at least one permission.'\n\nexport type CreateAccessTokenModalProps = {\n onClose?: () => void\n onCreate?: () => void\n}\n\nexport function CreateAccessTokenModal(props: CreateAccessTokenModalProps) {\n const { onClose = noop, onCreate = noop } = props\n const [tokenName, setTokenName] = useState('')\n const [viewAccess, setViewAccess] = useState(true)\n const [downloadAccess, setDownloadAccess] = useState(false)\n const [modifyAccess, setModifyAccess] = useState(false)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const {\n mutate,\n isPending: createIsPending,\n error: mutationError,\n data: createdTokenResponse,\n } = useCreatePersonalAccessToken()\n\n const handleTokenNameChange = (event: ChangeEvent) => {\n setTokenName((event.target as HTMLInputElement).value)\n }\n\n const validateInput = (tokenName: string, access: boolean[]): boolean => {\n return !!tokenName && access.some(x => x)\n }\n\n const onSubmit = () => {\n if (validateInput(tokenName, [viewAccess, downloadAccess, modifyAccess])) {\n setValidationError(null)\n\n const request: AccessTokenGenerationRequest = {\n scope: [],\n name: tokenName,\n }\n if (viewAccess) request.scope.push('view')\n if (downloadAccess) request.scope.push('download')\n if (modifyAccess) request.scope.push('modify')\n\n mutate(request)\n\n onCreate()\n } else {\n setValidationError(INVALID_INPUT_MSG)\n }\n }\n\n const dialogContent = createdTokenResponse ? (\n <>\n <Typography variant={'body1'}>\n <Typography\n variant={'body1'}\n component={'span'}\n sx={{\n fontWeight: 700,\n }}\n >\n This token will not be able to be retrieved again.\n </Typography>{' '}\n If needed, generate a new personal access token, and delete this one.\n </Typography>\n <div>\n <CopyToClipboardInput\n value={createdTokenResponse.token}\n inputWidth={'350px'}\n />\n </div>\n <Typography variant={'body1'}>\n This token grants access to your account functions and should be treated\n like a password.\n </Typography>\n </>\n ) : (\n <div>\n <TextField\n autoFocus\n label=\"Token Name\"\n value={tokenName}\n onChange={handleTokenNameChange}\n placeholder=\"e.g. Synapse command line access on my laptop\"\n sx={{ mb: 2 }}\n />\n <Typography variant=\"label\">Token Permissions</Typography>\n <Stack\n sx={{\n gap: 2,\n my: 1,\n }}\n >\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.view.displayName}\n checked={viewAccess}\n onChange={() => setViewAccess(!viewAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.view.description}. Required to use Synapse\n programmatic clients.\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.download.displayName}\n checked={downloadAccess}\n onChange={() => setDownloadAccess(!downloadAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.download.description}\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.modify.displayName}\n checked={modifyAccess}\n onChange={() => setModifyAccess(!modifyAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.modify.description}\n </Typography>\n </div>\n </Stack>\n {validationError && <ErrorBanner error={validationError} />}\n {mutationError && <ErrorBanner error={mutationError.reason} />}\n </div>\n )\n\n return (\n <ConfirmationDialog\n open={true}\n title=\"Create New Personal Access Token\"\n content={createIsPending ? loadingScreen : dialogContent}\n confirmButtonProps={{\n children: createdTokenResponse ? 'Close' : 'Create Token',\n variant: createdTokenResponse ? 'outlined' : 'contained',\n }}\n hasCancelButton={!createdTokenResponse}\n onCancel={onClose}\n onConfirm={\n createdTokenResponse\n ? () => onClose()\n : () => {\n void onSubmit()\n }\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,IACJ;AAOF,SAAgB,EAAuB,GAAoC;CACzE,IAAM,EAAE,aAAU,GAAM,cAAW,MAAS,GACtC,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAY,KAAiB,EAAS,GAAK,EAC5C,CAAC,GAAgB,KAAqB,EAAS,GAAM,EACrD,CAAC,GAAc,KAAmB,EAAS,GAAM,EAEjD,CAAC,GAAiB,KAAsB,EAAwB,KAAK,EAErE,EACJ,WACA,WAAW,GACX,OAAO,GACP,MAAM,MACJ,GAA8B,EAE5B,KAAyB,MAAuB;AACpD,IAAc,EAAM,OAA4B,MAAM;IAGlD,KAAiB,GAAmB,MACjC,CAAC,CAAC,KAAa,EAAO,MAAK,MAAK,EAAE,EAGrC,UAAiB;AACrB,MAAI,EAAc,GAAW;GAAC;GAAY;GAAgB;GAAa,CAAC,EAAE;AACxE,KAAmB,KAAK;GAExB,IAAM,IAAwC;IAC5C,OAAO,EAAE;IACT,MAAM;IACP;AAOD,GANI,KAAY,EAAQ,MAAM,KAAK,OAAO,EACtC,KAAgB,EAAQ,MAAM,KAAK,WAAW,EAC9C,KAAc,EAAQ,MAAM,KAAK,SAAS,EAE9C,EAAO,EAAQ,EAEf,GAAU;QAEV,GAAmB,EAAkB;IAInC,IAAgB,IACpB,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IACE,kBAAC,GAAD;KACE,SAAS;KACT,WAAW;KACX,IAAI,EACF,YAAY,KACb;eACF;KAEY,CAAA;IAAC;IAAI;IAEP;;EACb,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;GACE,OAAO,EAAqB;GAC5B,YAAY;GACZ,CAAA,EACE,CAAA;EACN,kBAAC,GAAD;GAAY,SAAS;aAAS;GAGjB,CAAA;EACZ,EAAA,CAAA,GAEH,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,WAAA;GACA,OAAM;GACN,OAAO;GACP,UAAU;GACV,aAAY;GACZ,IAAI,EAAE,IAAI,GAAG;GACb,CAAA;EACF,kBAAC,GAAD;GAAY,SAAQ;aAAQ;GAA8B,CAAA;EAC1D,kBAAC,GAAD;GACE,IAAI;IACF,KAAK;IACL,IAAI;IACL;aAJH;IAME,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAY,CAAA;KACrB,OAAO,EAAkB,KAAK;KAC9B,SAAS;KACT,gBAAgB,EAAc,CAAC,EAAW;KAC1C,CAAA,EACF,kBAAC,GAAD;KACE,SAAS;KACT,IAAI,EACF,OAAO,YACR;eAJH,CAMG,EAAkB,KAAK,aAAY,kDAEzB;OACT,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAY,CAAA;KACrB,OAAO,EAAkB,SAAS;KAClC,SAAS;KACT,gBAAgB,EAAkB,CAAC,EAAe;KAClD,CAAA,EACF,kBAAC,GAAD;KACE,SAAS;KACT,IAAI,EACF,OAAO,YACR;eAEA,EAAkB,SAAS;KACjB,CAAA,CACT,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAY,CAAA;KACrB,OAAO,EAAkB,OAAO;KAChC,SAAS;KACT,gBAAgB,EAAgB,CAAC,EAAa;KAC9C,CAAA,EACF,kBAAC,GAAD;KACE,SAAS;KACT,IAAI,EACF,OAAO,YACR;eAEA,EAAkB,OAAO;KACf,CAAA,CACT,EAAA,CAAA;IACA;;EACP,KAAmB,kBAAC,GAAD,EAAa,OAAO,GAAmB,CAAA;EAC1D,KAAiB,kBAAC,GAAD,EAAa,OAAO,EAAc,QAAU,CAAA;EAC1D,EAAA,CAAA;AAGR,QACE,kBAAC,GAAD;EACE,MAAM;EACN,OAAM;EACN,SAAS,IAAkB,IAAgB;EAC3C,oBAAoB;GAClB,UAAU,IAAuB,UAAU;GAC3C,SAAS,IAAuB,aAAa;GAC9C;EACD,iBAAiB,CAAC;EAClB,UAAU;EACV,WACE,UACU,GAAS,SACT;AACC,MAAU;;EAGvB,CAAA"}
1
+ {"version":3,"file":"CreateAccessTokenModal.js","names":[],"sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"sourcesContent":["import { useCreatePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'\nimport {\n AccessTokenGenerationRequest,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport { ChangeEvent, useState } from 'react'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport { CopyToClipboardInput } from '../CopyToClipboardInput/CopyToClipboardInput'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport loadingScreen from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\n\nconst INVALID_INPUT_MSG =\n 'You must provide a token name and at least one permission.'\n\nexport type CreateAccessTokenModalProps = {\n onClose?: () => void\n onCreate?: () => void\n}\n\nexport function CreateAccessTokenModal(props: CreateAccessTokenModalProps) {\n const { onClose = noop, onCreate = noop } = props\n const [tokenName, setTokenName] = useState('')\n const [viewAccess, setViewAccess] = useState(true)\n const [downloadAccess, setDownloadAccess] = useState(false)\n const [modifyAccess, setModifyAccess] = useState(false)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const {\n mutate,\n isPending: createIsPending,\n error: mutationError,\n data: createdTokenResponse,\n } = useCreatePersonalAccessToken()\n\n const handleTokenNameChange = (event: ChangeEvent) => {\n setTokenName((event.target as HTMLInputElement).value)\n }\n\n const validateInput = (tokenName: string, access: boolean[]): boolean => {\n return !!tokenName && access.some(x => x)\n }\n\n const onSubmit = () => {\n if (validateInput(tokenName, [viewAccess, downloadAccess, modifyAccess])) {\n setValidationError(null)\n\n const request: AccessTokenGenerationRequest = {\n scope: [],\n name: tokenName,\n }\n if (viewAccess) request.scope.push('view')\n if (downloadAccess) request.scope.push('download')\n if (modifyAccess) request.scope.push('modify')\n\n mutate(request)\n\n onCreate()\n } else {\n setValidationError(INVALID_INPUT_MSG)\n }\n }\n\n const dialogContent = createdTokenResponse ? (\n <>\n <Typography variant={'body1'}>\n <Typography\n variant={'body1'}\n component={'span'}\n sx={{\n fontWeight: 700,\n }}\n >\n This token will not be able to be retrieved again.\n </Typography>{' '}\n If needed, generate a new personal access token, and delete this one.\n </Typography>\n <div>\n <CopyToClipboardInput\n value={createdTokenResponse.token}\n inputWidth={'350px'}\n />\n </div>\n <Typography variant={'body1'}>\n This token grants access to your account functions and should be treated\n like a password.\n </Typography>\n </>\n ) : (\n <Stack gap={2}>\n <TextField\n autoFocus\n label=\"Token Name\"\n value={tokenName}\n onChange={handleTokenNameChange}\n placeholder=\"e.g. Synapse command line access on my laptop\"\n sx={{ mb: 2 }}\n />\n <div>\n <Typography variant=\"label\">Token Permissions</Typography>\n <Stack\n sx={{\n gap: 2,\n my: 1,\n }}\n >\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.view.displayName}\n checked={viewAccess}\n onChange={() => setViewAccess(!viewAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.view.description}. Required to use Synapse\n programmatic clients.\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.download.displayName}\n checked={downloadAccess}\n onChange={() => setDownloadAccess(!downloadAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.download.description}\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.modify.displayName}\n checked={modifyAccess}\n onChange={() => setModifyAccess(!modifyAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.modify.description}\n </Typography>\n </div>\n </Stack>\n </div>\n {validationError && <ErrorBanner error={validationError} />}\n {mutationError && <ErrorBanner error={mutationError.reason} />}\n </Stack>\n )\n\n return (\n <ConfirmationDialog\n open={true}\n title=\"Create New Personal Access Token\"\n content={createIsPending ? loadingScreen : dialogContent}\n confirmButtonProps={{\n children: createdTokenResponse ? 'Close' : 'Create Token',\n variant: createdTokenResponse ? 'outlined' : 'contained',\n }}\n hasCancelButton={!createdTokenResponse}\n onCancel={onClose}\n onConfirm={\n createdTokenResponse\n ? () => onClose()\n : () => {\n void onSubmit()\n }\n }\n />\n )\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { TextFieldProps } from '@mui/material';
1
+ import { TextFieldProps } from '../TextField';
2
2
  export default function PasswordField(props: TextFieldProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=PasswordField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordField.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/PasswordField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,cAAc,2CAY1D"}
1
+ {"version":3,"file":"PasswordField.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/PasswordField.tsx"],"names":[],"mappings":"AAAA,OAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAExD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,cAAc,2CAY1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordField.js","names":[],"sources":["../../../src/components/Authentication/PasswordField.tsx"],"sourcesContent":["import TextField from '../TextField'\nimport { TextFieldProps } from '@mui/material'\n\nexport default function PasswordField(props: TextFieldProps) {\n return (\n <TextField\n required\n fullWidth\n autoComplete=\"current-password\"\n label=\"Password\"\n id=\"current-password\"\n type=\"password\"\n {...props}\n />\n )\n}\n"],"mappings":";;;AAGA,SAAwB,EAAc,GAAuB;AAC3D,QACE,kBAAC,GAAD;EACE,UAAA;EACA,WAAA;EACA,cAAa;EACb,OAAM;EACN,IAAG;EACH,MAAK;EACL,GAAI;EACJ,CAAA"}
1
+ {"version":3,"file":"PasswordField.js","names":[],"sources":["../../../src/components/Authentication/PasswordField.tsx"],"sourcesContent":["import TextField, { TextFieldProps } from '../TextField'\n\nexport default function PasswordField(props: TextFieldProps) {\n return (\n <TextField\n required\n fullWidth\n autoComplete=\"current-password\"\n label=\"Password\"\n id=\"current-password\"\n type=\"password\"\n {...props}\n />\n )\n}\n"],"mappings":";;;AAEA,SAAwB,EAAc,GAAuB;AAC3D,QACE,kBAAC,GAAD;EACE,UAAA;EACA,WAAA;EACA,cAAa;EACb,OAAM;EACN,IAAG;EACH,MAAK;EACL,GAAI;EACJ,CAAA"}