synapse-react-client 4.0.9 → 4.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (613) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
  6. package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
  7. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  8. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  9. package/dist/assets/icons/CloudWarning.js +47 -0
  10. package/dist/assets/icons/CloudWarning.js.map +1 -0
  11. package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
  12. package/dist/assets/icons/TasksIcon.js +6 -10
  13. package/dist/assets/icons/TasksIcon.js.map +1 -1
  14. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  15. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
  16. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  17. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  18. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  19. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  21. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  22. package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
  23. package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
  24. package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
  25. package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
  26. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
  27. package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
  28. package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
  29. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  30. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
  31. package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
  32. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  33. package/dist/components/Authentication/Constants.d.ts +1 -0
  34. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  35. package/dist/components/Authentication/Constants.js +2 -2
  36. package/dist/components/Authentication/Constants.js.map +1 -1
  37. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  38. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  39. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  40. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  41. package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
  42. package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
  43. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  44. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  45. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
  46. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  47. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  48. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  49. package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
  50. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  51. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  52. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  53. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  54. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  55. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  56. package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
  57. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  58. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  59. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  60. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  61. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  62. package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
  63. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  64. package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
  65. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  66. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  67. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  68. package/dist/components/ComponentCollapse.js.map +1 -1
  69. package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
  70. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  71. package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
  72. package/dist/components/DataGrid/DataGrid.d.ts +0 -1
  73. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  74. package/dist/components/DataGrid/DataGrid.js +72 -72
  75. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  76. package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
  77. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  78. package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
  79. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  80. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  81. package/dist/components/DataGrid/SynapseGrid.js +326 -268
  82. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  83. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
  84. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  85. package/dist/components/DataGrid/columns/AutocompleteColumn.js +124 -67
  86. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  87. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
  88. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  89. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
  90. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  91. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
  92. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
  93. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
  94. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
  95. package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
  96. package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
  97. package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
  98. package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
  99. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
  100. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  101. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  102. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  103. package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
  104. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
  105. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  106. package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
  107. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  108. package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
  109. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  110. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  111. package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
  112. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  113. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  114. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  115. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  116. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  117. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  118. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  119. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  120. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  121. package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
  122. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  123. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  124. package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
  125. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  126. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  127. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  128. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  129. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  130. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  131. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  132. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  133. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  134. package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
  135. package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
  136. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  137. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  138. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  139. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  140. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  141. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  142. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  143. package/dist/components/DirectDownloadButton.js.map +1 -1
  144. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  145. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  146. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  147. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  148. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  149. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  150. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  151. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  152. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  153. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  154. package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
  155. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  156. package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
  157. package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
  158. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  159. package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
  160. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  161. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
  162. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  163. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  164. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  165. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  166. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  167. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
  168. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
  169. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  170. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  171. package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
  172. package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
  173. package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
  174. package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
  175. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  176. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  177. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  178. package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
  179. package/dist/components/EntityForm/EntityForm.js.map +1 -1
  180. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  181. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  182. package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
  183. package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
  184. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  185. package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
  186. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  187. package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
  188. package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
  189. package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
  190. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  191. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  192. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  193. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  194. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  195. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  196. package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
  197. package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
  198. package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
  199. package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
  200. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  201. package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
  202. package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
  203. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  204. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  205. package/dist/components/Forum/DiscussionReply.js +19 -19
  206. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  207. package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
  208. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  209. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  210. package/dist/components/Forum/DiscussionThread.js +73 -72
  211. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  212. package/dist/components/Forum/ForumTable.js.map +1 -1
  213. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  214. package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
  215. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  216. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  217. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  218. package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
  219. package/dist/components/GenericCard/GenericCard.js +12 -7
  220. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  221. package/dist/components/GenericCard/Linkify.js.map +1 -1
  222. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  223. package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
  224. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  225. package/dist/components/Goals/Goals.Mobile.js.map +1 -1
  226. package/dist/components/Goals/Goals.js.map +1 -1
  227. package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
  228. package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
  229. package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
  230. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  231. package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
  232. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  233. package/dist/components/HasAccess/useHasAccess.js.map +1 -1
  234. package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
  235. package/dist/components/HeaderCard.d.ts +6 -1
  236. package/dist/components/HeaderCard.d.ts.map +1 -1
  237. package/dist/components/HeaderCard.js +107 -76
  238. package/dist/components/HeaderCard.js.map +1 -1
  239. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  240. package/dist/components/IconList.js.map +1 -1
  241. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  242. package/dist/components/IconSvg/IconSvg.js +2 -1
  243. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  244. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
  245. package/dist/components/ImageFromSynapseTable.js.map +1 -1
  246. package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
  247. package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
  248. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
  249. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  250. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  251. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  252. package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
  253. package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
  254. package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
  255. package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
  256. package/dist/components/Markdown/UserMentionModal.js.map +1 -1
  257. package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
  258. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  259. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  260. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  261. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
  262. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  263. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  264. package/dist/components/PageProgress/PageProgress.js.map +1 -1
  265. package/dist/components/Plot/DotPlot.js.map +1 -1
  266. package/dist/components/Plot/Plot.js.map +1 -1
  267. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  268. package/dist/components/Plot/ThemesPlot.js.map +1 -1
  269. package/dist/components/Plot/UpsetPlot.js.map +1 -1
  270. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  271. package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
  272. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  273. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
  274. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  275. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
  276. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  277. package/dist/components/Programs/Programs.Mobile.js.map +1 -1
  278. package/dist/components/Programs/Programs.js.map +1 -1
  279. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  280. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  281. package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
  282. package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
  283. package/dist/components/QueryCount/QueryCount.js.map +1 -1
  284. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  285. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  286. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  287. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  288. package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
  289. package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
  290. package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
  291. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  292. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  293. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  294. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
  295. package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
  296. package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
  297. package/dist/components/Resources/Resources.Mobile.js.map +1 -1
  298. package/dist/components/Resources/Resources.js.map +1 -1
  299. package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
  300. package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
  301. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  302. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  303. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  304. package/dist/components/SmartLink/SmartButton.js.map +1 -1
  305. package/dist/components/SmartLink/SmartLink.js.map +1 -1
  306. package/dist/components/SourceAppImage.js.map +1 -1
  307. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  308. package/dist/components/StatisticsPlot.js.map +1 -1
  309. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  310. package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
  311. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  312. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  313. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  314. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  315. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  316. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  317. package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
  318. package/dist/components/SynapseForm/SynapseForm.js +4 -2
  319. package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
  320. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  321. package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
  322. package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
  323. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  324. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  325. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  326. package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
  327. package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
  328. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
  329. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  330. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
  331. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  332. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  333. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
  334. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  335. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  336. package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
  337. package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
  338. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  339. package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
  340. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  341. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  342. package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
  343. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  344. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  345. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  346. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
  347. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  348. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
  349. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
  350. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  351. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  352. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  353. package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
  354. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  355. package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
  356. package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
  357. package/dist/components/TanStackTable/ColumnHeader.js +8 -8
  358. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  359. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  360. package/dist/components/TanStackTable/TableBody.js.map +1 -1
  361. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  362. package/dist/components/TextField/TextField.js.map +1 -1
  363. package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
  364. package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
  365. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  366. package/dist/components/UserCard/Avatar.js.map +1 -1
  367. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  368. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
  369. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  370. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  371. package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
  372. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  373. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  374. package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
  375. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  376. package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
  377. package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
  378. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  379. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  380. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  381. package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
  382. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  383. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  384. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  385. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  386. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  387. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  388. package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
  389. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  390. package/dist/components/error/ErrorPage.js.map +1 -1
  391. package/dist/components/favorites/FavoritesPage.js.map +1 -1
  392. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  393. package/dist/components/layout/SWCHeader.d.ts +9 -0
  394. package/dist/components/layout/SWCHeader.d.ts.map +1 -0
  395. package/dist/components/layout/SWCHeader.js +19 -0
  396. package/dist/components/layout/SWCHeader.js.map +1 -0
  397. package/dist/components/layout/SWCPageLayout.d.ts +9 -0
  398. package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
  399. package/dist/components/layout/SWCPageLayout.js +14 -0
  400. package/dist/components/layout/SWCPageLayout.js.map +1 -0
  401. package/dist/components/menu/ComplexMenu.js.map +1 -1
  402. package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
  403. package/dist/components/styled/StyledPopover.js.map +1 -1
  404. package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
  405. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  406. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  407. package/dist/components/trash/TrashCanList.js.map +1 -1
  408. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  409. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  410. package/dist/components/widgets/SynapseVideo.js.map +1 -1
  411. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  412. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  413. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  414. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  415. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
  416. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  417. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  418. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  419. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  420. package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
  421. package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
  422. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  423. package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
  424. package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
  425. package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
  426. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
  427. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
  428. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
  429. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
  430. package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
  431. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
  432. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
  433. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
  434. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
  435. package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
  436. package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
  437. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
  438. package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
  439. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
  440. package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
  441. package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
  442. package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
  443. package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
  444. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
  445. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
  446. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
  447. package/dist/features/curator/dashboard/components/shared.css +1 -0
  448. package/dist/features/curator/dashboard/components/shared.module.js +5 -0
  449. package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
  450. package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
  451. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
  452. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  453. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
  454. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  455. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  456. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  457. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  458. package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
  459. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  460. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  461. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
  462. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  463. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
  464. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
  465. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
  466. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
  467. package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
  468. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
  469. package/dist/features/entity/metadata-task/utils/constants.js +6 -0
  470. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
  471. package/dist/mocks/challenge/mockChallenge.js.map +1 -1
  472. package/dist/mocks/entity/mockDataset.js.map +1 -1
  473. package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
  474. package/dist/mocks/entity/mockFileEntity.js.map +1 -1
  475. package/dist/mocks/entity/mockFileView.js.map +1 -1
  476. package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
  477. package/dist/mocks/entity/mockProject.js.map +1 -1
  478. package/dist/mocks/entity/mockProjectView.js.map +1 -1
  479. package/dist/mocks/entity/mockRootEntity.js.map +1 -1
  480. package/dist/mocks/entity/mockTableEntity.js.map +1 -1
  481. package/dist/mocks/mockWiki.js.map +1 -1
  482. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  483. package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
  484. package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
  485. package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
  486. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  487. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  488. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  489. package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
  490. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  491. package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
  492. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  493. package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
  494. package/dist/mocks/provenance/mockActivity.js.map +1 -1
  495. package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
  496. package/dist/ror-client/index.js.map +1 -1
  497. package/dist/style/components/_cards.scss +4 -0
  498. package/dist/style/components/_data-grid-extra.css +1 -1
  499. package/dist/style/components/_data-grid-extra.scss +2 -0
  500. package/dist/style/main.css +1 -1
  501. package/dist/synapse-client/HttpClient.js.map +1 -1
  502. package/dist/synapse-client/SynapseClient.js.map +1 -1
  503. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  504. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  505. package/dist/synapse-queries/KeyFactory.js +3 -0
  506. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  507. package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
  508. package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
  509. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
  510. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  511. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  512. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  513. package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
  514. package/dist/synapse-queries/doi/useDOI.js.map +1 -1
  515. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  516. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  517. package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
  518. package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
  519. package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
  520. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  521. package/dist/synapse-queries/entity/useSchema.js.map +1 -1
  522. package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
  523. package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
  524. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  525. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  526. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  527. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  528. package/dist/synapse-queries/forum/useThread.js +19 -12
  529. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  530. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
  531. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
  532. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  533. package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
  534. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  535. package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
  536. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  537. package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
  538. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  539. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  540. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  541. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  542. package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
  543. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  544. package/dist/theme/ThemeProvider.js.map +1 -1
  545. package/dist/tsconfig.build.tsbuildinfo +1 -1
  546. package/dist/utils/APIConstants.d.ts +1 -0
  547. package/dist/utils/APIConstants.d.ts.map +1 -1
  548. package/dist/utils/APIConstants.js +2 -2
  549. package/dist/utils/APIConstants.js.map +1 -1
  550. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  551. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  552. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  553. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  554. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  555. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  556. package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
  557. package/dist/utils/context/SynapseContext.js.map +1 -1
  558. package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
  559. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  560. package/dist/utils/functions/AccessControlListUtils.js +12 -1
  561. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  562. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  563. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  564. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  565. package/dist/utils/functions/GridApiUtils.js.map +1 -1
  566. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  567. package/dist/utils/functions/RealmUtils.d.ts +4 -0
  568. package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
  569. package/dist/utils/functions/RealmUtils.js +9 -3
  570. package/dist/utils/functions/RealmUtils.js.map +1 -1
  571. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  572. package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
  573. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  574. package/dist/utils/functions/StringUtils.js.map +1 -1
  575. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  576. package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
  577. package/dist/utils/functions/getEndpoint.js.map +1 -1
  578. package/dist/utils/functions/getUserData.js.map +1 -1
  579. package/dist/utils/functions/queryUtils.js.map +1 -1
  580. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  581. package/dist/utils/hooks/useConfirmItems.js.map +1 -1
  582. package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
  583. package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
  584. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  585. package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
  586. package/dist/utils/hooks/useGetGoalData.js.map +1 -1
  587. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  588. package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
  589. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  590. package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
  591. package/dist/utils/hooks/useIsBot.js.map +1 -1
  592. package/dist/utils/hooks/useListState.js.map +1 -1
  593. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  594. package/dist/utils/hooks/useLogin.js +53 -52
  595. package/dist/utils/hooks/useLogin.js.map +1 -1
  596. package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
  597. package/dist/utils/hooks/useOverlay.js.map +1 -1
  598. package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
  599. package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
  600. package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
  601. package/dist/utils/hooks/useSet.js.map +1 -1
  602. package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
  603. package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
  604. package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
  605. package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
  606. package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
  607. package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
  608. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
  609. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
  610. package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
  611. package/dist/utils/html/TargetEnum.js.map +1 -1
  612. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  613. package/package.json +5 -5
