synapse-react-client 4.0.46 → 4.0.47

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 (559) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/useSubmitAridhiaDar.js +2 -2
  3. package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -1
  4. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +1 -1
  5. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  6. package/dist/components/AccountLevelBadges/AccountLevelBadges.js +1 -1
  7. package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
  8. package/dist/components/AclEditor/AclEditor.test-utils.js +3 -5
  9. package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
  10. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  11. package/dist/components/Aridhia/AridhiaAccessStatus.js +43 -30
  12. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  13. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +6 -2
  14. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -1
  15. package/dist/components/Aridhia/AridhiaDarStatusPopover.js +101 -31
  16. package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -1
  17. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +11 -9
  18. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
  19. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +24 -13
  20. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  21. package/dist/components/Authentication/LastLoginInfo.js +2 -2
  22. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  23. package/dist/components/Authentication/RecoveryCodeForm.js +1 -1
  24. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  25. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  26. package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
  27. package/dist/components/Authentication/TOTPForm.js +3 -3
  28. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  29. package/dist/components/Authentication/index.d.ts +6 -6
  30. package/dist/components/Authentication/index.d.ts.map +1 -1
  31. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +1 -1
  32. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
  33. package/dist/components/CardContainer/CardContainer.js +7 -7
  34. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  35. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js +1 -1
  36. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
  37. package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
  38. package/dist/components/ChallengeSubmission/ChallengeSubmission.js +1 -1
  39. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  40. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +1 -1
  41. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
  42. package/dist/components/CitationPopover/CitationPopoverUtils.js +2 -2
  43. package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
  44. package/dist/components/CohortBuilder/CohortBuilder.css +1 -0
  45. package/dist/components/CohortBuilder/CohortBuilder.d.ts +35 -0
  46. package/dist/components/CohortBuilder/CohortBuilder.d.ts.map +1 -0
  47. package/dist/components/CohortBuilder/CohortBuilder.js +108 -0
  48. package/dist/components/CohortBuilder/CohortBuilder.js.map +1 -0
  49. package/dist/components/CohortBuilder/CohortBuilder.module.js +10 -0
  50. package/dist/components/CohortBuilder/CohortBuilder.module.js.map +1 -0
  51. package/dist/components/CohortBuilder/CohortBuilder.module.scss +20 -0
  52. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts +16 -0
  53. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts.map +1 -0
  54. package/dist/components/CohortBuilder/CohortFilesPanel.js +124 -0
  55. package/dist/components/CohortBuilder/CohortFilesPanel.js.map +1 -0
  56. package/dist/components/CohortBuilder/cohortHandOff.d.ts +25 -0
  57. package/dist/components/CohortBuilder/cohortHandOff.d.ts.map +1 -0
  58. package/dist/components/CohortBuilder/cohortHandOff.js +26 -0
  59. package/dist/components/CohortBuilder/cohortHandOff.js.map +1 -0
  60. package/dist/components/ColumnFilter/ColumnFilter.d.ts.map +1 -1
  61. package/dist/components/ColumnFilter/ColumnFilter.js +14 -13
  62. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  63. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
  64. package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
  65. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +11 -2
  66. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  67. package/dist/components/DataGrid/columns/AutocompleteColumn.js +115 -109
  68. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  69. package/dist/components/DataGrid/columns/NumberColumn.js +1 -1
  70. package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -1
  71. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts +20 -0
  72. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts.map +1 -0
  73. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js +18 -0
  74. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js.map +1 -0
  75. package/dist/components/DataGrid/components/contextMenu.js +3 -3
  76. package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
  77. package/dist/components/DataGrid/hooks/useGridUndoRedo.d.ts.map +1 -1
  78. package/dist/components/DataGrid/hooks/useGridUndoRedo.js +9 -7
  79. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  80. package/dist/components/DataGrid/hooks/useStack.d.ts +1 -1
  81. package/dist/components/DataGrid/hooks/useStack.js +2 -2
  82. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  83. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  84. package/dist/components/DataGrid/utils/columnFactory.js +47 -42
  85. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  86. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js +7 -7
  87. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  88. package/dist/components/DataGrid/utils/json-rx/JsonRx.js +2 -2
  89. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  90. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
  91. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  92. package/dist/components/DownloadCart/MeetAccessRequirementCard.js +1 -1
  93. package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
  94. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +5 -5
  95. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  96. package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
  97. package/dist/components/EntityFinder/details/view/DetailsView.js +4 -4
  98. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  99. package/dist/components/EntityHeaderTable/EntityHeaderTable.js +4 -4
  100. package/dist/components/EntityHeaderTable/Filter.d.ts.map +1 -1
  101. package/dist/components/EntityHeaderTable/Filter.js +1 -1
  102. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  103. package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
  104. package/dist/components/FeaturedDataTabs/FacetPlotsCard.d.ts.map +1 -1
  105. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +80 -84
  106. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  107. package/dist/components/FormTemplateEditor/FormStructurePanel.js +7 -7
  108. package/dist/components/FormTemplateEditor/StepCard.js +9 -9
  109. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +2 -2
  110. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
  111. package/dist/components/FullTextSearch/FullTextSearch.js +8 -8
  112. package/dist/components/GenericCard/CardUtils.js.map +1 -1
  113. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +1 -1
  114. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -1
  115. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +1 -1
  116. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -1
  117. package/dist/components/GenericCard/TableRowGenericCard.js +37 -37
  118. package/dist/components/GoalsV3/GoalsV3.js +1 -1
  119. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  120. package/dist/components/HexGrid/HexGrid.d.ts +3 -1
  121. package/dist/components/HexGrid/HexGrid.d.ts.map +1 -1
  122. package/dist/components/HexGrid/HexGrid.js +14 -13
  123. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  124. package/dist/components/IconSvg/index.d.ts +1 -1
  125. package/dist/components/IconSvg/index.d.ts.map +1 -1
  126. package/dist/components/IconSvg/index.js.map +1 -1
  127. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.d.ts.map +1 -1
  128. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js +3 -3
  129. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  130. package/dist/components/Markdown/MarkdownEditor.js +1 -1
  131. package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
  132. package/dist/components/Markdown/widget/index.d.ts +1 -1
  133. package/dist/components/Markdown/widget/index.d.ts.map +1 -1
  134. package/dist/components/ModalDownload/ModalDownload.d.ts.map +1 -1
  135. package/dist/components/ModalDownload/ModalDownload.js +2 -1
  136. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  137. package/dist/components/Plot/BarPlot.js +1 -1
  138. package/dist/components/Plot/BarPlot.js.map +1 -1
  139. package/dist/components/Plot/PlotPanelHeader.d.ts +3 -2
  140. package/dist/components/Plot/PlotPanelHeader.d.ts.map +1 -1
  141. package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
  142. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js +1 -1
  143. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  144. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js +1 -1
  145. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  146. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  147. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +3 -3
  148. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  149. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  150. package/dist/components/QueryBuilder/FilterConditionRow.js +28 -27
  151. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  152. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
  153. package/dist/components/QueryBuilder/FilterGroupNode.js +91 -75
  154. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
  155. package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -1
  156. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  157. package/dist/components/QueryBuilder/QueryBuilderControls.js +91 -79
  158. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  159. package/dist/components/QueryBuilder/QueryBuilderControls.module.js +11 -11
  160. package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -1
  161. package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +2 -0
  162. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +2 -0
  163. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
  164. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
  165. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts +18 -0
  166. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts.map +1 -0
  167. package/dist/components/QueryBuilder/queryBuilderLimits.js +38 -0
  168. package/dist/components/QueryBuilder/queryBuilderLimits.js.map +1 -0
  169. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +0 -8
  170. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
  171. package/dist/components/QueryBuilder/queryBuilderMetadata.js +6 -9
  172. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
  173. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +5 -4
  174. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
  175. package/dist/components/QueryBuilder/queryBuilderTranslation.js +58 -33
  176. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  177. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -1
  178. package/dist/components/QueryBuilder/useQBCombinedSql.js +4 -4
  179. package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -1
  180. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -1
  181. package/dist/components/QueryBuilder/useQBValueDisplayName.js +5 -5
  182. package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -1
  183. package/dist/components/QuerySortSelector.js +5 -5
  184. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +21 -21
  185. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  186. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts +20 -0
  187. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts.map +1 -0
  188. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js +50 -0
  189. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js.map +1 -0
  190. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts +5 -3
  191. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts.map +1 -1
  192. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js +7 -3
  193. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  194. package/dist/components/QueryWrapper/downloadListFiles.d.ts +25 -0
  195. package/dist/components/QueryWrapper/downloadListFiles.d.ts.map +1 -0
  196. package/dist/components/QueryWrapper/downloadListFiles.js +39 -0
  197. package/dist/components/QueryWrapper/downloadListFiles.js.map +1 -0
  198. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts +16 -0
  199. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts.map +1 -0
  200. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js +50 -0
  201. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js.map +1 -0
  202. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts +4 -1
  203. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts.map +1 -1
  204. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js +15 -28
  205. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
  206. package/dist/components/QueryWrapper/useOnQueryDataChange.d.ts.map +1 -1
  207. package/dist/components/QueryWrapper/useOnQueryDataChange.js +7 -6
  208. package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
  209. package/dist/components/QueryWrapperErrorBoundary.d.ts +3 -1
  210. package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
  211. package/dist/components/QueryWrapperErrorBoundary.js +26 -21
  212. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  213. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +7 -7
  214. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +2 -2
  215. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  216. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +34 -32
  217. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  218. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +7 -7
  219. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  220. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +12 -12
  221. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  222. package/dist/components/RowDataTable/CategorizedRowDataTable.css +1 -0
  223. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts +33 -0
  224. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts.map +1 -0
  225. package/dist/components/RowDataTable/CategorizedRowDataTable.js +64 -0
  226. package/dist/components/RowDataTable/CategorizedRowDataTable.js.map +1 -0
  227. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js +8 -0
  228. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js.map +1 -0
  229. package/dist/components/RowDataTable/CategorizedRowDataTable.module.scss +18 -0
  230. package/dist/components/RowDataTable/RowDataTable.d.ts +13 -0
  231. package/dist/components/RowDataTable/RowDataTable.d.ts.map +1 -1
  232. package/dist/components/RowDataTable/RowDataTable.js +25 -8
  233. package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
  234. package/dist/components/RssFeedCards/RssFeedCards.js +1 -1
  235. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  236. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.d.ts.map +1 -1
  237. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js +2 -2
  238. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
  239. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js +1 -1
  240. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
  241. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +17 -9
  242. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  243. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +39 -30
  244. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  245. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +24 -24
  246. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  247. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js +8 -8
  248. package/dist/components/SynapseChat/SynapseChatMessage.js +1 -1
  249. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  250. package/dist/components/SynapseForm/NavButtons.js.map +1 -1
  251. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  252. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js +1 -1
  253. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
  254. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.d.ts.map +1 -1
  255. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js +3 -3
  256. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  257. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.d.ts.map +1 -1
  258. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +38 -44
  259. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  260. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +4 -4
  261. package/dist/components/SynapseTable/SqlEditor.js +7 -7
  262. package/dist/components/SynapseTable/SynapseTable.js +8 -8
  263. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  264. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  265. package/dist/components/SynapseTable/SynapseTableRenderers.js +73 -72
  266. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  267. package/dist/components/SynapseTable/SynapseTableUtils.js +1 -1
  268. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  269. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  270. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +44 -45
  271. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  272. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js +1 -1
  273. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
  274. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.d.ts.map +1 -1
  275. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +142 -142
  276. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  277. package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +4 -4
  278. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +12 -12
  279. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
  280. package/dist/components/SynapseTable/table-top/ColumnSelection.js +6 -6
  281. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +0 -1
  282. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
  283. package/dist/components/SynapseTable/table-top/DownloadOptions.js +64 -57
  284. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  285. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  286. package/dist/components/SynapseTable/usePrefetchTableData.js +3 -3
  287. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  288. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
  289. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  290. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js +1 -1
  291. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
  292. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +2 -2
  293. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  294. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +60 -60
  295. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  296. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js +1 -1
  297. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  298. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js +1 -1
  299. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  300. package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
  301. package/dist/components/TanStackTable/StyledTanStackTable.js +1 -4
  302. package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
  303. package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
  304. package/dist/components/TotalQueryResults.js +14 -14
  305. package/dist/components/Webhook/WebhookDashboard.d.ts.map +1 -1
  306. package/dist/components/Webhook/WebhookDashboard.js +2 -2
  307. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  308. package/dist/components/download_list/DownloadConfirmationUtils.d.ts +5 -1
  309. package/dist/components/download_list/DownloadConfirmationUtils.d.ts.map +1 -1
  310. package/dist/components/download_list/DownloadConfirmationUtils.js +2 -2
  311. package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
  312. package/dist/components/error/ErrorBanner.d.ts.map +1 -1
  313. package/dist/components/error/ErrorBanner.js +49 -46
  314. package/dist/components/error/ErrorBanner.js.map +1 -1
  315. package/dist/components/file/upload/MultiFileUploadProgress.js +5 -5
  316. package/dist/components/row_renderers/Dataset.d.ts.map +1 -1
  317. package/dist/components/row_renderers/Dataset.js +6 -6
  318. package/dist/components/row_renderers/Dataset.js.map +1 -1
  319. package/dist/components/row_renderers/Funder.js +1 -1
  320. package/dist/components/row_renderers/Funder.js.map +1 -1
  321. package/dist/components/widgets/ElementWithTooltip.d.ts +6 -1
  322. package/dist/components/widgets/ElementWithTooltip.d.ts.map +1 -1
  323. package/dist/components/widgets/ElementWithTooltip.js +22 -14
  324. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  325. package/dist/components/widgets/RangeSlider/RangeSlider.d.ts.map +1 -1
  326. package/dist/components/widgets/RangeSlider/RangeSlider.js +1 -1
  327. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  328. package/dist/components/widgets/SynapseImage.js +1 -1
  329. package/dist/components/widgets/SynapseImage.js.map +1 -1
  330. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +16 -5
  331. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  332. package/dist/components/widgets/facet-nav/FacetNavPanel.js +115 -102
  333. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  334. package/dist/components/widgets/facet-nav/FacetPlotLegendList.d.ts.map +1 -1
  335. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js +4 -2
  336. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
  337. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js +1 -1
  338. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
  339. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts +2 -0
  340. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts.map +1 -1
  341. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
  342. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +7 -0
  343. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
  344. package/dist/components/widgets/facet-nav/PlotsContainer.js +47 -45
  345. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  346. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +4 -4
  347. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts +3 -2
  348. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
  349. package/dist/components/widgets/facet-nav/useFacetPlots.js +16 -15
  350. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  351. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js +4 -4
  352. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +2 -2
  353. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  354. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +62 -60
  355. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  356. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -0
  357. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  358. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +10 -10
  359. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  360. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
  361. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  362. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +2 -1
  363. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  364. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts +3 -2
  365. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts.map +1 -1
  366. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
  367. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts +3 -2
  368. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  369. package/dist/components/widgets/query-filter/FacetFilterControls.js +63 -62
  370. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  371. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.d.ts.map +1 -1
  372. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js +30 -29
  373. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
  374. package/dist/components/widgets/query-filter/RangeFacetFilter.js +5 -5
  375. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts +53 -0
  376. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts.map +1 -0
  377. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js +391 -0
  378. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js.map +1 -0
  379. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts +41 -0
  380. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts.map +1 -0
  381. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js +379 -0
  382. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js.map +1 -0
  383. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts +26 -0
  384. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts.map +1 -0
  385. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js +112 -0
  386. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js.map +1 -0
  387. package/dist/mocks/mockAnnotationColumns.d.ts.map +1 -1
  388. package/dist/mocks/mockAnnotationColumns.js +1 -1
  389. package/dist/mocks/mockAnnotationColumns.js.map +1 -1
  390. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +9 -0
  391. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  392. package/dist/mocks/msw/handlers/aridhiaHandlers.js +24 -15
  393. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  394. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +21 -2
  395. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
  396. package/dist/mocks/msw/handlers/asyncJobHandlers.js +30 -22
  397. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  398. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts +27 -0
  399. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts.map +1 -0
  400. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js +158 -0
  401. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js.map +1 -0
  402. package/dist/mocks/msw/handlers/subscriptionHandlers.js +1 -1
  403. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  404. package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
  405. package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
  406. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  407. package/dist/mocks/query/mockColumnCategoryTable.d.ts +19 -0
  408. package/dist/mocks/query/mockColumnCategoryTable.d.ts.map +1 -0
  409. package/dist/mocks/query/mockColumnCategoryTable.js +188 -0
  410. package/dist/mocks/query/mockColumnCategoryTable.js.map +1 -0
  411. package/dist/stories/ColorPaletteInspector.d.ts.map +1 -1
  412. package/dist/stories/ColorPaletteInspector.js +2 -2
  413. package/dist/stories/ColorPaletteInspector.js.map +1 -1
  414. package/dist/style/components/facet_nav/_facet-nav-panel.scss +8 -0
  415. package/dist/style/main.css +1 -1
  416. package/dist/synapse-queries/auth/useOIDC.js +2 -2
  417. package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
  418. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +2 -2
  419. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -1
  420. package/dist/synapse-queries/challenge/useChallenge.js +2 -2
  421. package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
  422. package/dist/synapse-queries/chat/useChat.js +8 -8
  423. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  424. package/dist/synapse-queries/curation/task/useCurationTask.js +10 -10
  425. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  426. package/dist/synapse-queries/dataaccess/useAccessRequirements.js +24 -24
  427. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  428. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js +4 -4
  429. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
  430. package/dist/synapse-queries/dataaccess/useEDuc.js +6 -6
  431. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  432. package/dist/synapse-queries/dataaccess/useFormTemplate.js +4 -4
  433. package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -1
  434. package/dist/synapse-queries/download/index.js +2 -2
  435. package/dist/synapse-queries/download/useDownloadList.d.ts +5 -0
  436. package/dist/synapse-queries/download/useDownloadList.d.ts.map +1 -1
  437. package/dist/synapse-queries/download/useDownloadList.js +14 -13
  438. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  439. package/dist/synapse-queries/entity/useEntity.d.ts.map +1 -1
  440. package/dist/synapse-queries/entity/useEntity.js +20 -20
  441. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  442. package/dist/synapse-queries/entity/useExportToADWorkbench.d.ts.map +1 -1
  443. package/dist/synapse-queries/entity/useExportToADWorkbench.js +2 -1
  444. package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
  445. package/dist/synapse-queries/entity/useExportToCavatica.d.ts.map +1 -1
  446. package/dist/synapse-queries/entity/useExportToCavatica.js +3 -2
  447. package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
  448. package/dist/synapse-queries/entity/useExportToPluto.d.ts.map +1 -1
  449. package/dist/synapse-queries/entity/useExportToPluto.js +2 -1
  450. package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
  451. package/dist/synapse-queries/entity/useGetQueryResultBundle.d.ts.map +1 -1
  452. package/dist/synapse-queries/entity/useGetQueryResultBundle.js +4 -7
  453. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  454. package/dist/synapse-queries/forum/useReply.js +6 -6
  455. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  456. package/dist/synapse-queries/forum/useThread.js +14 -14
  457. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  458. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
  459. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  460. package/dist/synapse-queries/grid/useGridSession.js +4 -4
  461. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  462. package/dist/synapse-queries/index.js +177 -176
  463. package/dist/synapse-queries/oauth/useOAuthClient.js +9 -9
  464. package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
  465. package/dist/synapse-queries/portal/usePortal.js +7 -7
  466. package/dist/synapse-queries/portal/usePortal.js.map +1 -1
  467. package/dist/synapse-queries/subscription/useSubscription.js +4 -4
  468. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  469. package/dist/synapse-queries/table/useTableUpdateTransaction.js +2 -2
  470. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  471. package/dist/synapse-queries/team/useTeam.js +2 -2
  472. package/dist/synapse-queries/team/useTeam.js.map +1 -1
  473. package/dist/synapse-queries/team/useTeamList.d.ts.map +1 -1
  474. package/dist/synapse-queries/team/useTeamList.js +3 -3
  475. package/dist/synapse-queries/team/useTeamList.js.map +1 -1
  476. package/dist/synapse-queries/team/useTeamMembers.js +8 -8
  477. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  478. package/dist/synapse-queries/termsOfService/useTermsOfService.js +2 -2
  479. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  480. package/dist/synapse-queries/trash/useTrashCan.js +4 -4
  481. package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
  482. package/dist/synapse-queries/user/useCertificationQuiz.js +2 -2
  483. package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
  484. package/dist/synapse-queries/user/useFavorites.js +4 -4
  485. package/dist/synapse-queries/user/useFavorites.js.map +1 -1
  486. package/dist/synapse-queries/user/useRevokeCertification.js +2 -2
  487. package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
  488. package/dist/synapse-queries/wiki/useWiki.js +10 -10
  489. package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
  490. package/dist/tsconfig.build.tsbuildinfo +1 -1
  491. package/dist/utils/ContentTypeUtils.js +4 -4
  492. package/dist/utils/ContentTypeUtils.js.map +1 -1
  493. package/dist/utils/PermissionLevelToAccessType.js +1 -1
  494. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  495. package/dist/utils/analytics/useGoogleAnalytics.js +1 -1
  496. package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
  497. package/dist/utils/context/DocumentMetadataContext.js +1 -1
  498. package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
  499. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  500. package/dist/utils/functions/AccessControlListUtils.js +3 -3
  501. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  502. package/dist/utils/functions/ArrayUtils.js +2 -2
  503. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  504. package/dist/utils/functions/FileHandleUtils.js +1 -1
  505. package/dist/utils/functions/FileHandleUtils.js.map +1 -1
  506. package/dist/utils/functions/RegularExpressions.js +1 -1
  507. package/dist/utils/functions/RegularExpressions.js.map +1 -1
  508. package/dist/utils/functions/StringUtils.d.ts.map +1 -1
  509. package/dist/utils/functions/StringUtils.js +1 -2
  510. package/dist/utils/functions/StringUtils.js.map +1 -1
  511. package/dist/utils/functions/deepLinkingUtils.js +2 -2
  512. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  513. package/dist/utils/functions/enumerationFacet.d.ts +26 -0
  514. package/dist/utils/functions/enumerationFacet.d.ts.map +1 -0
  515. package/dist/utils/functions/enumerationFacet.js +27 -0
  516. package/dist/utils/functions/enumerationFacet.js.map +1 -0
  517. package/dist/utils/functions/facetCountUtils.d.ts +12 -0
  518. package/dist/utils/functions/facetCountUtils.d.ts.map +1 -0
  519. package/dist/utils/functions/facetCountUtils.js +9 -0
  520. package/dist/utils/functions/facetCountUtils.js.map +1 -0
  521. package/dist/utils/functions/getEndpoint.js.map +1 -1
  522. package/dist/utils/functions/getUserData.js +1 -1
  523. package/dist/utils/functions/getUserData.js.map +1 -1
  524. package/dist/utils/functions/queryUtils.d.ts +1 -1
  525. package/dist/utils/functions/queryUtils.d.ts.map +1 -1
  526. package/dist/utils/functions/queryUtils.js +26 -22
  527. package/dist/utils/functions/queryUtils.js.map +1 -1
  528. package/dist/utils/functions/testDownloadSpeed.d.ts.map +1 -1
  529. package/dist/utils/functions/testDownloadSpeed.js +17 -26
  530. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  531. package/dist/utils/functions/unCamelCase.js +1 -1
  532. package/dist/utils/functions/unCamelCase.js.map +1 -1
  533. package/dist/utils/hooks/useGetInfoFromIds.js +5 -5
  534. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  535. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js +1 -1
  536. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
  537. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  538. package/dist/utils/hooks/useLogin.js +5 -5
  539. package/dist/utils/hooks/useLogin.js.map +1 -1
  540. package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
  541. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +6 -0
  542. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -1
  543. package/dist/utils/jsonschema/collectTopLevelProperties.js +1 -1
  544. package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -1
  545. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts +22 -0
  546. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts.map +1 -0
  547. package/dist/utils/jsonschema/getNumberOrEnumInfo.js +39 -0
  548. package/dist/utils/jsonschema/getNumberOrEnumInfo.js.map +1 -0
  549. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts +1 -0
  550. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts.map +1 -1
  551. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js +1 -1
  552. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
  553. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts +5 -0
  554. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
  555. package/dist/utils/jsonschema/getSchemaPropertyInfo.js +30 -15
  556. package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
  557. package/dist/utils/jsonschema/submissionContext.js +2 -2
  558. package/dist/utils/jsonschema/submissionContext.js.map +1 -1
  559. package/package.json +6 -6
