synapse-react-client 4.0.45 → 4.0.46

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 (319) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/AridhiaKeyFactory.d.ts +1 -0
  3. package/dist/aridhia-queries/AridhiaKeyFactory.d.ts.map +1 -1
  4. package/dist/aridhia-queries/AridhiaKeyFactory.js +3 -0
  5. package/dist/aridhia-queries/AridhiaKeyFactory.js.map +1 -1
  6. package/dist/aridhia-queries/aridhiaTokenExchange.js +6 -6
  7. package/dist/aridhia-queries/index.d.ts +1 -0
  8. package/dist/aridhia-queries/index.d.ts.map +1 -1
  9. package/dist/aridhia-queries/index.js +11 -10
  10. package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.d.ts +19 -0
  11. package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.d.ts.map +1 -0
  12. package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.js +14 -0
  13. package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.js.map +1 -0
  14. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.d.ts.map +1 -1
  15. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js +6 -4
  16. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  17. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  18. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js +1 -1
  19. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js.map +1 -1
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +1 -1
  21. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  22. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js +1 -1
  23. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js.map +1 -1
  24. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
  25. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +11 -8
  26. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
  27. package/dist/components/AccessTokenPage/AccessTokenPage.js +1 -1
  28. package/dist/components/AccessTokenPage/AccessTokenPage.js.map +1 -1
  29. package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +1 -1
  30. package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
  31. package/dist/components/Aridhia/DarWizard/DarSectionForm.d.ts.map +1 -1
  32. package/dist/components/Aridhia/DarWizard/DarSectionForm.js +17 -13
  33. package/dist/components/Aridhia/DarWizard/DarSectionForm.js.map +1 -1
  34. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts +3 -3
  35. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts.map +1 -1
  36. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +33 -34
  37. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -1
  38. package/dist/components/Aridhia/fairFormToRjsf.js +1 -1
  39. package/dist/components/Aridhia/fairFormToRjsf.js.map +1 -1
  40. package/dist/components/Authentication/LastLoginInfo.js +1 -1
  41. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  42. package/dist/components/CertificationQuiz/CertificationQuiz.js +1 -1
  43. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  44. package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js +1 -1
  45. package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js.map +1 -1
  46. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js +1 -1
  47. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  48. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +6 -6
  49. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  50. package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.d.ts.map +1 -1
  51. package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js +4 -4
  52. package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js.map +1 -1
  53. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +4 -4
  54. package/dist/components/CitationPopover/CitationPopoverContent.js +4 -4
  55. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  56. package/dist/components/ComponentCollapse.d.ts.map +1 -1
  57. package/dist/components/ComponentCollapse.js +2 -1
  58. package/dist/components/ComponentCollapse.js.map +1 -1
  59. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  60. package/dist/components/DataGrid/SynapseGrid.js +231 -219
  61. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  62. package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts.map +1 -1
  63. package/dist/components/DataGrid/SyncGridWithSourceButton.js +5 -4
  64. package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -1
  65. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
  66. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +7 -5
  67. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
  68. package/dist/components/DataGrid/components/ExportCsvFromGridButton.js +4 -4
  69. package/dist/components/DataGrid/components/ExportCsvFromGridButton.js.map +1 -1
  70. package/dist/components/DataGrid/components/ReorderColumnsButton.js +4 -4
  71. package/dist/components/DataGrid/components/ReorderColumnsButton.js.map +1 -1
  72. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
  73. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +12 -8
  74. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
  75. package/dist/components/DataGrid/components/UploadCsvToGridButton.js +1 -1
  76. package/dist/components/DataGrid/components/UploadCsvToGridButton.js.map +1 -1
  77. package/dist/components/DataGrid/hooks/useGridUndoRedo.js +5 -5
  78. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  79. package/dist/components/DataGrid/utils/applyModelChange.js +14 -14
  80. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  81. package/dist/components/DataGrid/utils/columnFactory.js +1 -1
  82. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  83. package/dist/components/DataGrid/utils/splitPatch.d.ts.map +1 -1
  84. package/dist/components/DataGrid/utils/splitPatch.js +22 -13
  85. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  86. package/dist/components/DownloadCart/DownloadCartPage.js +1 -1
  87. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  88. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  89. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +2 -1
  90. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  91. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -1
  92. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +1 -3
  93. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
  94. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +16 -10
  95. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  96. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -1
  97. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  98. package/dist/components/EntityFinder/EntityFinder.js +4 -4
  99. package/dist/components/EntityFinder/EntityIdTextField.js +1 -1
  100. package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -1
  101. package/dist/components/EntityFinder/tree/VirtualizedTree.d.ts.map +1 -1
  102. package/dist/components/EntityFinder/tree/VirtualizedTree.js +5 -4
  103. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  104. package/dist/components/EntityHeaderTable/EntityHeaderTable.js +1 -1
  105. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  106. package/dist/components/EntityTreeTable/components/EntityNameCell.d.ts.map +1 -1
  107. package/dist/components/EntityTreeTable/components/EntityNameCell.js +2 -1
  108. package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
  109. package/dist/components/EntityUpload/FileUploadProgress.d.ts.map +1 -1
  110. package/dist/components/EntityUpload/FileUploadProgress.js +11 -7
  111. package/dist/components/EntityUpload/FileUploadProgress.js.map +1 -1
  112. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.d.ts.map +1 -1
  113. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js +4 -3
  114. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js.map +1 -1
  115. package/dist/components/ExperimentalMode/ExperimentalMode.js +1 -1
  116. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  117. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js +1 -1
  118. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  119. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts.map +1 -1
  120. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js +2 -1
  121. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js.map +1 -1
  122. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts.map +1 -1
  123. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js +2 -1
  124. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js.map +1 -1
  125. package/dist/components/FormTemplateEditor/FieldLibrary.d.ts.map +1 -1
  126. package/dist/components/FormTemplateEditor/FieldLibrary.js +2 -1
  127. package/dist/components/FormTemplateEditor/FieldLibrary.js.map +1 -1
  128. package/dist/components/FormTemplateEditor/FieldLibraryRow.js +4 -4
  129. package/dist/components/FormTemplateEditor/FieldLibraryRow.js.map +1 -1
  130. package/dist/components/FormTemplateEditor/FormStructurePanel.js +1 -1
  131. package/dist/components/FormTemplateEditor/FormStructurePanel.js.map +1 -1
  132. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js +1 -1
  133. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js.map +1 -1
  134. package/dist/components/FormTemplateEditor/StepCard.d.ts.map +1 -1
  135. package/dist/components/FormTemplateEditor/StepCard.js +15 -10
  136. package/dist/components/FormTemplateEditor/StepCard.js.map +1 -1
  137. package/dist/components/FormTemplateEditor/StepFieldRow.d.ts.map +1 -1
  138. package/dist/components/FormTemplateEditor/StepFieldRow.js +11 -6
  139. package/dist/components/FormTemplateEditor/StepFieldRow.js.map +1 -1
  140. package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts.map +1 -1
  141. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js +2 -1
  142. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js.map +1 -1
  143. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +45 -45
  144. package/dist/components/GenericCard/PortalDOI/PortalDOI.js +5 -5
  145. package/dist/components/GenericCard/PortalDOI/PortalDOI.js.map +1 -1
  146. package/dist/components/GenericCard/TableRowGenericCard.js +1 -1
  147. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  148. package/dist/components/HelpPopover/HelpPopover.js +1 -1
  149. package/dist/components/HelpPopover/HelpPopover.js.map +1 -1
  150. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  151. package/dist/components/IconSvg/IconSvg.js +154 -47
  152. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  153. package/dist/components/JsonSchemaForm/templates/ButtonTemplate.d.ts.map +1 -1
  154. package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js +19 -16
  155. package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js.map +1 -1
  156. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.d.ts.map +1 -1
  157. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js +2 -1
  158. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  159. package/dist/components/JsonSchemaForm/widgets/PhoneWidget.d.ts +9 -0
  160. package/dist/components/JsonSchemaForm/widgets/PhoneWidget.d.ts.map +1 -0
  161. package/dist/components/JsonSchemaForm/widgets/PhoneWidget.js +21 -0
  162. package/dist/components/JsonSchemaForm/widgets/PhoneWidget.js.map +1 -0
  163. package/dist/components/Markdown/MarkdownCollapse.d.ts.map +1 -1
  164. package/dist/components/Markdown/MarkdownCollapse.js +3 -1
  165. package/dist/components/Markdown/MarkdownCollapse.js.map +1 -1
  166. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js +1 -1
  167. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  168. package/dist/components/OAuthClientManagement/OAuthManagement.js +14 -13
  169. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  170. package/dist/components/PortalList/PortalCard.d.ts.map +1 -1
  171. package/dist/components/PortalList/PortalCard.js +6 -5
  172. package/dist/components/PortalList/PortalCard.js.map +1 -1
  173. package/dist/components/PortalList/PortalList.js +4 -4
  174. package/dist/components/PortalList/PortalList.js.map +1 -1
  175. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +6 -6
  176. package/dist/components/QueryBuilder/FilterConditionRow.js +4 -4
  177. package/dist/components/QueryCountButton/QueryCountButton.js +5 -5
  178. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  179. package/dist/components/ReleaseCard/ReleaseCardLarge.js +5 -5
  180. package/dist/components/ReleaseCard/ReleaseCardLarge.js.map +1 -1
  181. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +1 -1
  182. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  183. package/dist/components/ShareThisPage/ShareThisPage.js +4 -4
  184. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  185. package/dist/components/SustainabilityScorecard/DialLayout.js +1 -1
  186. package/dist/components/SustainabilityScorecard/DialLayout.js.map +1 -1
  187. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js +1 -1
  188. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  189. package/dist/components/SynapseChat/SynapseChat.js +1 -1
  190. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  191. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
  192. package/dist/components/SynapseChat/SynapseChatInteraction.js +2 -1
  193. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  194. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js +1 -1
  195. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js.map +1 -1
  196. package/dist/components/SynapseFooter/SynapseFooter.js +1 -1
  197. package/dist/components/SynapseFooter/SynapseFooter.js.map +1 -1
  198. package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasetItem.js +1 -1
  199. package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasetItem.js.map +1 -1
  200. package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.d.ts.map +1 -1
  201. package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js +2 -1
  202. package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js.map +1 -1
  203. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js +4 -4
  204. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  205. package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js +1 -1
  206. package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js.map +1 -1
  207. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  208. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +4 -1
  209. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  210. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +1 -1
  211. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  212. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js +1 -1
  213. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  214. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.d.ts.map +1 -1
  215. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +12 -9
  216. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
  217. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +4 -4
  218. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  219. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +140 -140
  220. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  221. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
  222. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  223. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js +1 -1
  224. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  225. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
  226. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  227. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +9 -9
  228. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  229. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.d.ts.map +1 -1
  230. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js +6 -4
  231. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js.map +1 -1
  232. package/dist/components/TanStackTable/ColumnHeader.js +1 -1
  233. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  234. package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js +1 -1
  235. package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js.map +1 -1
  236. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.d.ts.map +1 -1
  237. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js +4 -3
  238. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  239. package/dist/components/Webhook/WebhookDashboard.js +1 -1
  240. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  241. package/dist/components/dataaccess/AccessRequirementDashboard.js +4 -4
  242. package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
  243. package/dist/components/dataaccess/AccessRequirementTable.js +1 -1
  244. package/dist/components/dataaccess/AccessRequirementTable.js.map +1 -1
  245. package/dist/components/dataaccess/EDucTemplateTable.d.ts.map +1 -1
  246. package/dist/components/dataaccess/EDucTemplateTable.js +13 -11
  247. package/dist/components/dataaccess/EDucTemplateTable.js.map +1 -1
  248. package/dist/components/dataaccess/FormTemplateTable.js +6 -6
  249. package/dist/components/dataaccess/FormTemplateTable.js.map +1 -1
  250. package/dist/components/dataaccess/ReviewerDashboard.js +17 -17
  251. package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
  252. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +4 -4
  253. package/dist/components/doi/CreateOrUpdateDoiModal.js +1 -1
  254. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  255. package/dist/components/download_list/DownloadDetails.d.ts.map +1 -1
  256. package/dist/components/download_list/DownloadDetails.js +12 -10
  257. package/dist/components/download_list/DownloadDetails.js.map +1 -1
  258. package/dist/components/entity/metadata/AnnotationsTable.js +1 -1
  259. package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
  260. package/dist/components/entity/page/CreatedByModifiedBy.js +1 -1
  261. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  262. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  263. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  264. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +1 -1
  265. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
  266. package/dist/components/error/ErrorChip.d.ts.map +1 -1
  267. package/dist/components/error/ErrorChip.js +2 -1
  268. package/dist/components/error/ErrorChip.js.map +1 -1
  269. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +14 -14
  270. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +4 -4
  271. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -1
  272. package/dist/components/widgets/facet-nav/FacetNavPanel.js +1 -1
  273. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  274. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -1
  275. package/dist/features/curator/dashboard/components/NextStepButton.js +7 -6
  276. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -1
  277. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +8 -8
  278. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  279. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +4 -4
  280. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  281. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +4 -4
  282. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
  283. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  284. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  285. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js +4 -4
  286. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js.map +1 -1
  287. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js +1 -1
  288. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js.map +1 -1
  289. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js +1 -1
  290. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js.map +1 -1
  291. package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js +10 -10
  292. package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js.map +1 -1
  293. package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js +1 -1
  294. package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js.map +1 -1
  295. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +8 -0
  296. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  297. package/dist/mocks/msw/handlers/aridhiaHandlers.js +52 -41
  298. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  299. package/dist/mocks/msw/handlers/entityHandlers.d.ts.map +1 -1
  300. package/dist/mocks/msw/handlers/entityHandlers.js +70 -67
  301. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  302. package/dist/mocks/msw/handlers/gridHandlers.js +2 -2
  303. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  304. package/dist/mocks/msw/server.d.ts.map +1 -1
  305. package/dist/mocks/msw/server.js +4 -2
  306. package/dist/mocks/msw/server.js.map +1 -1
  307. package/dist/synapse-queries/user/useGetUserChallenges.d.ts.map +1 -1
  308. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  309. package/dist/theme/DefaultTheme.d.ts.map +1 -1
  310. package/dist/theme/DefaultTheme.js +4 -1
  311. package/dist/theme/DefaultTheme.js.map +1 -1
  312. package/dist/tsconfig.build.tsbuildinfo +1 -1
  313. package/dist/utils/APIConstants.d.ts.map +1 -1
  314. package/dist/utils/APIConstants.js.map +1 -1
  315. package/dist/utils/AppUtils/AppUtils.js +1 -1
  316. package/dist/utils/AppUtils/AppUtils.js.map +1 -1
  317. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  318. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  319. package/package.json +7 -6