@@ -22,25 +22,25 @@ var C = (n) => {
22
22
  t(`${`${window.location.origin}${window.location.pathname}`}?${p}=${n}`).then(() => e("Reply link copied to clipboard", "info"));
23
23
  };
24
24
  function w(t) {
25
- let { reply: w, isReplyAuthorModerator: T = !1 } = t, [E, D] = g(!1), [O, k] = g(!1), { data: A } = r(), { data: j } = n(w.projectId), { data: M, isLoading: N } = d(w), P = h(null), { mutate: F } = u({ onSuccess: () => {
26
- k(!1), e("A reply has been deleted.", "info");
27
- } }), I = w.createdBy == A?.ownerId;
25
+ let { reply: w, isReplyAuthorModerator: T = !1, isForumModerator: E } = t, [D, O] = g(!1), [k, A] = g(!1), { data: j } = r(), { data: M } = n(w.projectId), { data: N, isLoading: P } = d(w), F = h(null), { mutate: I } = u({ onSuccess: () => {
26
+ A(!1), e("A reply has been deleted.", "info");
27
+ } }), L = w.createdBy == j?.ownerId;
28
28
  return m(() => {
29
29
  let e = new URLSearchParams(window.location.search).get(p), t;
30
- return e === w.id && P.current && (P.current.style.transition = "background-color 1s ease", P.current.style.backgroundColor = "#fbf4e0", P.current.style.borderColor = "#f4dda3", t = setTimeout(() => {
31
- P.current && (P.current.style.backgroundColor = "#f9f9f9", P.current.style.borderColor = "#ccc");
30
+ return e === w.id && F.current && (F.current.style.transition = "background-color 1s ease", F.current.style.backgroundColor = "#fbf4e0", F.current.style.borderColor = "#f4dda3", t = setTimeout(() => {
31
+ F.current && (F.current.style.backgroundColor = "#f9f9f9", F.current.style.borderColor = "#ccc");
32
32
  }, 2e3)), () => {
33
33
  t && clearTimeout(t);
34
34
  };
35
35
  }, [w.id]), /* @__PURE__ */ y("div", {
36
36
  className: "reply-container",
37
37
  id: `reply._${w.id}`,
38
- ref: P,
38
+ ref: F,
39
39
  role: "article",
40
- children: N ? /* @__PURE__ */ y(i, {
40
+ children: P ? /* @__PURE__ */ y(i, {
41
41
  numCols: 1,
42
42
  numRows: 4
43
- }) : /* @__PURE__ */ y(v, { children: M && /* @__PURE__ */ b(v, { children: [
43
+ }) : /* @__PURE__ */ y(v, { children: N && /* @__PURE__ */ b(v, { children: [
44
44
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y(l, {
45
45
  userId: w.createdBy,
46
46
  withAvatar: !0,
@@ -51,7 +51,7 @@ function w(t) {
51
51
  className: "message-body",
52
52
  children: [
53
53
  /* @__PURE__ */ y(a, {
54
- markdown: M,
54
+ markdown: N,
55
55
  objectType: x.REPLY
56
56
  }),
57
57
  /* @__PURE__ */ b("span", { children: [
@@ -77,15 +77,15 @@ function w(t) {
77
77
  label: "Copy link to this reply"
78
78
  })
79
79
  }),
80
- I && /* @__PURE__ */ y("button", {
81
- onClick: () => D(!0),
80
+ L && /* @__PURE__ */ y("button", {
81
+ onClick: () => O(!0),
82
82
  children: /* @__PURE__ */ y(o, {
83
83
  icon: "edit",
84
84
  label: "Edit reply"
85
85
  })
86
86
  }),
87
- j?.permissions.canModerate && /* @__PURE__ */ y("button", {
88
- onClick: () => k(!0),
87
+ (M?.permissions.canModerate || E) && /* @__PURE__ */ y("button", {
88
+ onClick: () => A(!0),
89
89
  children: /* @__PURE__ */ y(o, {
90
90
  icon: "delete",
91
91
  label: "Delete reply"
@@ -97,20 +97,20 @@ function w(t) {
97
97
  })] }),
98
98
  /* @__PURE__ */ y(f, {
99
99
  isReply: !0,
100
- initialText: M,
101
- onClose: () => D(!1),
100
+ initialText: N,
101
+ onClose: () => O(!1),
102
102
  id: w.id,
103
103
  isDialog: !0,
104
- openDialog: E
104
+ openDialog: D
105
105
  }),
106
106
  /* @__PURE__ */ y(s, {
107
- open: O,
107
+ open: k,
108
108
  title: "Confirm Deletion",
109
109
  content: "Are you sure you want to delete this reply?",
110
110
  onCancel: () => {
111
- k(!1);
111
+ A(!1);
112
112
  },
113
- onConfirm: () => F({
113
+ onConfirm: () => I({
114
114
  forumId: w.forumId,
115
115
  threadId: w.threadId,
116
116
  replyId: w.id
@@ -1 +1 @@
1
- {"version":3,"file":"DiscussionReply.js","names":[],"sources":["../../../src/components/Forum/DiscussionReply.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useDeleteReply, useGetReply } from '@/synapse-queries/forum/useReply'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n DiscussionReplyBundle,\n ObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState, useRef, useEffect } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport { SkeletonTable } from '../Skeleton/SkeletonTable'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { Box } from '@mui/material'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\n\nexport type DiscussionReplyProps = {\n reply: DiscussionReplyBundle\n isReplyAuthorModerator?: boolean\n onClickLink?: () => void\n}\n\nconst handleCopyLink = (id: string) => {\n const baseUrl = `${window.location.origin}${window.location.pathname}`\n const url = `${baseUrl}?${REPLY_ID_PARAM_KEY}=${id}`\n copyStringToClipboard(url).then(() =>\n displayToast('Reply link copied to clipboard', 'info'),\n )\n}\n\nexport function DiscussionReply(props: DiscussionReplyProps) {\n const { reply, isReplyAuthorModerator = false } = props\n const [showReplyModal, setShowReplyModal] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(reply.projectId)\n const { data: message, isLoading } = useGetReply(reply)\n const replyRef = useRef<HTMLDivElement>(null)\n\n const { mutate: deleteReply } = useDeleteReply({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A reply has been deleted.', 'info')\n },\n })\n\n const isCurrentUserAuthor = reply.createdBy == currentUserProfile?.ownerId\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const replyId = params.get(REPLY_ID_PARAM_KEY)\n let timerId: ReturnType<typeof setTimeout>\n if (replyId === reply.id && replyRef.current) {\n replyRef.current.style.transition = 'background-color 1s ease'\n replyRef.current.style.backgroundColor = '#fbf4e0'\n replyRef.current.style.borderColor = '#f4dda3'\n timerId = setTimeout(() => {\n if (replyRef.current) {\n replyRef.current.style.backgroundColor = '#f9f9f9'\n replyRef.current.style.borderColor = '#ccc'\n }\n }, 2000)\n }\n return () => {\n if (timerId) {\n clearTimeout(timerId)\n }\n }\n }, [reply.id])\n\n return (\n <div\n className=\"reply-container\"\n id={`reply._${reply.id}`}\n ref={replyRef}\n role={'article'}\n >\n {isLoading ? (\n <SkeletonTable numCols={1} numRows={4} />\n ) : (\n <>\n {message && (\n <>\n <div>\n <UserBadge\n userId={reply.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isReplyAuthorModerator}\n />\n <div className=\"message-body\">\n <MarkdownSynapse\n markdown={message}\n objectType={ObjectType.REPLY}\n />\n <span>\n posted {formatDate(dayjs(reply.createdOn), 'M/D/YYYY')}\n {reply.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: { xs: '8px', sm: 0 },\n float: { sm: 'right' },\n }}\n >\n <button onClick={() => handleCopyLink(reply.id)}>\n <IconSvg icon=\"link\" label={'Copy link to this reply'} />\n </button>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowReplyModal(true)}>\n <IconSvg icon=\"edit\" label={'Edit reply'} />\n </button>\n )}\n {entityBundle?.permissions.canModerate && (\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label={'Delete reply'} />\n </button>\n )}\n </Box>\n </div>\n </div>\n <ForumThreadEditor\n isReply={true}\n initialText={message}\n onClose={() => setShowReplyModal(false)}\n id={reply.id}\n isDialog={true}\n openDialog={showReplyModal}\n />\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this reply?\"\n onCancel={() => {\n setShowDeleteModal(false)\n }}\n onConfirm={() =>\n deleteReply({\n forumId: reply.forumId,\n threadId: reply.threadId,\n replyId: reply.id,\n })\n }\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n </>\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiscussionReply.js","names":[],"sources":["../../../src/components/Forum/DiscussionReply.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useDeleteReply, useGetReply } from '@/synapse-queries/forum/useReply'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n DiscussionReplyBundle,\n ObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState, useRef, useEffect } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport { SkeletonTable } from '../Skeleton/SkeletonTable'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { Box } from '@mui/material'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\n\nexport type DiscussionReplyProps = {\n reply: DiscussionReplyBundle\n isReplyAuthorModerator?: boolean\n isForumModerator?: boolean\n onClickLink?: () => void\n}\n\nconst handleCopyLink = (id: string) => {\n const baseUrl = `${window.location.origin}${window.location.pathname}`\n const url = `${baseUrl}?${REPLY_ID_PARAM_KEY}=${id}`\n copyStringToClipboard(url).then(() =>\n displayToast('Reply link copied to clipboard', 'info'),\n )\n}\n\nexport function DiscussionReply(props: DiscussionReplyProps) {\n const { reply, isReplyAuthorModerator = false, isForumModerator } = props\n const [showReplyModal, setShowReplyModal] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(reply.projectId)\n const { data: message, isLoading } = useGetReply(reply)\n const replyRef = useRef<HTMLDivElement>(null)\n\n const { mutate: deleteReply } = useDeleteReply({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A reply has been deleted.', 'info')\n },\n })\n\n const isCurrentUserAuthor = reply.createdBy == currentUserProfile?.ownerId\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const replyId = params.get(REPLY_ID_PARAM_KEY)\n let timerId: ReturnType<typeof setTimeout>\n if (replyId === reply.id && replyRef.current) {\n replyRef.current.style.transition = 'background-color 1s ease'\n replyRef.current.style.backgroundColor = '#fbf4e0'\n replyRef.current.style.borderColor = '#f4dda3'\n timerId = setTimeout(() => {\n if (replyRef.current) {\n replyRef.current.style.backgroundColor = '#f9f9f9'\n replyRef.current.style.borderColor = '#ccc'\n }\n }, 2000)\n }\n return () => {\n if (timerId) {\n clearTimeout(timerId)\n }\n }\n }, [reply.id])\n\n return (\n <div\n className=\"reply-container\"\n id={`reply._${reply.id}`}\n ref={replyRef}\n role={'article'}\n >\n {isLoading ? (\n <SkeletonTable numCols={1} numRows={4} />\n ) : (\n <>\n {message && (\n <>\n <div>\n <UserBadge\n userId={reply.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isReplyAuthorModerator}\n />\n <div className=\"message-body\">\n <MarkdownSynapse\n markdown={message}\n objectType={ObjectType.REPLY}\n />\n <span>\n posted {formatDate(dayjs(reply.createdOn), 'M/D/YYYY')}\n {reply.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: { xs: '8px', sm: 0 },\n float: { sm: 'right' },\n }}\n >\n <button onClick={() => handleCopyLink(reply.id)}>\n <IconSvg icon=\"link\" label={'Copy link to this reply'} />\n </button>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowReplyModal(true)}>\n <IconSvg icon=\"edit\" label={'Edit reply'} />\n </button>\n )}\n {(entityBundle?.permissions.canModerate ||\n isForumModerator) && (\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label={'Delete reply'} />\n </button>\n )}\n </Box>\n </div>\n </div>\n <ForumThreadEditor\n isReply={true}\n initialText={message}\n onClose={() => setShowReplyModal(false)}\n id={reply.id}\n isDialog={true}\n openDialog={showReplyModal}\n />\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this reply?\"\n onCancel={() => {\n setShowDeleteModal(false)\n }}\n onConfirm={() =>\n deleteReply({\n forumId: reply.forumId,\n threadId: reply.threadId,\n replyId: reply.id,\n })\n }\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n </>\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DiscussionSearchResult.js","names":[],"sources":["../../../src/components/Forum/DiscussionSearchResult.tsx"],"sourcesContent":["import {\n getReply,\n getReplyMessageUrl,\n getThread,\n getThreadMessageUrl,\n getUserProfileById,\n} from '@/synapse-client/SynapseClient'\nimport React from 'react'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Skeleton, Typography } from '@mui/material'\nimport {\n DiscussionReplyBundle,\n DiscussionThreadBundle,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SkeletonParagraph } from '../Skeleton/SkeletonParagraph'\nimport { UserBadge } from '../UserCard/UserBadge'\n\nexport const getMessage = async (url: string): Promise<string> => {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: '*/*',\n 'Access-Control-Request-Headers': 'authorization',\n 'Content-Type': 'text/plain; charset=utf-8',\n },\n })\n return response.text()\n}\n\nexport type DiscussionSearchResultProps = {\n threadId: string\n replyId?: string\n}\n\nconst DiscussionSearchResult = (\n props: DiscussionSearchResultProps,\n): React.ReactNode => {\n const { threadId, replyId } = props\n const { accessToken } = useSynapseContext()\n const [threadBundle, setThreadBundle] = useState<DiscussionThreadBundle>()\n const [messageUrl, setMessageUrl] = useState<string>('')\n const [replyBundle, setReplyBundle] = useState<DiscussionReplyBundle>()\n const [replyAuthor, setReplyAuthor] = useState<UserProfile>()\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n const getThreadOrReply = async () => {\n let newMessageUrl\n setIsLoading(true)\n const thread = await getThread(threadId, accessToken)\n if (replyId) {\n const reply = await getReply(replyId, accessToken)\n newMessageUrl = await getReplyMessageUrl(reply.messageKey, accessToken)\n setReplyAuthor(await getUserProfileById(reply.createdBy))\n setReplyBundle(reply)\n } else {\n setReplyAuthor(await getUserProfileById(thread.createdBy))\n newMessageUrl = await getThreadMessageUrl(\n thread.messageKey,\n accessToken,\n )\n }\n setMessageUrl(await getMessage(newMessageUrl.messageUrl))\n setThreadBundle(thread)\n setIsLoading(false)\n }\n getThreadOrReply()\n }, [accessToken, replyId, threadId])\n\n const getUrl = (threadId: string, projectId: string, replyId?: string) => {\n let url = `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${projectId}/discussion/threadId=${threadId}`\n if (replyId) {\n url += `&replyId=${replyId}`\n }\n return url\n }\n\n return (\n <div className=\"search-result-container\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '40px auto',\n }}\n >\n <div>\n {isLoading ? (\n <Skeleton variant=\"circular\" width=\"30px\" height={'30px'} />\n ) : replyId ? (\n <IconSvg icon=\"replyTwoTone\" />\n ) : (\n <IconSvg icon=\"chatTwoTone\" />\n )}\n </div>\n <div>\n {isLoading ? (\n <SkeletonParagraph numRows={4} />\n ) : (\n <>\n <Typography variant=\"headline3\" gutterBottom>\n <a\n className=\"link\"\n href={getUrl(\n threadBundle?.id!,\n threadBundle?.projectId!,\n replyBundle?.id,\n )}\n >\n {threadBundle?.title}\n </a>\n </Typography>\n <div className=\"truncated\">\n <Typography variant=\"body1\" gutterBottom>\n {messageUrl}\n </Typography>\n </div>\n <div className=\"search-result-footer\">\n {replyId ? 'Reply' : 'Thread'} by{' '}\n {<UserBadge userId={replyAuthor?.ownerId} />}{' '}\n {formatDate(dayjs(replyBundle?.createdOn))}\n </div>\n </>\n )}\n </div>\n </Box>\n </div>\n )\n}\n\nexport default DiscussionSearchResult\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,IAAa,OAAO,OACd,MAAM,MAAM,GAAK;CAChC,QAAQ;CACR,SAAS;EACP,QAAQ;EACR,kCAAkC;EAClC,gBAAgB;EACjB;CACF,CAAC,EACc,MAAM,EAQlB,KACJ,MACoB;CACpB,IAAM,EAAE,aAAU,eAAY,GACxB,EAAE,mBAAgB,GAAmB,EACrC,CAAC,GAAc,KAAmB,GAAkC,EACpE,CAAC,GAAY,KAAiB,EAAiB,GAAG,EAClD,CAAC,GAAa,KAAkB,GAAiC,EACjE,CAAC,GAAa,KAAkB,GAAuB,EACvD,CAAC,GAAW,KAAgB,EAAS,GAAM;AAkCjD,QAhCA,QAAgB;AAqBd,GApByB,YAAY;GACnC,IAAI;AACJ,KAAa,GAAK;GAClB,IAAM,IAAS,MAAM,EAAU,GAAU,EAAY;AACrD,OAAI,GAAS;IACX,IAAM,IAAQ,MAAM,EAAS,GAAS,EAAY;AAGlD,IAFA,IAAgB,MAAM,EAAmB,EAAM,YAAY,EAAY,EACvE,EAAe,MAAM,EAAmB,EAAM,UAAU,CAAC,EACzD,EAAe,EAAM;SAGrB,CADA,EAAe,MAAM,EAAmB,EAAO,UAAU,CAAC,EAC1D,IAAgB,MAAM,EACpB,EAAO,YACP,EACD;AAIH,GAFA,EAAc,MAAM,EAAW,EAAc,WAAW,CAAC,EACzD,EAAgB,EAAO,EACvB,EAAa,GAAM;MAEH;IACjB;EAAC;EAAa;EAAS;EAAS,CAAC,EAWlC,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,qBAAqB;IACtB;aAJH,CAME,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD;IAAU,SAAQ;IAAW,OAAM;IAAO,QAAQ;IAAU,CAAA,GAC1D,IACF,kBAAC,GAAD,EAAS,MAAK,gBAAiB,CAAA,GAE/B,kBAAC,GAAD,EAAS,MAAK,eAAgB,CAAA,EAE5B,CAAA,EACN,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD,EAAmB,SAAS,GAAK,CAAA,GAEjC,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KAAY,SAAQ;KAAY,cAAA;eAC9B,kBAAC,KAAD;MACE,WAAU;MACV,QAjCA,GAAkB,GAAmB,MAAqB;OACxE,IAAI,IAAM,GAAG,EAA2B,OAAO,UAAU,EAAU,uBAAuB;AAI1F,cAHI,MACF,KAAO,YAAY,MAEd;SA6BS,GAAc,IACd,GAAc,WACd,GAAa,GACd;gBAEA,GAAc;MACb,CAAA;KACO,CAAA;IACb,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAY,SAAQ;MAAQ,cAAA;gBACzB;MACU,CAAA;KACT,CAAA;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,IAAU,UAAU;MAAS;MAAI;MACjC,kBAAC,GAAD,EAAW,QAAQ,GAAa,SAAW,CAAA;MAAE;MAC7C,EAAW,EAAM,GAAa,UAAU,CAAC;MACtC;;IACL,EAAA,CAAA,EAED,CAAA,CACF;;EACF,CAAA"}
1
+ {"version":3,"file":"DiscussionSearchResult.js","names":[],"sources":["../../../src/components/Forum/DiscussionSearchResult.tsx"],"sourcesContent":["import {\n getReply,\n getReplyMessageUrl,\n getThread,\n getThreadMessageUrl,\n getUserProfileById,\n} from '@/synapse-client/SynapseClient'\nimport React from 'react'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Skeleton, Typography } from '@mui/material'\nimport {\n DiscussionReplyBundle,\n DiscussionThreadBundle,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SkeletonParagraph } from '../Skeleton/SkeletonParagraph'\nimport { UserBadge } from '../UserCard/UserBadge'\n\nexport const getMessage = async (url: string): Promise<string> => {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: '*/*',\n 'Access-Control-Request-Headers': 'authorization',\n 'Content-Type': 'text/plain; charset=utf-8',\n },\n })\n return response.text()\n}\n\nexport type DiscussionSearchResultProps = {\n threadId: string\n replyId?: string\n}\n\nconst DiscussionSearchResult = (\n props: DiscussionSearchResultProps,\n): React.ReactNode => {\n const { threadId, replyId } = props\n const { accessToken } = useSynapseContext()\n const [threadBundle, setThreadBundle] = useState<DiscussionThreadBundle>()\n const [messageUrl, setMessageUrl] = useState<string>('')\n const [replyBundle, setReplyBundle] = useState<DiscussionReplyBundle>()\n const [replyAuthor, setReplyAuthor] = useState<UserProfile>()\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n const getThreadOrReply = async () => {\n let newMessageUrl\n setIsLoading(true)\n const thread = await getThread(threadId, accessToken)\n if (replyId) {\n const reply = await getReply(replyId, accessToken)\n newMessageUrl = await getReplyMessageUrl(reply.messageKey, accessToken)\n setReplyAuthor(await getUserProfileById(reply.createdBy))\n setReplyBundle(reply)\n } else {\n setReplyAuthor(await getUserProfileById(thread.createdBy))\n newMessageUrl = await getThreadMessageUrl(\n thread.messageKey,\n accessToken,\n )\n }\n setMessageUrl(await getMessage(newMessageUrl.messageUrl))\n setThreadBundle(thread)\n setIsLoading(false)\n }\n getThreadOrReply()\n }, [accessToken, replyId, threadId])\n\n const getUrl = (threadId: string, projectId: string, replyId?: string) => {\n let url = `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${projectId}/discussion/threadId=${threadId}`\n if (replyId) {\n url += `&replyId=${replyId}`\n }\n return url\n }\n\n return (\n <div className=\"search-result-container\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '40px auto',\n }}\n >\n <div>\n {isLoading ? (\n <Skeleton variant=\"circular\" width=\"30px\" height={'30px'} />\n ) : replyId ? (\n <IconSvg icon=\"replyTwoTone\" />\n ) : (\n <IconSvg icon=\"chatTwoTone\" />\n )}\n </div>\n <div>\n {isLoading ? (\n <SkeletonParagraph numRows={4} />\n ) : (\n <>\n <Typography variant=\"headline3\" gutterBottom>\n <a\n className=\"link\"\n href={getUrl(\n threadBundle?.id!,\n threadBundle?.projectId!,\n replyBundle?.id,\n )}\n >\n {threadBundle?.title}\n </a>\n </Typography>\n <div className=\"truncated\">\n <Typography variant=\"body1\" gutterBottom>\n {messageUrl}\n </Typography>\n </div>\n <div className=\"search-result-footer\">\n {replyId ? 'Reply' : 'Thread'} by{' '}\n {<UserBadge userId={replyAuthor?.ownerId} />}{' '}\n {formatDate(dayjs(replyBundle?.createdOn))}\n </div>\n </>\n )}\n </div>\n </Box>\n </div>\n )\n}\n\nexport default DiscussionSearchResult\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,IAAa,OAAO,OASxB,MARgB,MAAM,GAAK;CAChC,QAAQ;CACR,SAAS;EACP,QAAQ;EACR,kCAAkC;EAClC,gBAAgB;EACjB;CACF,CAAC,EACc,MAAM,EAQlB,KACJ,MACoB;CACpB,IAAM,EAAE,aAAU,eAAY,GACxB,EAAE,mBAAgB,GAAmB,EACrC,CAAC,GAAc,KAAmB,GAAkC,EACpE,CAAC,GAAY,KAAiB,EAAiB,GAAG,EAClD,CAAC,GAAa,KAAkB,GAAiC,EACjE,CAAC,GAAa,KAAkB,GAAuB,EACvD,CAAC,GAAW,KAAgB,EAAS,GAAM;AAkCjD,QAhCA,QAAgB;AAqBd,eApBqC;GACnC,IAAI;AACJ,KAAa,GAAK;GAClB,IAAM,IAAS,MAAM,EAAU,GAAU,EAAY;AACrD,OAAI,GAAS;IACX,IAAM,IAAQ,MAAM,EAAS,GAAS,EAAY;AAGlD,IAFA,IAAgB,MAAM,EAAmB,EAAM,YAAY,EAAY,EACvE,EAAe,MAAM,EAAmB,EAAM,UAAU,CAAC,EACzD,EAAe,EAAM;SAGrB,CADA,EAAe,MAAM,EAAmB,EAAO,UAAU,CAAC,EAC1D,IAAgB,MAAM,EACpB,EAAO,YACP,EACD;AAIH,GAFA,EAAc,MAAM,EAAW,EAAc,WAAW,CAAC,EACzD,EAAgB,EAAO,EACvB,EAAa,GAAM;MAEH;IACjB;EAAC;EAAa;EAAS;EAAS,CAAC,EAWlC,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,qBAAqB;IACtB;aAJH,CAME,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD;IAAU,SAAQ;IAAW,OAAM;IAAO,QAAQ;IAAU,CAAA,GAC1D,IACF,kBAAC,GAAD,EAAS,MAAK,gBAAiB,CAAA,GAE/B,kBAAC,GAAD,EAAS,MAAK,eAAgB,CAAA,EAE5B,CAAA,EACN,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD,EAAmB,SAAS,GAAK,CAAA,GAEjC,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KAAY,SAAQ;KAAY,cAAA;eAC9B,kBAAC,KAAD;MACE,WAAU;MACV,QAjCA,GAAkB,GAAmB,MAAqB;OACxE,IAAI,IAAM,GAAG,EAA2B,OAAO,UAAU,EAAU,uBAAuB;AAI1F,cAHI,MACF,KAAO,YAAY,MAEd;SA6BS,GAAc,IACd,GAAc,WACd,GAAa,GACd;gBAEA,GAAc;MACb,CAAA;KACO,CAAA;IACb,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAY,SAAQ;MAAQ,cAAA;gBACzB;MACU,CAAA;KACT,CAAA;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,IAAU,UAAU;MAAS;MAAI;MACjC,kBAAC,GAAD,EAAW,QAAQ,GAAa,SAAW,CAAA;MAAE;MAC7C,EAAW,EAAM,GAAa,UAAU,CAAC;MACtC;;IACL,EAAA,CAAA,EAED,CAAA,CACF;;EACF,CAAA"}
@@ -1,6 +1,7 @@
1
1
  export type DiscussionThreadProps = {
2
2
  threadId: string;
3
3
  limit: number;
4
+ emptyBodyContent?: string;
4
5
  };
5
6
  export declare function DiscussionThread(props: DiscussionThreadProps): import("react/jsx-runtime").JSX.Element;
6
7
  export default DiscussionThread;
@@ -1 +1 @@
1
- {"version":3,"file":"DiscussionThread.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionThread.tsx"],"names":[],"mappings":"AAqCA,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAqV5D;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"DiscussionThread.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionThread.tsx"],"names":[],"mappings":"AAqCA,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA4V5D;AAED,eAAe,gBAAgB,CAAA"}
@@ -9,10 +9,10 @@ import { WarningDialog as a } from "../SynapseForm/WarningDialog.js";
9
9
  import { formatDate as o } from "../../utils/functions/DateFormatter.js";
10
10
  import { UserBadge as s } from "../UserCard/UserBadge.js";
11
11
  import { useGetRepliesInfinite as c } from "../../synapse-queries/forum/useReply.js";
12
- import { useDeleteThread as te, useGetThread as ne, useRestoreThread as re } from "../../synapse-queries/forum/useThread.js";
13
- import { useSubscription as ie } from "../../synapse-queries/subscription/useSubscription.js";
14
- import { ForumThreadEditor as l } from "./ForumThreadEditor.js";
15
- import { REPLY_ID_PARAM_KEY as u } from "./DiscussionConstants.js";
12
+ import { useDeleteThread as l, useGetThread as te, useRestoreThread as ne } from "../../synapse-queries/forum/useThread.js";
13
+ import { useSubscription as re } from "../../synapse-queries/subscription/useSubscription.js";
14
+ import { ForumThreadEditor as u } from "./ForumThreadEditor.js";
15
+ import { REPLY_ID_PARAM_KEY as ie } from "./DiscussionConstants.js";
16
16
  import { DiscussionReply as d } from "./DiscussionReply.js";
17
17
  import { SubscribersModal as f } from "./SubscribersModal.js";
18
18
  import { useGetModerators as p } from "../../synapse-queries/forum/useForum.js";
@@ -25,68 +25,70 @@ import se from "dayjs";
25
25
  //#region src/components/Forum/DiscussionThread.tsx
26
26
  var ce = "You are following this topic. Click to stop following.", le = "You are not following this topic. Click to follow.", D = "Write a reply...";
27
27
  function O(O) {
28
- let { threadId: k, limit: A } = O, j = "16px", [M, N] = g(!0), [P, F] = g(!1), [I, L] = g(!1), [R, z] = g(!1), [B, V] = g(!1), [H, U] = g(!1), [W, G] = g(!1), [ue, de] = g(!1), { threadData: K, threadBody: q, togglePin: fe } = ne(k), { data: J } = r(), { data: pe } = n(K?.projectId ?? "", void 0, ae, { enabled: !!K }), { subscription: Y, toggleSubscribed: me, isLoading: he } = ie(k, E.THREAD), { mutate: ge } = te({ onSuccess: () => {
29
- V(!1), e("A thread has been deleted.", "info");
30
- } }), { mutate: _e } = re({ onSuccess: () => {
28
+ let { threadId: k, limit: A, emptyBodyContent: j } = O, M = "16px", [N, P] = g(!0), [F, I] = g(!1), [L, R] = g(!1), [z, B] = g(!1), [V, H] = g(!1), [U, W] = g(!1), [ue, G] = g(!1), [de, fe] = g(!1), { threadData: K, threadBody: q, togglePin: pe } = te(k), { data: J } = r(), { data: me } = n(K?.projectId ?? "", void 0, ae, { enabled: !!K }), { subscription: Y, toggleSubscribed: he, isLoading: ge } = re(k, E.THREAD), { mutate: _e } = l({ onSuccess: () => {
29
+ H(!1), e("A thread has been deleted.", "info");
30
+ } }), { mutate: ve } = ne({ onSuccess: () => {
31
31
  G(!1), e("A thread has been restored.", "info");
32
- } }), ve = K?.createdBy == J?.ownerId;
33
- function ye() {
34
- if (J?.userName == "anonymous") U(!0);
32
+ } }), ye = K?.createdBy == J?.ownerId;
33
+ function be() {
34
+ if (J?.userName == "anonymous") W(!0);
35
35
  else try {
36
- me();
36
+ he();
37
37
  } catch (t) {
38
38
  e(t.reason, "danger");
39
39
  }
40
40
  }
41
- let { data: X, hasNextPage: be, fetchNextPage: xe } = c(k, M, A), { data: Z } = p(K?.forumId ?? "", { enabled: !!K?.forumId }), Se = Z?.includes(K?.createdBy ?? ""), [Q, Ce] = t(u), $ = h(() => {
41
+ let { data: X, hasNextPage: xe, fetchNextPage: Se } = c(k, N, A), { data: Z } = p(K?.forumId ?? "", { enabled: !!K?.forumId }), Ce = Z?.includes(K?.createdBy ?? ""), [Q, we] = t(ie), $ = h(() => {
42
42
  let e = X?.pages.flatMap((e) => e.results) ?? [];
43
43
  return Q ? e.filter((e) => e.id === Q) : e;
44
- }, [X, Q]);
44
+ }, [X, Q]), Te = () => {
45
+ we(null);
46
+ }, Ee = Z?.includes(J?.ownerId ?? "");
45
47
  return /* @__PURE__ */ T("div", {
46
48
  className: "DiscussionThread",
47
49
  role: "article",
48
50
  children: [
49
- K && q ? /* @__PURE__ */ T(C, { children: [
50
- /* @__PURE__ */ T(_, {
51
- sx: {
52
- mb: 2,
53
- textAlign: "right"
54
- },
55
- children: [/* @__PURE__ */ w(S, {
56
- component: "span",
57
- sx: { mr: 1 },
58
- children: "Sort:"
59
- }), /* @__PURE__ */ T(x, {
60
- color: "primary",
61
- exclusive: !0,
62
- value: M ? "datePosted" : "mostRecent",
63
- children: [/* @__PURE__ */ w(b, {
64
- value: "datePosted",
65
- onClick: () => N(!0),
66
- children: "Date Posted"
67
- }), /* @__PURE__ */ w(b, {
68
- value: "mostRecent",
69
- onClick: () => N(!1),
70
- children: "Most Recent"
71
- })]
51
+ K && /* @__PURE__ */ T(_, {
52
+ sx: {
53
+ mb: 2,
54
+ textAlign: "right"
55
+ },
56
+ children: [/* @__PURE__ */ w(S, {
57
+ component: "span",
58
+ sx: { mr: 1 },
59
+ children: "Sort:"
60
+ }), /* @__PURE__ */ T(x, {
61
+ color: "primary",
62
+ exclusive: !0,
63
+ value: N ? "datePosted" : "mostRecent",
64
+ children: [/* @__PURE__ */ w(b, {
65
+ value: "datePosted",
66
+ onClick: () => P(!0),
67
+ children: "Date Posted"
68
+ }), /* @__PURE__ */ w(b, {
69
+ value: "mostRecent",
70
+ onClick: () => P(!1),
71
+ children: "Most Recent"
72
72
  })]
73
- }),
73
+ })]
74
+ }),
75
+ K && (q !== void 0 || j) ? /* @__PURE__ */ T(C, { children: [
74
76
  /* @__PURE__ */ w(s, {
75
77
  userId: K.createdBy,
76
78
  withAvatar: !0,
77
79
  avatarSize: "MEDIUM",
78
80
  showCardOnHover: !0,
79
- showModeratorBadge: Se
81
+ showModeratorBadge: Ce
80
82
  }),
81
83
  /* @__PURE__ */ T(_, {
82
84
  sx: (e) => ({ [e.breakpoints.down("sm")]: {
83
85
  display: "flex",
84
86
  flexDirection: "column-reverse",
85
- marginBottom: j,
86
- marginTop: j,
87
+ marginBottom: M,
88
+ marginTop: M,
87
89
  ".SubscribersModal": {
88
90
  justifyContent: "flex-start",
89
- marginBottom: j
91
+ marginBottom: M
90
92
  }
91
93
  } }),
92
94
  children: [/* @__PURE__ */ w(S, {
@@ -96,12 +98,12 @@ function O(O) {
96
98
  }), /* @__PURE__ */ w(f, {
97
99
  id: k,
98
100
  objectType: E.THREAD,
99
- showModal: ue,
100
- handleModal: de
101
+ showModal: de,
102
+ handleModal: fe
101
103
  })]
102
104
  }),
103
105
  /* @__PURE__ */ w("div", { children: /* @__PURE__ */ w(ee, {
104
- markdown: q,
106
+ markdown: q || j,
105
107
  objectType: oe.THREAD
106
108
  }) }),
107
109
  /* @__PURE__ */ T("span", { children: [
@@ -109,14 +111,14 @@ function O(O) {
109
111
  o(se(K.createdOn), "M/D/YYYY"),
110
112
  K.isEdited ? /* @__PURE__ */ w("i", { children: " (Edited)" }) : null
111
113
  ] }),
112
- /* @__PURE__ */ w(l, {
114
+ /* @__PURE__ */ w(u, {
113
115
  isReply: !1,
114
116
  initialText: q,
115
- onClose: () => F(!1),
117
+ onClose: () => I(!1),
116
118
  initialTitle: K?.title,
117
119
  id: k,
118
120
  isDialog: !0,
119
- openDialog: P
121
+ openDialog: F
120
122
  })
121
123
  ] }) : /* @__PURE__ */ w(C, {}),
122
124
  /* @__PURE__ */ w(_, {
@@ -137,8 +139,8 @@ function O(O) {
137
139
  /* @__PURE__ */ w("span", { children: /* @__PURE__ */ w("button", {
138
140
  className: "follow-button",
139
141
  "aria-label": Y ? "Unfollow thread" : "Follow thread",
140
- disabled: he,
141
- onClick: () => ye(),
142
+ disabled: ge,
143
+ onClick: () => be(),
142
144
  children: Y ? /* @__PURE__ */ w(i, {
143
145
  icon: "visibility",
144
146
  label: ce
@@ -147,21 +149,21 @@ function O(O) {
147
149
  label: le
148
150
  })
149
151
  }) }),
150
- ve && /* @__PURE__ */ w("button", {
151
- onClick: () => F(!0),
152
+ ye && /* @__PURE__ */ w("button", {
153
+ onClick: () => I(!0),
152
154
  children: /* @__PURE__ */ w(i, {
153
155
  icon: "edit",
154
156
  label: "Edit thread"
155
157
  })
156
158
  }),
157
- pe?.permissions.canModerate ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("button", {
158
- onClick: () => V(!0),
159
+ me?.permissions.canModerate ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("button", {
160
+ onClick: () => H(!0),
159
161
  children: /* @__PURE__ */ w(i, {
160
162
  icon: "delete",
161
163
  label: "Delete thread"
162
164
  })
163
165
  }), /* @__PURE__ */ w("button", {
164
- onClick: () => fe(),
166
+ onClick: () => pe(),
165
167
  children: K?.isPinned ? /* @__PURE__ */ w(i, {
166
168
  icon: "pushpin",
167
169
  sx: { color: "error.main" },
@@ -178,24 +180,22 @@ function O(O) {
178
180
  mt: 2,
179
181
  mb: 3
180
182
  },
181
- children: I ? /* @__PURE__ */ w(l, {
183
+ children: L ? /* @__PURE__ */ w(u, {
182
184
  id: k,
183
185
  isReply: !0,
184
- onClose: () => L(!1),
186
+ onClose: () => R(!1),
185
187
  isDialog: !1
186
188
  }) : /* @__PURE__ */ w(y, {
187
189
  fullWidth: !0,
188
190
  placeholder: D,
189
191
  onClick: () => {
190
- J?.userName == "anonymous" ? U(!0) : L(!0);
192
+ J?.userName == "anonymous" ? W(!0) : R(!0);
191
193
  }
192
194
  })
193
195
  }),
194
196
  Q && /* @__PURE__ */ T(v, {
195
197
  variant: "outlined",
196
- onClick: () => {
197
- Ce(null);
198
- },
198
+ onClick: Te,
199
199
  sx: {
200
200
  display: "flex",
201
201
  alignItems: "center",
@@ -215,6 +215,7 @@ function O(O) {
215
215
  let t = Z?.includes(e.createdBy);
216
216
  return /* @__PURE__ */ w(d, {
217
217
  reply: e,
218
+ isForumModerator: Ee,
218
219
  isReplyAuthorModerator: t
219
220
  }, e.id);
220
221
  }) }),
@@ -224,47 +225,47 @@ function O(O) {
224
225
  mb: 3,
225
226
  [e.breakpoints.down("sm")]: { MarkdownEditor: { display: "block" } }
226
227
  }),
227
- children: R ? /* @__PURE__ */ w(l, {
228
+ children: z ? /* @__PURE__ */ w(u, {
228
229
  id: k,
229
230
  isReply: !0,
230
- onClose: () => z(!1),
231
+ onClose: () => B(!1),
231
232
  isDialog: !1
232
233
  }) : /* @__PURE__ */ w(y, {
233
234
  fullWidth: !0,
234
235
  placeholder: D,
235
236
  onClick: () => {
236
- J?.userName == "anonymous" ? U(!0) : z(!0);
237
+ J?.userName == "anonymous" ? W(!0) : B(!0);
237
238
  }
238
239
  })
239
240
  }),
240
- be ? /* @__PURE__ */ w(v, {
241
+ xe ? /* @__PURE__ */ w(v, {
241
242
  variant: "outlined",
242
243
  onClick: () => {
243
- xe();
244
+ Se();
244
245
  },
245
246
  children: "Show more results"
246
247
  }) : /* @__PURE__ */ w(C, {}),
247
248
  /* @__PURE__ */ w(a, {
248
- open: B,
249
+ open: V,
249
250
  title: "Confirm Deletion",
250
251
  content: "Are you sure you want to delete this thread?",
251
- onCancel: () => V(!1),
252
- onConfirm: () => K && ge(K),
252
+ onCancel: () => H(!1),
253
+ onConfirm: () => K && _e(K),
253
254
  confirmButtonColor: "error",
254
255
  confirmButtonText: "Delete"
255
256
  }),
256
257
  /* @__PURE__ */ w(a, {
257
- open: W,
258
+ open: ue,
258
259
  title: "Confirm Restoration",
259
260
  content: "Are you sure you want to restore this thread?",
260
261
  onCancel: () => G(!1),
261
- onConfirm: () => K && _e(K),
262
+ onConfirm: () => K && ve(K),
262
263
  confirmButtonColor: "info",
263
264
  confirmButtonText: "Restore"
264
265
  }),
265
266
  /* @__PURE__ */ w(m, {
266
- open: H,
267
- onHide: () => U(!1),
267
+ open: U,
268
+ onHide: () => W(!1),
268
269
  hasCancelButton: !1
269
270
  })
270
271
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"DiscussionThread.js","names":[],"sources":["../../../src/components/Forum/DiscussionThread.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useGetRepliesInfinite } from '@/synapse-queries/forum/useReply'\nimport {\n useDeleteThread,\n useGetThread,\n useRestoreThread,\n} from '@/synapse-queries/forum/useThread'\nimport { useSubscription } from '@/synapse-queries/subscription/useSubscription'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n Box,\n Button,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n} from '@mui/material'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ObjectType,\n SubscriptionObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { DiscussionReply } from './DiscussionReply'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { SubscribersModal } from './SubscribersModal'\nimport { useGetModerators } from '@/synapse-queries/forum/useForum'\nimport { useNativeSearchParams } from '@/utils/hooks/useNativeSearchParams'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\nimport { SignInRequiredModal } from '../SignInRequiredModal/SignInRequiredModal'\n\nexport type DiscussionThreadProps = {\n threadId: string\n limit: number\n}\n\nconst FOLLOWING_TEXT = 'You are following this topic. Click to stop following.'\nconst UNFOLLOWING_TEXT = 'You are not following this topic. Click to follow.'\nconst INPUT_PLACEHOLDER = 'Write a reply...'\n\nexport function DiscussionThread(props: DiscussionThreadProps) {\n const { threadId, limit } = props\n const defaultMargin = '16px'\n\n const [orderByDatePosted, setOrderByDatePosted] = useState(true)\n const [showThreadModal, setShowThreadModal] = useState(false)\n const [showReplyEditor1, setShowReplyEditor1] = useState(false)\n const [showReplyEditor2, setShowReplyEditor2] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const [showSignInModal, setShowSignInModal] = useState(false)\n const [showRestoreModal, setShowRestoreModal] = useState(false)\n const [showSubscriberModal, setShowSubscriberModal] = useState(false)\n\n const { threadData, threadBody, togglePin } = useGetThread(threadId)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(\n threadData?.projectId ?? '',\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n {\n enabled: !!threadData,\n },\n )\n\n const { subscription, toggleSubscribed, isLoading } = useSubscription(\n threadId,\n SubscriptionObjectType.THREAD,\n )\n const { mutate: deleteThread } = useDeleteThread({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A thread has been deleted.', 'info')\n },\n })\n const { mutate: restoreThread } = useRestoreThread({\n onSuccess: () => {\n setShowRestoreModal(false)\n displayToast('A thread has been restored.', 'info')\n },\n })\n\n const isCurrentUserAuthor =\n threadData?.createdBy == currentUserProfile?.ownerId\n\n function handleFollowBtn() {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n try {\n toggleSubscribed()\n } catch (err: any) {\n displayToast(err.reason as string, 'danger')\n }\n }\n }\n\n const {\n data: replyData,\n hasNextPage,\n fetchNextPage,\n } = useGetRepliesInfinite(threadId, orderByDatePosted, limit)\n\n const { data: moderatorList } = useGetModerators(threadData?.forumId ?? '', {\n enabled: Boolean(threadData?.forumId),\n })\n\n const isAuthorModerator = moderatorList?.includes(threadData?.createdBy ?? '')\n\n const [replyId, setReplyIdParam] = useNativeSearchParams(REPLY_ID_PARAM_KEY)\n\n const replies = useMemo(() => {\n const allReplies = replyData?.pages.flatMap(page => page.results) ?? []\n if (replyId) {\n return allReplies.filter(reply => reply.id === replyId)\n } else {\n return allReplies\n }\n }, [replyData, replyId])\n\n const handleShowAllRepliesButton = () => {\n setReplyIdParam(null)\n }\n\n return (\n <div className=\"DiscussionThread\" role={'article'}>\n {threadData && threadBody ? (\n <>\n <Box sx={{ mb: 2, textAlign: 'right' }}>\n <Typography component={'span'} sx={{ mr: 1 }}>\n Sort:\n </Typography>\n <ToggleButtonGroup\n color={'primary'}\n exclusive\n value={orderByDatePosted ? 'datePosted' : 'mostRecent'}\n >\n <ToggleButton\n value={'datePosted'}\n onClick={() => setOrderByDatePosted(true)}\n >\n Date Posted\n </ToggleButton>\n <ToggleButton\n value={'mostRecent'}\n onClick={() => setOrderByDatePosted(false)}\n >\n Most Recent\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n <UserBadge\n userId={threadData.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isAuthorModerator}\n />\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n marginBottom: defaultMargin,\n marginTop: defaultMargin,\n '.SubscribersModal': {\n justifyContent: 'flex-start',\n marginBottom: defaultMargin,\n },\n },\n })}\n >\n <Typography sx={{ marginTop: '4px' }} variant=\"headline2\">\n {threadData.title}\n </Typography>\n <SubscribersModal\n id={threadId}\n objectType={SubscriptionObjectType.THREAD}\n showModal={showSubscriberModal}\n handleModal={setShowSubscriberModal}\n />\n </Box>\n <div>\n <MarkdownSynapse\n markdown={threadBody}\n objectType={ObjectType.THREAD}\n />\n </div>\n <span>\n posted {formatDate(dayjs(threadData.createdOn), 'M/D/YYYY')}\n {threadData.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <ForumThreadEditor\n isReply={false}\n initialText={threadBody}\n onClose={() => setShowThreadModal(false)}\n initialTitle={threadData?.title}\n id={threadId}\n isDialog={true}\n openDialog={showThreadModal}\n />\n </>\n ) : (\n <></>\n )}\n <Box\n sx={{\n float: 'right',\n margin: { xs: '8px 0', sm: '0 24px 0 0' },\n }}\n >\n {threadData?.isDeleted ? (\n <button onClick={() => setShowRestoreModal(true)}>\n <IconSvg icon=\"restore\" label=\"Restore deleted thread\" />\n </button>\n ) : (\n <>\n <span>\n <button\n className=\"follow-button\"\n aria-label={subscription ? 'Unfollow thread' : 'Follow thread'}\n disabled={isLoading}\n onClick={() => handleFollowBtn()}\n >\n {subscription ? (\n <IconSvg icon=\"visibility\" label={FOLLOWING_TEXT} />\n ) : (\n <IconSvg icon=\"visibilityOff\" label={UNFOLLOWING_TEXT} />\n )}\n </button>\n </span>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowThreadModal(true)}>\n <IconSvg icon=\"edit\" label=\"Edit thread\" />\n </button>\n )}\n\n {entityBundle?.permissions.canModerate ? (\n <>\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label=\"Delete thread\" />\n </button>\n <button onClick={() => togglePin()}>\n {threadData?.isPinned ? (\n <IconSvg\n icon=\"pushpin\"\n sx={{ color: 'error.main' }}\n label=\"Unpin thread\"\n />\n ) : (\n <IconSvg icon=\"pushpin\" label=\"Pin thread\" />\n )}\n </button>\n </>\n ) : null}\n </>\n )}\n </Box>\n <Box sx={{ mt: 2, mb: 3 }}>\n {!showReplyEditor1 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor1(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor1(false)}\n isDialog={false}\n />\n )}\n </Box>\n {replyId && (\n <Button\n variant=\"outlined\"\n onClick={handleShowAllRepliesButton}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: '2px 8px',\n marginBottom: '12px',\n gap: '4px',\n }}\n >\n <IconSvg icon=\"arrowBack\" sx={{ width: '16px' }} />\n <Typography variant=\"smallText2\">Show all replies</Typography>\n </Button>\n )}\n <div>\n {replies.map(reply => {\n const isReplyAuthorModerator = moderatorList?.includes(\n reply.createdBy,\n )\n return (\n <DiscussionReply\n key={reply.id}\n reply={reply}\n isReplyAuthorModerator={isReplyAuthorModerator}\n />\n )\n })}\n </div>\n {replies.length > 0 && (\n <Box\n sx={theme => ({\n mt: 2,\n mb: 3,\n [theme.breakpoints.down('sm')]: {\n MarkdownEditor: {\n display: 'block',\n },\n },\n })}\n >\n {!showReplyEditor2 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor2(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor2(false)}\n isDialog={false}\n />\n )}\n </Box>\n )}\n\n {hasNextPage ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n fetchNextPage()\n }}\n >\n Show more results\n </Button>\n ) : (\n <></>\n )}\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this thread?\"\n onCancel={() => setShowDeleteModal(false)}\n onConfirm={() => threadData && deleteThread(threadData)}\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n <WarningDialog\n open={showRestoreModal}\n title=\"Confirm Restoration\"\n content=\"Are you sure you want to restore this thread?\"\n onCancel={() => setShowRestoreModal(false)}\n onConfirm={() => threadData && restoreThread(threadData)}\n confirmButtonColor=\"info\"\n confirmButtonText=\"Restore\"\n />\n <SignInRequiredModal\n open={showSignInModal}\n onHide={() => setShowSignInModal(false)}\n hasCancelButton={false}\n />\n </div>\n )\n}\n\nexport default DiscussionThread\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiscussionThread.js","names":[],"sources":["../../../src/components/Forum/DiscussionThread.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useGetRepliesInfinite } from '@/synapse-queries/forum/useReply'\nimport {\n useDeleteThread,\n useGetThread,\n useRestoreThread,\n} from '@/synapse-queries/forum/useThread'\nimport { useSubscription } from '@/synapse-queries/subscription/useSubscription'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n Box,\n Button,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n} from '@mui/material'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ObjectType,\n SubscriptionObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { DiscussionReply } from './DiscussionReply'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { SubscribersModal } from './SubscribersModal'\nimport { useGetModerators } from '@/synapse-queries/forum/useForum'\nimport { useNativeSearchParams } from '@/utils/hooks/useNativeSearchParams'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\nimport { SignInRequiredModal } from '../SignInRequiredModal/SignInRequiredModal'\n\nexport type DiscussionThreadProps = {\n threadId: string\n limit: number\n emptyBodyContent?: string\n}\n\nconst FOLLOWING_TEXT = 'You are following this topic. Click to stop following.'\nconst UNFOLLOWING_TEXT = 'You are not following this topic. Click to follow.'\nconst INPUT_PLACEHOLDER = 'Write a reply...'\n\nexport function DiscussionThread(props: DiscussionThreadProps) {\n const { threadId, limit, emptyBodyContent } = props\n const defaultMargin = '16px'\n\n const [orderByDatePosted, setOrderByDatePosted] = useState(true)\n const [showThreadModal, setShowThreadModal] = useState(false)\n const [showReplyEditor1, setShowReplyEditor1] = useState(false)\n const [showReplyEditor2, setShowReplyEditor2] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const [showSignInModal, setShowSignInModal] = useState(false)\n const [showRestoreModal, setShowRestoreModal] = useState(false)\n const [showSubscriberModal, setShowSubscriberModal] = useState(false)\n\n const { threadData, threadBody, togglePin } = useGetThread(threadId)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(\n threadData?.projectId ?? '',\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n {\n enabled: !!threadData,\n },\n )\n\n const { subscription, toggleSubscribed, isLoading } = useSubscription(\n threadId,\n SubscriptionObjectType.THREAD,\n )\n const { mutate: deleteThread } = useDeleteThread({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A thread has been deleted.', 'info')\n },\n })\n const { mutate: restoreThread } = useRestoreThread({\n onSuccess: () => {\n setShowRestoreModal(false)\n displayToast('A thread has been restored.', 'info')\n },\n })\n\n const isCurrentUserAuthor =\n threadData?.createdBy == currentUserProfile?.ownerId\n\n function handleFollowBtn() {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n try {\n toggleSubscribed()\n } catch (err: any) {\n displayToast(err.reason as string, 'danger')\n }\n }\n }\n\n const {\n data: replyData,\n hasNextPage,\n fetchNextPage,\n } = useGetRepliesInfinite(threadId, orderByDatePosted, limit)\n\n const { data: moderatorList } = useGetModerators(threadData?.forumId ?? '', {\n enabled: Boolean(threadData?.forumId),\n })\n\n const isAuthorModerator = moderatorList?.includes(threadData?.createdBy ?? '')\n\n const [replyId, setReplyIdParam] = useNativeSearchParams(REPLY_ID_PARAM_KEY)\n\n const replies = useMemo(() => {\n const allReplies = replyData?.pages.flatMap(page => page.results) ?? []\n if (replyId) {\n return allReplies.filter(reply => reply.id === replyId)\n } else {\n return allReplies\n }\n }, [replyData, replyId])\n\n const handleShowAllRepliesButton = () => {\n setReplyIdParam(null)\n }\n\n const isForumModerator = moderatorList?.includes(\n currentUserProfile?.ownerId ?? '',\n )\n\n return (\n <div className=\"DiscussionThread\" role={'article'}>\n {threadData && (\n <Box sx={{ mb: 2, textAlign: 'right' }}>\n <Typography component={'span'} sx={{ mr: 1 }}>\n Sort:\n </Typography>\n <ToggleButtonGroup\n color={'primary'}\n exclusive\n value={orderByDatePosted ? 'datePosted' : 'mostRecent'}\n >\n <ToggleButton\n value={'datePosted'}\n onClick={() => setOrderByDatePosted(true)}\n >\n Date Posted\n </ToggleButton>\n <ToggleButton\n value={'mostRecent'}\n onClick={() => setOrderByDatePosted(false)}\n >\n Most Recent\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n )}\n {threadData && (threadBody !== undefined || emptyBodyContent) ? (\n <>\n <UserBadge\n userId={threadData.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isAuthorModerator}\n />\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n marginBottom: defaultMargin,\n marginTop: defaultMargin,\n '.SubscribersModal': {\n justifyContent: 'flex-start',\n marginBottom: defaultMargin,\n },\n },\n })}\n >\n <Typography sx={{ marginTop: '4px' }} variant=\"headline2\">\n {threadData.title}\n </Typography>\n <SubscribersModal\n id={threadId}\n objectType={SubscriptionObjectType.THREAD}\n showModal={showSubscriberModal}\n handleModal={setShowSubscriberModal}\n />\n </Box>\n <div>\n <MarkdownSynapse\n markdown={threadBody || emptyBodyContent}\n objectType={ObjectType.THREAD}\n />\n </div>\n <span>\n posted {formatDate(dayjs(threadData.createdOn), 'M/D/YYYY')}\n {threadData.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <ForumThreadEditor\n isReply={false}\n initialText={threadBody}\n onClose={() => setShowThreadModal(false)}\n initialTitle={threadData?.title}\n id={threadId}\n isDialog={true}\n openDialog={showThreadModal}\n />\n </>\n ) : (\n <></>\n )}\n <Box\n sx={{\n float: 'right',\n margin: { xs: '8px 0', sm: '0 24px 0 0' },\n }}\n >\n {threadData?.isDeleted ? (\n <button onClick={() => setShowRestoreModal(true)}>\n <IconSvg icon=\"restore\" label=\"Restore deleted thread\" />\n </button>\n ) : (\n <>\n <span>\n <button\n className=\"follow-button\"\n aria-label={subscription ? 'Unfollow thread' : 'Follow thread'}\n disabled={isLoading}\n onClick={() => handleFollowBtn()}\n >\n {subscription ? (\n <IconSvg icon=\"visibility\" label={FOLLOWING_TEXT} />\n ) : (\n <IconSvg icon=\"visibilityOff\" label={UNFOLLOWING_TEXT} />\n )}\n </button>\n </span>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowThreadModal(true)}>\n <IconSvg icon=\"edit\" label=\"Edit thread\" />\n </button>\n )}\n\n {entityBundle?.permissions.canModerate ? (\n <>\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label=\"Delete thread\" />\n </button>\n <button onClick={() => togglePin()}>\n {threadData?.isPinned ? (\n <IconSvg\n icon=\"pushpin\"\n sx={{ color: 'error.main' }}\n label=\"Unpin thread\"\n />\n ) : (\n <IconSvg icon=\"pushpin\" label=\"Pin thread\" />\n )}\n </button>\n </>\n ) : null}\n </>\n )}\n </Box>\n <Box sx={{ mt: 2, mb: 3 }}>\n {!showReplyEditor1 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor1(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor1(false)}\n isDialog={false}\n />\n )}\n </Box>\n {replyId && (\n <Button\n variant=\"outlined\"\n onClick={handleShowAllRepliesButton}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: '2px 8px',\n marginBottom: '12px',\n gap: '4px',\n }}\n >\n <IconSvg icon=\"arrowBack\" sx={{ width: '16px' }} />\n <Typography variant=\"smallText2\">Show all replies</Typography>\n </Button>\n )}\n <div>\n {replies.map(reply => {\n const isReplyAuthorModerator = moderatorList?.includes(\n reply.createdBy,\n )\n return (\n <DiscussionReply\n key={reply.id}\n reply={reply}\n isForumModerator={isForumModerator}\n isReplyAuthorModerator={isReplyAuthorModerator}\n />\n )\n })}\n </div>\n {replies.length > 0 && (\n <Box\n sx={theme => ({\n mt: 2,\n mb: 3,\n [theme.breakpoints.down('sm')]: {\n MarkdownEditor: {\n display: 'block',\n },\n },\n })}\n >\n {!showReplyEditor2 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor2(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor2(false)}\n isDialog={false}\n />\n )}\n </Box>\n )}\n\n {hasNextPage ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n fetchNextPage()\n }}\n >\n Show more results\n </Button>\n ) : (\n <></>\n )}\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this thread?\"\n onCancel={() => setShowDeleteModal(false)}\n onConfirm={() => threadData && deleteThread(threadData)}\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n <WarningDialog\n open={showRestoreModal}\n title=\"Confirm Restoration\"\n content=\"Are you sure you want to restore this thread?\"\n onCancel={() => setShowRestoreModal(false)}\n onConfirm={() => threadData && restoreThread(threadData)}\n confirmButtonColor=\"info\"\n confirmButtonText=\"Restore\"\n />\n <SignInRequiredModal\n open={showSignInModal}\n onHide={() => setShowSignInModal(false)}\n hasCancelButton={false}\n />\n </div>\n )\n}\n\nexport default DiscussionThread\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ForumTable.js","names":[],"sources":["../../../src/components/Forum/ForumTable.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport { useGetForumThreadsInfinite } from '@/synapse-queries/forum/useForum'\nimport { AVATAR } from '@/utils/SynapseConstants'\nimport { Link } from '@mui/material'\nimport {\n DiscussionFilter,\n DiscussionThreadBundle,\n DiscussionThreadOrder,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash-es/isEmpty'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport UserCard from '../UserCard/UserCard'\n\nexport type ForumTableProps = {\n forumId: string\n limit: number\n onClickLink: (threadId: string) => void\n filter: DiscussionFilter\n}\n\nconst columnHelper = createColumnHelper<DiscussionThreadBundle>()\n\nfunction getColumns(\n onClickLink: (threadId: string) => void,\n): ColumnDef<DiscussionThreadBundle, any>[] {\n return [\n columnHelper.accessor('title', {\n header: props => <ColumnHeader {...props} title={'Topic'} />,\n cell: ({ row }) => (\n <Link onClick={() => onClickLink(row.original.id)}>\n {row.original.isPinned ? <IconSvg icon=\"pushpin\" /> : <></>}\n {row.original.title}\n </Link>\n ),\n enableSorting: true,\n size: 250,\n }),\n columnHelper.accessor('createdBy', {\n header: props => <ColumnHeader {...props} title={'Author'} />,\n cell: ({ getValue }) => <UserBadge userId={getValue()} />,\n enableSorting: false,\n size: 60,\n }),\n columnHelper.accessor('activeAuthors', {\n header: props => <ColumnHeader {...props} title={'Active Users'} />,\n cell: ({ getValue }) =>\n getValue().map((userId: string) => (\n <div key={userId} className=\"avatarContainer\">\n <UserCard\n showCardOnHover={true}\n className=\"ActiveUsers\"\n size={AVATAR}\n avatarSize={'MEDIUM'}\n ownerId={userId}\n />\n </div>\n )),\n enableSorting: false,\n }),\n columnHelper.accessor('numberOfReplies', {\n header: props => <ColumnHeader {...props} title={'Replies'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('numberOfViews', {\n header: props => <ColumnHeader {...props} title={'Views'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('lastActivity', {\n header: props => <ColumnHeader {...props} title={'Activity'} />,\n cell: ({ getValue }) => dayjs(getValue()).format('L'),\n enableSorting: true,\n size: 30,\n }),\n ]\n}\n\nexport function ForumTable({\n forumId,\n limit,\n filter,\n onClickLink,\n}: ForumTableProps) {\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'lastActivity',\n },\n ])\n\n const discussionThreadOrder = useMemo(() => {\n if (!isEmpty(tableSortState)) {\n if (tableSortState[0].id == 'lastActivity') {\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n } else if (tableSortState[0].id == 'numberOfReplies') {\n return DiscussionThreadOrder.NUMBER_OF_REPLIES\n } else if (tableSortState[0].id == 'title') {\n return DiscussionThreadOrder.THREAD_TITLE\n } else if (tableSortState[0].id == 'numberOfViews') {\n return DiscussionThreadOrder.NUMBER_OF_VIEWS\n }\n }\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n }, [tableSortState])\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetForumThreadsInfinite(\n forumId,\n limit,\n discussionThreadOrder,\n !tableSortState[0]?.desc,\n filter,\n )\n\n const threads = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo(() => getColumns(onClickLink), [onClickLink])\n\n const table: Table<DiscussionThreadBundle> =\n useReactTable<DiscussionThreadBundle>({\n data: threads,\n columns: columns,\n state: {\n sorting: tableSortState,\n },\n onSortingChange: setTableSortState,\n getRowId: row => row.id,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableMultiSort: false,\n enableFilters: false,\n })\n\n const hasNoResults = !isLoading && table.getRowModel().rows.length === 0\n\n return (\n <div className=\"ForumTable\">\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2, maxHeight: '250px' } }}\n />\n }\n isLoading={isLoading}\n isEmpty={hasNoResults}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n void fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ForumTable.js","names":[],"sources":["../../../src/components/Forum/ForumTable.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport { useGetForumThreadsInfinite } from '@/synapse-queries/forum/useForum'\nimport { AVATAR } from '@/utils/SynapseConstants'\nimport { Link } from '@mui/material'\nimport {\n DiscussionFilter,\n DiscussionThreadBundle,\n DiscussionThreadOrder,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash-es/isEmpty'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport UserCard from '../UserCard/UserCard'\n\nexport type ForumTableProps = {\n forumId: string\n limit: number\n onClickLink: (threadId: string) => void\n filter: DiscussionFilter\n}\n\nconst columnHelper = createColumnHelper<DiscussionThreadBundle>()\n\nfunction getColumns(\n onClickLink: (threadId: string) => void,\n): ColumnDef<DiscussionThreadBundle, any>[] {\n return [\n columnHelper.accessor('title', {\n header: props => <ColumnHeader {...props} title={'Topic'} />,\n cell: ({ row }) => (\n <Link onClick={() => onClickLink(row.original.id)}>\n {row.original.isPinned ? <IconSvg icon=\"pushpin\" /> : <></>}\n {row.original.title}\n </Link>\n ),\n enableSorting: true,\n size: 250,\n }),\n columnHelper.accessor('createdBy', {\n header: props => <ColumnHeader {...props} title={'Author'} />,\n cell: ({ getValue }) => <UserBadge userId={getValue()} />,\n enableSorting: false,\n size: 60,\n }),\n columnHelper.accessor('activeAuthors', {\n header: props => <ColumnHeader {...props} title={'Active Users'} />,\n cell: ({ getValue }) =>\n getValue().map((userId: string) => (\n <div key={userId} className=\"avatarContainer\">\n <UserCard\n showCardOnHover={true}\n className=\"ActiveUsers\"\n size={AVATAR}\n avatarSize={'MEDIUM'}\n ownerId={userId}\n />\n </div>\n )),\n enableSorting: false,\n }),\n columnHelper.accessor('numberOfReplies', {\n header: props => <ColumnHeader {...props} title={'Replies'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('numberOfViews', {\n header: props => <ColumnHeader {...props} title={'Views'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('lastActivity', {\n header: props => <ColumnHeader {...props} title={'Activity'} />,\n cell: ({ getValue }) => dayjs(getValue()).format('L'),\n enableSorting: true,\n size: 30,\n }),\n ]\n}\n\nexport function ForumTable({\n forumId,\n limit,\n filter,\n onClickLink,\n}: ForumTableProps) {\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'lastActivity',\n },\n ])\n\n const discussionThreadOrder = useMemo(() => {\n if (!isEmpty(tableSortState)) {\n if (tableSortState[0].id == 'lastActivity') {\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n } else if (tableSortState[0].id == 'numberOfReplies') {\n return DiscussionThreadOrder.NUMBER_OF_REPLIES\n } else if (tableSortState[0].id == 'title') {\n return DiscussionThreadOrder.THREAD_TITLE\n } else if (tableSortState[0].id == 'numberOfViews') {\n return DiscussionThreadOrder.NUMBER_OF_VIEWS\n }\n }\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n }, [tableSortState])\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetForumThreadsInfinite(\n forumId,\n limit,\n discussionThreadOrder,\n !tableSortState[0]?.desc,\n filter,\n )\n\n const threads = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo(() => getColumns(onClickLink), [onClickLink])\n\n const table: Table<DiscussionThreadBundle> =\n useReactTable<DiscussionThreadBundle>({\n data: threads,\n columns: columns,\n state: {\n sorting: tableSortState,\n },\n onSortingChange: setTableSortState,\n getRowId: row => row.id,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableMultiSort: false,\n enableFilters: false,\n })\n\n const hasNoResults = !isLoading && table.getRowModel().rows.length === 0\n\n return (\n <div className=\"ForumTable\">\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2, maxHeight: '250px' } }}\n />\n }\n isLoading={isLoading}\n isEmpty={hasNoResults}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n void fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </div>\n )\n}\n"],"mappings":"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"}