synapse-react-client 4.0.9 → 4.0.11

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 (613) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
  6. package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
  7. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  8. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  9. package/dist/assets/icons/CloudWarning.js +47 -0
  10. package/dist/assets/icons/CloudWarning.js.map +1 -0
  11. package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
  12. package/dist/assets/icons/TasksIcon.js +6 -10
  13. package/dist/assets/icons/TasksIcon.js.map +1 -1
  14. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  15. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
  16. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  17. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  18. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  19. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  21. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  22. package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
  23. package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
  24. package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
  25. package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
  26. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
  27. package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
  28. package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
  29. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  30. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
  31. package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
  32. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  33. package/dist/components/Authentication/Constants.d.ts +1 -0
  34. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  35. package/dist/components/Authentication/Constants.js +2 -2
  36. package/dist/components/Authentication/Constants.js.map +1 -1
  37. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  38. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  39. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  40. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  41. package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
  42. package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
  43. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  44. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  45. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
  46. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  47. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  48. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  49. package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
  50. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  51. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  52. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  53. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  54. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  55. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  56. package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
  57. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  58. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  59. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  60. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  61. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  62. package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
  63. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  64. package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
  65. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  66. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  67. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  68. package/dist/components/ComponentCollapse.js.map +1 -1
  69. package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
  70. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  71. package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
  72. package/dist/components/DataGrid/DataGrid.d.ts +0 -1
  73. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  74. package/dist/components/DataGrid/DataGrid.js +72 -72
  75. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  76. package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
  77. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  78. package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
  79. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  80. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  81. package/dist/components/DataGrid/SynapseGrid.js +326 -268
  82. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  83. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
  84. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  85. package/dist/components/DataGrid/columns/AutocompleteColumn.js +124 -67
  86. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  87. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
  88. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  89. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
  90. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  91. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
  92. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
  93. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
  94. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
  95. package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
  96. package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
  97. package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
  98. package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
  99. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
  100. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  101. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  102. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  103. package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
  104. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
  105. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  106. package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
  107. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  108. package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
  109. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  110. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  111. package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
  112. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  113. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  114. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  115. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  116. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  117. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  118. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  119. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  120. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  121. package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
  122. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  123. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  124. package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
  125. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  126. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  127. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  128. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  129. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  130. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  131. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  132. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  133. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  134. package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
  135. package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
  136. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  137. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  138. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  139. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  140. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  141. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  142. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  143. package/dist/components/DirectDownloadButton.js.map +1 -1
  144. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  145. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  146. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  147. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  148. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  149. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  150. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  151. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  152. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  153. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  154. package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
  155. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  156. package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
  157. package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
  158. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  159. package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
  160. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  161. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
  162. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  163. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  164. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  165. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  166. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  167. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
  168. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
  169. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  170. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  171. package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
  172. package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
  173. package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
  174. package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
  175. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  176. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  177. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  178. package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
  179. package/dist/components/EntityForm/EntityForm.js.map +1 -1
  180. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  181. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  182. package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
  183. package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
  184. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  185. package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
  186. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  187. package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
  188. package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
  189. package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
  190. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  191. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  192. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  193. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  194. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  195. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  196. package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
  197. package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
  198. package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
  199. package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
  200. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  201. package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
  202. package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
  203. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  204. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  205. package/dist/components/Forum/DiscussionReply.js +19 -19
  206. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  207. package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
  208. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  209. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  210. package/dist/components/Forum/DiscussionThread.js +73 -72
  211. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  212. package/dist/components/Forum/ForumTable.js.map +1 -1
  213. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  214. package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
  215. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  216. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  217. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  218. package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
  219. package/dist/components/GenericCard/GenericCard.js +12 -7
  220. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  221. package/dist/components/GenericCard/Linkify.js.map +1 -1
  222. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  223. package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
  224. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  225. package/dist/components/Goals/Goals.Mobile.js.map +1 -1
  226. package/dist/components/Goals/Goals.js.map +1 -1
  227. package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
  228. package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
  229. package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
  230. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  231. package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
  232. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  233. package/dist/components/HasAccess/useHasAccess.js.map +1 -1
  234. package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
  235. package/dist/components/HeaderCard.d.ts +6 -1
  236. package/dist/components/HeaderCard.d.ts.map +1 -1
  237. package/dist/components/HeaderCard.js +107 -76
  238. package/dist/components/HeaderCard.js.map +1 -1
  239. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  240. package/dist/components/IconList.js.map +1 -1
  241. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  242. package/dist/components/IconSvg/IconSvg.js +2 -1
  243. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  244. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
  245. package/dist/components/ImageFromSynapseTable.js.map +1 -1
  246. package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
  247. package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
  248. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
  249. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  250. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  251. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  252. package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
  253. package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
  254. package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
  255. package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
  256. package/dist/components/Markdown/UserMentionModal.js.map +1 -1
  257. package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
  258. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  259. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  260. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  261. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
  262. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  263. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  264. package/dist/components/PageProgress/PageProgress.js.map +1 -1
  265. package/dist/components/Plot/DotPlot.js.map +1 -1
  266. package/dist/components/Plot/Plot.js.map +1 -1
  267. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  268. package/dist/components/Plot/ThemesPlot.js.map +1 -1
  269. package/dist/components/Plot/UpsetPlot.js.map +1 -1
  270. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  271. package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
  272. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  273. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
  274. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  275. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
  276. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  277. package/dist/components/Programs/Programs.Mobile.js.map +1 -1
  278. package/dist/components/Programs/Programs.js.map +1 -1
  279. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  280. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  281. package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
  282. package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
  283. package/dist/components/QueryCount/QueryCount.js.map +1 -1
  284. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  285. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  286. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  287. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  288. package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
  289. package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
  290. package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
  291. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  292. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  293. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  294. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
  295. package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
  296. package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
  297. package/dist/components/Resources/Resources.Mobile.js.map +1 -1
  298. package/dist/components/Resources/Resources.js.map +1 -1
  299. package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
  300. package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
  301. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  302. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  303. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  304. package/dist/components/SmartLink/SmartButton.js.map +1 -1
  305. package/dist/components/SmartLink/SmartLink.js.map +1 -1
  306. package/dist/components/SourceAppImage.js.map +1 -1
  307. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  308. package/dist/components/StatisticsPlot.js.map +1 -1
  309. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  310. package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
  311. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  312. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  313. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  314. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  315. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  316. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  317. package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
  318. package/dist/components/SynapseForm/SynapseForm.js +4 -2
  319. package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
  320. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  321. package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
  322. package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
  323. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  324. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  325. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  326. package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
  327. package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
  328. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
  329. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  330. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
  331. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  332. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  333. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
  334. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  335. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  336. package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
  337. package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
  338. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  339. package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
  340. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  341. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  342. package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
  343. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  344. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  345. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  346. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
  347. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  348. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
  349. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
  350. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  351. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  352. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  353. package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
  354. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  355. package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
  356. package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
  357. package/dist/components/TanStackTable/ColumnHeader.js +8 -8
  358. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  359. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  360. package/dist/components/TanStackTable/TableBody.js.map +1 -1
  361. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  362. package/dist/components/TextField/TextField.js.map +1 -1
  363. package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
  364. package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
  365. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  366. package/dist/components/UserCard/Avatar.js.map +1 -1
  367. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  368. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
  369. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  370. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  371. package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
  372. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  373. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  374. package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
  375. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  376. package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
  377. package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
  378. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  379. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  380. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  381. package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
  382. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  383. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  384. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  385. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  386. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  387. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  388. package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
  389. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  390. package/dist/components/error/ErrorPage.js.map +1 -1
  391. package/dist/components/favorites/FavoritesPage.js.map +1 -1
  392. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  393. package/dist/components/layout/SWCHeader.d.ts +9 -0
  394. package/dist/components/layout/SWCHeader.d.ts.map +1 -0
  395. package/dist/components/layout/SWCHeader.js +19 -0
  396. package/dist/components/layout/SWCHeader.js.map +1 -0
  397. package/dist/components/layout/SWCPageLayout.d.ts +9 -0
  398. package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
  399. package/dist/components/layout/SWCPageLayout.js +14 -0
  400. package/dist/components/layout/SWCPageLayout.js.map +1 -0
  401. package/dist/components/menu/ComplexMenu.js.map +1 -1
  402. package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
  403. package/dist/components/styled/StyledPopover.js.map +1 -1
  404. package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
  405. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  406. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  407. package/dist/components/trash/TrashCanList.js.map +1 -1
  408. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  409. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  410. package/dist/components/widgets/SynapseVideo.js.map +1 -1
  411. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  412. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  413. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  414. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  415. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
  416. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  417. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  418. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  419. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  420. package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
  421. package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
  422. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  423. package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
  424. package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
  425. package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
  426. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
  427. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
  428. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
  429. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
  430. package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
  431. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
  432. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
  433. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
  434. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
  435. package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
  436. package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
  437. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
  438. package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
  439. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
  440. package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
  441. package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
  442. package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
  443. package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
  444. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
  445. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
  446. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
  447. package/dist/features/curator/dashboard/components/shared.css +1 -0
  448. package/dist/features/curator/dashboard/components/shared.module.js +5 -0
  449. package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
  450. package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
  451. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
  452. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  453. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
  454. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  455. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  456. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  457. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  458. package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
  459. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  460. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  461. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
  462. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  463. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
  464. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
  465. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
  466. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
  467. package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
  468. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
  469. package/dist/features/entity/metadata-task/utils/constants.js +6 -0
  470. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
  471. package/dist/mocks/challenge/mockChallenge.js.map +1 -1
  472. package/dist/mocks/entity/mockDataset.js.map +1 -1
  473. package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
  474. package/dist/mocks/entity/mockFileEntity.js.map +1 -1
  475. package/dist/mocks/entity/mockFileView.js.map +1 -1
  476. package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
  477. package/dist/mocks/entity/mockProject.js.map +1 -1
  478. package/dist/mocks/entity/mockProjectView.js.map +1 -1
  479. package/dist/mocks/entity/mockRootEntity.js.map +1 -1
  480. package/dist/mocks/entity/mockTableEntity.js.map +1 -1
  481. package/dist/mocks/mockWiki.js.map +1 -1
  482. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  483. package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
  484. package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
  485. package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
  486. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  487. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  488. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  489. package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
  490. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  491. package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
  492. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  493. package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
  494. package/dist/mocks/provenance/mockActivity.js.map +1 -1
  495. package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
  496. package/dist/ror-client/index.js.map +1 -1
  497. package/dist/style/components/_cards.scss +4 -0
  498. package/dist/style/components/_data-grid-extra.css +1 -1
  499. package/dist/style/components/_data-grid-extra.scss +2 -0
  500. package/dist/style/main.css +1 -1
  501. package/dist/synapse-client/HttpClient.js.map +1 -1
  502. package/dist/synapse-client/SynapseClient.js.map +1 -1
  503. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  504. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  505. package/dist/synapse-queries/KeyFactory.js +3 -0
  506. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  507. package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
  508. package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
  509. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
  510. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  511. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  512. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  513. package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
  514. package/dist/synapse-queries/doi/useDOI.js.map +1 -1
  515. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  516. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  517. package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
  518. package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
  519. package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
  520. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  521. package/dist/synapse-queries/entity/useSchema.js.map +1 -1
  522. package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
  523. package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
  524. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  525. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  526. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  527. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  528. package/dist/synapse-queries/forum/useThread.js +19 -12
  529. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  530. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
  531. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
  532. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  533. package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
  534. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  535. package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
  536. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  537. package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
  538. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  539. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  540. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  541. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  542. package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
  543. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  544. package/dist/theme/ThemeProvider.js.map +1 -1
  545. package/dist/tsconfig.build.tsbuildinfo +1 -1
  546. package/dist/utils/APIConstants.d.ts +1 -0
  547. package/dist/utils/APIConstants.d.ts.map +1 -1
  548. package/dist/utils/APIConstants.js +2 -2
  549. package/dist/utils/APIConstants.js.map +1 -1
  550. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  551. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  552. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  553. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  554. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  555. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  556. package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
  557. package/dist/utils/context/SynapseContext.js.map +1 -1
  558. package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
  559. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  560. package/dist/utils/functions/AccessControlListUtils.js +12 -1
  561. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  562. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  563. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  564. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  565. package/dist/utils/functions/GridApiUtils.js.map +1 -1
  566. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  567. package/dist/utils/functions/RealmUtils.d.ts +4 -0
  568. package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
  569. package/dist/utils/functions/RealmUtils.js +9 -3
  570. package/dist/utils/functions/RealmUtils.js.map +1 -1
  571. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  572. package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
  573. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  574. package/dist/utils/functions/StringUtils.js.map +1 -1
  575. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  576. package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
  577. package/dist/utils/functions/getEndpoint.js.map +1 -1
  578. package/dist/utils/functions/getUserData.js.map +1 -1
  579. package/dist/utils/functions/queryUtils.js.map +1 -1
  580. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  581. package/dist/utils/hooks/useConfirmItems.js.map +1 -1
  582. package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
  583. package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
  584. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  585. package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
  586. package/dist/utils/hooks/useGetGoalData.js.map +1 -1
  587. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  588. package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
  589. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  590. package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
  591. package/dist/utils/hooks/useIsBot.js.map +1 -1
  592. package/dist/utils/hooks/useListState.js.map +1 -1
  593. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  594. package/dist/utils/hooks/useLogin.js +53 -52
  595. package/dist/utils/hooks/useLogin.js.map +1 -1
  596. package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
  597. package/dist/utils/hooks/useOverlay.js.map +1 -1
  598. package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
  599. package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
  600. package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
  601. package/dist/utils/hooks/useSet.js.map +1 -1
  602. package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
  603. package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
  604. package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
  605. package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
  606. package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
  607. package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
  608. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
  609. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
  610. package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
  611. package/dist/utils/html/TargetEnum.js.map +1 -1
  612. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  613. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"useGetMentions.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/useGetMentions.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { skipToken, useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport {\n COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n ColumnSingleValueFilterOperator,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { CitingWork } from './useDataCiteUsage'\n\nconst MENTIONS_SYNAPSE_TABLE_ID = 'syn66047339'\n\nexport type EuropePMCAuthor = {\n fullName?: string\n firstName?: string\n lastName?: string\n}\n\nexport type EuropePMCAuthorList = {\n author?: EuropePMCAuthor[]\n}\n\nexport type EuropePMCResult = {\n id?: string\n pmid?: string\n pmcid?: string\n doi?: string\n title?: string\n journalTitle?: string\n pubYear?: string\n authorList?: EuropePMCAuthorList\n}\n\nexport type EuropePMCResponse = {\n resultList: {\n result: EuropePMCResult[]\n }\n}\n\nexport const getMentionsQueryKey = (entityId: string) =>\n ['europepmc', entityId] as const\n\nexport async function fetchMetadataForPMCIDs(\n signal: AbortSignal,\n pmcids: string[],\n): Promise<CitingWork[]> {\n if (pmcids.length === 0) return []\n const query = pmcids.map(id => `PMCID:${id}`).join(' OR ')\n\n const url = new URL('https://www.ebi.ac.uk/europepmc/webservices/rest/search')\n url.searchParams.set('query', query)\n url.searchParams.set('format', 'json')\n url.searchParams.set('pageSize', String(pmcids.length))\n\n const resp = await fetch(url.toString(), {\n headers: { Accept: 'application/json' },\n signal,\n })\n if (!resp.ok)\n throw new Error(`Europe PMC error ${resp.status}: ${await resp.text()}`)\n\n const json = (await resp.json()) as EuropePMCResponse\n return mapEuropePMCResponseToCitingWorks(json)\n}\n\nexport function mapEuropePMCResponseToCitingWorks(\n json: EuropePMCResponse,\n): CitingWork[] {\n return json.resultList.result.map(\n r =>\n ({\n id: r.pmcid,\n title: r.title ?? '(Untitled)',\n doi: r.doi,\n publisher: r.journalTitle,\n publicationYear: r.pubYear ? Number(r.pubYear) : undefined,\n // authors: r.authorList?.author?.map((a: EuropePMCAuthor) => a.fullName ?? `${a.firstName ?? \"\"} ${a.lastName ?? \"\"}`.trim()) ?? [],\n } as CitingWork),\n )\n}\n\nexport function useGetMentions(\n entityId: string,\n options?: Omit<UseQueryOptions<CitingWork[], Error>, 'queryKey' | 'queryFn'>,\n) {\n const query: Query = {\n sql: `select pmcid from ${MENTIONS_SYNAPSE_TABLE_ID}`,\n additionalFilters: [\n {\n concreteType: COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n columnName: 'synid',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [entityId],\n },\n ],\n }\n\n const { data } = useGetQueryResultBundleWithAsyncStatus({\n entityId: entityId,\n query,\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n })\n\n const rows = data?.responseBody?.queryResult?.queryResults?.rows\n const pcmids = rows\n ?.map(row => {\n const pmcid = row.values[0]\n // remove \"pmc:\" prefix if present\n return pmcid?.toString().replace(/^pmc:/i, '')\n })\n .filter(pmcid => pmcid != null) as string[]\n const key = useMemo(() => getMentionsQueryKey(entityId), [entityId])\n return useQuery({\n ...options,\n queryKey: key,\n queryFn: pcmids\n ? ({ signal }) => {\n return fetchMetadataForPMCIDs(signal, pcmids)\n }\n : skipToken,\n })\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAA4B,eA6BrB,KAAuB,MAClC,CAAC,aAAa,EAAS;AAEzB,eAAsB,EACpB,GACA,GACuB;AACvB,KAAI,EAAO,WAAW,EAAG,QAAO,EAAE;CAClC,IAAM,IAAQ,EAAO,KAAI,MAAM,SAAS,IAAK,CAAC,KAAK,OAAO,EAEpD,IAAM,IAAI,IAAI,0DAA0D;AAG9E,CAFA,EAAI,aAAa,IAAI,SAAS,EAAM,EACpC,EAAI,aAAa,IAAI,UAAU,OAAO,EACtC,EAAI,aAAa,IAAI,YAAY,OAAO,EAAO,OAAO,CAAC;CAEvD,IAAM,IAAO,MAAM,MAAM,EAAI,UAAU,EAAE;EACvC,SAAS,EAAE,QAAQ,oBAAoB;EACvC;EACD,CAAC;AACF,KAAI,CAAC,EAAK,GACR,OAAU,MAAM,oBAAoB,EAAK,OAAO,IAAI,MAAM,EAAK,MAAM,GAAG;AAG1E,QAAO,EADO,MAAM,EAAK,MAAM,CACe;;AAGhD,SAAgB,EACd,GACc;AACd,QAAO,EAAK,WAAW,OAAO,KAC5B,OACG;EACC,IAAI,EAAE;EACN,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE;EACP,WAAW,EAAE;EACb,iBAAiB,EAAE,UAAU,OAAO,EAAE,QAAQ,GAAG,KAAA;EAElD,EACJ;;AAGH,SAAgB,EACd,GACA,GACA;CAaA,IAAM,EAAE,YAAS,EAAuC;EAC5C;EACV,OAdmB;GACnB,KAAK,qBAAqB;GAC1B,mBAAmB,CACjB;IACE,cAAc;IACd,YAAY;IACZ,UAAU,EAAgC;IAC1C,QAAQ,CAAC,EAAS;IACnB,CACF;GACF;EAKC,UAAA;EACA,cAAc;EACf,CAAC,EAGI,KADO,GAAM,cAAc,aAAa,cAAc,OAExD,KAAI,MACU,EAAI,OAAO,IAEX,UAAU,CAAC,QAAQ,UAAU,GAAG,CAC9C,CACD,QAAO,MAAS,KAAS,KAAK,EAC3B,IAAM,QAAc,EAAoB,EAAS,EAAE,CAAC,EAAS,CAAC;AACpE,QAAO,EAAS;EACd,GAAG;EACH,UAAU;EACV,SAAS,KACJ,EAAE,gBACM,EAAuB,GAAQ,EAAO,GAE/C;EACL,CAAC"}
