synapse-react-client 4.0.9 → 4.0.10

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 (543) 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/TasksIcon.d.ts.map +1 -1
  8. package/dist/assets/icons/TasksIcon.js +6 -10
  9. package/dist/assets/icons/TasksIcon.js.map +1 -1
  10. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  11. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
  12. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  13. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  14. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  15. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  17. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  18. package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
  19. package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
  20. package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
  21. package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
  22. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
  23. package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
  24. package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
  25. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  26. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
  27. package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
  28. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  29. package/dist/components/Authentication/Constants.d.ts +1 -0
  30. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  31. package/dist/components/Authentication/Constants.js +2 -2
  32. package/dist/components/Authentication/Constants.js.map +1 -1
  33. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  34. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  35. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  36. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  37. package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
  38. package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
  39. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  40. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  41. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
  42. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  43. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  44. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  45. package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
  46. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  47. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  48. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  49. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  50. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  51. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  52. package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
  53. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  54. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  55. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  56. package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
  57. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  58. package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
  59. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  60. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  61. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  62. package/dist/components/ComponentCollapse.js.map +1 -1
  63. package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
  64. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  65. package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
  66. package/dist/components/DataGrid/DataGrid.d.ts +0 -1
  67. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  68. package/dist/components/DataGrid/DataGrid.js +72 -72
  69. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  70. package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
  71. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  72. package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
  73. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  74. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  75. package/dist/components/DataGrid/SynapseGrid.js +326 -268
  76. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  77. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
  78. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  79. package/dist/components/DataGrid/columns/AutocompleteColumn.js +113 -67
  80. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  81. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
  82. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  83. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
  84. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  85. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
  86. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
  87. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
  88. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
  89. package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
  90. package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
  91. package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
  92. package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
  93. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
  94. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  95. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  96. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  97. package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
  98. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
  99. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  100. package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
  101. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  102. package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
  103. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  104. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  105. package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
  106. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  107. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  108. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  109. package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
  110. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  111. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  112. package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
  113. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  114. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  115. package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
  116. package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
  117. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  118. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  119. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  120. package/dist/components/DirectDownloadButton.js.map +1 -1
  121. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  122. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  123. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  124. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  125. package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
  126. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  127. package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
  128. package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
  129. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  130. package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
  131. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  132. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
  133. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  134. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  135. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  136. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
  137. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
  138. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  139. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  140. package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
  141. package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
  142. package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
  143. package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
  144. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  145. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  146. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  147. package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
  148. package/dist/components/EntityForm/EntityForm.js.map +1 -1
  149. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  150. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  151. package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
  152. package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
  153. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  154. package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
  155. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  156. package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
  157. package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
  158. package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
  159. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  160. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  161. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  162. package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
  163. package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
  164. package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
  165. package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
  166. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  167. package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
  168. package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
  169. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  170. package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
  171. package/dist/components/Forum/ForumTable.js.map +1 -1
  172. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  173. package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
  174. package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
  175. package/dist/components/GenericCard/GenericCard.js +12 -7
  176. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  177. package/dist/components/GenericCard/Linkify.js.map +1 -1
  178. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  179. package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
  180. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  181. package/dist/components/Goals/Goals.Mobile.js.map +1 -1
  182. package/dist/components/Goals/Goals.js.map +1 -1
  183. package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
  184. package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
  185. package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
  186. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  187. package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
  188. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  189. package/dist/components/HasAccess/useHasAccess.js.map +1 -1
  190. package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
  191. package/dist/components/HeaderCard.d.ts +6 -1
  192. package/dist/components/HeaderCard.d.ts.map +1 -1
  193. package/dist/components/HeaderCard.js +107 -76
  194. package/dist/components/HeaderCard.js.map +1 -1
  195. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  196. package/dist/components/IconList.js.map +1 -1
  197. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
  198. package/dist/components/ImageFromSynapseTable.js.map +1 -1
  199. package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
  200. package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
  201. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
  202. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  203. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  204. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  205. package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
  206. package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
  207. package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
  208. package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
  209. package/dist/components/Markdown/UserMentionModal.js.map +1 -1
  210. package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
  211. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  212. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  213. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  214. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
  215. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  216. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  217. package/dist/components/PageProgress/PageProgress.js.map +1 -1
  218. package/dist/components/Plot/DotPlot.js.map +1 -1
  219. package/dist/components/Plot/Plot.js.map +1 -1
  220. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  221. package/dist/components/Plot/ThemesPlot.js.map +1 -1
  222. package/dist/components/Plot/UpsetPlot.js.map +1 -1
  223. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  224. package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
  225. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  226. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
  227. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  228. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
  229. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  230. package/dist/components/Programs/Programs.Mobile.js.map +1 -1
  231. package/dist/components/Programs/Programs.js.map +1 -1
  232. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  233. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  234. package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
  235. package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
  236. package/dist/components/QueryCount/QueryCount.js.map +1 -1
  237. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  238. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  239. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  240. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  241. package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
  242. package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
  243. package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
  244. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  245. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  246. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  247. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
  248. package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
  249. package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
  250. package/dist/components/Resources/Resources.Mobile.js.map +1 -1
  251. package/dist/components/Resources/Resources.js.map +1 -1
  252. package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
  253. package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
  254. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  255. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  256. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  257. package/dist/components/SmartLink/SmartButton.js.map +1 -1
  258. package/dist/components/SmartLink/SmartLink.js.map +1 -1
  259. package/dist/components/SourceAppImage.js.map +1 -1
  260. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  261. package/dist/components/StatisticsPlot.js.map +1 -1
  262. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  263. package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
  264. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  265. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  266. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  267. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  268. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  269. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  270. package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
  271. package/dist/components/SynapseForm/SynapseForm.js +4 -2
  272. package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
  273. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  274. package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
  275. package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
  276. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  277. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  278. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  279. package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
  280. package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
  281. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
  282. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  283. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
  284. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  285. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  286. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
  287. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  288. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  289. package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
  290. package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
  291. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  292. package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
  293. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  294. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  295. package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
  296. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  297. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  298. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  299. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
  300. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  301. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
  302. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
  303. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  304. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  305. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  306. package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
  307. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  308. package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
  309. package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
  310. package/dist/components/TanStackTable/ColumnHeader.js +8 -8
  311. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  312. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  313. package/dist/components/TanStackTable/TableBody.js.map +1 -1
  314. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  315. package/dist/components/TextField/TextField.js.map +1 -1
  316. package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
  317. package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
  318. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  319. package/dist/components/UserCard/Avatar.js.map +1 -1
  320. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  321. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
  322. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  323. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  324. package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
  325. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  326. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  327. package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
  328. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  329. package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
  330. package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
  331. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  332. package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
  333. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  334. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  335. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  336. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  337. package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
  338. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  339. package/dist/components/error/ErrorPage.js.map +1 -1
  340. package/dist/components/favorites/FavoritesPage.js.map +1 -1
  341. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  342. package/dist/components/layout/SWCHeader.d.ts +9 -0
  343. package/dist/components/layout/SWCHeader.d.ts.map +1 -0
  344. package/dist/components/layout/SWCHeader.js +19 -0
  345. package/dist/components/layout/SWCHeader.js.map +1 -0
  346. package/dist/components/layout/SWCPageLayout.d.ts +9 -0
  347. package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
  348. package/dist/components/layout/SWCPageLayout.js +14 -0
  349. package/dist/components/layout/SWCPageLayout.js.map +1 -0
  350. package/dist/components/menu/ComplexMenu.js.map +1 -1
  351. package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
  352. package/dist/components/styled/StyledPopover.js.map +1 -1
  353. package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
  354. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  355. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  356. package/dist/components/trash/TrashCanList.js.map +1 -1
  357. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  358. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  359. package/dist/components/widgets/SynapseVideo.js.map +1 -1
  360. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  361. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  362. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  363. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  364. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
  365. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  366. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  367. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  368. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  369. package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
  370. package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
  371. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  372. package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
  373. package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
  374. package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
  375. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
  376. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
  377. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
  378. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
  379. package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
  380. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
  381. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
  382. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
  383. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
  384. package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
  385. package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
  386. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
  387. package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
  388. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
  389. package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
  390. package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
  391. package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
  392. package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
  393. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
  394. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
  395. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
  396. package/dist/features/curator/dashboard/components/shared.css +1 -0
  397. package/dist/features/curator/dashboard/components/shared.module.js +5 -0
  398. package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
  399. package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
  400. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
  401. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  402. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
  403. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  404. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  405. package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
  406. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  407. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  408. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
  409. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  410. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
  411. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
  412. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
  413. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
  414. package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
  415. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
  416. package/dist/features/entity/metadata-task/utils/constants.js +6 -0
  417. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
  418. package/dist/mocks/challenge/mockChallenge.js.map +1 -1
  419. package/dist/mocks/entity/mockDataset.js.map +1 -1
  420. package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
  421. package/dist/mocks/entity/mockFileEntity.js.map +1 -1
  422. package/dist/mocks/entity/mockFileView.js.map +1 -1
  423. package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
  424. package/dist/mocks/entity/mockProject.js.map +1 -1
  425. package/dist/mocks/entity/mockProjectView.js.map +1 -1
  426. package/dist/mocks/entity/mockRootEntity.js.map +1 -1
  427. package/dist/mocks/entity/mockTableEntity.js.map +1 -1
  428. package/dist/mocks/mockWiki.js.map +1 -1
  429. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  430. package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
  431. package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
  432. package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
  433. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  434. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  435. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  436. package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
  437. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  438. package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
  439. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  440. package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
  441. package/dist/mocks/provenance/mockActivity.js.map +1 -1
  442. package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
  443. package/dist/ror-client/index.js.map +1 -1
  444. package/dist/style/components/_cards.scss +4 -0
  445. package/dist/style/components/_data-grid-extra.css +1 -1
  446. package/dist/style/components/_data-grid-extra.scss +2 -0
  447. package/dist/style/main.css +1 -1
  448. package/dist/synapse-client/HttpClient.js.map +1 -1
  449. package/dist/synapse-client/SynapseClient.js.map +1 -1
  450. package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
  451. package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
  452. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
  453. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  454. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  455. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  456. package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
  457. package/dist/synapse-queries/doi/useDOI.js.map +1 -1
  458. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  459. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  460. package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
  461. package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
  462. package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
  463. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  464. package/dist/synapse-queries/entity/useSchema.js.map +1 -1
  465. package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
  466. package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
  467. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  468. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  469. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  470. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
  471. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
  472. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  473. package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
  474. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  475. package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
  476. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  477. package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
  478. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  479. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  480. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  481. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  482. package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
  483. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  484. package/dist/theme/ThemeProvider.js.map +1 -1
  485. package/dist/tsconfig.build.tsbuildinfo +1 -1
  486. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  487. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  488. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  489. package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
  490. package/dist/utils/context/SynapseContext.js.map +1 -1
  491. package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
  492. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  493. package/dist/utils/functions/AccessControlListUtils.js +12 -1
  494. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  495. package/dist/utils/functions/GridApiUtils.js.map +1 -1
  496. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  497. package/dist/utils/functions/RealmUtils.d.ts +4 -0
  498. package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
  499. package/dist/utils/functions/RealmUtils.js +9 -3
  500. package/dist/utils/functions/RealmUtils.js.map +1 -1
  501. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  502. package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
  503. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  504. package/dist/utils/functions/StringUtils.js.map +1 -1
  505. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  506. package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
  507. package/dist/utils/functions/getEndpoint.js.map +1 -1
  508. package/dist/utils/functions/getUserData.js.map +1 -1
  509. package/dist/utils/functions/queryUtils.js.map +1 -1
  510. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  511. package/dist/utils/hooks/useConfirmItems.js.map +1 -1
  512. package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
  513. package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
  514. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  515. package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
  516. package/dist/utils/hooks/useGetGoalData.js.map +1 -1
  517. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  518. package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
  519. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  520. package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
  521. package/dist/utils/hooks/useIsBot.js.map +1 -1
  522. package/dist/utils/hooks/useListState.js.map +1 -1
  523. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  524. package/dist/utils/hooks/useLogin.js +53 -52
  525. package/dist/utils/hooks/useLogin.js.map +1 -1
  526. package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
  527. package/dist/utils/hooks/useOverlay.js.map +1 -1
  528. package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
  529. package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
  530. package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
  531. package/dist/utils/hooks/useSet.js.map +1 -1
  532. package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
  533. package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
  534. package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
  535. package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
  536. package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
  537. package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
  538. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
  539. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
  540. package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
  541. package/dist/utils/html/TargetEnum.js.map +1 -1
  542. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  543. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadListTable.js","names":[],"sources":["../../../src/components/DownloadCart/DownloadListTable.tsx"],"sourcesContent":["import {\n useGetAvailableFilesToDownloadInfinite,\n useRemoveFilesFromDownloadList,\n} from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Button, Tooltip, Typography } from '@mui/material'\nimport {\n AvailableFilter,\n DownloadListItem,\n DownloadListItemResult,\n Sort,\n SortField,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n Row,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { InteractiveCopyIdsIcon } from '../InteractiveCopyIdsIcon'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { SkeletonTable } from '../Skeleton'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { displayToast } from '../ToastMessage'\nimport DirectProgrammaticDownload from './DirectProgrammaticDownload'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport const TESTING_TRASH_BTN_CLASS = 'TESTING_TRASH_BTN_CLASS'\n\nfunction notifyRemovedFromDownloadList(\n notificationTitle: string,\n fileName: string,\n) {\n displayToast(`${fileName} has been removed from your list.`, 'success', {\n title: notificationTitle,\n })\n}\n\nfunction RemoveFromDownloadListButton(props: {\n ctx: CellContext<DownloadListItemResult, any>\n}) {\n const { ctx } = props\n const { mutateAsync: removeFileFromDownloadList, isPending } =\n useRemoveFilesFromDownloadList({\n onSuccess: () =>\n displayToast(\n `${ctx.row.original.fileName} has been removed from your list.`,\n 'success',\n {\n title: 'File Removed',\n },\n ),\n })\n\n return (\n <Tooltip\n title=\"Remove from Download List\"\n placement=\"left\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <span className=\"removeItem\">\n <button\n className={TESTING_TRASH_BTN_CLASS}\n onClick={() => {\n void removeFileFromDownloadList({\n batchToRemove: [\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ],\n })\n }}\n >\n {isPending ? <SynapseSpinner /> : <IconSvg icon=\"removeCircle\" />}\n </button>\n </span>\n </Tooltip>\n )\n}\n\nconst columnHelper = createColumnHelper<DownloadListItemResult>()\nconst getColumns = (args: {\n removeItem: (item: DownloadListItem, fileName: string, title: string) => void\n onCopySynIds: () => void\n}) => {\n const { onCopySynIds, removeItem } = args\n return [\n columnHelper.accessor('isEligibleForPackaging', {\n header: () => <></>,\n cell: ctx => (\n <div>\n {!ctx.getValue() && (\n <Tooltip\n title={\n <>\n This file can’t be packaged as a ZIP because it is {'>'}\n 100MB, or it is an external link, or it is not stored on\n Synapse native storage.\n <br />\n Try clicking the “download” icon at the end of the row, or\n download programmatically.\n </>\n }\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"right\"\n >\n <span className=\"ineligibileIcon\">\n <IconSvg wrap={false} icon=\"unpackagableFile\" />\n </span>\n </Tooltip>\n )}\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 50,\n }),\n columnHelper.accessor('fileName', {\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: ctx => (\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.fileEntityId}.${ctx.row.original.versionNumber}`}\n >\n {ctx.getValue()}\n </a>\n ),\n enableColumnFilter: false,\n size: 360,\n }),\n columnHelper.accessor('fileSizeBytes', {\n header: props => <ColumnHeader {...props} title={'Size'} />,\n cell: ctx =>\n ctx.getValue() != null && ctx.getValue() > 0 ? (\n calculateFriendlyFileSize(ctx.getValue())\n ) : (\n <Typography variant=\"smallText1\" sx={{ color: 'grey.600' }}>\n Unknown\n </Typography>\n ),\n enableColumnFilter: false,\n size: 117,\n }),\n columnHelper.accessor('fileEntityId', {\n header: props => (\n <ColumnHeader\n {...props}\n title={'SynID'}\n additionalButtons={\n <InteractiveCopyIdsIcon size={'small'} onCopy={onCopySynIds} />\n }\n />\n ),\n cell: ctx => `${ctx.getValue()}.${ctx.row.original.versionNumber}`,\n enableColumnFilter: false,\n size: 143,\n }),\n columnHelper.accessor('addedOn', {\n header: props => <ColumnHeader {...props} title={'Added On'} />,\n cell: ctx => formatDate(dayjs(ctx.getValue())),\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('projectName', {\n header: props => <ColumnHeader {...props} title={'Project'} />,\n enableColumnFilter: false,\n size: 170,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ctx => (\n <div className=\"actionsContainer\">\n <span className=\"downloadItem\">\n <FileEntityDirectDownload\n entityId={ctx.row.original.fileEntityId}\n entityVersionNumber={ctx.row.original.versionNumber}\n displayFileName={false}\n onClickCallback={(isExternalLink: boolean) => {\n // SWC-5944: remove the item from the download list, unless it's an external link.\n if (!isExternalLink) {\n removeItem(\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ctx.row.original.fileName,\n 'File Downloaded',\n )\n }\n }}\n />\n </span>\n <span className=\"programmaticAccessItem\">\n <DirectProgrammaticDownload\n entityId={ctx.row.original.fileEntityId}\n version={ctx.row.original.versionNumber}\n />\n </span>\n <RemoveFromDownloadListButton ctx={ctx} />\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 140,\n meta: {\n textAlign: 'center',\n },\n }),\n ]\n}\n\nfunction getSortApiRequestFromTableSortState(\n sortingState: SortingState,\n): Sort | undefined {\n if (sortingState.length === 0) {\n return undefined\n }\n const sort = sortingState[0]\n let field: SortField = 'addedOn'\n\n if (sort.id === 'fileName') {\n field = 'fileName'\n } else if (sort.id === 'fileSizeBytes') {\n field = 'fileSize'\n } else if (sort.id === 'fileEntityId') {\n field = 'synId'\n } else if (sort.id === 'projectName') {\n field = 'projectName'\n } else if (sort.id === 'addedOn') {\n field = 'addedOn'\n } else if (sort.id === 'createdBy') {\n field = 'createdBy'\n } else if (sort.id === 'createdOn') {\n field = 'createdOn'\n }\n\n return {\n field,\n direction: sort.desc ? 'DESC' : 'ASC',\n }\n}\n\nexport default function DownloadListTable({\n filter,\n}: {\n filter?: AvailableFilter\n}) {\n const handleError = useErrorHandler()\n\n const [copyingAllSynapseIDs, setCopyingAllSynapseIDs] =\n useState<boolean>(false)\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'addedOn',\n },\n ])\n\n const {\n data,\n status,\n isFetchingNextPage,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isError,\n error: newError,\n } = useGetAvailableFilesToDownloadInfinite(\n getSortApiRequestFromTableSortState(tableSortState),\n filter,\n )\n\n useEffect(() => {\n if (isError && newError) {\n handleError(newError)\n }\n }, [isError, newError, handleError])\n\n const { mutateAsync: removeFileFromDownloadList } =\n useRemoveFilesFromDownloadList()\n\n const removeItem = useCallback(\n async (\n item: DownloadListItem,\n fileName: string,\n notificationTitle: string,\n ) => {\n await removeFileFromDownloadList({ batchToRemove: [item] })\n notifyRemovedFromDownloadList(notificationTitle, fileName)\n },\n [removeFileFromDownloadList],\n )\n\n const allRows = useMemo(\n () => data?.pages.flatMap(page => page.page) ?? [],\n [data?.pages],\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n removeItem: (...args) => {\n void removeItem(...args)\n },\n onCopySynIds: () => {\n // trigger loading all pages of the download list table, and then copy all IDs to the clipboard\n setCopyingAllSynapseIDs(true)\n },\n }),\n [removeItem],\n )\n\n const table = useReactTable<DownloadListItemResult>({\n data: allRows,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n onSortingChange: setTableSortState,\n state: {\n columnPinning: {\n right: ['actions'],\n },\n sorting: tableSortState,\n },\n columnResizeMode: 'onChange',\n meta: {\n getRowClassNames(row: Row<DownloadListItemResult>) {\n if (!row.original.isEligibleForPackaging) {\n return 'ineligibleForPackaging'\n }\n return ''\n },\n },\n })\n\n useEffect(() => {\n const copyAllSynapseIDs = () => {\n const synIDs = allRows\n .map((item: DownloadListItemResult) => {\n return `${item.fileEntityId}.${item.versionNumber}`\n })\n .join('\\n')\n copyStringToClipboard(synIDs).then(() => {\n displayToast('Successfully copied to clipboard')\n })\n setCopyingAllSynapseIDs(false)\n }\n\n if (\n status === 'success' &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage &&\n copyingAllSynapseIDs\n ) {\n void fetchNextPage()\n } else if (!hasNextPage && copyingAllSynapseIDs) {\n // We have all the data in allRows. Put it together and copy to the clipboard\n copyAllSynapseIDs()\n }\n }, [\n status,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n copyingAllSynapseIDs,\n allRows,\n ])\n\n return (\n <div>\n <BlockingLoader show={copyingAllSynapseIDs} />\n {allRows.length > 0 && (\n <div className=\"DownloadListTableV2\">\n {/* TODO: This table can be very large, so it should be refactored to use row virtualization or discrete pagination */}\n <StyledTanStackTable table={table} fullWidth={false} />\n {hasNextPage && (\n <Box sx={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n variant={'contained'}\n sx={{ my: 2, ml: 'auto' }}\n onClick={() => {\n void fetchNextPage()\n }}\n disabled={isFetchingNextPage}\n startIcon={isFetchingNextPage ? <SynapseSpinner /> : undefined}\n >\n {isFetchingNextPage ? 'Loading...' : 'Show More'}\n </Button>\n </Box>\n )}\n </div>\n )}\n {allRows.length === 0 && !isLoading && (\n <Typography variant=\"body1Italic\">\n You have no matching files in your download list.\n </Typography>\n )}\n {isLoading && <SkeletonTable numCols={5} numRows={3} />}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DownloadListTable.js","names":[],"sources":["../../../src/components/DownloadCart/DownloadListTable.tsx"],"sourcesContent":["import {\n useGetAvailableFilesToDownloadInfinite,\n useRemoveFilesFromDownloadList,\n} from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Button, Tooltip, Typography } from '@mui/material'\nimport {\n AvailableFilter,\n DownloadListItem,\n DownloadListItemResult,\n Sort,\n SortField,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n Row,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { InteractiveCopyIdsIcon } from '../InteractiveCopyIdsIcon'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { SkeletonTable } from '../Skeleton'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { displayToast } from '../ToastMessage'\nimport DirectProgrammaticDownload from './DirectProgrammaticDownload'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport const TESTING_TRASH_BTN_CLASS = 'TESTING_TRASH_BTN_CLASS'\n\nfunction notifyRemovedFromDownloadList(\n notificationTitle: string,\n fileName: string,\n) {\n displayToast(`${fileName} has been removed from your list.`, 'success', {\n title: notificationTitle,\n })\n}\n\nfunction RemoveFromDownloadListButton(props: {\n ctx: CellContext<DownloadListItemResult, any>\n}) {\n const { ctx } = props\n const { mutateAsync: removeFileFromDownloadList, isPending } =\n useRemoveFilesFromDownloadList({\n onSuccess: () =>\n displayToast(\n `${ctx.row.original.fileName} has been removed from your list.`,\n 'success',\n {\n title: 'File Removed',\n },\n ),\n })\n\n return (\n <Tooltip\n title=\"Remove from Download List\"\n placement=\"left\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <span className=\"removeItem\">\n <button\n className={TESTING_TRASH_BTN_CLASS}\n onClick={() => {\n void removeFileFromDownloadList({\n batchToRemove: [\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ],\n })\n }}\n >\n {isPending ? <SynapseSpinner /> : <IconSvg icon=\"removeCircle\" />}\n </button>\n </span>\n </Tooltip>\n )\n}\n\nconst columnHelper = createColumnHelper<DownloadListItemResult>()\nconst getColumns = (args: {\n removeItem: (item: DownloadListItem, fileName: string, title: string) => void\n onCopySynIds: () => void\n}) => {\n const { onCopySynIds, removeItem } = args\n return [\n columnHelper.accessor('isEligibleForPackaging', {\n header: () => <></>,\n cell: ctx => (\n <div>\n {!ctx.getValue() && (\n <Tooltip\n title={\n <>\n This file can’t be packaged as a ZIP because it is {'>'}\n 100MB, or it is an external link, or it is not stored on\n Synapse native storage.\n <br />\n Try clicking the “download” icon at the end of the row, or\n download programmatically.\n </>\n }\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"right\"\n >\n <span className=\"ineligibileIcon\">\n <IconSvg wrap={false} icon=\"unpackagableFile\" />\n </span>\n </Tooltip>\n )}\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 50,\n }),\n columnHelper.accessor('fileName', {\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: ctx => (\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.fileEntityId}.${ctx.row.original.versionNumber}`}\n >\n {ctx.getValue()}\n </a>\n ),\n enableColumnFilter: false,\n size: 360,\n }),\n columnHelper.accessor('fileSizeBytes', {\n header: props => <ColumnHeader {...props} title={'Size'} />,\n cell: ctx =>\n ctx.getValue() != null && ctx.getValue() > 0 ? (\n calculateFriendlyFileSize(ctx.getValue())\n ) : (\n <Typography variant=\"smallText1\" sx={{ color: 'grey.600' }}>\n Unknown\n </Typography>\n ),\n enableColumnFilter: false,\n size: 117,\n }),\n columnHelper.accessor('fileEntityId', {\n header: props => (\n <ColumnHeader\n {...props}\n title={'SynID'}\n additionalButtons={\n <InteractiveCopyIdsIcon size={'small'} onCopy={onCopySynIds} />\n }\n />\n ),\n cell: ctx => `${ctx.getValue()}.${ctx.row.original.versionNumber}`,\n enableColumnFilter: false,\n size: 143,\n }),\n columnHelper.accessor('addedOn', {\n header: props => <ColumnHeader {...props} title={'Added On'} />,\n cell: ctx => formatDate(dayjs(ctx.getValue())),\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('projectName', {\n header: props => <ColumnHeader {...props} title={'Project'} />,\n enableColumnFilter: false,\n size: 170,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ctx => (\n <div className=\"actionsContainer\">\n <span className=\"downloadItem\">\n <FileEntityDirectDownload\n entityId={ctx.row.original.fileEntityId}\n entityVersionNumber={ctx.row.original.versionNumber}\n displayFileName={false}\n onClickCallback={(isExternalLink: boolean) => {\n // SWC-5944: remove the item from the download list, unless it's an external link.\n if (!isExternalLink) {\n removeItem(\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ctx.row.original.fileName,\n 'File Downloaded',\n )\n }\n }}\n />\n </span>\n <span className=\"programmaticAccessItem\">\n <DirectProgrammaticDownload\n entityId={ctx.row.original.fileEntityId}\n version={ctx.row.original.versionNumber}\n />\n </span>\n <RemoveFromDownloadListButton ctx={ctx} />\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 140,\n meta: {\n textAlign: 'center',\n },\n }),\n ]\n}\n\nfunction getSortApiRequestFromTableSortState(\n sortingState: SortingState,\n): Sort | undefined {\n if (sortingState.length === 0) {\n return undefined\n }\n const sort = sortingState[0]\n let field: SortField = 'addedOn'\n\n if (sort.id === 'fileName') {\n field = 'fileName'\n } else if (sort.id === 'fileSizeBytes') {\n field = 'fileSize'\n } else if (sort.id === 'fileEntityId') {\n field = 'synId'\n } else if (sort.id === 'projectName') {\n field = 'projectName'\n } else if (sort.id === 'addedOn') {\n field = 'addedOn'\n } else if (sort.id === 'createdBy') {\n field = 'createdBy'\n } else if (sort.id === 'createdOn') {\n field = 'createdOn'\n }\n\n return {\n field,\n direction: sort.desc ? 'DESC' : 'ASC',\n }\n}\n\nexport default function DownloadListTable({\n filter,\n}: {\n filter?: AvailableFilter\n}) {\n const handleError = useErrorHandler()\n\n const [copyingAllSynapseIDs, setCopyingAllSynapseIDs] =\n useState<boolean>(false)\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'addedOn',\n },\n ])\n\n const {\n data,\n status,\n isFetchingNextPage,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isError,\n error: newError,\n } = useGetAvailableFilesToDownloadInfinite(\n getSortApiRequestFromTableSortState(tableSortState),\n filter,\n )\n\n useEffect(() => {\n if (isError && newError) {\n handleError(newError)\n }\n }, [isError, newError, handleError])\n\n const { mutateAsync: removeFileFromDownloadList } =\n useRemoveFilesFromDownloadList()\n\n const removeItem = useCallback(\n async (\n item: DownloadListItem,\n fileName: string,\n notificationTitle: string,\n ) => {\n await removeFileFromDownloadList({ batchToRemove: [item] })\n notifyRemovedFromDownloadList(notificationTitle, fileName)\n },\n [removeFileFromDownloadList],\n )\n\n const allRows = useMemo(\n () => data?.pages.flatMap(page => page.page) ?? [],\n [data?.pages],\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n removeItem: (...args) => {\n void removeItem(...args)\n },\n onCopySynIds: () => {\n // trigger loading all pages of the download list table, and then copy all IDs to the clipboard\n setCopyingAllSynapseIDs(true)\n },\n }),\n [removeItem],\n )\n\n const table = useReactTable<DownloadListItemResult>({\n data: allRows,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n onSortingChange: setTableSortState,\n state: {\n columnPinning: {\n right: ['actions'],\n },\n sorting: tableSortState,\n },\n columnResizeMode: 'onChange',\n meta: {\n getRowClassNames(row: Row<DownloadListItemResult>) {\n if (!row.original.isEligibleForPackaging) {\n return 'ineligibleForPackaging'\n }\n return ''\n },\n },\n })\n\n useEffect(() => {\n const copyAllSynapseIDs = () => {\n const synIDs = allRows\n .map((item: DownloadListItemResult) => {\n return `${item.fileEntityId}.${item.versionNumber}`\n })\n .join('\\n')\n copyStringToClipboard(synIDs).then(() => {\n displayToast('Successfully copied to clipboard')\n })\n setCopyingAllSynapseIDs(false)\n }\n\n if (\n status === 'success' &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage &&\n copyingAllSynapseIDs\n ) {\n void fetchNextPage()\n } else if (!hasNextPage && copyingAllSynapseIDs) {\n // We have all the data in allRows. Put it together and copy to the clipboard\n copyAllSynapseIDs()\n }\n }, [\n status,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n copyingAllSynapseIDs,\n allRows,\n ])\n\n return (\n <div>\n <BlockingLoader show={copyingAllSynapseIDs} />\n {allRows.length > 0 && (\n <div className=\"DownloadListTableV2\">\n {/* TODO: This table can be very large, so it should be refactored to use row virtualization or discrete pagination */}\n <StyledTanStackTable table={table} fullWidth={false} />\n {hasNextPage && (\n <Box sx={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n variant={'contained'}\n sx={{ my: 2, ml: 'auto' }}\n onClick={() => {\n void fetchNextPage()\n }}\n disabled={isFetchingNextPage}\n startIcon={isFetchingNextPage ? <SynapseSpinner /> : undefined}\n >\n {isFetchingNextPage ? 'Loading...' : 'Show More'}\n </Button>\n </Box>\n )}\n </div>\n )}\n {allRows.length === 0 && !isLoading && (\n <Typography variant=\"body1Italic\">\n You have no matching files in your download list.\n </Typography>\n )}\n {isLoading && <SkeletonTable numCols={5} numRows={3} />}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileNameUtils.js","names":[],"sources":["../../../src/components/DownloadCart/fileNameUtils.ts"],"sourcesContent":["import {\n FileResult,\n DownloadListItemResult,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Gets a filename from a file result, falling back to the original item's filename\n * or a default generated name if neither is available.\n *\n * @param fileResult - The file result containing file handle information\n * @param originalItem - The original download list item result\n * @param fallbackFileHandleId - The file handle ID to use for the default name\n * @returns The resolved filename\n */\nexport function getFileName(\n fileResult: FileResult,\n originalItem?: DownloadListItemResult,\n): string {\n return (\n fileResult.fileHandle?.fileName ||\n originalItem?.fileName ||\n `file-${fileResult.fileHandleId}`\n )\n}\n\n/**\n * Handles filename collisions by appending a counter suffix to the filename.\n * If the filename has already been used, adds \" (N)\" before the extension.\n *\n * @param fileName - The original filename\n * @param usedFilenames - Map tracking filename usage counts\n * @returns The deduplicated filename\n */\nexport function deduplicateFileName(\n fileName: string,\n usedFilenames: Map<string, number>,\n): string {\n if (usedFilenames.has(fileName)) {\n const count = usedFilenames.get(fileName)! + 1\n usedFilenames.set(fileName, count)\n\n // Split filename into base and extension\n const lastDotIndex = fileName.lastIndexOf('.')\n if (lastDotIndex > 0) {\n const baseName = fileName.substring(0, lastDotIndex)\n const extension = fileName.substring(lastDotIndex)\n return `${baseName} (${count})${extension}`\n } else {\n return `${fileName} (${count})`\n }\n } else {\n usedFilenames.set(fileName, 0)\n return fileName\n }\n}\n"],"mappings":";AAcA,SAAgB,EACd,GACA,GACQ;AACR,QACE,EAAW,YAAY,YACvB,GAAc,YACd,QAAQ,EAAW;;AAYvB,SAAgB,EACd,GACA,GACQ;AACR,KAAI,EAAc,IAAI,EAAS,EAAE;EAC/B,IAAM,IAAQ,EAAc,IAAI,EAAS,GAAI;AAC7C,IAAc,IAAI,GAAU,EAAM;EAGlC,IAAM,IAAe,EAAS,YAAY,IAAI;AAM5C,SALE,IAAe,IAGV,GAFU,EAAS,UAAU,GAAG,EAAa,CAEjC,IAAI,EAAM,GADX,EAAS,UAAU,EAAa,KAG3C,GAAG,EAAS,IAAI,EAAM;OAI/B,QADA,EAAc,IAAI,GAAU,EAAE,EACvB"}
1
+ {"version":3,"file":"fileNameUtils.js","names":[],"sources":["../../../src/components/DownloadCart/fileNameUtils.ts"],"sourcesContent":["import {\n FileResult,\n DownloadListItemResult,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Gets a filename from a file result, falling back to the original item's filename\n * or a default generated name if neither is available.\n *\n * @param fileResult - The file result containing file handle information\n * @param originalItem - The original download list item result\n * @param fallbackFileHandleId - The file handle ID to use for the default name\n * @returns The resolved filename\n */\nexport function getFileName(\n fileResult: FileResult,\n originalItem?: DownloadListItemResult,\n): string {\n return (\n fileResult.fileHandle?.fileName ||\n originalItem?.fileName ||\n `file-${fileResult.fileHandleId}`\n )\n}\n\n/**\n * Handles filename collisions by appending a counter suffix to the filename.\n * If the filename has already been used, adds \" (N)\" before the extension.\n *\n * @param fileName - The original filename\n * @param usedFilenames - Map tracking filename usage counts\n * @returns The deduplicated filename\n */\nexport function deduplicateFileName(\n fileName: string,\n usedFilenames: Map<string, number>,\n): string {\n if (usedFilenames.has(fileName)) {\n const count = usedFilenames.get(fileName)! + 1\n usedFilenames.set(fileName, count)\n\n // Split filename into base and extension\n const lastDotIndex = fileName.lastIndexOf('.')\n if (lastDotIndex > 0) {\n const baseName = fileName.substring(0, lastDotIndex)\n const extension = fileName.substring(lastDotIndex)\n return `${baseName} (${count})${extension}`\n } else {\n return `${fileName} (${count})`\n }\n } else {\n usedFilenames.set(fileName, 0)\n return fileName\n }\n}\n"],"mappings":";AAcA,SAAgB,EACd,GACA,GACQ;AACR,QACE,EAAW,YAAY,YACvB,GAAc,YACd,QAAQ,EAAW;;AAYvB,SAAgB,EACd,GACA,GACQ;AACR,KAAI,EAAc,IAAI,EAAS,EAAE;EAC/B,IAAM,IAAQ,EAAc,IAAI,EAAS,GAAI;AAC7C,IAAc,IAAI,GAAU,EAAM;EAGlC,IAAM,IAAe,EAAS,YAAY,IAAI;AAM5C,SALE,IAAe,IAGV,GAFU,EAAS,UAAU,GAAG,EAE7B,CAAS,IAAI,EAAM,GADX,EAAS,UAAU,EACL,KAEzB,GAAG,EAAS,IAAI,EAAM;OAI/B,QADA,EAAc,IAAI,GAAU,EAAE,EACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableDialog.js","names":[],"sources":["../../../src/components/DraggableDialog/DraggableDialog.tsx"],"sourcesContent":["import Draggable, { DraggableBounds } from 'react-draggable'\nimport {\n Box,\n IconButton,\n Paper,\n Stack,\n Typography,\n Divider,\n useMediaQuery,\n useTheme,\n DialogContent,\n} from '@mui/material'\nimport CloseIcon from '@mui/icons-material/Close'\nimport { useRef, ReactNode, useEffect, useState } from 'react'\nimport { useResizable } from '../ResizableContainer/hooks/useResizable'\nimport { ResizableContainer } from '../ResizableContainer/ResizableContainer'\n\ntype DraggableDialogProps = {\n open?: boolean\n onClose?: () => void\n children: ReactNode\n title?: ReactNode\n}\n\nexport default function DraggableDialog({\n open = false,\n onClose,\n title,\n children,\n}: DraggableDialogProps) {\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'))\n const draggableRef = useRef<HTMLDivElement>(null)\n const [bounds, setBounds] = useState<DraggableBounds>()\n const [position, setPosition] = useState({ x: 100, y: 100 })\n const { width, height, handleResizeStart } = useResizable({\n initialWidth: 600,\n initialHeight: 500,\n minWidth: 300,\n minHeight: 200,\n maxWidth: 1200,\n maxHeight: 800,\n })\n\n useEffect(() => {\n // Calculate draggable bounds to keep dialog within viewport with margin\n function updateBounds() {\n const margin = 100\n const dialogWidth = width\n\n const newBounds = {\n left: -(dialogWidth - margin),\n top: 0,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n }\n\n setBounds(newBounds)\n\n // Clamp dialog position to new bounds to keep it visible after window resize\n setPosition(prevPosition => ({\n x: Math.max(newBounds.left, Math.min(prevPosition.x, newBounds.right)),\n y: Math.max(newBounds.top, Math.min(prevPosition.y, newBounds.bottom)),\n }))\n }\n updateBounds()\n window.addEventListener('resize', updateBounds)\n return () => window.removeEventListener('resize', updateBounds)\n }, [width, height])\n\n if (!open) {\n return null\n }\n\n const paperContent = (\n <Paper\n elevation={5}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: isMobile ? '95vh' : `${height}px`,\n width: isMobile ? '95vw' : `${width}px`,\n ...(isMobile && {\n position: 'fixed',\n }),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n gap=\"5px\"\n className=\"drag-handle\"\n sx={{\n padding: '20px',\n cursor: 'move',\n }}\n >\n <Typography variant=\"headline1\">{title}</Typography>\n <Box sx={{ flexGrow: 1 }} />\n <IconButton onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </Stack>\n <Divider sx={{ mx: 2 }} />\n <DialogContent\n sx={{\n height: '100%',\n maxWidth: '100%',\n padding: '16px',\n }}\n >\n {children}\n </DialogContent>\n </Paper>\n )\n\n return (\n <Box\n sx={{\n position: 'fixed',\n zIndex: 1000,\n top: 0,\n left: 0,\n pointerEvents: isMobile ? 'auto' : 'none',\n }}\n >\n {isMobile ? (\n paperContent\n ) : (\n <Draggable\n position={position}\n onDrag={(e, data) => setPosition({ x: data.x, y: data.y })}\n nodeRef={draggableRef}\n bounds={bounds}\n handle=\".drag-handle\"\n >\n <Box ref={draggableRef} sx={{ pointerEvents: 'auto' }}>\n <ResizableContainer\n width={width}\n height={height}\n onResizeStart={handleResizeStart}\n >\n {paperContent}\n </ResizableContainer>\n </Box>\n </Draggable>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;AAwBA,SAAwB,EAAgB,EACtC,UAAO,IACP,YACA,UACA,eACuB;CAEvB,IAAM,IAAW,EADH,GAAU,CACa,YAAY,KAAK,KAAK,CAAC,EACtD,IAAe,EAAuB,KAAK,EAC3C,CAAC,GAAQ,KAAa,GAA2B,EACjD,CAAC,GAAU,KAAe,EAAS;EAAE,GAAG;EAAK,GAAG;EAAK,CAAC,EACtD,EAAE,UAAO,WAAQ,yBAAsB,EAAa;EACxD,cAAc;EACd,eAAe;EACf,UAAU;EACV,WAAW;EACX,UAAU;EACV,WAAW;EACZ,CAAC;AA4BF,KA1BA,QAAgB;EAEd,SAAS,IAAe;GACtB,IAGM,IAAY;IAChB,MAAM,EAHY,IAGI;IACtB,KAAK;IACL,OAAO,OAAO,aAAa;IAC3B,QAAQ,OAAO,cAAc;IAC9B;AAKD,GAHA,EAAU,EAAU,EAGpB,GAAY,OAAiB;IAC3B,GAAG,KAAK,IAAI,EAAU,MAAM,KAAK,IAAI,EAAa,GAAG,EAAU,MAAM,CAAC;IACtE,GAAG,KAAK,IAAI,EAAU,KAAK,KAAK,IAAI,EAAa,GAAG,EAAU,OAAO,CAAC;IACvE,EAAE;;AAIL,SAFA,GAAc,EACd,OAAO,iBAAiB,UAAU,EAAa,QAClC,OAAO,oBAAoB,UAAU,EAAa;IAC9D,CAAC,GAAO,EAAO,CAAC,EAEf,CAAC,EACH,QAAO;CAGT,IAAM,IACJ,kBAAC,GAAD;EACE,WAAW;EACX,IAAI;GACF,SAAS;GACT,eAAe;GACf,QAAQ,IAAW,SAAS,GAAG,EAAO;GACtC,OAAO,IAAW,SAAS,GAAG,EAAM;GACpC,GAAI,KAAY,EACd,UAAU,SACX;GACF;YAVH;GAYE,kBAAC,GAAD;IACE,WAAU;IACV,YAAW;IACX,KAAI;IACJ,WAAU;IACV,IAAI;KACF,SAAS;KACT,QAAQ;KACT;cARH;KAUE,kBAAC,GAAD;MAAY,SAAQ;gBAAa;MAAmB,CAAA;KACpD,kBAAC,GAAD,EAAK,IAAI,EAAE,UAAU,GAAG,EAAI,CAAA;KAC5B,kBAAC,GAAD;MAAY,SAAS;gBACnB,kBAAC,GAAD,EAAa,CAAA;MACF,CAAA;KACP;;GACR,kBAAC,GAAD,EAAS,IAAI,EAAE,IAAI,GAAG,EAAI,CAAA;GAC1B,kBAAC,GAAD;IACE,IAAI;KACF,QAAQ;KACR,UAAU;KACV,SAAS;KACV;IAEA;IACa,CAAA;GACV;;AAGV,QACE,kBAAC,GAAD;EACE,IAAI;GACF,UAAU;GACV,QAAQ;GACR,KAAK;GACL,MAAM;GACN,eAAe,IAAW,SAAS;GACpC;YAEA,IACC,IAEA,kBAAC,GAAD;GACY;GACV,SAAS,GAAG,MAAS,EAAY;IAAE,GAAG,EAAK;IAAG,GAAG,EAAK;IAAG,CAAC;GAC1D,SAAS;GACD;GACR,QAAO;aAEP,kBAAC,GAAD;IAAK,KAAK;IAAc,IAAI,EAAE,eAAe,QAAQ;cACnD,kBAAC,GAAD;KACS;KACC;KACR,eAAe;eAEd;KACkB,CAAA;IACjB,CAAA;GACI,CAAA;EAEV,CAAA"}
1
+ {"version":3,"file":"DraggableDialog.js","names":[],"sources":["../../../src/components/DraggableDialog/DraggableDialog.tsx"],"sourcesContent":["import Draggable, { DraggableBounds } from 'react-draggable'\nimport {\n Box,\n IconButton,\n Paper,\n Stack,\n Typography,\n Divider,\n useMediaQuery,\n useTheme,\n DialogContent,\n} from '@mui/material'\nimport CloseIcon from '@mui/icons-material/Close'\nimport { useRef, ReactNode, useEffect, useState } from 'react'\nimport { useResizable } from '../ResizableContainer/hooks/useResizable'\nimport { ResizableContainer } from '../ResizableContainer/ResizableContainer'\n\ntype DraggableDialogProps = {\n open?: boolean\n onClose?: () => void\n children: ReactNode\n title?: ReactNode\n}\n\nexport default function DraggableDialog({\n open = false,\n onClose,\n title,\n children,\n}: DraggableDialogProps) {\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'))\n const draggableRef = useRef<HTMLDivElement>(null)\n const [bounds, setBounds] = useState<DraggableBounds>()\n const [position, setPosition] = useState({ x: 100, y: 100 })\n const { width, height, handleResizeStart } = useResizable({\n initialWidth: 600,\n initialHeight: 500,\n minWidth: 300,\n minHeight: 200,\n maxWidth: 1200,\n maxHeight: 800,\n })\n\n useEffect(() => {\n // Calculate draggable bounds to keep dialog within viewport with margin\n function updateBounds() {\n const margin = 100\n const dialogWidth = width\n\n const newBounds = {\n left: -(dialogWidth - margin),\n top: 0,\n right: window.innerWidth - margin,\n bottom: window.innerHeight - margin,\n }\n\n setBounds(newBounds)\n\n // Clamp dialog position to new bounds to keep it visible after window resize\n setPosition(prevPosition => ({\n x: Math.max(newBounds.left, Math.min(prevPosition.x, newBounds.right)),\n y: Math.max(newBounds.top, Math.min(prevPosition.y, newBounds.bottom)),\n }))\n }\n updateBounds()\n window.addEventListener('resize', updateBounds)\n return () => window.removeEventListener('resize', updateBounds)\n }, [width, height])\n\n if (!open) {\n return null\n }\n\n const paperContent = (\n <Paper\n elevation={5}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: isMobile ? '95vh' : `${height}px`,\n width: isMobile ? '95vw' : `${width}px`,\n ...(isMobile && {\n position: 'fixed',\n }),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n gap=\"5px\"\n className=\"drag-handle\"\n sx={{\n padding: '20px',\n cursor: 'move',\n }}\n >\n <Typography variant=\"headline1\">{title}</Typography>\n <Box sx={{ flexGrow: 1 }} />\n <IconButton onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </Stack>\n <Divider sx={{ mx: 2 }} />\n <DialogContent\n sx={{\n height: '100%',\n maxWidth: '100%',\n padding: '16px',\n }}\n >\n {children}\n </DialogContent>\n </Paper>\n )\n\n return (\n <Box\n sx={{\n position: 'fixed',\n zIndex: 1000,\n top: 0,\n left: 0,\n pointerEvents: isMobile ? 'auto' : 'none',\n }}\n >\n {isMobile ? (\n paperContent\n ) : (\n <Draggable\n position={position}\n onDrag={(e, data) => setPosition({ x: data.x, y: data.y })}\n nodeRef={draggableRef}\n bounds={bounds}\n handle=\".drag-handle\"\n >\n <Box ref={draggableRef} sx={{ pointerEvents: 'auto' }}>\n <ResizableContainer\n width={width}\n height={height}\n onResizeStart={handleResizeStart}\n >\n {paperContent}\n </ResizableContainer>\n </Box>\n </Draggable>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;AAwBA,SAAwB,EAAgB,EACtC,UAAO,IACP,YACA,UACA,eACuB;CAEvB,IAAM,IAAW,EADH,GACiB,CAAM,YAAY,KAAK,KAAK,CAAC,EACtD,IAAe,EAAuB,KAAK,EAC3C,CAAC,GAAQ,KAAa,GAA2B,EACjD,CAAC,GAAU,KAAe,EAAS;EAAE,GAAG;EAAK,GAAG;EAAK,CAAC,EACtD,EAAE,UAAO,WAAQ,yBAAsB,EAAa;EACxD,cAAc;EACd,eAAe;EACf,UAAU;EACV,WAAW;EACX,UAAU;EACV,WAAW;EACZ,CAAC;AA4BF,KA1BA,QAAgB;EAEd,SAAS,IAAe;GACtB,IAGM,IAAY;IAChB,MAAM,EAAE,IAAc;IACtB,KAAK;IACL,OAAO,OAAO,aAAa;IAC3B,QAAQ,OAAO,cAAc;IAC9B;AAKD,GAHA,EAAU,EAAU,EAGpB,GAAY,OAAiB;IAC3B,GAAG,KAAK,IAAI,EAAU,MAAM,KAAK,IAAI,EAAa,GAAG,EAAU,MAAM,CAAC;IACtE,GAAG,KAAK,IAAI,EAAU,KAAK,KAAK,IAAI,EAAa,GAAG,EAAU,OAAO,CAAC;IACvE,EAAE;;AAIL,SAFA,GAAc,EACd,OAAO,iBAAiB,UAAU,EAAa,QAClC,OAAO,oBAAoB,UAAU,EAAa;IAC9D,CAAC,GAAO,EAAO,CAAC,EAEf,CAAC,EACH,QAAO;CAGT,IAAM,IACJ,kBAAC,GAAD;EACE,WAAW;EACX,IAAI;GACF,SAAS;GACT,eAAe;GACf,QAAQ,IAAW,SAAS,GAAG,EAAO;GACtC,OAAO,IAAW,SAAS,GAAG,EAAM;GACpC,GAAI,KAAY,EACd,UAAU,SACX;GACF;YAVH;GAYE,kBAAC,GAAD;IACE,WAAU;IACV,YAAW;IACX,KAAI;IACJ,WAAU;IACV,IAAI;KACF,SAAS;KACT,QAAQ;KACT;cARH;KAUE,kBAAC,GAAD;MAAY,SAAQ;gBAAa;MAAmB,CAAA;KACpD,kBAAC,GAAD,EAAK,IAAI,EAAE,UAAU,GAAG,EAAI,CAAA;KAC5B,kBAAC,GAAD;MAAY,SAAS;gBACnB,kBAAC,GAAD,EAAa,CAAA;MACF,CAAA;KACP;;GACR,kBAAC,GAAD,EAAS,IAAI,EAAE,IAAI,GAAG,EAAI,CAAA;GAC1B,kBAAC,GAAD;IACE,IAAI;KACF,QAAQ;KACR,UAAU;KACV,SAAS;KACV;IAEA;IACa,CAAA;GACV;;AAGV,QACE,kBAAC,GAAD;EACE,IAAI;GACF,UAAU;GACV,QAAQ;GACR,KAAK;GACL,MAAM;GACN,eAAe,IAAW,SAAS;GACpC;YAEA,IACC,IAEA,kBAAC,GAAD;GACY;GACV,SAAS,GAAG,MAAS,EAAY;IAAE,GAAG,EAAK;IAAG,GAAG,EAAK;IAAG,CAAC;GAC1D,SAAS;GACD;GACR,QAAO;aAEP,kBAAC,GAAD;IAAK,KAAK;IAAc,IAAI,EAAE,eAAe,QAAQ;cACnD,kBAAC,GAAD;KACS;KACC;KACR,eAAe;eAEd;KACkB,CAAA;IACjB,CAAA;GACI,CAAA;EAEV,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicFormModal.js","names":[],"sources":["../../../src/components/DynamicForm/DynamicFormModal.tsx"],"sourcesContent":["import React from 'react'\nimport WideButton from '@/components/styled/WideButton'\nimport { Box } from '@mui/material'\nimport { useState } from 'react'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport DynamicForm, { DynamicFormProps } from './DynamicForm'\n\ntype ModalProps = {\n submitButtonText?: string\n}\n\nexport type DynamicFormModalProps = DynamicFormProps & ModalProps\n\nconst DynamicFormModal = ({\n schemaUrl,\n uiSchemaUrl,\n postUrl,\n submitButtonText,\n}: DynamicFormModalProps): React.ReactNode => {\n const [open, setOpen] = useState(false)\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const form = (\n <DynamicForm\n schemaUrl={schemaUrl}\n uiSchemaUrl={uiSchemaUrl}\n postUrl={postUrl}\n onSubmit={() => {\n handleClose()\n }}\n />\n )\n\n return (\n <div className=\"browse-tools-page\">\n <Box sx={{ margin: '10px 0px 50px 0px' }}>\n <WideButton\n className=\"highlightSubmitToolButton\"\n variant=\"contained\"\n onClick={handleClickOpen}\n >\n {submitButtonText}\n </WideButton>\n <ConfirmationDialog\n open={open}\n title=\"\"\n content={form}\n onCancel={handleClose}\n onConfirm={() => {}}\n confirmButtonProps={{\n sx: { display: 'none' },\n }}\n cancelButtonProps={{\n children: 'cancel',\n }}\n />\n </Box>\n </div>\n )\n}\n\nexport default DynamicFormModal\n"],"mappings":";;;;;;;AAaA,IAAM,KAAoB,EACxB,cACA,gBACA,YACA,0BAC4C;CAC5C,IAAM,CAAC,GAAM,KAAW,EAAS,GAAM,EAEjC,UAAwB;AAC5B,IAAQ,GAAK;IAGT,UAAoB;AACxB,IAAQ,GAAM;;AAchB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAK,IAAI,EAAE,QAAQ,qBAAqB;aAAxC,CACE,kBAAC,GAAD;IACE,WAAU;IACV,SAAQ;IACR,SAAS;cAER;IACU,CAAA,EACb,kBAAC,GAAD;IACQ;IACN,OAAM;IACN,SAvBN,kBAAC,GAAD;KACa;KACE;KACJ;KACT,gBAAgB;AACd,SAAa;;KAEf,CAAA;IAiBI,UAAU;IACV,iBAAiB;IACjB,oBAAoB,EAClB,IAAI,EAAE,SAAS,QAAQ,EACxB;IACD,mBAAmB,EACjB,UAAU,UACX;IACD,CAAA,CACE;;EACF,CAAA"}
1
+ {"version":3,"file":"DynamicFormModal.js","names":[],"sources":["../../../src/components/DynamicForm/DynamicFormModal.tsx"],"sourcesContent":["import React from 'react'\nimport WideButton from '@/components/styled/WideButton'\nimport { Box } from '@mui/material'\nimport { useState } from 'react'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport DynamicForm, { DynamicFormProps } from './DynamicForm'\n\ntype ModalProps = {\n submitButtonText?: string\n}\n\nexport type DynamicFormModalProps = DynamicFormProps & ModalProps\n\nconst DynamicFormModal = ({\n schemaUrl,\n uiSchemaUrl,\n postUrl,\n submitButtonText,\n}: DynamicFormModalProps): React.ReactNode => {\n const [open, setOpen] = useState(false)\n\n const handleClickOpen = () => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n\n const form = (\n <DynamicForm\n schemaUrl={schemaUrl}\n uiSchemaUrl={uiSchemaUrl}\n postUrl={postUrl}\n onSubmit={() => {\n handleClose()\n }}\n />\n )\n\n return (\n <div className=\"browse-tools-page\">\n <Box sx={{ margin: '10px 0px 50px 0px' }}>\n <WideButton\n className=\"highlightSubmitToolButton\"\n variant=\"contained\"\n onClick={handleClickOpen}\n >\n {submitButtonText}\n </WideButton>\n <ConfirmationDialog\n open={open}\n title=\"\"\n content={form}\n onCancel={handleClose}\n onConfirm={() => {}}\n confirmButtonProps={{\n sx: { display: 'none' },\n }}\n cancelButtonProps={{\n children: 'cancel',\n }}\n />\n </Box>\n </div>\n )\n}\n\nexport default DynamicFormModal\n"],"mappings":";;;;;;;AAaA,IAAM,KAAoB,EACxB,cACA,gBACA,YACA,0BAC4C;CAC5C,IAAM,CAAC,GAAM,KAAW,EAAS,GAAM,EAEjC,UAAwB;AAC5B,IAAQ,GAAK;IAGT,UAAoB;AACxB,IAAQ,GAAM;;AAchB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAK,IAAI,EAAE,QAAQ,qBAAqB;aAAxC,CACE,kBAAC,GAAD;IACE,WAAU;IACV,SAAQ;IACR,SAAS;cAER;IACU,CAAA,EACb,kBAAC,GAAD;IACQ;IACN,OAAM;IACN,SAvBN,kBAAC,GAAD;KACa;KACE;KACJ;KACT,gBAAgB;AACd,SAAa;;KAEf,CAgBa;IACT,UAAU;IACV,iBAAiB;IACjB,oBAAoB,EAClB,IAAI,EAAE,SAAS,QAAQ,EACxB;IACD,mBAAmB,EACjB,UAAU,UACX;IACD,CAAA,CACE;;EACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableQueryEcosystem.js","names":[],"sources":["../../../src/components/Ecosystem/TableQueryEcosystem.tsx"],"sourcesContent":["import EcosystemCard from '@/components/Ecosystem/EcosystemCard'\nimport EcosystemSkeleton from '@/components/Ecosystem/EcosystemSkeleton'\nimport { Markdown } from '@/components/Markdown/MarkdownSynapse'\nimport { ImageFileHandle } from '@/components/widgets/ImageFileHandle'\nimport { useGetFullTableQueryResults } from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport {\n getColumnIndex,\n parseEntityIdFromSqlStatement,\n} from '@/utils/functions/index'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { Alert, Stack } from '@mui/material'\nimport {\n FileHandleAssociateType,\n Query,\n Row,\n SelectColumn,\n} from '@sage-bionetworks/synapse-types'\nimport uniq from 'lodash-es/uniq'\nimport { ReactNode } from 'react'\nimport EcosystemLayout from './EcosystemLayout'\n\n/* The column names expected to be found in the table */\nconst COLUMN_NAMES = {\n RESOURCE_CATEGORY: 'resourcecategory',\n RESOURCE_NAME: 'resourcename',\n RESOURCE_DESCRIPTION: 'resourcedescription',\n RESOURCE_URL: 'resourceurl',\n RESOURCE_ICON_IMAGE: 'resourceiconimage',\n}\n\ntype TableQueryEcosystemCardProps = {\n /** The row data to display*/\n row: Row\n /** The headers (select columns) of the table query result */\n headers: SelectColumn[]\n /** The entity ID of the table */\n tableEntityId: string\n}\n\n/**\n * Maps a table query result row to an EcosystemCard.\n */\nfunction TableQueryEcosystemCard(props: TableQueryEcosystemCardProps) {\n const { row, headers, tableEntityId } = props\n const resourceNameColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_NAME,\n headers,\n )!\n const resourceName = row.values[resourceNameColumnIndex]!\n\n const resourceUrlColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_URL,\n headers,\n )!\n const resourceUrl = row.values[resourceUrlColumnIndex]!\n\n const resourceDescriptionColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_DESCRIPTION,\n headers,\n )!\n const resourceDescriptionMarkdown =\n row.values[resourceDescriptionColumnIndex]!\n\n let iconElement: ReactNode = null\n\n const resourceIconImageColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_ICON_IMAGE,\n headers,\n )\n\n if (resourceIconImageColumnIndex) {\n const resourceIconFileHandleId = row.values[resourceIconImageColumnIndex]\n if (resourceIconFileHandleId) {\n iconElement = (\n <ImageFileHandle\n fileHandleAssociation={{\n fileHandleId: resourceIconFileHandleId,\n associateObjectId: tableEntityId,\n associateObjectType: FileHandleAssociateType.TableEntity,\n }}\n />\n )\n }\n }\n\n return (\n <EcosystemCard\n title={resourceName}\n titleUrl={resourceUrl}\n description={<Markdown markdown={resourceDescriptionMarkdown} />}\n image={iconElement}\n />\n )\n}\n\nexport type TableQueryEcosystemProps = {\n /** The Synapse table query to execute to populate the Ecosystem component */\n query: Query\n}\n\n/**\n * The Ecosystem component driven by the results of a Synapse table query.\n * @constructor\n */\nfunction TableQueryEcosystem(props: TableQueryEcosystemProps) {\n const { query } = props\n const tableEntityId = parseEntityIdFromSqlStatement(query.sql)\n const { data, isLoading, error } = useGetFullTableQueryResults({\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: tableEntityId,\n query,\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n })\n\n if (!data?.queryResult) {\n if (isLoading) {\n return <EcosystemSkeleton />\n }\n if (error) {\n return (\n <Alert color={'error'}>\n Error loading Ecosystem data: {error.message}\n </Alert>\n )\n }\n return null\n }\n\n const RESOURCE_CATEGORY_COLUMN_INDEX = getColumnIndex(\n COLUMN_NAMES.RESOURCE_CATEGORY,\n data.queryResult.queryResults.headers,\n )!\n\n // Get the distinct categories\n const categories: string[] = uniq(\n data.queryResult.queryResults.rows\n .map(row => row.values[RESOURCE_CATEGORY_COLUMN_INDEX])\n .filter((s): s is string => !!s), // Remove null values\n )\n\n // Create the content for each category and return it in the expected format for the Ecosystem component\n const config = categories.map(category => {\n const rowsForCategory = data.queryResult!.queryResults.rows.filter(\n row => row.values[RESOURCE_CATEGORY_COLUMN_INDEX] === category,\n )\n\n return {\n title: category,\n content: (\n <Stack>\n {rowsForCategory.map(row => (\n <TableQueryEcosystemCard\n key={row.values.join('-')}\n row={row}\n headers={data.queryResult!.queryResults.headers}\n tableEntityId={tableEntityId}\n />\n ))}\n </Stack>\n ),\n }\n })\n\n return <EcosystemLayout config={config} />\n}\n\nexport default TableQueryEcosystem\n"],"mappings":";;;;;;;;;;;;;;AAsBA,IAAM,IAAe;CACnB,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,cAAc;CACd,qBAAqB;CACtB;AAcD,SAAS,EAAwB,GAAqC;CACpE,IAAM,EAAE,QAAK,YAAS,qBAAkB,GAClC,IAA0B,EAC9B,EAAa,eACb,EACD,EACK,IAAe,EAAI,OAAO,IAE1B,IAAyB,EAC7B,EAAa,cACb,EACD,EACK,IAAc,EAAI,OAAO,IAEzB,IAAiC,EACrC,EAAa,sBACb,EACD,EACK,IACJ,EAAI,OAAO,IAET,IAAyB,MAEvB,IAA+B,EACnC,EAAa,qBACb,EACD;AAED,KAAI,GAA8B;EAChC,IAAM,IAA2B,EAAI,OAAO;AAC5C,EAAI,MACF,IACE,kBAAC,GAAD,EACE,uBAAuB;GACrB,cAAc;GACd,mBAAmB;GACnB,qBAAqB,EAAwB;GAC9C,EACD,CAAA;;AAKR,QACE,kBAAC,GAAD;EACE,OAAO;EACP,UAAU;EACV,aAAa,kBAAC,GAAD,EAAU,UAAU,GAA+B,CAAA;EAChE,OAAO;EACP,CAAA;;AAaN,SAAS,EAAoB,GAAiC;CAC5D,IAAM,EAAE,aAAU,GACZ,IAAgB,EAA8B,EAAM,IAAI,EACxD,EAAE,SAAM,cAAW,aAAU,EAA4B;EAC7D,cAAc;EACd,UAAU;EACV;EACA,UAAA;EACD,CAAC;AAEF,KAAI,CAAC,GAAM,YAWT,QAVI,IACK,kBAAC,GAAD,EAAqB,CAAA,GAE1B,IAEA,kBAAC,GAAD;EAAO,OAAO;YAAd,CAAuB,kCACU,EAAM,QAC/B;MAGL;CAGT,IAAM,IAAiC,EACrC,EAAa,mBACb,EAAK,YAAY,aAAa,QAC/B;AAgCD,QAAO,kBAAC,GAAD,EAAyB,QA7BH,EAC3B,EAAK,YAAY,aAAa,KAC3B,KAAI,MAAO,EAAI,OAAO,GAAgC,CACtD,QAAQ,MAAmB,CAAC,CAAC,EAAE,CACnC,CAGyB,KAAI,OAKrB;EACL,OAAO;EACP,SACE,kBAAC,GAAD,EAAA,UAPoB,EAAK,YAAa,aAAa,KAAK,QAC1D,MAAO,EAAI,OAAO,OAAoC,EACvD,CAMsB,KAAI,MACnB,kBAAC,GAAD;GAEO;GACL,SAAS,EAAK,YAAa,aAAa;GACzB;GACf,EAJK,EAAI,OAAO,KAAK,IAAI,CAIzB,CACF,EACI,CAAA;EAEX,EACD,EAEwC,CAAA"}
1
+ {"version":3,"file":"TableQueryEcosystem.js","names":[],"sources":["../../../src/components/Ecosystem/TableQueryEcosystem.tsx"],"sourcesContent":["import EcosystemCard from '@/components/Ecosystem/EcosystemCard'\nimport EcosystemSkeleton from '@/components/Ecosystem/EcosystemSkeleton'\nimport { Markdown } from '@/components/Markdown/MarkdownSynapse'\nimport { ImageFileHandle } from '@/components/widgets/ImageFileHandle'\nimport { useGetFullTableQueryResults } from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport {\n getColumnIndex,\n parseEntityIdFromSqlStatement,\n} from '@/utils/functions/index'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { Alert, Stack } from '@mui/material'\nimport {\n FileHandleAssociateType,\n Query,\n Row,\n SelectColumn,\n} from '@sage-bionetworks/synapse-types'\nimport uniq from 'lodash-es/uniq'\nimport { ReactNode } from 'react'\nimport EcosystemLayout from './EcosystemLayout'\n\n/* The column names expected to be found in the table */\nconst COLUMN_NAMES = {\n RESOURCE_CATEGORY: 'resourcecategory',\n RESOURCE_NAME: 'resourcename',\n RESOURCE_DESCRIPTION: 'resourcedescription',\n RESOURCE_URL: 'resourceurl',\n RESOURCE_ICON_IMAGE: 'resourceiconimage',\n}\n\ntype TableQueryEcosystemCardProps = {\n /** The row data to display*/\n row: Row\n /** The headers (select columns) of the table query result */\n headers: SelectColumn[]\n /** The entity ID of the table */\n tableEntityId: string\n}\n\n/**\n * Maps a table query result row to an EcosystemCard.\n */\nfunction TableQueryEcosystemCard(props: TableQueryEcosystemCardProps) {\n const { row, headers, tableEntityId } = props\n const resourceNameColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_NAME,\n headers,\n )!\n const resourceName = row.values[resourceNameColumnIndex]!\n\n const resourceUrlColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_URL,\n headers,\n )!\n const resourceUrl = row.values[resourceUrlColumnIndex]!\n\n const resourceDescriptionColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_DESCRIPTION,\n headers,\n )!\n const resourceDescriptionMarkdown =\n row.values[resourceDescriptionColumnIndex]!\n\n let iconElement: ReactNode = null\n\n const resourceIconImageColumnIndex = getColumnIndex(\n COLUMN_NAMES.RESOURCE_ICON_IMAGE,\n headers,\n )\n\n if (resourceIconImageColumnIndex) {\n const resourceIconFileHandleId = row.values[resourceIconImageColumnIndex]\n if (resourceIconFileHandleId) {\n iconElement = (\n <ImageFileHandle\n fileHandleAssociation={{\n fileHandleId: resourceIconFileHandleId,\n associateObjectId: tableEntityId,\n associateObjectType: FileHandleAssociateType.TableEntity,\n }}\n />\n )\n }\n }\n\n return (\n <EcosystemCard\n title={resourceName}\n titleUrl={resourceUrl}\n description={<Markdown markdown={resourceDescriptionMarkdown} />}\n image={iconElement}\n />\n )\n}\n\nexport type TableQueryEcosystemProps = {\n /** The Synapse table query to execute to populate the Ecosystem component */\n query: Query\n}\n\n/**\n * The Ecosystem component driven by the results of a Synapse table query.\n * @constructor\n */\nfunction TableQueryEcosystem(props: TableQueryEcosystemProps) {\n const { query } = props\n const tableEntityId = parseEntityIdFromSqlStatement(query.sql)\n const { data, isLoading, error } = useGetFullTableQueryResults({\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: tableEntityId,\n query,\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n })\n\n if (!data?.queryResult) {\n if (isLoading) {\n return <EcosystemSkeleton />\n }\n if (error) {\n return (\n <Alert color={'error'}>\n Error loading Ecosystem data: {error.message}\n </Alert>\n )\n }\n return null\n }\n\n const RESOURCE_CATEGORY_COLUMN_INDEX = getColumnIndex(\n COLUMN_NAMES.RESOURCE_CATEGORY,\n data.queryResult.queryResults.headers,\n )!\n\n // Get the distinct categories\n const categories: string[] = uniq(\n data.queryResult.queryResults.rows\n .map(row => row.values[RESOURCE_CATEGORY_COLUMN_INDEX])\n .filter((s): s is string => !!s), // Remove null values\n )\n\n // Create the content for each category and return it in the expected format for the Ecosystem component\n const config = categories.map(category => {\n const rowsForCategory = data.queryResult!.queryResults.rows.filter(\n row => row.values[RESOURCE_CATEGORY_COLUMN_INDEX] === category,\n )\n\n return {\n title: category,\n content: (\n <Stack>\n {rowsForCategory.map(row => (\n <TableQueryEcosystemCard\n key={row.values.join('-')}\n row={row}\n headers={data.queryResult!.queryResults.headers}\n tableEntityId={tableEntityId}\n />\n ))}\n </Stack>\n ),\n }\n })\n\n return <EcosystemLayout config={config} />\n}\n\nexport default TableQueryEcosystem\n"],"mappings":";;;;;;;;;;;;;;AAsBA,IAAM,IAAe;CACnB,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,cAAc;CACd,qBAAqB;CACtB;AAcD,SAAS,EAAwB,GAAqC;CACpE,IAAM,EAAE,QAAK,YAAS,qBAAkB,GAClC,IAA0B,EAC9B,EAAa,eACb,EACD,EACK,IAAe,EAAI,OAAO,IAE1B,IAAyB,EAC7B,EAAa,cACb,EACD,EACK,IAAc,EAAI,OAAO,IAEzB,IAAiC,EACrC,EAAa,sBACb,EACD,EACK,IACJ,EAAI,OAAO,IAET,IAAyB,MAEvB,IAA+B,EACnC,EAAa,qBACb,EACD;AAED,KAAI,GAA8B;EAChC,IAAM,IAA2B,EAAI,OAAO;AAC5C,EAAI,MACF,IACE,kBAAC,GAAD,EACE,uBAAuB;GACrB,cAAc;GACd,mBAAmB;GACnB,qBAAqB,EAAwB;GAC9C,EACD,CAAA;;AAKR,QACE,kBAAC,GAAD;EACE,OAAO;EACP,UAAU;EACV,aAAa,kBAAC,GAAD,EAAU,UAAU,GAA+B,CAAA;EAChE,OAAO;EACP,CAAA;;AAaN,SAAS,EAAoB,GAAiC;CAC5D,IAAM,EAAE,aAAU,GACZ,IAAgB,EAA8B,EAAM,IAAI,EACxD,EAAE,SAAM,cAAW,aAAU,EAA4B;EAC7D,cAAc;EACd,UAAU;EACV;EACA,UAAA;EACD,CAAC;AAEF,KAAI,CAAC,GAAM,YAWT,QAVI,IACK,kBAAC,GAAD,EAAqB,CAAA,GAE1B,IAEA,kBAAC,GAAD;EAAO,OAAO;YAAd,CAAuB,kCACU,EAAM,QAC/B;MAGL;CAGT,IAAM,IAAiC,EACrC,EAAa,mBACb,EAAK,YAAY,aAAa,QAC/B;AAgCD,QAAO,kBAAC,GAAD,EAAyB,QA7BH,EAC3B,EAAK,YAAY,aAAa,KAC3B,KAAI,MAAO,EAAI,OAAO,GAAgC,CACtD,QAAQ,MAAmB,CAAC,CAAC,EAAE,CAIrB,CAAW,KAAI,OAKrB;EACL,OAAO;EACP,SACE,kBAAC,GAAD,EAAA,UAPoB,EAAK,YAAa,aAAa,KAAK,QAC1D,MAAO,EAAI,OAAO,OAAoC,EAOjD,CAAgB,KAAI,MACnB,kBAAC,GAAD;GAEO;GACL,SAAS,EAAK,YAAa,aAAa;GACzB;GACf,EAJK,EAAI,OAAO,KAAK,IAAI,CAIzB,CACF,EACI,CAAA;EAEX,EAG6B,EAAU,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/EntityAclEditor/EntityAclEditor.tsx"],"names":[],"mappings":"AAwDA,MAAM,MAAM,oBAAoB,GAAG;IACjC,oIAAoI;IACpI,QAAQ,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,eAAe,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;IAClD,kDAAkD;IAClD,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B;;6BAEyB;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAyXD,QAAA,MAAM,2BAA2B,wHAahC,CAAA;AAED,eAAe,2BAA2B,CAAA"}
1
+ {"version":3,"file":"EntityAclEditor.d.ts","sourceRoot":"","sources":["../../../src/components/EntityAclEditor/EntityAclEditor.tsx"],"names":[],"mappings":"AAyDA,MAAM,MAAM,oBAAoB,GAAG;IACjC,oIAAoI;IACpI,QAAQ,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,eAAe,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;IAClD,kDAAkD;IAClD,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B;;6BAEyB;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,CAAA;AAoYD,QAAA,MAAM,2BAA2B,wHAahC,CAAA;AAED,eAAe,2BAA2B,CAAA"}
@@ -3,41 +3,41 @@ import { BackendDestinationEnum as e, getEndpoint as t } from "../../utils/funct
3
3
  import { getAccessTypeFromPermissionLevel as n, permissionLevelToLabel as r } from "../../utils/PermissionLevelToAccessType.js";
4
4
  import { entityTypeToFriendlyName as i } from "../../utils/functions/EntityTypeUtils.js";
5
5
  import "../../utils/functions/index.js";
6
- import ee from "../FullWidthAlert/index.js";
7
- import { SynapseErrorBoundary as a } from "../error/ErrorBanner.js";
8
- import { useGetRealmPrincipals as o } from "../../synapse-queries/realm/useRealmPrincipals.js";
9
- import { useSuspenseGetEntityBundle as s } from "../../synapse-queries/entity/useEntityBundle.js";
10
- import { useCreateEntityACL as te, useDeleteEntityACL as ne, useSuspenseGetEntityBenefactorACL as c, useUpdateEntityACL as l } from "../../synapse-queries/entity/useEntity.js";
11
- import { useSuspenseGetCurrentUserProfile as u } from "../../synapse-queries/user/useUserBundle.js";
6
+ import a from "../FullWidthAlert/index.js";
7
+ import { SynapseErrorBoundary as o } from "../error/ErrorBanner.js";
8
+ import { useGetRealmPrincipals as s } from "../../synapse-queries/realm/useRealmPrincipals.js";
9
+ import { useSuspenseGetEntityBundle as ee } from "../../synapse-queries/entity/useEntityBundle.js";
10
+ import { useCreateEntityACL as te, useDeleteEntityACL as ne, useSuspenseGetEntityBenefactorACL as re, useUpdateEntityACL as ie } from "../../synapse-queries/entity/useEntity.js";
11
+ import { useSuspenseGetCurrentUserProfile as ae } from "../../synapse-queries/user/useUserBundle.js";
12
12
  import "../../synapse-queries/index.js";
13
- import { isEntityPublic as d, resourceAccessListIsEqual as f } from "../../utils/functions/AccessControlListUtils.js";
14
- import { getPrincipalDisplayName as p } from "../../utils/functions/getPrincipalDisplayName.js";
13
+ import { consolidateResourceAccessList as oe, isEntityPublic as c, resourceAccessListIsEqual as l } from "../../utils/functions/AccessControlListUtils.js";
14
+ import { getPrincipalDisplayName as u } from "../../utils/functions/getPrincipalDisplayName.js";
15
15
  import "../error/index.js";
16
- import { AclEditorSkeleton as m } from "../AclEditor/AclEditorSkeleton.js";
17
- import { AclEditor as re } from "../AclEditor/AclEditor.js";
18
- import ie from "../AclEditor/useUpdateAcl.js";
19
- import { CreateOrDeleteLocalSharingSettingsButton as h } from "./CreateOrDeleteLocalSharingSettingsButton.js";
20
- import { InheritanceMessage as ae } from "./InheritanceMessage.js";
16
+ import { AclEditorSkeleton as d } from "../AclEditor/AclEditorSkeleton.js";
17
+ import { AclEditor as f } from "../AclEditor/AclEditor.js";
18
+ import p from "../AclEditor/useUpdateAcl.js";
19
+ import { CreateOrDeleteLocalSharingSettingsButton as m } from "./CreateOrDeleteLocalSharingSettingsButton.js";
20
+ import { InheritanceMessage as h } from "./InheritanceMessage.js";
21
21
  import g from "./OpenData.js";
22
22
  import _ from "./useNotifyNewACLUsers.js";
23
- import { Suspense as v, forwardRef as y, useEffect as b, useImperativeHandle as x, useMemo as S, useState as C } from "react";
24
- import { Alert as w, Link as oe, Stack as se } from "@mui/material";
25
- import { Fragment as ce, jsx as T, jsxs as E } from "react/jsx-runtime";
26
- import { ALL_ENTITY_BUNDLE_FIELDS as le } from "@sage-bionetworks/synapse-types";
27
- import { EntityType as ue } from "@sage-bionetworks/synapse-client";
23
+ import { Suspense as v, forwardRef as y, useEffect as b, useImperativeHandle as se, useMemo as x, useState as S } from "react";
24
+ import { Alert as ce, Link as le, Stack as ue } from "@mui/material";
25
+ import { Fragment as de, jsx as C, jsxs as w } from "react/jsx-runtime";
26
+ import { ALL_ENTITY_BUNDLE_FIELDS as fe } from "@sage-bionetworks/synapse-types";
27
+ import { EntityType as pe } from "@sage-bionetworks/synapse-client";
28
28
  //#region src/components/EntityAclEditor/EntityAclEditor.tsx
29
- var de = [
29
+ var me = [
30
30
  "CAN_VIEW",
31
31
  "CAN_DOWNLOAD",
32
32
  "CAN_EDIT",
33
33
  "CAN_EDIT_DELETE",
34
34
  "CAN_ADMINISTER"
35
35
  ];
36
- function fe(e) {
36
+ function T(e) {
37
37
  return `${e} (shared on Synapse)`;
38
38
  }
39
- function D(n, r) {
40
- return `${p({
39
+ function E(n, r) {
40
+ return `${u({
41
41
  userName: n.userName ?? "",
42
42
  firstName: n.firstName,
43
43
  lastName: n.lastName
@@ -46,105 +46,105 @@ function D(n, r) {
46
46
  showUsername: !1
47
47
  })} has shared an item with you on Synapse:\n${t(e.PORTAL_ENDPOINT)}Synapse:${r}`;
48
48
  }
49
- function O(e, t, n, r) {
49
+ function D(e, t, n, r) {
50
50
  return !e || t ? !1 : (e) => {
51
51
  let t = n.ownerId === String(e.principalId), i = r !== void 0 && String(e.principalId) === r;
52
52
  return !(t || i);
53
53
  };
54
54
  }
55
- function k(e, t, n) {
55
+ function O(e, t, n) {
56
56
  return !e || t ? !1 : (t) => n.ownerId === String(t.principalId) ? !1 : e;
57
57
  }
58
- function A(e, t) {
58
+ function k(e, t) {
59
59
  return (n) => {
60
60
  if (t !== void 0 && String(n.principalId) === t) return e ? r.CAN_DOWNLOAD : r.CAN_VIEW;
61
61
  };
62
62
  }
63
- var j = y(function(e, t) {
64
- let { entityId: r, onCanSaveChange: a, onUpdateSuccess: p, isAfterUpload: m = !1 } = e, { data: v } = u(), { data: y } = o(), { publicGroup: j } = y || {}, { data: M } = s(r, void 0, le, { staleTime: Infinity }), N = ue.project == M.entityType, { data: P } = c(M.entity.parentId, { staleTime: Infinity }), F = M.benefactorAcl.resourceAccess, I = S(() => P?.resourceAccess ?? [], [P]), L = M.permissions.canChangePermissions, R = M.permissions.isEntityOpenData, z = M.benefactorAcl.id != r, [B, V] = C(z), [H, pe] = C(!1), [U, me] = C(), { resourceAccessList: W, setResourceAccessList: G, addResourceAccessItem: K, updateResourceAccessItem: he, removeResourceAccessItem: ge, resetDirtyState: q } = ie({ initialResourceAccessList: F });
63
+ var A = y(function(e, t) {
64
+ let { entityId: r, onCanSaveChange: o, onUpdateSuccess: u, isAfterUpload: d = !1 } = e, { data: v } = ae(), { data: y } = s(), { publicGroup: A } = y || {}, { data: j } = ee(r, void 0, fe, { staleTime: Infinity }), M = pe.project == j.entityType, { data: N } = re(j.entity.parentId, { staleTime: Infinity }), P = x(() => oe(j.benefactorAcl.resourceAccess), [j.benefactorAcl.resourceAccess]), F = x(() => N?.resourceAccess ?? [], [N]), I = j.permissions.canChangePermissions, L = j.permissions.isEntityOpenData, R = j.benefactorAcl.id != r, [z, B] = S(R), [V, he] = S(!1), [H, ge] = S(), { resourceAccessList: U, setResourceAccessList: W, addResourceAccessItem: G, updateResourceAccessItem: _e, removeResourceAccessItem: ve, resetDirtyState: K } = p({ initialResourceAccessList: P });
65
65
  b(() => {
66
- F && (q(), G([...F]));
66
+ P && (K(), W([...P]));
67
67
  }, [
68
- F,
69
- q,
70
- G
68
+ P,
69
+ K,
70
+ W
71
71
  ]), b(() => {
72
- q(), V(z);
73
- }, [z, q]), b(() => {
74
- z == B ? G(F) : B && G(I), q();
72
+ K(), B(R);
73
+ }, [R, K]), b(() => {
74
+ R == z ? W(P) : z && W(F), K();
75
75
  }, [
76
- z,
76
+ R,
77
+ P,
77
78
  F,
78
- I,
79
- q,
80
- G,
81
- B
79
+ K,
80
+ W,
81
+ z
82
82
  ]);
83
- let _e = d(W, y ?? {}), { sendNotification: ve, isLoading: ye, isPending: be } = _({
84
- subject: fe(M.entity.name || ""),
85
- body: D(v, r),
86
- initialResourceAccessList: F,
87
- newResourceAccessList: W
88
- }), J = {
83
+ let ye = c(U, y ?? {}), { sendNotification: be, isLoading: xe, isPending: Se } = _({
84
+ subject: T(j.entity.name || ""),
85
+ body: E(v, r),
86
+ initialResourceAccessList: P,
87
+ newResourceAccessList: U
88
+ }), q = {
89
89
  onSuccess: () => {
90
- H && ve(), p();
90
+ V && be(), u();
91
91
  },
92
92
  onError: (e) => {
93
- me(e);
93
+ ge(e);
94
94
  }
95
- }, { mutate: Y, isPending: xe } = te(J), { mutate: X, isPending: Se } = l(J), { mutate: Z, isPending: Ce } = ne(J), we = xe || Se || Ce || be, Q = S(() => z != B || !f(F, W), [
96
- F,
95
+ }, { mutate: J, isPending: Ce } = te(q), { mutate: Y, isPending: we } = ie(q), { mutate: X, isPending: Te } = ne(q), Z = Ce || we || Te || Se, Q = x(() => R != z || !l(P, U), [
96
+ P,
97
+ R,
97
98
  z,
98
- B,
99
- W
100
- ]), $ = Q || ye || we, Te = Q && m;
99
+ U
100
+ ]), $ = Q || xe || Z, Ee = Q && d;
101
101
  return b(() => {
102
- a($);
103
- }, [a, $]), x(t, () => ({ save() {
104
- $ ? z == B ? X({
105
- ...M.accessControlList,
106
- resourceAccess: W
107
- }) : B ? Z(r) : Y({
102
+ o($);
103
+ }, [o, $]), se(t, () => ({ save() {
104
+ $ ? R == z ? Y({
105
+ ...j.accessControlList,
106
+ resourceAccess: U
107
+ }) : z ? X(r) : J({
108
108
  id: r,
109
- resourceAccess: W
109
+ resourceAccess: U
110
110
  }) : console.error("EntityAclEditor: save() called but canSave is false");
111
111
  } }), [
112
112
  $,
113
- Y,
114
- Z,
115
- M,
113
+ J,
114
+ X,
115
+ j,
116
116
  r,
117
+ R,
118
+ Y,
117
119
  z,
118
- X,
119
- B,
120
- W
121
- ]), /* @__PURE__ */ E(se, {
120
+ U
121
+ ]), /* @__PURE__ */ w(ue, {
122
122
  sx: { gap: 2 },
123
123
  children: [
124
- /* @__PURE__ */ T(g, {
125
- isOpenData: R,
126
- isPublic: _e,
127
- currentUserCanUpdateSharingSettings: L
124
+ /* @__PURE__ */ C(g, {
125
+ isOpenData: L,
126
+ isPublic: ye,
127
+ currentUserCanUpdateSharingSettings: I
128
128
  }),
129
- /* @__PURE__ */ T(ae, {
130
- isProject: N,
131
- isInherited: B,
132
- benefactorId: B ? P?.id : r,
133
- isAfterUpload: m
129
+ /* @__PURE__ */ C(h, {
130
+ isProject: M,
131
+ isInherited: z,
132
+ benefactorId: z ? N?.id : r,
133
+ isAfterUpload: d
134
134
  }),
135
- Te && /* @__PURE__ */ T(ee, {
135
+ Ee && /* @__PURE__ */ C(a, {
136
136
  isGlobal: !1,
137
137
  variant: "warning",
138
- title: `Edits will affect settings of entire ${i(M?.entityType).toLowerCase()}.`,
139
- description: /* @__PURE__ */ E(ce, { children: [/* @__PURE__ */ E("p", { children: [
138
+ title: `Edits will affect settings of entire ${i(j?.entityType).toLowerCase()}.`,
139
+ description: /* @__PURE__ */ w(de, { children: [/* @__PURE__ */ w("p", { children: [
140
140
  "Editing the settings here will impact the sharing settings for all files and folders within this",
141
141
  " ",
142
- i(M?.entityType).toLowerCase(),
142
+ i(j?.entityType).toLowerCase(),
143
143
  ", not just the ones you've recently uploaded."
144
- ] }), /* @__PURE__ */ E("p", { children: [
144
+ ] }), /* @__PURE__ */ w("p", { children: [
145
145
  "View the instructions above for setting your",
146
146
  " ",
147
- /* @__PURE__ */ T(oe, {
147
+ /* @__PURE__ */ C(le, {
148
148
  href: "https://docs.synapse.org/synapse-docs/sharing-settings-permissions-and-conditions-for-use",
149
149
  target: "_blank",
150
150
  children: "Local Sharing Settings"
@@ -152,44 +152,44 @@ var j = y(function(e, t) {
152
152
  "."
153
153
  ] })] })
154
154
  }),
155
- /* @__PURE__ */ T(re, {
156
- isInherited: B,
157
- canEdit: O(L, B, v, j),
158
- canRemoveEntry: k(L, B, v),
159
- resourceAccessList: W,
160
- availablePermissionLevels: de,
155
+ /* @__PURE__ */ C(f, {
156
+ isInherited: z,
157
+ canEdit: D(I, z, v, A),
158
+ canRemoveEntry: O(I, z, v),
159
+ resourceAccessList: U,
160
+ availablePermissionLevels: me,
161
161
  emptyText: "",
162
- displayedPermissionLevelOverride: A(R, j),
162
+ displayedPermissionLevelOverride: k(L, A),
163
163
  onAddPrincipalToAcl: (e) => {
164
- j !== void 0 && String(e) === j ? K(e, n("CAN_VIEW")) : K(e, n("CAN_DOWNLOAD"));
164
+ A !== void 0 && String(e) === A ? G(e, n("CAN_VIEW")) : G(e, n("CAN_DOWNLOAD"));
165
165
  },
166
- updateResourceAccessItem: he,
167
- removeResourceAccessItem: ge,
166
+ updateResourceAccessItem: _e,
167
+ removeResourceAccessItem: ve,
168
168
  showNotifyCheckbox: !0,
169
- notifyCheckboxValue: H,
170
- onNotifyCheckboxChange: pe,
169
+ notifyCheckboxValue: V,
170
+ onNotifyCheckboxChange: he,
171
171
  showAddRemovePublicButton: !0
172
172
  }),
173
- !m && !N && M.permissions.canEnableInheritance && /* @__PURE__ */ T(h, {
174
- isInherited: B,
175
- setIsInherited: V
173
+ !d && !M && j.permissions.canEnableInheritance && /* @__PURE__ */ C(m, {
174
+ isInherited: z,
175
+ setIsInherited: B
176
176
  }),
177
- U && /* @__PURE__ */ T(w, {
177
+ H && /* @__PURE__ */ C(ce, {
178
178
  severity: "error",
179
- children: U.message
179
+ children: H.message
180
180
  })
181
181
  ]
182
182
  });
183
- }), M = y(function(e, t) {
184
- return /* @__PURE__ */ T(a, { children: /* @__PURE__ */ T(v, {
185
- fallback: /* @__PURE__ */ T(m, {}),
186
- children: /* @__PURE__ */ T(j, {
183
+ }), j = y(function(e, t) {
184
+ return /* @__PURE__ */ C(o, { children: /* @__PURE__ */ C(v, {
185
+ fallback: /* @__PURE__ */ C(d, {}),
186
+ children: /* @__PURE__ */ C(A, {
187
187
  ...e,
188
188
  ref: t
189
189
  })
190
190
  }) });
191
191
  });
192
192
  //#endregion
193
- export { M as default };
193
+ export { j as default };
194
194
 
195
195
  //# sourceMappingURL=EntityAclEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityAclEditor.js","names":[],"sources":["../../../src/components/EntityAclEditor/EntityAclEditor.tsx"],"sourcesContent":["import {\n useCreateEntityACL,\n useDeleteEntityACL,\n useSuspenseGetCurrentUserProfile,\n useSuspenseGetEntityBenefactorACL,\n useSuspenseGetEntityBundle,\n useUpdateEntityACL,\n} from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions'\nimport {\n isEntityPublic,\n resourceAccessListIsEqual,\n} from '@/utils/functions/AccessControlListUtils'\nimport { getPrincipalDisplayName } from '@/utils/functions/getPrincipalDisplayName'\nimport { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { SYNAPSE_DOCS_SHARING_SETTINGS_PERMISSIONS_CONDITIONS_FOR_USE_URL } from '@/utils/SynapseConstants'\nimport { Alert, Link, Stack } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ResourceAccess,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ForwardedRef,\n forwardRef,\n Suspense,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { AclEditor, AclEditorProps } from '../AclEditor/AclEditor'\nimport { AclEditorSkeleton } from '../AclEditor/AclEditorSkeleton'\nimport useUpdateAcl from '../AclEditor/useUpdateAcl'\nimport { SynapseErrorBoundary } from '../error'\nimport FullWidthAlert from '../FullWidthAlert'\nimport { CreateOrDeleteLocalSharingSettingsButton } from './CreateOrDeleteLocalSharingSettingsButton'\nimport { InheritanceMessage } from './InheritanceMessage'\nimport OpenData from './OpenData'\nimport useNotifyNewACLUsers from './useNotifyNewACLUsers'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_VIEW',\n 'CAN_DOWNLOAD',\n 'CAN_EDIT',\n 'CAN_EDIT_DELETE',\n 'CAN_ADMINISTER',\n]\n\nexport type EntityAclEditorProps = {\n /** The ID of the entity on which to view/edit the ACL. Note that the ACL may actually belong to an entity ancestor (benefactor). */\n entityId: string\n /** Invoked when the user can/cannot save the pending changes. */\n onCanSaveChange: (canSaveChanges: boolean) => void\n /** Invoked when changes are successfully made. */\n onUpdateSuccess: () => void\n /** Special case to show specific copy and allow changes to an inherited ACL immediately after a file is uploaded.\n * Note that if this is true, the entityId should be the ID of the folder or project that is the benefactor of the newly uploaded file(s)\n * @defaultValue false */\n isAfterUpload?: boolean\n}\n\nexport type EntityAclEditorHandle = {\n save: () => void\n}\n\nfunction getSubject(entityName: string) {\n return `${entityName} (shared on Synapse)`\n}\n\nfunction getBody(profile: UserProfile, entityId: string) {\n return `${getPrincipalDisplayName(\n {\n userName: profile.userName ?? '',\n firstName: profile.firstName,\n lastName: profile.lastName,\n },\n { showFullName: true, showUsername: false },\n )} has shared an item with you on Synapse:\\n${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${entityId}`\n}\n\nfunction getCanEditResourceAccess(\n canEdit: boolean,\n isInherited: boolean,\n ownProfile: UserProfile,\n publicGroupId: string | undefined,\n): AclEditorProps['canEdit'] {\n if (!canEdit || isInherited) {\n return false\n }\n return (resourceAccess: ResourceAccess): boolean => {\n // Users cannot change their own permissions\n const isSelf = ownProfile.ownerId === String(resourceAccess.principalId)\n // Users cannot change permission level for the public group, only add/remove it.\n // To give the public group DOWNLOAD access, ACT must mark it as anonymous access.\n const isPublicGroup =\n publicGroupId !== undefined &&\n String(resourceAccess.principalId) === publicGroupId\n if (isSelf || isPublicGroup) {\n return false\n }\n return true\n }\n}\n\nfunction getCanDeleteResourceAccess(\n canEdit: boolean,\n isInherited: boolean,\n ownProfile: UserProfile,\n): AclEditorProps['canRemoveEntry'] {\n if (!canEdit || isInherited) {\n return false\n }\n return (resourceAccess: ResourceAccess): boolean => {\n // Users cannot delete their own permissions\n const isSelf = ownProfile.ownerId === String(resourceAccess.principalId)\n if (isSelf) {\n return false\n }\n return canEdit\n }\n}\n\nfunction getDisplayedPermissionLevelOverride(\n isOpenData: boolean,\n publicGroupId: string | undefined,\n): AclEditorProps['displayedPermissionLevelOverride'] {\n return (resourceAccess: ResourceAccess) => {\n if (\n publicGroupId !== undefined &&\n String(resourceAccess.principalId) === publicGroupId\n ) {\n return isOpenData\n ? permissionLevelToLabel['CAN_DOWNLOAD']\n : permissionLevelToLabel['CAN_VIEW']\n }\n return undefined\n }\n}\n\nconst EntityAclEditor = forwardRef(function EntityAclEditor(\n props: EntityAclEditorProps,\n ref: ForwardedRef<EntityAclEditorHandle>,\n) {\n const {\n entityId,\n onCanSaveChange,\n onUpdateSuccess,\n isAfterUpload = false,\n } = props\n\n const { data: ownProfile } = useSuspenseGetCurrentUserProfile()\n const { data: realmPrincipals } = useGetRealmPrincipals()\n const { publicGroup: publicGroupId } = realmPrincipals || {}\n const { data: entityBundle } = useSuspenseGetEntityBundle(\n entityId,\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n { staleTime: Infinity },\n )\n const isProject = EntityType.project == entityBundle.entityType\n\n // The parent's benefactor ACL will be shown if the user removes the ACL on the current entity\n const { data: parentAcl } = useSuspenseGetEntityBenefactorACL(\n entityBundle.entity.parentId!,\n {\n staleTime: Infinity,\n },\n )\n\n const originalResourceAccess = entityBundle.benefactorAcl.resourceAccess\n const parentResourceAccess = useMemo(\n () => parentAcl?.resourceAccess ?? [],\n [parentAcl],\n )\n const canEdit = entityBundle.permissions.canChangePermissions\n const isOpenData = entityBundle.permissions.isEntityOpenData\n const originalIsInherited = !(entityBundle.benefactorAcl.id == entityId)\n const [updatedIsInherited, setUpdatedIsInherited] =\n useState(originalIsInherited)\n const [notifyNewAdditions, setNotifyNewAdditions] = useState(false)\n const [error, setError] = useState<Error>()\n\n const {\n resourceAccessList: updatedResourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n } = useUpdateAcl({ initialResourceAccessList: originalResourceAccess })\n\n // If `originalResourceAccess` changes, reset state\n useEffect(() => {\n if (originalResourceAccess) {\n resetDirtyState()\n setResourceAccessList([...originalResourceAccess])\n }\n }, [originalResourceAccess, resetDirtyState, setResourceAccessList])\n\n // If `originalIsInherited` changes, reset state\n useEffect(() => {\n resetDirtyState()\n setUpdatedIsInherited(originalIsInherited)\n }, [originalIsInherited, resetDirtyState])\n\n // If the editor toggles the inherited state, reset the resource access list\n useEffect(() => {\n if (originalIsInherited == updatedIsInherited) {\n // The user reverted to the original state (regardless of inherited or not)\n setResourceAccessList(originalResourceAccess)\n } else if (updatedIsInherited) {\n // The user toggled to inherited, update the resource access list to match the parent\n setResourceAccessList(parentResourceAccess)\n } else {\n // The user toggled to local, no need to update the list (the parent's list is already in the editor)\n }\n resetDirtyState()\n }, [\n originalIsInherited,\n originalResourceAccess,\n parentResourceAccess,\n resetDirtyState,\n setResourceAccessList,\n updatedIsInherited,\n ])\n\n const isPublic = isEntityPublic(\n updatedResourceAccessList,\n realmPrincipals ?? {},\n )\n\n const {\n sendNotification,\n isLoading: isLoadingSendMessageToNewACLUsers,\n isPending: isPendingSendMessageToNewACLUsers,\n } = useNotifyNewACLUsers({\n subject: getSubject(entityBundle.entity.name || ''),\n body: getBody(ownProfile, entityId),\n initialResourceAccessList: originalResourceAccess,\n newResourceAccessList: updatedResourceAccessList,\n })\n\n const mutationOptions = {\n onSuccess: () => {\n if (notifyNewAdditions) {\n sendNotification()\n }\n onUpdateSuccess()\n },\n onError: (e: Error) => {\n setError(e)\n },\n }\n\n const { mutate: createAcl, isPending: isPendingCreateAcl } =\n useCreateEntityACL(mutationOptions)\n const { mutate: updateAcl, isPending: isPendingUpdateAcl } =\n useUpdateEntityACL(mutationOptions)\n const { mutate: deleteAcl, isPending: isPendingDeleteAcl } =\n useDeleteEntityACL(mutationOptions)\n\n const isPending =\n isPendingCreateAcl ||\n isPendingUpdateAcl ||\n isPendingDeleteAcl ||\n isPendingSendMessageToNewACLUsers\n\n const hasAclChanged = useMemo(() => {\n return (\n originalIsInherited != updatedIsInherited ||\n !resourceAccessListIsEqual(\n originalResourceAccess,\n updatedResourceAccessList,\n )\n )\n }, [\n originalResourceAccess,\n originalIsInherited,\n updatedIsInherited,\n updatedResourceAccessList,\n ])\n\n const canSave =\n hasAclChanged || isLoadingSendMessageToNewACLUsers || isPending\n\n const showInheritedAclUpdateWarning = hasAclChanged && isAfterUpload\n\n useEffect(() => {\n onCanSaveChange(canSave)\n }, [onCanSaveChange, canSave])\n\n useImperativeHandle(\n ref,\n () => {\n return {\n save() {\n if (canSave) {\n // Check if the inheritance changed; if so, the ACL should be created/deleted\n if (originalIsInherited != updatedIsInherited) {\n if (updatedIsInherited) {\n deleteAcl(entityId)\n } else {\n createAcl({\n id: entityId,\n resourceAccess: updatedResourceAccessList,\n })\n }\n } else {\n // Inheritance did not change; update the ACL\n updateAcl({\n // ensure we get all fields from the original ACL, including the etag\n ...entityBundle.accessControlList!,\n resourceAccess: updatedResourceAccessList,\n })\n }\n } else {\n console.error('EntityAclEditor: save() called but canSave is false')\n }\n },\n }\n },\n [\n canSave,\n createAcl,\n deleteAcl,\n entityBundle,\n entityId,\n originalIsInherited,\n updateAcl,\n updatedIsInherited,\n updatedResourceAccessList,\n ],\n )\n\n return (\n <Stack\n sx={{\n gap: 2,\n }}\n >\n <OpenData\n isOpenData={isOpenData}\n isPublic={isPublic}\n currentUserCanUpdateSharingSettings={canEdit}\n />\n <InheritanceMessage\n isProject={isProject}\n isInherited={updatedIsInherited}\n benefactorId={updatedIsInherited ? parentAcl?.id : entityId}\n isAfterUpload={isAfterUpload}\n />\n {showInheritedAclUpdateWarning && (\n <FullWidthAlert\n isGlobal={false}\n variant={'warning'}\n title={`Edits will affect settings of entire ${entityTypeToFriendlyName(\n entityBundle?.entityType,\n ).toLowerCase()}.`}\n description={\n <>\n <p>\n Editing the settings here will impact the sharing settings for\n all files and folders within this{' '}\n {entityTypeToFriendlyName(\n entityBundle?.entityType,\n ).toLowerCase()}\n , not just the ones you&apos;ve recently uploaded.\n </p>\n <p>\n View the instructions above for setting your{' '}\n <Link\n href={\n SYNAPSE_DOCS_SHARING_SETTINGS_PERMISSIONS_CONDITIONS_FOR_USE_URL\n }\n target={'_blank'}\n >\n Local Sharing Settings\n </Link>\n .\n </p>\n </>\n }\n />\n )}\n <AclEditor\n isInherited={updatedIsInherited}\n canEdit={getCanEditResourceAccess(\n canEdit,\n updatedIsInherited,\n ownProfile,\n publicGroupId,\n )}\n canRemoveEntry={getCanDeleteResourceAccess(\n canEdit,\n updatedIsInherited,\n ownProfile,\n )}\n resourceAccessList={updatedResourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n emptyText={/* This should never happen */ ''}\n displayedPermissionLevelOverride={getDisplayedPermissionLevelOverride(\n isOpenData,\n publicGroupId,\n )}\n onAddPrincipalToAcl={id => {\n if (publicGroupId !== undefined && String(id) === publicGroupId) {\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_VIEW'),\n )\n } else {\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_DOWNLOAD'),\n )\n }\n }}\n updateResourceAccessItem={updateResourceAccessItem}\n removeResourceAccessItem={removeResourceAccessItem}\n showNotifyCheckbox={true}\n notifyCheckboxValue={notifyNewAdditions}\n onNotifyCheckboxChange={setNotifyNewAdditions}\n showAddRemovePublicButton={true}\n />\n {/* Create / delete local sharing settings button */}\n {!isAfterUpload &&\n !isProject &&\n entityBundle.permissions.canEnableInheritance && (\n <CreateOrDeleteLocalSharingSettingsButton\n isInherited={updatedIsInherited}\n setIsInherited={setUpdatedIsInherited}\n />\n )}\n {error && <Alert severity=\"error\">{error.message}</Alert>}\n </Stack>\n )\n})\n\nconst EntityAclEditorWithSuspense = forwardRef(\n function EntityAclEditorWithSuspense(\n props: EntityAclEditorProps,\n ref: ForwardedRef<EntityAclEditorHandle>,\n ) {\n return (\n <SynapseErrorBoundary>\n <Suspense fallback={<AclEditorSkeleton />}>\n <EntityAclEditor {...props} ref={ref} />\n </Suspense>\n </SynapseErrorBoundary>\n )\n },\n)\n\nexport default EntityAclEditorWithSuspense\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAM,KAA+C;CACnD;CACA;CACA;CACA;CACA;CACD;AAmBD,SAAS,GAAW,GAAoB;AACtC,QAAO,GAAG,EAAW;;AAGvB,SAAS,EAAQ,GAAsB,GAAkB;AACvD,QAAO,GAAG,EACR;EACE,UAAU,EAAQ,YAAY;EAC9B,WAAW,EAAQ;EACnB,UAAU,EAAQ;EACnB,EACD;EAAE,cAAc;EAAM,cAAc;EAAO,CAC5C,CAAC,4CAA4C,EAC5C,EAAuB,gBACxB,CAAC,UAAU;;AAGd,SAAS,EACP,GACA,GACA,GACA,GAC2B;AAI3B,QAHI,CAAC,KAAW,IACP,MAED,MAA4C;EAElD,IAAM,IAAS,EAAW,YAAY,OAAO,EAAe,YAAY,EAGlE,IACJ,MAAkB,KAAA,KAClB,OAAO,EAAe,YAAY,KAAK;AAIzC,SAHA,EAAI,KAAU;;;AAOlB,SAAS,EACP,GACA,GACA,GACkC;AAIlC,QAHI,CAAC,KAAW,IACP,MAED,MAES,EAAW,YAAY,OAAO,EAAe,YAAY,GAE/D,KAEF;;AAIX,SAAS,EACP,GACA,GACoD;AACpD,SAAQ,MAAmC;AACzC,MACE,MAAkB,KAAA,KAClB,OAAO,EAAe,YAAY,KAAK,EAEvC,QAAO,IACH,EAAuB,eACvB,EAAuB;;;AAMjC,IAAM,IAAkB,EAAW,SACjC,GACA,GACA;CACA,IAAM,EACJ,aACA,oBACA,oBACA,mBAAgB,OACd,GAEE,EAAE,MAAM,MAAe,GAAkC,EACzD,EAAE,MAAM,MAAoB,GAAuB,EACnD,EAAE,aAAa,MAAkB,KAAmB,EAAE,EACtD,EAAE,MAAM,MAAiB,EAC7B,GACA,KAAA,GACA,IACA,EAAE,WAAW,UAAU,CACxB,EACK,IAAY,GAAW,WAAW,EAAa,YAG/C,EAAE,MAAM,MAAc,EAC1B,EAAa,OAAO,UACpB,EACE,WAAW,UACZ,CACF,EAEK,IAAyB,EAAa,cAAc,gBACpD,IAAuB,QACrB,GAAW,kBAAkB,EAAE,EACrC,CAAC,EAAU,CACZ,EACK,IAAU,EAAa,YAAY,sBACnC,IAAa,EAAa,YAAY,kBACtC,IAAwB,EAAa,cAAc,MAAM,GACzD,CAAC,GAAoB,KACzB,EAAS,EAAoB,EACzB,CAAC,GAAoB,MAAyB,EAAS,GAAM,EAC7D,CAAC,GAAO,MAAY,GAAiB,EAErC,EACJ,oBAAoB,GACpB,0BACA,0BACA,8BACA,8BACA,uBACE,GAAa,EAAE,2BAA2B,GAAwB,CAAC;AAiBvE,CAdA,QAAgB;AACd,EAAI,MACF,GAAiB,EACjB,EAAsB,CAAC,GAAG,EAAuB,CAAC;IAEnD;EAAC;EAAwB;EAAiB;EAAsB,CAAC,EAGpE,QAAgB;AAEd,EADA,GAAiB,EACjB,EAAsB,EAAoB;IACzC,CAAC,GAAqB,EAAgB,CAAC,EAG1C,QAAgB;AAUd,EATI,KAAuB,IAEzB,EAAsB,EAAuB,GACpC,KAET,EAAsB,EAAqB,EAI7C,GAAiB;IAChB;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,KAAW,EACf,GACA,KAAmB,EAAE,CACtB,EAEK,EACJ,sBACA,WAAW,IACX,WAAW,OACT,EAAqB;EACvB,SAAS,GAAW,EAAa,OAAO,QAAQ,GAAG;EACnD,MAAM,EAAQ,GAAY,EAAS;EACnC,2BAA2B;EAC3B,uBAAuB;EACxB,CAAC,EAEI,IAAkB;EACtB,iBAAiB;AAIf,GAHI,KACF,IAAkB,EAEpB,GAAiB;;EAEnB,UAAU,MAAa;AACrB,MAAS,EAAE;;EAEd,EAEK,EAAE,QAAQ,GAAW,WAAW,OACpC,GAAmB,EAAgB,EAC/B,EAAE,QAAQ,GAAW,WAAW,OACpC,EAAmB,EAAgB,EAC/B,EAAE,QAAQ,GAAW,WAAW,OACpC,GAAmB,EAAgB,EAE/B,KACJ,MACA,MACA,MACA,IAEI,IAAgB,QAElB,KAAuB,KACvB,CAAC,EACC,GACA,EACD,EAEF;EACD;EACA;EACA;EACA;EACD,CAAC,EAEI,IACJ,KAAiB,MAAqC,IAElD,KAAgC,KAAiB;AAiDvD,QA/CA,QAAgB;AACd,IAAgB,EAAQ;IACvB,CAAC,GAAiB,EAAQ,CAAC,EAE9B,EACE,UAES,EACL,OAAO;AACL,EAAI,IAEE,KAAuB,IAWzB,EAAU;GAER,GAAG,EAAa;GAChB,gBAAgB;GACjB,CAAC,GAdE,IACF,EAAU,EAAS,GAEnB,EAAU;GACR,IAAI;GACJ,gBAAgB;GACjB,CAAC,GAWN,QAAQ,MAAM,sDAAsD;IAGzE,GAEH;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAGC,kBAAC,IAAD;EACE,IAAI,EACF,KAAK,GACN;YAHH;GAKE,kBAAC,GAAD;IACc;IACF;IACV,qCAAqC;IACrC,CAAA;GACF,kBAAC,IAAD;IACa;IACX,aAAa;IACb,cAAc,IAAqB,GAAW,KAAK;IACpC;IACf,CAAA;GACD,MACC,kBAAC,IAAD;IACE,UAAU;IACV,SAAS;IACT,OAAO,wCAAwC,EAC7C,GAAc,WACf,CAAC,aAAa,CAAC;IAChB,aACE,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,KAAD,EAAA,UAAA;KAAG;KAEiC;KACjC,EACC,GAAc,WACf,CAAC,aAAa;KAAC;KAEd,EAAA,CAAA,EACJ,kBAAC,KAAD,EAAA,UAAA;KAAG;KAC4C;KAC7C,kBAAC,IAAD;MACE,MAAA;MAGA,QAAQ;gBACT;MAEM,CAAA;;KAEL,EAAA,CAAA,CACH,EAAA,CAAA;IAEL,CAAA;GAEJ,kBAAC,IAAD;IACE,aAAa;IACb,SAAS,EACP,GACA,GACA,GACA,EACD;IACD,gBAAgB,EACd,GACA,GACA,EACD;IACD,oBAAoB;IACO;IAC3B,WAA0C;IAC1C,kCAAkC,EAChC,GACA,EACD;IACD,sBAAqB,MAAM;AACzB,KAAI,MAAkB,KAAA,KAAa,OAAO,EAAG,KAAK,IAChD,EACE,GACA,EAAiC,WAAW,CAC7C,GAED,EACE,GACA,EAAiC,eAAe,CACjD;;IAGqB;IACA;IAC1B,oBAAoB;IACpB,qBAAqB;IACrB,wBAAwB;IACxB,2BAA2B;IAC3B,CAAA;GAED,CAAC,KACA,CAAC,KACD,EAAa,YAAY,wBACvB,kBAAC,GAAD;IACE,aAAa;IACb,gBAAgB;IAChB,CAAA;GAEL,KAAS,kBAAC,GAAD;IAAO,UAAS;cAAS,EAAM;IAAgB,CAAA;GACnD;;EAEV,EAEI,IAA8B,EAClC,SACE,GACA,GACA;AACA,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAqB,CAAA;YACvC,kBAAC,GAAD;GAAiB,GAAI;GAAY;GAAO,CAAA;EAC/B,CAAA,EACU,CAAA;EAG5B"}
1
+ {"version":3,"file":"EntityAclEditor.js","names":[],"sources":["../../../src/components/EntityAclEditor/EntityAclEditor.tsx"],"sourcesContent":["import {\n useCreateEntityACL,\n useDeleteEntityACL,\n useSuspenseGetCurrentUserProfile,\n useSuspenseGetEntityBenefactorACL,\n useSuspenseGetEntityBundle,\n useUpdateEntityACL,\n} from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions'\nimport {\n consolidateResourceAccessList,\n isEntityPublic,\n resourceAccessListIsEqual,\n} from '@/utils/functions/AccessControlListUtils'\nimport { getPrincipalDisplayName } from '@/utils/functions/getPrincipalDisplayName'\nimport { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport {\n getAccessTypeFromPermissionLevel,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { SYNAPSE_DOCS_SHARING_SETTINGS_PERMISSIONS_CONDITIONS_FOR_USE_URL } from '@/utils/SynapseConstants'\nimport { Alert, Link, Stack } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ResourceAccess,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ForwardedRef,\n forwardRef,\n Suspense,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { AclEditor, AclEditorProps } from '../AclEditor/AclEditor'\nimport { AclEditorSkeleton } from '../AclEditor/AclEditorSkeleton'\nimport useUpdateAcl from '../AclEditor/useUpdateAcl'\nimport { SynapseErrorBoundary } from '../error'\nimport FullWidthAlert from '../FullWidthAlert'\nimport { CreateOrDeleteLocalSharingSettingsButton } from './CreateOrDeleteLocalSharingSettingsButton'\nimport { InheritanceMessage } from './InheritanceMessage'\nimport OpenData from './OpenData'\nimport useNotifyNewACLUsers from './useNotifyNewACLUsers'\n\nconst availablePermissionLevels: PermissionLevel[] = [\n 'CAN_VIEW',\n 'CAN_DOWNLOAD',\n 'CAN_EDIT',\n 'CAN_EDIT_DELETE',\n 'CAN_ADMINISTER',\n]\n\nexport type EntityAclEditorProps = {\n /** The ID of the entity on which to view/edit the ACL. Note that the ACL may actually belong to an entity ancestor (benefactor). */\n entityId: string\n /** Invoked when the user can/cannot save the pending changes. */\n onCanSaveChange: (canSaveChanges: boolean) => void\n /** Invoked when changes are successfully made. */\n onUpdateSuccess: () => void\n /** Special case to show specific copy and allow changes to an inherited ACL immediately after a file is uploaded.\n * Note that if this is true, the entityId should be the ID of the folder or project that is the benefactor of the newly uploaded file(s)\n * @defaultValue false */\n isAfterUpload?: boolean\n}\n\nexport type EntityAclEditorHandle = {\n save: () => void\n}\n\nfunction getSubject(entityName: string) {\n return `${entityName} (shared on Synapse)`\n}\n\nfunction getBody(profile: UserProfile, entityId: string) {\n return `${getPrincipalDisplayName(\n {\n userName: profile.userName ?? '',\n firstName: profile.firstName,\n lastName: profile.lastName,\n },\n { showFullName: true, showUsername: false },\n )} has shared an item with you on Synapse:\\n${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${entityId}`\n}\n\nfunction getCanEditResourceAccess(\n canEdit: boolean,\n isInherited: boolean,\n ownProfile: UserProfile,\n publicGroupId: string | undefined,\n): AclEditorProps['canEdit'] {\n if (!canEdit || isInherited) {\n return false\n }\n return (resourceAccess: ResourceAccess): boolean => {\n // Users cannot change their own permissions\n const isSelf = ownProfile.ownerId === String(resourceAccess.principalId)\n // Users cannot change permission level for the public group, only add/remove it.\n // To give the public group DOWNLOAD access, ACT must mark it as anonymous access.\n const isPublicGroup =\n publicGroupId !== undefined &&\n String(resourceAccess.principalId) === publicGroupId\n if (isSelf || isPublicGroup) {\n return false\n }\n return true\n }\n}\n\nfunction getCanDeleteResourceAccess(\n canEdit: boolean,\n isInherited: boolean,\n ownProfile: UserProfile,\n): AclEditorProps['canRemoveEntry'] {\n if (!canEdit || isInherited) {\n return false\n }\n return (resourceAccess: ResourceAccess): boolean => {\n // Users cannot delete their own permissions\n const isSelf = ownProfile.ownerId === String(resourceAccess.principalId)\n if (isSelf) {\n return false\n }\n return canEdit\n }\n}\n\nfunction getDisplayedPermissionLevelOverride(\n isOpenData: boolean,\n publicGroupId: string | undefined,\n): AclEditorProps['displayedPermissionLevelOverride'] {\n return (resourceAccess: ResourceAccess) => {\n if (\n publicGroupId !== undefined &&\n String(resourceAccess.principalId) === publicGroupId\n ) {\n return isOpenData\n ? permissionLevelToLabel['CAN_DOWNLOAD']\n : permissionLevelToLabel['CAN_VIEW']\n }\n return undefined\n }\n}\n\nconst EntityAclEditor = forwardRef(function EntityAclEditor(\n props: EntityAclEditorProps,\n ref: ForwardedRef<EntityAclEditorHandle>,\n) {\n const {\n entityId,\n onCanSaveChange,\n onUpdateSuccess,\n isAfterUpload = false,\n } = props\n\n const { data: ownProfile } = useSuspenseGetCurrentUserProfile()\n const { data: realmPrincipals } = useGetRealmPrincipals()\n const { publicGroup: publicGroupId } = realmPrincipals || {}\n const { data: entityBundle } = useSuspenseGetEntityBundle(\n entityId,\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n { staleTime: Infinity },\n )\n const isProject = EntityType.project == entityBundle.entityType\n\n // The parent's benefactor ACL will be shown if the user removes the ACL on the current entity\n const { data: parentAcl } = useSuspenseGetEntityBenefactorACL(\n entityBundle.entity.parentId!,\n {\n staleTime: Infinity,\n },\n )\n\n const consolidatedOriginalResourceAccess = useMemo(\n () =>\n consolidateResourceAccessList(entityBundle.benefactorAcl.resourceAccess),\n [entityBundle.benefactorAcl.resourceAccess],\n )\n\n const parentResourceAccess = useMemo(\n () => parentAcl?.resourceAccess ?? [],\n [parentAcl],\n )\n const canEdit = entityBundle.permissions.canChangePermissions\n const isOpenData = entityBundle.permissions.isEntityOpenData\n const originalIsInherited = !(entityBundle.benefactorAcl.id == entityId)\n const [updatedIsInherited, setUpdatedIsInherited] =\n useState(originalIsInherited)\n const [notifyNewAdditions, setNotifyNewAdditions] = useState(false)\n const [error, setError] = useState<Error>()\n\n const {\n resourceAccessList: updatedResourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n } = useUpdateAcl({\n initialResourceAccessList: consolidatedOriginalResourceAccess,\n })\n\n // If `consolidatedOriginalResourceAccess` changes, reset state\n useEffect(() => {\n if (consolidatedOriginalResourceAccess) {\n resetDirtyState()\n setResourceAccessList([...consolidatedOriginalResourceAccess])\n }\n }, [\n consolidatedOriginalResourceAccess,\n resetDirtyState,\n setResourceAccessList,\n ])\n\n // If `originalIsInherited` changes, reset state\n useEffect(() => {\n resetDirtyState()\n setUpdatedIsInherited(originalIsInherited)\n }, [originalIsInherited, resetDirtyState])\n\n // If the editor toggles the inherited state, reset the resource access list\n useEffect(() => {\n if (originalIsInherited == updatedIsInherited) {\n // The user reverted to the original state (regardless of inherited or not)\n setResourceAccessList(consolidatedOriginalResourceAccess)\n } else if (updatedIsInherited) {\n // The user toggled to inherited, update the resource access list to match the parent\n setResourceAccessList(parentResourceAccess)\n } else {\n // The user toggled to local, no need to update the list (the parent's list is already in the editor)\n }\n resetDirtyState()\n }, [\n originalIsInherited,\n consolidatedOriginalResourceAccess,\n parentResourceAccess,\n resetDirtyState,\n setResourceAccessList,\n updatedIsInherited,\n ])\n\n const isPublic = isEntityPublic(\n updatedResourceAccessList,\n realmPrincipals ?? {},\n )\n\n const {\n sendNotification,\n isLoading: isLoadingSendMessageToNewACLUsers,\n isPending: isPendingSendMessageToNewACLUsers,\n } = useNotifyNewACLUsers({\n subject: getSubject(entityBundle.entity.name || ''),\n body: getBody(ownProfile, entityId),\n initialResourceAccessList: consolidatedOriginalResourceAccess,\n newResourceAccessList: updatedResourceAccessList,\n })\n\n const mutationOptions = {\n onSuccess: () => {\n if (notifyNewAdditions) {\n sendNotification()\n }\n onUpdateSuccess()\n },\n onError: (e: Error) => {\n setError(e)\n },\n }\n\n const { mutate: createAcl, isPending: isPendingCreateAcl } =\n useCreateEntityACL(mutationOptions)\n const { mutate: updateAcl, isPending: isPendingUpdateAcl } =\n useUpdateEntityACL(mutationOptions)\n const { mutate: deleteAcl, isPending: isPendingDeleteAcl } =\n useDeleteEntityACL(mutationOptions)\n\n const isPending =\n isPendingCreateAcl ||\n isPendingUpdateAcl ||\n isPendingDeleteAcl ||\n isPendingSendMessageToNewACLUsers\n\n const hasAclChanged = useMemo(() => {\n return (\n originalIsInherited != updatedIsInherited ||\n !resourceAccessListIsEqual(\n consolidatedOriginalResourceAccess,\n updatedResourceAccessList,\n )\n )\n }, [\n consolidatedOriginalResourceAccess,\n originalIsInherited,\n updatedIsInherited,\n updatedResourceAccessList,\n ])\n\n const canSave =\n hasAclChanged || isLoadingSendMessageToNewACLUsers || isPending\n\n const showInheritedAclUpdateWarning = hasAclChanged && isAfterUpload\n\n useEffect(() => {\n onCanSaveChange(canSave)\n }, [onCanSaveChange, canSave])\n\n useImperativeHandle(\n ref,\n () => {\n return {\n save() {\n if (canSave) {\n // Check if the inheritance changed; if so, the ACL should be created/deleted\n if (originalIsInherited != updatedIsInherited) {\n if (updatedIsInherited) {\n deleteAcl(entityId)\n } else {\n createAcl({\n id: entityId,\n resourceAccess: updatedResourceAccessList,\n })\n }\n } else {\n // Inheritance did not change; update the ACL\n updateAcl({\n // ensure we get all fields from the original ACL, including the etag\n ...entityBundle.accessControlList!,\n resourceAccess: updatedResourceAccessList,\n })\n }\n } else {\n console.error('EntityAclEditor: save() called but canSave is false')\n }\n },\n }\n },\n [\n canSave,\n createAcl,\n deleteAcl,\n entityBundle,\n entityId,\n originalIsInherited,\n updateAcl,\n updatedIsInherited,\n updatedResourceAccessList,\n ],\n )\n\n return (\n <Stack\n sx={{\n gap: 2,\n }}\n >\n <OpenData\n isOpenData={isOpenData}\n isPublic={isPublic}\n currentUserCanUpdateSharingSettings={canEdit}\n />\n <InheritanceMessage\n isProject={isProject}\n isInherited={updatedIsInherited}\n benefactorId={updatedIsInherited ? parentAcl?.id : entityId}\n isAfterUpload={isAfterUpload}\n />\n {showInheritedAclUpdateWarning && (\n <FullWidthAlert\n isGlobal={false}\n variant={'warning'}\n title={`Edits will affect settings of entire ${entityTypeToFriendlyName(\n entityBundle?.entityType,\n ).toLowerCase()}.`}\n description={\n <>\n <p>\n Editing the settings here will impact the sharing settings for\n all files and folders within this{' '}\n {entityTypeToFriendlyName(\n entityBundle?.entityType,\n ).toLowerCase()}\n , not just the ones you&apos;ve recently uploaded.\n </p>\n <p>\n View the instructions above for setting your{' '}\n <Link\n href={\n SYNAPSE_DOCS_SHARING_SETTINGS_PERMISSIONS_CONDITIONS_FOR_USE_URL\n }\n target={'_blank'}\n >\n Local Sharing Settings\n </Link>\n .\n </p>\n </>\n }\n />\n )}\n <AclEditor\n isInherited={updatedIsInherited}\n canEdit={getCanEditResourceAccess(\n canEdit,\n updatedIsInherited,\n ownProfile,\n publicGroupId,\n )}\n canRemoveEntry={getCanDeleteResourceAccess(\n canEdit,\n updatedIsInherited,\n ownProfile,\n )}\n resourceAccessList={updatedResourceAccessList}\n availablePermissionLevels={availablePermissionLevels}\n emptyText={/* This should never happen */ ''}\n displayedPermissionLevelOverride={getDisplayedPermissionLevelOverride(\n isOpenData,\n publicGroupId,\n )}\n onAddPrincipalToAcl={id => {\n if (publicGroupId !== undefined && String(id) === publicGroupId) {\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_VIEW'),\n )\n } else {\n addResourceAccessItem(\n id,\n getAccessTypeFromPermissionLevel('CAN_DOWNLOAD'),\n )\n }\n }}\n updateResourceAccessItem={updateResourceAccessItem}\n removeResourceAccessItem={removeResourceAccessItem}\n showNotifyCheckbox={true}\n notifyCheckboxValue={notifyNewAdditions}\n onNotifyCheckboxChange={setNotifyNewAdditions}\n showAddRemovePublicButton={true}\n />\n {/* Create / delete local sharing settings button */}\n {!isAfterUpload &&\n !isProject &&\n entityBundle.permissions.canEnableInheritance && (\n <CreateOrDeleteLocalSharingSettingsButton\n isInherited={updatedIsInherited}\n setIsInherited={setUpdatedIsInherited}\n />\n )}\n {error && <Alert severity=\"error\">{error.message}</Alert>}\n </Stack>\n )\n})\n\nconst EntityAclEditorWithSuspense = forwardRef(\n function EntityAclEditorWithSuspense(\n props: EntityAclEditorProps,\n ref: ForwardedRef<EntityAclEditorHandle>,\n ) {\n return (\n <SynapseErrorBoundary>\n <Suspense fallback={<AclEditorSkeleton />}>\n <EntityAclEditor {...props} ref={ref} />\n </Suspense>\n </SynapseErrorBoundary>\n )\n },\n)\n\nexport default EntityAclEditorWithSuspense\n"],"mappings":"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"}