synapse-react-client 4.0.17 → 4.0.19

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 (297) hide show
  1. package/README.md +5 -3
  2. package/dist/SWC.index.d.ts +2 -0
  3. package/dist/SWC.index.d.ts.map +1 -1
  4. package/dist/SWC.index.js +3 -1
  5. package/dist/SWC.index.js.map +1 -1
  6. package/dist/assets/homepage/BlinkingLiveIcon.d.ts +1 -1
  7. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  8. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  9. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  10. package/dist/components/AccessRequirementList/RequirementItem/CertificationRequirement.js.map +1 -1
  11. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  12. package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
  13. package/dist/components/AccessRequirementList/RequirementItem/ValidationRequirement.js.map +1 -1
  14. package/dist/components/AccessTokenPage/CreateAccessTokenModal.d.ts.map +1 -1
  15. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +56 -54
  16. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  17. package/dist/components/Authentication/PasswordField.d.ts +1 -1
  18. package/dist/components/Authentication/PasswordField.d.ts.map +1 -1
  19. package/dist/components/Authentication/PasswordField.js.map +1 -1
  20. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  21. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +1 -2
  22. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  23. package/dist/components/Authentication/UsernamePasswordForm.d.ts.map +1 -1
  24. package/dist/components/Authentication/UsernamePasswordForm.js +32 -29
  25. package/dist/components/Authentication/UsernamePasswordForm.js.map +1 -1
  26. package/dist/components/CardContainer/CardLink.d.ts +2 -2
  27. package/dist/components/CardContainer/CardLink.d.ts.map +1 -1
  28. package/dist/components/CardDeck/CardDeckCardProps.d.ts.map +1 -1
  29. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  30. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.d.ts.map +1 -1
  31. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +106 -103
  32. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  33. package/dist/components/ChallengeTeamWizard/MembershipRequestForm.d.ts.map +1 -1
  34. package/dist/components/ChallengeTeamWizard/MembershipRequestForm.js.map +1 -1
  35. package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.d.ts.map +1 -1
  36. package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.js.map +1 -1
  37. package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
  38. package/dist/components/CreateProjectModal/CreateProjectModal.js +4 -4
  39. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  40. package/dist/components/CreateTableViewWizard/TableNameForm.js +6 -6
  41. package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
  42. package/dist/components/CrispChat/CrispChat.js +4 -4
  43. package/dist/components/CrispChat/CrispChat.js.map +1 -1
  44. package/dist/components/DataExplorer/DataExplorer.css +1 -0
  45. package/dist/components/DataExplorer/DataExplorer.d.ts +13 -0
  46. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -0
  47. package/dist/components/DataExplorer/DataExplorer.js +119 -0
  48. package/dist/components/DataExplorer/DataExplorer.js.map +1 -0
  49. package/dist/components/DataExplorer/DataExplorer.module.js +22 -0
  50. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -0
  51. package/dist/components/DataExplorer/DataExplorer.module.scss +156 -0
  52. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  53. package/dist/components/DataGrid/columns/AutocompleteColumn.js +106 -102
  54. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  55. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  56. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +97 -89
  57. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  58. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +19 -8
  59. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -1
  60. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +64 -43
  61. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -1
  62. package/dist/components/DataGrid/components/UploadCsvToGridDialog.d.ts.map +1 -1
  63. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +9 -9
  64. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  65. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
  66. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +8 -1
  67. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  68. package/dist/components/DataGrid/utils/json-rx/JsonRxResponseComplete.js.map +1 -1
  69. package/dist/components/DownloadCart/RequestDownloadCard.js +14 -14
  70. package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
  71. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  72. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  73. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
  74. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  75. package/dist/components/EntityCitation/EntityCitationUtils.js.map +1 -1
  76. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  77. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  78. package/dist/components/EntityFinder/EntityIdTextField.d.ts +17 -0
  79. package/dist/components/EntityFinder/EntityIdTextField.d.ts.map +1 -0
  80. package/dist/components/EntityFinder/EntityIdTextField.js +35 -0
  81. package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -0
  82. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.d.ts.map +1 -1
  83. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js +22 -16
  84. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js.map +1 -1
  85. package/dist/components/FeaturedDataTabs/FacetPlotsCardGrid.js.map +1 -1
  86. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  87. package/dist/components/FullWidthAlert/FullWidthAlert.d.ts.map +1 -1
  88. package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
  89. package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.d.ts.map +1 -1
  90. package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.js.map +1 -1
  91. package/dist/components/Markdown/widget/MarkdownSynapsePlot.js.map +1 -1
  92. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  93. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  94. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  95. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  96. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +1 -1
  97. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
  98. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +1 -1
  99. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
  100. package/dist/components/PortalList/CreatePortalModal.d.ts.map +1 -1
  101. package/dist/components/PortalList/CreatePortalModal.js +34 -33
  102. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  103. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  104. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +67 -65
  105. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  106. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  107. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  108. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
  109. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  110. package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
  111. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  112. package/dist/components/Resources/Resources.Desktop.js.map +1 -1
  113. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  114. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
  115. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  116. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
  117. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  118. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.d.ts.map +1 -1
  119. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  120. package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.d.ts.map +1 -1
  121. package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js.map +1 -1
  122. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
  123. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  124. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts +1 -1
  125. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts.map +1 -1
  126. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  127. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  128. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
  129. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +1 -1
  130. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  131. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  132. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  133. package/dist/components/SynapseTable/SynapseTableUtils.d.ts.map +1 -1
  134. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  135. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  136. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +9 -9
  137. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  138. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js +4 -4
  139. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.d.ts.map +1 -1
  140. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +25 -25
  141. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  142. package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
  143. package/dist/components/TextField/TextField.css +1 -1
  144. package/dist/components/TextField/TextField.d.ts +14 -3
  145. package/dist/components/TextField/TextField.d.ts.map +1 -1
  146. package/dist/components/TextField/TextField.js +41 -43
  147. package/dist/components/TextField/TextField.js.map +1 -1
  148. package/dist/components/TextField/TextField.module.js +3 -4
  149. package/dist/components/TextField/TextField.module.js.map +1 -1
  150. package/dist/components/TextField/TextField.module.scss +18 -10
  151. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.d.ts.map +1 -1
  152. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js +20 -16
  153. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  154. package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
  155. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  156. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Desktop.js.map +1 -1
  157. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  158. package/dist/components/UserSearchBox/UserSearchBox.d.ts.map +1 -1
  159. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  160. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  161. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  162. package/dist/components/doi/CreateOrUpdateDoiModal.js +13 -13
  163. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  164. package/dist/components/entity/page/title_bar/TitleBarProperties.js +23 -23
  165. package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +1 -1
  166. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  167. package/dist/components/index.js +17 -17
  168. package/dist/components/styled/StyledFormControl.d.ts +15 -0
  169. package/dist/components/styled/StyledFormControl.d.ts.map +1 -1
  170. package/dist/components/styled/StyledFormControl.js +1 -0
  171. package/dist/components/styled/StyledFormControl.js.map +1 -1
  172. package/dist/components/styled/index.js +3 -3
  173. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts +18 -0
  174. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts.map +1 -0
  175. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +116 -0
  176. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js.map +1 -0
  177. package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts +5 -5
  178. package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts.map +1 -1
  179. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +27 -76
  180. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  181. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts +19 -0
  182. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts.map +1 -0
  183. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +41 -0
  184. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -0
  185. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts +12 -0
  186. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts.map +1 -0
  187. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js +25 -0
  188. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js.map +1 -0
  189. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts +18 -0
  190. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts.map +1 -0
  191. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js +55 -0
  192. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js.map +1 -0
  193. package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts +19 -0
  194. package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts.map +1 -0
  195. package/dist/components/table/CsvPreview/useCreateTableFromCsv.js +35 -0
  196. package/dist/components/table/CsvPreview/useCreateTableFromCsv.js.map +1 -0
  197. package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts +22 -0
  198. package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts.map +1 -0
  199. package/dist/components/table/CsvPreview/useCsvUploadPreview.js +32 -0
  200. package/dist/components/table/CsvPreview/useCsvUploadPreview.js.map +1 -0
  201. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts +14 -0
  202. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts.map +1 -0
  203. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js +23 -0
  204. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js.map +1 -0
  205. package/dist/components/utils/ConditionalWrapper.d.ts.map +1 -1
  206. package/dist/components/utils/ConditionalWrapper.js.map +1 -1
  207. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  208. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  209. package/dist/components/widgets/facet-nav/FacetNavPanel.js +69 -62
  210. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  211. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +1 -0
  212. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  213. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +27 -26
  214. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  215. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts +1 -0
  216. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts.map +1 -1
  217. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js +2 -1
  218. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js.map +1 -1
  219. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
  220. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  221. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +44 -43
  222. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  223. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts +13 -0
  224. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -0
  225. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +398 -0
  226. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -0
  227. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  228. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -19
  229. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  230. package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
  231. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +49 -25
  232. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
  233. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts +0 -1
  234. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts.map +1 -1
  235. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js +20 -22
  236. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  237. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  238. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +25 -27
  239. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  240. package/dist/features/entity/metadata-task/utils/constants.d.ts +29 -0
  241. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  242. package/dist/features/entity/metadata-task/utils/constants.js +2 -2
  243. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  244. package/dist/index.js +17 -17
  245. package/dist/mockServiceWorker.js +6 -8
  246. package/dist/mocks/curation/mockCurationTask.d.ts +2 -2
  247. package/dist/mocks/curation/mockCurationTask.d.ts.map +1 -1
  248. package/dist/mocks/curation/mockCurationTask.js +9 -5
  249. package/dist/mocks/curation/mockCurationTask.js.map +1 -1
  250. package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts +1 -1
  251. package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts.map +1 -1
  252. package/dist/mocks/msw/handlers/featureFlagHandlers.js +1 -1
  253. package/dist/mocks/msw/handlers/featureFlagHandlers.js.map +1 -1
  254. package/dist/style/components/_cards.scss +0 -3
  255. package/dist/style/components/_data-grid-extra.scss +2 -2
  256. package/dist/style/components/_login.scss +6 -2
  257. package/dist/style/main.css +1 -1
  258. package/dist/synapse-client/SynapseClient.d.ts +2 -1
  259. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  260. package/dist/synapse-client/SynapseClient.js.map +1 -1
  261. package/dist/synapse-queries/QueryFilterUtils.js.map +1 -1
  262. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -0
  263. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  264. package/dist/synapse-queries/curation/task/useCurationTask.js +16 -6
  265. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  266. package/dist/synapse-queries/dataaccess/useAccessRequirements.d.ts.map +1 -1
  267. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  268. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  269. package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts +1 -1
  270. package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts.map +1 -1
  271. package/dist/synapse-queries/featureflags/useGetFeatureFlag.js.map +1 -1
  272. package/dist/synapse-queries/file/useFiles.d.ts.map +1 -1
  273. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  274. package/dist/synapse-queries/termsOfService/useTermsOfService.d.ts.map +1 -1
  275. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  276. package/dist/synapse-queries/user/useGetUserChallenges.d.ts.map +1 -1
  277. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  278. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  279. package/dist/theme/palette/Palettes.d.ts +2 -2
  280. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  281. package/dist/theme/palette/Palettes.js +2 -2
  282. package/dist/theme/palette/Palettes.js.map +1 -1
  283. package/dist/tsconfig.build.tsbuildinfo +1 -1
  284. package/dist/types/ThemeTypes.d.ts +5 -6
  285. package/dist/utils/AppUtils/session/SynapseSessionManager.d.ts.map +1 -1
  286. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  287. package/dist/utils/featureflag/FeatureFlags.d.ts +13 -0
  288. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -0
  289. package/dist/utils/featureflag/FeatureFlags.js +8 -0
  290. package/dist/utils/featureflag/FeatureFlags.js.map +1 -0
  291. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  292. package/dist/utils/functions/queryUtils.js.map +1 -1
  293. package/dist/utils/hooks/useGetInfoFromIds.d.ts.map +1 -1
  294. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  295. package/dist/utils/slots/SlotUtils.d.ts.map +1 -1
  296. package/dist/utils/slots/SlotUtils.js.map +1 -1
  297. package/package.json +5 -6