1
+ {"version":3,"file":"useGetMentions.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/useGetMentions.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { skipToken, useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport {\n COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n ColumnSingleValueFilterOperator,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { CitingWork } from './useDataCiteUsage'\n\nconst MENTIONS_SYNAPSE_TABLE_ID = 'syn66047339'\n\nexport type EuropePMCAuthor = {\n fullName?: string\n firstName?: string\n lastName?: string\n}\n\nexport type EuropePMCAuthorList = {\n author?: EuropePMCAuthor[]\n}\n\nexport type EuropePMCResult = {\n id?: string\n pmid?: string\n pmcid?: string\n doi?: string\n title?: string\n journalTitle?: string\n pubYear?: string\n authorList?: EuropePMCAuthorList\n}\n\nexport type EuropePMCResponse = {\n resultList: {\n result: EuropePMCResult[]\n }\n}\n\nexport const getMentionsQueryKey = (entityId: string) =>\n ['europepmc', entityId] as const\n\nexport async function fetchMetadataForPMCIDs(\n signal: AbortSignal,\n pmcids: string[],\n): Promise<CitingWork[]> {\n if (pmcids.length === 0) return []\n const query = pmcids.map(id => `PMCID:${id}`).join(' OR ')\n\n const url = new URL('https://www.ebi.ac.uk/europepmc/webservices/rest/search')\n url.searchParams.set('query', query)\n url.searchParams.set('format', 'json')\n url.searchParams.set('pageSize', String(pmcids.length))\n\n const resp = await fetch(url.toString(), {\n headers: { Accept: 'application/json' },\n signal,\n })\n if (!resp.ok)\n throw new Error(`Europe PMC error ${resp.status}: ${await resp.text()}`)\n\n const json = (await resp.json()) as EuropePMCResponse\n return mapEuropePMCResponseToCitingWorks(json)\n}\n\nexport function mapEuropePMCResponseToCitingWorks(\n json: EuropePMCResponse,\n): CitingWork[] {\n return json.resultList.result.map(\n r =>\n ({\n id: r.pmcid,\n title: r.title ?? '(Untitled)',\n doi: r.doi,\n publisher: r.journalTitle,\n publicationYear: r.pubYear ? Number(r.pubYear) : undefined,\n // authors: r.authorList?.author?.map((a: EuropePMCAuthor) => a.fullName ?? `${a.firstName ?? \"\"} ${a.lastName ?? \"\"}`.trim()) ?? [],\n } as CitingWork),\n )\n}\n\nexport function useGetMentions(\n entityId: string,\n options?: Omit<UseQueryOptions<CitingWork[], Error>, 'queryKey' | 'queryFn'>,\n) {\n const query: Query = {\n sql: `select pmcid from ${MENTIONS_SYNAPSE_TABLE_ID}`,\n additionalFilters: [\n {\n concreteType: COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n columnName: 'synid',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [entityId],\n },\n ],\n }\n\n const { data } = useGetQueryResultBundleWithAsyncStatus({\n entityId: entityId,\n query,\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n })\n\n const rows = data?.responseBody?.queryResult?.queryResults?.rows\n const pcmids = rows\n ?.map(row => {\n const pmcid = row.values[0]\n // remove \"pmc:\" prefix if present\n return pmcid?.toString().replace(/^pmc:/i, '')\n })\n .filter(pmcid => pmcid != null) as string[]\n const key = useMemo(() => getMentionsQueryKey(entityId), [entityId])\n return useQuery({\n ...options,\n queryKey: key,\n queryFn: pcmids\n ? ({ signal }) => {\n return fetchMetadataForPMCIDs(signal, pcmids)\n }\n : skipToken,\n })\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAA4B,eA6BrB,KAAuB,MAClC,CAAC,aAAa,EAAS;AAEzB,eAAsB,EACpB,GACA,GACuB;AACvB,KAAI,EAAO,WAAW,EAAG,QAAO,EAAE;CAClC,IAAM,IAAQ,EAAO,KAAI,MAAM,SAAS,IAAK,CAAC,KAAK,OAAO,EAEpD,IAAM,IAAI,IAAI,0DAA0D;AAG9E,CAFA,EAAI,aAAa,IAAI,SAAS,EAAM,EACpC,EAAI,aAAa,IAAI,UAAU,OAAO,EACtC,EAAI,aAAa,IAAI,YAAY,OAAO,EAAO,OAAO,CAAC;CAEvD,IAAM,IAAO,MAAM,MAAM,EAAI,UAAU,EAAE;EACvC,SAAS,EAAE,QAAQ,oBAAoB;EACvC;EACD,CAAC;AACF,KAAI,CAAC,EAAK,GACR,OAAU,MAAM,oBAAoB,EAAK,OAAO,IAAI,MAAM,EAAK,MAAM,GAAG;AAG1E,QAAO,EAAkC,MADrB,EAAK,MAAM,CACe;;AAGhD,SAAgB,EACd,GACc;AACd,QAAO,EAAK,WAAW,OAAO,KAC5B,OACG;EACC,IAAI,EAAE;EACN,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE;EACP,WAAW,EAAE;EACb,iBAAiB,EAAE,UAAU,OAAO,EAAE,QAAQ,GAAG,KAAA;EAElD,EACJ;;AAGH,SAAgB,EACd,GACA,GACA;CAaA,IAAM,EAAE,YAAS,EAAuC;EAC5C;EACV,OAAA;GAbA,KAAK,qBAAqB;GAC1B,mBAAmB,CACjB;IACE,cAAc;IACd,YAAY;IACZ,UAAU,EAAgC;IAC1C,QAAQ,CAAC,EAAS;IACnB,CACF;GAKD;EACA,UAAA;EACA,cAAc;EACf,CAAC,EAGI,KADO,GAAM,cAAc,aAAa,cAAc,OAExD,KAAI,MACU,EAAI,OAAO,IAEX,UAAU,CAAC,QAAQ,UAAU,GAAG,CAC9C,CACD,QAAO,MAAS,KAAS,KAAK,EAC3B,IAAM,QAAc,EAAoB,EAAS,EAAE,CAAC,EAAS,CAAC;AACpE,QAAO,EAAS;EACd,GAAG;EACH,UAAU;EACV,SAAS,KACJ,EAAE,gBACM,EAAuB,GAAQ,EAAO,GAE/C;EACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorPage.js","names":[],"sources":["../../../src/components/error/ErrorPage.tsx"],"sourcesContent":["import { ReactComponent as MaintenanceSvg } from '@/assets/icons/error_page/maintenance.svg'\nimport { ReactComponent as NoAccessSvg } from '@/assets/icons/error_page/no-access.svg'\nimport { ReactComponent as UnavailableSvg } from '@/assets/icons/error_page/unavailable.svg'\nimport { useSynapseContext } from '@/utils'\nimport { Box, Link, Typography } from '@mui/material'\nimport { useCallback, useMemo, useState } from 'react'\nimport SynapseObjectDOIInfo from './SynapseObjectDOIInfo'\nimport SendMessageToEntityOwnerDialog from './SendMessageToEntityOwnerDialog'\nimport { DoiObjectType } from '@sage-bionetworks/synapse-client/generated/models/DoiObjectType'\n\nexport type ErrorPageProps = {\n type: SynapseErrorType\n message?: string // custom message to report\n /** @deprecated use `id` and objectType: DoiObjectType.ENTITY */\n entityId?: string\n /** @deprecated use `version` and objectType: DoiObjectType.ENTITY */\n entityVersion?: number\n\n /** The ID of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n id?: string\n /** The version of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n version?: number\n /** The type of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n objectType?: DoiObjectType\n /** If on a portal that may mint DOIs, this portal ID may be used to find a DOI to show a 'tombstone' */\n portalId?: string\n\n gotoPlace: (href: string) => void\n}\n\nexport const SYNAPSE_DOWN_TITLE = 'Synapse is down for maintenance.'\nexport const ACCESS_DENIED_TITLE = 'You don’t have permission to view this.'\nexport const NOT_FOUND_TITLE = 'This page isn’t available.'\nexport const LOG_IN_LINK_TEXT = 'Log in to Synapse'\nexport const CONTACT_US_LINK_TEXT = 'Contact us for more information'\nexport const CONTACT_ADMIN_LINK_TEXT = 'Contact the Administrator'\nexport const ACCESS_DENIED_ANONYMOUS_MESSAGE =\n 'Try logging in. If you still see this message after logging in, you have not been granted access to view this resource.'\nexport const ACCESS_DENIED_MESSAGE =\n 'This account has not been granted access to view this resource.'\nexport const NOT_FOUND_MESSAGE =\n 'The link you followed may be broken, or the page may have been removed.'\nexport const ACCESS_DENIED_ANONYMOUS_ACTION_DESCRIPTION =\n 'A Synapse account is free, and lets you view public resources.'\nexport const ACCESS_DENIED_CONTACT_ADMIN_ACTION_DESCRIPTION =\n 'Write a message to the owner of the resource asking for permission to view.'\n\nexport enum SynapseErrorType {\n DOWN = 'DOWN',\n ACCESS_DENIED = 'ACCESS_DENIED',\n NOT_FOUND = 'NOT_FOUND',\n}\n\nconst getImage = (type: SynapseErrorType) => {\n switch (type) {\n case SynapseErrorType.DOWN:\n return (\n <MaintenanceSvg\n role=\"img\"\n aria-label=\"Synapse is Down image\"\n title={SynapseErrorType.DOWN}\n />\n )\n case SynapseErrorType.ACCESS_DENIED:\n return (\n <NoAccessSvg\n role=\"img\"\n aria-label=\"Access denied image\"\n title={SynapseErrorType.ACCESS_DENIED}\n />\n )\n case SynapseErrorType.NOT_FOUND:\n return (\n <UnavailableSvg\n role=\"img\"\n aria-label=\"Resource not found image\"\n title={SynapseErrorType.NOT_FOUND}\n />\n )\n default:\n return <></>\n }\n}\nconst getTitle = (type: SynapseErrorType) => {\n switch (type) {\n case SynapseErrorType.DOWN:\n return SYNAPSE_DOWN_TITLE\n case SynapseErrorType.ACCESS_DENIED:\n return ACCESS_DENIED_TITLE\n case SynapseErrorType.NOT_FOUND:\n return NOT_FOUND_TITLE\n default:\n return ''\n }\n}\n\ntype ErrorPageAction = {\n linkText: string\n onClick: () => void\n description: string\n}\n\nfunction ErrorPage(props: ErrorPageProps) {\n const {\n type,\n entityId = '',\n entityVersion,\n message,\n gotoPlace,\n id,\n version,\n objectType,\n portalId,\n } = props\n const [isSendMessageToAdminDialogOpen, setSendMessageToAdminDialogOpen] =\n useState<boolean>(false)\n const { isAuthenticated } = useSynapseContext()\n const image = useMemo(() => getImage(type), [type])\n const title = useMemo(() => getTitle(type), [type])\n\n const messages = useMemo(() => {\n const msgs: string[] = []\n switch (type) {\n case SynapseErrorType.ACCESS_DENIED:\n if (!isAuthenticated) {\n msgs.push(ACCESS_DENIED_ANONYMOUS_MESSAGE)\n } else {\n msgs.push(ACCESS_DENIED_MESSAGE)\n }\n break\n case SynapseErrorType.NOT_FOUND:\n msgs.push(NOT_FOUND_MESSAGE)\n break\n }\n if (message) {\n msgs.push(message)\n }\n return msgs\n }, [type, isAuthenticated, message])\n\n const actions = useMemo(() => {\n const acts: ErrorPageAction[] = []\n if (type === SynapseErrorType.ACCESS_DENIED) {\n if (!isAuthenticated) {\n acts.push({\n linkText: LOG_IN_LINK_TEXT,\n onClick: () => gotoPlace('/LoginPlace:0'),\n description: ACCESS_DENIED_ANONYMOUS_ACTION_DESCRIPTION,\n })\n } else if (entityId) {\n acts.push({\n linkText: CONTACT_US_LINK_TEXT,\n onClick: () =>\n window.open(\n 'https://sagebionetworks.jira.com/servicedesk/customer/portals',\n '_blank',\n ),\n description: '',\n })\n // SWC-7073: Remove ability to send a message to the admins until we have a better option for the majority of the cases (service desk, contact emails, ...)\n // acts.push({\n // linkText: CONTACT_ADMIN_LINK_TEXT,\n // onClick: () => setSendMessageToAdminDialogOpen(true),\n // description: ACCESS_DENIED_CONTACT_ADMIN_ACTION_DESCRIPTION,\n // })\n }\n }\n return acts\n }, [type, isAuthenticated, entityId, gotoPlace])\n\n const handleCloseDialog = useCallback(\n () => setSendMessageToAdminDialogOpen(false),\n [],\n )\n return (\n <>\n <Box\n sx={{\n display: { xs: 'flex', lg: 'grid' },\n columnGap: '80px',\n flexDirection: { xs: 'column', lg: undefined },\n gridTemplateColumns: { lg: '40% 60%' },\n }}\n >\n <Box\n sx={{\n justifySelf: 'end',\n alignSelf: 'center',\n '& svg': {\n height: '360px',\n maxWidth: '300px',\n },\n pt: '50px',\n pb: '50px',\n }}\n >\n {image}\n </Box>\n <Box\n sx={{\n justifySelf: 'start',\n alignSelf: 'center',\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n m: { xs: '15px', lg: undefined },\n mr: { lg: '100px' },\n }}\n >\n <Typography\n sx={{ fontSize: '30px', fontWeight: 700, lineHeight: '36px' }}\n >\n {title}\n </Typography>\n {messages.map(message => {\n return (\n <Typography variant=\"body1\" key={message}>\n {message}\n </Typography>\n )\n })}\n {actions.map(action => {\n const { onClick, linkText, description } = action\n return (\n <Box key={linkText}>\n <Link sx={{ fontSize: '16px' }} onClick={onClick}>\n {linkText}\n </Link>\n <Typography variant=\"body1\">{description}</Typography>\n </Box>\n )\n })}\n {entityId && (\n <SynapseObjectDOIInfo\n id={entityId}\n version={entityVersion}\n type={DoiObjectType.ENTITY}\n />\n )}\n {id && objectType && (\n <SynapseObjectDOIInfo\n id={id}\n version={version}\n type={objectType}\n portalId={portalId}\n />\n )}\n </Box>\n </Box>\n {entityId && (\n <SendMessageToEntityOwnerDialog\n isOpen={isSendMessageToAdminDialogOpen}\n onHide={handleCloseDialog}\n entityId={entityId}\n />\n )}\n </>\n )\n}\n\nexport default ErrorPage\n"],"mappings":"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"}
1
+ {"version":3,"file":"ErrorPage.js","names":[],"sources":["../../../src/components/error/ErrorPage.tsx"],"sourcesContent":["import { ReactComponent as MaintenanceSvg } from '@/assets/icons/error_page/maintenance.svg'\nimport { ReactComponent as NoAccessSvg } from '@/assets/icons/error_page/no-access.svg'\nimport { ReactComponent as UnavailableSvg } from '@/assets/icons/error_page/unavailable.svg'\nimport { useSynapseContext } from '@/utils'\nimport { Box, Link, Typography } from '@mui/material'\nimport { useCallback, useMemo, useState } from 'react'\nimport SynapseObjectDOIInfo from './SynapseObjectDOIInfo'\nimport SendMessageToEntityOwnerDialog from './SendMessageToEntityOwnerDialog'\nimport { DoiObjectType } from '@sage-bionetworks/synapse-client/generated/models/DoiObjectType'\n\nexport type ErrorPageProps = {\n type: SynapseErrorType\n message?: string // custom message to report\n /** @deprecated use `id` and objectType: DoiObjectType.ENTITY */\n entityId?: string\n /** @deprecated use `version` and objectType: DoiObjectType.ENTITY */\n entityVersion?: number\n\n /** The ID of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n id?: string\n /** The version of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n version?: number\n /** The type of the object that was attempted to be retrieved, which may be used to show a 'tombstone' */\n objectType?: DoiObjectType\n /** If on a portal that may mint DOIs, this portal ID may be used to find a DOI to show a 'tombstone' */\n portalId?: string\n\n gotoPlace: (href: string) => void\n}\n\nexport const SYNAPSE_DOWN_TITLE = 'Synapse is down for maintenance.'\nexport const ACCESS_DENIED_TITLE = 'You don’t have permission to view this.'\nexport const NOT_FOUND_TITLE = 'This page isn’t available.'\nexport const LOG_IN_LINK_TEXT = 'Log in to Synapse'\nexport const CONTACT_US_LINK_TEXT = 'Contact us for more information'\nexport const CONTACT_ADMIN_LINK_TEXT = 'Contact the Administrator'\nexport const ACCESS_DENIED_ANONYMOUS_MESSAGE =\n 'Try logging in. If you still see this message after logging in, you have not been granted access to view this resource.'\nexport const ACCESS_DENIED_MESSAGE =\n 'This account has not been granted access to view this resource.'\nexport const NOT_FOUND_MESSAGE =\n 'The link you followed may be broken, or the page may have been removed.'\nexport const ACCESS_DENIED_ANONYMOUS_ACTION_DESCRIPTION =\n 'A Synapse account is free, and lets you view public resources.'\nexport const ACCESS_DENIED_CONTACT_ADMIN_ACTION_DESCRIPTION =\n 'Write a message to the owner of the resource asking for permission to view.'\n\nexport enum SynapseErrorType {\n DOWN = 'DOWN',\n ACCESS_DENIED = 'ACCESS_DENIED',\n NOT_FOUND = 'NOT_FOUND',\n}\n\nconst getImage = (type: SynapseErrorType) => {\n switch (type) {\n case SynapseErrorType.DOWN:\n return (\n <MaintenanceSvg\n role=\"img\"\n aria-label=\"Synapse is Down image\"\n title={SynapseErrorType.DOWN}\n />\n )\n case SynapseErrorType.ACCESS_DENIED:\n return (\n <NoAccessSvg\n role=\"img\"\n aria-label=\"Access denied image\"\n title={SynapseErrorType.ACCESS_DENIED}\n />\n )\n case SynapseErrorType.NOT_FOUND:\n return (\n <UnavailableSvg\n role=\"img\"\n aria-label=\"Resource not found image\"\n title={SynapseErrorType.NOT_FOUND}\n />\n )\n default:\n return <></>\n }\n}\nconst getTitle = (type: SynapseErrorType) => {\n switch (type) {\n case SynapseErrorType.DOWN:\n return SYNAPSE_DOWN_TITLE\n case SynapseErrorType.ACCESS_DENIED:\n return ACCESS_DENIED_TITLE\n case SynapseErrorType.NOT_FOUND:\n return NOT_FOUND_TITLE\n default:\n return ''\n }\n}\n\ntype ErrorPageAction = {\n linkText: string\n onClick: () => void\n description: string\n}\n\nfunction ErrorPage(props: ErrorPageProps) {\n const {\n type,\n entityId = '',\n entityVersion,\n message,\n gotoPlace,\n id,\n version,\n objectType,\n portalId,\n } = props\n const [isSendMessageToAdminDialogOpen, setSendMessageToAdminDialogOpen] =\n useState<boolean>(false)\n const { isAuthenticated } = useSynapseContext()\n const image = useMemo(() => getImage(type), [type])\n const title = useMemo(() => getTitle(type), [type])\n\n const messages = useMemo(() => {\n const msgs: string[] = []\n switch (type) {\n case SynapseErrorType.ACCESS_DENIED:\n if (!isAuthenticated) {\n msgs.push(ACCESS_DENIED_ANONYMOUS_MESSAGE)\n } else {\n msgs.push(ACCESS_DENIED_MESSAGE)\n }\n break\n case SynapseErrorType.NOT_FOUND:\n msgs.push(NOT_FOUND_MESSAGE)\n break\n }\n if (message) {\n msgs.push(message)\n }\n return msgs\n }, [type, isAuthenticated, message])\n\n const actions = useMemo(() => {\n const acts: ErrorPageAction[] = []\n if (type === SynapseErrorType.ACCESS_DENIED) {\n if (!isAuthenticated) {\n acts.push({\n linkText: LOG_IN_LINK_TEXT,\n onClick: () => gotoPlace('/LoginPlace:0'),\n description: ACCESS_DENIED_ANONYMOUS_ACTION_DESCRIPTION,\n })\n } else if (entityId) {\n acts.push({\n linkText: CONTACT_US_LINK_TEXT,\n onClick: () =>\n window.open(\n 'https://sagebionetworks.jira.com/servicedesk/customer/portals',\n '_blank',\n ),\n description: '',\n })\n // SWC-7073: Remove ability to send a message to the admins until we have a better option for the majority of the cases (service desk, contact emails, ...)\n // acts.push({\n // linkText: CONTACT_ADMIN_LINK_TEXT,\n // onClick: () => setSendMessageToAdminDialogOpen(true),\n // description: ACCESS_DENIED_CONTACT_ADMIN_ACTION_DESCRIPTION,\n // })\n }\n }\n return acts\n }, [type, isAuthenticated, entityId, gotoPlace])\n\n const handleCloseDialog = useCallback(\n () => setSendMessageToAdminDialogOpen(false),\n [],\n )\n return (\n <>\n <Box\n sx={{\n display: { xs: 'flex', lg: 'grid' },\n columnGap: '80px',\n flexDirection: { xs: 'column', lg: undefined },\n gridTemplateColumns: { lg: '40% 60%' },\n }}\n >\n <Box\n sx={{\n justifySelf: 'end',\n alignSelf: 'center',\n '& svg': {\n height: '360px',\n maxWidth: '300px',\n },\n pt: '50px',\n pb: '50px',\n }}\n >\n {image}\n </Box>\n <Box\n sx={{\n justifySelf: 'start',\n alignSelf: 'center',\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n m: { xs: '15px', lg: undefined },\n mr: { lg: '100px' },\n }}\n >\n <Typography\n sx={{ fontSize: '30px', fontWeight: 700, lineHeight: '36px' }}\n >\n {title}\n </Typography>\n {messages.map(message => {\n return (\n <Typography variant=\"body1\" key={message}>\n {message}\n </Typography>\n )\n })}\n {actions.map(action => {\n const { onClick, linkText, description } = action\n return (\n <Box key={linkText}>\n <Link sx={{ fontSize: '16px' }} onClick={onClick}>\n {linkText}\n </Link>\n <Typography variant=\"body1\">{description}</Typography>\n </Box>\n )\n })}\n {entityId && (\n <SynapseObjectDOIInfo\n id={entityId}\n version={entityVersion}\n type={DoiObjectType.ENTITY}\n />\n )}\n {id && objectType && (\n <SynapseObjectDOIInfo\n id={id}\n version={version}\n type={objectType}\n portalId={portalId}\n />\n )}\n </Box>\n </Box>\n {entityId && (\n <SendMessageToEntityOwnerDialog\n isOpen={isSendMessageToAdminDialogOpen}\n onHide={handleCloseDialog}\n entityId={entityId}\n />\n )}\n </>\n )\n}\n\nexport default ErrorPage\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../src/components/favorites/FavoritesPage.tsx"],"sourcesContent":["import NoSearchResults from '@/assets/icons/NoSearchResults'\nimport { useGetFavorites } from '@/synapse-queries/user/useFavorites'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n convertToEntityType,\n entityTypeToFriendlyName,\n} from '@/utils/functions/EntityTypeUtils'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { InputAdornment, Stack, TextField } from '@mui/material'\nimport { EntityHeader } from '@sage-bionetworks/synapse-types'\nimport {\n createColumnHelper,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { EntityTypeIcon } from '../EntityIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport FavoriteButton from './FavoriteButton'\n\n// Local types used for client-side sorting\nexport type SortField = 'name' | 'type'\nexport type SortDirection = 'ASC' | 'DESC'\nexport type Sort = {\n field: SortField\n direction: SortDirection\n}\n\nconst columnHelper = createColumnHelper<EntityHeader>()\n\nconst columns = [\n columnHelper.display({\n id: 'removeFavorite',\n cell: ctx => <FavoriteButton entityId={ctx.row.original.id} />,\n size: 60,\n enableResizing: false,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor('name', {\n cell: ctx => (\n <a\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.id}`}\n >\n {ctx.row.original.name}\n </a>\n ),\n enableGlobalFilter: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n size: 400,\n enableColumnFilter: false,\n sortingFn: 'alphanumeric',\n enableSorting: true,\n }),\n columnHelper.accessor('type', {\n cell: ctx => {\n const entityType = convertToEntityType(ctx.row.original.type)\n return (\n <>\n <EntityTypeIcon type={entityType} style={{ marginRight: '5px' }} />\n {entityTypeToFriendlyName(entityType)}\n </>\n )\n },\n header: props => <ColumnHeader {...props} title={'Type'} />,\n size: 160,\n enableGlobalFilter: false,\n sortingFn: 'alphanumeric',\n filterFn: 'arrIncludes',\n meta: {\n enableMultipleSelect: true,\n filterVariant: 'enumeration',\n getDisplayText: value =>\n entityTypeToFriendlyName(convertToEntityType(value)),\n },\n enableSorting: true,\n }),\n]\n\nexport default function FavoritesPage() {\n const { isAuthenticated } = useSynapseContext()\n const [searchText, setSearchText] = useState<string>('')\n const [error, setError] = useState<Error>()\n const { data, isLoading, isError, error: newError } = useGetFavorites()\n\n const favorites = useMemo(() => data ?? [], [data])\n\n const favoritesTable = useReactTable<EntityHeader>({\n data: favorites,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n globalFilterFn: 'includesString',\n state: {\n globalFilter: searchText,\n },\n columnResizeMode: 'onChange',\n })\n\n useEffect(() => {\n if (isError && newError) {\n setError(newError)\n }\n }, [isError, newError])\n\n useEffect(() => {\n if (!isAuthenticated) {\n setError(new Error('Please sign in to access your favorites.'))\n } else {\n setError(undefined)\n }\n }, [isAuthenticated])\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n const hasFavoritesMatchingQuery = favoritesTable.getRowModel().rows.length > 0\n\n return (\n <div className=\"FavoritesPage\">\n <TextField\n type=\"search\"\n placeholder=\"Favorite Name\"\n value={searchText}\n onChange={event => {\n setSearchText(event.target.value)\n }}\n fullWidth\n sx={{ mb: 4, maxWidth: '800px' }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <IconSvg icon=\"search\" wrap={false} />\n </InputAdornment>\n ),\n },\n }}\n />\n <StyledTanStackTable table={favoritesTable} fullWidth={false} />\n {!hasFavoritesMatchingQuery && !isLoading && (\n <Stack\n sx={{\n my: 2,\n gap: 1,\n textAlign: 'center',\n }}\n >\n <NoSearchResults height={'150px'} />\n {data?.length == 0 ? (\n <p>You currently have no favorites</p>\n ) : (\n <p>No matching favorites found</p>\n )}\n </Stack>\n )}\n\n {isLoading && (\n <div className=\"placeholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoCA,IAAM,IAAe,GAAkC,EAEjD,IAAU;CACd,EAAa,QAAQ;EACnB,IAAI;EACJ,OAAM,MAAO,kBAAC,GAAD,EAAgB,UAAU,EAAI,IAAI,SAAS,IAAM,CAAA;EAC9D,MAAM;EACN,gBAAgB;EAChB,MAAM,EACJ,WAAW,UACZ;EACF,CAAC;CACF,EAAa,SAAS,QAAQ;EAC5B,OAAM,MACJ,kBAAC,KAAD;GACE,KAAI;GACJ,MAAM,GAAG,EAA2B,OAAO,UAAU,EAAI,IAAI,SAAS;aAErE,EAAI,IAAI,SAAS;GAChB,CAAA;EAEN,oBAAoB;EACpB,SAAQ,MAAS,kBAAC,GAAD;GAAc,GAAI;GAAO,OAAO;GAAU,CAAA;EAC3D,MAAM;EACN,oBAAoB;EACpB,WAAW;EACX,eAAe;EAChB,CAAC;CACF,EAAa,SAAS,QAAQ;EAC5B,OAAM,MAAO;GACX,IAAM,IAAa,EAAoB,EAAI,IAAI,SAAS,KAAK;AAC7D,UACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAgB,MAAM;IAAY,OAAO,EAAE,aAAa,OAAO;IAAI,CAAA,EAClE,EAAyB,EAAW,CACpC,EAAA,CAAA;;EAGP,SAAQ,MAAS,kBAAC,GAAD;GAAc,GAAI;GAAO,OAAO;GAAU,CAAA;EAC3D,MAAM;EACN,oBAAoB;EACpB,WAAW;EACX,UAAU;EACV,MAAM;GACJ,sBAAsB;GACtB,eAAe;GACf,iBAAgB,MACd,EAAyB,EAAoB,EAAM,CAAC;GACvD;EACD,eAAe;EAChB,CAAC;CACH;AAED,SAAwB,IAAgB;CACtC,IAAM,EAAE,uBAAoB,GAAmB,EACzC,CAAC,GAAY,KAAiB,EAAiB,GAAG,EAClD,CAAC,GAAO,KAAY,GAAiB,EACrC,EAAE,SAAM,cAAW,YAAS,OAAO,MAAa,GAAiB,EAIjE,IAAiB,EAA4B;EACjD,MAHgB,QAAc,KAAQ,EAAE,EAAE,CAAC,EAAK,CAAC;EAIxC;EACT,iBAAiB,GAAiB;EAClC,qBAAqB,GAAqB;EAC1C,mBAAmB,GAAmB;EACtC,oBAAoB,GAAoB;EACxC,wBAAwB,GAAwB;EAChD,gBAAgB;EAChB,OAAO,EACL,cAAc,GACf;EACD,kBAAkB;EACnB,CAAC;AAgBF,KAdA,QAAgB;AACd,EAAI,KAAW,KACb,EAAS,EAAS;IAEnB,CAAC,GAAS,EAAS,CAAC,EAEvB,QAAgB;AACd,EAGE,EAHG,IAGM,KAAA,IAFA,gBAAI,MAAM,2CAA2C,CAE3C;IAEpB,CAAC,EAAgB,CAAC,EAEjB,EACF,QAAO,kBAAC,GAAD,EAAoB,UAAS,CAAA;CAGtC,IAAM,IAA4B,EAAe,aAAa,CAAC,KAAK,SAAS;AAE7E,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD;IACE,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAU,MAAS;AACjB,OAAc,EAAM,OAAO,MAAM;;IAEnC,WAAA;IACA,IAAI;KAAE,IAAI;KAAG,UAAU;KAAS;IAChC,WAAW,EACT,OAAO,EACL,gBACE,kBAAC,GAAD;KAAgB,UAAS;eACvB,kBAAC,GAAD;MAAS,MAAK;MAAS,MAAM;MAAS,CAAA;KACvB,CAAA,EAEpB,EACF;IACD,CAAA;GACF,kBAAC,GAAD;IAAqB,OAAO;IAAgB,WAAW;IAAS,CAAA;GAC/D,CAAC,KAA6B,CAAC,KAC9B,kBAAC,GAAD;IACE,IAAI;KACF,IAAI;KACJ,KAAK;KACL,WAAW;KACZ;cALH,CAOE,kBAAC,GAAD,EAAiB,QAAQ,SAAW,CAAA,EACnC,GAAM,UAAU,IACf,kBAAC,KAAD,EAAA,UAAG,mCAAmC,CAAA,GAEtC,kBAAC,KAAD,EAAA,UAAG,+BAA+B,CAAA,CAE9B;;GAGT,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IACxB,CAAA;GAEJ"}
1
+ {"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../src/components/favorites/FavoritesPage.tsx"],"sourcesContent":["import NoSearchResults from '@/assets/icons/NoSearchResults'\nimport { useGetFavorites } from '@/synapse-queries/user/useFavorites'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n convertToEntityType,\n entityTypeToFriendlyName,\n} from '@/utils/functions/EntityTypeUtils'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { InputAdornment, Stack, TextField } from '@mui/material'\nimport { EntityHeader } from '@sage-bionetworks/synapse-types'\nimport {\n createColumnHelper,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { EntityTypeIcon } from '../EntityIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport FavoriteButton from './FavoriteButton'\n\n// Local types used for client-side sorting\nexport type SortField = 'name' | 'type'\nexport type SortDirection = 'ASC' | 'DESC'\nexport type Sort = {\n field: SortField\n direction: SortDirection\n}\n\nconst columnHelper = createColumnHelper<EntityHeader>()\n\nconst columns = [\n columnHelper.display({\n id: 'removeFavorite',\n cell: ctx => <FavoriteButton entityId={ctx.row.original.id} />,\n size: 60,\n enableResizing: false,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor('name', {\n cell: ctx => (\n <a\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.id}`}\n >\n {ctx.row.original.name}\n </a>\n ),\n enableGlobalFilter: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n size: 400,\n enableColumnFilter: false,\n sortingFn: 'alphanumeric',\n enableSorting: true,\n }),\n columnHelper.accessor('type', {\n cell: ctx => {\n const entityType = convertToEntityType(ctx.row.original.type)\n return (\n <>\n <EntityTypeIcon type={entityType} style={{ marginRight: '5px' }} />\n {entityTypeToFriendlyName(entityType)}\n </>\n )\n },\n header: props => <ColumnHeader {...props} title={'Type'} />,\n size: 160,\n enableGlobalFilter: false,\n sortingFn: 'alphanumeric',\n filterFn: 'arrIncludes',\n meta: {\n enableMultipleSelect: true,\n filterVariant: 'enumeration',\n getDisplayText: value =>\n entityTypeToFriendlyName(convertToEntityType(value)),\n },\n enableSorting: true,\n }),\n]\n\nexport default function FavoritesPage() {\n const { isAuthenticated } = useSynapseContext()\n const [searchText, setSearchText] = useState<string>('')\n const [error, setError] = useState<Error>()\n const { data, isLoading, isError, error: newError } = useGetFavorites()\n\n const favorites = useMemo(() => data ?? [], [data])\n\n const favoritesTable = useReactTable<EntityHeader>({\n data: favorites,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n globalFilterFn: 'includesString',\n state: {\n globalFilter: searchText,\n },\n columnResizeMode: 'onChange',\n })\n\n useEffect(() => {\n if (isError && newError) {\n setError(newError)\n }\n }, [isError, newError])\n\n useEffect(() => {\n if (!isAuthenticated) {\n setError(new Error('Please sign in to access your favorites.'))\n } else {\n setError(undefined)\n }\n }, [isAuthenticated])\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n const hasFavoritesMatchingQuery = favoritesTable.getRowModel().rows.length > 0\n\n return (\n <div className=\"FavoritesPage\">\n <TextField\n type=\"search\"\n placeholder=\"Favorite Name\"\n value={searchText}\n onChange={event => {\n setSearchText(event.target.value)\n }}\n fullWidth\n sx={{ mb: 4, maxWidth: '800px' }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <IconSvg icon=\"search\" wrap={false} />\n </InputAdornment>\n ),\n },\n }}\n />\n <StyledTanStackTable table={favoritesTable} fullWidth={false} />\n {!hasFavoritesMatchingQuery && !isLoading && (\n <Stack\n sx={{\n my: 2,\n gap: 1,\n textAlign: 'center',\n }}\n >\n <NoSearchResults height={'150px'} />\n {data?.length == 0 ? (\n <p>You currently have no favorites</p>\n ) : (\n <p>No matching favorites found</p>\n )}\n </Stack>\n )}\n\n {isLoading && (\n <div className=\"placeholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BasicFileHandleUpload.js","names":[],"sources":["../../../../src/components/file/upload/BasicFileHandleUpload.tsx"],"sourcesContent":["import MultiFileUploadProgress from '@/components/file/upload/MultiFileUploadProgress'\nimport UploadFilePanel from '@/components/file/upload/UploadFilePanel'\nimport {\n UploaderState,\n useUploadFiles,\n} from '@/utils/hooks/useUploadFileEntity/useUploadFiles'\nimport { noop } from 'lodash-es'\nimport { ForwardedRef, forwardRef, useEffect, useImperativeHandle } from 'react'\n\nexport type BasicFileHandleUploadProps = {\n /**\n * Whether to allow uploading multiple files.\n * Currently, only single file upload is supported by this UI component.\n */\n allowMultipleUpload: false\n /**\n * Whether to disable \"drag-and-drop to upload\" functionality.\n * Currently, drag-and-drop cannot be enabled.\n */\n disableDragAndDrop: true\n /** Callback that is invoked when the state of the uploader changes */\n onStateChange?: (state: UploaderState) => void\n /** Callback that is invoked when component is ready to upload */\n onUploadReady?: () => void\n /** Callback that is invoked when an individual upload is complete */\n onFileUploadComplete?: (fileHandleIds: string) => void\n}\n\nexport type FileUploadHandle = {\n /** Programmatically add files to the upload (e.g. on drag & drop) */\n handleUploads: (fileList: ArrayLike<File>) => void\n}\n\n/**\n * BasicFileHandleUpload is a component that supports uploading a file to the default Synapse S3 bucket and creating a\n * file handle, which can only be accessed the system itself and the user uploading the file.\n */\nexport const BasicFileHandleUpload = forwardRef(function FileHandleUpload(\n props: BasicFileHandleUploadProps,\n ref: ForwardedRef<FileUploadHandle>,\n) {\n const {\n allowMultipleUpload,\n onStateChange = noop,\n onUploadReady = noop,\n onFileUploadComplete = noop,\n } = props\n\n const { startUpload, state, uploadProgress } = useUploadFiles({\n onUploadComplete: (_, fileHandleId) => {\n onFileUploadComplete(fileHandleId)\n return Promise.resolve()\n },\n })\n\n useEffect(() => {\n onStateChange(state)\n }, [state, onStateChange])\n\n useEffect(() => {\n onUploadReady()\n }, [onUploadReady])\n\n function uploadFileList(fileList: ArrayLike<File>) {\n const args = Array.from(fileList).map(file => {\n return {\n file,\n }\n })\n startUpload(...args)\n }\n\n useImperativeHandle(ref, () => ({\n handleUploads: uploadFileList,\n }))\n\n return (\n <div>\n <UploadFilePanel\n onUploadFileList={uploadFileList}\n allowMultipleFiles={allowMultipleUpload}\n disableDragAndDrop={true}\n />\n <MultiFileUploadProgress\n uploaderState={state}\n uploadProgress={uploadProgress}\n />\n </div>\n )\n})\n"],"mappings":";;;;;;;AAqCA,IAAa,IAAwB,EAAW,SAC9C,GACA,GACA;CACA,IAAM,EACJ,wBACA,mBAAgB,GAChB,mBAAgB,GAChB,0BAAuB,MACrB,GAEE,EAAE,gBAAa,UAAO,sBAAmB,EAAe,EAC5D,mBAAmB,GAAG,OACpB,EAAqB,EAAa,EAC3B,QAAQ,SAAS,GAE3B,CAAC;AAMF,CAJA,QAAgB;AACd,IAAc,EAAM;IACnB,CAAC,GAAO,EAAc,CAAC,EAE1B,QAAgB;AACd,KAAe;IACd,CAAC,EAAc,CAAC;CAEnB,SAAS,EAAe,GAA2B;AAMjD,IAAY,GALC,MAAM,KAAK,EAAS,CAAC,KAAI,OAC7B,EACL,SACD,EACD,CACkB;;AAOtB,QAJA,EAAoB,UAAY,EAC9B,eAAe,GAChB,EAAE,EAGD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,kBAAkB;EAClB,oBAAoB;EACpB,oBAAoB;EACpB,CAAA,EACF,kBAAC,GAAD;EACE,eAAe;EACC;EAChB,CAAA,CACE,EAAA,CAAA;EAER"}
1
+ {"version":3,"file":"BasicFileHandleUpload.js","names":[],"sources":["../../../../src/components/file/upload/BasicFileHandleUpload.tsx"],"sourcesContent":["import MultiFileUploadProgress from '@/components/file/upload/MultiFileUploadProgress'\nimport UploadFilePanel from '@/components/file/upload/UploadFilePanel'\nimport {\n UploaderState,\n useUploadFiles,\n} from '@/utils/hooks/useUploadFileEntity/useUploadFiles'\nimport { noop } from 'lodash-es'\nimport { ForwardedRef, forwardRef, useEffect, useImperativeHandle } from 'react'\n\nexport type BasicFileHandleUploadProps = {\n /**\n * Whether to allow uploading multiple files.\n * Currently, only single file upload is supported by this UI component.\n */\n allowMultipleUpload: false\n /**\n * Whether to disable \"drag-and-drop to upload\" functionality.\n * Currently, drag-and-drop cannot be enabled.\n */\n disableDragAndDrop: true\n /** Callback that is invoked when the state of the uploader changes */\n onStateChange?: (state: UploaderState) => void\n /** Callback that is invoked when component is ready to upload */\n onUploadReady?: () => void\n /** Callback that is invoked when an individual upload is complete */\n onFileUploadComplete?: (fileHandleIds: string) => void\n}\n\nexport type FileUploadHandle = {\n /** Programmatically add files to the upload (e.g. on drag & drop) */\n handleUploads: (fileList: ArrayLike<File>) => void\n}\n\n/**\n * BasicFileHandleUpload is a component that supports uploading a file to the default Synapse S3 bucket and creating a\n * file handle, which can only be accessed the system itself and the user uploading the file.\n */\nexport const BasicFileHandleUpload = forwardRef(function FileHandleUpload(\n props: BasicFileHandleUploadProps,\n ref: ForwardedRef<FileUploadHandle>,\n) {\n const {\n allowMultipleUpload,\n onStateChange = noop,\n onUploadReady = noop,\n onFileUploadComplete = noop,\n } = props\n\n const { startUpload, state, uploadProgress } = useUploadFiles({\n onUploadComplete: (_, fileHandleId) => {\n onFileUploadComplete(fileHandleId)\n return Promise.resolve()\n },\n })\n\n useEffect(() => {\n onStateChange(state)\n }, [state, onStateChange])\n\n useEffect(() => {\n onUploadReady()\n }, [onUploadReady])\n\n function uploadFileList(fileList: ArrayLike<File>) {\n const args = Array.from(fileList).map(file => {\n return {\n file,\n }\n })\n startUpload(...args)\n }\n\n useImperativeHandle(ref, () => ({\n handleUploads: uploadFileList,\n }))\n\n return (\n <div>\n <UploadFilePanel\n onUploadFileList={uploadFileList}\n allowMultipleFiles={allowMultipleUpload}\n disableDragAndDrop={true}\n />\n <MultiFileUploadProgress\n uploaderState={state}\n uploadProgress={uploadProgress}\n />\n </div>\n )\n})\n"],"mappings":";;;;;;;AAqCA,IAAa,IAAwB,EAAW,SAC9C,GACA,GACA;CACA,IAAM,EACJ,wBACA,mBAAgB,GAChB,mBAAgB,GAChB,0BAAuB,MACrB,GAEE,EAAE,gBAAa,UAAO,sBAAmB,EAAe,EAC5D,mBAAmB,GAAG,OACpB,EAAqB,EAAa,EAC3B,QAAQ,SAAS,GAE3B,CAAC;AAMF,CAJA,QAAgB;AACd,IAAc,EAAM;IACnB,CAAC,GAAO,EAAc,CAAC,EAE1B,QAAgB;AACd,KAAe;IACd,CAAC,EAAc,CAAC;CAEnB,SAAS,EAAe,GAA2B;AAMjD,IAAY,GALC,MAAM,KAAK,EAAS,CAAC,KAAI,OAC7B,EACL,SACD,EAEY,CAAK;;AAOtB,QAJA,EAAoB,UAAY,EAC9B,eAAe,GAChB,EAAE,EAGD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,kBAAkB;EAClB,oBAAoB;EACpB,oBAAoB;EACpB,CAAA,EACF,kBAAC,GAAD;EACE,eAAe;EACC;EAChB,CAAA,CACE,EAAA,CAAA;EAER"}
@@ -0,0 +1,9 @@
1
+ export type SWCHeaderProps = {
2
+ title: React.ReactNode;
3
+ description?: React.ReactNode;
4
+ };
5
+ /**
6
+ * Header that uses CSS class names defined in SWC to match styling of SWC pages.
7
+ */
8
+ export default function SWCHeader(props: SWCHeaderProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=SWCHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SWCHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SWCHeader.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC9B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,cAAc,2CAQtD"}
@@ -0,0 +1,19 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/components/layout/SWCHeader.tsx
3
+ function n(n) {
4
+ let { title: r, description: i } = n;
5
+ return /* @__PURE__ */ t("div", {
6
+ className: "pageHeader",
7
+ children: [/* @__PURE__ */ e("h3", {
8
+ className: "pageHeaderTitle",
9
+ children: r
10
+ }), i && /* @__PURE__ */ e("div", {
11
+ className: "description",
12
+ children: i
13
+ })]
14
+ });
15
+ }
16
+ //#endregion
17
+ export { n as default };
18
+
19
+ //# sourceMappingURL=SWCHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SWCHeader.js","names":[],"sources":["../../../src/components/layout/SWCHeader.tsx"],"sourcesContent":["export type SWCHeaderProps = {\n title: React.ReactNode\n description?: React.ReactNode\n}\n\n/**\n * Header that uses CSS class names defined in SWC to match styling of SWC pages.\n */\nexport default function SWCHeader(props: SWCHeaderProps) {\n const { title, description } = props\n return (\n <div className={'pageHeader'}>\n <h3 className={'pageHeaderTitle'}>{title}</h3>\n {description && <div className=\"description\">{description}</div>}\n </div>\n )\n}\n"],"mappings":";;AAQA,SAAwB,EAAU,GAAuB;CACvD,IAAM,EAAE,UAAO,mBAAgB;AAC/B,QACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,MAAD;GAAI,WAAW;aAAoB;GAAW,CAAA,EAC7C,KAAe,kBAAC,OAAD;GAAK,WAAU;aAAe;GAAkB,CAAA,CAC5D"}
@@ -0,0 +1,9 @@
1
+ import { SWCHeaderProps } from './SWCHeader';
2
+ /**
3
+ * Page layout that uses CSS class names defined in SWC to match styling of SWC pages. This should not be used outside of SWC.
4
+ */
5
+ export default function SWCPageLayout(props: {
6
+ header: SWCHeaderProps;
7
+ children: React.ReactNode;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=SWCPageLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SWCPageLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SWCPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE;IAC3C,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,2CASA"}
@@ -0,0 +1,14 @@
1
+ import e from "./SWCHeader.js";
2
+ import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/components/layout/SWCPageLayout.tsx
4
+ function i(i) {
5
+ let { header: a, children: o } = i;
6
+ return /* @__PURE__ */ r(t, { children: [/* @__PURE__ */ n(e, { ...a }), /* @__PURE__ */ n("div", {
7
+ className: "pageLayout",
8
+ children: o
9
+ })] });
10
+ }
11
+ //#endregion
12
+ export { i as default };
13
+
14
+ //# sourceMappingURL=SWCPageLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SWCPageLayout.js","names":[],"sources":["../../../src/components/layout/SWCPageLayout.tsx"],"sourcesContent":["import SWCHeader, { SWCHeaderProps } from './SWCHeader'\n\n/**\n * Page layout that uses CSS class names defined in SWC to match styling of SWC pages. This should not be used outside of SWC.\n */\nexport default function SWCPageLayout(props: {\n header: SWCHeaderProps\n children: React.ReactNode\n}) {\n const { header, children } = props\n\n return (\n <>\n <SWCHeader {...header} />\n <div className=\"pageLayout\">{children}</div>\n </>\n )\n}\n"],"mappings":";;;AAKA,SAAwB,EAAc,GAGnC;CACD,IAAM,EAAE,WAAQ,gBAAa;AAE7B,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAW,GAAI,GAAU,CAAA,EACzB,kBAAC,OAAD;EAAK,WAAU;EAAc;EAAe,CAAA,CAC3C,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComplexMenu.js","names":[],"sources":["../../../src/components/menu/ComplexMenu.tsx"],"sourcesContent":["import { Box, Button, Typography, useMediaQuery, useTheme } from '@mui/material'\nimport { DropdownMenu, DropdownMenuProps } from './DropdownMenu'\nimport { IconSvgButton, IconSvgButtonProps } from '../IconSvgButton'\nimport IconSvg from '../IconSvg'\n\nexport type ComplexMenuProps = {\n /*\n * Configuration for IconButtons. Each entry corresponds to one button.\n * See the IconButtonConfiguration type for more info.\n */\n iconButtons?: IconSvgButtonProps[]\n /*\n * Configuration for DropdownMenus. Each entry corresponds to one dropdown menu button, which\n * itself can contain multiple groups of items.\n * See the DropdownMenuProps type for more info.\n */\n dropdownMenus?: DropdownMenuProps[]\n}\n\n/**\n * The ComplexMenu component allows you to create a generic menu with\n * icon buttons and multiple dropdown menus that contain groups of items.\n */\nexport function ComplexMenu(props: ComplexMenuProps) {\n const { iconButtons = [], dropdownMenus = [] } = props\n const theme = useTheme()\n const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'))\n\n return (\n <Box\n sx={theme => ({\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n paddingTop: '10px',\n },\n })}\n >\n {iconButtons.map(iconButton =>\n isSmallScreen && iconButton.tooltipText ? (\n <Box\n sx={{\n width: '100%',\n textAlign: 'center',\n }}\n >\n <Button\n variant=\"text\"\n startIcon={\n <IconSvg\n key={iconButton.tooltipText}\n icon={iconButton.icon}\n wrap={false}\n fontSize={'inherit'}\n />\n }\n onClick={iconButton.onClick}\n sx={{\n padding: '6px 12px',\n minWidth: 'unset',\n }}\n >\n <Typography variant=\"buttonLink\">\n {iconButton.tooltipText}\n </Typography>\n </Button>\n </Box>\n ) : (\n <IconSvgButton key={iconButton.tooltipText} {...iconButton} />\n ),\n )}\n {dropdownMenus.map(\n (menuProps, index) =>\n menuProps.items &&\n menuProps.items.length > 0 && (\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n width: '100%',\n '.MuiButton-root': { width: '100%' },\n },\n })}\n >\n <DropdownMenu key={index} {...menuProps} />\n </Box>\n ),\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,EAAY,GAAyB;CACnD,IAAM,EAAE,iBAAc,EAAE,EAAE,mBAAgB,EAAE,KAAK,GAE3C,IAAgB,EADR,GAAU,CACkB,YAAY,KAAK,KAAK,CAAC;AAEjE,QACE,kBAAC,GAAD;EACE,KAAI,OAAU;GACZ,SAAS;GACT,YAAY;GACZ,KAAK;IACJ,EAAM,YAAY,KAAK,KAAK,GAAG;IAC9B,eAAe;IACf,YAAY;IACb;GACF;YATH,CAWG,EAAY,KAAI,MACf,KAAiB,EAAW,cAC1B,kBAAC,GAAD;GACE,IAAI;IACF,OAAO;IACP,WAAW;IACZ;aAED,kBAAC,GAAD;IACE,SAAQ;IACR,WACE,kBAAC,GAAD;KAEE,MAAM,EAAW;KACjB,MAAM;KACN,UAAU;KACV,EAJK,EAAW,YAIhB;IAEJ,SAAS,EAAW;IACpB,IAAI;KACF,SAAS;KACT,UAAU;KACX;cAED,kBAAC,GAAD;KAAY,SAAQ;eACjB,EAAW;KACD,CAAA;IACN,CAAA;GACL,CAAA,GAEN,kBAAC,GAAD,EAA4C,GAAI,GAAc,EAA1C,EAAW,YAA+B,CAEjE,EACA,EAAc,KACZ,GAAW,MACV,EAAU,SACV,EAAU,MAAM,SAAS,KACvB,kBAAC,GAAD;GACE,KAAI,OAAU,GACX,EAAM,YAAY,KAAK,KAAK,GAAG;IAC9B,OAAO;IACP,mBAAmB,EAAE,OAAO,QAAQ;IACrC,EACF;aAED,kBAAC,GAAD,EAA0B,GAAI,GAAa,EAAxB,EAAwB;GACvC,CAAA,CAEX,CACG"}
1
+ {"version":3,"file":"ComplexMenu.js","names":[],"sources":["../../../src/components/menu/ComplexMenu.tsx"],"sourcesContent":["import { Box, Button, Typography, useMediaQuery, useTheme } from '@mui/material'\nimport { DropdownMenu, DropdownMenuProps } from './DropdownMenu'\nimport { IconSvgButton, IconSvgButtonProps } from '../IconSvgButton'\nimport IconSvg from '../IconSvg'\n\nexport type ComplexMenuProps = {\n /*\n * Configuration for IconButtons. Each entry corresponds to one button.\n * See the IconButtonConfiguration type for more info.\n */\n iconButtons?: IconSvgButtonProps[]\n /*\n * Configuration for DropdownMenus. Each entry corresponds to one dropdown menu button, which\n * itself can contain multiple groups of items.\n * See the DropdownMenuProps type for more info.\n */\n dropdownMenus?: DropdownMenuProps[]\n}\n\n/**\n * The ComplexMenu component allows you to create a generic menu with\n * icon buttons and multiple dropdown menus that contain groups of items.\n */\nexport function ComplexMenu(props: ComplexMenuProps) {\n const { iconButtons = [], dropdownMenus = [] } = props\n const theme = useTheme()\n const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'))\n\n return (\n <Box\n sx={theme => ({\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n paddingTop: '10px',\n },\n })}\n >\n {iconButtons.map(iconButton =>\n isSmallScreen && iconButton.tooltipText ? (\n <Box\n sx={{\n width: '100%',\n textAlign: 'center',\n }}\n >\n <Button\n variant=\"text\"\n startIcon={\n <IconSvg\n key={iconButton.tooltipText}\n icon={iconButton.icon}\n wrap={false}\n fontSize={'inherit'}\n />\n }\n onClick={iconButton.onClick}\n sx={{\n padding: '6px 12px',\n minWidth: 'unset',\n }}\n >\n <Typography variant=\"buttonLink\">\n {iconButton.tooltipText}\n </Typography>\n </Button>\n </Box>\n ) : (\n <IconSvgButton key={iconButton.tooltipText} {...iconButton} />\n ),\n )}\n {dropdownMenus.map(\n (menuProps, index) =>\n menuProps.items &&\n menuProps.items.length > 0 && (\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n width: '100%',\n '.MuiButton-root': { width: '100%' },\n },\n })}\n >\n <DropdownMenu key={index} {...menuProps} />\n </Box>\n ),\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,EAAY,GAAyB;CACnD,IAAM,EAAE,iBAAc,EAAE,EAAE,mBAAgB,EAAE,KAAK,GAE3C,IAAgB,EADR,GACsB,CAAM,YAAY,KAAK,KAAK,CAAC;AAEjE,QACE,kBAAC,GAAD;EACE,KAAI,OAAU;GACZ,SAAS;GACT,YAAY;GACZ,KAAK;IACJ,EAAM,YAAY,KAAK,KAAK,GAAG;IAC9B,eAAe;IACf,YAAY;IACb;GACF;YATH,CAWG,EAAY,KAAI,MACf,KAAiB,EAAW,cAC1B,kBAAC,GAAD;GACE,IAAI;IACF,OAAO;IACP,WAAW;IACZ;aAED,kBAAC,GAAD;IACE,SAAQ;IACR,WACE,kBAAC,GAAD;KAEE,MAAM,EAAW;KACjB,MAAM;KACN,UAAU;KACV,EAJK,EAAW,YAIhB;IAEJ,SAAS,EAAW;IACpB,IAAI;KACF,SAAS;KACT,UAAU;KACX;cAED,kBAAC,GAAD;KAAY,SAAQ;eACjB,EAAW;KACD,CAAA;IACN,CAAA;GACL,CAAA,GAEN,kBAAC,GAAD,EAA4C,GAAI,GAAc,EAA1C,EAAW,YAA+B,CAEjE,EACA,EAAc,KACZ,GAAW,MACV,EAAU,SACV,EAAU,MAAM,SAAS,KACvB,kBAAC,GAAD;GACE,KAAI,OAAU,GACX,EAAM,YAAY,KAAK,KAAK,GAAG;IAC9B,OAAO;IACP,mBAAmB,EAAE,OAAO,QAAQ;IACrC,EACF;aAED,kBAAC,GAAD,EAA0B,GAAI,GAAa,EAAxB,EAAwB;GACvC,CAAA,CAEX,CACG"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChipContainer.js","names":[],"sources":["../../../../src/components/row_renderers/utils/ChipContainer.tsx"],"sourcesContent":["import React from 'react'\ntype ChipContainerProps = {\n chips: any[]\n}\n\nconst ChipContainer = ({ chips }: ChipContainerProps): React.ReactNode => {\n const chipsFormatted = chips.map((el, index) => {\n if (!el) {\n return false\n }\n return <span key={index}> {el}</span>\n })\n return <>{chipsFormatted}</>\n}\nexport default ChipContainer\n"],"mappings":";;;AAKA,IAAM,KAAiB,EAAE,eAOhB,kBAAA,GAAA,EAAA,UANgB,EAAM,KAAK,GAAI,MAC/B,IAGE,kBAAC,QAAD,EAAA,UAAA,CAAkB,KAAE,EAAU,EAAA,EAAnB,EAAmB,GAF5B,GAGT,EAC0B,CAAA"}
1
+ {"version":3,"file":"ChipContainer.js","names":[],"sources":["../../../../src/components/row_renderers/utils/ChipContainer.tsx"],"sourcesContent":["import React from 'react'\ntype ChipContainerProps = {\n chips: any[]\n}\n\nconst ChipContainer = ({ chips }: ChipContainerProps): React.ReactNode => {\n const chipsFormatted = chips.map((el, index) => {\n if (!el) {\n return false\n }\n return <span key={index}> {el}</span>\n })\n return <>{chipsFormatted}</>\n}\nexport default ChipContainer\n"],"mappings":";;;AAKA,IAAM,KAAiB,EAAE,eAOhB,kBAAA,GAAA,EAAA,UANgB,EAAM,KAAK,GAAI,MAC/B,IAGE,kBAAC,QAAD,EAAA,UAAA,CAAkB,KAAE,EAAU,EAAA,EAAnB,EAAmB,GAF5B,GAID,EAAkB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"StyledPopover.js","names":[],"sources":["../../../src/components/styled/StyledPopover.tsx"],"sourcesContent":["import LightTooltip from '@/components/styled/LightTooltip'\nimport { spreadSx } from '@/theme/spreadSx'\nimport {\n Box,\n Button,\n ButtonProps,\n SxProps,\n tooltipClasses,\n TooltipProps,\n} from '@mui/material'\nimport { atom, useAtom } from 'jotai'\nimport { PropsWithChildren, ReactNode, useId } from 'react'\n\nexport type StyledPopoverProps = PropsWithChildren<{\n popoverContent: React.ReactNode\n sx?: TooltipProps['sx']\n placement?: TooltipProps['placement']\n showCloseButton?: boolean\n actionButton?: {\n content: ReactNode\n color?: ButtonProps['color']\n variant?: ButtonProps['variant']\n onClick: () => void\n closePopoverOnClick?: boolean\n }\n maxWidth?: string\n minWidth?: string\n containerSx?: SxProps\n}>\n\nconst buttonBoxSx: SxProps = {\n mt: 2,\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'row-reverse',\n '> button': {\n flexGrow: 1,\n maxWidth: '45%',\n },\n}\n\n// Register a global atom to track which popover is open, to ensure only one is shown at any given time\nconst openMarkdownPopoverAtom = atom<string | null>(null)\n\nexport function StyledPopover({\n children,\n popoverContent,\n placement = 'bottom-start',\n showCloseButton = true,\n actionButton,\n sx,\n maxWidth = '500px',\n minWidth = '300px',\n containerSx,\n}: StyledPopoverProps) {\n const id = useId()\n const [openMarkdownPopoverId, setOpenMarkdownPopoverId] = useAtom(\n openMarkdownPopoverAtom,\n )\n\n const show = openMarkdownPopoverId === id\n\n const content = (\n <Box sx={{ padding: '20px' }}>\n {popoverContent}\n <Box sx={buttonBoxSx}>\n {actionButton && (\n <Button\n color={actionButton.color || 'primary'}\n variant={actionButton.variant || 'contained'}\n onClick={() => {\n actionButton.onClick()\n if (actionButton.closePopoverOnClick) {\n setOpenMarkdownPopoverId(null)\n }\n }}\n >\n {actionButton.content}\n </Button>\n )}\n {showCloseButton && (\n <Button\n variant=\"outlined\"\n onClick={() => setOpenMarkdownPopoverId(null)}\n >\n Close\n </Button>\n )}\n </Box>\n </Box>\n )\n\n return (\n <LightTooltip\n title={content}\n placement={placement}\n open={show}\n sx={spreadSx(sx, {\n [`& .${tooltipClasses.tooltip}`]: {\n maxWidth: { maxWidth },\n minWidth: { minWidth },\n },\n })}\n >\n <Box\n role=\"button\"\n className={'PopoverContainer'}\n onClick={e => {\n // Prevent the default action of the click event -- for example, if this is in a `label` tag for a checkbox,\n // prevent the click from toggling the checkbox value\n e.preventDefault()\n // Prevent the click from propagating to the parent container\n e.stopPropagation()\n setOpenMarkdownPopoverId(currentId => (currentId == id ? null : id))\n }}\n sx={{ display: 'inline-block', cursor: 'pointer', ...containerSx }}\n >\n {children}\n </Box>\n </LightTooltip>\n )\n}\n"],"mappings":";;;;;;;AA8BA,IAAM,IAAuB;CAC3B,IAAI;CACJ,SAAS;CACT,gBAAgB;CAChB,eAAe;CACf,YAAY;EACV,UAAU;EACV,UAAU;EACX;CACF,EAGK,IAA0B,EAAoB,KAAK;AAEzD,SAAgB,EAAc,EAC5B,aACA,mBACA,eAAY,gBACZ,qBAAkB,IAClB,iBACA,OACA,cAAW,SACX,cAAW,SACX,kBACqB;CACrB,IAAM,IAAK,GAAO,EACZ,CAAC,GAAuB,KAA4B,EACxD,EACD,EAEK,IAAO,MAA0B;AAgCvC,QACE,kBAAC,GAAD;EACE,OA/BF,kBAAC,GAAD;GAAK,IAAI,EAAE,SAAS,QAAQ;aAA5B,CACG,GACD,kBAAC,GAAD;IAAK,IAAI;cAAT,CACG,KACC,kBAAC,GAAD;KACE,OAAO,EAAa,SAAS;KAC7B,SAAS,EAAa,WAAW;KACjC,eAAe;AAEb,MADA,EAAa,SAAS,EAClB,EAAa,uBACf,EAAyB,KAAK;;eAIjC,EAAa;KACP,CAAA,EAEV,KACC,kBAAC,GAAD;KACE,SAAQ;KACR,eAAe,EAAyB,KAAK;eAC9C;KAEQ,CAAA,CAEP;MACF;;EAMO;EACX,MAAM;EACN,IAAI,EAAS,GAAI,GACd,MAAM,EAAe,YAAY;GAChC,UAAU,EAAE,aAAU;GACtB,UAAU,EAAE,aAAU;GACvB,EACF,CAAC;YAEF,kBAAC,GAAD;GACE,MAAK;GACL,WAAW;GACX,UAAS,MAAK;AAMZ,IAHA,EAAE,gBAAgB,EAElB,EAAE,iBAAiB,EACnB,GAAyB,MAAc,KAAa,IAAK,OAAO,EAAI;;GAEtE,IAAI;IAAE,SAAS;IAAgB,QAAQ;IAAW,GAAG;IAAa;GAEjE;GACG,CAAA;EACO,CAAA"}
1
+ {"version":3,"file":"StyledPopover.js","names":[],"sources":["../../../src/components/styled/StyledPopover.tsx"],"sourcesContent":["import LightTooltip from '@/components/styled/LightTooltip'\nimport { spreadSx } from '@/theme/spreadSx'\nimport {\n Box,\n Button,\n ButtonProps,\n SxProps,\n tooltipClasses,\n TooltipProps,\n} from '@mui/material'\nimport { atom, useAtom } from 'jotai'\nimport { PropsWithChildren, ReactNode, useId } from 'react'\n\nexport type StyledPopoverProps = PropsWithChildren<{\n popoverContent: React.ReactNode\n sx?: TooltipProps['sx']\n placement?: TooltipProps['placement']\n showCloseButton?: boolean\n actionButton?: {\n content: ReactNode\n color?: ButtonProps['color']\n variant?: ButtonProps['variant']\n onClick: () => void\n closePopoverOnClick?: boolean\n }\n maxWidth?: string\n minWidth?: string\n containerSx?: SxProps\n}>\n\nconst buttonBoxSx: SxProps = {\n mt: 2,\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'row-reverse',\n '> button': {\n flexGrow: 1,\n maxWidth: '45%',\n },\n}\n\n// Register a global atom to track which popover is open, to ensure only one is shown at any given time\nconst openMarkdownPopoverAtom = atom<string | null>(null)\n\nexport function StyledPopover({\n children,\n popoverContent,\n placement = 'bottom-start',\n showCloseButton = true,\n actionButton,\n sx,\n maxWidth = '500px',\n minWidth = '300px',\n containerSx,\n}: StyledPopoverProps) {\n const id = useId()\n const [openMarkdownPopoverId, setOpenMarkdownPopoverId] = useAtom(\n openMarkdownPopoverAtom,\n )\n\n const show = openMarkdownPopoverId === id\n\n const content = (\n <Box sx={{ padding: '20px' }}>\n {popoverContent}\n <Box sx={buttonBoxSx}>\n {actionButton && (\n <Button\n color={actionButton.color || 'primary'}\n variant={actionButton.variant || 'contained'}\n onClick={() => {\n actionButton.onClick()\n if (actionButton.closePopoverOnClick) {\n setOpenMarkdownPopoverId(null)\n }\n }}\n >\n {actionButton.content}\n </Button>\n )}\n {showCloseButton && (\n <Button\n variant=\"outlined\"\n onClick={() => setOpenMarkdownPopoverId(null)}\n >\n Close\n </Button>\n )}\n </Box>\n </Box>\n )\n\n return (\n <LightTooltip\n title={content}\n placement={placement}\n open={show}\n sx={spreadSx(sx, {\n [`& .${tooltipClasses.tooltip}`]: {\n maxWidth: { maxWidth },\n minWidth: { minWidth },\n },\n })}\n >\n <Box\n role=\"button\"\n className={'PopoverContainer'}\n onClick={e => {\n // Prevent the default action of the click event -- for example, if this is in a `label` tag for a checkbox,\n // prevent the click from toggling the checkbox value\n e.preventDefault()\n // Prevent the click from propagating to the parent container\n e.stopPropagation()\n setOpenMarkdownPopoverId(currentId => (currentId == id ? null : id))\n }}\n sx={{ display: 'inline-block', cursor: 'pointer', ...containerSx }}\n >\n {children}\n </Box>\n </LightTooltip>\n )\n}\n"],"mappings":";;;;;;;AA8BA,IAAM,IAAuB;CAC3B,IAAI;CACJ,SAAS;CACT,gBAAgB;CAChB,eAAe;CACf,YAAY;EACV,UAAU;EACV,UAAU;EACX;CACF,EAGK,IAA0B,EAAoB,KAAK;AAEzD,SAAgB,EAAc,EAC5B,aACA,mBACA,eAAY,gBACZ,qBAAkB,IAClB,iBACA,OACA,cAAW,SACX,cAAW,SACX,kBACqB;CACrB,IAAM,IAAK,GAAO,EACZ,CAAC,GAAuB,KAA4B,EACxD,EACD,EAEK,IAAO,MAA0B;AAgCvC,QACE,kBAAC,GAAD;EACE,OA/BF,kBAAC,GAAD;GAAK,IAAI,EAAE,SAAS,QAAQ;aAA5B,CACG,GACD,kBAAC,GAAD;IAAK,IAAI;cAAT,CACG,KACC,kBAAC,GAAD;KACE,OAAO,EAAa,SAAS;KAC7B,SAAS,EAAa,WAAW;KACjC,eAAe;AAEb,MADA,EAAa,SAAS,EAClB,EAAa,uBACf,EAAyB,KAAK;;eAIjC,EAAa;KACP,CAAA,EAEV,KACC,kBAAC,GAAD;KACE,SAAQ;KACR,eAAe,EAAyB,KAAK;eAC9C;KAEQ,CAAA,CAEP;MACF;IAKG;EACI;EACX,MAAM;EACN,IAAI,EAAS,GAAI,GACd,MAAM,EAAe,YAAY;GAChC,UAAU,EAAE,aAAU;GACtB,UAAU,EAAE,aAAU;GACvB,EACF,CAAC;YAEF,kBAAC,GAAD;GACE,MAAK;GACL,WAAW;GACX,UAAS,MAAK;AAMZ,IAHA,EAAE,gBAAgB,EAElB,EAAE,iBAAiB,EACnB,GAAyB,MAAc,KAAa,IAAK,OAAO,EAAI;;GAEtE,IAAI;IAAE,SAAS;IAAgB,QAAQ;IAAW,GAAG;IAAa;GAEjE;GACG,CAAA;EACO,CAAA"}
@@ -40,7 +40,8 @@ function h(e) {
40
40
  id: `column-${r}`,
41
41
  header: (t) => /* @__PURE__ */ s(n, {
42
42
  ...t,
43
- title: `${e.name} (${e.columnType})`
43
+ wrap: !0,
44
+ title: `${e.name}\n(${e.columnType})`
44
45
  }),
45
46
  enableColumnFilter: !1,
46
47
  enableSorting: !1
@@ -1 +1 @@
1
- {"version":3,"file":"CsvPreview.js","names":[],"sources":["../../../../src/components/table/CsvPreview/CsvPreview.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useGetCsvPreview } from '@/synapse-queries/table/useGetCsvPreview'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n TableRow,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport noop from 'lodash-es/noop'\nimport { useEffect, useMemo } from 'react'\n\nexport type CsvPreviewProps = {\n fileHandleId: string\n csvTableDescriptor: CsvTableDescriptor\n onCsvPreviewDataChange?: (data: UploadToTablePreviewResult) => void\n onIsLoadingChange?: (isLoading: boolean) => void\n}\n\n/**\n * Given a file handle ID and CSV Table Descriptor, fetches and displays a preview of the CSV file as it would be parsed into a table.\n */\nexport default function CsvPreview(props: CsvPreviewProps) {\n const {\n fileHandleId,\n csvTableDescriptor,\n onCsvPreviewDataChange = noop,\n onIsLoadingChange = noop,\n } = props\n\n const {\n data: csvPreviewData,\n isLoading,\n error,\n } = useGetCsvPreview({\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTablePreviewRequest',\n uploadFileHandleId: fileHandleId,\n csvTableDescriptor,\n })\n\n useEffect(() => {\n if (csvPreviewData) {\n onCsvPreviewDataChange(csvPreviewData)\n }\n }, [csvPreviewData, onCsvPreviewDataChange])\n\n useEffect(() => {\n onIsLoadingChange(isLoading)\n }, [isLoading, onIsLoadingChange])\n\n const tableData = useMemo(\n () => csvPreviewData?.sampleRows ?? [],\n [csvPreviewData?.sampleRows],\n )\n\n const columns = useMemo(\n () => getPreviewColumns(csvPreviewData?.suggestedColumns ?? []),\n [csvPreviewData?.suggestedColumns],\n )\n\n const table = useReactTable({\n getCoreRowModel: getCoreRowModel(),\n data: tableData,\n columns: columns,\n })\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n {isLoading && <div>Loading preview...</div>}\n {!isLoading && csvPreviewData && table && (\n <>\n <Typography variant={'body1'}>\n Scanned {csvPreviewData?.rowsScanned?.toLocaleString()} rows to\n generate preview:\n </Typography>\n <StyledTanStackTable table={table} />\n </>\n )}\n </>\n )\n}\n\nfunction getPreviewColumns(columnModels: ColumnModel[]) {\n const columnHelper = createColumnHelper<TableRow>()\n return columnModels.map((columnModel, index) => {\n return columnHelper.accessor(tr => tr.values![index], {\n id: `column-${index}`,\n header: props => (\n <ColumnHeader\n {...props}\n title={`${columnModel.name} (${columnModel.columnType})`}\n />\n ),\n enableColumnFilter: false,\n enableSorting: false,\n })\n })\n}\n"],"mappings":";;;;;;;;;;;AA6BA,SAAwB,EAAW,GAAwB;CACzD,IAAM,EACJ,iBACA,uBACA,4BAAyB,GACzB,uBAAoB,MAClB,GAEE,EACJ,MAAM,GACN,cACA,aACE,EAAiB;EACnB,cACE;EACF,oBAAoB;EACpB;EACD,CAAC;AAQF,CANA,QAAgB;AACd,EAAI,KACF,EAAuB,EAAe;IAEvC,CAAC,GAAgB,EAAuB,CAAC,EAE5C,QAAgB;AACd,IAAkB,EAAU;IAC3B,CAAC,GAAW,EAAkB,CAAC;CAElC,IAAM,IAAY,QACV,GAAgB,cAAc,EAAE,EACtC,CAAC,GAAgB,WAAW,CAC7B,EAEK,IAAU,QACR,EAAkB,GAAgB,oBAAoB,EAAE,CAAC,EAC/D,CAAC,GAAgB,iBAAiB,CACnC,EAEK,IAAQ,EAAc;EAC1B,iBAAiB,GAAiB;EAClC,MAAM;EACG;EACV,CAAC;AAMF,QAJI,IACK,kBAAC,GAAD,EAAoB,UAAS,CAAA,GAIpC,kBAAA,GAAA,EAAA,UAAA,CACG,KAAa,kBAAC,OAAD,EAAA,UAAK,sBAAwB,CAAA,EAC1C,CAAC,KAAa,KAAkB,KAC/B,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAY,SAAS;YAArB;GAA8B;GACnB,GAAgB,aAAa,gBAAgB;GAAC;GAE5C;KACb,kBAAC,GAAD,EAA4B,UAAS,CAAA,CACpC,EAAA,CAAA,CAEJ,EAAA,CAAA;;AAIP,SAAS,EAAkB,GAA6B;CACtD,IAAM,IAAe,GAA8B;AACnD,QAAO,EAAa,KAAK,GAAa,MAC7B,EAAa,UAAS,MAAM,EAAG,OAAQ,IAAQ;EACpD,IAAI,UAAU;EACd,SAAQ,MACN,kBAAC,GAAD;GACE,GAAI;GACJ,OAAO,GAAG,EAAY,KAAK,IAAI,EAAY,WAAW;GACtD,CAAA;EAEJ,oBAAoB;EACpB,eAAe;EAChB,CAAC,CACF"}
1
+ {"version":3,"file":"CsvPreview.js","names":[],"sources":["../../../../src/components/table/CsvPreview/CsvPreview.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useGetCsvPreview } from '@/synapse-queries/table/useGetCsvPreview'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n TableRow,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport noop from 'lodash-es/noop'\nimport { useEffect, useMemo } from 'react'\n\nexport type CsvPreviewProps = {\n fileHandleId: string\n csvTableDescriptor: CsvTableDescriptor\n onCsvPreviewDataChange?: (data: UploadToTablePreviewResult) => void\n onIsLoadingChange?: (isLoading: boolean) => void\n}\n\n/**\n * Given a file handle ID and CSV Table Descriptor, fetches and displays a preview of the CSV file as it would be parsed into a table.\n */\nexport default function CsvPreview(props: CsvPreviewProps) {\n const {\n fileHandleId,\n csvTableDescriptor,\n onCsvPreviewDataChange = noop,\n onIsLoadingChange = noop,\n } = props\n\n const {\n data: csvPreviewData,\n isLoading,\n error,\n } = useGetCsvPreview({\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTablePreviewRequest',\n uploadFileHandleId: fileHandleId,\n csvTableDescriptor,\n })\n\n useEffect(() => {\n if (csvPreviewData) {\n onCsvPreviewDataChange(csvPreviewData)\n }\n }, [csvPreviewData, onCsvPreviewDataChange])\n\n useEffect(() => {\n onIsLoadingChange(isLoading)\n }, [isLoading, onIsLoadingChange])\n\n const tableData = useMemo(\n () => csvPreviewData?.sampleRows ?? [],\n [csvPreviewData?.sampleRows],\n )\n\n const columns = useMemo(\n () => getPreviewColumns(csvPreviewData?.suggestedColumns ?? []),\n [csvPreviewData?.suggestedColumns],\n )\n\n const table = useReactTable({\n getCoreRowModel: getCoreRowModel(),\n data: tableData,\n columns: columns,\n })\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n {isLoading && <div>Loading preview...</div>}\n {!isLoading && csvPreviewData && table && (\n <>\n <Typography variant={'body1'}>\n Scanned {csvPreviewData?.rowsScanned?.toLocaleString()} rows to\n generate preview:\n </Typography>\n <StyledTanStackTable table={table} />\n </>\n )}\n </>\n )\n}\n\nfunction getPreviewColumns(columnModels: ColumnModel[]) {\n const columnHelper = createColumnHelper<TableRow>()\n return columnModels.map((columnModel, index) => {\n return columnHelper.accessor(tr => tr.values![index], {\n id: `column-${index}`,\n header: props => (\n <ColumnHeader\n {...props}\n wrap={true}\n title={`${columnModel.name}\\n(${columnModel.columnType})`}\n />\n ),\n enableColumnFilter: false,\n enableSorting: false,\n })\n })\n}\n"],"mappings":";;;;;;;;;;;AA6BA,SAAwB,EAAW,GAAwB;CACzD,IAAM,EACJ,iBACA,uBACA,4BAAyB,GACzB,uBAAoB,MAClB,GAEE,EACJ,MAAM,GACN,cACA,aACE,EAAiB;EACnB,cACE;EACF,oBAAoB;EACpB;EACD,CAAC;AAQF,CANA,QAAgB;AACd,EAAI,KACF,EAAuB,EAAe;IAEvC,CAAC,GAAgB,EAAuB,CAAC,EAE5C,QAAgB;AACd,IAAkB,EAAU;IAC3B,CAAC,GAAW,EAAkB,CAAC;CAElC,IAAM,IAAY,QACV,GAAgB,cAAc,EAAE,EACtC,CAAC,GAAgB,WAAW,CAC7B,EAEK,IAAU,QACR,EAAkB,GAAgB,oBAAoB,EAAE,CAAC,EAC/D,CAAC,GAAgB,iBAAiB,CACnC,EAEK,IAAQ,EAAc;EAC1B,iBAAiB,GAAiB;EAClC,MAAM;EACG;EACV,CAAC;AAMF,QAJI,IACK,kBAAC,GAAD,EAAoB,UAAS,CAAA,GAIpC,kBAAA,GAAA,EAAA,UAAA,CACG,KAAa,kBAAC,OAAD,EAAA,UAAK,sBAAwB,CAAA,EAC1C,CAAC,KAAa,KAAkB,KAC/B,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAY,SAAS;YAArB;GAA8B;GACnB,GAAgB,aAAa,gBAAgB;GAAC;GAE5C;KACb,kBAAC,GAAD,EAA4B,UAAS,CAAA,CACpC,EAAA,CAAA,CAEJ,EAAA,CAAA;;AAIP,SAAS,EAAkB,GAA6B;CACtD,IAAM,IAAe,GAA8B;AACnD,QAAO,EAAa,KAAK,GAAa,MAC7B,EAAa,UAAS,MAAM,EAAG,OAAQ,IAAQ;EACpD,IAAI,UAAU;EACd,SAAQ,MACN,kBAAC,GAAD;GACE,GAAI;GACJ,MAAM;GACN,OAAO,GAAG,EAAY,KAAK,KAAK,EAAY,WAAW;GACvD,CAAA;EAEJ,oBAAoB;EACpB,eAAe;EAChB,CAAC,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"CsvPreviewDialog.js","names":[],"sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyBA,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,EAAA,aAAA,KAAA,cACA,EAAA,EAAA,iBAAA,KAAA;EAFG,KAAA,EAAA,CAGJ;AAsBD,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,SAAM,YAAS,cAAW,qBAAkB,oBAAiB,GAC/D,CAAC,GAAM,KAAW,EAAS,EAAqB,WAAW,EAC3D,CAAC,GAAoB,KACzB,EAA6B;EAC3B,WAAW;EACX,gBAAgB;EAChB,iBAAiB;EACjB,SAAS;EACT,mBAAmB;EACpB,CAAC,EACE,CAAC,GAAgB,KACrB,EAA4C,KAAK,EAC7C,CAAC,GAAkB,KAAuB,EAAS,GAAM,EAEzD,CAAC,GAAsB,KAA2B,EAEtD,KAAK,EAED,IAAiB,GAAa,MAAyB;AAE3D,EADA,EAAwB,EAAa,EACrC,EAAQ,EAAqB,eAAe;IAC3C,EAAE,CAAC,EAEA,IAAY,EAAgC,KAAK,EACjD,IAAuB,EAA4C,KAAK,EAExE,IACJ,kBAAC,GAAD;EACE,KAAK;EACL,qBAAqB;EACrB,uBAAsB,MAAgB;AACpC,KAAe,EAAa;;EAE9B,oBAAoB;EACpB,CAAA,EAGE,IACJ,kBAAC,GAAD;EAAO,SAAS;YAAhB,CACG,KACC,kBAAC,GAAD;GACE,cAAc;GACM;GACpB,wBAAwB;GACxB,mBAAmB;GACnB,CAAA,EAEJ,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GAAkB,YAAY,kBAAC,GAAD,EAAkB,CAAA;aAC9C,kBAAC,GAAD;IAAY,SAAS;cAAa;IAAyB,CAAA;GAC1C,CAAA,EACnB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,cAAc;GACd,KAAK;GACL,CAAA,EACF,kBAAC,GAAD;GACE,SAAS;GACT,WAAW,kBAAC,GAAD,EAAkB,CAAA;GAC7B,IAAI,EAAE,IAAI,GAAG;GACb,eAAe;AAEb,IAAI,EAAqB,WACvB,EACE,EAAqB,QAAQ,aAAa,CAC3C;;aAGN;GAEQ,CAAA,CACQ,EAAA,CAAA,CACT,EAAA,CAAA,CACN;;AAGV,QACE,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;EACP,UAAU;EACJ;EACN,SACE,kBAAA,GAAA,EAAA,UAAA;GACG,MAAS,EAAqB,cAAc;GAC5C,MAAS,EAAqB,kBAAkB;GAChD,KAAgB,kBAAC,GAAD,EAAa,OAAO,GAAgB,CAAA;GACpD,EAAA,CAAA;EAEL,SACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,SAAS;GACT,UAAU;GACV,eAAe;AACb,OAAS;;aAEZ;GAEQ,CAAA,EACR,MAAS,EAAqB,kBAC7B,kBAAC,GAAD;GACE,UAAU;GACV,SAAS;GACT,eAAe;AACb,MACE,GACA,EAAgB,kBAChB,EACD;;GAEH,SAAS;aACV;GAEQ,CAAA,CAEV,EAAA,CAAA;EAEL,CAAA"}
1
+ {"version":3,"file":"CsvPreviewDialog.js","names":[],"sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyBA,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,EAAA,aAAa,KAAA,cACb,EAAA,EAAA,iBAAiB,KAAA;EAFd,KAAA,EAAA,CAGJ;AAsBD,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,SAAM,YAAS,cAAW,qBAAkB,oBAAiB,GAC/D,CAAC,GAAM,KAAW,EAAS,EAAqB,WAAW,EAC3D,CAAC,GAAoB,KACzB,EAA6B;EAC3B,WAAW;EACX,gBAAgB;EAChB,iBAAiB;EACjB,SAAS;EACT,mBAAmB;EACpB,CAAC,EACE,CAAC,GAAgB,KACrB,EAA4C,KAAK,EAC7C,CAAC,GAAkB,KAAuB,EAAS,GAAM,EAEzD,CAAC,GAAsB,KAA2B,EAEtD,KAAK,EAED,IAAiB,GAAa,MAAyB;AAE3D,EADA,EAAwB,EAAa,EACrC,EAAQ,EAAqB,eAAe;IAC3C,EAAE,CAAC,EAEA,IAAY,EAAgC,KAAK,EACjD,IAAuB,EAA4C,KAAK,EAExE,IACJ,kBAAC,GAAD;EACE,KAAK;EACL,qBAAqB;EACrB,uBAAsB,MAAgB;AACpC,KAAe,EAAa;;EAE9B,oBAAoB;EACpB,CAAA,EAGE,IACJ,kBAAC,GAAD;EAAO,SAAS;YAAhB,CACG,KACC,kBAAC,GAAD;GACE,cAAc;GACM;GACpB,wBAAwB;GACxB,mBAAmB;GACnB,CAAA,EAEJ,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GAAkB,YAAY,kBAAC,GAAD,EAAkB,CAAA;aAC9C,kBAAC,GAAD;IAAY,SAAS;cAAa;IAAyB,CAAA;GAC1C,CAAA,EACnB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,cAAc;GACd,KAAK;GACL,CAAA,EACF,kBAAC,GAAD;GACE,SAAS;GACT,WAAW,kBAAC,GAAD,EAAkB,CAAA;GAC7B,IAAI,EAAE,IAAI,GAAG;GACb,eAAe;AAEb,IAAI,EAAqB,WACvB,EACE,EAAqB,QAAQ,aAAa,CAC3C;;aAGN;GAEQ,CAAA,CACQ,EAAA,CAAA,CACT,EAAA,CAAA,CACN;;AAGV,QACE,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;EACP,UAAU;EACJ;EACN,SACE,kBAAA,GAAA,EAAA,UAAA;GACG,MAAS,EAAqB,cAAc;GAC5C,MAAS,EAAqB,kBAAkB;GAChD,KAAgB,kBAAC,GAAD,EAAa,OAAO,GAAgB,CAAA;GACpD,EAAA,CAAA;EAEL,SACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GACE,SAAS;GACT,UAAU;GACV,eAAe;AACb,OAAS;;aAEZ;GAEQ,CAAA,EACR,MAAS,EAAqB,kBAC7B,kBAAC,GAAD;GACE,UAAU;GACV,SAAS;GACT,eAAe;AACb,MACE,GACA,EAAgB,kBAChB,EACD;;GAEH,SAAS;aACV;GAEQ,CAAA,CAEV,EAAA,CAAA;EAEL,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TrashCanList.js","names":[],"sources":["../../../src/components/trash/TrashCanList.tsx"],"sourcesContent":["import {\n useGetItemsInTrashCanInfinite,\n usePurgeEntities,\n useRestoreEntities,\n} from '@/synapse-queries/trash/useTrashCan'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport { Alert, Box, Button, Typography } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { TrashedEntity } from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n RowSelectionState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport {\n CheckBoxCell,\n CheckBoxHeader,\n} from '../EntityHeaderTable/EntityHeaderTableCellRenderers'\nimport { EntityLink } from '../EntityLink'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\n\n/**\n * Convert an array of Promise results to an array of errors\n */\nfunction toSynapseClientErrorList(\n results: PromiseSettledResult<void>[],\n): SynapseClientError[] {\n return results\n .filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected',\n )\n .map(result => result.reason as SynapseClientError)\n}\n\nconst columnHelper = createColumnHelper<TrashedEntity>()\n\nfunction getTrashCanColumns(\n onRestore: (entityId: string) => void,\n): ColumnDef<TrashedEntity, any>[] {\n return [\n {\n id: 'select',\n header: CheckBoxHeader,\n cell: CheckBoxCell,\n maxSize: 50,\n },\n columnHelper.accessor('entityId', {\n header: 'ID',\n }),\n columnHelper.accessor('entityName', {\n header: 'Name',\n }),\n columnHelper.accessor('entityType', {\n header: 'Entity Type',\n cell: info => entityTypeToFriendlyName(info.getValue()),\n }),\n columnHelper.accessor('originalParentId', {\n header: 'Location',\n cell: info => (\n <>\n {info.getValue() && <EntityLink entity={info.getValue()} />} (\n {info.getValue()})\n </>\n ),\n size: 200,\n }),\n columnHelper.accessor('deletedOn', {\n header: 'Deleted On',\n cell: info => formatDate(dayjs(info.getValue())),\n }),\n {\n id: 'restoreButton',\n header: '',\n cell: ({ row }) => (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => {\n onRestore(row.original.entityId)\n row.toggleSelected(false)\n }}\n >\n Restore\n </Button>\n ),\n maxSize: 100,\n },\n ]\n}\n\nexport function TrashCanList() {\n const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false)\n const [errors, setErrors] = useState<SynapseClientError[]>([])\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n\n /**\n * When a mutation operation settles, update the list of errors and clear the selected set\n */\n function onMutateSettled(\n results?: PromiseSettledResult<void>[],\n error?: SynapseClientError | null,\n ) {\n if (results) {\n setErrors(toSynapseClientErrorList(results))\n } else if (error) {\n setErrors([error])\n }\n setRowSelection({})\n }\n\n const { mutate: restore, isPending: isPendingRestore } = useRestoreEntities({\n onSettled: onMutateSettled,\n })\n const { mutate: purge, isPending: isPendingPurge } = usePurgeEntities({\n onSettled: onMutateSettled,\n })\n\n const isMutating = isPendingRestore || isPendingPurge\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetItemsInTrashCanInfinite({\n throwOnError: true,\n })\n const items = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo<ColumnDef<TrashedEntity, any>[]>(\n () =>\n getTrashCanColumns(entityId => {\n restore(entityId)\n }),\n [restore],\n )\n\n const table: Table<TrashedEntity> = useReactTable<TrashedEntity>({\n data: items,\n columns,\n state: {\n rowSelection: rowSelection,\n },\n getRowId: row => row.entityId,\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n const selectedEntityIds = table\n .getSelectedRowModel()\n .rows.map(row => row.original.entityId)\n\n return (\n <div>\n <BlockingLoader\n show={isMutating}\n headlineText={isPendingPurge ? 'Deleting...' : 'Restoring...'}\n />\n <Typography variant=\"body1\">\n The trash can contains items that were recently deleted. You can recover\n deleted items in the trash can by clicking &quot;Restore&quot;. Items\n will remain in the trash can for 30 days before being automatically\n purged.\n </Typography>\n <WarningDialog\n title=\"Delete selected items from your Trash?\"\n content={\n <Typography variant=\"body1\">\n You can&apos;t undo this action.\n </Typography>\n }\n confirmButtonText=\"Delete\"\n confirmButtonColor=\"error\"\n onConfirm={() => {\n purge(selectedEntityIds)\n setShowDeleteConfirmation(false)\n }}\n onCancel={() => {\n setShowDeleteConfirmation(false)\n }}\n open={showDeleteConfirmation}\n />\n {isLoading && <SynapseSpinner />}\n {!isLoading && items.length === 0 && (\n <Alert severity={'info'} sx={{ my: 2 }}>\n <Typography variant=\"body1\">\n Your trash can is currently empty.\n </Typography>\n </Alert>\n )}\n {!isLoading && items.length > 0 && (\n <>\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 4 } }}\n />\n {errors.length > 0 && (\n <Alert severity={'error'} sx={{ mb: 1 }}>\n The following errors were encountered:\n <ul style={{ marginBottom: 0 }}>\n {errors.map(error => (\n <li key={error.message}>{error.message}</li>\n ))}\n </ul>\n </Alert>\n )}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 2,\n }}\n >\n {hasNextPage && (\n <Button\n variant=\"contained\"\n disabled={isFetchingNextPage}\n onClick={() => {\n fetchNextPage()\n }}\n >\n Load More\n </Button>\n )}\n <div style={{ margin: 'auto' }} />\n <Button\n variant=\"contained\"\n color=\"error\"\n disabled={selectedEntityIds.length === 0}\n onClick={() => {\n setShowDeleteConfirmation(true)\n }}\n >\n Delete Selected\n </Button>\n <Button\n variant=\"outlined\"\n disabled={selectedEntityIds.length === 0}\n onClick={() => {\n restore(selectedEntityIds)\n }}\n >\n Restore Selected\n </Button>\n </Box>\n </>\n )}\n </div>\n )\n}\n\nexport default TrashCanList\n"],"mappings":"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"}
1
+ {"version":3,"file":"TrashCanList.js","names":[],"sources":["../../../src/components/trash/TrashCanList.tsx"],"sourcesContent":["import {\n useGetItemsInTrashCanInfinite,\n usePurgeEntities,\n useRestoreEntities,\n} from '@/synapse-queries/trash/useTrashCan'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport { Alert, Box, Button, Typography } from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { TrashedEntity } from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n RowSelectionState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport {\n CheckBoxCell,\n CheckBoxHeader,\n} from '../EntityHeaderTable/EntityHeaderTableCellRenderers'\nimport { EntityLink } from '../EntityLink'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\n\n/**\n * Convert an array of Promise results to an array of errors\n */\nfunction toSynapseClientErrorList(\n results: PromiseSettledResult<void>[],\n): SynapseClientError[] {\n return results\n .filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected',\n )\n .map(result => result.reason as SynapseClientError)\n}\n\nconst columnHelper = createColumnHelper<TrashedEntity>()\n\nfunction getTrashCanColumns(\n onRestore: (entityId: string) => void,\n): ColumnDef<TrashedEntity, any>[] {\n return [\n {\n id: 'select',\n header: CheckBoxHeader,\n cell: CheckBoxCell,\n maxSize: 50,\n },\n columnHelper.accessor('entityId', {\n header: 'ID',\n }),\n columnHelper.accessor('entityName', {\n header: 'Name',\n }),\n columnHelper.accessor('entityType', {\n header: 'Entity Type',\n cell: info => entityTypeToFriendlyName(info.getValue()),\n }),\n columnHelper.accessor('originalParentId', {\n header: 'Location',\n cell: info => (\n <>\n {info.getValue() && <EntityLink entity={info.getValue()} />} (\n {info.getValue()})\n </>\n ),\n size: 200,\n }),\n columnHelper.accessor('deletedOn', {\n header: 'Deleted On',\n cell: info => formatDate(dayjs(info.getValue())),\n }),\n {\n id: 'restoreButton',\n header: '',\n cell: ({ row }) => (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => {\n onRestore(row.original.entityId)\n row.toggleSelected(false)\n }}\n >\n Restore\n </Button>\n ),\n maxSize: 100,\n },\n ]\n}\n\nexport function TrashCanList() {\n const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false)\n const [errors, setErrors] = useState<SynapseClientError[]>([])\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n\n /**\n * When a mutation operation settles, update the list of errors and clear the selected set\n */\n function onMutateSettled(\n results?: PromiseSettledResult<void>[],\n error?: SynapseClientError | null,\n ) {\n if (results) {\n setErrors(toSynapseClientErrorList(results))\n } else if (error) {\n setErrors([error])\n }\n setRowSelection({})\n }\n\n const { mutate: restore, isPending: isPendingRestore } = useRestoreEntities({\n onSettled: onMutateSettled,\n })\n const { mutate: purge, isPending: isPendingPurge } = usePurgeEntities({\n onSettled: onMutateSettled,\n })\n\n const isMutating = isPendingRestore || isPendingPurge\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetItemsInTrashCanInfinite({\n throwOnError: true,\n })\n const items = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo<ColumnDef<TrashedEntity, any>[]>(\n () =>\n getTrashCanColumns(entityId => {\n restore(entityId)\n }),\n [restore],\n )\n\n const table: Table<TrashedEntity> = useReactTable<TrashedEntity>({\n data: items,\n columns,\n state: {\n rowSelection: rowSelection,\n },\n getRowId: row => row.entityId,\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n const selectedEntityIds = table\n .getSelectedRowModel()\n .rows.map(row => row.original.entityId)\n\n return (\n <div>\n <BlockingLoader\n show={isMutating}\n headlineText={isPendingPurge ? 'Deleting...' : 'Restoring...'}\n />\n <Typography variant=\"body1\">\n The trash can contains items that were recently deleted. You can recover\n deleted items in the trash can by clicking &quot;Restore&quot;. Items\n will remain in the trash can for 30 days before being automatically\n purged.\n </Typography>\n <WarningDialog\n title=\"Delete selected items from your Trash?\"\n content={\n <Typography variant=\"body1\">\n You can&apos;t undo this action.\n </Typography>\n }\n confirmButtonText=\"Delete\"\n confirmButtonColor=\"error\"\n onConfirm={() => {\n purge(selectedEntityIds)\n setShowDeleteConfirmation(false)\n }}\n onCancel={() => {\n setShowDeleteConfirmation(false)\n }}\n open={showDeleteConfirmation}\n />\n {isLoading && <SynapseSpinner />}\n {!isLoading && items.length === 0 && (\n <Alert severity={'info'} sx={{ my: 2 }}>\n <Typography variant=\"body1\">\n Your trash can is currently empty.\n </Typography>\n </Alert>\n )}\n {!isLoading && items.length > 0 && (\n <>\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 4 } }}\n />\n {errors.length > 0 && (\n <Alert severity={'error'} sx={{ mb: 1 }}>\n The following errors were encountered:\n <ul style={{ marginBottom: 0 }}>\n {errors.map(error => (\n <li key={error.message}>{error.message}</li>\n ))}\n </ul>\n </Alert>\n )}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 2,\n }}\n >\n {hasNextPage && (\n <Button\n variant=\"contained\"\n disabled={isFetchingNextPage}\n onClick={() => {\n fetchNextPage()\n }}\n >\n Load More\n </Button>\n )}\n <div style={{ margin: 'auto' }} />\n <Button\n variant=\"contained\"\n color=\"error\"\n disabled={selectedEntityIds.length === 0}\n onClick={() => {\n setShowDeleteConfirmation(true)\n }}\n >\n Delete Selected\n </Button>\n <Button\n variant=\"outlined\"\n disabled={selectedEntityIds.length === 0}\n onClick={() => {\n restore(selectedEntityIds)\n }}\n >\n Restore Selected\n </Button>\n </Box>\n </>\n )}\n </div>\n )\n}\n\nexport default TrashCanList\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileHandleLink.js","names":[],"sources":["../../../src/components/widgets/FileHandleLink.tsx"],"sourcesContent":["import React from 'react'\nimport SynapseClient from '@/synapse-client'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n BatchFileRequest,\n BatchFileResult,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\n\ntype FileHandleLinkProps = {\n fileHandleAssociation: FileHandleAssociation\n redirect?: boolean\n showDownloadIcon: boolean\n displayValue?: string\n}\nexport const FileHandleLink = (props: FileHandleLinkProps): React.ReactNode => {\n const {\n fileHandleAssociation,\n showDownloadIcon,\n redirect = false,\n displayValue,\n } = props\n const { accessToken } = useSynapseContext()\n\n const [batchFileResult, setBatchFileResult] = useState<\n BatchFileResult | undefined\n >()\n\n useEffect(() => {\n if (displayValue === undefined) {\n const getFiles = async () => {\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [fileHandleAssociation],\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n }\n setBatchFileResult(\n await SynapseClient.getFiles(batchFileRequest, accessToken),\n )\n }\n getFiles()\n }\n }, [accessToken, displayValue, fileHandleAssociation])\n\n let fileName: string | undefined = undefined\n if (batchFileResult) {\n fileName = batchFileResult.requestedFiles[0].fileHandle?.fileName\n }\n\n return (\n <button\n onClick={() => {\n if (accessToken && fileHandleAssociation) {\n SynapseClient.getActualFileHandleByIdURL(\n fileHandleAssociation.fileHandleId,\n accessToken,\n fileHandleAssociation.associateObjectType,\n fileHandleAssociation.associateObjectId,\n redirect,\n )\n .then(url => {\n window.open(url, '_blank')\n })\n .catch(err => {\n console.error('Error on retrieving file handle url ', err)\n })\n }\n }}\n className={`SRC-primary-text-color ${SynapseConstants.SRC_SIGN_IN_CLASS}`}\n type=\"button\"\n style={{ padding: 0 }}\n >\n {displayValue ?? fileName ?? fileHandleAssociation.fileHandleId}\n {showDownloadIcon && <IconSvg icon=\"download\" />}\n </button>\n )\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,KAAkB,MAAgD;CAC7E,IAAM,EACJ,0BACA,qBACA,cAAW,IACX,oBACE,GACE,EAAE,mBAAgB,GAAmB,EAErC,CAAC,GAAiB,KAAsB,GAE3C;AAEH,SAAgB;AACd,EAAI,MAAiB,KAAA,MACF,YAAY;GAC3B,IAAM,IAAqC;IACzC,gBAAgB,CAAC,EAAsB;IACvC,oBAAoB;IACpB,sBAAsB;IACtB,6BAA6B;IAC9B;AACD,KACE,MAAM,EAAc,SAAS,GAAkB,EAAY,CAC5D;MAEO;IAEX;EAAC;EAAa;EAAc;EAAsB,CAAC;CAEtD,IAAI;AAKJ,QAJI,MACF,IAAW,EAAgB,eAAe,GAAG,YAAY,WAIzD,kBAAC,UAAD;EACE,eAAe;AACb,GAAI,KAAe,KACjB,EAAc,2BACZ,EAAsB,cACtB,GACA,EAAsB,qBACtB,EAAsB,mBACtB,EACD,CACE,MAAK,MAAO;AACX,WAAO,KAAK,GAAK,SAAS;KAC1B,CACD,OAAM,MAAO;AACZ,YAAQ,MAAM,wCAAwC,EAAI;KAC1D;;EAGR,WAAW,0BAA0B;EACrC,MAAK;EACL,OAAO,EAAE,SAAS,GAAG;YApBvB,CAsBG,KAAgB,KAAY,EAAsB,cAClD,KAAoB,kBAAC,GAAD,EAAS,MAAK,YAAa,CAAA,CACzC"}
1
+ {"version":3,"file":"FileHandleLink.js","names":[],"sources":["../../../src/components/widgets/FileHandleLink.tsx"],"sourcesContent":["import React from 'react'\nimport SynapseClient from '@/synapse-client'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n BatchFileRequest,\n BatchFileResult,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\n\ntype FileHandleLinkProps = {\n fileHandleAssociation: FileHandleAssociation\n redirect?: boolean\n showDownloadIcon: boolean\n displayValue?: string\n}\nexport const FileHandleLink = (props: FileHandleLinkProps): React.ReactNode => {\n const {\n fileHandleAssociation,\n showDownloadIcon,\n redirect = false,\n displayValue,\n } = props\n const { accessToken } = useSynapseContext()\n\n const [batchFileResult, setBatchFileResult] = useState<\n BatchFileResult | undefined\n >()\n\n useEffect(() => {\n if (displayValue === undefined) {\n const getFiles = async () => {\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [fileHandleAssociation],\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n }\n setBatchFileResult(\n await SynapseClient.getFiles(batchFileRequest, accessToken),\n )\n }\n getFiles()\n }\n }, [accessToken, displayValue, fileHandleAssociation])\n\n let fileName: string | undefined = undefined\n if (batchFileResult) {\n fileName = batchFileResult.requestedFiles[0].fileHandle?.fileName\n }\n\n return (\n <button\n onClick={() => {\n if (accessToken && fileHandleAssociation) {\n SynapseClient.getActualFileHandleByIdURL(\n fileHandleAssociation.fileHandleId,\n accessToken,\n fileHandleAssociation.associateObjectType,\n fileHandleAssociation.associateObjectId,\n redirect,\n )\n .then(url => {\n window.open(url, '_blank')\n })\n .catch(err => {\n console.error('Error on retrieving file handle url ', err)\n })\n }\n }}\n className={`SRC-primary-text-color ${SynapseConstants.SRC_SIGN_IN_CLASS}`}\n type=\"button\"\n style={{ padding: 0 }}\n >\n {displayValue ?? fileName ?? fileHandleAssociation.fileHandleId}\n {showDownloadIcon && <IconSvg icon=\"download\" />}\n </button>\n )\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,KAAkB,MAAgD;CAC7E,IAAM,EACJ,0BACA,qBACA,cAAW,IACX,oBACE,GACE,EAAE,mBAAgB,GAAmB,EAErC,CAAC,GAAiB,KAAsB,GAE3C;AAEH,SAAgB;AACd,EAAI,MAAiB,KAAA,MAYnB,YAX6B;GAC3B,IAAM,IAAqC;IACzC,gBAAgB,CAAC,EAAsB;IACvC,oBAAoB;IACpB,sBAAsB;IACtB,6BAA6B;IAC9B;AACD,KACE,MAAM,EAAc,SAAS,GAAkB,EAAY,CAC5D;MAEO;IAEX;EAAC;EAAa;EAAc;EAAsB,CAAC;CAEtD,IAAI;AAKJ,QAJI,MACF,IAAW,EAAgB,eAAe,GAAG,YAAY,WAIzD,kBAAC,UAAD;EACE,eAAe;AACb,GAAI,KAAe,KACjB,EAAc,2BACZ,EAAsB,cACtB,GACA,EAAsB,qBACtB,EAAsB,mBACtB,EACD,CACE,MAAK,MAAO;AACX,WAAO,KAAK,GAAK,SAAS;KAC1B,CACD,OAAM,MAAO;AACZ,YAAQ,MAAM,wCAAwC,EAAI;KAC1D;;EAGR,WAAW,0BAA0B;EACrC,MAAK;EACL,OAAO,EAAE,SAAS,GAAG;YApBvB,CAsBG,KAAgB,KAAY,EAAsB,cAClD,KAAoB,kBAAC,GAAD,EAAS,MAAK,YAAa,CAAA,CACzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RangeSlider.js","names":[],"sources":["../../../../src/components/widgets/RangeSlider/RangeSlider.tsx"],"sourcesContent":["import { RangeValues } from '../Range'\nimport { PropsWithChildren, useState } from 'react'\nimport {\n Box,\n Button,\n Slider,\n SliderValueLabelProps,\n Tooltip,\n Typography,\n} from '@mui/material'\n\nexport type RangeSliderProps = PropsWithChildren<{\n domain: string[]\n initialValues: RangeValues\n step: number\n onChange?: (values: RangeValues) => void\n onApplyClicked?: (values: RangeValues) => void\n}>\n\nfunction ValueLabelComponent(props: SliderValueLabelProps) {\n const { children, value } = props\n\n return (\n <Tooltip enterTouchDelay={0} placement=\"top\" title={value}>\n {children}\n </Tooltip>\n )\n}\n\nfunction getInitialValues(initialValues: RangeValues, domain: string[]) {\n const result = [\n initialValues.min ? Number(initialValues.min) : Number(domain[0]),\n initialValues.max ? Number(initialValues.max) : Number(domain[1]),\n ]\n return result\n}\n\nfunction RangeSlider(props: RangeSliderProps) {\n const { onApplyClicked, onChange, step } = props\n const stringArrToNumArr = (inputArr: string[]) =>\n inputArr.map(value => Number(value))\n\n const [values, setValues] = useState<number[]>(() =>\n getInitialValues(props.initialValues, props.domain),\n )\n\n const numDomain = stringArrToNumArr(props.domain)\n\n const handleSliderChange = (values: readonly number[]) => {\n setValues([...values])\n if (onChange) {\n onChange({ min: values[0], max: values[1] })\n }\n }\n\n return (\n <Box sx={{ ml: 1 }}>\n <Typography variant=\"smallText1\">\n {values[0]} - {values[1]}\n </Typography>\n <Box\n sx={{\n display: 'flex',\n gap: 3,\n ml: 1,\n }}\n >\n <Slider\n marks={[\n { value: numDomain[0], label: props.domain[0] },\n { value: numDomain[1], label: props.domain[1] },\n ]}\n min={numDomain[0]}\n max={numDomain[1]}\n value={values}\n onChange={(_, newValues) => handleSliderChange(newValues)}\n step={step}\n valueLabelDisplay=\"auto\"\n slots={{\n valueLabel: ValueLabelComponent,\n }}\n />\n {onApplyClicked && (\n <Box>\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => onApplyClicked({ min: values[0], max: values[1] })}\n sx={{ fontSize: 16 }}\n >\n Apply\n </Button>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\nexport default RangeSlider\n"],"mappings":";;;;AAmBA,SAAS,EAAoB,GAA8B;CACzD,IAAM,EAAE,aAAU,aAAU;AAE5B,QACE,kBAAC,GAAD;EAAS,iBAAiB;EAAG,WAAU;EAAM,OAAO;EACjD;EACO,CAAA;;AAId,SAAS,EAAiB,GAA4B,GAAkB;AAKtE,QAJe,CACb,EAAc,MAAM,OAAO,EAAc,IAAI,GAAG,OAAO,EAAO,GAAG,EACjE,EAAc,MAAM,OAAO,EAAc,IAAI,GAAG,OAAO,EAAO,GAAG,CAClE;;AAIH,SAAS,EAAY,GAAyB;CAC5C,IAAM,EAAE,mBAAgB,aAAU,YAAS,GACrC,KAAqB,MACzB,EAAS,KAAI,MAAS,OAAO,EAAM,CAAC,EAEhC,CAAC,GAAQ,KAAa,QAC1B,EAAiB,EAAM,eAAe,EAAM,OAAO,CACpD,EAEK,IAAY,EAAkB,EAAM,OAAO,EAE3C,KAAsB,MAA8B;AAExD,EADA,EAAU,CAAC,GAAG,EAAO,CAAC,EAClB,KACF,EAAS;GAAE,KAAK,EAAO;GAAI,KAAK,EAAO;GAAI,CAAC;;AAIhD,QACE,kBAAC,GAAD;EAAK,IAAI,EAAE,IAAI,GAAG;YAAlB,CACE,kBAAC,GAAD;GAAY,SAAQ;aAApB;IACG,EAAO;IAAG;IAAI,EAAO;IACX;MACb,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,KAAK;IACL,IAAI;IACL;aALH,CAOE,kBAAC,GAAD;IACE,OAAO,CACL;KAAE,OAAO,EAAU;KAAI,OAAO,EAAM,OAAO;KAAI,EAC/C;KAAE,OAAO,EAAU;KAAI,OAAO,EAAM,OAAO;KAAI,CAChD;IACD,KAAK,EAAU;IACf,KAAK,EAAU;IACf,OAAO;IACP,WAAW,GAAG,MAAc,EAAmB,EAAU;IACnD;IACN,mBAAkB;IAClB,OAAO,EACL,YAAY,GACb;IACD,CAAA,EACD,KACC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eAAe,EAAe;KAAE,KAAK,EAAO;KAAI,KAAK,EAAO;KAAI,CAAC;IACjE,IAAI,EAAE,UAAU,IAAI;cACrB;IAEQ,CAAA,EACL,CAAA,CAEJ;KACF"}
1
+ {"version":3,"file":"RangeSlider.js","names":[],"sources":["../../../../src/components/widgets/RangeSlider/RangeSlider.tsx"],"sourcesContent":["import { RangeValues } from '../Range'\nimport { PropsWithChildren, useState } from 'react'\nimport {\n Box,\n Button,\n Slider,\n SliderValueLabelProps,\n Tooltip,\n Typography,\n} from '@mui/material'\n\nexport type RangeSliderProps = PropsWithChildren<{\n domain: string[]\n initialValues: RangeValues\n step: number\n onChange?: (values: RangeValues) => void\n onApplyClicked?: (values: RangeValues) => void\n}>\n\nfunction ValueLabelComponent(props: SliderValueLabelProps) {\n const { children, value } = props\n\n return (\n <Tooltip enterTouchDelay={0} placement=\"top\" title={value}>\n {children}\n </Tooltip>\n )\n}\n\nfunction getInitialValues(initialValues: RangeValues, domain: string[]) {\n const result = [\n initialValues.min ? Number(initialValues.min) : Number(domain[0]),\n initialValues.max ? Number(initialValues.max) : Number(domain[1]),\n ]\n return result\n}\n\nfunction RangeSlider(props: RangeSliderProps) {\n const { onApplyClicked, onChange, step } = props\n const stringArrToNumArr = (inputArr: string[]) =>\n inputArr.map(value => Number(value))\n\n const [values, setValues] = useState<number[]>(() =>\n getInitialValues(props.initialValues, props.domain),\n )\n\n const numDomain = stringArrToNumArr(props.domain)\n\n const handleSliderChange = (values: readonly number[]) => {\n setValues([...values])\n if (onChange) {\n onChange({ min: values[0], max: values[1] })\n }\n }\n\n return (\n <Box sx={{ ml: 1 }}>\n <Typography variant=\"smallText1\">\n {values[0]} - {values[1]}\n </Typography>\n <Box\n sx={{\n display: 'flex',\n gap: 3,\n ml: 1,\n }}\n >\n <Slider\n marks={[\n { value: numDomain[0], label: props.domain[0] },\n { value: numDomain[1], label: props.domain[1] },\n ]}\n min={numDomain[0]}\n max={numDomain[1]}\n value={values}\n onChange={(_, newValues) => handleSliderChange(newValues)}\n step={step}\n valueLabelDisplay=\"auto\"\n slots={{\n valueLabel: ValueLabelComponent,\n }}\n />\n {onApplyClicked && (\n <Box>\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => onApplyClicked({ min: values[0], max: values[1] })}\n sx={{ fontSize: 16 }}\n >\n Apply\n </Button>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\nexport default RangeSlider\n"],"mappings":";;;;AAmBA,SAAS,EAAoB,GAA8B;CACzD,IAAM,EAAE,aAAU,aAAU;AAE5B,QACE,kBAAC,GAAD;EAAS,iBAAiB;EAAG,WAAU;EAAM,OAAO;EACjD;EACO,CAAA;;AAId,SAAS,EAAiB,GAA4B,GAAkB;AAKtE,QAAO,CAHL,EAAc,MAAM,OAAO,EAAc,IAAI,GAAG,OAAO,EAAO,GAAG,EACjE,EAAc,MAAM,OAAO,EAAc,IAAI,GAAG,OAAO,EAAO,GAAG,CAE5D;;AAGT,SAAS,EAAY,GAAyB;CAC5C,IAAM,EAAE,mBAAgB,aAAU,YAAS,GACrC,KAAqB,MACzB,EAAS,KAAI,MAAS,OAAO,EAAM,CAAC,EAEhC,CAAC,GAAQ,KAAa,QAC1B,EAAiB,EAAM,eAAe,EAAM,OAAO,CACpD,EAEK,IAAY,EAAkB,EAAM,OAAO,EAE3C,KAAsB,MAA8B;AAExD,EADA,EAAU,CAAC,GAAG,EAAO,CAAC,EAClB,KACF,EAAS;GAAE,KAAK,EAAO;GAAI,KAAK,EAAO;GAAI,CAAC;;AAIhD,QACE,kBAAC,GAAD;EAAK,IAAI,EAAE,IAAI,GAAG;YAAlB,CACE,kBAAC,GAAD;GAAY,SAAQ;aAApB;IACG,EAAO;IAAG;IAAI,EAAO;IACX;MACb,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,KAAK;IACL,IAAI;IACL;aALH,CAOE,kBAAC,GAAD;IACE,OAAO,CACL;KAAE,OAAO,EAAU;KAAI,OAAO,EAAM,OAAO;KAAI,EAC/C;KAAE,OAAO,EAAU;KAAI,OAAO,EAAM,OAAO;KAAI,CAChD;IACD,KAAK,EAAU;IACf,KAAK,EAAU;IACf,OAAO;IACP,WAAW,GAAG,MAAc,EAAmB,EAAU;IACnD;IACN,mBAAkB;IAClB,OAAO,EACL,YAAY,GACb;IACD,CAAA,EACD,KACC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eAAe,EAAe;KAAE,KAAK,EAAO;KAAI,KAAK,EAAO;KAAI,CAAC;IACjE,IAAI,EAAE,UAAU,IAAI;cACrB;IAEQ,CAAA,EACL,CAAA,CAEJ;KACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseVideo.js","names":[],"sources":["../../../src/components/widgets/SynapseVideo.tsx"],"sourcesContent":["import { getEntity, getFiles } from '@/synapse-client/SynapseClient'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n BatchFileRequest,\n BatchFileResult,\n FileEntity,\n FileHandleAssociateType,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\n\nexport type SynapseVideoProps = {\n params: {\n width?: string\n height?: string\n videoId?: string\n vimeoId?: string\n oggSynapseId?: string\n mp4SynapseId?: string\n webmSynapseId?: string\n vttSynapseId?: string\n }\n}\n\nexport default function SynapseVideo({ params }: SynapseVideoProps) {\n const { accessToken, isAuthenticated } = useSynapseContext()\n const [externalVideoUrl, setExternalVideoUrl] = useState<string>()\n const [synapseVideoPresignedUrl, setSynapseVideoPresignedUrl] =\n useState<string>()\n const [synapseVideoVttPresignedUrl, setSynapseVideoVttPresignedUrl] =\n useState<string>()\n\n const videoWidth = params.width ?? ''\n const videoHeight = params.height ?? ''\n useEffect(() => {\n const getVideo = async () => {\n if (params.videoId)\n setExternalVideoUrl(`https://www.youtube.com/embed/${params.videoId}`)\n else if (params.vimeoId)\n setExternalVideoUrl(`https://player.vimeo.com/video/${params.vimeoId}`)\n else {\n const videoKey =\n params.oggSynapseId || params.mp4SynapseId || params.webmSynapseId\n\n const videoEntity = await getEntity<FileEntity>(accessToken, videoKey!)\n const fileHandleAssociationList: FileHandleAssociation[] = [\n {\n associateObjectId: videoKey!,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: videoEntity.dataFileHandleId,\n },\n ]\n\n let vttFileHandleId: string | undefined\n if (params.vttSynapseId) {\n const vttEntity = await getEntity<FileEntity>(\n accessToken,\n params.vttSynapseId,\n )\n vttFileHandleId = vttEntity.dataFileHandleId\n fileHandleAssociationList.push({\n associateObjectId: params.vttSynapseId,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: vttEntity.dataFileHandleId,\n })\n }\n\n getSynapseFiles(\n fileHandleAssociationList,\n videoEntity.dataFileHandleId,\n vttFileHandleId,\n )\n }\n }\n\n const getSynapseFiles = (\n fileHandleAssociationList: FileHandleAssociation[],\n videoFileHandleId: string,\n vttFileHandleId?: string,\n ) => {\n const request: BatchFileRequest = {\n includeFileHandles: false,\n includePreSignedURLs: true,\n includePreviewPreSignedURLs: false,\n requestedFiles: fileHandleAssociationList,\n }\n\n getFiles(request, accessToken)\n .then((data: BatchFileResult) => {\n const videoFile = data.requestedFiles.find(\n el => el.fileHandleId === videoFileHandleId,\n )\n if (videoFile?.preSignedURL) {\n setSynapseVideoPresignedUrl(videoFile.preSignedURL)\n }\n\n if (vttFileHandleId) {\n const vttFile = data.requestedFiles.find(\n el => el.fileHandleId === vttFileHandleId,\n )\n if (vttFile?.preSignedURL) {\n setSynapseVideoVttPresignedUrl(vttFile.preSignedURL)\n }\n }\n })\n .catch(err => {\n console.error('Error on getting video ', err)\n })\n }\n getVideo()\n }, [externalVideoUrl, params, accessToken, videoHeight, videoWidth])\n\n if (!isAuthenticated && !externalVideoUrl) {\n // if not logged in, show login button\n return (\n <p>\n You will need to\n <button\n data-testid=\"video-login\"\n className={`${SynapseConstants.SRC_SIGN_IN_CLASS} sign-in-btn default\n `}\n >\n Sign in\n </button>\n in for access to that resource.\n </p>\n )\n }\n if (synapseVideoPresignedUrl) {\n return (\n <video\n controls\n width={videoWidth}\n height={videoHeight}\n data-testid=\"synapse-video-url\"\n crossOrigin=\"anonymous\"\n >\n <source src={synapseVideoPresignedUrl} />\n {synapseVideoVttPresignedUrl && (\n <track src={synapseVideoVttPresignedUrl} kind=\"subtitles\" default />\n )}\n It does not support the HTML5 Video element.\n </video>\n )\n } else if (externalVideoUrl) {\n return (\n <iframe\n title=\"video frame\"\n src={externalVideoUrl}\n width={videoWidth}\n height={videoHeight}\n ></iframe>\n )\n } else {\n return <></>\n }\n}\n"],"mappings":";;;;;;;;AAyBA,SAAwB,EAAa,EAAE,aAA6B;CAClE,IAAM,EAAE,gBAAa,uBAAoB,GAAmB,EACtD,CAAC,GAAkB,KAAuB,GAAkB,EAC5D,CAAC,GAA0B,KAC/B,GAAkB,EACd,CAAC,GAA6B,KAClC,GAAkB,EAEd,IAAa,EAAO,SAAS,IAC7B,IAAc,EAAO,UAAU;AAyHnC,QAxHF,QAAgB;EACd,IAAM,IAAW,YAAY;AAC3B,OAAI,EAAO,QACT,GAAoB,iCAAiC,EAAO,UAAU;YAC/D,EAAO,QACd,GAAoB,kCAAkC,EAAO,UAAU;QACpE;IACH,IAAM,IACJ,EAAO,gBAAgB,EAAO,gBAAgB,EAAO,eAEjD,IAAc,MAAM,EAAsB,GAAa,EAAU,EACjE,IAAqD,CACzD;KACE,mBAAmB;KACnB,qBAAqB,EAAwB;KAC7C,cAAc,EAAY;KAC3B,CACF,EAEG;AACJ,QAAI,EAAO,cAAc;KACvB,IAAM,IAAY,MAAM,EACtB,GACA,EAAO,aACR;AAED,KADA,IAAkB,EAAU,kBAC5B,EAA0B,KAAK;MAC7B,mBAAmB,EAAO;MAC1B,qBAAqB,EAAwB;MAC7C,cAAc,EAAU;MACzB,CAAC;;AAGJ,MACE,GACA,EAAY,kBACZ,EACD;;KAIC,KACJ,GACA,GACA,MACG;AAQH,KAPkC;IAChC,oBAAoB;IACpB,sBAAsB;IACtB,6BAA6B;IAC7B,gBAAgB;IACjB,EAEiB,EAAY,CAC3B,MAAM,MAA0B;IAC/B,IAAM,IAAY,EAAK,eAAe,MACpC,MAAM,EAAG,iBAAiB,EAC3B;AAKD,QAJI,GAAW,gBACb,EAA4B,EAAU,aAAa,EAGjD,GAAiB;KACnB,IAAM,IAAU,EAAK,eAAe,MAClC,MAAM,EAAG,iBAAiB,EAC3B;AACD,KAAI,GAAS,gBACX,EAA+B,EAAQ,aAAa;;KAGxD,CACD,OAAM,MAAO;AACZ,YAAQ,MAAM,2BAA2B,EAAI;KAC7C;;AAEN,KAAU;IACT;EAAC;EAAkB;EAAQ;EAAa;EAAa;EAAW,CAAC,EAEhE,CAAC,KAAmB,CAAC,IAGrB,kBAAC,KAAD,EAAA,UAAA;EAAG;EAED,kBAAC,UAAD;GACE,eAAY;GACZ,WAAW,GAAG,EAAmC;;aAElD;GAEQ,CAAA;;EAEP,EAAA,CAAA,GAGJ,IAEA,kBAAC,SAAD;EACE,UAAA;EACA,OAAO;EACP,QAAQ;EACR,eAAY;EACZ,aAAY;YALd;GAOE,kBAAC,UAAD,EAAQ,KAAK,GAA4B,CAAA;GACxC,KACC,kBAAC,SAAD;IAAO,KAAK;IAA6B,MAAK;IAAY,SAAA;IAAU,CAAA;GACpE;GAEI;MAED,IAEP,kBAAC,UAAD;EACE,OAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACA,CAAA,GAGL,kBAAA,GAAA,EAAK,CAAA"}
1
+ {"version":3,"file":"SynapseVideo.js","names":[],"sources":["../../../src/components/widgets/SynapseVideo.tsx"],"sourcesContent":["import { getEntity, getFiles } from '@/synapse-client/SynapseClient'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n BatchFileRequest,\n BatchFileResult,\n FileEntity,\n FileHandleAssociateType,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\n\nexport type SynapseVideoProps = {\n params: {\n width?: string\n height?: string\n videoId?: string\n vimeoId?: string\n oggSynapseId?: string\n mp4SynapseId?: string\n webmSynapseId?: string\n vttSynapseId?: string\n }\n}\n\nexport default function SynapseVideo({ params }: SynapseVideoProps) {\n const { accessToken, isAuthenticated } = useSynapseContext()\n const [externalVideoUrl, setExternalVideoUrl] = useState<string>()\n const [synapseVideoPresignedUrl, setSynapseVideoPresignedUrl] =\n useState<string>()\n const [synapseVideoVttPresignedUrl, setSynapseVideoVttPresignedUrl] =\n useState<string>()\n\n const videoWidth = params.width ?? ''\n const videoHeight = params.height ?? ''\n useEffect(() => {\n const getVideo = async () => {\n if (params.videoId)\n setExternalVideoUrl(`https://www.youtube.com/embed/${params.videoId}`)\n else if (params.vimeoId)\n setExternalVideoUrl(`https://player.vimeo.com/video/${params.vimeoId}`)\n else {\n const videoKey =\n params.oggSynapseId || params.mp4SynapseId || params.webmSynapseId\n\n const videoEntity = await getEntity<FileEntity>(accessToken, videoKey!)\n const fileHandleAssociationList: FileHandleAssociation[] = [\n {\n associateObjectId: videoKey!,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: videoEntity.dataFileHandleId,\n },\n ]\n\n let vttFileHandleId: string | undefined\n if (params.vttSynapseId) {\n const vttEntity = await getEntity<FileEntity>(\n accessToken,\n params.vttSynapseId,\n )\n vttFileHandleId = vttEntity.dataFileHandleId\n fileHandleAssociationList.push({\n associateObjectId: params.vttSynapseId,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: vttEntity.dataFileHandleId,\n })\n }\n\n getSynapseFiles(\n fileHandleAssociationList,\n videoEntity.dataFileHandleId,\n vttFileHandleId,\n )\n }\n }\n\n const getSynapseFiles = (\n fileHandleAssociationList: FileHandleAssociation[],\n videoFileHandleId: string,\n vttFileHandleId?: string,\n ) => {\n const request: BatchFileRequest = {\n includeFileHandles: false,\n includePreSignedURLs: true,\n includePreviewPreSignedURLs: false,\n requestedFiles: fileHandleAssociationList,\n }\n\n getFiles(request, accessToken)\n .then((data: BatchFileResult) => {\n const videoFile = data.requestedFiles.find(\n el => el.fileHandleId === videoFileHandleId,\n )\n if (videoFile?.preSignedURL) {\n setSynapseVideoPresignedUrl(videoFile.preSignedURL)\n }\n\n if (vttFileHandleId) {\n const vttFile = data.requestedFiles.find(\n el => el.fileHandleId === vttFileHandleId,\n )\n if (vttFile?.preSignedURL) {\n setSynapseVideoVttPresignedUrl(vttFile.preSignedURL)\n }\n }\n })\n .catch(err => {\n console.error('Error on getting video ', err)\n })\n }\n getVideo()\n }, [externalVideoUrl, params, accessToken, videoHeight, videoWidth])\n\n if (!isAuthenticated && !externalVideoUrl) {\n // if not logged in, show login button\n return (\n <p>\n You will need to\n <button\n data-testid=\"video-login\"\n className={`${SynapseConstants.SRC_SIGN_IN_CLASS} sign-in-btn default\n `}\n >\n Sign in\n </button>\n in for access to that resource.\n </p>\n )\n }\n if (synapseVideoPresignedUrl) {\n return (\n <video\n controls\n width={videoWidth}\n height={videoHeight}\n data-testid=\"synapse-video-url\"\n crossOrigin=\"anonymous\"\n >\n <source src={synapseVideoPresignedUrl} />\n {synapseVideoVttPresignedUrl && (\n <track src={synapseVideoVttPresignedUrl} kind=\"subtitles\" default />\n )}\n It does not support the HTML5 Video element.\n </video>\n )\n } else if (externalVideoUrl) {\n return (\n <iframe\n title=\"video frame\"\n src={externalVideoUrl}\n width={videoWidth}\n height={videoHeight}\n ></iframe>\n )\n } else {\n return <></>\n }\n}\n"],"mappings":";;;;;;;;AAyBA,SAAwB,EAAa,EAAE,aAA6B;CAClE,IAAM,EAAE,gBAAa,uBAAoB,GAAmB,EACtD,CAAC,GAAkB,KAAuB,GAAkB,EAC5D,CAAC,GAA0B,KAC/B,GAAkB,EACd,CAAC,GAA6B,KAClC,GAAkB,EAEd,IAAa,EAAO,SAAS,IAC7B,IAAc,EAAO,UAAU;AAyHnC,QAxHF,QAAgB;EACd,IAAM,IAAW,YAAY;AAC3B,OAAI,EAAO,QACT,GAAoB,iCAAiC,EAAO,UAAU;YAC/D,EAAO,QACd,GAAoB,kCAAkC,EAAO,UAAU;QACpE;IACH,IAAM,IACJ,EAAO,gBAAgB,EAAO,gBAAgB,EAAO,eAEjD,IAAc,MAAM,EAAsB,GAAa,EAAU,EACjE,IAAqD,CACzD;KACE,mBAAmB;KACnB,qBAAqB,EAAwB;KAC7C,cAAc,EAAY;KAC3B,CACF,EAEG;AACJ,QAAI,EAAO,cAAc;KACvB,IAAM,IAAY,MAAM,EACtB,GACA,EAAO,aACR;AAED,KADA,IAAkB,EAAU,kBAC5B,EAA0B,KAAK;MAC7B,mBAAmB,EAAO;MAC1B,qBAAqB,EAAwB;MAC7C,cAAc,EAAU;MACzB,CAAC;;AAGJ,MACE,GACA,EAAY,kBACZ,EACD;;KAIC,KACJ,GACA,GACA,MACG;AAQH,KAAS;IANP,oBAAoB;IACpB,sBAAsB;IACtB,6BAA6B;IAC7B,gBAAgB;IAGT,EAAS,EAAY,CAC3B,MAAM,MAA0B;IAC/B,IAAM,IAAY,EAAK,eAAe,MACpC,MAAM,EAAG,iBAAiB,EAC3B;AAKD,QAJI,GAAW,gBACb,EAA4B,EAAU,aAAa,EAGjD,GAAiB;KACnB,IAAM,IAAU,EAAK,eAAe,MAClC,MAAM,EAAG,iBAAiB,EAC3B;AACD,KAAI,GAAS,gBACX,EAA+B,EAAQ,aAAa;;KAGxD,CACD,OAAM,MAAO;AACZ,YAAQ,MAAM,2BAA2B,EAAI;KAC7C;;AAEN,KAAU;IACT;EAAC;EAAkB;EAAQ;EAAa;EAAa;EAAW,CAAC,EAEhE,CAAC,KAAmB,CAAC,IAGrB,kBAAC,KAAD,EAAA,UAAA;EAAG;EAED,kBAAC,UAAD;GACE,eAAY;GACZ,WAAW,GAAG,EAAmC;;aAElD;GAEQ,CAAA;;EAEP,EAAA,CAAA,GAGJ,IAEA,kBAAC,SAAD;EACE,UAAA;EACA,OAAO;EACP,QAAQ;EACR,eAAY;EACZ,aAAY;YALd;GAOE,kBAAC,UAAD,EAAQ,KAAK,GAA4B,CAAA;GACxC,KACC,kBAAC,SAAD;IAAO,KAAK;IAA6B,MAAK;IAAY,SAAA;IAAU,CAAA;GACpE;GAEI;MAED,IAEP,kBAAC,UAAD;EACE,OAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACA,CAAA,GAGL,kBAAA,GAAA,EAAK,CAAA"}