package/dist/SWC.index.js CHANGED
@@ -117,7 +117,7 @@ var x = { BackendDestinationEnum: r }, S = {
117
117
  sendSearchResultsReturnedEvent: y,
118
118
  sendSearchResultReturnedEvent: v,
119
119
  sendSearchResultClickedEvent: _
120
- }, T = "4.0.46";
120
+ }, T = "4.0.47";
121
121
  //#endregion
122
122
  export { w as Analytics, a as HttpClient, d as Palettes, o as SynapseClient, C as SynapseComponents, n as SynapseConstants, S as SynapseContext, x as SynapseEnums, m as SynapseQueries, T as SynapseReactClientVersion, p as SynapseSessionManager, i as xssOptions };
123
123
 
@@ -27,8 +27,8 @@ function a(a) {
27
27
  }
28
28
  } }), {
29
29
  ...a,
30
- onSuccess: (e, t, n) => {
31
- c.invalidateQueries({ queryKey: s.requests() }), a?.onSuccess?.(e, t, n);
30
+ onSuccess: (e, t, n, ...r) => {
31
+ c.invalidateQueries({ queryKey: s.requests() }), a?.onSuccess?.(e, t, n, ...r);
32
32
  }
33
33
  });
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useSubmitAridhiaDar.js","names":[],"sources":["../../src/aridhia-queries/useSubmitAridhiaDar.ts"],"sourcesContent":["import { UseMutationOptions, useQueryClient } from '@tanstack/react-query'\nimport { RequestFull } from '@sage-bionetworks/aridhia-client/generated/models'\nimport { RequestsApi } from '@sage-bionetworks/aridhia-client/generated/apis'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { AridhiaKeyFactory } from './AridhiaKeyFactory'\nimport { AridhiaError, useAridhiaMutation } from './useAridhiaQuery'\nimport { TransferType } from './TransferType'\n\nexport type SubmitAridhiaDarVariables = {\n code: string\n name: string\n /** Flat answer map (About ∪ Project ∪ Workspace-when-requested), minus `name` and `code`. */\n fields: Record<string, unknown>\n transferType: TransferType\n workspaceRequested: boolean\n /** Required when `workspaceRequested` is true — RDCA-DAP's \"Reference\" field, sent as\n * `RequestPost.workspace_reference`. Unused when picking an existing workspace. */\n workspaceReference?: string\n /** Required when `workspaceRequested` is false — the chosen existing workspace. */\n workspaceUuid?: string\n selectedDictionaries: { code: string; name?: string }[]\n}\n\n/**\n * Submits a data access request to `POST /fair/requests/`. On success, invalidates the requests\n * list so the dataset table's access icon updates without a manual reload.\n */\nexport function useSubmitAridhiaDar(\n options?: Partial<\n UseMutationOptions<RequestFull, AridhiaError, SubmitAridhiaDarVariables>\n >,\n) {\n const { accessToken: synapseAccessToken } = useSynapseContext()\n const keyFactory = new AridhiaKeyFactory(synapseAccessToken)\n const queryClient = useQueryClient()\n\n return useAridhiaMutation<RequestFull, SubmitAridhiaDarVariables>(\n async (configuration, variables) => {\n const requestsApi = new RequestsApi(configuration)\n return await requestsApi.fairRequestsPost({\n requestPost: {\n code: variables.code,\n name: variables.name,\n fields: variables.fields,\n terms: true,\n transfer_type: variables.transferType,\n workspace_requested: variables.workspaceRequested,\n ...(variables.workspaceRequested\n ? { workspace_reference: variables.workspaceReference }\n : { workspace_uuid: variables.workspaceUuid }),\n cohort: {\n name: variables.name,\n queries: [\n {\n name: variables.name,\n clauses: variables.selectedDictionaries.map(dictionary => ({\n name: dictionary.name ?? dictionary.code,\n dictionary: { code: dictionary.code },\n filters: [], // empty = the whole table\n })),\n },\n ],\n },\n },\n })\n },\n {\n ...options,\n onSuccess: (data, variables, context) => {\n queryClient.invalidateQueries({ queryKey: keyFactory.requests() })\n options?.onSuccess?.(data, variables, context)\n },\n },\n )\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,EACd,GAGA;CACA,IAAM,EAAE,aAAa,MAAuB,EAAkB,GACxD,IAAa,IAAI,EAAkB,CAAkB,GACrD,IAAc,EAAe;CAEnC,OAAO,EACL,OAAO,GAAe,MAEb,MAAM,IADW,EAAY,CACvB,EAAY,iBAAiB,EACxC,aAAa;EACX,MAAM,EAAU;EAChB,MAAM,EAAU;EAChB,QAAQ,EAAU;EAClB,OAAO;EACP,eAAe,EAAU;EACzB,qBAAqB,EAAU;EAC/B,GAAI,EAAU,qBACV,EAAE,qBAAqB,EAAU,mBAAmB,IACpD,EAAE,gBAAgB,EAAU,cAAc;EAC9C,QAAQ;GACN,MAAM,EAAU;GAChB,SAAS,CACP;IACE,MAAM,EAAU;IAChB,SAAS,EAAU,qBAAqB,KAAI,OAAe;KACzD,MAAM,EAAW,QAAQ,EAAW;KACpC,YAAY,EAAE,MAAM,EAAW,KAAK;KACpC,SAAS,CAAC;IACZ,EAAE;GACJ,CACF;EACF;CACF,EACF,CAAC,GAEH;EACE,GAAG;EACH,YAAY,GAAM,GAAW,MAAY;GAEvC,AADA,EAAY,kBAAkB,EAAE,UAAU,EAAW,SAAS,EAAE,CAAC,GACjE,GAAS,YAAY,GAAM,GAAW,CAAO;EAC/C;CACF,CACF;AACF"}
1
+ {"version":3,"file":"useSubmitAridhiaDar.js","names":[],"sources":["../../src/aridhia-queries/useSubmitAridhiaDar.ts"],"sourcesContent":["import { UseMutationOptions, useQueryClient } from '@tanstack/react-query'\nimport { RequestFull } from '@sage-bionetworks/aridhia-client/generated/models'\nimport { RequestsApi } from '@sage-bionetworks/aridhia-client/generated/apis'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { AridhiaKeyFactory } from './AridhiaKeyFactory'\nimport { AridhiaError, useAridhiaMutation } from './useAridhiaQuery'\nimport { TransferType } from './TransferType'\n\nexport type SubmitAridhiaDarVariables = {\n code: string\n name: string\n /** Flat answer map (About ∪ Project ∪ Workspace-when-requested), minus `name` and `code`. */\n fields: Record<string, unknown>\n transferType: TransferType\n workspaceRequested: boolean\n /** Required when `workspaceRequested` is true — RDCA-DAP's \"Reference\" field, sent as\n * `RequestPost.workspace_reference`. Unused when picking an existing workspace. */\n workspaceReference?: string\n /** Required when `workspaceRequested` is false — the chosen existing workspace. */\n workspaceUuid?: string\n selectedDictionaries: { code: string; name?: string }[]\n}\n\n/**\n * Submits a data access request to `POST /fair/requests/`. On success, invalidates the requests\n * list so the dataset table's access icon updates without a manual reload.\n */\nexport function useSubmitAridhiaDar(\n options?: Partial<\n UseMutationOptions<RequestFull, AridhiaError, SubmitAridhiaDarVariables>\n >,\n) {\n const { accessToken: synapseAccessToken } = useSynapseContext()\n const keyFactory = new AridhiaKeyFactory(synapseAccessToken)\n const queryClient = useQueryClient()\n\n return useAridhiaMutation<RequestFull, SubmitAridhiaDarVariables>(\n async (configuration, variables) => {\n const requestsApi = new RequestsApi(configuration)\n return await requestsApi.fairRequestsPost({\n requestPost: {\n code: variables.code,\n name: variables.name,\n fields: variables.fields,\n terms: true,\n transfer_type: variables.transferType,\n workspace_requested: variables.workspaceRequested,\n ...(variables.workspaceRequested\n ? { workspace_reference: variables.workspaceReference }\n : { workspace_uuid: variables.workspaceUuid }),\n cohort: {\n name: variables.name,\n queries: [\n {\n name: variables.name,\n clauses: variables.selectedDictionaries.map(dictionary => ({\n name: dictionary.name ?? dictionary.code,\n dictionary: { code: dictionary.code },\n filters: [], // empty = the whole table\n })),\n },\n ],\n },\n },\n })\n },\n {\n ...options,\n onSuccess: (data, variables, context, ...rest) => {\n queryClient.invalidateQueries({ queryKey: keyFactory.requests() })\n options?.onSuccess?.(data, variables, context, ...rest)\n },\n },\n )\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,EACd,GAGA;CACA,IAAM,EAAE,aAAa,MAAuB,EAAkB,GACxD,IAAa,IAAI,EAAkB,CAAkB,GACrD,IAAc,EAAe;CAEnC,OAAO,EACL,OAAO,GAAe,MAEb,MAAM,IADW,EAAY,CACvB,EAAY,iBAAiB,EACxC,aAAa;EACX,MAAM,EAAU;EAChB,MAAM,EAAU;EAChB,QAAQ,EAAU;EAClB,OAAO;EACP,eAAe,EAAU;EACzB,qBAAqB,EAAU;EAC/B,GAAI,EAAU,qBACV,EAAE,qBAAqB,EAAU,mBAAmB,IACpD,EAAE,gBAAgB,EAAU,cAAc;EAC9C,QAAQ;GACN,MAAM,EAAU;GAChB,SAAS,CACP;IACE,MAAM,EAAU;IAChB,SAAS,EAAU,qBAAqB,KAAI,OAAe;KACzD,MAAM,EAAW,QAAQ,EAAW;KACpC,YAAY,EAAE,MAAM,EAAW,KAAK;KACpC,SAAS,CAAC;IACZ,EAAE;GACJ,CACF;EACF;CACF,EACF,CAAC,GAEH;EACE,GAAG;EACH,YAAY,GAAM,GAAW,GAAS,GAAG,MAAS;GAEhD,AADA,EAAY,kBAAkB,EAAE,UAAU,EAAW,SAAS,EAAE,CAAC,GACjE,GAAS,YAAY,GAAM,GAAW,GAAS,GAAG,CAAI;EACxD;CACF,CACF;AACF"}
@@ -14,7 +14,7 @@ var g = "You must provide a token name and at least one permission.";
14
14
  function _(_) {
15
15
  let { onClose: v = s, onCreate: y = s } = _, [b, x] = o(""), [S, C] = o(!0), [w, T] = o(!1), [E, D] = o(!1), [O, k] = o(null), { mutate: A, isPending: j, error: M, data: N } = r(), P = (e) => {
16
16
  x(e.target.value);
17
- }, F = (e, t) => !!e && t.some((e) => e), I = () => {
17
+ }, F = (e, t) => !!e && t.some(Boolean), I = () => {
18
18
  if (F(b, [
19
19
  S,
20
20
  w,
@@ -1 +1 @@
1
- {"version":3,"file":"CreateAccessTokenModal.js","names":[],"sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"sourcesContent":["import { useCreatePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'\nimport {\n AccessTokenGenerationRequest,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport { ChangeEvent, useState } from 'react'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport { CopyToClipboardInput } from '../CopyToClipboardInput/CopyToClipboardInput'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport loadingScreen from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\n\nconst INVALID_INPUT_MSG =\n 'You must provide a token name and at least one permission.'\n\nexport type CreateAccessTokenModalProps = {\n onClose?: () => void\n onCreate?: () => void\n}\n\nexport function CreateAccessTokenModal(props: CreateAccessTokenModalProps) {\n const { onClose = noop, onCreate = noop } = props\n const [tokenName, setTokenName] = useState('')\n const [viewAccess, setViewAccess] = useState(true)\n const [downloadAccess, setDownloadAccess] = useState(false)\n const [modifyAccess, setModifyAccess] = useState(false)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const {\n mutate,\n isPending: createIsPending,\n error: mutationError,\n data: createdTokenResponse,\n } = useCreatePersonalAccessToken()\n\n const handleTokenNameChange = (event: ChangeEvent) => {\n setTokenName((event.target as HTMLInputElement).value)\n }\n\n const validateInput = (tokenName: string, access: boolean[]): boolean => {\n return !!tokenName && access.some(x => x)\n }\n\n const onSubmit = () => {\n if (validateInput(tokenName, [viewAccess, downloadAccess, modifyAccess])) {\n setValidationError(null)\n\n const request: AccessTokenGenerationRequest = {\n scope: [],\n name: tokenName,\n }\n if (viewAccess) request.scope.push('view')\n if (downloadAccess) request.scope.push('download')\n if (modifyAccess) request.scope.push('modify')\n\n mutate(request)\n\n onCreate()\n } else {\n setValidationError(INVALID_INPUT_MSG)\n }\n }\n\n const dialogContent = createdTokenResponse ? (\n <>\n <Typography variant={'body1'}>\n <Typography\n variant={'body1'}\n component={'span'}\n sx={{\n fontWeight: 700,\n }}\n >\n This token will not be able to be retrieved again.\n </Typography>{' '}\n If needed, generate a new personal access token, and delete this one.\n </Typography>\n <div>\n <CopyToClipboardInput\n value={createdTokenResponse.token}\n inputWidth={'350px'}\n />\n </div>\n <Typography variant={'body1'}>\n This token grants access to your account functions and should be treated\n like a password.\n </Typography>\n </>\n ) : (\n <Stack gap={2}>\n <TextField\n autoFocus\n label=\"Token Name\"\n value={tokenName}\n onChange={handleTokenNameChange}\n placeholder=\"e.g. Synapse command line access on my laptop\"\n sx={{ mb: 2 }}\n />\n <div>\n <Typography variant=\"label\">Token Permissions</Typography>\n <Stack\n sx={{\n gap: 2,\n my: 1,\n }}\n >\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.view.displayName}\n checked={viewAccess}\n onChange={() => setViewAccess(!viewAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.view.description}. Required to use Synapse\n programmatic clients.\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.download.displayName}\n checked={downloadAccess}\n onChange={() => setDownloadAccess(!downloadAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.download.description}\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.modify.displayName}\n checked={modifyAccess}\n onChange={() => setModifyAccess(!modifyAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.modify.description}\n </Typography>\n </div>\n </Stack>\n </div>\n {validationError && <ErrorBanner error={validationError} />}\n {mutationError && <ErrorBanner error={mutationError.reason} />}\n </Stack>\n )\n\n return (\n <ConfirmationDialog\n open={true}\n title=\"Create New Personal Access Token\"\n content={createIsPending ? loadingScreen : dialogContent}\n confirmButtonProps={{\n children: createdTokenResponse ? 'Close' : 'Create Token',\n variant: createdTokenResponse ? 'outlined' : 'contained',\n }}\n hasCancelButton={!createdTokenResponse}\n onCancel={onClose}\n onConfirm={\n createdTokenResponse\n ? () => onClose()\n : () => {\n void onSubmit()\n }\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,IACJ;AAOF,SAAgB,EAAuB,GAAoC;CACzE,IAAM,EAAE,aAAU,GAAM,cAAW,MAAS,GACtC,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAY,KAAiB,EAAS,EAAI,GAC3C,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,CAAC,GAAc,KAAmB,EAAS,EAAK,GAEhD,CAAC,GAAiB,KAAsB,EAAwB,IAAI,GAEpE,EACJ,WACA,WAAW,GACX,OAAO,GACP,MAAM,MACJ,EAA6B,GAE3B,KAAyB,MAAuB;EACpD,EAAc,EAAM,OAA4B,KAAK;CACvD,GAEM,KAAiB,GAAmB,MACjC,CAAC,CAAC,KAAa,EAAO,MAAK,MAAK,CAAC,GAGpC,UAAiB;EACrB,IAAI,EAAc,GAAW;GAAC;GAAY;GAAgB;EAAY,CAAC,GAAG;GACxE,EAAmB,IAAI;GAEvB,IAAM,IAAwC;IAC5C,OAAO,CAAC;IACR,MAAM;GACR;GAOA,AANI,KAAY,EAAQ,MAAM,KAAK,MAAM,GACrC,KAAgB,EAAQ,MAAM,KAAK,UAAU,GAC7C,KAAc,EAAQ,MAAM,KAAK,QAAQ,GAE7C,EAAO,CAAO,GAEd,EAAS;EACX,OACE,EAAmB,CAAiB;CAExC,GAEM,IAAgB,IACpB,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IACE,kBAAC,GAAD;KACE,SAAS;KACT,WAAW;KACX,IAAI,EACF,YAAY,IACd;eACD;IAEW,CAAA;IAAE;IAAI;GAER;;EACZ,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;GACE,OAAO,EAAqB;GAC5B,YAAY;EACb,CAAA,EACE,CAAA;EACL,kBAAC,GAAD;GAAY,SAAS;aAAS;EAGlB,CAAA;CACZ,EAAA,CAAA,IAEF,kBAAC,GAAD;EAAO,KAAK;YAAZ;GACE,kBAAC,GAAD;IACE,WAAA;IACA,OAAM;IACN,OAAO;IACP,UAAU;IACV,aAAY;IACZ,IAAI,EAAE,IAAI,EAAE;GACb,CAAA;GACD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAQ;cAAQ;GAA6B,CAAA,GACzD,kBAAC,GAAD;IACE,IAAI;KACF,KAAK;KACL,IAAI;IACN;cAJF;KAME,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,KAAK;MAC9B,SAAS;MACT,gBAAgB,EAAc,CAAC,CAAU;KAC1C,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAJF,CAMG,EAAkB,KAAK,aAAY,iDAE1B;OACT,EAAA,CAAA;KACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,SAAS;MAClC,SAAS;MACT,gBAAgB,EAAkB,CAAC,CAAc;KAClD,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAEC,EAAkB,SAAS;KAClB,CAAA,CACT,EAAA,CAAA;KACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,OAAO;MAChC,SAAS;MACT,gBAAgB,EAAgB,CAAC,CAAY;KAC9C,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAEC,EAAkB,OAAO;KAChB,CAAA,CACT,EAAA,CAAA;IACA;KACJ,EAAA,CAAA;GACJ,KAAmB,kBAAC,GAAD,EAAa,OAAO,EAAkB,CAAA;GACzD,KAAiB,kBAAC,GAAD,EAAa,OAAO,EAAc,OAAS,CAAA;EACxD;;CAGT,OACE,kBAAC,GAAD;EACE,MAAM;EACN,OAAM;EACN,SAAS,IAAkB,IAAgB;EAC3C,oBAAoB;GAClB,UAAU,IAAuB,UAAU;GAC3C,SAAS,IAAuB,aAAa;EAC/C;EACA,iBAAiB,CAAC;EAClB,UAAU;EACV,WACE,UACU,EAAQ,UACR;GACJ,EAAc;EAChB;CAEP,CAAA;AAEL"}
1
+ {"version":3,"file":"CreateAccessTokenModal.js","names":[],"sources":["../../../src/components/AccessTokenPage/CreateAccessTokenModal.tsx"],"sourcesContent":["import { useCreatePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'\nimport {\n AccessTokenGenerationRequest,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport { ChangeEvent, useState } from 'react'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport { CopyToClipboardInput } from '../CopyToClipboardInput/CopyToClipboardInput'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport loadingScreen from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\n\nconst INVALID_INPUT_MSG =\n 'You must provide a token name and at least one permission.'\n\nexport type CreateAccessTokenModalProps = {\n onClose?: () => void\n onCreate?: () => void\n}\n\nexport function CreateAccessTokenModal(props: CreateAccessTokenModalProps) {\n const { onClose = noop, onCreate = noop } = props\n const [tokenName, setTokenName] = useState('')\n const [viewAccess, setViewAccess] = useState(true)\n const [downloadAccess, setDownloadAccess] = useState(false)\n const [modifyAccess, setModifyAccess] = useState(false)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const {\n mutate,\n isPending: createIsPending,\n error: mutationError,\n data: createdTokenResponse,\n } = useCreatePersonalAccessToken()\n\n const handleTokenNameChange = (event: ChangeEvent) => {\n setTokenName((event.target as HTMLInputElement).value)\n }\n\n const validateInput = (tokenName: string, access: boolean[]): boolean => {\n return !!tokenName && access.some(Boolean)\n }\n\n const onSubmit = () => {\n if (validateInput(tokenName, [viewAccess, downloadAccess, modifyAccess])) {\n setValidationError(null)\n\n const request: AccessTokenGenerationRequest = {\n scope: [],\n name: tokenName,\n }\n if (viewAccess) request.scope.push('view')\n if (downloadAccess) request.scope.push('download')\n if (modifyAccess) request.scope.push('modify')\n\n mutate(request)\n\n onCreate()\n } else {\n setValidationError(INVALID_INPUT_MSG)\n }\n }\n\n const dialogContent = createdTokenResponse ? (\n <>\n <Typography variant={'body1'}>\n <Typography\n variant={'body1'}\n component={'span'}\n sx={{\n fontWeight: 700,\n }}\n >\n This token will not be able to be retrieved again.\n </Typography>{' '}\n If needed, generate a new personal access token, and delete this one.\n </Typography>\n <div>\n <CopyToClipboardInput\n value={createdTokenResponse.token}\n inputWidth={'350px'}\n />\n </div>\n <Typography variant={'body1'}>\n This token grants access to your account functions and should be treated\n like a password.\n </Typography>\n </>\n ) : (\n <Stack gap={2}>\n <TextField\n autoFocus\n label=\"Token Name\"\n value={tokenName}\n onChange={handleTokenNameChange}\n placeholder=\"e.g. Synapse command line access on my laptop\"\n sx={{ mb: 2 }}\n />\n <div>\n <Typography variant=\"label\">Token Permissions</Typography>\n <Stack\n sx={{\n gap: 2,\n my: 1,\n }}\n >\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.view.displayName}\n checked={viewAccess}\n onChange={() => setViewAccess(!viewAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.view.description}. Required to use Synapse\n programmatic clients.\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.download.displayName}\n checked={downloadAccess}\n onChange={() => setDownloadAccess(!downloadAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.download.description}\n </Typography>\n </div>\n <div>\n <FormControlLabel\n control={<Checkbox />}\n label={scopeDescriptions.modify.displayName}\n checked={modifyAccess}\n onChange={() => setModifyAccess(!modifyAccess)}\n />\n <Typography\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {scopeDescriptions.modify.description}\n </Typography>\n </div>\n </Stack>\n </div>\n {validationError && <ErrorBanner error={validationError} />}\n {mutationError && <ErrorBanner error={mutationError.reason} />}\n </Stack>\n )\n\n return (\n <ConfirmationDialog\n open={true}\n title=\"Create New Personal Access Token\"\n content={createIsPending ? loadingScreen : dialogContent}\n confirmButtonProps={{\n children: createdTokenResponse ? 'Close' : 'Create Token',\n variant: createdTokenResponse ? 'outlined' : 'contained',\n }}\n hasCancelButton={!createdTokenResponse}\n onCancel={onClose}\n onConfirm={\n createdTokenResponse\n ? () => onClose()\n : () => {\n void onSubmit()\n }\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,IACJ;AAOF,SAAgB,EAAuB,GAAoC;CACzE,IAAM,EAAE,aAAU,GAAM,cAAW,MAAS,GACtC,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAY,KAAiB,EAAS,EAAI,GAC3C,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,CAAC,GAAc,KAAmB,EAAS,EAAK,GAEhD,CAAC,GAAiB,KAAsB,EAAwB,IAAI,GAEpE,EACJ,WACA,WAAW,GACX,OAAO,GACP,MAAM,MACJ,EAA6B,GAE3B,KAAyB,MAAuB;EACpD,EAAc,EAAM,OAA4B,KAAK;CACvD,GAEM,KAAiB,GAAmB,MACjC,CAAC,CAAC,KAAa,EAAO,KAAK,OAAO,GAGrC,UAAiB;EACrB,IAAI,EAAc,GAAW;GAAC;GAAY;GAAgB;EAAY,CAAC,GAAG;GACxE,EAAmB,IAAI;GAEvB,IAAM,IAAwC;IAC5C,OAAO,CAAC;IACR,MAAM;GACR;GAOA,AANI,KAAY,EAAQ,MAAM,KAAK,MAAM,GACrC,KAAgB,EAAQ,MAAM,KAAK,UAAU,GAC7C,KAAc,EAAQ,MAAM,KAAK,QAAQ,GAE7C,EAAO,CAAO,GAEd,EAAS;EACX,OACE,EAAmB,CAAiB;CAExC,GAEM,IAAgB,IACpB,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IACE,kBAAC,GAAD;KACE,SAAS;KACT,WAAW;KACX,IAAI,EACF,YAAY,IACd;eACD;IAEW,CAAA;IAAE;IAAI;GAER;;EACZ,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;GACE,OAAO,EAAqB;GAC5B,YAAY;EACb,CAAA,EACE,CAAA;EACL,kBAAC,GAAD;GAAY,SAAS;aAAS;EAGlB,CAAA;CACZ,EAAA,CAAA,IAEF,kBAAC,GAAD;EAAO,KAAK;YAAZ;GACE,kBAAC,GAAD;IACE,WAAA;IACA,OAAM;IACN,OAAO;IACP,UAAU;IACV,aAAY;IACZ,IAAI,EAAE,IAAI,EAAE;GACb,CAAA;GACD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAQ;cAAQ;GAA6B,CAAA,GACzD,kBAAC,GAAD;IACE,IAAI;KACF,KAAK;KACL,IAAI;IACN;cAJF;KAME,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,KAAK;MAC9B,SAAS;MACT,gBAAgB,EAAc,CAAC,CAAU;KAC1C,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAJF,CAMG,EAAkB,KAAK,aAAY,iDAE1B;OACT,EAAA,CAAA;KACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,SAAS;MAClC,SAAS;MACT,gBAAgB,EAAkB,CAAC,CAAc;KAClD,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAEC,EAAkB,SAAS;KAClB,CAAA,CACT,EAAA,CAAA;KACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,SAAS,kBAAC,GAAD,CAAW,CAAA;MACpB,OAAO,EAAkB,OAAO;MAChC,SAAS;MACT,gBAAgB,EAAgB,CAAC,CAAY;KAC9C,CAAA,GACD,kBAAC,GAAD;MACE,SAAS;MACT,IAAI,EACF,OAAO,WACT;gBAEC,EAAkB,OAAO;KAChB,CAAA,CACT,EAAA,CAAA;IACA;KACJ,EAAA,CAAA;GACJ,KAAmB,kBAAC,GAAD,EAAa,OAAO,EAAkB,CAAA;GACzD,KAAiB,kBAAC,GAAD,EAAa,OAAO,EAAc,OAAS,CAAA;EACxD;;CAGT,OACE,kBAAC,GAAD;EACE,MAAM;EACN,OAAM;EACN,SAAS,IAAkB,IAAgB;EAC3C,oBAAoB;GAClB,UAAU,IAAuB,UAAU;GAC3C,SAAS,IAAuB,aAAa;EAC/C;EACA,iBAAiB,CAAC;EAClB,UAAU;EACV,WACE,UACU,EAAQ,UACR;GACJ,EAAc;EAChB;CAEP,CAAA;AAEL"}
@@ -15,7 +15,7 @@ function u({ userId: u }) {
15
15
  certified: d?.isCertified || !1,
16
16
  validated: d?.isVerified || !1,
17
17
  enabledMFA: d?.userProfile?.twoFactorAuthEnabled || !1
18
- }, h = Object.values(m).some((e) => e), { showButton: g, buttonProps: _, confirmationDialogProps: v } = i({
18
+ }, h = Object.values(m).some(Boolean), { showButton: g, buttonProps: _, confirmationDialogProps: v } = i({
19
19
  userId: u,
20
20
  buttonProps: { variant: "outlined" }
21
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AccountLevelBadges.js","names":[],"sources":["../../../src/components/AccountLevelBadges/AccountLevelBadges.tsx"],"sourcesContent":["import { useGetUserBundle } from '@/synapse-queries/user/useUserBundle'\nimport { SynapseConstants } from '@/utils'\nimport { Box } from '@mui/material'\nimport {\n AccountLevelBadge,\n AccountLevelBadgeType,\n} from '../AccountLevelBadge/AccountLevelBadge'\nimport { ConfirmationDialog } from '../ConfirmationDialog'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport useRevokeCertificationUI from './useRevokeCertificationUI'\n\nexport type AccountLevelBadgesProps = {\n userId: string\n}\n\nconst CERTIFICATION_VERIFICATION_AND_USERPROFILE_BUNDLE_MASK =\n SynapseConstants.USER_BUNDLE_MASK_IS_CERTIFIED |\n SynapseConstants.USER_BUNDLE_MASK_IS_VERIFIED |\n SynapseConstants.USER_BUNDLE_MASK_USER_PROFILE\n\nexport function AccountLevelBadges({ userId }: AccountLevelBadgesProps) {\n const {\n data: userBundle,\n isLoading,\n error,\n } = useGetUserBundle(\n userId,\n CERTIFICATION_VERIFICATION_AND_USERPROFILE_BUNDLE_MASK,\n )\n\n const badgeStatuses: Record<AccountLevelBadgeType, boolean> = {\n certified: userBundle?.isCertified || false,\n validated: userBundle?.isVerified || false,\n enabledMFA: userBundle?.userProfile?.twoFactorAuthEnabled || false,\n }\n const hasBadges = Object.values(badgeStatuses).some(value => value)\n\n const {\n showButton: showRevokeCertificationButton,\n buttonProps: revokeCertificationButtonProps,\n confirmationDialogProps: revokeCertificationConfirmationDialogProps,\n } = useRevokeCertificationUI({\n userId,\n buttonProps: {\n variant: 'outlined',\n },\n })\n\n if (isLoading) {\n return <></>\n }\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n <ConfirmationDialog {...revokeCertificationConfirmationDialogProps} />\n {hasBadges && (\n <Box\n sx={{\n display: 'flex',\n gap: '10px',\n justifyContent: 'flex-start',\n flexWrap: 'wrap',\n }}\n >\n {Object.entries(badgeStatuses).map(([key, value]) => {\n const badgeType = key as AccountLevelBadgeType\n const buttonProps =\n badgeType === 'certified' && showRevokeCertificationButton\n ? revokeCertificationButtonProps\n : undefined\n return (\n value && (\n <AccountLevelBadge\n key={badgeType}\n badgeType={badgeType}\n buttonProps={buttonProps}\n />\n )\n )\n })}\n </Box>\n )}\n </>\n )\n}\n\nexport default AccountLevelBadges\n"],"mappings":";;;;;;;;;;;AAeA,IAAM,IACJ;AAIF,SAAgB,EAAmB,EAAE,aAAmC;CACtE,IAAM,EACJ,MAAM,GACN,cACA,aACE,EACF,GACA,CACF,GAEM,IAAwD;EAC5D,WAAW,GAAY,eAAe;EACtC,WAAW,GAAY,cAAc;EACrC,YAAY,GAAY,aAAa,wBAAwB;CAC/D,GACM,IAAY,OAAO,OAAO,CAAa,EAAE,MAAK,MAAS,CAAK,GAE5D,EACJ,YAAY,GACZ,aAAa,GACb,yBAAyB,MACvB,EAAyB;EAC3B;EACA,aAAa,EACX,SAAS,WACX;CACF,CAAC;CASD,OAPI,IACK,kBAAA,GAAA,CAAI,CAAA,IAET,IACK,kBAAC,GAAD,EAAoB,SAAQ,CAAA,IAInC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAoB,GAAI,EAA6C,CAAA,GACpE,KACC,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,KAAK;GACL,gBAAgB;GAChB,UAAU;EACZ;YAEC,OAAO,QAAQ,CAAa,EAAE,KAAK,CAAC,GAAK,OAAW;GACnD,IAAM,IAAY;GAKlB,OACE,KACE,kBAAC,GAAD;IAEa;IACE,aARjB,MAAc,eAAe,IACzB,IACA,KAAA;GAOD,GAHM,CAGN;EAGP,CAAC;CACE,CAAA,CAEP,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"AccountLevelBadges.js","names":[],"sources":["../../../src/components/AccountLevelBadges/AccountLevelBadges.tsx"],"sourcesContent":["import { useGetUserBundle } from '@/synapse-queries/user/useUserBundle'\nimport { SynapseConstants } from '@/utils'\nimport { Box } from '@mui/material'\nimport {\n AccountLevelBadge,\n AccountLevelBadgeType,\n} from '../AccountLevelBadge/AccountLevelBadge'\nimport { ConfirmationDialog } from '../ConfirmationDialog'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport useRevokeCertificationUI from './useRevokeCertificationUI'\n\nexport type AccountLevelBadgesProps = {\n userId: string\n}\n\nconst CERTIFICATION_VERIFICATION_AND_USERPROFILE_BUNDLE_MASK =\n SynapseConstants.USER_BUNDLE_MASK_IS_CERTIFIED |\n SynapseConstants.USER_BUNDLE_MASK_IS_VERIFIED |\n SynapseConstants.USER_BUNDLE_MASK_USER_PROFILE\n\nexport function AccountLevelBadges({ userId }: AccountLevelBadgesProps) {\n const {\n data: userBundle,\n isLoading,\n error,\n } = useGetUserBundle(\n userId,\n CERTIFICATION_VERIFICATION_AND_USERPROFILE_BUNDLE_MASK,\n )\n\n const badgeStatuses: Record<AccountLevelBadgeType, boolean> = {\n certified: userBundle?.isCertified || false,\n validated: userBundle?.isVerified || false,\n enabledMFA: userBundle?.userProfile?.twoFactorAuthEnabled || false,\n }\n const hasBadges = Object.values(badgeStatuses).some(Boolean)\n\n const {\n showButton: showRevokeCertificationButton,\n buttonProps: revokeCertificationButtonProps,\n confirmationDialogProps: revokeCertificationConfirmationDialogProps,\n } = useRevokeCertificationUI({\n userId,\n buttonProps: {\n variant: 'outlined',\n },\n })\n\n if (isLoading) {\n return <></>\n }\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n <ConfirmationDialog {...revokeCertificationConfirmationDialogProps} />\n {hasBadges && (\n <Box\n sx={{\n display: 'flex',\n gap: '10px',\n justifyContent: 'flex-start',\n flexWrap: 'wrap',\n }}\n >\n {Object.entries(badgeStatuses).map(([key, value]) => {\n const badgeType = key as AccountLevelBadgeType\n const buttonProps =\n badgeType === 'certified' && showRevokeCertificationButton\n ? revokeCertificationButtonProps\n : undefined\n return (\n value && (\n <AccountLevelBadge\n key={badgeType}\n badgeType={badgeType}\n buttonProps={buttonProps}\n />\n )\n )\n })}\n </Box>\n )}\n </>\n )\n}\n\nexport default AccountLevelBadges\n"],"mappings":";;;;;;;;;;;AAeA,IAAM,IACJ;AAIF,SAAgB,EAAmB,EAAE,aAAmC;CACtE,IAAM,EACJ,MAAM,GACN,cACA,aACE,EACF,GACA,CACF,GAEM,IAAwD;EAC5D,WAAW,GAAY,eAAe;EACtC,WAAW,GAAY,cAAc;EACrC,YAAY,GAAY,aAAa,wBAAwB;CAC/D,GACM,IAAY,OAAO,OAAO,CAAa,EAAE,KAAK,OAAO,GAErD,EACJ,YAAY,GACZ,aAAa,GACb,yBAAyB,MACvB,EAAyB;EAC3B;EACA,aAAa,EACX,SAAS,WACX;CACF,CAAC;CASD,OAPI,IACK,kBAAA,GAAA,CAAI,CAAA,IAET,IACK,kBAAC,GAAD,EAAoB,SAAQ,CAAA,IAInC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAoB,GAAI,EAA6C,CAAA,GACpE,KACC,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,KAAK;GACL,gBAAgB;GAChB,UAAU;EACZ;YAEC,OAAO,QAAQ,CAAa,EAAE,KAAK,CAAC,GAAK,OAAW;GACnD,IAAM,IAAY;GAKlB,OACE,KACE,kBAAC,GAAD;IAEa;IACE,aARjB,MAAc,eAAe,IACzB,IACA,KAAA;GAOD,GAHM,CAGN;EAGP,CAAC;CACE,CAAA,CAEP,EAAA,CAAA;AAEN"}
@@ -44,9 +44,7 @@ async function m(e, t) {
44
44
  let n = p();
45
45
  expect(n).toBeInTheDocument(), await e.clear(n), await e.type(n, t);
46
46
  let r = await a.findByText(RegExp(`\\(@${t}\\)`));
47
- await e.click(r), await o(() => expect(r).not.toBeInTheDocument());
48
- let i = a.getAllByRole("row");
49
- return i[i.length - 1];
47
+ return await e.click(r), await o(() => expect(r).not.toBeInTheDocument()), a.getAllByRole("row").at(-1);
50
48
  }
51
49
  async function h(n) {
52
50
  let r = a.getByRole("button", { name: i });
@@ -55,8 +53,8 @@ async function h(n) {
55
53
  return await o(() => {
56
54
  s = a.getAllByRole("row"), l = c(s, t), u = c(s, e), expect(l).toBeInTheDocument(), expect(u).toBeInTheDocument();
57
55
  }), {
58
- publicRow: s[s.length - 2],
59
- authenticatedUsersRow: s[s.length - 1]
56
+ publicRow: s.at(-2),
57
+ authenticatedUsersRow: s.at(-1)
60
58
  };
61
59
  }
62
60
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AclEditor.test-utils.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.clear(userInput)\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows[rows.length - 1]\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows[rows.length - 2],\n authenticatedUsersRow: rows[rows.length - 1],\n }\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EACd,GACA,GACA;CACA,OAAO,EAAK,MAAK,MACR,EAAO,CAAG,EAAE,YAAY,GAAe,EAAE,OAAO,GAAM,CAAC,CAC/D;AACH;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAI;CACJ,IAAI;EACF,MAAM,QAAc;GAElB,AADA,IAAM,EAA6B,GAAM,CAAa,GACtD,OAAO,CAAG,EAAE,kBAAkB;EAChC,CAAC;CACH,SAAS,GAAG;EAEV,MADA,EAAO,MAAM,GACH,MAAM,aAAa,EAAc,oBAAoB,EAAE,OAAO,EAAE,CAAC;CAC7E;CAEA,IAAM,IAAiB,EAAO,CAAI,EAAE,YAAY,UAAU;CAM1D,OALI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAI,EAAE,UAAU,CAAe,GAEjC;AACT;AAQA,SAAgB,EACd,GACA,GACA,GACA;CACA,OAAO,EAAO,CAAG,EAAE,YAAY,MAAM,KAAK,CAAG,EAAE,kBAC7C,CACF;CACA,IAAM,IAAiB,EAAO,CAAG,EAAE,YAAY,UAAU;CACzD,AAAI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAG,EAAE,UAAU,CAAe;AAEzC;AAQA,eAAsB,EACpB,GACA,GACA,IAAgB,IAChB;CACA,IAAM,IAAe,EAAO,CAAG,EAAE,UAAU,UAAU,EACnD,MAAM,EACR,CAAC;CAED,AADA,MAAM,EAAK,MAAM,CAAY,GACzB,KACF,MAAM,QAAc;EAElB,AADA,OAAO,CAAY,EAAE,IAAI,kBAAkB,GAC3C,OAAO,CAAG,EAAE,IAAI,kBAAkB;CACpC,CAAC;AAEL;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAM,IAAO,EAAO,CAAG,EAAE,UAAU,UAAU;CAC7C,MAAM,EAAK,MAAM,CAAI;CAErB,IAAM,IAAS,EAAO,UAAU,UAAU,EACxC,MAAM,EACR,CAAC;CAGD,AAFA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc;EAClB,OAAO,CAAM,EAAE,IAAI,kBAAkB;CACvC,CAAC;AACH;AAEA,SAAgB,IAA0B;CACxC,OAAO,EAAO,YAAY,YAAY,EACpC,MAAM,EACR,CAAC;AACH;AAOA,eAAsB,EACpB,GACA,GACA;CACA,IAAM,IAAY,EAAwB;CAG1C,AAFA,OAAO,CAAS,EAAE,kBAAkB,GACpC,MAAM,EAAK,MAAM,CAAS,GAC1B,MAAM,EAAK,KAAK,GAAW,CAAQ;CAEnC,IAAM,IAAS,MAAM,EAAO,WAAe,OAAO,OAAO,EAAS,IAAI,CAAC;CAGvE,AAFA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc,OAAO,CAAM,EAAE,IAAI,kBAAkB,CAAC;CAC1D,IAAM,IAAO,EAAO,aAAa,KAAK;CACtC,OAAO,EAAK,EAAK,SAAS;AAC5B;AAMA,eAAsB,EACpB,GACA;CACA,IAAM,IAAmB,EAAO,UAAU,UAAU,EAClD,MAAM,EACR,CAAC;CACD,MAAM,EAAK,MAAM,CAAgB;CAEjC,IAAI,IAAsB,CAAC,GACvB,GACA;CAYJ,OAXA,MAAM,QAAc;EAQlB,AAPA,IAAO,EAAO,aAAa,KAAK,GAChC,IAAY,EAA6B,GAAM,CAAyB,GACxE,IAAwB,EACtB,GACA,CACF,GACA,OAAO,CAAS,EAAE,kBAAkB,GACpC,OAAO,CAAqB,EAAE,kBAAkB;CAClD,CAAC,GAEM;EACL,WAAW,EAAK,EAAK,SAAS;EAC9B,uBAAuB,EAAK,EAAK,SAAS;CAC5C;AACF"}
1
+ {"version":3,"file":"AclEditor.test-utils.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.clear(userInput)\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows.at(-1)!\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows.at(-2)!,\n authenticatedUsersRow: rows.at(-1)!,\n }\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EACd,GACA,GACA;CACA,OAAO,EAAK,MAAK,MACR,EAAO,CAAG,EAAE,YAAY,GAAe,EAAE,OAAO,GAAM,CAAC,CAC/D;AACH;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAI;CACJ,IAAI;EACF,MAAM,QAAc;GAElB,AADA,IAAM,EAA6B,GAAM,CAAa,GACtD,OAAO,CAAG,EAAE,kBAAkB;EAChC,CAAC;CACH,SAAS,GAAG;EAEV,MADA,EAAO,MAAM,GACH,MAAM,aAAa,EAAc,oBAAoB,EAAE,OAAO,EAAE,CAAC;CAC7E;CAEA,IAAM,IAAiB,EAAO,CAAI,EAAE,YAAY,UAAU;CAM1D,OALI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAI,EAAE,UAAU,CAAe,GAEjC;AACT;AAQA,SAAgB,EACd,GACA,GACA,GACA;CACA,OAAO,EAAO,CAAG,EAAE,YAAY,MAAM,KAAK,CAAG,EAAE,kBAC7C,CACF;CACA,IAAM,IAAiB,EAAO,CAAG,EAAE,YAAY,UAAU;CACzD,AAAI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAG,EAAE,UAAU,CAAe;AAEzC;AAQA,eAAsB,EACpB,GACA,GACA,IAAgB,IAChB;CACA,IAAM,IAAe,EAAO,CAAG,EAAE,UAAU,UAAU,EACnD,MAAM,EACR,CAAC;CAED,AADA,MAAM,EAAK,MAAM,CAAY,GACzB,KACF,MAAM,QAAc;EAElB,AADA,OAAO,CAAY,EAAE,IAAI,kBAAkB,GAC3C,OAAO,CAAG,EAAE,IAAI,kBAAkB;CACpC,CAAC;AAEL;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAM,IAAO,EAAO,CAAG,EAAE,UAAU,UAAU;CAC7C,MAAM,EAAK,MAAM,CAAI;CAErB,IAAM,IAAS,EAAO,UAAU,UAAU,EACxC,MAAM,EACR,CAAC;CAGD,AAFA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc;EAClB,OAAO,CAAM,EAAE,IAAI,kBAAkB;CACvC,CAAC;AACH;AAEA,SAAgB,IAA0B;CACxC,OAAO,EAAO,YAAY,YAAY,EACpC,MAAM,EACR,CAAC;AACH;AAOA,eAAsB,EACpB,GACA,GACA;CACA,IAAM,IAAY,EAAwB;CAG1C,AAFA,OAAO,CAAS,EAAE,kBAAkB,GACpC,MAAM,EAAK,MAAM,CAAS,GAC1B,MAAM,EAAK,KAAK,GAAW,CAAQ;CAEnC,IAAM,IAAS,MAAM,EAAO,WAAe,OAAO,OAAO,EAAS,IAAI,CAAC;CAKvE,OAJA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc,OAAO,CAAM,EAAE,IAAI,kBAAkB,CAAC,GAC7C,EAAO,aAAa,KAC1B,EAAK,GAAG,EAAE;AACnB;AAMA,eAAsB,EACpB,GACA;CACA,IAAM,IAAmB,EAAO,UAAU,UAAU,EAClD,MAAM,EACR,CAAC;CACD,MAAM,EAAK,MAAM,CAAgB;CAEjC,IAAI,IAAsB,CAAC,GACvB,GACA;CAYJ,OAXA,MAAM,QAAc;EAQlB,AAPA,IAAO,EAAO,aAAa,KAAK,GAChC,IAAY,EAA6B,GAAM,CAAyB,GACxE,IAAwB,EACtB,GACA,CACF,GACA,OAAO,CAAS,EAAE,kBAAkB,GACpC,OAAO,CAAqB,EAAE,kBAAkB;CAClD,CAAC,GAEM;EACL,WAAW,EAAK,GAAG,EAAE;EACrB,uBAAuB,EAAK,GAAG,EAAE;CACnC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AridhiaAccessStatus.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"names":[],"mappings":"AAoBA,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CAkK1E"}
1
+ {"version":3,"file":"AridhiaAccessStatus.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"names":[],"mappings":"AAoBA,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CAqK1E"}
@@ -6,7 +6,7 @@ import "../../synapse-queries/index.js";
6
6
  import { DialogBase as r } from "../DialogBase.js";
7
7
  import i, { RestrictionUiType as a } from "../HasAccess/AccessIcon.js";
8
8
  import { FeatureFlagEnum as o } from "../../utils/featureflag/FeatureFlags.js";
9
- import { findRequestForDataset as s, getRestrictionUiTypeFromAridhiaRequest as c } from "./aridhiaAccessStatusUtils.js";
9
+ import { findRequestsForDataset as s, getRestrictionUiTypeFromAridhiaRequests as c } from "./aridhiaAccessStatusUtils.js";
10
10
  import { getAridhiaFairPortalDatasetUrl as l } from "./aridhiaFairPortalUrls.js";
11
11
  import { useGetAridhiaRequests as u } from "../../aridhia-queries/useGetAridhiaRequests.js";
12
12
  import "../../aridhia-queries/index.js";
@@ -21,12 +21,12 @@ var y = {
21
21
  p: "0px",
22
22
  minWidth: "unset"
23
23
  };
24
- function b(b) {
25
- let { datasetCode: x, fairPortalUrl: S } = b, { isAuthenticated: C } = t(), w = n(o.AMPALS_RDCA_DAP_FORM_ENABLED), { data: T, isLoading: E, isError: D, error: O } = u(), [k, A] = m(null), [j, M] = m(!1), [N, P] = m(!1), { content: F, actions: I } = p({ datasetCode: x }, {
26
- enabled: N,
27
- onClose: () => P(!1)
28
- });
29
- if (!C) return /* @__PURE__ */ _(h, {
24
+ function b(r) {
25
+ let { datasetCode: p, fairPortalUrl: b } = r, { isAuthenticated: S } = t(), C = n(o.AMPALS_RDCA_DAP_FORM_ENABLED), { data: w, isLoading: T, isError: E, error: D } = u(), [O, k] = m(null), [A, j] = m(!1), [M, N] = m(!1), [P, F] = m(0);
26
+ function I() {
27
+ k(null), F((e) => e + 1), N(!0);
28
+ }
29
+ if (!S) return /* @__PURE__ */ _(h, {
30
30
  sx: y,
31
31
  className: e,
32
32
  onClick: (e) => {
@@ -38,48 +38,61 @@ function b(b) {
38
38
  children: /* @__PURE__ */ _(i, { restrictionUiType: a.AccessBlockedToAnonymous })
39
39
  });
40
40
  let L = null;
41
- if (!E) if (D && O.isEligibilityFailure) L = /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(h, {
41
+ if (!T) if (E && D.isEligibilityFailure) L = /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(h, {
42
42
  sx: y,
43
- onClick: () => M(!0),
43
+ onClick: () => j(!0),
44
44
  "aria-label": "Link your RDCA-DAP account",
45
45
  children: /* @__PURE__ */ _(i, { restrictionUiType: a.AccessBlockedByRDCADAPAccountNotLinked })
46
46
  }), /* @__PURE__ */ _(f, {
47
- open: j,
48
- onClose: () => M(!1)
47
+ open: A,
48
+ onClose: () => j(!1)
49
49
  })] });
50
50
  else {
51
- let e = s(T?.items ?? [], x), t = c(e), n = /* @__PURE__ */ _(i, { restrictionUiType: t });
52
- t === a.AccessibleOnRDCADAP || !e && !w ? L = S ? /* @__PURE__ */ _("a", {
53
- href: l(S, x),
51
+ let e = s(w?.items ?? [], p), t = c(e), n = /* @__PURE__ */ _(i, { restrictionUiType: t });
52
+ L = !C && (e.length === 0 || t === a.AccessibleOnRDCADAP) ? b ? /* @__PURE__ */ _("a", {
53
+ href: l(b, p),
54
54
  target: "_blank",
55
55
  rel: "noopener noreferrer",
56
56
  children: n
57
- }) : n : e ? L = /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(h, {
57
+ }) : n : e.length > 0 ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(h, {
58
58
  sx: y,
59
- onClick: (e) => A(e.currentTarget),
59
+ onClick: (e) => k(e.currentTarget),
60
60
  "aria-label": "View data access request status",
61
61
  children: n
62
62
  }), /* @__PURE__ */ _(d, {
63
- open: !!k,
64
- anchorEl: k,
65
- onClose: () => A(null),
66
- request: e,
67
- fairPortalUrl: S
68
- })] }) : w && (L = /* @__PURE__ */ _(h, {
63
+ open: !!O,
64
+ anchorEl: O,
65
+ onClose: () => k(null),
66
+ datasetCode: p,
67
+ requests: e,
68
+ fairPortalUrl: b,
69
+ onNewRequest: C ? I : void 0
70
+ })] }) : /* @__PURE__ */ _(h, {
69
71
  sx: y,
70
- onClick: () => P(!0),
72
+ onClick: I,
71
73
  "aria-label": "Request data access",
72
74
  children: n
73
- }));
75
+ });
74
76
  }
75
- return /* @__PURE__ */ v(g, { children: [L, /* @__PURE__ */ _(r, {
76
- open: N,
77
- onCancel: () => P(!1),
77
+ return /* @__PURE__ */ v(g, { children: [L, /* @__PURE__ */ _(x, {
78
+ datasetCode: p,
79
+ open: M,
80
+ onClose: () => N(!1)
81
+ }, P)] });
82
+ }
83
+ function x(e) {
84
+ let { datasetCode: t, open: n, onClose: i } = e, { content: a, actions: o } = p({ datasetCode: t }, {
85
+ enabled: n,
86
+ onClose: i
87
+ });
88
+ return /* @__PURE__ */ _(r, {
89
+ open: n,
90
+ onCancel: i,
78
91
  maxWidth: "md",
79
92
  title: "Request Data Access",
80
- content: F,
81
- actions: I
82
- })] });
93
+ content: a,
94
+ actions: o
95
+ });
83
96
  }
84
97
  //#endregion
85
98
  export { b as default };
@@ -1 +1 @@
1
- {"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { ReactNode, useState } from 'react'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport { useGetFeatureFlag } from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { Button } from '@mui/material'\nimport { DialogBase } from '../DialogBase'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport {\n findRequestForDataset,\n getRestrictionUiTypeFromAridhiaRequest,\n} from './aridhiaAccessStatusUtils'\nimport { getAridhiaFairPortalDatasetUrl } from './aridhiaFairPortalUrls'\nimport AridhiaDarStatusPopover from './AridhiaDarStatusPopover'\nimport { useAridhiaDarWizardParts } from './DarWizard/AridhiaDarWizard'\nimport RdcaDapEligibilityDialog from './RdcaDapEligibilityDialog'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n /** Base URL of the RDCA-DAP FAIR portal's browsable UI, e.g. `https://fair.dap.c-path.org`. */\n fairPortalUrl?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, fairPortalUrl } = props\n const { isAuthenticated } = useSynapseContext()\n const isDarFormEnabled = useGetFeatureFlag(\n FeatureFlagEnum.AMPALS_RDCA_DAP_FORM_ENABLED,\n )\n\n const {\n data: requestsResponse,\n isLoading,\n isError,\n error,\n } = useGetAridhiaRequests()\n const [popoverAnchorEl, setPopoverAnchorEl] = useState<HTMLElement | null>(\n null,\n )\n const [eligibilityDialogOpen, setEligibilityDialogOpen] = useState(false)\n const [requestDialogOpen, setRequestDialogOpen] = useState(false)\n const { content: wizardContent, actions: wizardActions } =\n useAridhiaDarWizardParts(\n { datasetCode },\n {\n enabled: requestDialogOpen,\n onClose: () => setRequestDialogOpen(false),\n },\n )\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n let content: ReactNode = null\n if (isLoading) {\n // Show loading state — nothing to render yet.\n } else if (isError && error.isEligibilityFailure) {\n // The token exchange (or any other request) failed because this user has no linked\n // RDCA-DAP account yet — the DAR wizard is unreachable until that's resolved.\n content = (\n <>\n <Button\n sx={buttonSx}\n onClick={() => setEligibilityDialogOpen(true)}\n aria-label=\"Link your RDCA-DAP account\"\n >\n <AccessIcon\n restrictionUiType={\n RestrictionUiType.AccessBlockedByRDCADAPAccountNotLinked\n }\n />\n </Button>\n <RdcaDapEligibilityDialog\n open={eligibilityDialogOpen}\n onClose={() => setEligibilityDialogOpen(false)}\n />\n </>\n )\n } else {\n // Check if there's a request for this dataset\n const entityRequest = findRequestForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequest(entityRequest)\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n if (\n restrictionUiType === RestrictionUiType.AccessibleOnRDCADAP ||\n (!entityRequest && !isDarFormEnabled)\n ) {\n // Approved, or no request yet with the in-app request form not enabled — keep the\n // existing link-out to RDCA-DAP to access or request the data.\n content = fairPortalUrl ? (\n <a\n href={getAridhiaFairPortalDatasetUrl(fairPortalUrl, datasetCode)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {icon}\n </a>\n ) : (\n icon\n )\n } else if (entityRequest) {\n // Pending or denied — click opens the status popover.\n content = (\n <>\n <Button\n sx={buttonSx}\n onClick={ev => setPopoverAnchorEl(ev.currentTarget)}\n aria-label=\"View data access request status\"\n >\n {icon}\n </Button>\n <AridhiaDarStatusPopover\n open={!!popoverAnchorEl}\n anchorEl={popoverAnchorEl}\n onClose={() => setPopoverAnchorEl(null)}\n request={entityRequest}\n fairPortalUrl={fairPortalUrl}\n />\n </>\n )\n } else if (isDarFormEnabled) {\n // No request yet, and the in-app request form is enabled — the icon opens the request\n // wizard in a dialog. The same wizard also renders at the route-based, non-modal\n // `AridhiaDarWizard` page for a full-page entry point.\n content = (\n <Button\n sx={buttonSx}\n onClick={() => setRequestDialogOpen(true)}\n aria-label=\"Request data access\"\n >\n {icon}\n </Button>\n )\n }\n }\n\n return (\n <>\n {content}\n {/* Ensure all authenticated return paths render the wizard dialog to prevent flicker as the DAR state changes (e.g. on the confirmation screen). */}\n <DialogBase\n open={requestDialogOpen}\n onCancel={() => setRequestDialogOpen(false)}\n maxWidth=\"md\"\n title=\"Request Data Access\"\n content={wizardContent}\n actions={wizardActions}\n />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;AAAQ;AAgB/C,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,gBAAa,qBAAkB,GACjC,EAAE,uBAAoB,EAAkB,GACxC,IAAmB,EACvB,EAAgB,4BAClB,GAEM,EACJ,MAAM,GACN,cACA,YACA,aACE,EAAsB,GACpB,CAAC,GAAiB,KAAsB,EAC5C,IACF,GACM,CAAC,GAAuB,KAA4B,EAAS,EAAK,GAClE,CAAC,GAAmB,KAAwB,EAAS,EAAK,GAC1D,EAAE,SAAS,GAAe,SAAS,MACvC,EACE,EAAE,eAAY,GACd;EACE,SAAS;EACT,eAAe,EAAqB,EAAK;CAC3C,CACF;CAEF,IAAI,CAAC,GACH,OACE,kBAAC,GAAD;EACE,IAAI;EACJ,WAAW;EACX,UAAS,MAAM;GACb,IAAI,EAAG,WAAW;IAehB,IAAM,IAAa,IAAI,WAAW,SAAS,EAAE,SAAS,GAAK,CAAC;IAC5D,EAAG,cAAc,cAAc,CAAU;GAC3C;EACF;YAEA,kBAAC,GAAD,EACE,mBAAmB,EAAkB,yBACtC,CAAA;CACK,CAAA;CAIZ,IAAI,IAAqB;CACzB,IAAI,IAEG,IAAI,KAAW,EAAM,sBAG1B,IACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,IAAI;EACJ,eAAe,EAAyB,EAAI;EAC5C,cAAW;YAEX,kBAAC,GAAD,EACE,mBACE,EAAkB,uCAErB,CAAA;CACK,CAAA,GACR,kBAAC,GAAD;EACE,MAAM;EACN,eAAe,EAAyB,EAAK;CAC9C,CAAA,CACD,EAAA,CAAA;MAEC;EAEL,IAAM,IAAgB,EACpB,GAAkB,SAAS,CAAC,GAC5B,CACF,GACM,IACJ,EAAuC,CAAa,GAChD,IAAO,kBAAC,GAAD,EAA+B,qBAAoB,CAAA;EAEhE,AACE,MAAsB,EAAkB,uBACvC,CAAC,KAAiB,CAAC,IAIpB,IAAU,IACR,kBAAC,KAAD;GACE,MAAM,EAA+B,GAAe,CAAW;GAC/D,QAAO;GACP,KAAI;aAEH;EACA,CAAA,IAEH,IAEO,IAET,IACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,IAAI;GACJ,UAAS,MAAM,EAAmB,EAAG,aAAa;GAClD,cAAW;aAEV;EACK,CAAA,GACR,kBAAC,GAAD;GACE,MAAM,CAAC,CAAC;GACR,UAAU;GACV,eAAe,EAAmB,IAAI;GACtC,SAAS;GACM;EAChB,CAAA,CACD,EAAA,CAAA,IAEK,MAIT,IACE,kBAAC,GAAD;GACE,IAAI;GACJ,eAAe,EAAqB,EAAI;GACxC,cAAW;aAEV;EACK,CAAA;CAGd;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACG,GAED,kBAAC,GAAD;EACE,MAAM;EACN,gBAAgB,EAAqB,EAAK;EAC1C,UAAS;EACT,OAAM;EACN,SAAS;EACT,SAAS;CACV,CAAA,CACD,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { ReactNode, useState } from 'react'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport { useGetFeatureFlag } from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { Button } from '@mui/material'\nimport { DialogBase } from '../DialogBase'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport {\n findRequestsForDataset,\n getRestrictionUiTypeFromAridhiaRequests,\n} from './aridhiaAccessStatusUtils'\nimport { getAridhiaFairPortalDatasetUrl } from './aridhiaFairPortalUrls'\nimport AridhiaDarStatusPopover from './AridhiaDarStatusPopover'\nimport { useAridhiaDarWizardParts } from './DarWizard/AridhiaDarWizard'\nimport RdcaDapEligibilityDialog from './RdcaDapEligibilityDialog'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n /** Base URL of the RDCA-DAP FAIR portal's browsable UI, e.g. `https://fair.dap.c-path.org`. */\n fairPortalUrl?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, fairPortalUrl } = props\n const { isAuthenticated } = useSynapseContext()\n const isDarFormEnabled = useGetFeatureFlag(\n FeatureFlagEnum.AMPALS_RDCA_DAP_FORM_ENABLED,\n )\n\n const {\n data: requestsResponse,\n isLoading,\n isError,\n error,\n } = useGetAridhiaRequests()\n const [popoverAnchorEl, setPopoverAnchorEl] = useState<HTMLElement | null>(\n null,\n )\n const [eligibilityDialogOpen, setEligibilityDialogOpen] = useState(false)\n const [requestDialogOpen, setRequestDialogOpen] = useState(false)\n // Every opening of the wizard remounts it under a new session key, so a submitted request's\n // confirmation screen never carries over. The remounted wizard resumes this dataset's\n // unsubmitted draft if one exists, and otherwise starts a draft with a fresh request code.\n const [wizardSession, setWizardSession] = useState(0)\n\n function openRequestWizard() {\n setPopoverAnchorEl(null)\n setWizardSession(session => session + 1)\n setRequestDialogOpen(true)\n }\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n let content: ReactNode = null\n if (isLoading) {\n // Show loading state — nothing to render yet.\n } else if (isError && error.isEligibilityFailure) {\n // The token exchange (or any other request) failed because this user has no linked\n // RDCA-DAP account yet — the DAR wizard is unreachable until that's resolved.\n content = (\n <>\n <Button\n sx={buttonSx}\n onClick={() => setEligibilityDialogOpen(true)}\n aria-label=\"Link your RDCA-DAP account\"\n >\n <AccessIcon\n restrictionUiType={\n RestrictionUiType.AccessBlockedByRDCADAPAccountNotLinked\n }\n />\n </Button>\n <RdcaDapEligibilityDialog\n open={eligibilityDialogOpen}\n onClose={() => setEligibilityDialogOpen(false)}\n />\n </>\n )\n } else {\n const datasetRequests = findRequestsForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequests(datasetRequests)\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n if (\n !isDarFormEnabled &&\n (datasetRequests.length === 0 ||\n restrictionUiType === RestrictionUiType.AccessibleOnRDCADAP)\n ) {\n // Without the in-app request form, RDCA-DAP is where the user accesses or requests the\n // data — link straight out to it.\n content = fairPortalUrl ? (\n <a\n href={getAridhiaFairPortalDatasetUrl(fairPortalUrl, datasetCode)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {icon}\n </a>\n ) : (\n icon\n )\n } else if (datasetRequests.length > 0) {\n // The popover lists every request for this dataset; with the in-app form enabled it also\n // offers another request (more tables, or a resubmission after a denial).\n content = (\n <>\n <Button\n sx={buttonSx}\n onClick={ev => setPopoverAnchorEl(ev.currentTarget)}\n aria-label=\"View data access request status\"\n >\n {icon}\n </Button>\n <AridhiaDarStatusPopover\n open={!!popoverAnchorEl}\n anchorEl={popoverAnchorEl}\n onClose={() => setPopoverAnchorEl(null)}\n datasetCode={datasetCode}\n requests={datasetRequests}\n fairPortalUrl={fairPortalUrl}\n onNewRequest={isDarFormEnabled ? openRequestWizard : undefined}\n />\n </>\n )\n } else {\n // No request yet, and the in-app request form is enabled — the icon opens the request\n // wizard in a dialog. The same wizard also renders at the route-based, non-modal\n // `AridhiaDarWizard` page for a full-page entry point.\n content = (\n <Button\n sx={buttonSx}\n onClick={openRequestWizard}\n aria-label=\"Request data access\"\n >\n {icon}\n </Button>\n )\n }\n }\n\n return (\n <>\n {content}\n {/* Ensure all authenticated return paths render the wizard dialog to prevent flicker as the DAR state changes (e.g. on the confirmation screen). */}\n <AridhiaDarWizardDialog\n key={wizardSession}\n datasetCode={datasetCode}\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n />\n </>\n )\n}\n\nfunction AridhiaDarWizardDialog(props: {\n datasetCode: string\n open: boolean\n onClose: () => void\n}) {\n const { datasetCode, open, onClose } = props\n const { content, actions } = useAridhiaDarWizardParts(\n { datasetCode },\n { enabled: open, onClose },\n )\n return (\n <DialogBase\n open={open}\n onCancel={onClose}\n maxWidth=\"md\"\n title=\"Request Data Access\"\n content={content}\n actions={actions}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;AAAQ;AAgB/C,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,gBAAa,qBAAkB,GACjC,EAAE,uBAAoB,EAAkB,GACxC,IAAmB,EACvB,EAAgB,4BAClB,GAEM,EACJ,MAAM,GACN,cACA,YACA,aACE,EAAsB,GACpB,CAAC,GAAiB,KAAsB,EAC5C,IACF,GACM,CAAC,GAAuB,KAA4B,EAAS,EAAK,GAClE,CAAC,GAAmB,KAAwB,EAAS,EAAK,GAI1D,CAAC,GAAe,KAAoB,EAAS,CAAC;CAEpD,SAAS,IAAoB;EAG3B,AAFA,EAAmB,IAAI,GACvB,GAAiB,MAAW,IAAU,CAAC,GACvC,EAAqB,EAAI;CAC3B;CAEA,IAAI,CAAC,GACH,OACE,kBAAC,GAAD;EACE,IAAI;EACJ,WAAW;EACX,UAAS,MAAM;GACb,IAAI,EAAG,WAAW;IAehB,IAAM,IAAa,IAAI,WAAW,SAAS,EAAE,SAAS,GAAK,CAAC;IAC5D,EAAG,cAAc,cAAc,CAAU;GAC3C;EACF;YAEA,kBAAC,GAAD,EACE,mBAAmB,EAAkB,yBACtC,CAAA;CACK,CAAA;CAIZ,IAAI,IAAqB;CACzB,IAAI,IAEG,IAAI,KAAW,EAAM,sBAG1B,IACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,IAAI;EACJ,eAAe,EAAyB,EAAI;EAC5C,cAAW;YAEX,kBAAC,GAAD,EACE,mBACE,EAAkB,uCAErB,CAAA;CACK,CAAA,GACR,kBAAC,GAAD;EACE,MAAM;EACN,eAAe,EAAyB,EAAK;CAC9C,CAAA,CACD,EAAA,CAAA;MAEC;EACL,IAAM,IAAkB,EACtB,GAAkB,SAAS,CAAC,GAC5B,CACF,GACM,IACJ,EAAwC,CAAe,GACnD,IAAO,kBAAC,GAAD,EAA+B,qBAAoB,CAAA;EAEhE,AA6CE,IA5CA,CAAC,MACA,EAAgB,WAAW,KAC1B,MAAsB,EAAkB,uBAIhC,IACR,kBAAC,KAAD;GACE,MAAM,EAA+B,GAAe,CAAW;GAC/D,QAAO;GACP,KAAI;aAEH;EACA,CAAA,IAEH,IAEO,EAAgB,SAAS,IAIhC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,IAAI;GACJ,UAAS,MAAM,EAAmB,EAAG,aAAa;GAClD,cAAW;aAEV;EACK,CAAA,GACR,kBAAC,GAAD;GACE,MAAM,CAAC,CAAC;GACR,UAAU;GACV,eAAe,EAAmB,IAAI;GACzB;GACb,UAAU;GACK;GACf,cAAc,IAAmB,IAAoB,KAAA;EACtD,CAAA,CACD,EAAA,CAAA,IAOF,kBAAC,GAAD;GACE,IAAI;GACJ,SAAS;GACT,cAAW;aAEV;EACK,CAAA;CAGd;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACG,GAED,kBAAC,GAAD;EAEe;EACb,MAAM;EACN,eAAe,EAAqB,EAAK;CAC1C,GAJM,CAIN,CACD,EAAA,CAAA;AAEN;AAEA,SAAS,EAAuB,GAI7B;CACD,IAAM,EAAE,gBAAa,SAAM,eAAY,GACjC,EAAE,YAAS,eAAY,EAC3B,EAAE,eAAY,GACd;EAAE,SAAS;EAAM;CAAQ,CAC3B;CACA,OACE,kBAAC,GAAD;EACQ;EACN,UAAU;EACV,UAAS;EACT,OAAM;EACG;EACA;CACV,CAAA;AAEL"}
@@ -1,12 +1,16 @@
1
1
  import { PopoverProps } from '@mui/material';
2
2
  import { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models';
3
3
  export type AridhiaDarStatusPopoverProps = Pick<PopoverProps, 'anchorEl' | 'open' | 'id' | 'onClose'> & {
4
- request: RequestListItem;
4
+ datasetCode: string;
5
+ /** Every request the user holds for the dataset, in display order. */
6
+ requests: RequestListItem[];
5
7
  /** Base URL of the RDCA-DAP FAIR portal's browsable UI, e.g. `https://fair.dap.c-path.org`. */
6
8
  fairPortalUrl?: string;
9
+ /** When set, offers to start another request (e.g. for different tables, or after a denial). */
10
+ onNewRequest?: () => void;
7
11
  };
8
12
  /**
9
- * Detail popover for a pending or denied DAR.
13
+ * Detail popover listing the user's DARs for one dataset.
10
14
  */
11
15
  export default function AridhiaDarStatusPopover(props: AridhiaDarStatusPopoverProps): import("react/jsx-runtime").JSX.Element;
12
16
  //# sourceMappingURL=AridhiaDarStatusPopover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AridhiaDarStatusPopover.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/AridhiaDarStatusPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAIb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AAGnF,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,YAAY,EACZ,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CACvC,GAAG;IACF,OAAO,EAAE,eAAe,CAAA;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CAwCpC"}
1
+ {"version":3,"file":"AridhiaDarStatusPopover.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/AridhiaDarStatusPopover.tsx"],"names":[],"mappings":"AACA,OAAO,EAQL,YAAY,EAGb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AAiBnF,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,YAAY,EACZ,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CACvC,GAAG;IACF,WAAW,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,+FAA+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CA8DpC"}
@@ -1,14 +1,33 @@
1
- import { getAridhiaFairPortalRequestUrl as e } from "./aridhiaFairPortalUrls.js";
2
- import { Link as t, Popover as n, Stack as r, Typography as i } from "@mui/material";
3
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import { getAridhiaFairPortalDatasetUrl as e, getAridhiaFairPortalRequestUrl as t } from "./aridhiaFairPortalUrls.js";
2
+ import { useId as n } from "react";
3
+ import { Button as r, Chip as i, Link as a, List as o, ListItem as s, Popover as c, Stack as l, Typography as u } from "@mui/material";
4
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
4
5
  //#region src/components/Aridhia/AridhiaDarStatusPopover.tsx
5
- function s(s) {
6
- let { anchorEl: c, open: l, id: u, onClose: d, request: f, fairPortalUrl: p } = s;
7
- return /* @__PURE__ */ a(n, {
8
- id: u,
9
- open: l,
10
- anchorEl: c,
11
- onClose: d,
6
+ var m = {
7
+ approved: {
8
+ label: "Approved",
9
+ color: "success"
10
+ },
11
+ pending: {
12
+ label: "Pending",
13
+ color: "warning"
14
+ },
15
+ denied: {
16
+ label: "Denied",
17
+ color: "error"
18
+ },
19
+ error: {
20
+ label: "Error",
21
+ color: "default"
22
+ }
23
+ };
24
+ function h(t) {
25
+ let { anchorEl: i, open: a, id: s, onClose: m, datasetCode: h, requests: _, fairPortalUrl: v, onNewRequest: y } = t, b = n(), x = _.some((e) => e.status === "approved");
26
+ return /* @__PURE__ */ f(c, {
27
+ id: s,
28
+ open: a,
29
+ anchorEl: i,
30
+ onClose: m,
12
31
  anchorOrigin: {
13
32
  vertical: "bottom",
14
33
  horizontal: "center"
@@ -17,40 +36,91 @@ function s(s) {
17
36
  vertical: "top",
18
37
  horizontal: "center"
19
38
  },
20
- children: /* @__PURE__ */ o(r, {
21
- spacing: 1,
39
+ children: /* @__PURE__ */ p(l, {
40
+ spacing: 1.5,
22
41
  sx: {
23
42
  p: 2,
24
- maxWidth: 320
43
+ width: 360,
44
+ maxWidth: "100%"
25
45
  },
26
46
  children: [
27
- /* @__PURE__ */ a(i, {
28
- variant: "subtitle2",
29
- children: f.name ?? f.code
47
+ /* @__PURE__ */ f(u, {
48
+ id: b,
49
+ variant: "subtitle1",
50
+ component: "h2",
51
+ children: "Your data access requests"
30
52
  }),
31
- /* @__PURE__ */ o(i, {
32
- variant: "body2",
33
- children: ["Status: ", f.status]
53
+ /* @__PURE__ */ f(o, {
54
+ "aria-labelledby": b,
55
+ disablePadding: !0,
56
+ children: _.map((e, t) => /* @__PURE__ */ f(g, {
57
+ request: e,
58
+ fairPortalUrl: v,
59
+ divider: t < _.length - 1
60
+ }, e.code ?? `uncoded-${t}`))
34
61
  }),
35
- f.created_at && /* @__PURE__ */ o(i, {
36
- variant: "body2",
37
- children: ["Created: ", new Date(f.created_at).toLocaleDateString()]
62
+ x && v && /* @__PURE__ */ f(r, {
63
+ variant: "outlined",
64
+ href: e(v, h),
65
+ target: "_blank",
66
+ rel: "noopener noreferrer",
67
+ children: "Open dataset on RDCA-DAP"
38
68
  }),
39
- f.updated_at && /* @__PURE__ */ o(i, {
69
+ y && /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(u, {
40
70
  variant: "body2",
41
- children: ["Updated: ", new Date(f.updated_at).toLocaleDateString()]
42
- }),
43
- p && f.code && /* @__PURE__ */ a(t, {
44
- href: e(p, f.code),
71
+ color: "text.secondary",
72
+ children: "Need different tables, or was a request denied? You can submit another request."
73
+ }), /* @__PURE__ */ f(r, {
74
+ variant: "contained",
75
+ onClick: y,
76
+ children: "Submit a new request"
77
+ })] })
78
+ ]
79
+ })
80
+ });
81
+ }
82
+ function g(e) {
83
+ let { request: n, fairPortalUrl: r, divider: o } = e, c = n.name || n.code, d = n.status ? m[n.status] : void 0;
84
+ return /* @__PURE__ */ p(s, {
85
+ divider: o,
86
+ disableGutters: !0,
87
+ sx: {
88
+ display: "block",
89
+ py: 1
90
+ },
91
+ children: [/* @__PURE__ */ p(l, {
92
+ direction: "row",
93
+ spacing: 1,
94
+ sx: {
95
+ alignItems: "center",
96
+ justifyContent: "space-between"
97
+ },
98
+ children: [/* @__PURE__ */ f(u, {
99
+ variant: "subtitle2",
100
+ sx: { wordBreak: "break-word" },
101
+ children: r && n.code ? /* @__PURE__ */ f(a, {
102
+ href: t(r, n.code),
45
103
  target: "_blank",
46
104
  rel: "noopener noreferrer",
47
- children: "View on RDCA-DAP"
48
- })
105
+ children: c
106
+ }) : c
107
+ }), d && /* @__PURE__ */ f(i, {
108
+ size: "small",
109
+ label: d.label,
110
+ color: d.color
111
+ })]
112
+ }), (n.created_at || n.updated_at) && /* @__PURE__ */ p(u, {
113
+ variant: "body2",
114
+ color: "text.secondary",
115
+ children: [
116
+ n.created_at && `Created ${new Date(n.created_at).toLocaleDateString()}`,
117
+ n.created_at && n.updated_at && " · ",
118
+ n.updated_at && `Updated ${new Date(n.updated_at).toLocaleDateString()}`
49
119
  ]
50
- })
120
+ })]
51
121
  });
52
122
  }
53
123
  //#endregion
54
- export { s as default };
124
+ export { h as default };
55
125
 
56
126
  //# sourceMappingURL=AridhiaDarStatusPopover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AridhiaDarStatusPopover.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaDarStatusPopover.tsx"],"sourcesContent":["import {\n Popover,\n PopoverProps,\n Stack,\n Typography,\n Link as MuiLink,\n} from '@mui/material'\nimport { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models'\nimport { getAridhiaFairPortalRequestUrl } from './aridhiaFairPortalUrls'\n\nexport type AridhiaDarStatusPopoverProps = Pick<\n PopoverProps,\n 'anchorEl' | 'open' | 'id' | 'onClose'\n> & {\n request: RequestListItem\n /** Base URL of the RDCA-DAP FAIR portal's browsable UI, e.g. `https://fair.dap.c-path.org`. */\n fairPortalUrl?: string\n}\n\n/**\n * Detail popover for a pending or denied DAR.\n */\nexport default function AridhiaDarStatusPopover(\n props: AridhiaDarStatusPopoverProps,\n) {\n const { anchorEl, open, id, onClose, request, fairPortalUrl } = props\n\n return (\n <Popover\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <Stack spacing={1} sx={{ p: 2, maxWidth: 320 }}>\n <Typography variant=\"subtitle2\">\n {request.name ?? request.code}\n </Typography>\n <Typography variant=\"body2\">Status: {request.status}</Typography>\n {request.created_at && (\n <Typography variant=\"body2\">\n Created: {new Date(request.created_at).toLocaleDateString()}\n </Typography>\n )}\n {request.updated_at && (\n <Typography variant=\"body2\">\n Updated: {new Date(request.updated_at).toLocaleDateString()}\n </Typography>\n )}\n {fairPortalUrl && request.code && (\n <MuiLink\n href={getAridhiaFairPortalRequestUrl(fairPortalUrl, request.code)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on RDCA-DAP\n </MuiLink>\n )}\n </Stack>\n </Popover>\n )\n}\n"],"mappings":";;;;AAsBA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,aAAU,SAAM,OAAI,YAAS,YAAS,qBAAkB;CAEhE,OACE,kBAAC,GAAD;EACM;EACE;EACI;EACD;EACT,cAAc;GAAE,UAAU;GAAU,YAAY;EAAS;EACzD,iBAAiB;GAAE,UAAU;GAAO,YAAY;EAAS;YAEzD,kBAAC,GAAD;GAAO,SAAS;GAAG,IAAI;IAAE,GAAG;IAAG,UAAU;GAAI;aAA7C;IACE,kBAAC,GAAD;KAAY,SAAQ;eACjB,EAAQ,QAAQ,EAAQ;IACf,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAQ;eAApB,CAA4B,YAAS,EAAQ,MAAmB;;IAC/D,EAAQ,cACP,kBAAC,GAAD;KAAY,SAAQ;eAApB,CAA4B,aAChB,IAAI,KAAK,EAAQ,UAAU,EAAE,mBAAmB,CAChD;;IAEb,EAAQ,cACP,kBAAC,GAAD;KAAY,SAAQ;eAApB,CAA4B,aAChB,IAAI,KAAK,EAAQ,UAAU,EAAE,mBAAmB,CAChD;;IAEb,KAAiB,EAAQ,QACxB,kBAAC,GAAD;KACE,MAAM,EAA+B,GAAe,EAAQ,IAAI;KAChE,QAAO;KACP,KAAI;eACL;IAEQ,CAAA;GAEN;;CACA,CAAA;AAEb"}
1
+ {"version":3,"file":"AridhiaDarStatusPopover.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaDarStatusPopover.tsx"],"sourcesContent":["import { useId } from 'react'\nimport {\n Button,\n Chip,\n ChipProps,\n Link as MuiLink,\n List,\n ListItem,\n Popover,\n PopoverProps,\n Stack,\n Typography,\n} from '@mui/material'\nimport { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models'\nimport { RequestStatus } from './aridhiaAccessStatusUtils'\nimport {\n getAridhiaFairPortalDatasetUrl,\n getAridhiaFairPortalRequestUrl,\n} from './aridhiaFairPortalUrls'\n\nconst STATUS_CHIP: Record<\n RequestStatus,\n { label: string; color: ChipProps['color'] }\n> = {\n approved: { label: 'Approved', color: 'success' },\n pending: { label: 'Pending', color: 'warning' },\n denied: { label: 'Denied', color: 'error' },\n error: { label: 'Error', color: 'default' },\n}\n\nexport type AridhiaDarStatusPopoverProps = Pick<\n PopoverProps,\n 'anchorEl' | 'open' | 'id' | 'onClose'\n> & {\n datasetCode: string\n /** Every request the user holds for the dataset, in display order. */\n requests: RequestListItem[]\n /** Base URL of the RDCA-DAP FAIR portal's browsable UI, e.g. `https://fair.dap.c-path.org`. */\n fairPortalUrl?: string\n /** When set, offers to start another request (e.g. for different tables, or after a denial). */\n onNewRequest?: () => void\n}\n\n/**\n * Detail popover listing the user's DARs for one dataset.\n */\nexport default function AridhiaDarStatusPopover(\n props: AridhiaDarStatusPopoverProps,\n) {\n const {\n anchorEl,\n open,\n id,\n onClose,\n datasetCode,\n requests,\n fairPortalUrl,\n onNewRequest,\n } = props\n const headingId = useId()\n const hasApprovedRequest = requests.some(r => r.status === 'approved')\n\n return (\n <Popover\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <Stack spacing={1.5} sx={{ p: 2, width: 360, maxWidth: '100%' }}>\n <Typography id={headingId} variant=\"subtitle1\" component=\"h2\">\n Your data access requests\n </Typography>\n <List aria-labelledby={headingId} disablePadding>\n {requests.map((request, index) => (\n <DarListItem\n key={request.code ?? `uncoded-${index}`}\n request={request}\n fairPortalUrl={fairPortalUrl}\n divider={index < requests.length - 1}\n />\n ))}\n </List>\n {hasApprovedRequest && fairPortalUrl && (\n <Button\n variant=\"outlined\"\n href={getAridhiaFairPortalDatasetUrl(fairPortalUrl, datasetCode)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Open dataset on RDCA-DAP\n </Button>\n )}\n {onNewRequest && (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Need different tables, or was a request denied? You can submit\n another request.\n </Typography>\n <Button variant=\"contained\" onClick={onNewRequest}>\n Submit a new request\n </Button>\n </>\n )}\n </Stack>\n </Popover>\n )\n}\n\nfunction DarListItem(props: {\n request: RequestListItem\n fairPortalUrl?: string\n divider: boolean\n}) {\n const { request, fairPortalUrl, divider } = props\n const title = request.name || request.code\n const chip = request.status ? STATUS_CHIP[request.status] : undefined\n\n return (\n <ListItem divider={divider} disableGutters sx={{ display: 'block', py: 1 }}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', justifyContent: 'space-between' }}\n >\n <Typography variant=\"subtitle2\" sx={{ wordBreak: 'break-word' }}>\n {fairPortalUrl && request.code ? (\n <MuiLink\n href={getAridhiaFairPortalRequestUrl(fairPortalUrl, request.code)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {title}\n </MuiLink>\n ) : (\n title\n )}\n </Typography>\n {chip && <Chip size=\"small\" label={chip.label} color={chip.color} />}\n </Stack>\n {(request.created_at || request.updated_at) && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {request.created_at &&\n `Created ${new Date(request.created_at).toLocaleDateString()}`}\n {request.created_at && request.updated_at && ' · '}\n {request.updated_at &&\n `Updated ${new Date(request.updated_at).toLocaleDateString()}`}\n </Typography>\n )}\n </ListItem>\n )\n}\n"],"mappings":";;;;;AAoBA,IAAM,IAGF;CACF,UAAU;EAAE,OAAO;EAAY,OAAO;CAAU;CAChD,SAAS;EAAE,OAAO;EAAW,OAAO;CAAU;CAC9C,QAAQ;EAAE,OAAO;EAAU,OAAO;CAAQ;CAC1C,OAAO;EAAE,OAAO;EAAS,OAAO;CAAU;AAC5C;AAkBA,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,aACA,SACA,OACA,YACA,gBACA,aACA,kBACA,oBACE,GACE,IAAY,EAAM,GAClB,IAAqB,EAAS,MAAK,MAAK,EAAE,WAAW,UAAU;CAErE,OACE,kBAAC,GAAD;EACM;EACE;EACI;EACD;EACT,cAAc;GAAE,UAAU;GAAU,YAAY;EAAS;EACzD,iBAAiB;GAAE,UAAU;GAAO,YAAY;EAAS;YAEzD,kBAAC,GAAD;GAAO,SAAS;GAAK,IAAI;IAAE,GAAG;IAAG,OAAO;IAAK,UAAU;GAAO;aAA9D;IACE,kBAAC,GAAD;KAAY,IAAI;KAAW,SAAQ;KAAY,WAAU;eAAK;IAElD,CAAA;IACZ,kBAAC,GAAD;KAAM,mBAAiB;KAAW,gBAAA;eAC/B,EAAS,KAAK,GAAS,MACtB,kBAAC,GAAD;MAEW;MACM;MACf,SAAS,IAAQ,EAAS,SAAS;KACpC,GAJM,EAAQ,QAAQ,WAAW,GAIjC,CACF;IACG,CAAA;IACL,KAAsB,KACrB,kBAAC,GAAD;KACE,SAAQ;KACR,MAAM,EAA+B,GAAe,CAAW;KAC/D,QAAO;KACP,KAAI;eACL;IAEO,CAAA;IAET,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;KAAY,SAAQ;KAAQ,OAAM;eAAiB;IAGvC,CAAA,GACZ,kBAAC,GAAD;KAAQ,SAAQ;KAAY,SAAS;eAAc;IAE3C,CAAA,CACR,EAAA,CAAA;GAEC;;CACA,CAAA;AAEb;AAEA,SAAS,EAAY,GAIlB;CACD,IAAM,EAAE,YAAS,kBAAe,eAAY,GACtC,IAAQ,EAAQ,QAAQ,EAAQ,MAChC,IAAO,EAAQ,SAAS,EAAY,EAAQ,UAAU,KAAA;CAE5D,OACE,kBAAC,GAAD;EAAmB;EAAS,gBAAA;EAAe,IAAI;GAAE,SAAS;GAAS,IAAI;EAAE;YAAzE,CACE,kBAAC,GAAD;GACE,WAAU;GACV,SAAS;GACT,IAAI;IAAE,YAAY;IAAU,gBAAgB;GAAgB;aAH9D,CAKE,kBAAC,GAAD;IAAY,SAAQ;IAAY,IAAI,EAAE,WAAW,aAAa;cAC3D,KAAiB,EAAQ,OACxB,kBAAC,GAAD;KACE,MAAM,EAA+B,GAAe,EAAQ,IAAI;KAChE,QAAO;KACP,KAAI;eAEH;IACM,CAAA,IAET;GAEQ,CAAA,GACX,KAAQ,kBAAC,GAAD;IAAM,MAAK;IAAQ,OAAO,EAAK;IAAO,OAAO,EAAK;GAAQ,CAAA,CAC9D;OACL,EAAQ,cAAc,EAAQ,eAC9B,kBAAC,GAAD;GAAY,SAAQ;GAAQ,OAAM;aAAlC;IACG,EAAQ,cACP,WAAW,IAAI,KAAK,EAAQ,UAAU,EAAE,mBAAmB;IAC5D,EAAQ,cAAc,EAAQ,cAAc;IAC5C,EAAQ,cACP,WAAW,IAAI,KAAK,EAAQ,UAAU,EAAE,mBAAmB;GACnD;IAEN;;AAEd"}
@@ -1,19 +1,21 @@
1
1
  import { RestrictionUiType } from '../HasAccess/AccessIcon';
2
2
  import { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models';
3
+ export type RequestStatus = NonNullable<RequestListItem['status']>;
3
4
  /**
4
- * Maps an Aridhia request status to the appropriate RestrictionUiType for display.
5
+ * Maps a user's Aridhia requests for one dataset to the RestrictionUiType for display.
5
6
  *
6
- * @param request - The Aridhia request object, or undefined if no request exists
7
- * @returns The appropriate RestrictionUiType based on the request status
7
+ * @param requests - Every request the user holds for the dataset (may be empty)
8
+ * @returns The RestrictionUiType of the highest-precedence status present, or
9
+ * `AccessBlockedByRestriction` when no request has a recognized status
8
10
  */
9
- export declare function getRestrictionUiTypeFromAridhiaRequest(request: RequestListItem | undefined): RestrictionUiType;
11
+ export declare function getRestrictionUiTypeFromAridhiaRequests(requests: readonly RequestListItem[]): RestrictionUiType;
10
12
  /**
11
- * Finds the Aridhia request for a specific dataset from a list of requests.
12
- * If multiple requests match, returns the most recently updated one.
13
+ * Finds every Aridhia request that includes a specific dataset.
13
14
  *
14
15
  * @param requests - Array of Aridhia requests
15
- * @param datasetCode - The dataset code to search for
16
- * @returns The most recently updated request that contains the specified dataset, or undefined if not found
16
+ * @param datasetCode - The dataset code to search for (case-sensitive)
17
+ * @returns The matching requests, most recently updated first; requests whose `updated_at` is
18
+ * missing or unparseable sort last
17
19
  */
18
- export declare function findRequestForDataset(requests: RequestListItem[], datasetCode: string): RequestListItem | undefined;
20
+ export declare function findRequestsForDataset(requests: readonly RequestListItem[], datasetCode: string): RequestListItem[];
19
21
  //# sourceMappingURL=aridhiaAccessStatusUtils.d.ts.map