@@ -1 +1 @@
1
- {"version":3,"file":"EntityCitationUtils.js","names":[],"sources":["../../../src/components/EntityCitation/EntityCitationUtils.ts"],"sourcesContent":["import { useGetDOIAssociation } from '@/synapse-queries/doi/useDOI'\nimport { isVersionableEntity } from '@/utils/functions/EntityTypeUtils'\nimport { DoiObjectType } from '@sage-bionetworks/synapse-client'\nimport { EntityBundle } from '@sage-bionetworks/synapse-types'\n\nexport function useGetEntityDoiAssociation(\n entityId?: string,\n versionNumber?: number,\n projectId?: string,\n bundle?: EntityBundle,\n) {\n const useFallbackVersionlessDOI =\n bundle &&\n !bundle.doiAssociation &&\n isVersionableEntity(bundle.entity) &&\n bundle.entity.isLatestVersion\n\n // Try fetching the versioned DOI first\n const { data: versionedDoiAssociation } = useGetDOIAssociation(\n {\n id: entityId!,\n version: versionNumber,\n type: DoiObjectType.ENTITY,\n },\n {\n enabled: !!entityId && !!versionNumber,\n },\n )\n\n // If the versioned DOI is not found, fallback to the versionless DOI so we can still show a DOI if it exists.\n // We do not want to show the versionless DOI if the entity is not the latest version as it would be misleading.\n const { data: versionlessDoiAssociation } = useGetDOIAssociation(\n {\n id: entityId!,\n version: undefined,\n type: DoiObjectType.ENTITY,\n },\n {\n enabled: useFallbackVersionlessDOI,\n },\n )\n\n const doiAssociation =\n projectId === entityId\n ? undefined\n : versionedDoiAssociation ?? versionlessDoiAssociation\n\n return doiAssociation\n}\n"],"mappings":";;;;AAKA,SAAgB,EACd,GACA,GACA,GACA,GACA;CACA,IAAM,IACJ,KACA,CAAC,EAAO,kBACR,EAAoB,EAAO,OAAO,IAClC,EAAO,OAAO,iBAGV,EAAE,MAAM,MAA4B,EACxC;EACE,IAAI;EACJ,SAAS;EACT,MAAM,EAAc;EACrB,EACD,EACE,SAAS,CAAC,CAAC,KAAY,CAAC,CAAC,GAC1B,CACF,EAIK,EAAE,MAAM,MAA8B,EAC1C;EACE,IAAI;EACJ,SAAS,KAAA;EACT,MAAM,EAAc;EACrB,EACD,EACE,SAAS,GACV,CACF;AAOD,QAJE,MAAc,IACV,KAAA,IACA,KAA2B"}
1
+ {"version":3,"file":"EntityCitationUtils.js","names":[],"sources":["../../../src/components/EntityCitation/EntityCitationUtils.ts"],"sourcesContent":["import { useGetDOIAssociation } from '@/synapse-queries/doi/useDOI'\nimport { isVersionableEntity } from '@/utils/functions/EntityTypeUtils'\nimport { DoiObjectType } from '@sage-bionetworks/synapse-client'\nimport { EntityBundle } from '@sage-bionetworks/synapse-types'\n\nexport function useGetEntityDoiAssociation(\n entityId?: string,\n versionNumber?: number,\n projectId?: string,\n bundle?: EntityBundle,\n) {\n const useFallbackVersionlessDOI =\n bundle &&\n !bundle.doiAssociation &&\n isVersionableEntity(bundle.entity) &&\n bundle.entity.isLatestVersion\n\n // Try fetching the versioned DOI first\n const { data: versionedDoiAssociation } = useGetDOIAssociation(\n {\n id: entityId!,\n version: versionNumber,\n type: DoiObjectType.ENTITY,\n },\n {\n enabled: !!entityId && !!versionNumber,\n },\n )\n\n // If the versioned DOI is not found, fallback to the versionless DOI so we can still show a DOI if it exists.\n // We do not want to show the versionless DOI if the entity is not the latest version as it would be misleading.\n const { data: versionlessDoiAssociation } = useGetDOIAssociation(\n {\n id: entityId!,\n version: undefined,\n type: DoiObjectType.ENTITY,\n },\n {\n enabled: useFallbackVersionlessDOI,\n },\n )\n\n const doiAssociation =\n projectId === entityId\n ? undefined\n : (versionedDoiAssociation ?? versionlessDoiAssociation)\n\n return doiAssociation\n}\n"],"mappings":";;;;AAKA,SAAgB,EACd,GACA,GACA,GACA,GACA;CACA,IAAM,IACJ,KACA,CAAC,EAAO,kBACR,EAAoB,EAAO,OAAO,IAClC,EAAO,OAAO,iBAGV,EAAE,MAAM,MAA4B,EACxC;EACE,IAAI;EACJ,SAAS;EACT,MAAM,EAAc;EACrB,EACD,EACE,SAAS,CAAC,CAAC,KAAY,CAAC,CAAC,GAC1B,CACF,EAIK,EAAE,MAAM,MAA8B,EAC1C;EACE,IAAI;EACJ,SAAS,KAAA;EACT,MAAM,EAAc;EACrB,EACD,EACE,SAAS,GACV,CACF;AAOD,QAJE,MAAc,IACV,KAAA,IACC,KAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDownloadConfirmation.js","names":[],"sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport DownloadConfirmationUI from '@/components/download_list/DownloadConfirmationUI'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useSynapseContext } from '@/utils'\nimport {\n AddToDownloadListRequest,\n EntityType,\n} from '@sage-bionetworks/synapse-client'\nimport { useEffect, useMemo } from 'react'\nimport { useGetEntity } from '../../synapse-queries/'\n\n/**\n * Props for the EntityDownloadConfirmation component.\n *\n * @property entityId - The ID of the entity to be added to the download cart.\n */\nexport type EntityDownloadConfirmationProps = {\n entityId: string\n versionNumber?: number\n onIsLoadingChange: (isLoading: boolean) => void\n handleClose: () => void\n}\n\nconst typesToAddToDownloadListWithParentId: EntityType[] = [\n EntityType.project,\n EntityType.folder,\n EntityType.dataset,\n EntityType.datasetcollection,\n]\nconst typesToAddToDownloadListWithQuery: EntityType[] = [EntityType.entityview]\n/** Users expect the specific file version included in the dataset to be added to the cart */\nconst typesWhereFileVersionNumberShouldBeUsed: EntityType[] = [\n EntityType.dataset,\n EntityType.datasetcollection,\n]\n\n/**\n * A component that allows users to add an entity to the download cart. It displays a confirmation dialog that displays\n * statistics about the set of items that will be added to the download cart.\n *\n * @param props - The properties for the component.\n * @param props.entityId - The ID of the entity to be added to the download cart.\n *\n * @returns The rendered EntityDownloadConfirmation component.\n */\nexport function EntityDownloadConfirmation({\n entityId,\n versionNumber,\n handleClose,\n onIsLoadingChange,\n}: EntityDownloadConfirmationProps) {\n const { isAuthenticated } = useSynapseContext()\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(\n isAuthenticated ? entityId : undefined,\n )\n const entityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n useEffect(() => {\n onIsLoadingChange(isLoadingEntity)\n }, [isLoadingEntity, onIsLoadingChange])\n\n const addToDownloadListRequest: AddToDownloadListRequest | null =\n useMemo(() => {\n if (!entityType) {\n return null\n }\n if (typesToAddToDownloadListWithQuery.includes(entityType)) {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n query: {\n sql: `select * from ${entityId}${\n versionNumber != undefined ? `.${versionNumber}` : ''\n }`,\n },\n }\n }\n if (typesToAddToDownloadListWithParentId.includes(entityType)) {\n const useVersionNumber =\n typesWhereFileVersionNumberShouldBeUsed.includes(entityType)\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n // TODO: Specify version of dataset/dataset collection (PLFM-9311)\n parentId: entityId,\n useVersionNumber,\n recursive: isContainerType(entityType),\n }\n }\n\n return null\n }, [entityType, entityId, versionNumber])\n\n if (!addToDownloadListRequest) {\n if (!isAuthenticated) {\n return (\n <div>\n <DownloadConfirmationUI\n onAddToDownloadCart={() => {\n \t// Only displaying UI to prompt sign-in, so no-op is OK\n }}\n onCancel={handleClose}\n />\n </div>\n )\n }\n return null\n }\n\n return (\n <div>\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={handleClose}\n />\n </div>\n )\n}\n\nexport default EntityDownloadConfirmation\n"],"mappings":";;;;;;;;;;;AA0BA,IAAM,IAAqD;CACzD,EAAW;CACX,EAAW;CACX,EAAW;CACX,EAAW;CACZ,EACK,IAAkD,CAAC,EAAW,WAAW,EAEzE,IAAwD,CAC5D,EAAW,SACX,EAAW,kBACZ;AAWD,SAAgB,EAA2B,EACzC,aACA,kBACA,gBACA,wBACkC;CAClC,IAAM,EAAE,uBAAoB,GAAmB,EACzC,EAAE,MAAM,GAAQ,WAAW,MAAoB,EACnD,IAAkB,IAAW,KAAA,EAC9B,EACK,IAAa,GAAQ,eACvB,EAAoB,EAAO,aAAa,GACxC,KAAA;AAEJ,SAAgB;AACd,IAAkB,EAAgB;IACjC,CAAC,GAAiB,EAAkB,CAAC;CAExC,IAAM,IACJ,QACO,IAGD,EAAkC,SAAS,EAAW,GACjD;EACL,cACE;EACF,OAAO,EACL,KAAK,iBAAiB,IACpB,KAAiB,OAAkC,KAAtB,IAAI,OAEpC;EACF,GAEC,EAAqC,SAAS,EAAW,GAGpD;EACL,cACE;EAEF,UAAU;EACV,kBANA,EAAwC,SAAS,EAMjD;EACA,WAAW,EAAgB,EAAW;EACvC,GAGI,OA1BE,MA2BR;EAAC;EAAY;EAAU;EAAc,CAAC;AAkB3C,QAhBK,IAiBH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EAC4B;EAC1B,SAAS;EACT,CAAA,EACE,CAAA,GArBD,IAYE,OAVH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EACE,2BAA2B;EAG3B,UAAU;EACV,CAAA,EACE,CAAA"}
1
+ {"version":3,"file":"EntityDownloadConfirmation.js","names":[],"sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport DownloadConfirmationUI from '@/components/download_list/DownloadConfirmationUI'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useSynapseContext } from '@/utils'\nimport {\n AddToDownloadListRequest,\n EntityType,\n} from '@sage-bionetworks/synapse-client'\nimport { useEffect, useMemo } from 'react'\nimport { useGetEntity } from '../../synapse-queries/'\n\n/**\n * Props for the EntityDownloadConfirmation component.\n *\n * @property entityId - The ID of the entity to be added to the download cart.\n */\nexport type EntityDownloadConfirmationProps = {\n entityId: string\n versionNumber?: number\n onIsLoadingChange: (isLoading: boolean) => void\n handleClose: () => void\n}\n\nconst typesToAddToDownloadListWithParentId: EntityType[] = [\n EntityType.project,\n EntityType.folder,\n EntityType.dataset,\n EntityType.datasetcollection,\n]\nconst typesToAddToDownloadListWithQuery: EntityType[] = [EntityType.entityview]\n/** Users expect the specific file version included in the dataset to be added to the cart */\nconst typesWhereFileVersionNumberShouldBeUsed: EntityType[] = [\n EntityType.dataset,\n EntityType.datasetcollection,\n]\n\n/**\n * A component that allows users to add an entity to the download cart. It displays a confirmation dialog that displays\n * statistics about the set of items that will be added to the download cart.\n *\n * @param props - The properties for the component.\n * @param props.entityId - The ID of the entity to be added to the download cart.\n *\n * @returns The rendered EntityDownloadConfirmation component.\n */\nexport function EntityDownloadConfirmation({\n entityId,\n versionNumber,\n handleClose,\n onIsLoadingChange,\n}: EntityDownloadConfirmationProps) {\n const { isAuthenticated } = useSynapseContext()\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(\n isAuthenticated ? entityId : undefined,\n )\n const entityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n useEffect(() => {\n onIsLoadingChange(isLoadingEntity)\n }, [isLoadingEntity, onIsLoadingChange])\n\n const addToDownloadListRequest: AddToDownloadListRequest | null =\n useMemo(() => {\n if (!entityType) {\n return null\n }\n if (typesToAddToDownloadListWithQuery.includes(entityType)) {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n query: {\n sql: `select * from ${entityId}${\n versionNumber != undefined ? `.${versionNumber}` : ''\n }`,\n },\n }\n }\n if (typesToAddToDownloadListWithParentId.includes(entityType)) {\n const useVersionNumber =\n typesWhereFileVersionNumberShouldBeUsed.includes(entityType)\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n // TODO: Specify version of dataset/dataset collection (PLFM-9311)\n parentId: entityId,\n useVersionNumber,\n recursive: isContainerType(entityType),\n }\n }\n\n return null\n }, [entityType, entityId, versionNumber])\n\n if (!addToDownloadListRequest) {\n if (!isAuthenticated) {\n return (\n <div>\n <DownloadConfirmationUI\n onAddToDownloadCart={() => {\n // Only displaying UI to prompt sign-in, so no-op is OK\n }}\n onCancel={handleClose}\n />\n </div>\n )\n }\n return null\n }\n\n return (\n <div>\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={handleClose}\n />\n </div>\n )\n}\n\nexport default EntityDownloadConfirmation\n"],"mappings":";;;;;;;;;;;AA0BA,IAAM,IAAqD;CACzD,EAAW;CACX,EAAW;CACX,EAAW;CACX,EAAW;CACZ,EACK,IAAkD,CAAC,EAAW,WAAW,EAEzE,IAAwD,CAC5D,EAAW,SACX,EAAW,kBACZ;AAWD,SAAgB,EAA2B,EACzC,aACA,kBACA,gBACA,wBACkC;CAClC,IAAM,EAAE,uBAAoB,GAAmB,EACzC,EAAE,MAAM,GAAQ,WAAW,MAAoB,EACnD,IAAkB,IAAW,KAAA,EAC9B,EACK,IAAa,GAAQ,eACvB,EAAoB,EAAO,aAAa,GACxC,KAAA;AAEJ,SAAgB;AACd,IAAkB,EAAgB;IACjC,CAAC,GAAiB,EAAkB,CAAC;CAExC,IAAM,IACJ,QACO,IAGD,EAAkC,SAAS,EAAW,GACjD;EACL,cACE;EACF,OAAO,EACL,KAAK,iBAAiB,IACpB,KAAiB,OAAkC,KAAtB,IAAI,OAEpC;EACF,GAEC,EAAqC,SAAS,EAAW,GAGpD;EACL,cACE;EAEF,UAAU;EACV,kBANA,EAAwC,SAAS,EAMjD;EACA,WAAW,EAAgB,EAAW;EACvC,GAGI,OA1BE,MA2BR;EAAC;EAAY;EAAU;EAAc,CAAC;AAkB3C,QAhBK,IAiBH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EAC4B;EAC1B,SAAS;EACT,CAAA,EACE,CAAA,GArBD,IAYE,OAVH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EACE,2BAA2B;EAG3B,UAAU;EACV,CAAA,EACE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFinder.js","names":[],"sources":["../../../src/components/EntityFinder/EntityFinder.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getEntityTypeFromHeader } from '@/utils/functions/EntityTypeUtils'\nimport { parseSynId } from '@/utils/functions/RegularExpressions'\nimport ClearIcon from '@mui/icons-material/Clear'\nimport SearchIcon from '@mui/icons-material/Search'\nimport {\n Box,\n Chip,\n IconButton,\n InputAdornment,\n Stack,\n Tab,\n Tabs,\n TextField,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { KeyValue, Reference } from '@sage-bionetworks/synapse-types'\nimport { Map } from 'immutable'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { ReflexContainer, ReflexElement, ReflexSplitter } from 'react-reflex'\nimport 'react-reflex/styles.css'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { BreadcrumbItem, Breadcrumbs, BreadcrumbsProps } from './Breadcrumbs'\nimport {\n EntityDetailsList,\n EntityDetailsListDataConfiguration,\n EntityDetailsListDataConfigurationType,\n EntityDetailsListProps,\n} from './details/EntityDetailsList'\nimport { EntityFinderHeader } from './EntityFinderHeader'\nimport { EntityTree, EntityTreeContainer, FinderScope } from './tree/EntityTree'\nimport { EntityTreeNodeType } from './tree/VirtualizedTree'\nimport { useEntitySelection } from './useEntitySelection'\nimport { VersionSelectionType } from './VersionSelectionType'\n\nconst DEFAULT_SELECTABLE_TYPES = Object.values(EntityType)\nconst TABLE_DEFAULT_VISIBLE_TYPES = Object.values(EntityType)\nconst TREE_DEFAULT_VISIBLE_TYPES = [EntityType.project, EntityType.folder]\n\nconst searchForOnlyTypesBooleanQuery = (\n entityTypes: EntityType[],\n): KeyValue[] => {\n // Boolean query terms will be combined with AND, and there's no way to OR.\n // So we will negate searching for all omitted types.\n const allTypes = Object.values(EntityType)\n const typesToOmit = allTypes.filter(type => !entityTypes.includes(type))\n return typesToOmit.map(type => ({\n key: 'node_type',\n value: type.toString(),\n not: true,\n }))\n}\n\nexport type EntityFinderProps = {\n /** Whether it is possible to select multiple entities */\n selectMultiple: boolean\n /** Callback invoked when the selection changes */\n onSelectedChange: (selected: Reference[]) => void\n /** The initial appearance of the entity finder. Possible values include \"Current Project\", \"All Projects\", \"Projects Created By Me\", \"My Favorites\" */\n initialScope: FinderScope\n /** The SynID of the 'Current Project'. If this is not a defined, then the scope cannot be \"Current Project\" */\n projectId?: string\n /** The SynID of the entity that should open by default. If this is a Syn ID, then it must be in the project specified in `projectId` */\n initialContainer: string | 'root' | null\n /** Determines if versions are selectable, and if so, how they should be shown. Default is \"TRACKED\" */\n versionSelection?: VersionSelectionType\n /** The entity types to show in the details view (right pane). Any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInList?: EntityType[]\n /** The entity types that may be selected. Types in `visibleTypesInList` that are not in `selectableTypes` will appear as disabled options. Only the types in `selectableTypes` will appear in search */\n selectableTypes?: EntityType[]\n /** The types to show in the tree used to navigate. If `treeOnly` is true, any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInTree?: EntityType[]\n /** Whether to show only the tree. If `true`, the tree will be used to make selections */\n treeOnly?: boolean\n /** If provided, the initial selection will be set to this list of references. The selection will be reset to this value if this object changes, so it should be memoized. */\n initialSelected?: Reference[]\n}\n\nenum EntityFinderTab {\n BROWSE,\n SELECTED,\n}\n\nexport function EntityFinder({\n initialScope,\n projectId,\n initialContainer = null,\n selectMultiple,\n onSelectedChange,\n versionSelection = VersionSelectionType.TRACKED,\n selectableTypes = DEFAULT_SELECTABLE_TYPES,\n visibleTypesInList = TABLE_DEFAULT_VISIBLE_TYPES,\n visibleTypesInTree = TREE_DEFAULT_VISIBLE_TYPES,\n treeOnly = false,\n initialSelected,\n}: EntityFinderProps): React.ReactNode {\n const { accessToken } = useSynapseContext()\n const [currentTab, setCurrentTab] = React.useState(EntityFinderTab.BROWSE)\n\n const [searchActive, setSearchActive] = useState(false)\n // The raw value of the search input box:\n const [searchInput, setSearchInput] = useState<string>('')\n // The \"parsed\" search terms, which are only calculated when Enter is pressed:\n const [searchTerms, setSearchTerms] = useState<string[]>()\n const [breadcrumbsProps, setBreadcrumbsProps] = useState<BreadcrumbsProps>({\n items: [],\n })\n const [searchByIdResults, setSearchByIdResults] = useState<\n EntityFinderHeader[]\n >([])\n const [configFromTreeView, setConfigFromTreeView] =\n useState<EntityDetailsListDataConfiguration>({\n type: EntityDetailsListDataConfigurationType.PROMPT,\n })\n\n // If a type is selectable, it should be visible in the tree/list (depending on treeOnly)\n const selectableAndVisibleTypesInTree = useMemo(\n () => [...visibleTypesInTree, ...selectableTypes],\n [visibleTypesInTree, selectableTypes],\n )\n const selectableAndVisibleTypesInList = useMemo(\n () => [...visibleTypesInList, ...selectableTypes],\n [visibleTypesInList, selectableTypes],\n )\n\n // For dual-pane, this state variable indicates which container is selected in the tree view and should be shown in the table view\n const [currentContainer, setCurrentContainer] =\n useState<EntityTreeContainer>(initialContainer)\n\n const handleError = useErrorHandler()\n\n const setBreadcrumbs = useCallback(\n (items: BreadcrumbItem[]) => {\n setBreadcrumbsProps({\n items,\n })\n },\n [setBreadcrumbsProps],\n )\n\n const { selectedEntities, toggleSelection, setSelection, setInitialVersion } =\n useEntitySelection(selectMultiple)\n\n useEffect(() => {\n if (initialSelected) {\n let map = Map<string, Reference>()\n map = map.withMutations(mutableMap => {\n initialSelected.forEach(reference => {\n mutableMap.set(reference.targetId, reference)\n })\n })\n\n setSelection(map)\n }\n }, [initialSelected, setSelection])\n\n // A snapshot of the selectedEntities used to populate the selection list, allowing deselection of entities without removing them from the list.\n const [selectedEntitiesSnapshot, setSelectedEntitiesSnapshot] =\n useState(selectedEntities)\n\n const isIdSelected = useCallback(\n (entity: EntityFinderHeader) => {\n return selectedEntities.has(entity.id)\n },\n [selectedEntities],\n )\n\n const isSelectable = useCallback(\n (entity: EntityFinderHeader) => {\n const type = getEntityTypeFromHeader(entity)\n return selectableTypes.includes(type)\n },\n [selectableTypes],\n )\n\n useEffect(() => {\n // When it changes, convert the map of selected items to a list of references and invoke the callback\n onSelectedChange(Array.from(selectedEntities.values()))\n }, [selectedEntities, onSelectedChange])\n\n useEffect(() => {\n if (searchTerms?.length === 1) {\n const searchTermReference = parseSynId(searchTerms[0])\n if (searchTermReference) {\n SynapseClient.getEntityHeaders([searchTermReference], accessToken)\n .then(response => {\n setSearchByIdResults(response.results)\n })\n .catch(e => handleError(e))\n }\n } else {\n setSearchByIdResults([])\n }\n }, [accessToken, searchTerms, handleError])\n\n const handleTabChange = (\n _event: React.SyntheticEvent,\n newValue: EntityFinderTab,\n ) => {\n setSelectedEntitiesSnapshot(selectedEntities)\n setCurrentTab(newValue)\n }\n\n const mainPanelClass = searchActive\n ? 'MainPanelSearch'\n : treeOnly\n ? 'MainPanelSinglePane'\n : 'MainPanelDualPane'\n\n const entityDetailsListProps: EntityDetailsListProps = {\n configuration: configFromTreeView,\n versionSelection: versionSelection,\n selected: selectedEntities,\n isIdSelected: isIdSelected,\n isSelectable: isSelectable,\n visibleTypes: selectableAndVisibleTypesInList,\n selectableTypes: selectableTypes,\n selectColumnType: selectMultiple ? 'checkbox' : 'none',\n toggleSelection: toggleSelection,\n setInitialVersion: setInitialVersion,\n enableSelectAll: selectMultiple,\n setCurrentContainer: setCurrentContainer,\n }\n\n return (\n <SynapseErrorBoundary>\n <div className=\"EntityFinder\">\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 2.5,\n rowGap: 2,\n columnGap: 4,\n flexWrap: { xs: 'wrap', md: 'nowrap' },\n }}\n >\n <Tabs\n value={currentTab}\n onChange={handleTabChange}\n sx={{ flex: 'none' }}\n >\n <Tab value={EntityFinderTab.BROWSE} label={'Browse'}></Tab>\n <Tab\n value={EntityFinderTab.SELECTED}\n label={\n <Stack\n direction={'row'}\n sx={{\n gap: 0.5,\n alignItems: 'center',\n }}\n >\n <span>Selected</span>\n <Chip\n size={'small'}\n label={selectedEntities.size.toLocaleString()}\n sx={{\n backgroundColor: 'tertiary.500',\n color: 'grey.900',\n height: '21px',\n }}\n ></Chip>\n </Stack>\n }\n ></Tab>\n </Tabs>\n <TextField\n size={'small'}\n placeholder=\"Search by name, wiki content, or SynID\"\n value={searchInput}\n onChange={event => {\n setSearchInput(event.target.value)\n }}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter') {\n const trimmedInput = event.target.value.trim()\n setSearchActive(!!trimmedInput)\n if (trimmedInput) {\n setSearchTerms(trimmedInput.split(/\\s+/))\n setCurrentTab(EntityFinderTab.BROWSE)\n }\n }\n }}\n sx={{\n maxWidth: { xs: '100%', md: '350px' },\n flex: '1 1 350px',\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: searchTerms ? (\n <InputAdornment position=\"end\">\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchInput('')\n setSearchTerms(undefined)\n setSearchActive(false)\n }}\n aria-label=\"Clear Search\"\n disabled={!searchInput && !searchActive}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n </Box>\n <div\n role={'tabpanel'}\n className={`EntityFinder__MainPanel ${mainPanelClass}`}\n style={{\n display: currentTab === EntityFinderTab.BROWSE ? 'block' : 'none',\n }}\n >\n {/* We have a separate Details component for search in order to preserve state in the other component between searches */}\n {searchActive && (\n <EntityDetailsList\n configuration={\n searchByIdResults && searchByIdResults.length > 0\n ? {\n type: EntityDetailsListDataConfigurationType.HEADER_LIST,\n headerList: searchByIdResults,\n }\n : {\n type: EntityDetailsListDataConfigurationType.ENTITY_SEARCH,\n query: {\n queryTerm: searchTerms,\n booleanQuery:\n searchForOnlyTypesBooleanQuery(selectableTypes),\n },\n }\n }\n versionSelection={versionSelection}\n selectColumnType={selectMultiple ? 'checkbox' : 'none'}\n selected={selectedEntities}\n isIdSelected={isIdSelected}\n isSelectable={isSelectable}\n visibleTypes={selectableTypes}\n selectableTypes={selectableTypes}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n enableSelectAll={selectMultiple}\n // Intentionally do not pass \"setCurrentContainer\" -- search does not use the tree so it has nothing to update\n setCurrentContainer={undefined}\n />\n )}\n {\n <div style={searchActive ? { display: 'none' } : {}}>\n {treeOnly ? (\n <div>\n <SynapseErrorBoundary>\n <EntityTree\n toggleSelection={toggleSelection}\n showDropdown={true}\n visibleTypes={selectableAndVisibleTypesInTree}\n initialScope={initialScope}\n selectedEntities={selectedEntities}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n showScopeAsRootNode={false}\n treeNodeType={EntityTreeNodeType.SINGLE_PANE}\n selectableTypes={selectableTypes}\n />\n </SynapseErrorBoundary>\n </div>\n ) : (\n <div className=\"EntityFinderReflexContainer\">\n <ReflexContainer orientation=\"vertical\" windowResizeAware>\n <ReflexElement\n className=\"TreeViewReflexElement\"\n flex={0.24}\n >\n <SynapseErrorBoundary>\n <EntityTree\n selectedEntities={selectedEntities}\n setDetailsViewConfiguration={setConfigFromTreeView}\n showDropdown={true}\n visibleTypes={visibleTypesInTree}\n initialScope={initialScope}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n treeNodeType={EntityTreeNodeType.DUAL_PANE}\n setBreadcrumbItems={setBreadcrumbs}\n selectableTypes={visibleTypesInTree}\n />\n </SynapseErrorBoundary>\n </ReflexElement>\n <ReflexSplitter></ReflexSplitter>\n <ReflexElement className=\"DetailsViewReflexElement\">\n <SynapseErrorBoundary>\n <EntityDetailsList {...entityDetailsListProps} />\n <Breadcrumbs {...breadcrumbsProps} />\n </SynapseErrorBoundary>\n </ReflexElement>\n </ReflexContainer>\n </div>\n )}\n </div>\n }\n </div>\n <div\n role={'tabpanel'}\n className={'MainPanelSelected'}\n style={{\n display: currentTab === EntityFinderTab.SELECTED ? 'block' : 'none',\n }}\n >\n <EntityDetailsList\n {...entityDetailsListProps}\n configuration={{\n type: EntityDetailsListDataConfigurationType.REFERENCE_LIST,\n referenceList: Array.from(selectedEntitiesSnapshot.values()),\n }}\n />\n </div>\n </div>\n </SynapseErrorBoundary>\n )\n}\n\nexport default EntityFinder\n"],"mappings":"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"}
1
+ {"version":3,"file":"EntityFinder.js","names":[],"sources":["../../../src/components/EntityFinder/EntityFinder.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getEntityTypeFromHeader } from '@/utils/functions/EntityTypeUtils'\nimport { parseSynId } from '@/utils/functions/RegularExpressions'\nimport ClearIcon from '@mui/icons-material/Clear'\nimport SearchIcon from '@mui/icons-material/Search'\nimport {\n Box,\n Chip,\n IconButton,\n InputAdornment,\n Stack,\n Tab,\n Tabs,\n TextField,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { KeyValue, Reference } from '@sage-bionetworks/synapse-types'\nimport { Map } from 'immutable'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { ReflexContainer, ReflexElement, ReflexSplitter } from 'react-reflex'\nimport 'react-reflex/styles.css'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { BreadcrumbItem, Breadcrumbs, BreadcrumbsProps } from './Breadcrumbs'\nimport {\n EntityDetailsList,\n EntityDetailsListDataConfiguration,\n EntityDetailsListDataConfigurationType,\n EntityDetailsListProps,\n} from './details/EntityDetailsList'\nimport { EntityFinderHeader } from './EntityFinderHeader'\nimport { EntityTree, EntityTreeContainer, FinderScope } from './tree/EntityTree'\nimport { EntityTreeNodeType } from './tree/VirtualizedTree'\nimport { useEntitySelection } from './useEntitySelection'\nimport { VersionSelectionType } from './VersionSelectionType'\n\nconst DEFAULT_SELECTABLE_TYPES = Object.values(EntityType)\nconst TABLE_DEFAULT_VISIBLE_TYPES = Object.values(EntityType)\nconst TREE_DEFAULT_VISIBLE_TYPES = [EntityType.project, EntityType.folder]\n\nconst searchForOnlyTypesBooleanQuery = (\n entityTypes: EntityType[],\n): KeyValue[] => {\n // Boolean query terms will be combined with AND, and there's no way to OR.\n // So we will negate searching for all omitted types.\n const allTypes = Object.values(EntityType)\n const typesToOmit = allTypes.filter(type => !entityTypes.includes(type))\n return typesToOmit.map(type => ({\n key: 'node_type',\n value: type.toString(),\n not: true,\n }))\n}\n\nexport type EntityFinderProps = {\n /** Whether it is possible to select multiple entities */\n selectMultiple: boolean\n /** Callback invoked when the selection changes */\n onSelectedChange: (selected: Reference[]) => void\n /** The initial appearance of the entity finder. Possible values include \"Current Project\", \"All Projects\", \"Projects Created By Me\", \"My Favorites\" */\n initialScope: FinderScope\n /** The SynID of the 'Current Project'. If this is not a defined, then the scope cannot be \"Current Project\" */\n projectId?: string\n /** The SynID of the entity that should open by default. If this is a Syn ID, then it must be in the project specified in `projectId` */\n initialContainer: string | 'root' | null\n /** Determines if versions are selectable, and if so, how they should be shown. Default is \"TRACKED\" */\n versionSelection?: VersionSelectionType\n /** The entity types to show in the details view (right pane). Any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInList?: EntityType[]\n /** The entity types that may be selected. Types in `visibleTypesInList` that are not in `selectableTypes` will appear as disabled options. Only the types in `selectableTypes` will appear in search */\n selectableTypes?: EntityType[]\n /** The types to show in the tree used to navigate. If `treeOnly` is true, any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInTree?: EntityType[]\n /** Whether to show only the tree. If `true`, the tree will be used to make selections */\n treeOnly?: boolean\n /** If provided, the initial selection will be set to this list of references. The selection will be reset to this value if this object changes, so it should be memoized. */\n initialSelected?: Reference[]\n}\n\nenum EntityFinderTab {\n BROWSE,\n SELECTED,\n}\n\nexport function EntityFinder({\n initialScope,\n projectId,\n initialContainer = null,\n selectMultiple,\n onSelectedChange,\n versionSelection = VersionSelectionType.TRACKED,\n selectableTypes = DEFAULT_SELECTABLE_TYPES,\n visibleTypesInList = TABLE_DEFAULT_VISIBLE_TYPES,\n visibleTypesInTree = TREE_DEFAULT_VISIBLE_TYPES,\n treeOnly = false,\n initialSelected,\n}: EntityFinderProps): React.ReactNode {\n const { accessToken } = useSynapseContext()\n const [currentTab, setCurrentTab] = React.useState(EntityFinderTab.BROWSE)\n\n const [searchActive, setSearchActive] = useState(false)\n // The raw value of the search input box:\n const [searchInput, setSearchInput] = useState<string>('')\n // The \"parsed\" search terms, which are only calculated when Enter is pressed:\n const [searchTerms, setSearchTerms] = useState<string[]>()\n const [breadcrumbsProps, setBreadcrumbsProps] = useState<BreadcrumbsProps>({\n items: [],\n })\n const [searchByIdResults, setSearchByIdResults] = useState<\n EntityFinderHeader[]\n >([])\n const [configFromTreeView, setConfigFromTreeView] =\n useState<EntityDetailsListDataConfiguration>({\n type: EntityDetailsListDataConfigurationType.PROMPT,\n })\n\n // If a type is selectable, it should be visible in the tree/list (depending on treeOnly)\n const selectableAndVisibleTypesInTree = useMemo(\n () => [...visibleTypesInTree, ...selectableTypes],\n [visibleTypesInTree, selectableTypes],\n )\n const selectableAndVisibleTypesInList = useMemo(\n () => [...visibleTypesInList, ...selectableTypes],\n [visibleTypesInList, selectableTypes],\n )\n\n // For dual-pane, this state variable indicates which container is selected in the tree view and should be shown in the table view\n const [currentContainer, setCurrentContainer] =\n useState<EntityTreeContainer>(initialContainer)\n\n const handleError = useErrorHandler()\n\n const setBreadcrumbs = useCallback(\n (items: BreadcrumbItem[]) => {\n setBreadcrumbsProps({\n items,\n })\n },\n [setBreadcrumbsProps],\n )\n\n const { selectedEntities, toggleSelection, setSelection, setInitialVersion } =\n useEntitySelection(selectMultiple)\n\n useEffect(() => {\n if (initialSelected) {\n let map = Map<string, Reference>()\n map = map.withMutations(mutableMap => {\n initialSelected.forEach(reference => {\n mutableMap.set(reference.targetId, reference)\n })\n })\n\n setSelection(map)\n }\n }, [initialSelected, setSelection])\n\n // A snapshot of the selectedEntities used to populate the selection list, allowing deselection of entities without removing them from the list.\n const [selectedEntitiesSnapshot, setSelectedEntitiesSnapshot] =\n useState(selectedEntities)\n\n const isIdSelected = useCallback(\n (entity: EntityFinderHeader) => {\n return selectedEntities.has(entity.id)\n },\n [selectedEntities],\n )\n\n const isSelectable = useCallback(\n (entity: EntityFinderHeader) => {\n const type = getEntityTypeFromHeader(entity)\n return selectableTypes.includes(type)\n },\n [selectableTypes],\n )\n\n useEffect(() => {\n // When it changes, convert the map of selected items to a list of references and invoke the callback\n onSelectedChange(Array.from(selectedEntities.values()))\n }, [selectedEntities, onSelectedChange])\n\n useEffect(() => {\n if (searchTerms?.length === 1) {\n const searchTermReference = parseSynId(searchTerms[0])\n if (searchTermReference) {\n SynapseClient.getEntityHeaders([searchTermReference], accessToken)\n .then(response => {\n setSearchByIdResults(response.results)\n })\n .catch(e => handleError(e))\n }\n } else {\n setSearchByIdResults([])\n }\n }, [accessToken, searchTerms, handleError])\n\n const handleTabChange = (\n _event: React.SyntheticEvent,\n newValue: EntityFinderTab,\n ) => {\n setSelectedEntitiesSnapshot(selectedEntities)\n setCurrentTab(newValue)\n }\n\n const mainPanelClass = searchActive\n ? 'MainPanelSearch'\n : treeOnly\n ? 'MainPanelSinglePane'\n : 'MainPanelDualPane'\n\n const entityDetailsListProps: EntityDetailsListProps = {\n configuration: configFromTreeView,\n versionSelection: versionSelection,\n selected: selectedEntities,\n isIdSelected: isIdSelected,\n isSelectable: isSelectable,\n visibleTypes: selectableAndVisibleTypesInList,\n selectableTypes: selectableTypes,\n selectColumnType: selectMultiple ? 'checkbox' : 'none',\n toggleSelection: toggleSelection,\n setInitialVersion: setInitialVersion,\n enableSelectAll: selectMultiple,\n setCurrentContainer: setCurrentContainer,\n }\n\n return (\n <SynapseErrorBoundary>\n <div className=\"EntityFinder\">\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 2.5,\n rowGap: 2,\n columnGap: 4,\n flexWrap: { xs: 'wrap', md: 'nowrap' },\n }}\n >\n <Tabs\n value={currentTab}\n onChange={handleTabChange}\n sx={{ flex: 'none' }}\n >\n <Tab value={EntityFinderTab.BROWSE} label={'Browse'}></Tab>\n <Tab\n value={EntityFinderTab.SELECTED}\n label={\n <Stack\n direction={'row'}\n sx={{\n gap: 0.5,\n alignItems: 'center',\n }}\n >\n <span>Selected</span>\n <Chip\n size={'small'}\n label={selectedEntities.size.toLocaleString()}\n sx={{\n backgroundColor: 'tertiary.500',\n color: 'grey.900',\n height: '21px',\n }}\n ></Chip>\n </Stack>\n }\n ></Tab>\n </Tabs>\n <TextField\n size={'small'}\n placeholder=\"Search by name, wiki content, or SynID\"\n value={searchInput}\n onChange={event => {\n setSearchInput(event.target.value)\n }}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter') {\n const trimmedInput = event.target.value.trim()\n setSearchActive(!!trimmedInput)\n if (trimmedInput) {\n setSearchTerms(trimmedInput.split(/\\s+/))\n setCurrentTab(EntityFinderTab.BROWSE)\n }\n }\n }}\n sx={{\n maxWidth: { xs: '100%', md: '350px' },\n flex: '1 1 350px',\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: searchTerms ? (\n <InputAdornment position=\"end\">\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchInput('')\n setSearchTerms(undefined)\n setSearchActive(false)\n }}\n aria-label=\"Clear Search\"\n disabled={!searchInput && !searchActive}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n </Box>\n <div\n role={'tabpanel'}\n className={`EntityFinder__MainPanel ${mainPanelClass}`}\n style={{\n display: currentTab === EntityFinderTab.BROWSE ? 'block' : 'none',\n }}\n >\n {/* We have a separate Details component for search in order to preserve state in the other component between searches */}\n {searchActive && (\n <EntityDetailsList\n configuration={\n searchByIdResults && searchByIdResults.length > 0\n ? {\n type: EntityDetailsListDataConfigurationType.HEADER_LIST,\n headerList: searchByIdResults,\n }\n : {\n type: EntityDetailsListDataConfigurationType.ENTITY_SEARCH,\n query: {\n queryTerm: searchTerms,\n booleanQuery:\n searchForOnlyTypesBooleanQuery(selectableTypes),\n },\n }\n }\n versionSelection={versionSelection}\n selectColumnType={selectMultiple ? 'checkbox' : 'none'}\n selected={selectedEntities}\n isIdSelected={isIdSelected}\n isSelectable={isSelectable}\n visibleTypes={selectableTypes}\n selectableTypes={selectableTypes}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n enableSelectAll={selectMultiple}\n // Intentionally do not pass \"setCurrentContainer\" -- search does not use the tree so it has nothing to update\n setCurrentContainer={undefined}\n />\n )}\n {\n <div style={searchActive ? { display: 'none' } : {}}>\n {treeOnly ? (\n <div>\n <SynapseErrorBoundary>\n <EntityTree\n toggleSelection={toggleSelection}\n showDropdown={true}\n visibleTypes={selectableAndVisibleTypesInTree}\n initialScope={initialScope}\n selectedEntities={selectedEntities}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n showScopeAsRootNode={false}\n treeNodeType={EntityTreeNodeType.SINGLE_PANE}\n selectableTypes={selectableTypes}\n />\n </SynapseErrorBoundary>\n </div>\n ) : (\n <div className=\"EntityFinderReflexContainer\">\n <ReflexContainer orientation=\"vertical\" windowResizeAware>\n <ReflexElement\n className=\"TreeViewReflexElement\"\n flex={0.24}\n >\n <SynapseErrorBoundary>\n <EntityTree\n selectedEntities={selectedEntities}\n setDetailsViewConfiguration={setConfigFromTreeView}\n showDropdown={true}\n visibleTypes={visibleTypesInTree}\n initialScope={initialScope}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n treeNodeType={EntityTreeNodeType.DUAL_PANE}\n setBreadcrumbItems={setBreadcrumbs}\n selectableTypes={visibleTypesInTree}\n />\n </SynapseErrorBoundary>\n </ReflexElement>\n <ReflexSplitter></ReflexSplitter>\n <ReflexElement className=\"DetailsViewReflexElement\">\n <SynapseErrorBoundary>\n <EntityDetailsList {...entityDetailsListProps} />\n <Breadcrumbs {...breadcrumbsProps} />\n </SynapseErrorBoundary>\n </ReflexElement>\n </ReflexContainer>\n </div>\n )}\n </div>\n }\n </div>\n <div\n role={'tabpanel'}\n className={'MainPanelSelected'}\n style={{\n display: currentTab === EntityFinderTab.SELECTED ? 'block' : 'none',\n }}\n >\n <EntityDetailsList\n {...entityDetailsListProps}\n configuration={{\n type: EntityDetailsListDataConfigurationType.REFERENCE_LIST,\n referenceList: Array.from(selectedEntitiesSnapshot.values()),\n }}\n />\n </div>\n </div>\n </SynapseErrorBoundary>\n )\n}\n\nexport default EntityFinder\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { EntityFinderModalProps } from './EntityFinderModal';
2
+ export type EntityIdTextFieldProps = {
3
+ label: string;
4
+ value: string;
5
+ onChange: (value: string) => void;
6
+ description?: string;
7
+ disabled?: boolean;
8
+ entityFinderModalProps: Omit<EntityFinderModalProps, 'show' | 'onConfirm' | 'onCancel'>;
9
+ };
10
+ /**
11
+ * A text field with an adornment button that opens an EntityFinderModal to select an entity.
12
+ * The selected entity's ID is set as the value of the text field. Users may also type or paste
13
+ * a raw synId.
14
+ */
15
+ declare function EntityIdTextField(props: EntityIdTextFieldProps): import("react/jsx-runtime").JSX.Element;
16
+ export default EntityIdTextField;
17
+ //# sourceMappingURL=EntityIdTextField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityIdTextField.d.ts","sourceRoot":"","sources":["../../../src/components/EntityFinder/EntityIdTextField.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAqB,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sBAAsB,EAAE,IAAI,CAC1B,sBAAsB,EACtB,MAAM,GAAG,WAAW,GAAG,UAAU,CAClC,CAAA;CACF,CAAA;AAED;;;;GAIG;AACH,iBAAS,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAyCvD;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,35 @@
1
+ import e from "../TextField/TextField.js";
2
+ import "../TextField/index.js";
3
+ import { EntityFinderModal as t } from "./EntityFinderModal.js";
4
+ import { useState as n } from "react";
5
+ import { IconButton as r } from "@mui/material";
6
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ import { SearchOutlined as s } from "@mui/icons-material";
8
+ //#region src/components/EntityFinder/EntityIdTextField.tsx
9
+ function c(c) {
10
+ let { label: l, value: u, description: d, onChange: f, disabled: p, entityFinderModalProps: m } = c, [h, g] = n(!1);
11
+ return /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(t, {
12
+ show: h,
13
+ onConfirm: (e) => {
14
+ f(e[0].targetId), g(!1);
15
+ },
16
+ onCancel: () => g(!1),
17
+ ...m
18
+ }), /* @__PURE__ */ a(e, {
19
+ label: l,
20
+ description: d,
21
+ type: "text",
22
+ fullWidth: !0,
23
+ value: u,
24
+ disabled: p,
25
+ onChange: (e) => f(e.target.value),
26
+ slotProps: { input: { endAdornment: !p && /* @__PURE__ */ a(r, {
27
+ onClick: () => g(!0),
28
+ children: /* @__PURE__ */ a(s, {})
29
+ }) } }
30
+ })] });
31
+ }
32
+ //#endregion
33
+ export { c as default };
34
+
35
+ //# sourceMappingURL=EntityIdTextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityIdTextField.js","names":[],"sources":["../../../src/components/EntityFinder/EntityIdTextField.tsx"],"sourcesContent":["import { SearchOutlined } from '@mui/icons-material'\nimport { IconButton } from '@mui/material'\nimport { useState } from 'react'\nimport { TextField } from '../TextField'\nimport { EntityFinderModal, EntityFinderModalProps } from './EntityFinderModal'\n\nexport type EntityIdTextFieldProps = {\n label: string\n value: string\n onChange: (value: string) => void\n description?: string\n disabled?: boolean\n entityFinderModalProps: Omit<\n EntityFinderModalProps,\n 'show' | 'onConfirm' | 'onCancel'\n >\n}\n\n/**\n * A text field with an adornment button that opens an EntityFinderModal to select an entity.\n * The selected entity's ID is set as the value of the text field. Users may also type or paste\n * a raw synId.\n */\nfunction EntityIdTextField(props: EntityIdTextFieldProps) {\n const {\n label,\n value,\n description,\n onChange,\n disabled,\n entityFinderModalProps,\n } = props\n const [showEntityFinder, setShowEntityFinder] = useState(false)\n return (\n <>\n <EntityFinderModal\n show={showEntityFinder}\n onConfirm={selected => {\n onChange(selected[0].targetId)\n setShowEntityFinder(false)\n }}\n onCancel={() => setShowEntityFinder(false)}\n {...entityFinderModalProps}\n />\n <TextField\n label={label}\n description={description}\n type=\"text\"\n fullWidth\n value={value}\n disabled={disabled}\n onChange={e => onChange(e.target.value)}\n slotProps={{\n input: {\n endAdornment: !disabled && (\n <IconButton onClick={() => setShowEntityFinder(true)}>\n <SearchOutlined />\n </IconButton>\n ),\n },\n }}\n />\n </>\n )\n}\n\nexport default EntityIdTextField\n"],"mappings":";;;;;;;;AAuBA,SAAS,EAAkB,GAA+B;CACxD,IAAM,EACJ,UACA,UACA,gBACA,aACA,aACA,8BACE,GACE,CAAC,GAAkB,KAAuB,EAAS,GAAM;AAC/D,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,MAAM;EACN,YAAW,MAAY;AAErB,GADA,EAAS,EAAS,GAAG,SAAS,EAC9B,EAAoB,GAAM;;EAE5B,gBAAgB,EAAoB,GAAM;EAC1C,GAAI;EACJ,CAAA,EACF,kBAAC,GAAD;EACS;EACM;EACb,MAAK;EACL,WAAA;EACO;EACG;EACV,WAAU,MAAK,EAAS,EAAE,OAAO,MAAM;EACvC,WAAW,EACT,OAAO,EACL,cAAc,CAAC,KACb,kBAAC,GAAD;GAAY,eAAe,EAAoB,GAAK;aAClD,kBAAC,GAAD,EAAkB,CAAA;GACP,CAAA,EAEhB,EACF;EACD,CAAA,CACD,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"EvaluationRoundLimitOptions.d.ts","sourceRoot":"","sources":["../../../../src/components/Evaluation/round_limits/EvaluationRoundLimitOptions.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAElE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,yBAAyB,CAAA;IAErC,gBAAgB,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAA;IAC/C,QAAQ,EAAE,CAAC,UAAU,EAAE,yBAAyB,KAAK,IAAI,CAAA;CAC1D,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAC3C,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAMzC,CAAA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,UAAU,EACV,gBAAgB,EAChB,QAAQ,GACT,EAAE,gCAAgC,2CAqDlC"}
1
+ {"version":3,"file":"EvaluationRoundLimitOptions.d.ts","sourceRoot":"","sources":["../../../../src/components/Evaluation/round_limits/EvaluationRoundLimitOptions.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAGlE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,yBAAyB,CAAA;IAErC,gBAAgB,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAA;IAC/C,QAAQ,EAAE,CAAC,UAAU,EAAE,yBAAyB,KAAK,IAAI,CAAA;CAC1D,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAC3C,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAMzC,CAAA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,UAAU,EACV,gBAAgB,EAChB,QAAQ,GACT,EAAE,gCAAgC,2CAwDlC"}
@@ -1,39 +1,45 @@
1
1
  import { StyledFormControl as e } from "../../styled/StyledFormControl.js";
2
- import { InputLabel as t, Select as n, TextField as r } from "@mui/material";
3
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
2
+ import { useId as t } from "react";
3
+ import { InputLabel as n, Select as r, TextField as i } from "@mui/material";
4
+ import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
4
5
  //#region src/components/Evaluation/round_limits/EvaluationRoundLimitOptions.tsx
5
- var s = {
6
+ var c = {
6
7
  DAILY: "Daily Limit",
7
8
  WEEKLY: "Weekly Limit",
8
9
  MONTHLY: "Monthly Limit"
9
10
  };
10
- function c({ limitInput: c, allSelectedTypes: l, onChange: u }) {
11
- return /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o(e, {
11
+ function l({ limitInput: l, allSelectedTypes: u, onChange: d }) {
12
+ let f = t();
13
+ return /* @__PURE__ */ s(a, { children: [/* @__PURE__ */ s(e, {
12
14
  className: "limit-type",
13
- children: [/* @__PURE__ */ a(t, { children: "Limit Type" }), /* @__PURE__ */ a(n, {
15
+ children: [/* @__PURE__ */ o(n, {
16
+ id: f,
17
+ children: "Limit Type"
18
+ }), /* @__PURE__ */ o(r, {
19
+ labelId: f,
14
20
  fullWidth: !0,
15
21
  native: !0,
16
- value: c.type,
22
+ value: l.type,
17
23
  onChange: (e) => {
18
- u({
24
+ d({
19
25
  type: e.target.value,
20
- maxSubmissionString: c.maxSubmissionString
26
+ maxSubmissionString: l.maxSubmissionString
21
27
  });
22
28
  },
23
- children: Object.entries(s).map(([e, t]) => /* @__PURE__ */ a("option", {
29
+ children: Object.entries(c).map(([e, t]) => /* @__PURE__ */ o("option", {
24
30
  value: e,
25
- disabled: l.has(e) && e !== c.type,
31
+ disabled: u.has(e) && e !== l.type,
26
32
  children: t
27
33
  }, e))
28
34
  })]
29
- }), /* @__PURE__ */ a(r, {
35
+ }), /* @__PURE__ */ o(i, {
30
36
  fullWidth: !0,
31
37
  className: "limit-input",
32
38
  label: "Maximum Submissions",
33
- value: c.maxSubmissionString,
39
+ value: l.maxSubmissionString,
34
40
  onChange: (e) => {
35
- u({
36
- type: c.type,
41
+ d({
42
+ type: l.type,
37
43
  maxSubmissionString: e.target.value
38
44
  });
39
45
  },
@@ -41,6 +47,6 @@ function c({ limitInput: c, allSelectedTypes: l, onChange: u }) {
41
47
  })] });
42
48
  }
43
49
  //#endregion
44
- export { c as EvaluationRoundLimitOptions, s as LIMIT_TYPE_DISPLAY_NAME };
50
+ export { l as EvaluationRoundLimitOptions, c as LIMIT_TYPE_DISPLAY_NAME };
45
51
 
46
52
  //# sourceMappingURL=EvaluationRoundLimitOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EvaluationRoundLimitOptions.js","names":[],"sources":["../../../../src/components/Evaluation/round_limits/EvaluationRoundLimitOptions.tsx"],"sourcesContent":["import StyledFormControl from '@/components/styled/StyledFormControl'\nimport { InputLabel, Select, TextField } from '@mui/material'\nimport { EvaluationRoundLimitType } from '@sage-bionetworks/synapse-types'\nimport { EvaluationRoundLimitInput } from '../input_models/models'\n\nexport type EvaluationRoundLimitOptionsProps = {\n limitInput: EvaluationRoundLimitInput\n //all types for which an EvaluationRoundLimitOptions was already created\n allSelectedTypes: Set<EvaluationRoundLimitType>\n onChange: (limitInput: EvaluationRoundLimitInput) => void\n}\n\nexport const LIMIT_TYPE_DISPLAY_NAME: Partial<\n Record<EvaluationRoundLimitType, string>\n> = {\n // EvaluationRoundLimitType.TOTAL is purposely omitted because an <input> in the parent handles it\n DAILY: 'Daily Limit',\n WEEKLY: 'Weekly Limit',\n MONTHLY: 'Monthly Limit',\n}\n\nexport function EvaluationRoundLimitOptions({\n limitInput,\n allSelectedTypes,\n onChange,\n}: EvaluationRoundLimitOptionsProps) {\n return (\n <>\n <StyledFormControl className=\"limit-type\">\n <InputLabel>Limit Type</InputLabel>\n <Select\n fullWidth\n native\n value={limitInput.type}\n onChange={event => {\n onChange({\n type: event.target.value as EvaluationRoundLimitType,\n maxSubmissionString: limitInput.maxSubmissionString,\n })\n }}\n >\n {Object.entries(LIMIT_TYPE_DISPLAY_NAME).map(\n ([displayLimitType, displayName]) => (\n <option\n key={displayLimitType}\n value={displayLimitType}\n disabled={\n allSelectedTypes.has(\n displayLimitType as EvaluationRoundLimitType,\n ) && displayLimitType !== limitInput.type\n }\n >\n {displayName}\n </option>\n ),\n )}\n </Select>\n </StyledFormControl>\n\n <TextField\n fullWidth\n className=\"limit-input\"\n label={'Maximum Submissions'}\n value={limitInput.maxSubmissionString}\n onChange={event => {\n onChange({\n type: limitInput.type,\n maxSubmissionString: event.target.value,\n })\n }}\n slotProps={{\n htmlInput: {\n pattern: '[0-9]*',\n },\n }}\n />\n </>\n )\n}\n"],"mappings":";;;;AAYA,IAAa,IAET;CAEF,OAAO;CACP,QAAQ;CACR,SAAS;CACV;AAED,SAAgB,EAA4B,EAC1C,eACA,qBACA,eACmC;AACnC,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAmB,WAAU;YAA7B,CACE,kBAAC,GAAD,EAAA,UAAY,cAAuB,CAAA,EACnC,kBAAC,GAAD;GACE,WAAA;GACA,QAAA;GACA,OAAO,EAAW;GAClB,WAAU,MAAS;AACjB,MAAS;KACP,MAAM,EAAM,OAAO;KACnB,qBAAqB,EAAW;KACjC,CAAC;;aAGH,OAAO,QAAQ,EAAwB,CAAC,KACtC,CAAC,GAAkB,OAClB,kBAAC,UAAD;IAEE,OAAO;IACP,UACE,EAAiB,IACf,EACD,IAAI,MAAqB,EAAW;cAGtC;IACM,EATF,EASE,CAEZ;GACM,CAAA,CACS;KAEpB,kBAAC,GAAD;EACE,WAAA;EACA,WAAU;EACV,OAAO;EACP,OAAO,EAAW;EAClB,WAAU,MAAS;AACjB,KAAS;IACP,MAAM,EAAW;IACjB,qBAAqB,EAAM,OAAO;IACnC,CAAC;;EAEJ,WAAW,EACT,WAAW,EACT,SAAS,UACV,EACF;EACD,CAAA,CACD,EAAA,CAAA"}
1
+ {"version":3,"file":"EvaluationRoundLimitOptions.js","names":[],"sources":["../../../../src/components/Evaluation/round_limits/EvaluationRoundLimitOptions.tsx"],"sourcesContent":["import StyledFormControl from '@/components/styled/StyledFormControl'\nimport { InputLabel, Select, TextField } from '@mui/material'\nimport { EvaluationRoundLimitType } from '@sage-bionetworks/synapse-types'\nimport { EvaluationRoundLimitInput } from '../input_models/models'\nimport { useId } from 'react'\n\nexport type EvaluationRoundLimitOptionsProps = {\n limitInput: EvaluationRoundLimitInput\n //all types for which an EvaluationRoundLimitOptions was already created\n allSelectedTypes: Set<EvaluationRoundLimitType>\n onChange: (limitInput: EvaluationRoundLimitInput) => void\n}\n\nexport const LIMIT_TYPE_DISPLAY_NAME: Partial<\n Record<EvaluationRoundLimitType, string>\n> = {\n // EvaluationRoundLimitType.TOTAL is purposely omitted because an <input> in the parent handles it\n DAILY: 'Daily Limit',\n WEEKLY: 'Weekly Limit',\n MONTHLY: 'Monthly Limit',\n}\n\nexport function EvaluationRoundLimitOptions({\n limitInput,\n allSelectedTypes,\n onChange,\n}: EvaluationRoundLimitOptionsProps) {\n const limitTypeLabelId = useId()\n\n return (\n <>\n <StyledFormControl className=\"limit-type\">\n <InputLabel id={limitTypeLabelId}>Limit Type</InputLabel>\n <Select\n labelId={limitTypeLabelId}\n fullWidth\n native\n value={limitInput.type}\n onChange={event => {\n onChange({\n type: event.target.value as EvaluationRoundLimitType,\n maxSubmissionString: limitInput.maxSubmissionString,\n })\n }}\n >\n {Object.entries(LIMIT_TYPE_DISPLAY_NAME).map(\n ([displayLimitType, displayName]) => (\n <option\n key={displayLimitType}\n value={displayLimitType}\n disabled={\n allSelectedTypes.has(\n displayLimitType as EvaluationRoundLimitType,\n ) && displayLimitType !== limitInput.type\n }\n >\n {displayName}\n </option>\n ),\n )}\n </Select>\n </StyledFormControl>\n\n <TextField\n fullWidth\n className=\"limit-input\"\n label={'Maximum Submissions'}\n value={limitInput.maxSubmissionString}\n onChange={event => {\n onChange({\n type: limitInput.type,\n maxSubmissionString: event.target.value,\n })\n }}\n slotProps={{\n htmlInput: {\n pattern: '[0-9]*',\n },\n }}\n />\n </>\n )\n}\n"],"mappings":";;;;;AAaA,IAAa,IAET;CAEF,OAAO;CACP,QAAQ;CACR,SAAS;CACV;AAED,SAAgB,EAA4B,EAC1C,eACA,qBACA,eACmC;CACnC,IAAM,IAAmB,GAAO;AAEhC,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAmB,WAAU;YAA7B,CACE,kBAAC,GAAD;GAAY,IAAI;aAAkB;GAAuB,CAAA,EACzD,kBAAC,GAAD;GACE,SAAS;GACT,WAAA;GACA,QAAA;GACA,OAAO,EAAW;GAClB,WAAU,MAAS;AACjB,MAAS;KACP,MAAM,EAAM,OAAO;KACnB,qBAAqB,EAAW;KACjC,CAAC;;aAGH,OAAO,QAAQ,EAAwB,CAAC,KACtC,CAAC,GAAkB,OAClB,kBAAC,UAAD;IAEE,OAAO;IACP,UACE,EAAiB,IACf,EACD,IAAI,MAAqB,EAAW;cAGtC;IACM,EATF,EASE,CAEZ;GACM,CAAA,CACS;KAEpB,kBAAC,GAAD;EACE,WAAA;EACA,WAAU;EACV,OAAO;EACP,OAAO,EAAW;EAClB,WAAU,MAAS;AACjB,KAAS;IACP,MAAM,EAAW;IACjB,qBAAqB,EAAM,OAAO;IACnC,CAAC;;EAEJ,WAAW,EACT,WAAW,EACT,SAAS,UACV,EACF;EACD,CAAA,CACD,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FacetPlotsCardGrid.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCardGrid.tsx"],"sourcesContent":["import { Box, BoxProps, styled } from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\nexport const FACET_PLOTS_CARD_CLASSNAME = 'FacetPlotsCard'\n\nexport const FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME =\n 'FacetPlotsCardTitleContainer'\n\nexport const FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME =\n 'FacetPlotsCardPlotContainer'\n\nexport const FacetPlotsCardGridContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardGridContainer',\n },\n)(({ theme }) => ({\n [theme.breakpoints.down('md')]: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n },\n [theme.breakpoints.up('md')]: {\n /* \n The grid is broken up into cards which have subcomponents that should be aligned\n Ideally we could use CSS Subgrid, but it is not widely supported as of the time of writing\n See https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid\n\n Instead we will use grid with `display: contents`, and style each section to look like a card.\n */\n display: 'grid',\n gridTemplateRows: '[title] auto [plot0] auto',\n justifyContent: 'center',\n gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))',\n columnGap: '2%',\n\n [`.${FACET_PLOTS_CARD_CLASSNAME}`]: {\n display: 'contents',\n },\n\n [`.${FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}, .${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}`]:\n {\n // Since we're using `display:contents`, the card container style will not be displayed.\n // So add box-shadow to each grid item\n boxShadow: '0px 3px 10px 0px #5D69AB1A',\n backgroundColor: theme.palette.background.paper,\n },\n [`.${FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}`]: {\n gridRow: 'title',\n // For the title portion of the card, use clipPath to hide the box-shadow at the bottom of the section,\n // since the bottom border is adjacent to the rest of the visual card\n clipPath: 'inset(-10px -10px 0px -10px)',\n },\n\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}`]: {\n // For the plots section(s), use clipPath to hide the box-shadow at the top and bottom of the section\n clipPath: 'inset(0px -10px 0px -10px)',\n },\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}:last-of-type`]: {\n // For the last plot section, use clipPath to hide the box-shadow at the top of the section\n // the bottom box-shadow is shown since this is container marks the bottom of the card (visually)\n borderBottom: '1px solid #e8e8e8',\n clipPath: 'inset(0px -10px -10px -10px)',\n },\n },\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}:last-of-type`]: {\n paddingBottom: theme.spacing(5),\n },\n}))\n\nexport const FacetPlotsCardTitleContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardTitleContainer',\n },\n)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'start',\n paddingTop: theme.spacing(5),\n paddingLeft: theme.spacing(5),\n paddingRight: theme.spacing(5),\n minHeight: '64px',\n}))\n\nexport const FacetPlotsCardPlotContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardPlotContainer',\n },\n)(({ theme }) => ({\n paddingLeft: theme.spacing(5),\n paddingRight: theme.spacing(5),\n}))\n"],"mappings":";;AAGA,IAAa,IAA6B,kBAE7B,IACX,gCAEW,IACX,+BAEW,IAAyD,EACpE,GACA,EACE,OAAO,+BACR,CACF,EAAE,EAAE,gBAAa;EACf,EAAM,YAAY,KAAK,KAAK,GAAG;EAC9B,SAAS;EACT,eAAe;EACf,KAAK,EAAM,QAAQ,EAAE;EACtB;EACA,EAAM,YAAY,GAAG,KAAK,GAAG;EAQ5B,SAAS;EACT,kBAAkB;EAClB,gBAAgB;EAChB,qBAAqB;EACrB,WAAW;GAEV,IAAI,MAA+B,EAClC,SAAS,YACV;GAEA,IAAI,EAA2C,KAAK,MACnD;GAGE,WAAW;GACX,iBAAiB,EAAM,QAAQ,WAAW;GAC3C;GACF,IAAI,MAA+C;GAClD,SAAS;GAGT,UAAU;GACX;GAEA,IAAI,MAA8C,EAEjD,UAAU,8BACX;GACA,IAAI,EAA0C,iBAAiB;GAG9D,cAAc;GACd,UAAU;GACX;EACF;EACA,IAAI,EAA0C,iBAAiB,EAC9D,eAAe,EAAM,QAAQ,EAAE,EAChC;CACF,EAAE,EAEU,IAA0D,EACrE,GACA,EACE,OAAO,gCACR,CACF,EAAE,EAAE,gBAAa;CAChB,SAAS;CACT,eAAe;CACf,gBAAgB;CAChB,YAAY,EAAM,QAAQ,EAAE;CAC5B,aAAa,EAAM,QAAQ,EAAE;CAC7B,cAAc,EAAM,QAAQ,EAAE;CAC9B,WAAW;CACZ,EAAE,EAEU,IAAyD,EACpE,GACA,EACE,OAAO,+BACR,CACF,EAAE,EAAE,gBAAa;CAChB,aAAa,EAAM,QAAQ,EAAE;CAC7B,cAAc,EAAM,QAAQ,EAAE;CAC/B,EAAE"}
1
+ {"version":3,"file":"FacetPlotsCardGrid.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCardGrid.tsx"],"sourcesContent":["import { Box, BoxProps, styled } from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\nexport const FACET_PLOTS_CARD_CLASSNAME = 'FacetPlotsCard'\n\nexport const FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME =\n 'FacetPlotsCardTitleContainer'\n\nexport const FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME =\n 'FacetPlotsCardPlotContainer'\n\nexport const FacetPlotsCardGridContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardGridContainer',\n },\n)(({ theme }) => ({\n [theme.breakpoints.down('md')]: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n },\n [theme.breakpoints.up('md')]: {\n /*\n The grid is broken up into cards which have subcomponents that should be aligned\n Ideally we could use CSS Subgrid, but it is not widely supported as of the time of writing\n See https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid\n\n Instead we will use grid with `display: contents`, and style each section to look like a card.\n */\n display: 'grid',\n gridTemplateRows: '[title] auto [plot0] auto',\n justifyContent: 'center',\n gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))',\n columnGap: '2%',\n\n [`.${FACET_PLOTS_CARD_CLASSNAME}`]: {\n display: 'contents',\n },\n\n [`.${FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}, .${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}`]:\n {\n // Since we're using `display:contents`, the card container style will not be displayed.\n // So add box-shadow to each grid item\n boxShadow: '0px 3px 10px 0px #5D69AB1A',\n backgroundColor: theme.palette.background.paper,\n },\n [`.${FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}`]: {\n gridRow: 'title',\n // For the title portion of the card, use clipPath to hide the box-shadow at the bottom of the section,\n // since the bottom border is adjacent to the rest of the visual card\n clipPath: 'inset(-10px -10px 0px -10px)',\n },\n\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}`]: {\n // For the plots section(s), use clipPath to hide the box-shadow at the top and bottom of the section\n clipPath: 'inset(0px -10px 0px -10px)',\n },\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}:last-of-type`]: {\n // For the last plot section, use clipPath to hide the box-shadow at the top of the section\n // the bottom box-shadow is shown since this is container marks the bottom of the card (visually)\n borderBottom: '1px solid #e8e8e8',\n clipPath: 'inset(0px -10px -10px -10px)',\n },\n },\n [`.${FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}:last-of-type`]: {\n paddingBottom: theme.spacing(5),\n },\n}))\n\nexport const FacetPlotsCardTitleContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardTitleContainer',\n },\n)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'start',\n paddingTop: theme.spacing(5),\n paddingLeft: theme.spacing(5),\n paddingRight: theme.spacing(5),\n minHeight: '64px',\n}))\n\nexport const FacetPlotsCardPlotContainer: StyledComponent<BoxProps> = styled(\n Box,\n {\n label: 'FacetPlotsCardPlotContainer',\n },\n)(({ theme }) => ({\n paddingLeft: theme.spacing(5),\n paddingRight: theme.spacing(5),\n}))\n"],"mappings":";;AAGA,IAAa,IAA6B,kBAE7B,IACX,gCAEW,IACX,+BAEW,IAAyD,EACpE,GACA,EACE,OAAO,+BACR,CACF,EAAE,EAAE,gBAAa;EACf,EAAM,YAAY,KAAK,KAAK,GAAG;EAC9B,SAAS;EACT,eAAe;EACf,KAAK,EAAM,QAAQ,EAAE;EACtB;EACA,EAAM,YAAY,GAAG,KAAK,GAAG;EAQ5B,SAAS;EACT,kBAAkB;EAClB,gBAAgB;EAChB,qBAAqB;EACrB,WAAW;GAEV,IAAI,MAA+B,EAClC,SAAS,YACV;GAEA,IAAI,EAA2C,KAAK,MACnD;GAGE,WAAW;GACX,iBAAiB,EAAM,QAAQ,WAAW;GAC3C;GACF,IAAI,MAA+C;GAClD,SAAS;GAGT,UAAU;GACX;GAEA,IAAI,MAA8C,EAEjD,UAAU,8BACX;GACA,IAAI,EAA0C,iBAAiB;GAG9D,cAAc;GACd,UAAU;GACX;EACF;EACA,IAAI,EAA0C,iBAAiB,EAC9D,eAAe,EAAM,QAAQ,EAAE,EAChC;CACF,EAAE,EAEU,IAA0D,EACrE,GACA,EACE,OAAO,gCACR,CACF,EAAE,EAAE,gBAAa;CAChB,SAAS;CACT,eAAe;CACf,gBAAgB;CAChB,YAAY,EAAM,QAAQ,EAAE;CAC5B,aAAa,EAAM,QAAQ,EAAE;CAC7B,cAAc,EAAM,QAAQ,EAAE;CAC9B,WAAW;CACZ,EAAE,EAEU,IAAyD,EACpE,GACA,EACE,OAAO,+BACR,CACF,EAAE,EAAE,gBAAa;CAChB,aAAa,EAAM,QAAQ,EAAE;CAC7B,cAAc,EAAM,QAAQ,EAAE;CAC/B,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"ForumThreadEditor.js","names":[],"sources":["../../../src/components/Forum/ForumThreadEditor.tsx"],"sourcesContent":["import { usePostReply, usePutReply } from '@/synapse-queries/forum/useReply'\nimport {\n useCreateThread,\n useUpdateThreadMessage,\n useUpdateThreadTitle,\n} from '@/synapse-queries/forum/useThread'\nimport { Box, TextField } from '@mui/material'\nimport { CreateDiscussionThread } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { MarkdownEditor } from '../Markdown/MarkdownEditor'\n\nexport type ForumThreadEditorProps = {\n initialTitle?: string\n initialText?: string\n id: string\n onClose: () => void\n isReply: boolean\n} & (\n | { isDialog: false; openDialog?: never }\n | { isDialog: true; openDialog: boolean }\n)\n\nexport function ForumThreadEditor(props: ForumThreadEditorProps) {\n const {\n initialText,\n initialTitle,\n id,\n onClose,\n isReply,\n isDialog,\n openDialog,\n } = props\n\n const [title, setTitle] = useState<string>(initialTitle ?? '')\n const [text, setText] = useState<string>(initialText ?? '')\n const { mutate: updateTitle, isPending: titleUpdateIsPending } =\n useUpdateThreadTitle({\n onSuccess: () => onClose(),\n })\n const { mutate: updateMessage, isPending: messageUpdateIsPending } =\n useUpdateThreadMessage({\n onSuccess: () => onClose(),\n })\n const { mutate: createThread, isPending: createThreadIsPending } =\n useCreateThread({\n onSuccess: () => onClose(),\n })\n const { mutate: createReply, isPending: createReplyIsPending } = usePostReply(\n {\n onSuccess: () => onClose(),\n },\n )\n const { mutate: updateReply, isPending: updateReplyIsPending } = usePutReply({\n onSuccess: () => onClose(),\n })\n\n const updateIsPending =\n messageUpdateIsPending ||\n createReplyIsPending ||\n createThreadIsPending ||\n titleUpdateIsPending ||\n updateReplyIsPending\n\n const isExistingThread = !isReply && initialTitle\n\n const onSave = (text: string, title: string) => {\n if (isReply) {\n if (initialText) {\n // updating reply\n updateReply({\n replyId: id,\n messageMarkdown: text,\n })\n } else {\n // posting reply\n createReply({\n threadId: id,\n messageMarkdown: text,\n })\n }\n } else {\n if (isExistingThread) {\n // updating thread\n updateTitle({\n title: title,\n threadId: id,\n })\n updateMessage({\n messageMarkdown: text,\n threadId: id,\n })\n } else {\n // posting thread\n const request: CreateDiscussionThread = {\n forumId: id,\n title: title,\n messageMarkdown: text,\n }\n createThread(request)\n }\n }\n }\n\n const editorContent = (\n <div>\n {!isReply && (\n <TextField\n fullWidth\n sx={{ my: 1 }}\n placeholder=\"Title\"\n value={title}\n onChange={e => setTitle(e.target.value)}\n />\n )}\n <MarkdownEditor\n placeholder={'Write a reply...'}\n text={text}\n setText={setText}\n />\n </div>\n )\n\n const confirmButtonText = updateIsPending ? 'Saving' : 'Post'\n\n return (\n <>\n {isDialog ? (\n <ConfirmationDialog\n maxWidth=\"md\"\n open={openDialog}\n onCancel={onClose}\n title={\n isReply\n ? 'Edit Reply'\n : isExistingThread\n ? 'Edit Thread'\n : 'New Thread'\n }\n content={editorContent}\n onConfirm={() => onSave(text, title)}\n confirmButtonProps={{ children: confirmButtonText }}\n />\n ) : (\n <>\n {editorContent}\n <Box\n sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1, my: 1 }}\n >\n <ConfirmationButtons\n onCancel={onClose}\n onConfirm={() => onSave(text, title)}\n confirmButtonProps={{ children: confirmButtonText }}\n />\n </Box>\n </>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;AA0BA,SAAgB,EAAkB,GAA+B;CAC/D,IAAM,EACJ,gBACA,iBACA,OACA,YACA,YACA,aACA,kBACE,GAEE,CAAC,GAAO,KAAY,EAAiB,KAAgB,GAAG,EACxD,CAAC,GAAM,KAAW,EAAiB,KAAe,GAAG,EACrD,EAAE,QAAQ,GAAa,WAAW,MACtC,EAAqB,EACnB,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAe,WAAW,MACxC,EAAuB,EACrB,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAc,WAAW,MACvC,EAAgB,EACd,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAa,WAAW,MAAyB,EAC/D,EACE,iBAAiB,GAAS,EAC3B,CACF,EACK,EAAE,QAAQ,GAAa,WAAW,MAAyB,EAAY,EAC3E,iBAAiB,GAAS,EAC3B,CAAC,EAEI,IACJ,KACA,KACA,KACA,KACA,GAEI,IAAmB,CAAC,KAAW,GAE/B,KAAU,GAAc,MAAkB;AAC9C,EAAI,IACE,IAEF,EAAY;GACV,SAAS;GACT,iBAAiB;GAClB,CAAC,GAGF,EAAY;GACV,UAAU;GACV,iBAAiB;GAClB,CAAC,GAGA,KAEF,EAAY;GACH;GACP,UAAU;GACX,CAAC,EACF,EAAc;GACZ,iBAAiB;GACjB,UAAU;GACX,CAAC,IAQF,EAAa;GAJX,SAAS;GACF;GACP,iBAAiB;GAEN,CAAQ;IAKrB,IACJ,kBAAC,OAAD,EAAA,UAAA,CACG,CAAC,KACA,kBAAC,GAAD;EACE,WAAA;EACA,IAAI,EAAE,IAAI,GAAG;EACb,aAAY;EACZ,OAAO;EACP,WAAU,MAAK,EAAS,EAAE,OAAO,MAAM;EACvC,CAAA,EAEJ,kBAAC,GAAD;EACE,aAAa;EACP;EACG;EACT,CAAA,CACE,EAAA,CAAA,EAGF,IAAoB,IAAkB,WAAW;AAEvD,QACE,kBAAA,GAAA,EAAA,UACG,IACC,kBAAC,GAAD;EACE,UAAS;EACT,MAAM;EACN,UAAU;EACV,OACE,IACI,eACA,IACA,gBACA;EAEN,SAAS;EACT,iBAAiB,EAAO,GAAM,EAAM;EACpC,oBAAoB,EAAE,UAAU,GAAmB;EACnD,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACG,GACD,kBAAC,GAAD;EACE,IAAI;GAAE,SAAS;GAAQ,gBAAgB;GAAY,KAAK;GAAG,IAAI;GAAG;YAElE,kBAAC,GAAD;GACE,UAAU;GACV,iBAAiB,EAAO,GAAM,EAAM;GACpC,oBAAoB,EAAE,UAAU,GAAmB;GACnD,CAAA;EACE,CAAA,CACL,EAAA,CAAA,EAEJ,CAAA"}
1
+ {"version":3,"file":"ForumThreadEditor.js","names":[],"sources":["../../../src/components/Forum/ForumThreadEditor.tsx"],"sourcesContent":["import { usePostReply, usePutReply } from '@/synapse-queries/forum/useReply'\nimport {\n useCreateThread,\n useUpdateThreadMessage,\n useUpdateThreadTitle,\n} from '@/synapse-queries/forum/useThread'\nimport { Box, TextField } from '@mui/material'\nimport { CreateDiscussionThread } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { MarkdownEditor } from '../Markdown/MarkdownEditor'\n\nexport type ForumThreadEditorProps = {\n initialTitle?: string\n initialText?: string\n id: string\n onClose: () => void\n isReply: boolean\n} & (\n | { isDialog: false; openDialog?: never }\n | { isDialog: true; openDialog: boolean }\n)\n\nexport function ForumThreadEditor(props: ForumThreadEditorProps) {\n const {\n initialText,\n initialTitle,\n id,\n onClose,\n isReply,\n isDialog,\n openDialog,\n } = props\n\n const [title, setTitle] = useState<string>(initialTitle ?? '')\n const [text, setText] = useState<string>(initialText ?? '')\n const { mutate: updateTitle, isPending: titleUpdateIsPending } =\n useUpdateThreadTitle({\n onSuccess: () => onClose(),\n })\n const { mutate: updateMessage, isPending: messageUpdateIsPending } =\n useUpdateThreadMessage({\n onSuccess: () => onClose(),\n })\n const { mutate: createThread, isPending: createThreadIsPending } =\n useCreateThread({\n onSuccess: () => onClose(),\n })\n const { mutate: createReply, isPending: createReplyIsPending } = usePostReply(\n {\n onSuccess: () => onClose(),\n },\n )\n const { mutate: updateReply, isPending: updateReplyIsPending } = usePutReply({\n onSuccess: () => onClose(),\n })\n\n const updateIsPending =\n messageUpdateIsPending ||\n createReplyIsPending ||\n createThreadIsPending ||\n titleUpdateIsPending ||\n updateReplyIsPending\n\n const isExistingThread = !isReply && initialTitle\n\n const onSave = (text: string, title: string) => {\n if (isReply) {\n if (initialText) {\n // updating reply\n updateReply({\n replyId: id,\n messageMarkdown: text,\n })\n } else {\n // posting reply\n createReply({\n threadId: id,\n messageMarkdown: text,\n })\n }\n } else {\n if (isExistingThread) {\n // updating thread\n updateTitle({\n title: title,\n threadId: id,\n })\n updateMessage({\n messageMarkdown: text,\n threadId: id,\n })\n } else {\n // posting thread\n const request: CreateDiscussionThread = {\n forumId: id,\n title: title,\n messageMarkdown: text,\n }\n createThread(request)\n }\n }\n }\n\n const editorContent = (\n <div>\n {!isReply && (\n <TextField\n fullWidth\n sx={{ my: 1 }}\n placeholder=\"Title\"\n value={title}\n onChange={e => setTitle(e.target.value)}\n />\n )}\n <MarkdownEditor\n placeholder={'Write a reply...'}\n text={text}\n setText={setText}\n />\n </div>\n )\n\n const confirmButtonText = updateIsPending ? 'Saving' : 'Post'\n\n return (\n <>\n {isDialog ? (\n <ConfirmationDialog\n maxWidth=\"md\"\n open={openDialog}\n onCancel={onClose}\n title={\n isReply\n ? 'Edit Reply'\n : isExistingThread\n ? 'Edit Thread'\n : 'New Thread'\n }\n content={editorContent}\n onConfirm={() => onSave(text, title)}\n confirmButtonProps={{ children: confirmButtonText }}\n />\n ) : (\n <>\n {editorContent}\n <Box\n sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1, my: 1 }}\n >\n <ConfirmationButtons\n onCancel={onClose}\n onConfirm={() => onSave(text, title)}\n confirmButtonProps={{ children: confirmButtonText }}\n />\n </Box>\n </>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;AA0BA,SAAgB,EAAkB,GAA+B;CAC/D,IAAM,EACJ,gBACA,iBACA,OACA,YACA,YACA,aACA,kBACE,GAEE,CAAC,GAAO,KAAY,EAAiB,KAAgB,GAAG,EACxD,CAAC,GAAM,KAAW,EAAiB,KAAe,GAAG,EACrD,EAAE,QAAQ,GAAa,WAAW,MACtC,EAAqB,EACnB,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAe,WAAW,MACxC,EAAuB,EACrB,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAc,WAAW,MACvC,EAAgB,EACd,iBAAiB,GAAS,EAC3B,CAAC,EACE,EAAE,QAAQ,GAAa,WAAW,MAAyB,EAC/D,EACE,iBAAiB,GAAS,EAC3B,CACF,EACK,EAAE,QAAQ,GAAa,WAAW,MAAyB,EAAY,EAC3E,iBAAiB,GAAS,EAC3B,CAAC,EAEI,IACJ,KACA,KACA,KACA,KACA,GAEI,IAAmB,CAAC,KAAW,GAE/B,KAAU,GAAc,MAAkB;AAC9C,EAAI,IACE,IAEF,EAAY;GACV,SAAS;GACT,iBAAiB;GAClB,CAAC,GAGF,EAAY;GACV,UAAU;GACV,iBAAiB;GAClB,CAAC,GAGA,KAEF,EAAY;GACH;GACP,UAAU;GACX,CAAC,EACF,EAAc;GACZ,iBAAiB;GACjB,UAAU;GACX,CAAC,IAQF,EAAa;GAJX,SAAS;GACF;GACP,iBAAiB;GAEN,CAAQ;IAKrB,IACJ,kBAAC,OAAD,EAAA,UAAA,CACG,CAAC,KACA,kBAAC,GAAD;EACE,WAAA;EACA,IAAI,EAAE,IAAI,GAAG;EACb,aAAY;EACZ,OAAO;EACP,WAAU,MAAK,EAAS,EAAE,OAAO,MAAM;EACvC,CAAA,EAEJ,kBAAC,GAAD;EACE,aAAa;EACP;EACG;EACT,CAAA,CACE,EAAA,CAAA,EAGF,IAAoB,IAAkB,WAAW;AAEvD,QACE,kBAAA,GAAA,EAAA,UACG,IACC,kBAAC,GAAD;EACE,UAAS;EACT,MAAM;EACN,UAAU;EACV,OACE,IACI,eACA,IACE,gBACA;EAER,SAAS;EACT,iBAAiB,EAAO,GAAM,EAAM;EACpC,oBAAoB,EAAE,UAAU,GAAmB;EACnD,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACG,GACD,kBAAC,GAAD;EACE,IAAI;GAAE,SAAS;GAAQ,gBAAgB;GAAY,KAAK;GAAG,IAAI;GAAG;YAElE,kBAAC,GAAD;GACE,UAAU;GACV,iBAAiB,EAAO,GAAM,EAAM;GACpC,oBAAoB,EAAE,UAAU,GAAmB;GACnD,CAAA;EACE,CAAA,CACL,EAAA,CAAA,EAEJ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FullWidthAlert.d.ts","sourceRoot":"","sources":["../../../src/components/FullWidthAlert/FullWidthAlert.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,UAAU,EAQX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAA;AAC/D,OAAO,uBAAuB,CAAA;AAE9B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,CACA,oCAAoC;AACtC;IACI,OAAO,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;CAC/C,GACD;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CACpB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,CAAA;IACzC,oBAAoB,CAAC,EAAE,iBAAiB,CAAA;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,EAAE,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IACrB,aAAa,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;CACjC;AA2CD;;;GAGG;AACH,iBAAS,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA+HjD;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"FullWidthAlert.d.ts","sourceRoot":"","sources":["../../../src/components/FullWidthAlert/FullWidthAlert.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,UAAU,EAQX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAA;AAC/D,OAAO,uBAAuB,CAAA;AAE9B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,CACA,oCAAoC;AACpC;IACE,OAAO,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;CAC/C,GACD;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CACpB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,CAAA;IACzC,oBAAoB,CAAC,EAAE,iBAAiB,CAAA;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,EAAE,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IACrB,aAAa,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;CACjC;AA2CD;;;GAGG;AACH,iBAAS,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA+HjD;AAED,eAAe,cAAc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FullWidthAlert.js","names":[],"sources":["../../../src/components/FullWidthAlert/FullWidthAlert.tsx"],"sourcesContent":["import { spreadSx } from '@/theme/spreadSx'\nimport {\n Alert,\n AlertProps,\n AlertTitle,\n Box,\n Button,\n ButtonProps,\n Snackbar,\n Stack,\n Tooltip,\n} from '@mui/material'\nimport { MouseEventHandler, ReactNode, useEffect } from 'react'\nimport './FullWidthAlert.scss'\n\nexport type AlertButtonConfig = {\n text: string\n isDisabled?: boolean\n tooltipText?: string\n} & (\n | // \"onClick\" or \"href\", but not both\n {\n onClick?: MouseEventHandler<HTMLButtonElement>\n }\n | { href?: string }\n)\n\nexport type FullWidthAlertVariant = 'warning' | 'info' | 'danger' | 'success'\n\nexport interface FullWidthAlertProps {\n variant?: FullWidthAlertVariant\n show?: boolean\n title?: string\n description?: ReactNode\n primaryButtonConfig?: AlertButtonConfig\n secondaryButtonConfig?: AlertButtonConfig\n tertiaryButtonConfig?: AlertButtonConfig\n onClose?: () => void\n autoCloseAfterDelayInSeconds?: number\n isGlobal?: boolean\n icon?: ReactNode\n sx?: AlertProps['sx']\n globalAlertSx?: AlertProps['sx']\n}\n\nfunction variantToSeverity(variant: string | undefined) {\n return (variant === 'danger' ? 'error' : variant) as AlertProps['severity']\n}\n\nfunction ButtonFromConfig(props: {\n config?: AlertButtonConfig\n variant: ButtonProps['variant']\n}) {\n const { config, variant } = props\n if (config && ('onClick' in config || 'href' in config)) {\n return (\n <Tooltip title={config.tooltipText ?? ''} enterNextDelay={300}>\n <span // See https://github.com/wwayne/react-tooltip/issues/304\n data-tip-disable={false}\n >\n <Button\n variant={variant}\n sx={{\n width: { xs: '100%', md: 'initial' },\n }}\n color=\"primary\"\n disabled={config.isDisabled}\n onClick={e => {\n if ('onClick' in config) {\n e.preventDefault()\n config.onClick!(e)\n } else if ('href' in config) {\n e.preventDefault()\n window.open(config.href, '_blank', 'noopener')\n }\n }}\n >\n {config.text}\n </Button>\n </span>\n </Tooltip>\n )\n }\n return null\n}\n\n/**\n * Nav bar item, displayed when files have been added to the Download List.\n * This must be configured with the URL of a page dedicated to showing the Download List.\n */\nfunction FullWidthAlert(props: FullWidthAlertProps) {\n const {\n title,\n description,\n primaryButtonConfig,\n secondaryButtonConfig,\n tertiaryButtonConfig,\n show = true,\n onClose,\n autoCloseAfterDelayInSeconds,\n variant = 'info',\n isGlobal = true,\n icon,\n sx,\n globalAlertSx,\n } = props\n\n useEffect(() => {\n let timer: NodeJS.Timeout\n if (onClose && autoCloseAfterDelayInSeconds) {\n timer = setTimeout(onClose, autoCloseAfterDelayInSeconds * 1000)\n }\n return () => {\n if (timer) {\n clearTimeout(timer)\n }\n }\n }, [onClose, autoCloseAfterDelayInSeconds])\n\n const alert = (\n <Alert\n severity={variantToSeverity(variant)}\n sx={spreadSx(\n {\n width: '100%',\n my: '10px',\n '.MuiAlert-message': {\n flexGrow: 1,\n },\n '.MuiAlert-icon': {\n display: { xs: 'none', sm: 'flex' },\n },\n },\n sx,\n )}\n className=\"FullWidthAlert\"\n onClose={onClose}\n icon={icon}\n >\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={{ xs: 1, sm: 2 }}\n sx={{\n alignItems: { xs: 'start', sm: 'center' },\n gap: { xs: '8px', sm: 'initial' },\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <Box>\n {title && <AlertTitle>{title}</AlertTitle>}\n <span className=\"FullWidthAlertDescription\">{description}</span>\n </Box>\n {(primaryButtonConfig ||\n secondaryButtonConfig ||\n tertiaryButtonConfig) && (\n <Stack\n spacing={{ xs: 1, lg: 2 }}\n direction={{ xs: 'row', sm: 'column', lg: 'row' }}\n sx={theme => ({\n alignItems: 'center',\n display: 'flex',\n flexShrink: 0,\n gap: { xs: '8px', sm: 'initial' },\n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n width: { xs: '100%', sm: 'initial' },\n [theme.breakpoints.down('sm')]: {\n '& > *': {\n flexGrow: 1,\n },\n },\n })}\n >\n {tertiaryButtonConfig && (\n <ButtonFromConfig config={tertiaryButtonConfig} variant=\"text\" />\n )}\n {secondaryButtonConfig && (\n <ButtonFromConfig config={secondaryButtonConfig} variant=\"text\" />\n )}\n {primaryButtonConfig && (\n <ButtonFromConfig\n config={primaryButtonConfig}\n variant=\"contained\"\n />\n )}\n </Stack>\n )}\n </Stack>\n </Alert>\n )\n\n return (\n <>\n {isGlobal ? (\n <Snackbar\n open={show}\n className={isGlobal ? 'FullWidthAlertGlobal' : undefined}\n sx={{\n width: '96%',\n filter:\n 'drop-shadow(0px 8px 8px rgba(0, 0, 0, 0.05)) drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.05)) drop-shadow(0px 1px 1px rgba(0, 0, 0, 0.05))',\n ...globalAlertSx,\n }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n slotProps={{\n transition: {\n appear: false,\n },\n }}\n >\n {alert}\n </Snackbar>\n ) : (\n show && alert\n )}\n </>\n )\n}\n\nexport default FullWidthAlert\n"],"mappings":"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"}
1
+ {"version":3,"file":"FullWidthAlert.js","names":[],"sources":["../../../src/components/FullWidthAlert/FullWidthAlert.tsx"],"sourcesContent":["import { spreadSx } from '@/theme/spreadSx'\nimport {\n Alert,\n AlertProps,\n AlertTitle,\n Box,\n Button,\n ButtonProps,\n Snackbar,\n Stack,\n Tooltip,\n} from '@mui/material'\nimport { MouseEventHandler, ReactNode, useEffect } from 'react'\nimport './FullWidthAlert.scss'\n\nexport type AlertButtonConfig = {\n text: string\n isDisabled?: boolean\n tooltipText?: string\n} & (\n | // \"onClick\" or \"href\", but not both\n {\n onClick?: MouseEventHandler<HTMLButtonElement>\n }\n | { href?: string }\n)\n\nexport type FullWidthAlertVariant = 'warning' | 'info' | 'danger' | 'success'\n\nexport interface FullWidthAlertProps {\n variant?: FullWidthAlertVariant\n show?: boolean\n title?: string\n description?: ReactNode\n primaryButtonConfig?: AlertButtonConfig\n secondaryButtonConfig?: AlertButtonConfig\n tertiaryButtonConfig?: AlertButtonConfig\n onClose?: () => void\n autoCloseAfterDelayInSeconds?: number\n isGlobal?: boolean\n icon?: ReactNode\n sx?: AlertProps['sx']\n globalAlertSx?: AlertProps['sx']\n}\n\nfunction variantToSeverity(variant: string | undefined) {\n return (variant === 'danger' ? 'error' : variant) as AlertProps['severity']\n}\n\nfunction ButtonFromConfig(props: {\n config?: AlertButtonConfig\n variant: ButtonProps['variant']\n}) {\n const { config, variant } = props\n if (config && ('onClick' in config || 'href' in config)) {\n return (\n <Tooltip title={config.tooltipText ?? ''} enterNextDelay={300}>\n <span // See https://github.com/wwayne/react-tooltip/issues/304\n data-tip-disable={false}\n >\n <Button\n variant={variant}\n sx={{\n width: { xs: '100%', md: 'initial' },\n }}\n color=\"primary\"\n disabled={config.isDisabled}\n onClick={e => {\n if ('onClick' in config) {\n e.preventDefault()\n config.onClick!(e)\n } else if ('href' in config) {\n e.preventDefault()\n window.open(config.href, '_blank', 'noopener')\n }\n }}\n >\n {config.text}\n </Button>\n </span>\n </Tooltip>\n )\n }\n return null\n}\n\n/**\n * Nav bar item, displayed when files have been added to the Download List.\n * This must be configured with the URL of a page dedicated to showing the Download List.\n */\nfunction FullWidthAlert(props: FullWidthAlertProps) {\n const {\n title,\n description,\n primaryButtonConfig,\n secondaryButtonConfig,\n tertiaryButtonConfig,\n show = true,\n onClose,\n autoCloseAfterDelayInSeconds,\n variant = 'info',\n isGlobal = true,\n icon,\n sx,\n globalAlertSx,\n } = props\n\n useEffect(() => {\n let timer: NodeJS.Timeout\n if (onClose && autoCloseAfterDelayInSeconds) {\n timer = setTimeout(onClose, autoCloseAfterDelayInSeconds * 1000)\n }\n return () => {\n if (timer) {\n clearTimeout(timer)\n }\n }\n }, [onClose, autoCloseAfterDelayInSeconds])\n\n const alert = (\n <Alert\n severity={variantToSeverity(variant)}\n sx={spreadSx(\n {\n width: '100%',\n my: '10px',\n '.MuiAlert-message': {\n flexGrow: 1,\n },\n '.MuiAlert-icon': {\n display: { xs: 'none', sm: 'flex' },\n },\n },\n sx,\n )}\n className=\"FullWidthAlert\"\n onClose={onClose}\n icon={icon}\n >\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={{ xs: 1, sm: 2 }}\n sx={{\n alignItems: { xs: 'start', sm: 'center' },\n gap: { xs: '8px', sm: 'initial' },\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <Box>\n {title && <AlertTitle>{title}</AlertTitle>}\n <span className=\"FullWidthAlertDescription\">{description}</span>\n </Box>\n {(primaryButtonConfig ||\n secondaryButtonConfig ||\n tertiaryButtonConfig) && (\n <Stack\n spacing={{ xs: 1, lg: 2 }}\n direction={{ xs: 'row', sm: 'column', lg: 'row' }}\n sx={theme => ({\n alignItems: 'center',\n display: 'flex',\n flexShrink: 0,\n gap: { xs: '8px', sm: 'initial' },\n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n width: { xs: '100%', sm: 'initial' },\n [theme.breakpoints.down('sm')]: {\n '& > *': {\n flexGrow: 1,\n },\n },\n })}\n >\n {tertiaryButtonConfig && (\n <ButtonFromConfig config={tertiaryButtonConfig} variant=\"text\" />\n )}\n {secondaryButtonConfig && (\n <ButtonFromConfig config={secondaryButtonConfig} variant=\"text\" />\n )}\n {primaryButtonConfig && (\n <ButtonFromConfig\n config={primaryButtonConfig}\n variant=\"contained\"\n />\n )}\n </Stack>\n )}\n </Stack>\n </Alert>\n )\n\n return (\n <>\n {isGlobal ? (\n <Snackbar\n open={show}\n className={isGlobal ? 'FullWidthAlertGlobal' : undefined}\n sx={{\n width: '96%',\n filter:\n 'drop-shadow(0px 8px 8px rgba(0, 0, 0, 0.05)) drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.05)) drop-shadow(0px 1px 1px rgba(0, 0, 0, 0.05))',\n ...globalAlertSx,\n }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n slotProps={{\n transition: {\n appear: false,\n },\n }}\n >\n {alert}\n </Snackbar>\n ) : (\n show && alert\n )}\n </>\n )\n}\n\nexport default FullWidthAlert\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PortalDOIUtils.d.ts","sourceRoot":"","sources":["../../../../src/components/GenericCard/PortalDOI/PortalDOIUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAIxF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,WAiBA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,0GAA0G;IAC1G,sBAAsB,CAAC,EAAE,yBAAyB,CAAC,wBAAwB,CAAC,CAAA;IAC5E,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACpC,GAAG,MAAM,GAAG,SAAS,CAwBrB"}
1
+ {"version":3,"file":"PortalDOIUtils.d.ts","sourceRoot":"","sources":["../../../../src/components/GenericCard/PortalDOI/PortalDOIUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAIxF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,WAiBA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,0GAA0G;IAC1G,sBAAsB,CAAC,EAAE,yBAAyB,CAAC,wBAAwB,CAAC,CAAA;IAC5E,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACpC,GAAG,MAAM,GAAG,SAAS,CA2BrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"PortalDOIUtils.js","names":[],"sources":["../../../../src/components/GenericCard/PortalDOI/PortalDOIUtils.ts"],"sourcesContent":["import { TableToGenericCardMapping } from '@/components/GenericCard/TableRowGenericCard'\nimport { useGetDOIAssociation } from '@/synapse-queries/doi/useDOI'\nimport { useGetUserPortalPermissions } from '@/synapse-queries/portal/usePortal'\n\nexport function useShowDoiCardLabel(opts: {\n /** The ID of the portal created with https://rest-docs.synapse.org/rest/POST/portal.html */\n portalId?: string\n /** The candidate DOI ID of the resource */\n resourceId?: string\n}) {\n const { portalId, resourceId } = opts\n\n const { data: doi } = useGetDOIAssociation(\n {\n id: resourceId!,\n portalId,\n type: 'PORTAL_RESOURCE',\n },\n { enabled: Boolean(portalId && resourceId) },\n )\n const { data: canMintDoi } = useGetUserPortalPermissions(portalId!, {\n enabled: !!portalId,\n select: permissions => permissions.canMintDoi!,\n })\n\n return Boolean(doi || canMintDoi)\n}\n\n/**\n * Given a portalDoiConfiguration and a row of data, return the candidate DOI ID for this row. The candidate DOI ID\n * can be used to look up an existing DOI or create a new one that can be looked up later.\n */\nexport function getCandidateDoiId(args: {\n /** Configuration to display a DOI, as well as the ability to create one for users with such permission */\n portalDoiConfiguration?: TableToGenericCardMapping['portalDoiConfiguration']\n /** A record that represents a table row or DOI lookup, mapping from column name to value */\n data: Record<string, string | null>\n}): string | undefined {\n const { portalDoiConfiguration, data } = args\n\n if (!portalDoiConfiguration) {\n return undefined\n }\n\n const { resourceType, resourceIdKeyColumns, serializeDoiString } =\n portalDoiConfiguration\n\n const doiAttributes: Record<string, string> | undefined =\n resourceIdKeyColumns?.reduce((acc, columnName) => {\n const value = data[columnName]\n if (value != null) {\n acc[columnName] = value\n }\n return acc\n }, {} as Record<string, string>)\n\n if (!doiAttributes || Object.keys(doiAttributes).length === 0) {\n return undefined\n }\n\n return serializeDoiString(resourceType, doiAttributes)\n}\n"],"mappings":";;;AAIA,SAAgB,EAAoB,GAKjC;CACD,IAAM,EAAE,aAAU,kBAAe,GAE3B,EAAE,MAAM,MAAQ,EACpB;EACE,IAAI;EACJ;EACA,MAAM;EACP,EACD,EAAE,SAAS,GAAQ,KAAY,IAAa,CAC7C,EACK,EAAE,MAAM,MAAe,EAA4B,GAAW;EAClE,SAAS,CAAC,CAAC;EACX,SAAQ,MAAe,EAAY;EACpC,CAAC;AAEF,QAAO,GAAQ,KAAO;;AAOxB,SAAgB,EAAkB,GAKX;CACrB,IAAM,EAAE,2BAAwB,YAAS;AAEzC,KAAI,CAAC,EACH;CAGF,IAAM,EAAE,iBAAc,yBAAsB,0BAC1C,GAEI,IACJ,GAAsB,QAAQ,GAAK,MAAe;EAChD,IAAM,IAAQ,EAAK;AAInB,SAHI,KAAS,SACX,EAAI,KAAc,IAEb;IACN,EAAE,CAA2B;AAE9B,QAAC,KAAiB,OAAO,KAAK,EAAc,CAAC,WAAW,GAI5D,QAAO,EAAmB,GAAc,EAAc"}
1
+ {"version":3,"file":"PortalDOIUtils.js","names":[],"sources":["../../../../src/components/GenericCard/PortalDOI/PortalDOIUtils.ts"],"sourcesContent":["import { TableToGenericCardMapping } from '@/components/GenericCard/TableRowGenericCard'\nimport { useGetDOIAssociation } from '@/synapse-queries/doi/useDOI'\nimport { useGetUserPortalPermissions } from '@/synapse-queries/portal/usePortal'\n\nexport function useShowDoiCardLabel(opts: {\n /** The ID of the portal created with https://rest-docs.synapse.org/rest/POST/portal.html */\n portalId?: string\n /** The candidate DOI ID of the resource */\n resourceId?: string\n}) {\n const { portalId, resourceId } = opts\n\n const { data: doi } = useGetDOIAssociation(\n {\n id: resourceId!,\n portalId,\n type: 'PORTAL_RESOURCE',\n },\n { enabled: Boolean(portalId && resourceId) },\n )\n const { data: canMintDoi } = useGetUserPortalPermissions(portalId!, {\n enabled: !!portalId,\n select: permissions => permissions.canMintDoi!,\n })\n\n return Boolean(doi || canMintDoi)\n}\n\n/**\n * Given a portalDoiConfiguration and a row of data, return the candidate DOI ID for this row. The candidate DOI ID\n * can be used to look up an existing DOI or create a new one that can be looked up later.\n */\nexport function getCandidateDoiId(args: {\n /** Configuration to display a DOI, as well as the ability to create one for users with such permission */\n portalDoiConfiguration?: TableToGenericCardMapping['portalDoiConfiguration']\n /** A record that represents a table row or DOI lookup, mapping from column name to value */\n data: Record<string, string | null>\n}): string | undefined {\n const { portalDoiConfiguration, data } = args\n\n if (!portalDoiConfiguration) {\n return undefined\n }\n\n const { resourceType, resourceIdKeyColumns, serializeDoiString } =\n portalDoiConfiguration\n\n const doiAttributes: Record<string, string> | undefined =\n resourceIdKeyColumns?.reduce(\n (acc, columnName) => {\n const value = data[columnName]\n if (value != null) {\n acc[columnName] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (!doiAttributes || Object.keys(doiAttributes).length === 0) {\n return undefined\n }\n\n return serializeDoiString(resourceType, doiAttributes)\n}\n"],"mappings":";;;AAIA,SAAgB,EAAoB,GAKjC;CACD,IAAM,EAAE,aAAU,kBAAe,GAE3B,EAAE,MAAM,MAAQ,EACpB;EACE,IAAI;EACJ;EACA,MAAM;EACP,EACD,EAAE,SAAS,GAAQ,KAAY,IAAa,CAC7C,EACK,EAAE,MAAM,MAAe,EAA4B,GAAW;EAClE,SAAS,CAAC,CAAC;EACX,SAAQ,MAAe,EAAY;EACpC,CAAC;AAEF,QAAO,GAAQ,KAAO;;AAOxB,SAAgB,EAAkB,GAKX;CACrB,IAAM,EAAE,2BAAwB,YAAS;AAEzC,KAAI,CAAC,EACH;CAGF,IAAM,EAAE,iBAAc,yBAAsB,0BAC1C,GAEI,IACJ,GAAsB,QACnB,GAAK,MAAe;EACnB,IAAM,IAAQ,EAAK;AAInB,SAHI,KAAS,SACX,EAAI,KAAc,IAEb;IAET,EAAE,CACH;AAEC,QAAC,KAAiB,OAAO,KAAK,EAAc,CAAC,WAAW,GAI5D,QAAO,EAAmB,GAAc,EAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownSynapsePlot.js","names":[],"sources":["../../../../src/components/Markdown/widget/MarkdownSynapsePlot.tsx"],"sourcesContent":["import React from 'react'\nimport SynapsePlot from '../../Plot/SynapsePlot'\nimport { AxisType, PlotType } from 'plotly.js-basic-dist'\n\nexport type MarkdownSynapsePlotProps = {\n query: string //sql string\n title?: string //plot title\n xtitle?: string // x-axis title\n ytitle?: string // y-axis title\n type: string // Plotly PlotType\n xaxistype?: string // Plotly AxisType\n showlegend?: string // sets the legend visibility ('true' | 'false')\n horizontal?: string // sets the if a bar chart should be horizontal or vertical ('true' | 'false')\n barmode?: string // Plotly barmode ('stack' | 'group' | 'overlay' | 'relative')\n displayModebar?: string // sets the modebar visibility ('true' | 'false')\n}\n\nconst toBoolean = (v?: string, fallbackValue?: boolean) => {\n return v ? v.toLowerCase() == 'true' : fallbackValue ?? false\n}\n\nexport const MarkdownSynapsePlot = (\n props: MarkdownSynapsePlotProps,\n): React.ReactNode => {\n const {\n query,\n title,\n xtitle,\n ytitle,\n type,\n xaxistype,\n showlegend,\n barmode,\n horizontal,\n displayModebar,\n } = props\n const plotlyShowLegend = toBoolean(showlegend, true)\n const plotlyIsHorizontal = toBoolean(horizontal, false)\n const plotlyDisplayModebar = toBoolean(displayModebar, false)\n const plotlyBarMode = barmode\n ? (barmode.toLowerCase() as 'stack' | 'group' | 'overlay' | 'relative')\n : undefined\n const plotlyType = type.toLowerCase() as PlotType\n\n let plotlyXAxisType: AxisType | undefined = undefined\n if (xaxistype) {\n plotlyXAxisType = xaxistype.toLowerCase() as AxisType\n }\n\n return (\n <SynapsePlot\n synapsePlotWidgetParams={{\n query,\n xtitle,\n ytitle,\n type: plotlyType,\n barmode: plotlyBarMode,\n displayModeBar: plotlyDisplayModebar,\n horizontal: plotlyIsHorizontal,\n showlegend: plotlyShowLegend,\n title: title,\n xaxistype: plotlyXAxisType,\n }}\n />\n )\n}\n\nexport default MarkdownSynapsePlot\n"],"mappings":";;;;AAiBA,IAAM,KAAa,GAAY,MACtB,IAAI,EAAE,aAAa,IAAI,SAAS,KAAiB,IAG7C,KACX,MACoB;CACpB,IAAM,EACJ,UACA,UACA,WACA,WACA,SACA,cACA,eACA,YACA,eACA,sBACE,GACE,IAAmB,EAAU,GAAY,GAAK,EAC9C,IAAqB,EAAU,GAAY,GAAM,EACjD,IAAuB,EAAU,GAAgB,GAAM,EACvD,IAAgB,IACjB,EAAQ,aAAa,GACtB,KAAA,GACE,IAAa,EAAK,aAAa,EAEjC;AAKJ,QAJI,MACF,IAAkB,EAAU,aAAa,GAIzC,kBAAC,GAAD,EACE,yBAAyB;EACvB;EACA;EACA;EACA,MAAM;EACN,SAAS;EACT,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACL;EACP,WAAW;EACZ,EACD,CAAA"}
1
+ {"version":3,"file":"MarkdownSynapsePlot.js","names":[],"sources":["../../../../src/components/Markdown/widget/MarkdownSynapsePlot.tsx"],"sourcesContent":["import React from 'react'\nimport SynapsePlot from '../../Plot/SynapsePlot'\nimport { AxisType, PlotType } from 'plotly.js-basic-dist'\n\nexport type MarkdownSynapsePlotProps = {\n query: string //sql string\n title?: string //plot title\n xtitle?: string // x-axis title\n ytitle?: string // y-axis title\n type: string // Plotly PlotType\n xaxistype?: string // Plotly AxisType\n showlegend?: string // sets the legend visibility ('true' | 'false')\n horizontal?: string // sets the if a bar chart should be horizontal or vertical ('true' | 'false')\n barmode?: string // Plotly barmode ('stack' | 'group' | 'overlay' | 'relative')\n displayModebar?: string // sets the modebar visibility ('true' | 'false')\n}\n\nconst toBoolean = (v?: string, fallbackValue?: boolean) => {\n return v ? v.toLowerCase() == 'true' : (fallbackValue ?? false)\n}\n\nexport const MarkdownSynapsePlot = (\n props: MarkdownSynapsePlotProps,\n): React.ReactNode => {\n const {\n query,\n title,\n xtitle,\n ytitle,\n type,\n xaxistype,\n showlegend,\n barmode,\n horizontal,\n displayModebar,\n } = props\n const plotlyShowLegend = toBoolean(showlegend, true)\n const plotlyIsHorizontal = toBoolean(horizontal, false)\n const plotlyDisplayModebar = toBoolean(displayModebar, false)\n const plotlyBarMode = barmode\n ? (barmode.toLowerCase() as 'stack' | 'group' | 'overlay' | 'relative')\n : undefined\n const plotlyType = type.toLowerCase() as PlotType\n\n let plotlyXAxisType: AxisType | undefined = undefined\n if (xaxistype) {\n plotlyXAxisType = xaxistype.toLowerCase() as AxisType\n }\n\n return (\n <SynapsePlot\n synapsePlotWidgetParams={{\n query,\n xtitle,\n ytitle,\n type: plotlyType,\n barmode: plotlyBarMode,\n displayModeBar: plotlyDisplayModebar,\n horizontal: plotlyIsHorizontal,\n showlegend: plotlyShowLegend,\n title: title,\n xaxistype: plotlyXAxisType,\n }}\n />\n )\n}\n\nexport default MarkdownSynapsePlot\n"],"mappings":";;;;AAiBA,IAAM,KAAa,GAAY,MACtB,IAAI,EAAE,aAAa,IAAI,SAAU,KAAiB,IAG9C,KACX,MACoB;CACpB,IAAM,EACJ,UACA,UACA,WACA,WACA,SACA,cACA,eACA,YACA,eACA,sBACE,GACE,IAAmB,EAAU,GAAY,GAAK,EAC9C,IAAqB,EAAU,GAAY,GAAM,EACjD,IAAuB,EAAU,GAAgB,GAAM,EACvD,IAAgB,IACjB,EAAQ,aAAa,GACtB,KAAA,GACE,IAAa,EAAK,aAAa,EAEjC;AAKJ,QAJI,MACF,IAAkB,EAAU,aAAa,GAIzC,kBAAC,GAAD,EACE,yBAAyB;EACvB;EACA;EACA;EACA,MAAM;EACN,SAAS;EACT,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACL;EACP,WAAW;EACZ,EACD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthClientAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/OAuthClientAclEditor/OAuthClientAclEditor.tsx"],"names":[],"mappings":"AAgCA,MAAM,MAAM,0BAA0B,GAAG;IAEvC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,oBAAoB,kIAyH/B,CAAA"}
1
+ {"version":3,"file":"OAuthClientAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/OAuthClientAclEditor/OAuthClientAclEditor.tsx"],"names":[],"mappings":"AAgCA,MAAM,MAAM,0BAA0B,GAAG;IAEvC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,oBAAoB,kIAqH/B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthClientAclEditor.js","names":[],"sources":["../../../src/components/OAuthClientAclEditor/OAuthClientAclEditor.tsx"],"sourcesContent":["import {\n useGetOAuthClientACL,\n useUpdateOAuthClientACL,\n} from '@/synapse-queries'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Stack } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n consolidateResourceAccessList,\n convertResourceAccessSetToSRC,\n updateACLWithSRCResourceAccessList,\n} 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'\nimport { AccessControlList } from '@sage-bionetworks/synapse-client'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_ADMINISTER_OAUTH_CLIENT',\n]\n\nexport type OAuthClientAclEditorHandle = {\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 OAuthClientAclEditorProps = {\n clientId: string\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const OAuthClientAclEditor = forwardRef(function OAuthClientAclEditor(\n props: OAuthClientAclEditorProps,\n ref: ForwardedRef<OAuthClientAclEditorHandle>,\n) {\n const { clientId, 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 useGetOAuthClientACL(clientId, {\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 () =>\n consolidateResourceAccessList(\n convertResourceAccessSetToSRC(originalAcl?.resourceAccess),\n ),\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: updateAcl } = useUpdateOAuthClientACL({\n onSuccess: () => onMutationSuccess(),\n onError: (error: SynapseClientError) => onMutationError(error),\n })\n\n useImperativeHandle(\n ref,\n () => {\n return {\n save() {\n const updatedAcl: AccessControlList =\n updateACLWithSRCResourceAccessList(originalAcl, resourceAccessList)\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 {\n updateAcl(updatedAcl)\n }\n },\n }\n },\n [\n clientId,\n originalAcl,\n consolidatedOriginalResourceAccess,\n resourceAccessList,\n onSaveComplete,\n updateAcl,\n ],\n )\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={/* This should never happen */ ''}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_ADMINISTER_OAUTH_CLIENT'),\n )\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"],"mappings":";;;;;;;;;;;AA4BA,IAAM,IAA+C,CACnD,8BACD,EAYY,IAAuB,EAAW,SAC7C,GACA,GACA;CACA,IAAM,EAAE,aAAU,sBAAmB,GAC/B,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,EAAqB,GAAU,EAE7B,WAAW,UACZ,CAAC,EAEE,IAAqC,QAEvC,EACE,EAA8B,GAAa,eAAe,CAC3D,EACH,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,EAAwB;EACpD,iBAAiB,GAAmB;EACpC,UAAU,MAA8B,EAAgB,EAAM;EAC/D,CAAC;AAkCF,QAhCA,EACE,UAES,EACL,OAAO;EACL,IAAM,IACJ,EAAmC,GAAa,EAAmB;AAOrE,EALG,MAAgB,QAAQ,KAAc,QAEtC,EAAQ,GAAoC,EAAmB,IAC9D,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GAEpB,EAAU,EAAW;IAG1B,GAEH;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAGC,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH,CAME,kBAAC,GAAD;GACsB;GACO;GAC3B,WAAW;GACX,SAAS;GACT,WAA0C;GAC1C,sBAAqB,MACnB,EACE,GACA,EAAiC,8BAA8B,CAChE;GAEuB;GACA;GAC1B,2BAA2B;GAC3B,oBAAoB;GACpB,aAAa;GACb,CAAA,EACD,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS;GAAc,CAAA,CAC3C;;EAEV"}
1
+ {"version":3,"file":"OAuthClientAclEditor.js","names":[],"sources":["../../../src/components/OAuthClientAclEditor/OAuthClientAclEditor.tsx"],"sourcesContent":["import {\n useGetOAuthClientACL,\n useUpdateOAuthClientACL,\n} from '@/synapse-queries'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Stack } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n consolidateResourceAccessList,\n convertResourceAccessSetToSRC,\n updateACLWithSRCResourceAccessList,\n} 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'\nimport { AccessControlList } from '@sage-bionetworks/synapse-client'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_ADMINISTER_OAUTH_CLIENT',\n]\n\nexport type OAuthClientAclEditorHandle = {\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 OAuthClientAclEditorProps = {\n clientId: string\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const OAuthClientAclEditor = forwardRef(function OAuthClientAclEditor(\n props: OAuthClientAclEditorProps,\n ref: ForwardedRef<OAuthClientAclEditorHandle>,\n) {\n const { clientId, 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 useGetOAuthClientACL(clientId, {\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 () =>\n consolidateResourceAccessList(\n convertResourceAccessSetToSRC(originalAcl?.resourceAccess),\n ),\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: updateAcl } = useUpdateOAuthClientACL({\n onSuccess: () => onMutationSuccess(),\n onError: (error: SynapseClientError) => onMutationError(error),\n })\n\n useImperativeHandle(ref, () => {\n return {\n save() {\n const updatedAcl: AccessControlList =\n updateACLWithSRCResourceAccessList(originalAcl, resourceAccessList)\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 {\n updateAcl(updatedAcl)\n }\n },\n }\n }, [\n clientId,\n originalAcl,\n consolidatedOriginalResourceAccess,\n resourceAccessList,\n onSaveComplete,\n updateAcl,\n ])\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={/* This should never happen */ ''}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_ADMINISTER_OAUTH_CLIENT'),\n )\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"],"mappings":";;;;;;;;;;;AA4BA,IAAM,IAA+C,CACnD,8BACD,EAYY,IAAuB,EAAW,SAC7C,GACA,GACA;CACA,IAAM,EAAE,aAAU,sBAAmB,GAC/B,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,EAAqB,GAAU,EAE7B,WAAW,UACZ,CAAC,EAEE,IAAqC,QAEvC,EACE,EAA8B,GAAa,eAAe,CAC3D,EACH,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,EAAwB;EACpD,iBAAiB,GAAmB;EACpC,UAAU,MAA8B,EAAgB,EAAM;EAC/D,CAAC;AA8BF,QA5BA,EAAoB,UACX,EACL,OAAO;EACL,IAAM,IACJ,EAAmC,GAAa,EAAmB;AAOrE,EALG,MAAgB,QAAQ,KAAc,QAEtC,EAAQ,GAAoC,EAAmB,IAC9D,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GAEpB,EAAU,EAAW;IAG1B,GACA;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAGA,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH,CAME,kBAAC,GAAD;GACsB;GACO;GAC3B,WAAW;GACX,SAAS;GACT,WAA0C;GAC1C,sBAAqB,MACnB,EACE,GACA,EAAiC,8BAA8B,CAChE;GAEuB;GACA;GAC1B,2BAA2B;GAC3B,oBAAoB;GACpB,aAAa;GACb,CAAA,EACD,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS;GAAc,CAAA,CAC3C;;EAEV"}
@@ -1 +1 @@
1
- {"version":3,"file":"PortalAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PortalAclEditor/PortalAclEditor.tsx"],"names":[],"mappings":"AA2BA,MAAM,MAAM,qBAAqB,GAAG;IAElC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,eAAe,wHAyH1B,CAAA"}
1
+ {"version":3,"file":"PortalAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PortalAclEditor/PortalAclEditor.tsx"],"names":[],"mappings":"AA2BA,MAAM,MAAM,qBAAqB,GAAG;IAElC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,eAAe,wHAqH1B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PortalAclEditor.js","names":[],"sources":["../../../src/components/PortalAclEditor/PortalAclEditor.tsx"],"sourcesContent":["import { useGetPortalACL, useUpdatePortalACL } from '@/synapse-queries'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Stack } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n consolidateResourceAccessList,\n convertResourceAccessSetToSRC,\n updateACLWithSRCResourceAccessList,\n} 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'\nimport { AccessControlList } from '@sage-bionetworks/synapse-client'\n\nconst availablePermissionLevels: PermissionLevel[] = ['CAN_ADMINISTER_PORTAL']\n\nexport type PortalAclEditorHandle = {\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 PortalAclEditorProps = {\n portalId: string\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const PortalAclEditor = forwardRef(function PortalAclEditor(\n props: PortalAclEditorProps,\n ref: ForwardedRef<PortalAclEditorHandle>,\n) {\n const { portalId, 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 useGetPortalACL(portalId, {\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 () =>\n consolidateResourceAccessList(\n convertResourceAccessSetToSRC(originalAcl?.resourceAccess),\n ),\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: updateAcl } = useUpdatePortalACL({\n onSuccess: () => onMutationSuccess(),\n onError: (error: SynapseClientError) => onMutationError(error),\n })\n\n useImperativeHandle(\n ref,\n () => {\n return {\n save() {\n const updatedAcl: AccessControlList =\n updateACLWithSRCResourceAccessList(originalAcl, resourceAccessList)\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 {\n updateAcl(updatedAcl)\n }\n },\n }\n },\n [\n portalId,\n originalAcl,\n consolidatedOriginalResourceAccess,\n resourceAccessList,\n onSaveComplete,\n updateAcl,\n ],\n )\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={/* This should never happen */ ''}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_ADMINISTER_PORTAL'),\n )\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"],"mappings":";;;;;;;;;;;AAyBA,IAAM,IAA+C,CAAC,wBAAwB,EAYjE,IAAkB,EAAW,SACxC,GACA,GACA;CACA,IAAM,EAAE,aAAU,sBAAmB,GAC/B,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,EAAgB,GAAU,EAExB,WAAW,UACZ,CAAC,EAEE,IAAqC,QAEvC,EACE,EAA8B,GAAa,eAAe,CAC3D,EACH,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,EAAmB;EAC/C,iBAAiB,GAAmB;EACpC,UAAU,MAA8B,EAAgB,EAAM;EAC/D,CAAC;AAkCF,QAhCA,EACE,UAES,EACL,OAAO;EACL,IAAM,IACJ,EAAmC,GAAa,EAAmB;AAOrE,EALG,MAAgB,QAAQ,KAAc,QAEtC,EAAQ,GAAoC,EAAmB,IAC9D,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GAEpB,EAAU,EAAW;IAG1B,GAEH;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAGC,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH,CAME,kBAAC,GAAD;GACsB;GACO;GAC3B,WAAW;GACX,SAAS;GACT,WAA0C;GAC1C,sBAAqB,MACnB,EACE,GACA,EAAiC,wBAAwB,CAC1D;GAEuB;GACA;GAC1B,2BAA2B;GAC3B,oBAAoB;GACpB,aAAa;GACb,CAAA,EACD,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS;GAAc,CAAA,CAC3C;;EAEV"}
1
+ {"version":3,"file":"PortalAclEditor.js","names":[],"sources":["../../../src/components/PortalAclEditor/PortalAclEditor.tsx"],"sourcesContent":["import { useGetPortalACL, useUpdatePortalACL } from '@/synapse-queries'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { Alert, Stack } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n consolidateResourceAccessList,\n convertResourceAccessSetToSRC,\n updateACLWithSRCResourceAccessList,\n} 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'\nimport { AccessControlList } from '@sage-bionetworks/synapse-client'\n\nconst availablePermissionLevels: PermissionLevel[] = ['CAN_ADMINISTER_PORTAL']\n\nexport type PortalAclEditorHandle = {\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 PortalAclEditorProps = {\n portalId: string\n onSaveComplete: (saveSuccessful: boolean) => void\n}\n\nexport const PortalAclEditor = forwardRef(function PortalAclEditor(\n props: PortalAclEditorProps,\n ref: ForwardedRef<PortalAclEditorHandle>,\n) {\n const { portalId, 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 useGetPortalACL(portalId, {\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 () =>\n consolidateResourceAccessList(\n convertResourceAccessSetToSRC(originalAcl?.resourceAccess),\n ),\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: updateAcl } = useUpdatePortalACL({\n onSuccess: () => onMutationSuccess(),\n onError: (error: SynapseClientError) => onMutationError(error),\n })\n\n useImperativeHandle(ref, () => {\n return {\n save() {\n const updatedAcl: AccessControlList =\n updateACLWithSRCResourceAccessList(originalAcl, resourceAccessList)\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 {\n updateAcl(updatedAcl)\n }\n },\n }\n }, [\n portalId,\n originalAcl,\n consolidatedOriginalResourceAccess,\n resourceAccessList,\n onSaveComplete,\n updateAcl,\n ])\n\n return (\n <Stack\n direction=\"column\"\n sx={{\n gap: '20px',\n }}\n >\n <AclEditor\n resourceAccessList={resourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n isLoading={isLoadingOriginalAcl}\n canEdit={true}\n emptyText={/* This should never happen */ ''}\n onAddPrincipalToAcl={id =>\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_ADMINISTER_PORTAL'),\n )\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"],"mappings":";;;;;;;;;;;AAyBA,IAAM,IAA+C,CAAC,wBAAwB,EAYjE,IAAkB,EAAW,SACxC,GACA,GACA;CACA,IAAM,EAAE,aAAU,sBAAmB,GAC/B,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,EAAgB,GAAU,EAExB,WAAW,UACZ,CAAC,EAEE,IAAqC,QAEvC,EACE,EAA8B,GAAa,eAAe,CAC3D,EACH,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,EAAmB;EAC/C,iBAAiB,GAAmB;EACpC,UAAU,MAA8B,EAAgB,EAAM;EAC/D,CAAC;AA8BF,QA5BA,EAAoB,UACX,EACL,OAAO;EACL,IAAM,IACJ,EAAmC,GAAa,EAAmB;AAOrE,EALG,MAAgB,QAAQ,KAAc,QAEtC,EAAQ,GAAoC,EAAmB,IAC9D,GAAa,OAAO,GAAY,KAIlC,EAAe,GAAK,GAEpB,EAAU,EAAW;IAG1B,GACA;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAGA,kBAAC,GAAD;EACE,WAAU;EACV,IAAI,EACF,KAAK,QACN;YAJH,CAME,kBAAC,GAAD;GACsB;GACO;GAC3B,WAAW;GACX,SAAS;GACT,WAA0C;GAC1C,sBAAqB,MACnB,EACE,GACA,EAAiC,wBAAwB,CAC1D;GAEuB;GACA;GAC1B,2BAA2B;GAC3B,oBAAoB;GACpB,aAAa;GACb,CAAA,EACD,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS;GAAc,CAAA,CAC3C;;EAEV"}
@@ -3,7 +3,7 @@ export type PortalHomePageHeaderProps = {
3
3
  backgroundCss: string;
4
4
  buttonLink?: string;
5
5
  title: React.ReactNode;
6
- subTitle: React.ReactNode;
6
+ subTitle?: React.ReactNode;
7
7
  description: React.ReactNode;
8
8
  backgroundMp4?: string;
9
9
  backgroundMp4Css?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"PortalHomePageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/PortalHomePageHeader/PortalHomePageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,QAAA,MAAM,oBAAoB,GAAI,8GAS3B,yBAAyB,KAAG,KAAK,CAAC,SA+FpC,CAAA;AAED,eAAe,oBAAoB,CAAA"}
1
+ {"version":3,"file":"PortalHomePageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/PortalHomePageHeader/PortalHomePageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,QAAA,MAAM,oBAAoB,GAAI,8GAS3B,yBAAyB,KAAG,KAAK,CAAC,SAiGpC,CAAA;AAED,eAAe,oBAAoB,CAAA"}
@@ -59,7 +59,7 @@ var o = ({ backgroundCss: o, buttonLink: s, title: c, subTitle: l, description:
59
59
  },
60
60
  children: c
61
61
  }),
62
- /* @__PURE__ */ i(r, {
62
+ l && /* @__PURE__ */ i(r, {
63
63
  variant: "headline3",
64
64
  sx: {
65
65
  fontSize: "24px",