@@ -1 +1 @@
1
- {"version":3,"file":"SynapsePortalBanners.js","names":[],"sources":["../../../src/components/SynapsePortalBanners/SynapsePortalBanners.tsx"],"sourcesContent":["import {\n useGetEntityPath,\n useGetQueryResultBundleWithAsyncStatus,\n} from '@/synapse-queries'\nimport { useSourceAppConfigs } from '@/utils/hooks'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { ChevronRightTwoTone } from '@mui/icons-material'\nimport { Box, Typography } from '@mui/material'\nimport {\n ColumnSingleValueQueryFilter,\n ColumnSingleValueFilterOperator,\n} from '@sage-bionetworks/synapse-types'\n\nexport type SynapsePortalBannersProps = {\n entityId: string\n dataCatalogEntityId?: string\n sourceAppConfigTableID?: string\n}\n\n/**\n *\n * @param props\n */\nexport default function SynapsePortalBanners({\n entityId,\n dataCatalogEntityId = 'syn61609402',\n sourceAppConfigTableID = 'syn45291362',\n}: SynapsePortalBannersProps) {\n const { data: entityPathData } = useGetEntityPath(entityId)\n // get all EntityHeader ids in the entity path data in a string array\n // Note: we remove the first item from entityPathData.path as it is always the root Synapse folder which we don't want to include\n const entityIdValues: string[] = entityPathData\n ? entityPathData.path.map(header => header.id).slice(1)\n : [entityId]\n\n const dataCatalogAdditionalFilters: ColumnSingleValueQueryFilter[] =\n entityIdValues\n ? [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'id',\n operator: ColumnSingleValueFilterOperator.IN,\n values: entityIdValues,\n },\n ]\n : []\n const { data: dataCatalogData } = useGetQueryResultBundleWithAsyncStatus(\n {\n entityId: dataCatalogEntityId,\n query: {\n sql: `SELECT appId, link FROM ${dataCatalogEntityId}`,\n additionalFilters: dataCatalogAdditionalFilters,\n },\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n },\n {\n enabled: !!entityPathData,\n },\n )\n\n const rowSet = dataCatalogData?.responseBody?.queryResult?.queryResults\n const hasPortalBanners = !!rowSet && rowSet?.rows.length > 0\n\n const appIds = rowSet?.rows\n .map(row => row.values[0])\n .filter((v): v is string => !!v) as string[]\n const hasAppIds = appIds && appIds.length > 0\n\n const sourceAppConfigFilters: ColumnSingleValueQueryFilter[] = hasAppIds\n ? [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'appId',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: appIds,\n },\n ]\n : []\n const sourceAppConfigs = useSourceAppConfigs(\n sourceAppConfigTableID,\n sourceAppConfigFilters,\n )\n const hasSourceAppConfigs = !!sourceAppConfigs && sourceAppConfigs.length > 0\n\n if (!hasAppIds || !hasPortalBanners || !hasSourceAppConfigs) {\n return <></>\n }\n\n // we have source app configs associated to this entity, let's render the banners\n return (\n <Box\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '20px',\n width: '100%',\n alignItems: 'center',\n }}\n >\n {sourceAppConfigs.map((appConfig, index) => {\n const dataCatalogRow = rowSet.rows.find(row => {\n return row.values[0] === appConfig.appId\n })\n\n const link = dataCatalogRow?.values[1] || appConfig.appURL\n return (\n <Box\n key={index}\n component=\"a\"\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n flex={1}\n sx={{\n display: 'flex',\n flexWrap: 'nowrap',\n padding: '16px',\n justifyContent: 'space-between',\n border: '1px solid #ccc',\n borderRadius: '8px',\n backgroundColor: '#f9f9f9',\n textDecoration: 'none',\n pointer: 'cursor',\n '&:hover': {\n textDecoration: 'none !important',\n },\n width: '100%',\n alignItems: 'center',\n mt: '10px',\n mb: '10px',\n }}\n >\n <Box\n flex={1}\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n gap: '10px',\n }}\n >\n <Box\n sx={{\n '> *': {\n height: '60px',\n },\n }}\n >\n {appConfig?.logo}\n </Box>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n mr: '10px',\n }}\n >\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n This resource is part of a Portal\n </Typography>\n <Typography variant=\"body1\">\n {' '}\n Access it on the {appConfig.friendlyName}\n </Typography>\n </Box>\n </Box>\n <ChevronRightTwoTone />\n </Box>\n )\n })}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;AAuBA,SAAwB,EAAqB,EAC3C,aACA,yBAAsB,eACtB,4BAAyB,iBACG;CAC5B,IAAM,EAAE,MAAM,MAAmB,EAAiB,CAAQ,GAGpD,IAA2B,IAC7B,EAAe,KAAK,KAAI,MAAU,EAAO,EAAE,EAAE,MAAM,CAAC,IACpD,CAAC,CAAQ,GAEP,IACJ,IACI,CACE;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ;CACV,CACF,IACA,CAAC,GACD,EAAE,MAAM,MAAoB,EAChC;EACE,UAAU;EACV,OAAO;GACL,KAAK,2BAA2B;GAChC,mBAAmB;EACrB;EACA,UAAA;EACA,cAAc;CAChB,GACA,EACE,SAAS,CAAC,CAAC,EACb,CACF,GAEM,IAAS,GAAiB,cAAc,aAAa,cACrD,IAAmB,CAAC,CAAC,KAAU,GAAQ,KAAK,SAAS,GAErD,IAAS,GAAQ,KACpB,KAAI,MAAO,EAAI,OAAO,EAAE,EACxB,QAAQ,MAAmB,CAAC,CAAC,CAAC,GAC3B,IAAY,KAAU,EAAO,SAAS,GAatC,IAAmB,EACvB,GAZ6D,IAC3D,CACE;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ;CACV,CACF,IACA,CAAC,CAIL,GACM,IAAsB,CAAC,CAAC,KAAoB,EAAiB,SAAS;CAO5E,OALI,CAAC,KAAa,CAAC,KAAoB,CAAC,IAC/B,kBAAA,GAAA,CAAI,CAAA,IAKX,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,UAAU;GACV,KAAK;GACL,OAAO;GACP,YAAY;EACd;YAEC,EAAiB,KAAK,GAAW,MAO9B,kBAAC,GAAD;GAEE,WAAU;GACV,MATmB,EAAO,KAAK,MAAK,MAC/B,EAAI,OAAO,OAAO,EAAU,KAGxB,GAAgB,OAAO,MAAM,EAAU;GAMhD,QAAO;GACP,KAAI;GACJ,MAAM;GACN,IAAI;IACF,SAAS;IACT,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,SAAS;IACT,WAAW,EACT,gBAAgB,kBAClB;IACA,OAAO;IACP,YAAY;IACZ,IAAI;IACJ,IAAI;GACN;aAxBF,CA0BE,kBAAC,GAAD;IACE,MAAM;IACN,IAAI;KACF,SAAS;KACT,UAAU;KACV,gBAAgB;KAChB,KAAK;IACP;cAPF,CASE,kBAAC,GAAD;KACE,IAAI,EACF,OAAO,EACL,QAAQ,OACV,EACF;eAEC,GAAW;IACT,CAAA,GACL,kBAAC,GAAD;KACE,IAAI;MACF,SAAS;MACT,eAAe;MACf,gBAAgB;MAChB,IAAI;KACN;eANF,CAQE,kBAAC,GAAD;MAAY,SAAQ;MAAQ,IAAI,EAAE,YAAY,IAAI;gBAAG;KAEzC,CAAA,GACZ,kBAAC,GAAD;MAAY,SAAQ;gBAApB;OACG;OAAI;OACa,EAAU;MAClB;OACT;MACF;OACL,kBAAC,GAAD,CAAsB,CAAA,CACnB;KA7DE,CA6DF,CAER;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"SynapsePortalBanners.js","names":[],"sources":["../../../src/components/SynapsePortalBanners/SynapsePortalBanners.tsx"],"sourcesContent":["import {\n useGetEntityPath,\n useGetQueryResultBundleWithAsyncStatus,\n} from '@/synapse-queries'\nimport { useSourceAppConfigs } from '@/utils/hooks'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport ChevronRightTwoTone from '@mui/icons-material/ChevronRightTwoTone'\nimport { Box, Typography } from '@mui/material'\nimport {\n ColumnSingleValueQueryFilter,\n ColumnSingleValueFilterOperator,\n} from '@sage-bionetworks/synapse-types'\n\nexport type SynapsePortalBannersProps = {\n entityId: string\n dataCatalogEntityId?: string\n sourceAppConfigTableID?: string\n}\n\n/**\n *\n * @param props\n */\nexport default function SynapsePortalBanners({\n entityId,\n dataCatalogEntityId = 'syn61609402',\n sourceAppConfigTableID = 'syn45291362',\n}: SynapsePortalBannersProps) {\n const { data: entityPathData } = useGetEntityPath(entityId)\n // get all EntityHeader ids in the entity path data in a string array\n // Note: we remove the first item from entityPathData.path as it is always the root Synapse folder which we don't want to include\n const entityIdValues: string[] = entityPathData\n ? entityPathData.path.map(header => header.id).slice(1)\n : [entityId]\n\n const dataCatalogAdditionalFilters: ColumnSingleValueQueryFilter[] =\n entityIdValues\n ? [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'id',\n operator: ColumnSingleValueFilterOperator.IN,\n values: entityIdValues,\n },\n ]\n : []\n const { data: dataCatalogData } = useGetQueryResultBundleWithAsyncStatus(\n {\n entityId: dataCatalogEntityId,\n query: {\n sql: `SELECT appId, link FROM ${dataCatalogEntityId}`,\n additionalFilters: dataCatalogAdditionalFilters,\n },\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n },\n {\n enabled: !!entityPathData,\n },\n )\n\n const rowSet = dataCatalogData?.responseBody?.queryResult?.queryResults\n const hasPortalBanners = !!rowSet && rowSet?.rows.length > 0\n\n const appIds = rowSet?.rows\n .map(row => row.values[0])\n .filter((v): v is string => !!v) as string[]\n const hasAppIds = appIds && appIds.length > 0\n\n const sourceAppConfigFilters: ColumnSingleValueQueryFilter[] = hasAppIds\n ? [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'appId',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: appIds,\n },\n ]\n : []\n const sourceAppConfigs = useSourceAppConfigs(\n sourceAppConfigTableID,\n sourceAppConfigFilters,\n )\n const hasSourceAppConfigs = !!sourceAppConfigs && sourceAppConfigs.length > 0\n\n if (!hasAppIds || !hasPortalBanners || !hasSourceAppConfigs) {\n return <></>\n }\n\n // we have source app configs associated to this entity, let's render the banners\n return (\n <Box\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '20px',\n width: '100%',\n alignItems: 'center',\n }}\n >\n {sourceAppConfigs.map((appConfig, index) => {\n const dataCatalogRow = rowSet.rows.find(row => {\n return row.values[0] === appConfig.appId\n })\n\n const link = dataCatalogRow?.values[1] || appConfig.appURL\n return (\n <Box\n key={index}\n component=\"a\"\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n flex={1}\n sx={{\n display: 'flex',\n flexWrap: 'nowrap',\n padding: '16px',\n justifyContent: 'space-between',\n border: '1px solid #ccc',\n borderRadius: '8px',\n backgroundColor: '#f9f9f9',\n textDecoration: 'none',\n pointer: 'cursor',\n '&:hover': {\n textDecoration: 'none !important',\n },\n width: '100%',\n alignItems: 'center',\n mt: '10px',\n mb: '10px',\n }}\n >\n <Box\n flex={1}\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n gap: '10px',\n }}\n >\n <Box\n sx={{\n '> *': {\n height: '60px',\n },\n }}\n >\n {appConfig?.logo}\n </Box>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n mr: '10px',\n }}\n >\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n This resource is part of a Portal\n </Typography>\n <Typography variant=\"body1\">\n {' '}\n Access it on the {appConfig.friendlyName}\n </Typography>\n </Box>\n </Box>\n <ChevronRightTwoTone />\n </Box>\n )\n })}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;AAuBA,SAAwB,EAAqB,EAC3C,aACA,yBAAsB,eACtB,4BAAyB,iBACG;CAC5B,IAAM,EAAE,MAAM,MAAmB,EAAiB,CAAQ,GAGpD,IAA2B,IAC7B,EAAe,KAAK,KAAI,MAAU,EAAO,EAAE,EAAE,MAAM,CAAC,IACpD,CAAC,CAAQ,GAEP,IACJ,IACI,CACE;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ;CACV,CACF,IACA,CAAC,GACD,EAAE,MAAM,MAAoB,EAChC;EACE,UAAU;EACV,OAAO;GACL,KAAK,2BAA2B;GAChC,mBAAmB;EACrB;EACA,UAAA;EACA,cAAc;CAChB,GACA,EACE,SAAS,CAAC,CAAC,EACb,CACF,GAEM,IAAS,GAAiB,cAAc,aAAa,cACrD,IAAmB,CAAC,CAAC,KAAU,GAAQ,KAAK,SAAS,GAErD,IAAS,GAAQ,KACpB,KAAI,MAAO,EAAI,OAAO,EAAE,EACxB,QAAQ,MAAmB,CAAC,CAAC,CAAC,GAC3B,IAAY,KAAU,EAAO,SAAS,GAatC,IAAmB,EACvB,GAZ6D,IAC3D,CACE;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ;CACV,CACF,IACA,CAAC,CAIL,GACM,IAAsB,CAAC,CAAC,KAAoB,EAAiB,SAAS;CAO5E,OALI,CAAC,KAAa,CAAC,KAAoB,CAAC,IAC/B,kBAAA,GAAA,CAAI,CAAA,IAKX,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,UAAU;GACV,KAAK;GACL,OAAO;GACP,YAAY;EACd;YAEC,EAAiB,KAAK,GAAW,MAO9B,kBAAC,GAAD;GAEE,WAAU;GACV,MATmB,EAAO,KAAK,MAAK,MAC/B,EAAI,OAAO,OAAO,EAAU,KAGxB,GAAgB,OAAO,MAAM,EAAU;GAMhD,QAAO;GACP,KAAI;GACJ,MAAM;GACN,IAAI;IACF,SAAS;IACT,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,SAAS;IACT,WAAW,EACT,gBAAgB,kBAClB;IACA,OAAO;IACP,YAAY;IACZ,IAAI;IACJ,IAAI;GACN;aAxBF,CA0BE,kBAAC,GAAD;IACE,MAAM;IACN,IAAI;KACF,SAAS;KACT,UAAU;KACV,gBAAgB;KAChB,KAAK;IACP;cAPF,CASE,kBAAC,GAAD;KACE,IAAI,EACF,OAAO,EACL,QAAQ,OACV,EACF;eAEC,GAAW;IACT,CAAA,GACL,kBAAC,GAAD;KACE,IAAI;MACF,SAAS;MACT,eAAe;MACf,gBAAgB;MAChB,IAAI;KACN;eANF,CAQE,kBAAC,GAAD;MAAY,SAAQ;MAAQ,IAAI,EAAE,YAAY,IAAI;gBAAG;KAEzC,CAAA,GACZ,kBAAC,GAAD;MAAY,SAAQ;gBAApB;OACG;OAAI;OACa,EAAU;MAClB;OACT;MACF;OACL,kBAAC,GAAD,CAAsB,CAAA,CACnB;KA7DE,CA6DF,CAER;CACE,CAAA;AAET"}
@@ -15,7 +15,7 @@ import { AppliedFacetsChips as u, SearchFacetPanel as d } from "./SearchFacetPan
15
15
  import { Suspense as f, useCallback as p, useEffect as m, useMemo as h, useState as g } from "react";
16
16
  import { Badge as _, Box as v, Button as y, Collapse as te, IconButton as b, InputAdornment as x, Link as S, Skeleton as C, TextField as w, Typography as T } from "@mui/material";
17
17
  import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
18
- import { ArrowForward as k } from "@mui/icons-material";
18
+ import k from "@mui/icons-material/ArrowForward";
19
19
  import A from "@mui/icons-material/Search";
20
20
  import ne from "@mui/icons-material/FilterAltOutlined";
21
21
  //#region src/components/SynapseSearchPageResults/SynapseSearchPageResults.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseSearchPageResults.js","names":[],"sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchPageResults.tsx"],"sourcesContent":["import {\n Box,\n TextField,\n InputAdornment,\n Button,\n Typography,\n IconButton,\n Collapse,\n Badge,\n Skeleton,\n Link,\n} from '@mui/material'\nimport SynapseSearchResultsCard from './SynapseSearchResultsCard'\nimport SearchIcon from '@mui/icons-material/Search'\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined'\nimport React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Suspense,\n} from 'react'\nimport { useSearchInfinite } from '@/synapse-queries/search/useSearch'\nimport {\n SearchQuery,\n KeyRange,\n Hit,\n Facet,\n} from '@sage-bionetworks/synapse-types'\nimport { useDocumentMetadata } from '@/utils/context/DocumentMetadataContext'\nimport { ArrowForward } from '@mui/icons-material'\nimport styles from './SynapseSearchPageResults.module.scss'\nimport { useSuggestion } from '@/synapse-queries/search/useSuggestion'\nimport { Suggestion } from '@sage-bionetworks/synapse-client'\nimport SearchPagePortalBanners from './SearchPagePortalBanners'\nimport { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DEFAULT_SEARCH_QUERY } from '@/utils/searchDefaults'\nimport {\n SearchFacetPanel,\n AppliedFacetsChips,\n} from './SearchFacetPanel/SearchFacetPanel'\nimport { shouldShowFacetValue } from './SearchFacetPanel/SearchFacetPanelUtils'\nimport { SkeletonInlineBlock } from '../Skeleton'\nimport { useSynapseContext } from '@/utils'\n\n/**\n * Add a literal facet filter to the query\n */\nfunction addFacetToQuery(\n query: SearchQuery,\n facetName: string,\n facetValue: string,\n): SearchQuery {\n const booleanQuery = query.booleanQuery || []\n\n const isFilterAlreadyApplied = booleanQuery.some(\n kv => kv.key === facetName && kv.value === facetValue,\n )\n\n if (isFilterAlreadyApplied) {\n return query\n }\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n booleanQuery: [\n ...booleanQuery,\n { key: facetName, value: facetValue, not: false },\n ],\n start: 0, // Reset to first page\n }\n}\n\n/**\n * Remove a literal facet filter from the query\n */\nfunction removeFacetFromQuery(\n query: SearchQuery,\n facetName: string,\n facetValue: string,\n): SearchQuery {\n const booleanQuery = query.booleanQuery || []\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n booleanQuery: booleanQuery.filter(\n kv => !(kv.key === facetName && kv.value === facetValue),\n ),\n start: 0,\n }\n}\n\n/**\n * Set a range facet (ex, for modified on, created on)\n */\nfunction setRangeFacetInQuery(\n query: SearchQuery,\n facetName: string,\n minValue: string,\n): SearchQuery {\n const rangeQuery = query.rangeQuery || []\n\n // Remove any existing range for this facet\n const filteredRangeQuery = rangeQuery.filter(kr => kr.key !== facetName)\n\n const maxValue = String(Math.floor(Date.now() / 1000)) // Now in seconds\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n rangeQuery: [\n ...filteredRangeQuery,\n { key: facetName, min: minValue, max: maxValue },\n ],\n start: 0,\n }\n}\n\n/**\n * Remove a range facet from the query\n */\nfunction removeRangeFacetFromQuery(\n query: SearchQuery,\n facetName: string,\n): SearchQuery {\n const rangeQuery = query.rangeQuery || []\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n rangeQuery: rangeQuery.filter(kr => kr.key !== facetName),\n start: 0,\n }\n}\n\n/**\n * Check if a range facet is currently applied\n */\nfunction isRangeFacetApplied(query: SearchQuery, facetName: string): boolean {\n const rangeQuery = query.rangeQuery || []\n return rangeQuery.some(kr => kr.key === facetName)\n}\n\n/**\n * Get the applied range facet value for a given facet name\n */\nfunction getAppliedRangeFacet(\n query: SearchQuery,\n facetName: string,\n): KeyRange | undefined {\n const rangeQuery = query.rangeQuery || []\n return rangeQuery.find(kr => kr.key === facetName)\n}\n\nexport type SynapseSearchPageResultsProps = {\n query?: SearchQuery\n setQuery?: (newQuery: SearchQuery) => void\n}\n\nexport function SynapseSearchPageResults(props: SynapseSearchPageResultsProps) {\n const MIN_SUGGESTION_SCORE = 0.75\n const { query, setQuery } = props\n const { peopleSearchPageUrl } = useSynapseContext()\n const [expanded, setExpanded] = useState(false)\n\n // Set page title (replaces jsniUtils.setPageTitle(DisplayConstants.LABEL_SEARCH) from Java)\n useDocumentMetadata({ title: `Search: ${query?.queryTerm?.join(' ')}` })\n\n // Capture local state to prevent search from executing on every keystroke\n // Join query terms so that textfield input looks correct\n const [searchInputValue, setSearchInputValue] = useState(\n query?.queryTerm?.join(' ') || '',\n )\n\n // Sync input value when query prop changes\n // Join query terms so that textfield input looks correct\n useEffect(() => {\n setSearchInputValue(query?.queryTerm?.join(' ') || '')\n }, [query])\n\n // Execute search\n const {\n data,\n isLoading,\n error,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useSearchInfinite(\n query\n ? {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n size: 50,\n returnFields: ['path'],\n }\n : { queryTerm: [], size: 50, returnFields: ['path'] },\n {\n enabled: !!query?.queryTerm?.[0],\n },\n )\n\n // Update local input state\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchInputValue(event.target.value)\n }\n\n // Update query only when user explicitly searches\n // Split query terms to form array\n const handleSearch = () => {\n if (setQuery) {\n const newQuery = {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n queryTerm: searchInputValue\n ? searchInputValue\n .split(' ')\n .map(term => term.trim())\n .filter(Boolean)\n : [],\n start: 0,\n }\n setQuery(newQuery)\n }\n }\n\n // Fetch spelling suggestions for the search terms\n const { data: suggestionData } = useSuggestion(\n { searchTerm: query?.queryTerm },\n\n {\n enabled: !!query?.queryTerm?.[0],\n },\n )\n\n const suggestion = useMemo(() => {\n const suggestionValues = suggestionData?.suggestions\n const terms = query?.queryTerm || []\n\n if (!suggestionValues) return null\n\n // Map original terms to their best suggestions if available\n const suggestionMap = new Map<string, string>()\n let hasSuggestion = false\n\n for (const suggestionList of suggestionValues) {\n const originalTerm = suggestionList.key\n const suggestions = Array.from(suggestionList.values ?? [])\n\n // Among suggestions above the score threshold, pick the highest-frequency term.\n const bestSuggestion = suggestions.reduce<Suggestion | null>(\n (best, current) => {\n if (\n current.score === undefined ||\n current.score < MIN_SUGGESTION_SCORE\n ) {\n return best\n }\n if (!best || (current.frequency ?? 0) > (best.frequency ?? 0)) {\n return current\n }\n return best\n },\n null,\n )\n\n // If a valid suggestion is found and it's different from the original term, add it to the map\n if (bestSuggestion?.term && bestSuggestion.term !== originalTerm) {\n suggestionMap.set(originalTerm!, bestSuggestion.term)\n hasSuggestion = true\n }\n }\n\n if (!hasSuggestion) return null\n\n // Build the corrected search string by replacing misspelled terms\n // Use toLowerCase() because the suggestion API returns keys in lowercase\n const correctedTerms = terms.map(\n term => suggestionMap.get(term.toLowerCase()) || term,\n )\n\n return correctedTerms.join(' ')\n }, [suggestionData, query?.queryTerm])\n\n // Extract entity IDs from search results for relevant portal banner display\n const entityIdsForPortalBanners = useMemo(() => {\n if (!data?.pages || data.pages.length === 0) {\n return []\n }\n\n const entityIds = new Set<string>()\n\n const firstPage = data.pages[0]\n\n if (firstPage?.hits) {\n for (const hit of firstPage.hits) {\n // search result is the top-level Project itself\n if (hit.id) {\n entityIds.add(hit.id)\n }\n\n if (hit.path?.path) {\n for (const pathEntity of hit.path.path.slice(1)) {\n if (pathEntity.id) {\n entityIds.add(pathEntity.id)\n }\n }\n }\n }\n }\n\n const finalIds = Array.from(entityIds)\n\n return finalIds\n }, [data])\n\n const handleUseSuggestion = () => {\n if (setQuery && suggestion) {\n const newQuery = {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n queryTerm: suggestion\n .split(' ')\n .map(term => term.trim())\n .filter(Boolean),\n start: 0,\n }\n setQuery(newQuery)\n }\n }\n\n const noResults = data?.pages?.[0]?.hits?.length === 0\n const isSynId = SYNAPSE_ENTITY_ID_REGEX.test(query?.queryTerm?.[0] || '')\n\n // cached facets in local state to prevent them from being cleared when the query changes and new search results are loading\n const [facets, setFacets] = useState<Facet[]>([])\n\n useEffect(() => {\n const newFacets = data?.pages?.[0]?.facets\n if (newFacets) {\n setFacets(newFacets)\n }\n }, [data])\n\n const handleAddFacet = useCallback(\n (facetName: string, facetValue: string) => {\n if (setQuery && query) {\n setQuery(addFacetToQuery(query, facetName, facetValue))\n }\n },\n [query, setQuery],\n )\n\n const handleRemoveFacet = useCallback(\n (facetName: string, facetValue: string) => {\n if (setQuery && query) {\n setQuery(removeFacetFromQuery(query, facetName, facetValue))\n }\n },\n [query, setQuery],\n )\n\n const handleSetRangeFacet = useCallback(\n (facetName: string, minValue: string) => {\n if (setQuery && query) {\n setQuery(setRangeFacetInQuery(query, facetName, minValue))\n }\n },\n [query, setQuery],\n )\n\n const handleRemoveRangeFacet = useCallback(\n (facetName: string) => {\n if (setQuery && query) {\n setQuery(removeRangeFacetFromQuery(query, facetName))\n }\n },\n [query, setQuery],\n )\n\n const isRangeFacetAppliedCallback = useCallback(\n (name: string) => (query ? isRangeFacetApplied(query, name) : false),\n [query],\n )\n\n const getAppliedRangeFacetCallback = useCallback(\n (name: string) => (query ? getAppliedRangeFacet(query, name) : undefined),\n [query],\n )\n\n const appliedFacetsCount =\n (query?.booleanQuery?.filter(kv => shouldShowFacetValue(kv.key, kv.value))\n .length || 0) + (query?.rangeQuery?.length || 0)\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n p: '30px',\n gap: '20px',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: 'auto',\n gap: '16px',\n }}\n >\n {peopleSearchPageUrl && (\n <Typography variant=\"smallText1\">\n Searching for a user profile? Try our{' '}\n <Link href={peopleSearchPageUrl}>People Search.</Link>\n </Typography>\n )}\n <Box className={styles.searchContainer}>\n <TextField\n placeholder=\"Search…\"\n sx={{ flex: 1 }}\n value={searchInputValue}\n onChange={handleInputChange}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleSearch()\n }\n }}\n slotProps={{\n input: {\n sx: {\n borderRadius: '96px',\n boxShadow: '0px 1px 4px var(--synapse-gray-500)',\n backgroundColor: 'var(--synapse-white)',\n },\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon sx={{ color: 'secondary.600' }} />\n </InputAdornment>\n ),\n },\n }}\n />\n <Button\n onClick={() => setExpanded(true)}\n variant=\"outlined\"\n startIcon={<FilterAltOutlinedIcon />}\n aria-expanded={expanded}\n aria-controls=\"filter-search-results-panel\"\n sx={{\n color: theme => theme.palette.primary.dark,\n }}\n className={styles.filterButton}\n >\n <Typography\n sx={{\n fontWeight: 700,\n lineHeight: '16px',\n display: 'flex',\n gap: '8px',\n }}\n >\n <span id=\"filter-results-button-label\">\n Filter Search Results\n </span>\n {appliedFacetsCount > 0 && (\n <Badge\n badgeContent={appliedFacetsCount}\n color=\"primary\"\n sx={{\n '& .MuiBadge-badge': {\n position: 'static',\n transform: 'none',\n height: '18px',\n minWidth: '18px',\n },\n }}\n />\n )}\n </Typography>\n </Button>\n </Box>\n <Box>\n {facets.length > 0 && (\n <Collapse\n in={expanded}\n id=\"filter-search-results-panel\"\n aria-labelledby=\"filter-results-button-label\"\n >\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'var(--synapse-gray-100)',\n backgroundColor: 'var(--synapse-white)',\n padding: '25px',\n boxShadow: '0 4px 16px 0 rgba(0, 0, 0, 0.04)',\n pointerEvents: isLoading ? 'none' : 'auto',\n opacity: isLoading ? 0.5 : 1,\n }}\n >\n {query && setQuery && (\n <SearchFacetPanel\n expanded={expanded}\n onCollapse={() => setExpanded(false)}\n disabled={isLoading}\n query={query}\n setQuery={setQuery}\n facets={facets}\n onAddFacet={handleAddFacet}\n onRemoveFacet={handleRemoveFacet}\n onSetRangeFacet={handleSetRangeFacet}\n onRemoveRangeFacet={handleRemoveRangeFacet}\n isRangeFacetApplied={isRangeFacetAppliedCallback}\n getAppliedRangeFacet={getAppliedRangeFacetCallback}\n />\n )}\n </Box>\n </Collapse>\n )}\n </Box>\n </Box>\n <>\n {data && !isSynId && suggestion && (\n <div className={styles.didYouMeanContainer}>\n <div className={styles.didYouMeanCurrentlyShowing}>\n {!noResults && (\n <>\n Currently showing results for{' '}\n <b>{query?.queryTerm?.join(' ')}</b>.\n </>\n )}\n </div>\n <div className={styles.didYouMeanSuggestion}>\n <SearchIcon\n sx={{ color: 'grey.600' }}\n className={styles.searchIcon}\n />\n <Typography variant=\"body1\" className={styles.didYouMeanText}>\n Search for <b className={styles.suggestionText}>{suggestion}</b>{' '}\n instead?\n </Typography>\n <IconButton\n className={styles.didYouMeanArrowContainer}\n onClick={handleUseSuggestion}\n aria-label={`Search for ${suggestion} instead`}\n sx={{\n borderColor: 'primary.main',\n svg: { color: 'primary.main' },\n }}\n >\n <ArrowForward />\n </IconButton>\n </div>\n </div>\n )}\n {noResults && (\n <div className={styles.didYouMeanCurrentlyShowing}>\n No results found for <b>{query?.queryTerm?.join(' ')}</b>.\n </div>\n )}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: '20px',\n }}\n >\n {isLoading &&\n Array.from({ length: 3 }, () => (\n <Skeleton variant=\"rectangular\" width={'100%'} height={'250px'} />\n ))}\n {error && <div>Error: {error.message}</div>}\n <Suspense\n fallback={<SkeletonInlineBlock width={'100%'} height={'150px'} />}\n >\n <SearchPagePortalBanners entityIds={entityIdsForPortalBanners} />\n </Suspense>\n {query && (\n <Box sx={{ alignSelf: 'flex-start' }}>\n <AppliedFacetsChips\n query={query}\n onRemoveFacet={handleRemoveFacet}\n onRemoveRangeFacet={handleRemoveRangeFacet}\n />\n </Box>\n )}\n {data &&\n data.pages &&\n data.pages.map((page, pageIndex) =>\n page.hits.map((hit: Hit) => {\n const projectPath = hit.path?.path?.[1]\n return (\n <SynapseSearchResultsCard\n searchTerms={query?.queryTerm ?? []}\n key={hit.id + '-' + pageIndex}\n entityId={hit.id}\n name={hit.name}\n entityType={hit.node_type}\n modifiedOn={hit.modified_on}\n description={hit.description}\n locatedIn={projectPath}\n />\n )\n }),\n )}\n {hasNextPage && (\n <Button\n onClick={() => {\n void fetchNextPage()\n }}\n loading={isFetchingNextPage}\n variant=\"contained\"\n sx={{ mt: 2 }}\n >\n {isFetchingNextPage ? 'Loading more...' : 'Load More'}\n </Button>\n )}\n </Box>\n </>\n </Box>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SynapseSearchPageResults.js","names":[],"sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchPageResults.tsx"],"sourcesContent":["import {\n Box,\n TextField,\n InputAdornment,\n Button,\n Typography,\n IconButton,\n Collapse,\n Badge,\n Skeleton,\n Link,\n} from '@mui/material'\nimport SynapseSearchResultsCard from './SynapseSearchResultsCard'\nimport SearchIcon from '@mui/icons-material/Search'\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined'\nimport React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Suspense,\n} from 'react'\nimport { useSearchInfinite } from '@/synapse-queries/search/useSearch'\nimport {\n SearchQuery,\n KeyRange,\n Hit,\n Facet,\n} from '@sage-bionetworks/synapse-types'\nimport { useDocumentMetadata } from '@/utils/context/DocumentMetadataContext'\nimport ArrowForward from '@mui/icons-material/ArrowForward'\nimport styles from './SynapseSearchPageResults.module.scss'\nimport { useSuggestion } from '@/synapse-queries/search/useSuggestion'\nimport { Suggestion } from '@sage-bionetworks/synapse-client'\nimport SearchPagePortalBanners from './SearchPagePortalBanners'\nimport { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DEFAULT_SEARCH_QUERY } from '@/utils/searchDefaults'\nimport {\n SearchFacetPanel,\n AppliedFacetsChips,\n} from './SearchFacetPanel/SearchFacetPanel'\nimport { shouldShowFacetValue } from './SearchFacetPanel/SearchFacetPanelUtils'\nimport { SkeletonInlineBlock } from '../Skeleton'\nimport { useSynapseContext } from '@/utils'\n\n/**\n * Add a literal facet filter to the query\n */\nfunction addFacetToQuery(\n query: SearchQuery,\n facetName: string,\n facetValue: string,\n): SearchQuery {\n const booleanQuery = query.booleanQuery || []\n\n const isFilterAlreadyApplied = booleanQuery.some(\n kv => kv.key === facetName && kv.value === facetValue,\n )\n\n if (isFilterAlreadyApplied) {\n return query\n }\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n booleanQuery: [\n ...booleanQuery,\n { key: facetName, value: facetValue, not: false },\n ],\n start: 0, // Reset to first page\n }\n}\n\n/**\n * Remove a literal facet filter from the query\n */\nfunction removeFacetFromQuery(\n query: SearchQuery,\n facetName: string,\n facetValue: string,\n): SearchQuery {\n const booleanQuery = query.booleanQuery || []\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n booleanQuery: booleanQuery.filter(\n kv => !(kv.key === facetName && kv.value === facetValue),\n ),\n start: 0,\n }\n}\n\n/**\n * Set a range facet (ex, for modified on, created on)\n */\nfunction setRangeFacetInQuery(\n query: SearchQuery,\n facetName: string,\n minValue: string,\n): SearchQuery {\n const rangeQuery = query.rangeQuery || []\n\n // Remove any existing range for this facet\n const filteredRangeQuery = rangeQuery.filter(kr => kr.key !== facetName)\n\n const maxValue = String(Math.floor(Date.now() / 1000)) // Now in seconds\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n rangeQuery: [\n ...filteredRangeQuery,\n { key: facetName, min: minValue, max: maxValue },\n ],\n start: 0,\n }\n}\n\n/**\n * Remove a range facet from the query\n */\nfunction removeRangeFacetFromQuery(\n query: SearchQuery,\n facetName: string,\n): SearchQuery {\n const rangeQuery = query.rangeQuery || []\n\n return {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n rangeQuery: rangeQuery.filter(kr => kr.key !== facetName),\n start: 0,\n }\n}\n\n/**\n * Check if a range facet is currently applied\n */\nfunction isRangeFacetApplied(query: SearchQuery, facetName: string): boolean {\n const rangeQuery = query.rangeQuery || []\n return rangeQuery.some(kr => kr.key === facetName)\n}\n\n/**\n * Get the applied range facet value for a given facet name\n */\nfunction getAppliedRangeFacet(\n query: SearchQuery,\n facetName: string,\n): KeyRange | undefined {\n const rangeQuery = query.rangeQuery || []\n return rangeQuery.find(kr => kr.key === facetName)\n}\n\nexport type SynapseSearchPageResultsProps = {\n query?: SearchQuery\n setQuery?: (newQuery: SearchQuery) => void\n}\n\nexport function SynapseSearchPageResults(props: SynapseSearchPageResultsProps) {\n const MIN_SUGGESTION_SCORE = 0.75\n const { query, setQuery } = props\n const { peopleSearchPageUrl } = useSynapseContext()\n const [expanded, setExpanded] = useState(false)\n\n // Set page title (replaces jsniUtils.setPageTitle(DisplayConstants.LABEL_SEARCH) from Java)\n useDocumentMetadata({ title: `Search: ${query?.queryTerm?.join(' ')}` })\n\n // Capture local state to prevent search from executing on every keystroke\n // Join query terms so that textfield input looks correct\n const [searchInputValue, setSearchInputValue] = useState(\n query?.queryTerm?.join(' ') || '',\n )\n\n // Sync input value when query prop changes\n // Join query terms so that textfield input looks correct\n useEffect(() => {\n setSearchInputValue(query?.queryTerm?.join(' ') || '')\n }, [query])\n\n // Execute search\n const {\n data,\n isLoading,\n error,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useSearchInfinite(\n query\n ? {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n size: 50,\n returnFields: ['path'],\n }\n : { queryTerm: [], size: 50, returnFields: ['path'] },\n {\n enabled: !!query?.queryTerm?.[0],\n },\n )\n\n // Update local input state\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchInputValue(event.target.value)\n }\n\n // Update query only when user explicitly searches\n // Split query terms to form array\n const handleSearch = () => {\n if (setQuery) {\n const newQuery = {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n queryTerm: searchInputValue\n ? searchInputValue\n .split(' ')\n .map(term => term.trim())\n .filter(Boolean)\n : [],\n start: 0,\n }\n setQuery(newQuery)\n }\n }\n\n // Fetch spelling suggestions for the search terms\n const { data: suggestionData } = useSuggestion(\n { searchTerm: query?.queryTerm },\n\n {\n enabled: !!query?.queryTerm?.[0],\n },\n )\n\n const suggestion = useMemo(() => {\n const suggestionValues = suggestionData?.suggestions\n const terms = query?.queryTerm || []\n\n if (!suggestionValues) return null\n\n // Map original terms to their best suggestions if available\n const suggestionMap = new Map<string, string>()\n let hasSuggestion = false\n\n for (const suggestionList of suggestionValues) {\n const originalTerm = suggestionList.key\n const suggestions = Array.from(suggestionList.values ?? [])\n\n // Among suggestions above the score threshold, pick the highest-frequency term.\n const bestSuggestion = suggestions.reduce<Suggestion | null>(\n (best, current) => {\n if (\n current.score === undefined ||\n current.score < MIN_SUGGESTION_SCORE\n ) {\n return best\n }\n if (!best || (current.frequency ?? 0) > (best.frequency ?? 0)) {\n return current\n }\n return best\n },\n null,\n )\n\n // If a valid suggestion is found and it's different from the original term, add it to the map\n if (bestSuggestion?.term && bestSuggestion.term !== originalTerm) {\n suggestionMap.set(originalTerm!, bestSuggestion.term)\n hasSuggestion = true\n }\n }\n\n if (!hasSuggestion) return null\n\n // Build the corrected search string by replacing misspelled terms\n // Use toLowerCase() because the suggestion API returns keys in lowercase\n const correctedTerms = terms.map(\n term => suggestionMap.get(term.toLowerCase()) || term,\n )\n\n return correctedTerms.join(' ')\n }, [suggestionData, query?.queryTerm])\n\n // Extract entity IDs from search results for relevant portal banner display\n const entityIdsForPortalBanners = useMemo(() => {\n if (!data?.pages || data.pages.length === 0) {\n return []\n }\n\n const entityIds = new Set<string>()\n\n const firstPage = data.pages[0]\n\n if (firstPage?.hits) {\n for (const hit of firstPage.hits) {\n // search result is the top-level Project itself\n if (hit.id) {\n entityIds.add(hit.id)\n }\n\n if (hit.path?.path) {\n for (const pathEntity of hit.path.path.slice(1)) {\n if (pathEntity.id) {\n entityIds.add(pathEntity.id)\n }\n }\n }\n }\n }\n\n const finalIds = Array.from(entityIds)\n\n return finalIds\n }, [data])\n\n const handleUseSuggestion = () => {\n if (setQuery && suggestion) {\n const newQuery = {\n ...DEFAULT_SEARCH_QUERY,\n ...query,\n queryTerm: suggestion\n .split(' ')\n .map(term => term.trim())\n .filter(Boolean),\n start: 0,\n }\n setQuery(newQuery)\n }\n }\n\n const noResults = data?.pages?.[0]?.hits?.length === 0\n const isSynId = SYNAPSE_ENTITY_ID_REGEX.test(query?.queryTerm?.[0] || '')\n\n // cached facets in local state to prevent them from being cleared when the query changes and new search results are loading\n const [facets, setFacets] = useState<Facet[]>([])\n\n useEffect(() => {\n const newFacets = data?.pages?.[0]?.facets\n if (newFacets) {\n setFacets(newFacets)\n }\n }, [data])\n\n const handleAddFacet = useCallback(\n (facetName: string, facetValue: string) => {\n if (setQuery && query) {\n setQuery(addFacetToQuery(query, facetName, facetValue))\n }\n },\n [query, setQuery],\n )\n\n const handleRemoveFacet = useCallback(\n (facetName: string, facetValue: string) => {\n if (setQuery && query) {\n setQuery(removeFacetFromQuery(query, facetName, facetValue))\n }\n },\n [query, setQuery],\n )\n\n const handleSetRangeFacet = useCallback(\n (facetName: string, minValue: string) => {\n if (setQuery && query) {\n setQuery(setRangeFacetInQuery(query, facetName, minValue))\n }\n },\n [query, setQuery],\n )\n\n const handleRemoveRangeFacet = useCallback(\n (facetName: string) => {\n if (setQuery && query) {\n setQuery(removeRangeFacetFromQuery(query, facetName))\n }\n },\n [query, setQuery],\n )\n\n const isRangeFacetAppliedCallback = useCallback(\n (name: string) => (query ? isRangeFacetApplied(query, name) : false),\n [query],\n )\n\n const getAppliedRangeFacetCallback = useCallback(\n (name: string) => (query ? getAppliedRangeFacet(query, name) : undefined),\n [query],\n )\n\n const appliedFacetsCount =\n (query?.booleanQuery?.filter(kv => shouldShowFacetValue(kv.key, kv.value))\n .length || 0) + (query?.rangeQuery?.length || 0)\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n p: '30px',\n gap: '20px',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: 'auto',\n gap: '16px',\n }}\n >\n {peopleSearchPageUrl && (\n <Typography variant=\"smallText1\">\n Searching for a user profile? Try our{' '}\n <Link href={peopleSearchPageUrl}>People Search.</Link>\n </Typography>\n )}\n <Box className={styles.searchContainer}>\n <TextField\n placeholder=\"Search…\"\n sx={{ flex: 1 }}\n value={searchInputValue}\n onChange={handleInputChange}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleSearch()\n }\n }}\n slotProps={{\n input: {\n sx: {\n borderRadius: '96px',\n boxShadow: '0px 1px 4px var(--synapse-gray-500)',\n backgroundColor: 'var(--synapse-white)',\n },\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon sx={{ color: 'secondary.600' }} />\n </InputAdornment>\n ),\n },\n }}\n />\n <Button\n onClick={() => setExpanded(true)}\n variant=\"outlined\"\n startIcon={<FilterAltOutlinedIcon />}\n aria-expanded={expanded}\n aria-controls=\"filter-search-results-panel\"\n sx={{\n color: theme => theme.palette.primary.dark,\n }}\n className={styles.filterButton}\n >\n <Typography\n sx={{\n fontWeight: 700,\n lineHeight: '16px',\n display: 'flex',\n gap: '8px',\n }}\n >\n <span id=\"filter-results-button-label\">\n Filter Search Results\n </span>\n {appliedFacetsCount > 0 && (\n <Badge\n badgeContent={appliedFacetsCount}\n color=\"primary\"\n sx={{\n '& .MuiBadge-badge': {\n position: 'static',\n transform: 'none',\n height: '18px',\n minWidth: '18px',\n },\n }}\n />\n )}\n </Typography>\n </Button>\n </Box>\n <Box>\n {facets.length > 0 && (\n <Collapse\n in={expanded}\n id=\"filter-search-results-panel\"\n aria-labelledby=\"filter-results-button-label\"\n >\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'var(--synapse-gray-100)',\n backgroundColor: 'var(--synapse-white)',\n padding: '25px',\n boxShadow: '0 4px 16px 0 rgba(0, 0, 0, 0.04)',\n pointerEvents: isLoading ? 'none' : 'auto',\n opacity: isLoading ? 0.5 : 1,\n }}\n >\n {query && setQuery && (\n <SearchFacetPanel\n expanded={expanded}\n onCollapse={() => setExpanded(false)}\n disabled={isLoading}\n query={query}\n setQuery={setQuery}\n facets={facets}\n onAddFacet={handleAddFacet}\n onRemoveFacet={handleRemoveFacet}\n onSetRangeFacet={handleSetRangeFacet}\n onRemoveRangeFacet={handleRemoveRangeFacet}\n isRangeFacetApplied={isRangeFacetAppliedCallback}\n getAppliedRangeFacet={getAppliedRangeFacetCallback}\n />\n )}\n </Box>\n </Collapse>\n )}\n </Box>\n </Box>\n <>\n {data && !isSynId && suggestion && (\n <div className={styles.didYouMeanContainer}>\n <div className={styles.didYouMeanCurrentlyShowing}>\n {!noResults && (\n <>\n Currently showing results for{' '}\n <b>{query?.queryTerm?.join(' ')}</b>.\n </>\n )}\n </div>\n <div className={styles.didYouMeanSuggestion}>\n <SearchIcon\n sx={{ color: 'grey.600' }}\n className={styles.searchIcon}\n />\n <Typography variant=\"body1\" className={styles.didYouMeanText}>\n Search for <b className={styles.suggestionText}>{suggestion}</b>{' '}\n instead?\n </Typography>\n <IconButton\n className={styles.didYouMeanArrowContainer}\n onClick={handleUseSuggestion}\n aria-label={`Search for ${suggestion} instead`}\n sx={{\n borderColor: 'primary.main',\n svg: { color: 'primary.main' },\n }}\n >\n <ArrowForward />\n </IconButton>\n </div>\n </div>\n )}\n {noResults && (\n <div className={styles.didYouMeanCurrentlyShowing}>\n No results found for <b>{query?.queryTerm?.join(' ')}</b>.\n </div>\n )}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: '20px',\n }}\n >\n {isLoading &&\n Array.from({ length: 3 }, () => (\n <Skeleton variant=\"rectangular\" width={'100%'} height={'250px'} />\n ))}\n {error && <div>Error: {error.message}</div>}\n <Suspense\n fallback={<SkeletonInlineBlock width={'100%'} height={'150px'} />}\n >\n <SearchPagePortalBanners entityIds={entityIdsForPortalBanners} />\n </Suspense>\n {query && (\n <Box sx={{ alignSelf: 'flex-start' }}>\n <AppliedFacetsChips\n query={query}\n onRemoveFacet={handleRemoveFacet}\n onRemoveRangeFacet={handleRemoveRangeFacet}\n />\n </Box>\n )}\n {data &&\n data.pages &&\n data.pages.map((page, pageIndex) =>\n page.hits.map((hit: Hit) => {\n const projectPath = hit.path?.path?.[1]\n return (\n <SynapseSearchResultsCard\n searchTerms={query?.queryTerm ?? []}\n key={hit.id + '-' + pageIndex}\n entityId={hit.id}\n name={hit.name}\n entityType={hit.node_type}\n modifiedOn={hit.modified_on}\n description={hit.description}\n locatedIn={projectPath}\n />\n )\n }),\n )}\n {hasNextPage && (\n <Button\n onClick={() => {\n void fetchNextPage()\n }}\n loading={isFetchingNextPage}\n variant=\"contained\"\n sx={{ mt: 2 }}\n >\n {isFetchingNextPage ? 'Loading more...' : 'Load More'}\n </Button>\n )}\n </Box>\n </>\n </Box>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseSearchResultsCard.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchResultsCard.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAc7D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAiBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,2CAwJ5E;AAED,eAAe,wBAAwB,CAAA"}
1
+ {"version":3,"file":"SynapseSearchResultsCard.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchResultsCard.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAc7D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAiBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,2CAwJ5E;AAED,eAAe,wBAAwB,CAAA"}
@@ -15,9 +15,12 @@ import { useRef as p } from "react";
15
15
  import { Box as m, Chip as h, Link as g, Paper as _, Stack as v, Typography as y, styled as b } from "@mui/material";
16
16
  import { jsx as x, jsxs as S } from "react/jsx-runtime";
17
17
  import { EntityType as C } from "@sage-bionetworks/synapse-client";
18
- import { ArticleOutlined as w, DashboardTwoTone as T, InfoOutline as E, Update as D } from "@mui/icons-material";
19
- import O from "dayjs";
20
- import { useInView as k } from "react-intersection-observer";
18
+ import w from "dayjs";
19
+ import T from "@mui/icons-material/ArticleOutlined";
20
+ import E from "@mui/icons-material/DashboardTwoTone";
21
+ import { useInView as D } from "react-intersection-observer";
22
+ import O from "@mui/icons-material/InfoOutline";
23
+ import k from "@mui/icons-material/Update";
21
24
  //#region src/components/SynapseSearchPageResults/SynapseSearchResultsCard.tsx
22
25
  var A = b(_, { label: "SynapseSearchResultsCardContainer" })({
23
26
  display: "flex",
@@ -29,7 +32,7 @@ var A = b(_, { label: "SynapseSearchResultsCardContainer" })({
29
32
  gap: "15px"
30
33
  });
31
34
  function j(_) {
32
- let b = p(null), { ref: j, inView: M } = k({
35
+ let b = p(null), { ref: j, inView: M } = D({
33
36
  triggerOnce: !0,
34
37
  rootMargin: "250px 0px"
35
38
  }), { data: N } = r(_.entityId, void 0, { includeFileHandles: !0 }, { enabled: _.entityType === C.file && M }), P = N?.fileHandles.find((e) => e.isPreview !== !0), F = P?.contentSize ? n(P?.contentSize) : "", I = _.description ? i(_.description) : "";
@@ -103,18 +106,18 @@ function j(_) {
103
106
  children: [
104
107
  /* @__PURE__ */ S(m, {
105
108
  sx: { display: "flex" },
106
- children: [/* @__PURE__ */ x(D, { className: f.cardMetadataIcon }), /* @__PURE__ */ S(y, {
109
+ children: [/* @__PURE__ */ x(k, { className: f.cardMetadataIcon }), /* @__PURE__ */ S(y, {
107
110
  className: f.cardMetadataTypographyWithIcon,
108
111
  children: [
109
112
  "Last updated:",
110
113
  " ",
111
- a(O.unix(_.modifiedOn), "M/D/YYYY")
114
+ a(w.unix(_.modifiedOn), "M/D/YYYY")
112
115
  ]
113
116
  })]
114
117
  }),
115
118
  I && /* @__PURE__ */ S(m, {
116
119
  sx: { display: "flex" },
117
- children: [/* @__PURE__ */ x(w, { className: f.cardMetadataIcon }), /* @__PURE__ */ x(u, {
120
+ children: [/* @__PURE__ */ x(T, { className: f.cardMetadataIcon }), /* @__PURE__ */ x(u, {
118
121
  className: `${f.cardMetadataTypographyWithIcon} ${f.cardDescription}`,
119
122
  text: I,
120
123
  searchTerms: _.searchTerms ?? []
@@ -122,7 +125,7 @@ function j(_) {
122
125
  }),
123
126
  F && /* @__PURE__ */ S(m, {
124
127
  sx: { display: "flex" },
125
- children: [/* @__PURE__ */ x(E, { className: f.cardMetadataIcon }), /* @__PURE__ */ S(y, {
128
+ children: [/* @__PURE__ */ x(O, { className: f.cardMetadataIcon }), /* @__PURE__ */ S(y, {
126
129
  className: f.cardMetadataTypographyWithIcon,
127
130
  children: ["File size: ", /* @__PURE__ */ x("b", { children: F })]
128
131
  })]
@@ -138,7 +141,7 @@ function j(_) {
138
141
  className: f.cardMetadataTypographyWithIcon,
139
142
  children: ["Located in:", " "]
140
143
  }),
141
- /* @__PURE__ */ x(T, {
144
+ /* @__PURE__ */ x(E, {
142
145
  className: f.cardMetadataIcon,
143
146
  sx: { marginRight: "4px" }
144
147
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseSearchResultsCard.js","names":[],"sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchResultsCard.tsx"],"sourcesContent":["import { useGetEntityBundle } from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n ArticleOutlined,\n DashboardTwoTone,\n InfoOutline,\n Update as UpdateIcon,\n} from '@mui/icons-material'\nimport {\n Box,\n Chip,\n Link,\n Paper,\n PaperProps,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport dayjs from 'dayjs'\nimport { useRef } from 'react'\nimport { useInView } from 'react-intersection-observer'\nimport { EntityDownloadButton } from '../EntityDownloadButton/EntityDownloadButton'\nimport { FileHandleWithPreview } from '../EntityFinder/details/view/table/TableCellTypes'\nimport { EntityTypeIcon } from '../EntityIcon'\nimport FavoriteButton from '../favorites/FavoriteButton'\nimport { markdownToPlainText } from '../Markdown/MarkdownUtils'\nimport { searchResultsCardChipStyles } from './chipStyles'\nimport HasAccessChip from './HasAccessChip'\nimport { HighlightedTypography } from './HighlightedTypography'\nimport styles from './SynapseSearchResultsCard.module.scss'\n\nexport type SynapseSearchResultsCardProps = {\n entityId: string\n name: string\n description?: string\n entityType: EntityType\n modifiedOn: number\n locatedIn?: { name: string; id: string }\n searchTerms?: string[]\n}\n\nconst SynapseSearchResultsCardContainer: StyledComponent<PaperProps> = styled(\n Paper,\n {\n label: 'SynapseSearchResultsCardContainer',\n },\n)({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '250px',\n width: '100%',\n borderRadius: '10px',\n padding: '32px',\n gap: '15px',\n})\n\nexport function SynapseSearchResultsCard(props: SynapseSearchResultsCardProps) {\n const downloadConfirmationRef = useRef<HTMLDivElement>(null)\n\n const { ref, inView } = useInView({\n triggerOnce: true,\n rootMargin: '250px 0px',\n })\n\n const { data: entityBundle } = useGetEntityBundle(\n props.entityId,\n undefined,\n { includeFileHandles: true },\n { enabled: props.entityType === EntityType.file && inView },\n )\n\n const file = entityBundle?.fileHandles.find(\n (file: FileHandleWithPreview) => file.isPreview !== true,\n )\n\n const friendlySize = file?.contentSize\n ? calculateFriendlyFileSize(file?.contentSize)\n : ''\n\n const plainDescription = props.description\n ? markdownToPlainText(props.description)\n : ''\n\n return (\n <SynapseSearchResultsCardContainer ref={ref}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${props.entityId}`}\n sx={{\n textDecoration: 'underline 2px',\n textUnderlineOffset: '9px',\n }}\n >\n <HighlightedTypography\n className={styles.cardTitle}\n variant=\"headline3\"\n text={props.name}\n searchTerms={props.searchTerms ?? []}\n />\n </Link>\n\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n alignItems: 'center',\n }}\n >\n <FavoriteButton entityId={props.entityId} />\n <EntityDownloadButton\n entityId={props.entityId}\n name={props.name}\n entityType={props.entityType}\n downloadConfirmationContainer={downloadConfirmationRef}\n />\n </Box>\n </Box>\n {/* Portal target for EntityDownloadButton's download confirmation dialog */}\n <div ref={downloadConfirmationRef} />\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n }}\n >\n <Chip\n icon={\n <EntityTypeIcon\n type={props.entityType}\n wrap={false}\n sx={{ color: '#265149', width: '18px' }}\n />\n }\n label={props.entityType}\n sx={{ ...searchResultsCardChipStyles }}\n />\n <HasAccessChip entityId={props.entityId} />\n </Box>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n gap: '8px',\n }}\n >\n <Stack sx={{ gap: '20px', minWidth: 0, width: '100%' }}>\n <Box sx={{ display: 'flex' }}>\n <UpdateIcon className={styles.cardMetadataIcon} />\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n Last updated:{' '}\n {formatDate(dayjs.unix(props.modifiedOn), 'M/D/YYYY')}\n </Typography>\n </Box>\n {plainDescription && (\n <Box sx={{ display: 'flex' }}>\n <ArticleOutlined className={styles.cardMetadataIcon} />\n <HighlightedTypography\n className={`${styles.cardMetadataTypographyWithIcon} ${styles.cardDescription}`}\n text={plainDescription}\n searchTerms={props.searchTerms ?? []}\n />\n </Box>\n )}\n\n {friendlySize && (\n <Box sx={{ display: 'flex' }}>\n <InfoOutline className={styles.cardMetadataIcon} />\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n File size: <b>{friendlySize}</b>\n </Typography>\n </Box>\n )}\n {props.locatedIn && (\n <Box\n sx={{ display: 'flex', marginLeft: '24px', alignItems: 'center' }}\n >\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n Located in:{' '}\n </Typography>\n <DashboardTwoTone\n className={styles.cardMetadataIcon}\n sx={{\n marginRight: '4px',\n }}\n />\n <Link\n className={styles.locatedInLink}\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${props.locatedIn?.id}`}\n >\n {props.locatedIn?.name}\n </Link>\n </Box>\n )}\n </Stack>\n </Box>\n </SynapseSearchResultsCardContainer>\n )\n}\n\nexport default SynapseSearchResultsCard\n"],"mappings":"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"}
1
+ {"version":3,"file":"SynapseSearchResultsCard.js","names":[],"sources":["../../../src/components/SynapseSearchPageResults/SynapseSearchResultsCard.tsx"],"sourcesContent":["import { useGetEntityBundle } from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { StyledComponent } from '@emotion/styled'\nimport ArticleOutlined from '@mui/icons-material/ArticleOutlined'\nimport DashboardTwoTone from '@mui/icons-material/DashboardTwoTone'\nimport InfoOutline from '@mui/icons-material/InfoOutline'\nimport UpdateIcon from '@mui/icons-material/Update'\nimport {\n Box,\n Chip,\n Link,\n Paper,\n PaperProps,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport dayjs from 'dayjs'\nimport { useRef } from 'react'\nimport { useInView } from 'react-intersection-observer'\nimport { EntityDownloadButton } from '../EntityDownloadButton/EntityDownloadButton'\nimport { FileHandleWithPreview } from '../EntityFinder/details/view/table/TableCellTypes'\nimport { EntityTypeIcon } from '../EntityIcon'\nimport FavoriteButton from '../favorites/FavoriteButton'\nimport { markdownToPlainText } from '../Markdown/MarkdownUtils'\nimport { searchResultsCardChipStyles } from './chipStyles'\nimport HasAccessChip from './HasAccessChip'\nimport { HighlightedTypography } from './HighlightedTypography'\nimport styles from './SynapseSearchResultsCard.module.scss'\n\nexport type SynapseSearchResultsCardProps = {\n entityId: string\n name: string\n description?: string\n entityType: EntityType\n modifiedOn: number\n locatedIn?: { name: string; id: string }\n searchTerms?: string[]\n}\n\nconst SynapseSearchResultsCardContainer: StyledComponent<PaperProps> = styled(\n Paper,\n {\n label: 'SynapseSearchResultsCardContainer',\n },\n)({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '250px',\n width: '100%',\n borderRadius: '10px',\n padding: '32px',\n gap: '15px',\n})\n\nexport function SynapseSearchResultsCard(props: SynapseSearchResultsCardProps) {\n const downloadConfirmationRef = useRef<HTMLDivElement>(null)\n\n const { ref, inView } = useInView({\n triggerOnce: true,\n rootMargin: '250px 0px',\n })\n\n const { data: entityBundle } = useGetEntityBundle(\n props.entityId,\n undefined,\n { includeFileHandles: true },\n { enabled: props.entityType === EntityType.file && inView },\n )\n\n const file = entityBundle?.fileHandles.find(\n (file: FileHandleWithPreview) => file.isPreview !== true,\n )\n\n const friendlySize = file?.contentSize\n ? calculateFriendlyFileSize(file?.contentSize)\n : ''\n\n const plainDescription = props.description\n ? markdownToPlainText(props.description)\n : ''\n\n return (\n <SynapseSearchResultsCardContainer ref={ref}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${props.entityId}`}\n sx={{\n textDecoration: 'underline 2px',\n textUnderlineOffset: '9px',\n }}\n >\n <HighlightedTypography\n className={styles.cardTitle}\n variant=\"headline3\"\n text={props.name}\n searchTerms={props.searchTerms ?? []}\n />\n </Link>\n\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n alignItems: 'center',\n }}\n >\n <FavoriteButton entityId={props.entityId} />\n <EntityDownloadButton\n entityId={props.entityId}\n name={props.name}\n entityType={props.entityType}\n downloadConfirmationContainer={downloadConfirmationRef}\n />\n </Box>\n </Box>\n {/* Portal target for EntityDownloadButton's download confirmation dialog */}\n <div ref={downloadConfirmationRef} />\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n }}\n >\n <Chip\n icon={\n <EntityTypeIcon\n type={props.entityType}\n wrap={false}\n sx={{ color: '#265149', width: '18px' }}\n />\n }\n label={props.entityType}\n sx={{ ...searchResultsCardChipStyles }}\n />\n <HasAccessChip entityId={props.entityId} />\n </Box>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n gap: '8px',\n }}\n >\n <Stack sx={{ gap: '20px', minWidth: 0, width: '100%' }}>\n <Box sx={{ display: 'flex' }}>\n <UpdateIcon className={styles.cardMetadataIcon} />\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n Last updated:{' '}\n {formatDate(dayjs.unix(props.modifiedOn), 'M/D/YYYY')}\n </Typography>\n </Box>\n {plainDescription && (\n <Box sx={{ display: 'flex' }}>\n <ArticleOutlined className={styles.cardMetadataIcon} />\n <HighlightedTypography\n className={`${styles.cardMetadataTypographyWithIcon} ${styles.cardDescription}`}\n text={plainDescription}\n searchTerms={props.searchTerms ?? []}\n />\n </Box>\n )}\n\n {friendlySize && (\n <Box sx={{ display: 'flex' }}>\n <InfoOutline className={styles.cardMetadataIcon} />\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n File size: <b>{friendlySize}</b>\n </Typography>\n </Box>\n )}\n {props.locatedIn && (\n <Box\n sx={{ display: 'flex', marginLeft: '24px', alignItems: 'center' }}\n >\n <Typography className={styles.cardMetadataTypographyWithIcon}>\n Located in:{' '}\n </Typography>\n <DashboardTwoTone\n className={styles.cardMetadataIcon}\n sx={{\n marginRight: '4px',\n }}\n />\n <Link\n className={styles.locatedInLink}\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${props.locatedIn?.id}`}\n >\n {props.locatedIn?.name}\n </Link>\n </Box>\n )}\n </Stack>\n </Box>\n </SynapseSearchResultsCardContainer>\n )\n}\n\nexport default SynapseSearchResultsCard\n"],"mappings":"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"}
@@ -19,12 +19,12 @@ import { useState as p } from "react";
19
19
  import { Box as m, Button as h } from "@mui/material";
20
20
  import { toast as g } from "react-hot-toast";
21
21
  import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
22
- import { GetAppTwoTone as b } from "@mui/icons-material";
23
- import { useAtom as x } from "jotai";
22
+ import { useAtom as b } from "jotai";
23
+ import x from "@mui/icons-material/GetAppTwoTone";
24
24
  //#region src/components/SynapseTable/RowSelection/RowSelectionControls.tsx
25
25
  var S = "SendToAnalysisPlatformRowSelectionControlButton";
26
26
  function C(C) {
27
- let { customControls: w = [], remount: T } = C, { isAuthenticated: E } = e(), [D, O] = p(!1), { entityId: k, versionNumber: A, getCurrentQueryRequest: j } = a(), { data: M } = t(k, A), { data: N } = o(), [P, F] = x(c), I = u(), { setIsShowingExportToAnalysisPlatformModal: L, enabledExternalAnalysisPlatforms: R } = s(), z = R.length > 0, B = () => {
27
+ let { customControls: w = [], remount: T } = C, { isAuthenticated: E } = e(), [D, O] = p(!1), { entityId: k, versionNumber: A, getCurrentQueryRequest: j } = a(), { data: M } = t(k, A), { data: N } = o(), [P, F] = b(c), I = u(), { setIsShowingExportToAnalysisPlatformModal: L, enabledExternalAnalysisPlatforms: R } = s(), z = R.length > 0, B = () => {
28
28
  F([]), T && T();
29
29
  }, V = n(M, r(N?.columnModels));
30
30
  return /* @__PURE__ */ v(f, {
@@ -69,7 +69,7 @@ function C(C) {
69
69
  })
70
70
  }), { duration: Infinity });
71
71
  },
72
- startIcon: /* @__PURE__ */ v(b, {}),
72
+ startIcon: /* @__PURE__ */ v(x, {}),
73
73
  children: "Add to Download List"
74
74
  })
75
75
  ] })
@@ -1 +1 @@
1
- {"version":3,"file":"RowSelectionControls.js","names":[],"sources":["../../../../src/components/SynapseTable/RowSelection/RowSelectionControls.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { useGetEntity } from '@/synapse-queries'\nimport { canTableQueryBeAddedToDownloadList } from '@/utils/functions/queryUtils'\nimport { GetAppTwoTone } from '@mui/icons-material'\nimport { Box, Button } from '@mui/material'\nimport { Table } from '@sage-bionetworks/synapse-types'\nimport { useAtom } from 'jotai'\nimport { useState } from 'react'\nimport { toast } from 'react-hot-toast'\nimport { useSynapseContext } from '@/utils'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { selectedRowsAtom } from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport {\n getFileColumnModelId,\n SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE,\n} from '../SynapseTableUtils'\nimport { CustomControlButton } from '../CustomControls/CustomControlButton'\nimport { CustomControl } from '../TopLevelControls/TopLevelControls'\nimport { RowSelectionUI } from './RowSelectionUI'\nimport { SignInRequiredModal } from '@/components/SignInRequiredModal/SignInRequiredModal'\n\nconst SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID =\n 'SendToAnalysisPlatformRowSelectionControlButton'\n\nexport type RowSelectionControlsProps = {\n customControls?: CustomControl[]\n remount?: () => void\n}\n\n/**\n * This component is responsible for rendering the RowSelectionUI and the custom controls. Must be wrapped in a\n * QueryContext and a QueryVisualizationContext.\n * @param props\n * @constructor\n */\nexport function RowSelectionControls(props: RowSelectionControlsProps) {\n const { customControls = [], remount } = props\n const { isAuthenticated } = useSynapseContext()\n const [showLoginModal, setShowLoginModal] = useState(false)\n const { entityId, versionNumber, getCurrentQueryRequest } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n const [selectedRows, setSelectedRows] = useAtom(selectedRowsAtom)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n const {\n setIsShowingExportToAnalysisPlatformModal,\n enabledExternalAnalysisPlatforms,\n } = useQueryVisualizationContext()\n\n const showExportToAnalysisPlatformButton =\n enabledExternalAnalysisPlatforms.length > 0\n\n const refresh = () => {\n // clear selection\n setSelectedRows([])\n if (remount) {\n remount()\n }\n }\n const fileColumnId = getFileColumnModelId(queryMetadata?.columnModels)\n const showAddToDownloadCart = canTableQueryBeAddedToDownloadList(\n entity,\n fileColumnId,\n )\n\n return (\n <RowSelectionUI\n show={selectedRows.length > 0}\n selectedRowCount={selectedRows.length}\n onClearSelection={() => setSelectedRows([])}\n customControls={\n <>\n {customControls.map(customControl => {\n return (\n <CustomControlButton\n key={customControl.buttonText}\n variant=\"contained\"\n callbackData={{\n tableId: entityId!,\n queryMetadata: queryMetadata,\n selectedRows,\n refresh,\n request: getCurrentQueryRequest(),\n }}\n control={customControl}\n startIcon={customControl.icon}\n />\n )\n })}\n {/* TODO: Generic button */}\n {showExportToAnalysisPlatformButton && (\n <Button\n variant=\"outlined\"\n onClick={() => {\n if (isAuthenticated) {\n setIsShowingExportToAnalysisPlatformModal(true)\n } else {\n setShowLoginModal(true)\n }\n }}\n id={SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID}\n >\n Send to Analysis Platform\n </Button>\n )}\n {showLoginModal && (\n <SignInRequiredModal\n onHide={() => setShowLoginModal(false)}\n content={SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE}\n />\n )}\n {showAddToDownloadCart && (\n <Button\n variant=\"contained\"\n onClick={() => {\n const toastId = toast.custom(\n <Box\n sx={{\n width: '100%',\n }}\n >\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() => {\n toast.dismiss(toastId)\n }}\n />\n </Box>,\n {\n duration: Infinity,\n },\n )\n }}\n startIcon={<GetAppTwoTone />}\n >\n Add to Download List\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,IACJ;AAaF,SAAgB,EAAqB,GAAkC;CACrE,IAAM,EAAE,oBAAiB,CAAC,GAAG,eAAY,GACnC,EAAE,uBAAoB,EAAkB,GACxC,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,EAAE,aAAU,kBAAe,8BAA2B,EAAgB,GACtE,EAAE,MAAM,MAAW,EAAoB,GAAU,CAAa,GAC9D,EAAE,MAAM,MAAkB,EAAoB,GAC9C,CAAC,GAAc,KAAmB,EAAQ,CAAgB,GAE1D,IACJ,EAA8C,GAE1C,EACJ,8CACA,wCACE,EAA6B,GAE3B,IACJ,EAAiC,SAAS,GAEtC,UAAgB;EAGpB,AADA,EAAgB,CAAC,CAAC,GACd,KACF,EAAQ;CAEZ,GAEM,IAAwB,EAC5B,GAFmB,EAAqB,GAAe,YAGvD,CACF;CAEA,OACE,kBAAC,GAAD;EACE,MAAM,EAAa,SAAS;EAC5B,kBAAkB,EAAa;EAC/B,wBAAwB,EAAgB,CAAC,CAAC;EAC1C,gBACE,kBAAA,GAAA,EAAA,UAAA;GACG,EAAe,KAAI,MAEhB,kBAAC,GAAD;IAEE,SAAQ;IACR,cAAc;KACZ,SAAS;KACM;KACf;KACA;KACA,SAAS,EAAuB;IAClC;IACA,SAAS;IACT,WAAW,EAAc;GAC1B,GAXM,EAAc,UAWpB,CAEJ;GAEA,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe;KACb,AAAI,IACF,EAA0C,EAAI,IAE9C,EAAkB,EAAI;IAE1B;IACA,IAAI;cACL;GAEO,CAAA;GAET,KACC,kBAAC,GAAD;IACE,cAAc,EAAkB,EAAK;IACrC,SAAA;GACD,CAAA;GAEF,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe;KACb,IAAM,IAAU,EAAM,OACpB,kBAAC,GAAD;MACE,IAAI,EACF,OAAO,OACT;gBAEA,kBAAC,GAAD;OAC4B;OAC1B,eAAe;QACb,EAAM,QAAQ,CAAO;OACvB;MACD,CAAA;KACE,CAAA,GACL,EACE,UAAU,SACZ,CACF;IACF;IACA,WAAW,kBAAC,GAAD,CAAgB,CAAA;cAC5B;GAEO,CAAA;EAEV,EAAA,CAAA;CAEL,CAAA;AAEL"}
1
+ {"version":3,"file":"RowSelectionControls.js","names":[],"sources":["../../../../src/components/SynapseTable/RowSelection/RowSelectionControls.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { useGetEntity } from '@/synapse-queries'\nimport { canTableQueryBeAddedToDownloadList } from '@/utils/functions/queryUtils'\nimport GetAppTwoTone from '@mui/icons-material/GetAppTwoTone'\nimport { Box, Button } from '@mui/material'\nimport { Table } from '@sage-bionetworks/synapse-types'\nimport { useAtom } from 'jotai'\nimport { useState } from 'react'\nimport { toast } from 'react-hot-toast'\nimport { useSynapseContext } from '@/utils'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { selectedRowsAtom } from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport {\n getFileColumnModelId,\n SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE,\n} from '../SynapseTableUtils'\nimport { CustomControlButton } from '../CustomControls/CustomControlButton'\nimport { CustomControl } from '../TopLevelControls/TopLevelControls'\nimport { RowSelectionUI } from './RowSelectionUI'\nimport { SignInRequiredModal } from '@/components/SignInRequiredModal/SignInRequiredModal'\n\nconst SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID =\n 'SendToAnalysisPlatformRowSelectionControlButton'\n\nexport type RowSelectionControlsProps = {\n customControls?: CustomControl[]\n remount?: () => void\n}\n\n/**\n * This component is responsible for rendering the RowSelectionUI and the custom controls. Must be wrapped in a\n * QueryContext and a QueryVisualizationContext.\n * @param props\n * @constructor\n */\nexport function RowSelectionControls(props: RowSelectionControlsProps) {\n const { customControls = [], remount } = props\n const { isAuthenticated } = useSynapseContext()\n const [showLoginModal, setShowLoginModal] = useState(false)\n const { entityId, versionNumber, getCurrentQueryRequest } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n const [selectedRows, setSelectedRows] = useAtom(selectedRowsAtom)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n const {\n setIsShowingExportToAnalysisPlatformModal,\n enabledExternalAnalysisPlatforms,\n } = useQueryVisualizationContext()\n\n const showExportToAnalysisPlatformButton =\n enabledExternalAnalysisPlatforms.length > 0\n\n const refresh = () => {\n // clear selection\n setSelectedRows([])\n if (remount) {\n remount()\n }\n }\n const fileColumnId = getFileColumnModelId(queryMetadata?.columnModels)\n const showAddToDownloadCart = canTableQueryBeAddedToDownloadList(\n entity,\n fileColumnId,\n )\n\n return (\n <RowSelectionUI\n show={selectedRows.length > 0}\n selectedRowCount={selectedRows.length}\n onClearSelection={() => setSelectedRows([])}\n customControls={\n <>\n {customControls.map(customControl => {\n return (\n <CustomControlButton\n key={customControl.buttonText}\n variant=\"contained\"\n callbackData={{\n tableId: entityId!,\n queryMetadata: queryMetadata,\n selectedRows,\n refresh,\n request: getCurrentQueryRequest(),\n }}\n control={customControl}\n startIcon={customControl.icon}\n />\n )\n })}\n {/* TODO: Generic button */}\n {showExportToAnalysisPlatformButton && (\n <Button\n variant=\"outlined\"\n onClick={() => {\n if (isAuthenticated) {\n setIsShowingExportToAnalysisPlatformModal(true)\n } else {\n setShowLoginModal(true)\n }\n }}\n id={SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID}\n >\n Send to Analysis Platform\n </Button>\n )}\n {showLoginModal && (\n <SignInRequiredModal\n onHide={() => setShowLoginModal(false)}\n content={SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE}\n />\n )}\n {showAddToDownloadCart && (\n <Button\n variant=\"contained\"\n onClick={() => {\n const toastId = toast.custom(\n <Box\n sx={{\n width: '100%',\n }}\n >\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() => {\n toast.dismiss(toastId)\n }}\n />\n </Box>,\n {\n duration: Infinity,\n },\n )\n }}\n startIcon={<GetAppTwoTone />}\n >\n Add to Download List\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,IACJ;AAaF,SAAgB,EAAqB,GAAkC;CACrE,IAAM,EAAE,oBAAiB,CAAC,GAAG,eAAY,GACnC,EAAE,uBAAoB,EAAkB,GACxC,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,EAAE,aAAU,kBAAe,8BAA2B,EAAgB,GACtE,EAAE,MAAM,MAAW,EAAoB,GAAU,CAAa,GAC9D,EAAE,MAAM,MAAkB,EAAoB,GAC9C,CAAC,GAAc,KAAmB,EAAQ,CAAgB,GAE1D,IACJ,EAA8C,GAE1C,EACJ,8CACA,wCACE,EAA6B,GAE3B,IACJ,EAAiC,SAAS,GAEtC,UAAgB;EAGpB,AADA,EAAgB,CAAC,CAAC,GACd,KACF,EAAQ;CAEZ,GAEM,IAAwB,EAC5B,GAFmB,EAAqB,GAAe,YAGvD,CACF;CAEA,OACE,kBAAC,GAAD;EACE,MAAM,EAAa,SAAS;EAC5B,kBAAkB,EAAa;EAC/B,wBAAwB,EAAgB,CAAC,CAAC;EAC1C,gBACE,kBAAA,GAAA,EAAA,UAAA;GACG,EAAe,KAAI,MAEhB,kBAAC,GAAD;IAEE,SAAQ;IACR,cAAc;KACZ,SAAS;KACM;KACf;KACA;KACA,SAAS,EAAuB;IAClC;IACA,SAAS;IACT,WAAW,EAAc;GAC1B,GAXM,EAAc,UAWpB,CAEJ;GAEA,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe;KACb,AAAI,IACF,EAA0C,EAAI,IAE9C,EAAkB,EAAI;IAE1B;IACA,IAAI;cACL;GAEO,CAAA;GAET,KACC,kBAAC,GAAD;IACE,cAAc,EAAkB,EAAK;IACrC,SAAA;GACD,CAAA;GAEF,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe;KACb,IAAM,IAAU,EAAM,OACpB,kBAAC,GAAD;MACE,IAAI,EACF,OAAO,OACT;gBAEA,kBAAC,GAAD;OAC4B;OAC1B,eAAe;QACb,EAAM,QAAQ,CAAO;OACvB;MACD,CAAA;KACE,CAAA,GACL,EACE,UAAU,SACZ,CACF;IACF;IACA,WAAW,kBAAC,GAAD,CAAgB,CAAA;cAC5B;GAEO,CAAA;EAEV,EAAA,CAAA;CAEL,CAAA;AAEL"}