synapse-react-client 4.0.36 → 4.0.37

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 (316) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/index.js +11 -11
  3. package/dist/aridhia-queries/useAridhiaQuery.d.ts +1 -0
  4. package/dist/aridhia-queries/useAridhiaQuery.d.ts.map +1 -1
  5. package/dist/aridhia-queries/useAridhiaQuery.js +24 -17
  6. package/dist/aridhia-queries/useAridhiaQuery.js.map +1 -1
  7. package/dist/assets/icons/emailWithNotification.js +15 -15
  8. package/dist/assets/icons/emailWithNotification.js.map +1 -1
  9. package/dist/assets/icons/emailWithNotification.svg +13 -13
  10. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
  11. package/dist/components/AccessRequirementList/AccessRequirementList.js +124 -117
  12. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  13. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
  14. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +1 -1
  15. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
  17. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +1 -1
  18. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
  19. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +33 -32
  21. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
  22. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  23. package/dist/components/Aridhia/AridhiaAccessStatus.js +39 -18
  24. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  25. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.d.ts +32 -0
  26. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.d.ts.map +1 -0
  27. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js +285 -0
  28. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js.map +1 -0
  29. package/dist/components/Aridhia/DarWizard/DarAboutStep.d.ts +4 -0
  30. package/dist/components/Aridhia/DarWizard/DarAboutStep.d.ts.map +1 -0
  31. package/dist/components/Aridhia/DarWizard/DarAboutStep.js +17 -0
  32. package/dist/components/Aridhia/DarWizard/DarAboutStep.js.map +1 -0
  33. package/dist/components/Aridhia/DarWizard/DarCompleteStep.d.ts +27 -0
  34. package/dist/components/Aridhia/DarWizard/DarCompleteStep.d.ts.map +1 -0
  35. package/dist/components/Aridhia/DarWizard/DarCompleteStep.js +96 -0
  36. package/dist/components/Aridhia/DarWizard/DarCompleteStep.js.map +1 -0
  37. package/dist/components/Aridhia/DarWizard/DarDestinationStep.d.ts +28 -0
  38. package/dist/components/Aridhia/DarWizard/DarDestinationStep.d.ts.map +1 -0
  39. package/dist/components/Aridhia/DarWizard/DarDestinationStep.js +128 -0
  40. package/dist/components/Aridhia/DarWizard/DarDestinationStep.js.map +1 -0
  41. package/dist/components/Aridhia/DarWizard/DarProjectStep.d.ts +4 -0
  42. package/dist/components/Aridhia/DarWizard/DarProjectStep.d.ts.map +1 -0
  43. package/dist/components/Aridhia/DarWizard/DarProjectStep.js +17 -0
  44. package/dist/components/Aridhia/DarWizard/DarProjectStep.js.map +1 -0
  45. package/dist/components/Aridhia/DarWizard/DarSectionForm.d.ts +13 -0
  46. package/dist/components/Aridhia/DarWizard/DarSectionForm.d.ts.map +1 -0
  47. package/dist/components/Aridhia/DarWizard/DarSectionForm.js +23 -0
  48. package/dist/components/Aridhia/DarWizard/DarSectionForm.js.map +1 -0
  49. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts +11 -0
  50. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts.map +1 -0
  51. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +47 -0
  52. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -0
  53. package/dist/components/Aridhia/DarWizard/DarWorkspaceStep.d.ts +16 -0
  54. package/dist/components/Aridhia/DarWizard/DarWorkspaceStep.d.ts.map +1 -0
  55. package/dist/components/Aridhia/DarWizard/DarWorkspaceStep.js +33 -0
  56. package/dist/components/Aridhia/DarWizard/DarWorkspaceStep.js.map +1 -0
  57. package/dist/components/Aridhia/DarWizard/useDarDraft.d.ts +32 -0
  58. package/dist/components/Aridhia/DarWizard/useDarDraft.d.ts.map +1 -0
  59. package/dist/components/Aridhia/DarWizard/useDarDraft.js +44 -0
  60. package/dist/components/Aridhia/DarWizard/useDarDraft.js.map +1 -0
  61. package/dist/components/Aridhia/FairLabelField.d.ts +8 -0
  62. package/dist/components/Aridhia/FairLabelField.d.ts.map +1 -0
  63. package/dist/components/Aridhia/FairLabelField.js +13 -0
  64. package/dist/components/Aridhia/FairLabelField.js.map +1 -0
  65. package/dist/components/Aridhia/fairFormToRjsf.d.ts +36 -0
  66. package/dist/components/Aridhia/fairFormToRjsf.d.ts.map +1 -0
  67. package/dist/components/Aridhia/fairFormToRjsf.js +137 -0
  68. package/dist/components/Aridhia/fairFormToRjsf.js.map +1 -0
  69. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.d.ts.map +1 -1
  70. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +2 -2
  71. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
  72. package/dist/components/CardContainer/CardContainer.d.ts.map +1 -1
  73. package/dist/components/CardContainer/CardContainer.js +1 -1
  74. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  75. package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
  76. package/dist/components/ChallengeSubmission/ChallengeSubmission.js +2 -2
  77. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  78. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.d.ts.map +1 -1
  79. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js +3 -3
  80. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  81. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +1 -1
  82. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  83. package/dist/components/CreateTableViewWizard/CreateTableViewWizard.js +2 -2
  84. package/dist/components/CreateTableViewWizard/CreateTableViewWizard.js.map +1 -1
  85. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  86. package/dist/components/DataGrid/SynapseGrid.js +121 -117
  87. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  88. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts +21 -1
  89. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts.map +1 -1
  90. package/dist/components/DataGrid/columns/DateTimeColumn.js +73 -29
  91. package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
  92. package/dist/components/DataGrid/columns/NumberColumn.d.ts +31 -0
  93. package/dist/components/DataGrid/columns/NumberColumn.d.ts.map +1 -0
  94. package/dist/components/DataGrid/columns/NumberColumn.js +27 -0
  95. package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -0
  96. package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts +1 -0
  97. package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts.map +1 -1
  98. package/dist/components/DataGrid/components/ReorderColumnsButton.js +17 -16
  99. package/dist/components/DataGrid/components/ReorderColumnsButton.js.map +1 -1
  100. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts +2 -0
  101. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
  102. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +104 -65
  103. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
  104. package/dist/components/DataGrid/useDataGridWebsocket.js +1 -1
  105. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  106. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  107. package/dist/components/DataGrid/utils/columnFactory.js +55 -51
  108. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  109. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.d.ts.map +1 -1
  110. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js +9 -8
  111. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js.map +1 -1
  112. package/dist/components/DatasetHosting/DatasetDownloadButton.d.ts +10 -5
  113. package/dist/components/DatasetHosting/DatasetDownloadButton.d.ts.map +1 -1
  114. package/dist/components/DatasetHosting/DatasetDownloadButton.js +66 -74
  115. package/dist/components/DatasetHosting/DatasetDownloadButton.js.map +1 -1
  116. package/dist/components/DatasetHosting/DatasetHosting.d.ts +6 -0
  117. package/dist/components/DatasetHosting/DatasetHosting.d.ts.map +1 -1
  118. package/dist/components/DatasetHosting/DatasetHosting.js +6 -0
  119. package/dist/components/DatasetHosting/DatasetHosting.js.map +1 -1
  120. package/dist/components/DatasetHosting/DatasetHostingAdornment.d.ts +15 -0
  121. package/dist/components/DatasetHosting/DatasetHostingAdornment.d.ts.map +1 -0
  122. package/dist/components/DatasetHosting/DatasetHostingAdornment.js +23 -0
  123. package/dist/components/DatasetHosting/DatasetHostingAdornment.js.map +1 -0
  124. package/dist/components/DatasetHosting/index.d.ts +2 -0
  125. package/dist/components/DatasetHosting/index.d.ts.map +1 -1
  126. package/dist/components/DatasetHosting/index.js +2 -1
  127. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  128. package/dist/components/DownloadCart/DownloadCartPage.js +1 -1
  129. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  130. package/dist/components/DropdownSelect/DropdownSelect.d.ts.map +1 -1
  131. package/dist/components/DropdownSelect/DropdownSelect.js +1 -1
  132. package/dist/components/DropdownSelect/DropdownSelect.js.map +1 -1
  133. package/dist/components/EntityFinder/tree/EntityTree.d.ts.map +1 -1
  134. package/dist/components/EntityFinder/tree/EntityTree.js +1 -1
  135. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  136. package/dist/components/EntityFinder/tree/VirtualizedTree.js +1 -1
  137. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  138. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +1 -1
  139. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  140. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  141. package/dist/components/GenericCard/TableRowGenericCard.js +176 -170
  142. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  143. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts +9 -0
  144. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts.map +1 -1
  145. package/dist/components/JsonSchemaForm/JsonSchemaForm.d.ts.map +1 -1
  146. package/dist/components/JsonSchemaForm/JsonSchemaForm.js +2 -1
  147. package/dist/components/JsonSchemaForm/JsonSchemaForm.js.map +1 -1
  148. package/dist/components/JsonSchemaForm/templates/ArrayFieldTemplate.d.ts.map +1 -1
  149. package/dist/components/JsonSchemaForm/templates/ArrayFieldTemplate.js +1 -1
  150. package/dist/components/JsonSchemaForm/templates/ArrayFieldTemplate.js.map +1 -1
  151. package/dist/components/JsonSchemaForm/templates/FieldTemplate.d.ts.map +1 -1
  152. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js +6 -6
  153. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  154. package/dist/components/JsonSchemaForm/widgets/DateWidget.d.ts +9 -0
  155. package/dist/components/JsonSchemaForm/widgets/DateWidget.d.ts.map +1 -0
  156. package/dist/components/JsonSchemaForm/widgets/DateWidget.js +23 -0
  157. package/dist/components/JsonSchemaForm/widgets/DateWidget.js.map +1 -0
  158. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.css +1 -1
  159. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +3 -2
  160. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
  161. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +10 -12
  162. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
  163. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.module.js +8 -7
  164. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.module.js.map +1 -1
  165. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.module.scss +12 -2
  166. package/dist/components/Markdown/MarkdownEditor.js +1 -1
  167. package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
  168. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  169. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +46 -46
  170. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  171. package/dist/components/QueryBuilder/queryBuilderTranslation.js +1 -1
  172. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  173. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +1 -1
  174. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js.map +1 -1
  175. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  176. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  177. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +27 -25
  178. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  179. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.d.ts +0 -9
  180. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.d.ts.map +1 -1
  181. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js +23 -31
  182. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  183. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.d.ts.map +1 -1
  184. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js +5 -4
  185. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js.map +1 -1
  186. package/dist/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.d.ts.map +1 -1
  187. package/dist/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.js +6 -5
  188. package/dist/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.js.map +1 -1
  189. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +2 -0
  190. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  191. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +18 -13
  192. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  193. package/dist/components/StatisticsPlot.d.ts.map +1 -1
  194. package/dist/components/StatisticsPlot.js +1 -1
  195. package/dist/components/StatisticsPlot.js.map +1 -1
  196. package/dist/components/SynapseForm/SynapseFormWrapper.js +1 -1
  197. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  198. package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
  199. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +9 -9
  200. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
  201. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +14 -0
  202. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +1 -1
  203. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  204. package/dist/components/SynapseSearchPageResults/SynapseSearchPage.js +1 -1
  205. package/dist/components/SynapseSearchPageResults/SynapseSearchPage.js.map +1 -1
  206. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  207. package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
  208. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  209. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts +4 -0
  210. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  211. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +71 -69
  212. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  213. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +4 -0
  214. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
  215. package/dist/components/SynapseTable/table-top/DownloadOptions.js +14 -13
  216. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  217. package/dist/components/SynapseTable/usePrefetchTableData.js +1 -1
  218. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  219. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js +4 -4
  220. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  221. package/dist/components/TanStackTable/TableCellRenderer.d.ts.map +1 -1
  222. package/dist/components/TanStackTable/TableCellRenderer.js +1 -1
  223. package/dist/components/TanStackTable/TableCellRenderer.js.map +1 -1
  224. package/dist/components/TermsAndConditions/TermsAndConditions.js +1 -1
  225. package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
  226. package/dist/components/Webhook/CreateWebhookModal.d.ts.map +1 -1
  227. package/dist/components/Webhook/CreateWebhookModal.js +1 -1
  228. package/dist/components/Webhook/CreateWebhookModal.js.map +1 -1
  229. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  230. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +172 -63
  231. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  232. package/dist/components/dataaccess/UserAccessRequestHistory/RouteConstants.d.ts +3 -0
  233. package/dist/components/dataaccess/UserAccessRequestHistory/RouteConstants.d.ts.map +1 -1
  234. package/dist/components/dataaccess/UserAccessRequestHistory/RouteConstants.js +2 -2
  235. package/dist/components/dataaccess/UserAccessRequestHistory/RouteConstants.js.map +1 -1
  236. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.d.ts.map +1 -1
  237. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js +10 -8
  238. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js.map +1 -1
  239. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.d.ts.map +1 -1
  240. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +74 -43
  241. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
  242. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.d.ts.map +1 -1
  243. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js +2 -2
  244. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  245. package/dist/components/doi/CreateOrUpdateDoiModal.js +5 -5
  246. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  247. package/dist/components/entity/metadata/EntityModal.js +1 -1
  248. package/dist/components/entity/metadata/EntityModal.js.map +1 -1
  249. package/dist/components/entity/page/action_menu/EntityActionMenu.js +2 -2
  250. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  251. package/dist/components/index.js +113 -112
  252. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  253. package/dist/components/menu/DropdownMenu.js +1 -1
  254. package/dist/components/menu/DropdownMenu.js.map +1 -1
  255. package/dist/components/row_renderers/Dataset.js +1 -1
  256. package/dist/components/row_renderers/Dataset.js.map +1 -1
  257. package/dist/components/styled/LeftRightPanel.d.ts +8 -0
  258. package/dist/components/styled/LeftRightPanel.d.ts.map +1 -1
  259. package/dist/components/styled/LeftRightPanel.js +10 -1
  260. package/dist/components/styled/LeftRightPanel.js.map +1 -1
  261. package/dist/components/widgets/facet-nav/FacetNavPanel.js +1 -1
  262. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  263. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  264. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +1 -1
  265. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  266. package/dist/components/widgets/query-filter/FacetFilterControls.js +1 -1
  267. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  268. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  269. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +1 -1
  270. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  271. package/dist/index.js +174 -173
  272. package/dist/index.js.map +1 -1
  273. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +73 -0
  274. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -0
  275. package/dist/mocks/msw/handlers/aridhiaHandlers.js +119 -0
  276. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -0
  277. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +1 -1
  278. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  279. package/dist/mocks/msw/handlers/entityHandlers.d.ts.map +1 -1
  280. package/dist/mocks/msw/handlers/entityHandlers.js +4 -4
  281. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  282. package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
  283. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  284. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  285. package/dist/mocks/msw/handlers.js +72 -69
  286. package/dist/mocks/msw/handlers.js.map +1 -1
  287. package/dist/style/components/_terms-and-conditions.scss +25 -3
  288. package/dist/style/main.css +1 -1
  289. package/dist/testutils/RjsfFormTestUtils.js +12 -0
  290. package/dist/testutils/RjsfFormTestUtils.js.map +1 -0
  291. package/dist/tsconfig.build.tsbuildinfo +1 -1
  292. package/dist/utils/featureflag/FeatureFlags.d.ts +1 -0
  293. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  294. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  295. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  296. package/dist/utils/functions/QueryFilterUtils.js +1 -1
  297. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  298. package/dist/utils/functions/SqlFunctions.js +1 -1
  299. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  300. package/dist/utils/functions/queryUtils.js +1 -1
  301. package/dist/utils/functions/queryUtils.js.map +1 -1
  302. package/dist/utils/hooks/useDetectSSOCode.d.ts.map +1 -1
  303. package/dist/utils/hooks/useDetectSSOCode.js +1 -1
  304. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  305. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js +1 -1
  306. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  307. package/dist/utils/jsonschema/SchemaAnnotationUtils.js +1 -1
  308. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  309. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +22 -0
  310. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -0
  311. package/dist/utils/jsonschema/collectTopLevelProperties.js +31 -0
  312. package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -0
  313. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
  314. package/dist/utils/jsonschema/getSchemaPropertyInfo.js +1 -1
  315. package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
  316. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../src/components/Markdown/MarkdownEditor.tsx"],"sourcesContent":["import {\n Box,\n IconButton,\n Tab,\n Tabs,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useRef, useState, useEffect } from 'react'\nimport {\n commandList,\n CommandListType,\n MARKDOWN_COMMANDS_DATA,\n} from '@sage-bionetworks/synapse-types'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from './MarkdownSynapse'\nimport { UserMentionModal } from './UserMentionModal'\nimport { startCase } from 'lodash-es'\n\nconst MarkdownEditorTabs = ['WRITE', 'PREVIEW'] as const\n\nexport type MarkdownEditorProps = {\n placeholder?: string\n text: string\n setText: (text: string) => void\n}\n\nexport function MarkdownEditor({\n placeholder,\n text,\n setText,\n}: MarkdownEditorProps) {\n const [currentTab, setCurrentTab] = useState<number>(0)\n const [selectionStart, setSelectionStart] = useState<number>(0)\n const [isShowingTagModal, setIsShowingTagModal] = useState<boolean>(false)\n const [tagModalWithKeyboard, setTagModalWithKeyboard] =\n useState<boolean>(false)\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n /**\n * Updates the position of the cursor. This must occur within `useEffect` because we need to ensure that the\n * cursor position is updated after the state of `text` is updated.\n */\n useEffect(() => {\n const input = textAreaRef.current\n if (input) {\n input.setSelectionRange(selectionStart, selectionStart)\n }\n }, [textAreaRef, selectionStart])\n\n useEffect(() => {\n textAreaRef.current?.focus()\n }, [isShowingTagModal])\n\n const handleUserTag = (user: string) => {\n const newText: string[] = []\n const textVal = textAreaRef.current\n if (textVal) {\n const start = textVal?.selectionStart\n const textBeforeTag = text.substring(0, start)\n const textAfterTag = text.substring(start, text.length)\n setSelectionStart(start + user.length)\n newText.push(\n textBeforeTag,\n `${tagModalWithKeyboard ? '' : '@'}${user.replace(/\\s/g, '')}`,\n textAfterTag,\n )\n }\n setText(newText.join(''))\n setTagModalWithKeyboard(false)\n }\n\n const handleTagModal = (text: string) => {\n const start = textAreaRef.current && textAreaRef.current.selectionStart\n if (start && start > 0 && text.charAt(start - 1) === '@') {\n setTagModalWithKeyboard(true)\n setIsShowingTagModal(true)\n }\n }\n const handleCommands = (command: CommandListType) => {\n const textVal = textAreaRef.current\n if (textVal) {\n const start = textVal.selectionStart\n const end = textVal.selectionEnd\n const selected = text.substring(start, end)\n const textBeforeSelection = text.substring(0, start)\n const textAfterSelection = text.substring(end, text.length)\n\n const openSyntax = MARKDOWN_COMMANDS_DATA[command].openSyntax\n const closeSyntax = MARKDOWN_COMMANDS_DATA[command].closeSyntax\n\n switch (command) {\n case 'code': {\n const newText: string[] = []\n newText.push(\n textBeforeSelection,\n openSyntax,\n selected,\n closeSyntax,\n textAfterSelection,\n )\n\n setText(newText.join('\\r\\n'))\n textVal.focus()\n // adds 2 due to new line\n setSelectionStart(start + openSyntax.length + 2)\n break\n }\n case 'title':\n case 'bold':\n case 'italic':\n case 'strikethrough':\n case 'latex':\n case 'subscript':\n case 'superscript':\n case 'link':\n case 'image': {\n const newText = `${textBeforeSelection}${openSyntax}${selected}${closeSyntax}${textAfterSelection}`\n textVal.focus()\n setSelectionStart(start + openSyntax.length)\n setText(newText)\n }\n }\n }\n }\n\n return (\n <div className=\"MarkdownEditor\">\n <div className=\"MarkdownEditorControls\">\n <Tabs\n textColor=\"secondary\"\n indicatorColor=\"secondary\"\n value={currentTab}\n onChange={(_e, newValue) => setCurrentTab(newValue)}\n >\n {MarkdownEditorTabs.map(tabName => {\n return <Tab label={tabName} key={tabName} />\n })}\n </Tabs>\n {MarkdownEditorTabs[currentTab] === 'WRITE' && (\n <div className=\"MarkdownEditorControlsToolbar\">\n {commandList.map(type => {\n return (\n <IconButton\n size={'small'}\n key={type}\n onClick={() => handleCommands(type)}\n sx={{ width: '32px', height: '32px' }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n icon={type}\n label={startCase(type)}\n />\n </IconButton>\n )\n })}\n <IconButton\n size={'small'}\n onClick={() => setIsShowingTagModal(true)}\n sx={{ width: '32px', height: '32px' }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n icon=\"tag\"\n label=\"Mention\"\n />\n </IconButton>\n </div>\n )}\n </div>\n <div>\n {MarkdownEditorTabs[currentTab] === 'WRITE' ? (\n <TextField\n inputProps={{\n ['aria-label']: 'markdown',\n }}\n onChange={e => {\n setText(e.target.value)\n handleTagModal(e.target.value)\n }}\n style={{ width: '100%' }}\n multiline\n minRows={6}\n value={text}\n inputRef={textAreaRef}\n placeholder={placeholder}\n sx={{\n textarea: {\n resize: 'vertical',\n },\n }}\n />\n ) : (\n <Box sx={{ mx: 1, my: 2 }}>\n {text ? (\n <MarkdownSynapse markdown={text} />\n ) : (\n <Typography>Nothing to preview</Typography>\n )}\n </Box>\n )}\n </div>\n\n <UserMentionModal\n show={isShowingTagModal}\n onClose={() => setIsShowingTagModal(false)}\n handleUserTag={handleUserTag}\n />\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../src/components/Markdown/MarkdownEditor.tsx"],"sourcesContent":["import {\n Box,\n IconButton,\n Tab,\n Tabs,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useRef, useState, useEffect } from 'react'\nimport {\n commandList,\n CommandListType,\n MARKDOWN_COMMANDS_DATA,\n} from '@sage-bionetworks/synapse-types'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from './MarkdownSynapse'\nimport { UserMentionModal } from './UserMentionModal'\nimport { startCase } from 'lodash-es'\n\nconst MarkdownEditorTabs = ['WRITE', 'PREVIEW'] as const\n\nexport type MarkdownEditorProps = {\n placeholder?: string\n text: string\n setText: (text: string) => void\n}\n\nexport function MarkdownEditor({\n placeholder,\n text,\n setText,\n}: MarkdownEditorProps) {\n const [currentTab, setCurrentTab] = useState<number>(0)\n const [selectionStart, setSelectionStart] = useState<number>(0)\n const [isShowingTagModal, setIsShowingTagModal] = useState<boolean>(false)\n const [tagModalWithKeyboard, setTagModalWithKeyboard] =\n useState<boolean>(false)\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n /**\n * Updates the position of the cursor. This must occur within `useEffect` because we need to ensure that the\n * cursor position is updated after the state of `text` is updated.\n */\n useEffect(() => {\n const input = textAreaRef.current\n if (input) {\n input.setSelectionRange(selectionStart, selectionStart)\n }\n }, [textAreaRef, selectionStart])\n\n useEffect(() => {\n textAreaRef.current?.focus()\n }, [isShowingTagModal])\n\n const handleUserTag = (user: string) => {\n const newText: string[] = []\n const textVal = textAreaRef.current\n if (textVal) {\n const start = textVal?.selectionStart\n const textBeforeTag = text.substring(0, start)\n const textAfterTag = text.substring(start, text.length)\n setSelectionStart(start + user.length)\n newText.push(\n textBeforeTag,\n `${tagModalWithKeyboard ? '' : '@'}${user.replace(/\\s/g, '')}`,\n textAfterTag,\n )\n }\n setText(newText.join(''))\n setTagModalWithKeyboard(false)\n }\n\n const handleTagModal = (text: string) => {\n const start = textAreaRef.current?.selectionStart\n if (start && start > 0 && text.charAt(start - 1) === '@') {\n setTagModalWithKeyboard(true)\n setIsShowingTagModal(true)\n }\n }\n const handleCommands = (command: CommandListType) => {\n const textVal = textAreaRef.current\n if (textVal) {\n const start = textVal.selectionStart\n const end = textVal.selectionEnd\n const selected = text.substring(start, end)\n const textBeforeSelection = text.substring(0, start)\n const textAfterSelection = text.substring(end, text.length)\n\n const openSyntax = MARKDOWN_COMMANDS_DATA[command].openSyntax\n const closeSyntax = MARKDOWN_COMMANDS_DATA[command].closeSyntax\n\n switch (command) {\n case 'code': {\n const newText: string[] = []\n newText.push(\n textBeforeSelection,\n openSyntax,\n selected,\n closeSyntax,\n textAfterSelection,\n )\n\n setText(newText.join('\\r\\n'))\n textVal.focus()\n // adds 2 due to new line\n setSelectionStart(start + openSyntax.length + 2)\n break\n }\n case 'title':\n case 'bold':\n case 'italic':\n case 'strikethrough':\n case 'latex':\n case 'subscript':\n case 'superscript':\n case 'link':\n case 'image': {\n const newText = `${textBeforeSelection}${openSyntax}${selected}${closeSyntax}${textAfterSelection}`\n textVal.focus()\n setSelectionStart(start + openSyntax.length)\n setText(newText)\n }\n }\n }\n }\n\n return (\n <div className=\"MarkdownEditor\">\n <div className=\"MarkdownEditorControls\">\n <Tabs\n textColor=\"secondary\"\n indicatorColor=\"secondary\"\n value={currentTab}\n onChange={(_e, newValue) => setCurrentTab(newValue)}\n >\n {MarkdownEditorTabs.map(tabName => {\n return <Tab label={tabName} key={tabName} />\n })}\n </Tabs>\n {MarkdownEditorTabs[currentTab] === 'WRITE' && (\n <div className=\"MarkdownEditorControlsToolbar\">\n {commandList.map(type => {\n return (\n <IconButton\n size={'small'}\n key={type}\n onClick={() => handleCommands(type)}\n sx={{ width: '32px', height: '32px' }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n icon={type}\n label={startCase(type)}\n />\n </IconButton>\n )\n })}\n <IconButton\n size={'small'}\n onClick={() => setIsShowingTagModal(true)}\n sx={{ width: '32px', height: '32px' }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n icon=\"tag\"\n label=\"Mention\"\n />\n </IconButton>\n </div>\n )}\n </div>\n <div>\n {MarkdownEditorTabs[currentTab] === 'WRITE' ? (\n <TextField\n inputProps={{\n ['aria-label']: 'markdown',\n }}\n onChange={e => {\n setText(e.target.value)\n handleTagModal(e.target.value)\n }}\n style={{ width: '100%' }}\n multiline\n minRows={6}\n value={text}\n inputRef={textAreaRef}\n placeholder={placeholder}\n sx={{\n textarea: {\n resize: 'vertical',\n },\n }}\n />\n ) : (\n <Box sx={{ mx: 1, my: 2 }}>\n {text ? (\n <MarkdownSynapse markdown={text} />\n ) : (\n <Typography>Nothing to preview</Typography>\n )}\n </Box>\n )}\n </div>\n\n <UserMentionModal\n show={isShowingTagModal}\n onClose={() => setIsShowingTagModal(false)}\n handleUserTag={handleUserTag}\n />\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProvenanceGraph.d.ts","sourceRoot":"","sources":["../../../src/components/ProvenanceGraph/ProvenanceGraph.tsx"],"names":[],"mappings":"AAQA,OAAO,EAGL,aAAa,EAKd,MAAM,iCAAiC,CAAA;AAGxC,OAAkB,EAEhB,IAAI,EAEJ,IAAI,EAKL,MAAM,WAAW,CAAA;AAoBlB,OAAO,0BAA0B,CAAA;AAEjC,MAAM,MAAM,eAAe,GAAG;IAE5B,UAAU,EAAE,aAAa,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAA;IAChD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAA;IAChD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAA;CACrC,CAAA;AAID,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AACrD,eAAO,MAAM,mBAAmB,uBAAuB,CAAA;AAgcvD,QAAA,MAAM,eAAe,GAAI,OAAO,eAAe,KAAG,KAAK,CAAC,SAQvD,CAAA;AAED,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"ProvenanceGraph.d.ts","sourceRoot":"","sources":["../../../src/components/ProvenanceGraph/ProvenanceGraph.tsx"],"names":[],"mappings":"AAQA,OAAO,EAGL,aAAa,EAKd,MAAM,iCAAiC,CAAA;AAGxC,OAAkB,EAEhB,IAAI,EAEJ,IAAI,EAKL,MAAM,WAAW,CAAA;AAoBlB,OAAO,0BAA0B,CAAA;AAEjC,MAAM,MAAM,eAAe,GAAG;IAE5B,UAAU,EAAE,aAAa,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAA;IAChD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAA;IAChD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAA;CACrC,CAAA;AAID,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AACrD,eAAO,MAAM,mBAAmB,uBAAuB,CAAA;AA2bvD,QAAA,MAAM,eAAe,GAAI,OAAO,eAAe,KAAG,KAAK,CAAC,SAQvD,CAAA;AAED,eAAe,eAAe,CAAA"}
@@ -12,19 +12,19 @@ import { Button as v, CircularProgress as re, Stack as ie, Typography as y } fro
12
12
  import { jsx as b, jsxs as ae } from "react/jsx-runtime";
13
13
  import { USED_ENTITY_CONCRETE_TYPE_VALUE as oe } from "@sage-bionetworks/synapse-types";
14
14
  import { useErrorHandler as se } from "react-error-boundary";
15
- import ce, { Controls as x, ReactFlowProvider as S, getConnectedEdges as C, useEdgesState as w, useNodesState as le, useReactFlow as T } from "reactflow";
15
+ import ce, { Controls as x, ReactFlowProvider as S, getConnectedEdges as C, useEdgesState as le, useNodesState as w, useReactFlow as T } from "reactflow";
16
16
  import "reactflow/dist/style.css";
17
17
  //#region src/components/ProvenanceGraph/ProvenanceGraph.tsx
18
- var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) => `We don’t have any provenance information for this ${e} yet.`, ue = "rgba(255, 255, 255, 0.60)", j = (i) => {
19
- let { entityRefs: S, containerHeight: O = "200px", initialNodes: j = [], initialEdges: M = [], onNodesChangedListener: N, onEdgesChangedListener: P, onEditProvenanceClicked: F } = i, { accessToken: I } = a(), [L, R] = _(j), [z, B] = _(M), [V, H] = le([]), [U, W] = w([]), [G, K] = _(), [de, fe] = _(!1), q = se(), { data: J, isSuccess: pe } = o(S, { throwOnError: !0 }), me = [
18
+ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", ue = (e) => `We don’t have any provenance information for this ${e} yet.`, de = "rgba(255, 255, 255, 0.60)", A = (i) => {
19
+ let { entityRefs: S, containerHeight: O = "200px", initialNodes: A = [], initialEdges: j = [], onNodesChangedListener: M, onEdgesChangedListener: N, onEditProvenanceClicked: P } = i, { accessToken: F } = a(), [I, L] = _(A), [R, z] = _(j), [B, V] = w([]), [H, U] = le([]), [W, G] = _(), [fe, pe] = _(!1), K = se(), { data: q, isSuccess: me } = o(S, { throwOnError: !0 }), he = [
20
20
  s.ENTITY_PLACEHOLDER,
21
21
  s.EXTERNAL,
22
22
  s.ACTIVITY,
23
23
  s.EXPAND
24
- ], he = V.some((e) => me.includes(e.data.type)), ge = de && !he;
25
- pe && J && J.totalNumberOfResults == 0 && q(`Unable to load provenance for the given Synapse IDs: ${S.map((e) => e.targetId).join(",")}`);
26
- let Y = J?.results, _e = Y?.[0] ? n(r(Y[0])).toLowerCase() : "entity", [X, ve] = _(!1), Z = T(), ye = h((e, t) => {
27
- K(t);
24
+ ], J = B.some((e) => he.includes(e.data.type)), ge = fe && !J;
25
+ me && q?.totalNumberOfResults == 0 && K(`Unable to load provenance for the given Synapse IDs: ${S.map((e) => e.targetId).join(",")}`);
26
+ let Y = q?.results, _e = Y?.[0] ? n(r(Y[0])).toLowerCase() : "entity", [X, ve] = _(!1), Z = T(), ye = h((e, t) => {
27
+ G(t);
28
28
  }, []), Q = h(async (e) => {
29
29
  let { entityHeader: n, nodesCopy: r, edgesCopy: i, usedInActivity: a } = e;
30
30
  ee({
@@ -34,7 +34,7 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
34
34
  edgesCopy: i
35
35
  });
36
36
  try {
37
- let e = await t.getActivityForEntity(n.id, n.versionNumber, I);
37
+ let e = await t.getActivityForEntity(n.id, n.versionNumber, F);
38
38
  (!m({
39
39
  entityHeader: n,
40
40
  rootEntityHeaders: Y
@@ -54,11 +54,11 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
54
54
  edgesCopy: i
55
55
  });
56
56
  }
57
- }, [I, Y]);
57
+ }, [F, Y]);
58
58
  g(() => {
59
- !X && V.length > 0 && setTimeout(() => {
59
+ !X && B.length > 0 && setTimeout(() => {
60
60
  if (Y) {
61
- let e = ne(Y[0], V);
61
+ let e = ne(Y[0], B);
62
62
  if (e) {
63
63
  let t = Z.getZoom(), n = t > D ? D : t;
64
64
  Z?.setCenter(e.position.x + 150, e.position.y - 30, {
@@ -71,14 +71,14 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
71
71
  });
72
72
  }, [
73
73
  X,
74
- V,
74
+ B,
75
75
  Z,
76
76
  Y
77
77
  ]);
78
78
  let $ = h(async (e) => {
79
79
  let { entityHeader: n, nodesCopy: r, edgesCopy: i } = e;
80
80
  try {
81
- let e = await t.getActivityForEntity(n.id, n.versionNumber, I);
81
+ let e = await t.getActivityForEntity(n.id, n.versionNumber, F);
82
82
  if (u({
83
83
  activity: e,
84
84
  entityHeader: n,
@@ -94,7 +94,7 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
94
94
  edgesCopy: i
95
95
  });
96
96
  });
97
- let { results: a } = await t.getEntityHeaders(n, I);
97
+ let { results: a } = await t.getEntityHeaders(n, F);
98
98
  n.filter((e) => a.find((t) => t.id == e.targetId) == null).forEach((t) => {
99
99
  d({
100
100
  ref: t,
@@ -116,10 +116,10 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
116
116
  } catch (e) {
117
117
  console.error(e);
118
118
  }
119
- }, [I, Q]);
119
+ }, [F, Q]);
120
120
  g(() => {
121
- if (Y && L.length == 0) {
122
- let e = [...L], t = [...z], n = [];
121
+ if (Y && I.length == 0) {
122
+ let e = [...I], t = [...R], n = [];
123
123
  Y.forEach((r) => {
124
124
  let i = Q({
125
125
  entityHeader: r,
@@ -134,60 +134,60 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
134
134
  });
135
135
  n.push(a);
136
136
  }), Promise.allSettled(n).finally(() => {
137
- R(e), B(t), fe(!0);
137
+ L(e), z(t), pe(!0);
138
138
  });
139
139
  }
140
140
  }, [
141
141
  Q,
142
- q,
142
+ K,
143
143
  $,
144
144
  Y,
145
145
  S,
146
- z,
147
- L
146
+ R,
147
+ I
148
148
  ]), g(() => {
149
- let t = G?.data;
150
- if (G && t?.type == s.EXPAND) {
149
+ let t = W?.data;
150
+ if (W && t?.type == s.EXPAND) {
151
151
  let n = t.props;
152
152
  if (n.itemCount > E) {
153
153
  e("Web visualization does not support expanding this many items at this time.", "danger");
154
154
  return;
155
155
  } else {
156
156
  t.label = /* @__PURE__ */ b(re, { size: 30 });
157
- let e = L.filter((e) => e.id != G.id), r = C([G], z)[0], i = z.filter((e) => e != r);
157
+ let e = I.filter((e) => e.id != W.id), r = C([W], R)[0], i = R.filter((e) => e != r);
158
158
  $({
159
159
  entityHeader: n.entityHeader,
160
160
  nodesCopy: e,
161
161
  edgesCopy: i
162
162
  }).finally(() => {
163
- R(e), B(i);
163
+ L(e), z(i);
164
164
  });
165
165
  }
166
- K(void 0);
166
+ G(void 0);
167
167
  }
168
168
  }, [
169
- G,
170
- L,
171
- z,
169
+ W,
170
+ I,
171
+ R,
172
172
  $
173
173
  ]), g(() => {
174
- let { nodes: e, edges: t } = c(L, z, "TB");
175
- l(e, V) || (H(e), N && N(e)), l(t, U) || (W(t), P && P(t));
174
+ let { nodes: e, edges: t } = c(I, R, "TB");
175
+ l(e, B) || (V(e), M && M(e)), l(t, H) || (U(t), N && N(t));
176
176
  }, [
177
- L,
178
- z,
177
+ I,
178
+ R,
179
+ B,
180
+ H,
179
181
  V,
180
182
  U,
181
- H,
182
- W,
183
183
  X,
184
184
  Z,
185
185
  S,
186
- N,
187
- P
186
+ M,
187
+ N
188
188
  ]);
189
189
  let be = h((e) => {
190
- e && e.deltaX !== void 0 && e.deltaY !== void 0 && window.scrollTo(window.scrollX + e.deltaX, window.scrollY + e.deltaY);
190
+ e?.deltaX !== void 0 && e.deltaY !== void 0 && window.scrollTo(window.scrollX + e.deltaX, window.scrollY + e.deltaY);
191
191
  }, []);
192
192
  return /* @__PURE__ */ b("div", {
193
193
  className: "ProvenanceWidget",
@@ -222,15 +222,15 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
222
222
  lineHeight: "20px",
223
223
  fontWeight: 440
224
224
  },
225
- children: A(_e)
225
+ children: ue(_e)
226
226
  }),
227
- F && /* @__PURE__ */ b(v, {
227
+ P && /* @__PURE__ */ b(v, {
228
228
  variant: "outlined",
229
229
  sx: {
230
230
  borderRadius: "6px",
231
231
  border: "1px solid",
232
232
  borderColor: "greyV2.400",
233
- background: ue,
233
+ background: de,
234
234
  color: "greyV2.800",
235
235
  fontWeight: 540,
236
236
  lineHeight: "12px",
@@ -239,7 +239,7 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
239
239
  height: "28px",
240
240
  padding: "8px"
241
241
  },
242
- onClick: F,
242
+ onClick: P,
243
243
  children: "Edit Provenance"
244
244
  })
245
245
  ]
@@ -249,8 +249,8 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
249
249
  y: 0,
250
250
  zoom: D
251
251
  },
252
- nodes: V,
253
- edges: U,
252
+ nodes: B,
253
+ edges: H,
254
254
  onNodeClick: ye,
255
255
  attributionPosition: "bottom-right",
256
256
  onConnect: void 0,
@@ -259,8 +259,8 @@ var E = 400, D = .85, O = "Edit Provenance", k = "No provenance data", A = (e) =
259
259
  children: /* @__PURE__ */ b(x, {})
260
260
  })
261
261
  });
262
- }, M = (e) => /* @__PURE__ */ b(i, { children: /* @__PURE__ */ b(S, { children: /* @__PURE__ */ b(j, { ...e }) }) });
262
+ }, j = (e) => /* @__PURE__ */ b(i, { children: /* @__PURE__ */ b(S, { children: /* @__PURE__ */ b(A, { ...e }) }) });
263
263
  //#endregion
264
- export { O as EDIT_PROVENANCE_TEXT, k as NO_PROVENANCE_TITLE, M as default };
264
+ export { O as EDIT_PROVENANCE_TEXT, k as NO_PROVENANCE_TITLE, j as default };
265
265
 
266
266
  //# sourceMappingURL=ProvenanceGraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProvenanceGraph.js","names":[],"sources":["../../../src/components/ProvenanceGraph/ProvenanceGraph.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useGetEntityHeaders } from '@/synapse-queries'\nimport {\n entityTypeToFriendlyName,\n getEntityTypeFromHeader,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { CircularProgress, Typography, Button, Stack } from '@mui/material'\nimport {\n Activity,\n EntityHeader,\n ReferenceList,\n Used,\n USED_ENTITY_CONCRETE_TYPE_VALUE,\n UsedEntity,\n UsedURL,\n} from '@sage-bionetworks/synapse-types'\nimport { MouseEvent, useCallback, useEffect, useState, WheelEvent } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport ReactFlow, {\n Controls,\n Edge,\n getConnectedEdges,\n Node,\n ReactFlowProvider,\n useEdgesState,\n useNodesState,\n useReactFlow,\n} from 'reactflow'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { ExpandGraphNodeDataProps } from './ExpandGraphNodeLabel'\nimport {\n addActivityNode,\n addEntityNode,\n addEntityPlaceholderNode,\n addExpandNode,\n addExternalNode,\n addUndefinedNode,\n findEntityNode,\n isRootEntity,\n} from './ProvenanceGraphUtils'\nimport {\n getLayoutedElements,\n isArrayEqual,\n NodeType,\n ProvenanceNodeData,\n} from './ProvenanceUtils'\nimport 'reactflow/dist/style.css'\n\nexport type ProvenanceProps = {\n // what entity nodes should we start with?\n entityRefs: ReferenceList\n containerHeight?: string\n initialNodes?: Node[]\n initialEdges?: Edge[]\n onNodesChangedListener?: (nodes: Node[]) => void\n onEdgesChangedListener?: (edges: Edge[]) => void\n onEditProvenanceClicked?: () => void\n}\n\nconst MAX_ACTIVITY_EXPAND_NODES = 400\nconst DEFAULT_ZOOM = 0.85\nexport const EDIT_PROVENANCE_TEXT = 'Edit Provenance'\nexport const NO_PROVENANCE_TITLE = 'No provenance data'\nconst NO_PROVENANCE_MESSAGE = (entityTypeName: string) =>\n `We don’t have any provenance information for this ${entityTypeName} yet.`\nconst EDIT_PROVENANCE_BUTTON_BACKGROUND_COLOR = 'rgba(255, 255, 255, 0.60)'\n\n/**\n * Renders a Provenance Graph for a set of entities.\n * New Nodes are added to tempNodes, and new Edges are added to tempEdges.\n * On change, these are fed into the dagre js graph library to figure out the node positions,\n * and the output stored in 'nodes' and 'edges'. The 'nodes' and 'edges' arrays are used by the\n * ReactFlow component.\n */\nconst ProvenanceReactFlow = (props: ProvenanceProps): React.ReactNode => {\n const {\n entityRefs: rootEntityRefs,\n containerHeight = '200px',\n initialNodes = [],\n initialEdges = [],\n onNodesChangedListener,\n onEdgesChangedListener,\n onEditProvenanceClicked,\n } = props\n const { accessToken } = useSynapseContext()\n const [tempNodes, setTempNodes] = useState<Node[]>(initialNodes)\n const [tempEdges, setTempEdges] = useState<Edge[]>(initialEdges)\n const [nodes, setNodes] = useNodesState([])\n const [edges, setEdges] = useEdgesState([])\n const [clickedNode, setClickedNode] = useState<Node>()\n const [initialBuildComplete, setInitialBuildComplete] =\n useState<boolean>(false)\n const handleError = useErrorHandler()\n\n const { data: rootEntityHeadersPage, isSuccess } = useGetEntityHeaders(\n rootEntityRefs,\n { throwOnError: true },\n )\n\n const PROVENANCE_NODE_TYPES = [\n NodeType.ENTITY_PLACEHOLDER,\n NodeType.EXTERNAL,\n NodeType.ACTIVITY,\n NodeType.EXPAND,\n ]\n const hasProvenanceNodes = nodes.some(node =>\n PROVENANCE_NODE_TYPES.includes((node.data as ProvenanceNodeData).type),\n )\n\n const showNoProvenance = initialBuildComplete && !hasProvenanceNodes\n\n if (\n isSuccess &&\n rootEntityHeadersPage &&\n rootEntityHeadersPage.totalNumberOfResults == 0\n ) {\n const synapseIds = rootEntityRefs.map(ref => ref.targetId).join(',')\n handleError(\n `Unable to load provenance for the given Synapse IDs: ${synapseIds}`,\n )\n }\n const rootEntityHeaders = rootEntityHeadersPage?.results\n const entityTypeName = rootEntityHeaders?.[0]\n ? entityTypeToFriendlyName(\n getEntityTypeFromHeader(rootEntityHeaders[0]),\n ).toLowerCase()\n : 'entity'\n const [initializedPosition, setInitializedPosition] = useState<boolean>(false)\n\n // Get the react flow instance so we attempt to properly center the view.\n const reactFlowInstance = useReactFlow()\n\n const onClickNode = useCallback((_event: MouseEvent, node: Node) => {\n setClickedNode(node)\n }, [])\n\n /**\n * Called when we have a new entity to add to the graph. This will result in adding\n * a new Entity Node to the nodesCopy, a link from the usedInActivity to the new Entity Node,\n * AND it will look for an Activity associated with the new entity. If an Activity is found,\n * it will add an Expand Node for the user to click (to expand to see this Activity!).\n * If this is a root node (starting entity node), then we automatically add the Activity Node\n * and process it.\n */\n const addEntity = useCallback(\n async (params: {\n entityHeader: EntityHeader\n usedInActivity?: Activity\n nodesCopy: Node[]\n edgesCopy: Edge[]\n }) => {\n const { entityHeader, nodesCopy, edgesCopy, usedInActivity } = params\n addEntityNode({\n entityHeader,\n activity: usedInActivity,\n nodesCopy,\n edgesCopy,\n })\n //look for Activity\n try {\n const activity = await SynapseClient.getActivityForEntity(\n entityHeader.id,\n entityHeader.versionNumber,\n accessToken,\n )\n // if this is not a root node (or there are too many items to show), add an expand node\n if (\n !isRootEntity({ entityHeader, rootEntityHeaders }) ||\n (activity.used && activity.used.length >= MAX_ACTIVITY_EXPAND_NODES)\n ) {\n addExpandNode({\n entityHeader,\n itemCount: activity.used?.length,\n nodesCopy,\n edgesCopy,\n })\n }\n } catch (e) {\n // Activity is not accessible\n console.error(e)\n if (\n isRootEntity({\n entityHeader,\n rootEntityHeaders,\n })\n ) {\n // add provenance undefined node\n addUndefinedNode({\n entityHeader,\n nodesCopy,\n edgesCopy,\n })\n }\n }\n },\n [accessToken, rootEntityHeaders],\n )\n\n /**\n * This effect attempts to center the graph on one of the root nodes.\n * Only initializes after after a root node has been added to the graph.\n */\n useEffect(() => {\n if (!initializedPosition && nodes.length > 0) {\n setTimeout(() => {\n if (rootEntityHeaders) {\n const rootEntityNode = findEntityNode(rootEntityHeaders[0], nodes)\n if (rootEntityNode) {\n const currentZoom = reactFlowInstance.getZoom()\n const zoom = currentZoom > DEFAULT_ZOOM ? DEFAULT_ZOOM : currentZoom\n reactFlowInstance?.setCenter(\n rootEntityNode.position.x + 150,\n rootEntityNode.position.y - 30,\n { zoom, duration: 0 },\n )\n }\n setInitializedPosition(true)\n }\n })\n }\n }, [initializedPosition, nodes, reactFlowInstance, rootEntityHeaders])\n\n /**\n * This is called when the user clicks on an Expand Node. It will add the associated Activity\n * and all \"used\" items (entities and urls) to the graph by adding items to the nodesCopy and edgesCopy arrays.\n */\n const onExpandEntity = useCallback(\n async (params: {\n entityHeader: EntityHeader\n nodesCopy: Node[]\n edgesCopy: Edge[]\n }) => {\n const { entityHeader, nodesCopy, edgesCopy } = params\n try {\n const activity = await SynapseClient.getActivityForEntity(\n entityHeader.id,\n entityHeader.versionNumber,\n accessToken,\n )\n addActivityNode({\n activity,\n entityHeader,\n nodesCopy,\n edgesCopy,\n })\n // go through Activity.used array to add these nodes/edges\n if (activity.used && activity.used.length < MAX_ACTIVITY_EXPAND_NODES) {\n const usedEntityReferences: ReferenceList = []\n activity.used.forEach((usedItem: Used) => {\n if (usedItem.concreteType == USED_ENTITY_CONCRETE_TYPE_VALUE) {\n usedEntityReferences.push((usedItem as UsedEntity).reference)\n } else {\n // UsedURL\n const usedURL = usedItem as UsedURL\n addExternalNode({ usedURL, activity, nodesCopy, edgesCopy })\n }\n })\n const usedEntityHeadersPage = await SynapseClient.getEntityHeaders(\n usedEntityReferences,\n accessToken,\n )\n const { results: usedEntityHeaderPageResults } = usedEntityHeadersPage\n // find refs that were not returned by the entity header call\n const refsMissingEntityHeaders = usedEntityReferences.filter(ref => {\n return (\n usedEntityHeaderPageResults.find(header => {\n return header.id == ref.targetId\n }) == undefined\n )\n })\n refsMissingEntityHeaders.forEach(ref => {\n addEntityPlaceholderNode({ ref, activity, nodesCopy, edgesCopy })\n })\n const addEntityPromises: Promise<void>[] = []\n usedEntityHeaderPageResults.forEach(header => {\n addEntityPromises.push(\n addEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n usedInActivity: activity,\n }),\n )\n })\n await Promise.allSettled(addEntityPromises)\n }\n } catch (e) {\n // Activity is not accessible\n console.error(e)\n }\n },\n [accessToken, addEntity],\n )\n\n /**\n * This effect code executes when no nodes have been added.\n * It will add the root nodes, and attempt to expand the root nodes.\n */\n useEffect(() => {\n if (rootEntityHeaders && tempNodes.length == 0) {\n const nodesCopy = [...tempNodes]\n const edgesCopy = [...tempEdges]\n const addAndExpandPromises: Promise<void>[] = []\n rootEntityHeaders.forEach(header => {\n const addEntityPromise = addEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n })\n addAndExpandPromises.push(addEntityPromise)\n\n const expandEntityPromise = onExpandEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n })\n addAndExpandPromises.push(expandEntityPromise)\n })\n Promise.allSettled(addAndExpandPromises).finally(() => {\n setTempNodes(nodesCopy)\n setTempEdges(edgesCopy)\n setInitialBuildComplete(true)\n })\n }\n }, [\n addEntity,\n handleError,\n onExpandEntity,\n rootEntityHeaders,\n rootEntityRefs,\n tempEdges,\n tempNodes,\n ])\n\n /**\n * This effect code executes when a node is clicked.\n * We check to see if it is an expand node. If it is, then we remove the expand node (and associated edge)\n * and ask for the Activity and associated \"used\" nodes (entities and URLs)\n */\n useEffect(() => {\n const nodeData: ProvenanceNodeData = clickedNode?.data as ProvenanceNodeData\n if (clickedNode && nodeData?.type == NodeType.EXPAND) {\n const expandNodeDataProps = nodeData.props as ExpandGraphNodeDataProps\n if (expandNodeDataProps.itemCount > MAX_ACTIVITY_EXPAND_NODES) {\n displayToast(\n 'Web visualization does not support expanding this many items at this time.',\n 'danger',\n )\n return\n } else {\n // graph will be used outside of synapse, so show a non-branded spinner\n nodeData.label = <CircularProgress size={30} />\n // remove clicked node\n const nodesWithoutExpandNode = tempNodes.filter(\n node => node.id != clickedNode.id,\n )\n const edgeToRemove = getConnectedEdges([clickedNode], tempEdges)[0]\n const edgesWithoutExpandEdge = tempEdges.filter(\n edge => edge != edgeToRemove,\n )\n onExpandEntity({\n entityHeader: expandNodeDataProps.entityHeader,\n nodesCopy: nodesWithoutExpandNode,\n edgesCopy: edgesWithoutExpandEdge,\n }).finally(() => {\n setTempNodes(nodesWithoutExpandNode)\n setTempEdges(edgesWithoutExpandEdge)\n })\n }\n setClickedNode(undefined)\n }\n }, [clickedNode, tempNodes, tempEdges, onExpandEntity])\n\n /**\n * This effect code is run when the graph nodes or edges change.\n * It feeds the nodes and edges into our layout library to figure out where they should be positioned.\n * The result is saved in the state variable \"nodes\" and \"edges\".\n */\n useEffect(() => {\n const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedElements(\n tempNodes,\n tempEdges,\n 'TB',\n )\n // hack: ProvenanceUtils.getProvenanceNode() returns a new object every time, so check to see if\n // there were any real changes\n if (!isArrayEqual(layoutedNodes, nodes)) {\n setNodes(layoutedNodes)\n if (onNodesChangedListener) {\n onNodesChangedListener(layoutedNodes)\n }\n }\n if (!isArrayEqual(layoutedEdges, edges)) {\n setEdges(layoutedEdges)\n if (onEdgesChangedListener) {\n onEdgesChangedListener(layoutedEdges)\n }\n }\n }, [\n tempNodes,\n tempEdges,\n nodes,\n edges,\n setNodes,\n setEdges,\n initializedPosition,\n reactFlowInstance,\n rootEntityRefs,\n onNodesChangedListener,\n onEdgesChangedListener,\n ])\n\n const onPaneScrollFunction: (event?: WheelEvent) => void = useCallback(\n event => {\n // Cannot simply check the truthy value of event.deltaX (or Y) because the value might be 0 (or -0), which is falsy\n if (\n event &&\n typeof event.deltaX !== 'undefined' &&\n typeof event.deltaY !== 'undefined'\n ) {\n window.scrollTo(\n window.scrollX + event.deltaX,\n window.scrollY + event.deltaY,\n )\n }\n },\n [],\n )\n return (\n <div\n className=\"ProvenanceWidget\"\n role=\"graphics-doc\" //https://www.w3.org/wiki/SVG_Accessibility/ARIA_roles_for_charts#Document_Roles\n style={{\n width: '100%',\n height: containerHeight,\n }}\n >\n {showNoProvenance ? (\n <Stack\n sx={{\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={{\n color: 'greyV2.900',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 540,\n marginBottom: '12px',\n }}\n >\n {NO_PROVENANCE_TITLE}\n </Typography>\n <Typography\n sx={{\n color: 'greyV2.900',\n fontSize: '14px',\n lineHeight: '20px',\n fontWeight: 440,\n }}\n >\n {NO_PROVENANCE_MESSAGE(entityTypeName)}\n </Typography>\n {onEditProvenanceClicked && (\n <Button\n variant=\"outlined\"\n sx={{\n borderRadius: '6px',\n border: '1px solid',\n borderColor: 'greyV2.400',\n background: EDIT_PROVENANCE_BUTTON_BACKGROUND_COLOR,\n color: 'greyV2.800',\n fontWeight: 540,\n lineHeight: '12px' /* 100% */,\n letterSpacing: '-0.24px',\n marginTop: '20px',\n height: '28px',\n padding: '8px',\n }}\n onClick={onEditProvenanceClicked}\n >\n {EDIT_PROVENANCE_TEXT}\n </Button>\n )}\n </Stack>\n ) : (\n <ReactFlow\n defaultViewport={{ x: 0, y: 0, zoom: DEFAULT_ZOOM }}\n nodes={nodes}\n edges={edges}\n onNodeClick={onClickNode}\n // onNodesChange={onNodesChange} // SWC-6804: When the nodes/edges are updated (expanded) the graph is already re-rendered.\n // onEdgesChange={onEdgesChange} // Specifying these callbacks causes an infinite re-rendering loop.\n attributionPosition=\"bottom-right\"\n onConnect={undefined}\n zoomOnScroll={false}\n onPaneScroll={onPaneScrollFunction}\n >\n <Controls />\n </ReactFlow>\n )}\n </div>\n )\n}\n\nconst ProvenanceGraph = (props: ProvenanceProps): React.ReactNode => {\n return (\n <SynapseErrorBoundary>\n <ReactFlowProvider>\n <ProvenanceReactFlow {...props} />\n </ReactFlowProvider>\n </SynapseErrorBoundary>\n )\n}\n\nexport default ProvenanceGraph\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProvenanceGraph.js","names":[],"sources":["../../../src/components/ProvenanceGraph/ProvenanceGraph.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useGetEntityHeaders } from '@/synapse-queries'\nimport {\n entityTypeToFriendlyName,\n getEntityTypeFromHeader,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { CircularProgress, Typography, Button, Stack } from '@mui/material'\nimport {\n Activity,\n EntityHeader,\n ReferenceList,\n Used,\n USED_ENTITY_CONCRETE_TYPE_VALUE,\n UsedEntity,\n UsedURL,\n} from '@sage-bionetworks/synapse-types'\nimport { MouseEvent, useCallback, useEffect, useState, WheelEvent } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport ReactFlow, {\n Controls,\n Edge,\n getConnectedEdges,\n Node,\n ReactFlowProvider,\n useEdgesState,\n useNodesState,\n useReactFlow,\n} from 'reactflow'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { ExpandGraphNodeDataProps } from './ExpandGraphNodeLabel'\nimport {\n addActivityNode,\n addEntityNode,\n addEntityPlaceholderNode,\n addExpandNode,\n addExternalNode,\n addUndefinedNode,\n findEntityNode,\n isRootEntity,\n} from './ProvenanceGraphUtils'\nimport {\n getLayoutedElements,\n isArrayEqual,\n NodeType,\n ProvenanceNodeData,\n} from './ProvenanceUtils'\nimport 'reactflow/dist/style.css'\n\nexport type ProvenanceProps = {\n // what entity nodes should we start with?\n entityRefs: ReferenceList\n containerHeight?: string\n initialNodes?: Node[]\n initialEdges?: Edge[]\n onNodesChangedListener?: (nodes: Node[]) => void\n onEdgesChangedListener?: (edges: Edge[]) => void\n onEditProvenanceClicked?: () => void\n}\n\nconst MAX_ACTIVITY_EXPAND_NODES = 400\nconst DEFAULT_ZOOM = 0.85\nexport const EDIT_PROVENANCE_TEXT = 'Edit Provenance'\nexport const NO_PROVENANCE_TITLE = 'No provenance data'\nconst NO_PROVENANCE_MESSAGE = (entityTypeName: string) =>\n `We don’t have any provenance information for this ${entityTypeName} yet.`\nconst EDIT_PROVENANCE_BUTTON_BACKGROUND_COLOR = 'rgba(255, 255, 255, 0.60)'\n\n/**\n * Renders a Provenance Graph for a set of entities.\n * New Nodes are added to tempNodes, and new Edges are added to tempEdges.\n * On change, these are fed into the dagre js graph library to figure out the node positions,\n * and the output stored in 'nodes' and 'edges'. The 'nodes' and 'edges' arrays are used by the\n * ReactFlow component.\n */\nconst ProvenanceReactFlow = (props: ProvenanceProps): React.ReactNode => {\n const {\n entityRefs: rootEntityRefs,\n containerHeight = '200px',\n initialNodes = [],\n initialEdges = [],\n onNodesChangedListener,\n onEdgesChangedListener,\n onEditProvenanceClicked,\n } = props\n const { accessToken } = useSynapseContext()\n const [tempNodes, setTempNodes] = useState<Node[]>(initialNodes)\n const [tempEdges, setTempEdges] = useState<Edge[]>(initialEdges)\n const [nodes, setNodes] = useNodesState([])\n const [edges, setEdges] = useEdgesState([])\n const [clickedNode, setClickedNode] = useState<Node>()\n const [initialBuildComplete, setInitialBuildComplete] =\n useState<boolean>(false)\n const handleError = useErrorHandler()\n\n const { data: rootEntityHeadersPage, isSuccess } = useGetEntityHeaders(\n rootEntityRefs,\n { throwOnError: true },\n )\n\n const PROVENANCE_NODE_TYPES = [\n NodeType.ENTITY_PLACEHOLDER,\n NodeType.EXTERNAL,\n NodeType.ACTIVITY,\n NodeType.EXPAND,\n ]\n const hasProvenanceNodes = nodes.some(node =>\n PROVENANCE_NODE_TYPES.includes((node.data as ProvenanceNodeData).type),\n )\n\n const showNoProvenance = initialBuildComplete && !hasProvenanceNodes\n\n if (isSuccess && rootEntityHeadersPage?.totalNumberOfResults == 0) {\n const synapseIds = rootEntityRefs.map(ref => ref.targetId).join(',')\n handleError(\n `Unable to load provenance for the given Synapse IDs: ${synapseIds}`,\n )\n }\n const rootEntityHeaders = rootEntityHeadersPage?.results\n const entityTypeName = rootEntityHeaders?.[0]\n ? entityTypeToFriendlyName(\n getEntityTypeFromHeader(rootEntityHeaders[0]),\n ).toLowerCase()\n : 'entity'\n const [initializedPosition, setInitializedPosition] = useState<boolean>(false)\n\n // Get the react flow instance so we attempt to properly center the view.\n const reactFlowInstance = useReactFlow()\n\n const onClickNode = useCallback((_event: MouseEvent, node: Node) => {\n setClickedNode(node)\n }, [])\n\n /**\n * Called when we have a new entity to add to the graph. This will result in adding\n * a new Entity Node to the nodesCopy, a link from the usedInActivity to the new Entity Node,\n * AND it will look for an Activity associated with the new entity. If an Activity is found,\n * it will add an Expand Node for the user to click (to expand to see this Activity!).\n * If this is a root node (starting entity node), then we automatically add the Activity Node\n * and process it.\n */\n const addEntity = useCallback(\n async (params: {\n entityHeader: EntityHeader\n usedInActivity?: Activity\n nodesCopy: Node[]\n edgesCopy: Edge[]\n }) => {\n const { entityHeader, nodesCopy, edgesCopy, usedInActivity } = params\n addEntityNode({\n entityHeader,\n activity: usedInActivity,\n nodesCopy,\n edgesCopy,\n })\n //look for Activity\n try {\n const activity = await SynapseClient.getActivityForEntity(\n entityHeader.id,\n entityHeader.versionNumber,\n accessToken,\n )\n // if this is not a root node (or there are too many items to show), add an expand node\n if (\n !isRootEntity({ entityHeader, rootEntityHeaders }) ||\n (activity.used && activity.used.length >= MAX_ACTIVITY_EXPAND_NODES)\n ) {\n addExpandNode({\n entityHeader,\n itemCount: activity.used?.length,\n nodesCopy,\n edgesCopy,\n })\n }\n } catch (e) {\n // Activity is not accessible\n console.error(e)\n if (\n isRootEntity({\n entityHeader,\n rootEntityHeaders,\n })\n ) {\n // add provenance undefined node\n addUndefinedNode({\n entityHeader,\n nodesCopy,\n edgesCopy,\n })\n }\n }\n },\n [accessToken, rootEntityHeaders],\n )\n\n /**\n * This effect attempts to center the graph on one of the root nodes.\n * Only initializes after after a root node has been added to the graph.\n */\n useEffect(() => {\n if (!initializedPosition && nodes.length > 0) {\n setTimeout(() => {\n if (rootEntityHeaders) {\n const rootEntityNode = findEntityNode(rootEntityHeaders[0], nodes)\n if (rootEntityNode) {\n const currentZoom = reactFlowInstance.getZoom()\n const zoom = currentZoom > DEFAULT_ZOOM ? DEFAULT_ZOOM : currentZoom\n reactFlowInstance?.setCenter(\n rootEntityNode.position.x + 150,\n rootEntityNode.position.y - 30,\n { zoom, duration: 0 },\n )\n }\n setInitializedPosition(true)\n }\n })\n }\n }, [initializedPosition, nodes, reactFlowInstance, rootEntityHeaders])\n\n /**\n * This is called when the user clicks on an Expand Node. It will add the associated Activity\n * and all \"used\" items (entities and urls) to the graph by adding items to the nodesCopy and edgesCopy arrays.\n */\n const onExpandEntity = useCallback(\n async (params: {\n entityHeader: EntityHeader\n nodesCopy: Node[]\n edgesCopy: Edge[]\n }) => {\n const { entityHeader, nodesCopy, edgesCopy } = params\n try {\n const activity = await SynapseClient.getActivityForEntity(\n entityHeader.id,\n entityHeader.versionNumber,\n accessToken,\n )\n addActivityNode({\n activity,\n entityHeader,\n nodesCopy,\n edgesCopy,\n })\n // go through Activity.used array to add these nodes/edges\n if (activity.used && activity.used.length < MAX_ACTIVITY_EXPAND_NODES) {\n const usedEntityReferences: ReferenceList = []\n activity.used.forEach((usedItem: Used) => {\n if (usedItem.concreteType == USED_ENTITY_CONCRETE_TYPE_VALUE) {\n usedEntityReferences.push((usedItem as UsedEntity).reference)\n } else {\n // UsedURL\n const usedURL = usedItem as UsedURL\n addExternalNode({ usedURL, activity, nodesCopy, edgesCopy })\n }\n })\n const usedEntityHeadersPage = await SynapseClient.getEntityHeaders(\n usedEntityReferences,\n accessToken,\n )\n const { results: usedEntityHeaderPageResults } = usedEntityHeadersPage\n // find refs that were not returned by the entity header call\n const refsMissingEntityHeaders = usedEntityReferences.filter(ref => {\n return (\n usedEntityHeaderPageResults.find(header => {\n return header.id == ref.targetId\n }) == undefined\n )\n })\n refsMissingEntityHeaders.forEach(ref => {\n addEntityPlaceholderNode({ ref, activity, nodesCopy, edgesCopy })\n })\n const addEntityPromises: Promise<void>[] = []\n usedEntityHeaderPageResults.forEach(header => {\n addEntityPromises.push(\n addEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n usedInActivity: activity,\n }),\n )\n })\n await Promise.allSettled(addEntityPromises)\n }\n } catch (e) {\n // Activity is not accessible\n console.error(e)\n }\n },\n [accessToken, addEntity],\n )\n\n /**\n * This effect code executes when no nodes have been added.\n * It will add the root nodes, and attempt to expand the root nodes.\n */\n useEffect(() => {\n if (rootEntityHeaders && tempNodes.length == 0) {\n const nodesCopy = [...tempNodes]\n const edgesCopy = [...tempEdges]\n const addAndExpandPromises: Promise<void>[] = []\n rootEntityHeaders.forEach(header => {\n const addEntityPromise = addEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n })\n addAndExpandPromises.push(addEntityPromise)\n\n const expandEntityPromise = onExpandEntity({\n entityHeader: header,\n nodesCopy,\n edgesCopy,\n })\n addAndExpandPromises.push(expandEntityPromise)\n })\n Promise.allSettled(addAndExpandPromises).finally(() => {\n setTempNodes(nodesCopy)\n setTempEdges(edgesCopy)\n setInitialBuildComplete(true)\n })\n }\n }, [\n addEntity,\n handleError,\n onExpandEntity,\n rootEntityHeaders,\n rootEntityRefs,\n tempEdges,\n tempNodes,\n ])\n\n /**\n * This effect code executes when a node is clicked.\n * We check to see if it is an expand node. If it is, then we remove the expand node (and associated edge)\n * and ask for the Activity and associated \"used\" nodes (entities and URLs)\n */\n useEffect(() => {\n const nodeData: ProvenanceNodeData = clickedNode?.data as ProvenanceNodeData\n if (clickedNode && nodeData?.type == NodeType.EXPAND) {\n const expandNodeDataProps = nodeData.props as ExpandGraphNodeDataProps\n if (expandNodeDataProps.itemCount > MAX_ACTIVITY_EXPAND_NODES) {\n displayToast(\n 'Web visualization does not support expanding this many items at this time.',\n 'danger',\n )\n return\n } else {\n // graph will be used outside of synapse, so show a non-branded spinner\n nodeData.label = <CircularProgress size={30} />\n // remove clicked node\n const nodesWithoutExpandNode = tempNodes.filter(\n node => node.id != clickedNode.id,\n )\n const edgeToRemove = getConnectedEdges([clickedNode], tempEdges)[0]\n const edgesWithoutExpandEdge = tempEdges.filter(\n edge => edge != edgeToRemove,\n )\n onExpandEntity({\n entityHeader: expandNodeDataProps.entityHeader,\n nodesCopy: nodesWithoutExpandNode,\n edgesCopy: edgesWithoutExpandEdge,\n }).finally(() => {\n setTempNodes(nodesWithoutExpandNode)\n setTempEdges(edgesWithoutExpandEdge)\n })\n }\n setClickedNode(undefined)\n }\n }, [clickedNode, tempNodes, tempEdges, onExpandEntity])\n\n /**\n * This effect code is run when the graph nodes or edges change.\n * It feeds the nodes and edges into our layout library to figure out where they should be positioned.\n * The result is saved in the state variable \"nodes\" and \"edges\".\n */\n useEffect(() => {\n const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedElements(\n tempNodes,\n tempEdges,\n 'TB',\n )\n // hack: ProvenanceUtils.getProvenanceNode() returns a new object every time, so check to see if\n // there were any real changes\n if (!isArrayEqual(layoutedNodes, nodes)) {\n setNodes(layoutedNodes)\n if (onNodesChangedListener) {\n onNodesChangedListener(layoutedNodes)\n }\n }\n if (!isArrayEqual(layoutedEdges, edges)) {\n setEdges(layoutedEdges)\n if (onEdgesChangedListener) {\n onEdgesChangedListener(layoutedEdges)\n }\n }\n }, [\n tempNodes,\n tempEdges,\n nodes,\n edges,\n setNodes,\n setEdges,\n initializedPosition,\n reactFlowInstance,\n rootEntityRefs,\n onNodesChangedListener,\n onEdgesChangedListener,\n ])\n\n const onPaneScrollFunction: (event?: WheelEvent) => void = useCallback(\n event => {\n // Cannot simply check the truthy value of event.deltaX (or Y) because the value might be 0 (or -0), which is falsy\n if (\n typeof event?.deltaX !== 'undefined' &&\n typeof event.deltaY !== 'undefined'\n ) {\n window.scrollTo(\n window.scrollX + event.deltaX,\n window.scrollY + event.deltaY,\n )\n }\n },\n [],\n )\n return (\n <div\n className=\"ProvenanceWidget\"\n role=\"graphics-doc\" //https://www.w3.org/wiki/SVG_Accessibility/ARIA_roles_for_charts#Document_Roles\n style={{\n width: '100%',\n height: containerHeight,\n }}\n >\n {showNoProvenance ? (\n <Stack\n sx={{\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={{\n color: 'greyV2.900',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 540,\n marginBottom: '12px',\n }}\n >\n {NO_PROVENANCE_TITLE}\n </Typography>\n <Typography\n sx={{\n color: 'greyV2.900',\n fontSize: '14px',\n lineHeight: '20px',\n fontWeight: 440,\n }}\n >\n {NO_PROVENANCE_MESSAGE(entityTypeName)}\n </Typography>\n {onEditProvenanceClicked && (\n <Button\n variant=\"outlined\"\n sx={{\n borderRadius: '6px',\n border: '1px solid',\n borderColor: 'greyV2.400',\n background: EDIT_PROVENANCE_BUTTON_BACKGROUND_COLOR,\n color: 'greyV2.800',\n fontWeight: 540,\n lineHeight: '12px' /* 100% */,\n letterSpacing: '-0.24px',\n marginTop: '20px',\n height: '28px',\n padding: '8px',\n }}\n onClick={onEditProvenanceClicked}\n >\n {EDIT_PROVENANCE_TEXT}\n </Button>\n )}\n </Stack>\n ) : (\n <ReactFlow\n defaultViewport={{ x: 0, y: 0, zoom: DEFAULT_ZOOM }}\n nodes={nodes}\n edges={edges}\n onNodeClick={onClickNode}\n // onNodesChange={onNodesChange} // SWC-6804: When the nodes/edges are updated (expanded) the graph is already re-rendered.\n // onEdgesChange={onEdgesChange} // Specifying these callbacks causes an infinite re-rendering loop.\n attributionPosition=\"bottom-right\"\n onConnect={undefined}\n zoomOnScroll={false}\n onPaneScroll={onPaneScrollFunction}\n >\n <Controls />\n </ReactFlow>\n )}\n </div>\n )\n}\n\nconst ProvenanceGraph = (props: ProvenanceProps): React.ReactNode => {\n return (\n <SynapseErrorBoundary>\n <ReactFlowProvider>\n <ProvenanceReactFlow {...props} />\n </ReactFlowProvider>\n </SynapseErrorBoundary>\n )\n}\n\nexport default ProvenanceGraph\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { ColumnMultiValueFunction as o, ColumnSingleValueFilterOperator as s, FI
4
4
  //#region src/components/QueryBuilder/queryBuilderTranslation.ts
5
5
  var l = "org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter", u = "org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter";
6
6
  function d(e) {
7
- return e != null && e.endsWith("_LIST");
7
+ return e?.endsWith("_LIST") ?? !1;
8
8
  }
9
9
  function f(e) {
10
10
  return e.replace(/[\\%_]/g, (e) => "\\" + e);
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderTranslation.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderTranslation.ts"],"sourcesContent":["import {\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n FacetColumnRequest,\n FILTER_GROUP_CONCRETE_TYPE_VALUE,\n FilterGroup,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isFilterGroup,\n} from '../../utils/types/IsType'\nimport { isQBGroup, QBCondition, QBGroup, QBNode } from './QueryBuilderTypes'\n\nconst COLUMN_SINGLE_VALUE_QUERY_FILTER =\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter' as const\nconst COLUMN_MULTI_VALUE_FUNCTION_QUERY_FILTER =\n 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter' as const\n\n// -----------------------------------------------------------------------------\n// Column-kind classification\n// -----------------------------------------------------------------------------\n\n/** A multi-value list column is one whose column type ends in `_LIST`. */\nexport function isListColumn(columnType: string | null): boolean {\n return columnType != null && columnType.endsWith('_LIST')\n}\n\n// -----------------------------------------------------------------------------\n// LIKE escaping / classification\n// -----------------------------------------------------------------------------\n\n/**\n * Escape SQL LIKE metacharacters (`%` and `_`) plus the escape character itself\n * (`\\`) so a user's literal `50%` isn't treated as a wildcard match.\n */\nexport function escapeLike(input: string): string {\n return input.replace(/[\\\\%_]/g, ch => '\\\\' + ch)\n}\n\n/**\n * Inverse of {@link escapeLike}: strip the backslash escapes that\n * {@link escapeLike} added.\n */\nexport function unescapeLike(input: string): string {\n return input.replace(/\\\\([\\\\%_])/g, '$1')\n}\n\n/**\n * Classify a LIKE pattern string produced by {@link qbNodeToApiFilter} back\n * into a QB op + un-escaped text. Handles the four wildcard shapes\n * produced by that function (`%val%`, `val%`, `%val`, `val`).\n */\nexport function classifyLikePattern(pattern: string): {\n op: 'contains' | 'starts_with' | 'ends_with' | 'is_exactly'\n text: string\n} {\n const startsPct = pattern.startsWith('%')\n // Only treat a trailing '%' as a wildcard if it isn't itself escaped\n const endsPct = /(?<!\\\\)%$/.test(pattern)\n const core = pattern.slice(startsPct ? 1 : 0, endsPct ? -1 : undefined)\n const text = unescapeLike(core)\n if (startsPct && endsPct) return { op: 'contains', text }\n if (endsPct) return { op: 'starts_with', text }\n if (startsPct) return { op: 'ends_with', text }\n return { op: 'is_exactly', text }\n}\n\n// -----------------------------------------------------------------------------\n// QB → API\n// -----------------------------------------------------------------------------\n\n/**\n * Convert a QB tree node into a `QueryFilter`. Returns `null` when the node\n * (or an entire subtree) has no complete conditions — an incomplete leaf and\n * an empty group are both treated as \"no constraint\" so partial user input\n * never contributes to the outgoing query.\n */\nexport function qbNodeToApiFilter(node: QBNode): QueryFilter | null {\n if (isQBGroup(node)) {\n const children = node.children\n .map(qbNodeToApiFilter)\n .filter((f): f is QueryFilter => f !== null)\n if (children.length === 0) return null\n const filter: FilterGroup = {\n concreteType: FILTER_GROUP_CONCRETE_TYPE_VALUE,\n operator: node.combinator,\n not: node.not || undefined,\n children,\n }\n return filter\n }\n return conditionToApiFilter(node)\n}\n\nfunction conditionToApiFilter(\n node: QBCondition,\n): ColumnSingleValueQueryFilter | ColumnMultiValueFunctionQueryFilter | null {\n const { columnName, columnType, op, values, rangeMin, rangeMax, text } = node\n if (columnName === null) return null\n\n switch (op) {\n case 'is_any_of':\n return anyOfFilter(columnName, columnType, values)\n case 'is_all_of':\n return values.length === 0\n ? null\n : makeMultiValueFilter(columnName, values)\n case 'between':\n return betweenFilter(columnName, rangeMin, rangeMax)\n case 'gt':\n return rangeBoundFilter(\n columnName,\n rangeMin,\n ColumnSingleValueFilterOperator.GREATER_THAN,\n )\n case 'gte':\n return rangeBoundFilter(\n columnName,\n rangeMin,\n ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL,\n )\n case 'lt':\n return rangeBoundFilter(\n columnName,\n rangeMax,\n ColumnSingleValueFilterOperator.LESS_THAN,\n )\n case 'lte':\n return rangeBoundFilter(\n columnName,\n rangeMax,\n ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL,\n )\n case 'equal':\n return equalityFilter(\n columnName,\n values,\n ColumnSingleValueFilterOperator.EQUAL,\n )\n case 'not_equal':\n return equalityFilter(\n columnName,\n values,\n ColumnSingleValueFilterOperator.NOT_EQUAL,\n )\n case 'has_value':\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IS_NOT_NULL,\n [],\n )\n case 'no_value':\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IS_NULL,\n [],\n )\n case 'contains':\n return likeFilter(columnName, text, escaped => `%${escaped}%`)\n case 'starts_with':\n return likeFilter(columnName, text, escaped => `${escaped}%`)\n case 'ends_with':\n return likeFilter(columnName, text, escaped => `%${escaped}`)\n case 'is_exactly':\n return isBlank(text)\n ? null\n : makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.EQUAL,\n [text!],\n )\n default: {\n // Compile-time exhaustiveness guard; the log fires only if a new op is\n // added to QBConditionOp without a case here.\n op satisfies never\n console.warn(\n `conditionToApiFilter: unrecognized QB op, skipping condition for column \"${columnName}\"`,\n { op },\n )\n return null\n }\n }\n}\n\nfunction isBlank(value: string | null | undefined): boolean {\n return value == null || value === ''\n}\n\nfunction anyOfFilter(\n columnName: string,\n columnType: string | null,\n values: string[],\n): ColumnSingleValueQueryFilter | ColumnMultiValueFunctionQueryFilter | null {\n if (values.length === 0) return null\n if (isListColumn(columnType)) return makeMultiValueFilter(columnName, values)\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IN,\n values,\n )\n}\n\nfunction betweenFilter(\n columnName: string,\n rangeMin: string | null,\n rangeMax: string | null,\n): ColumnSingleValueQueryFilter | null {\n if (isBlank(rangeMin) || isBlank(rangeMax)) return null\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.BETWEEN,\n [rangeMin!, rangeMax!],\n )\n}\n\nfunction equalityFilter(\n columnName: string,\n values: string[],\n operator: ColumnSingleValueFilterOperator,\n): ColumnSingleValueQueryFilter | null {\n if (values.length === 0) return null\n return makeSingleValueFilter(columnName, operator, [values[0]])\n}\n\nfunction likeFilter(\n columnName: string,\n text: string | null,\n wrap: (escapedText: string) => string,\n): ColumnSingleValueQueryFilter | null {\n if (isBlank(text)) return null\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.LIKE,\n [wrap(escapeLike(text!))],\n )\n}\n\nfunction makeSingleValueFilter(\n columnName: string,\n operator: ColumnSingleValueFilterOperator,\n values: string[],\n): ColumnSingleValueQueryFilter {\n return {\n concreteType: COLUMN_SINGLE_VALUE_QUERY_FILTER,\n columnName,\n operator,\n values,\n }\n}\n\nfunction makeMultiValueFilter(\n columnName: string,\n values: string[],\n): ColumnMultiValueFunctionQueryFilter {\n return {\n concreteType: COLUMN_MULTI_VALUE_FUNCTION_QUERY_FILTER,\n columnName,\n function: ColumnMultiValueFunction.HAS,\n _function: ColumnMultiValueFunction.HAS,\n values,\n }\n}\n\nfunction rangeBoundFilter(\n columnName: string,\n bound: string | null,\n operator: ColumnSingleValueFilterOperator,\n): ColumnSingleValueQueryFilter | null {\n if (bound == null || bound === '') return null\n return makeSingleValueFilter(columnName, operator, [bound])\n}\n\n// -----------------------------------------------------------------------------\n// API → QB (initial hydration)\n// -----------------------------------------------------------------------------\n\n/**\n * Convert an API `QueryFilter` back into a QB node. Used when the initial\n * query already contains a `FilterGroup` (see filterMode auto-detect) so the\n * QB tree can be reconstructed on mount.\n *\n * Some conversions are lossy — `HAS` always deserializes as `is_any_of` (we\n * can't distinguish it from an `is_all_of` at the API layer), and `EQUAL` on\n * text columns deserializes as `equal` (not `is_exactly`) because they share\n * the same wire representation. Users can adjust the operator picker.\n */\nexport function apiFilterToQBNode(filter: QueryFilter): QBNode | null {\n if (isFilterGroup(filter)) {\n const children = (filter.children ?? [])\n .map(apiFilterToQBNode)\n .filter((n): n is QBNode => n !== null)\n return {\n kind: 'group',\n id: newId(),\n combinator: filter.operator ?? 'AND',\n not: filter.not ?? false,\n children,\n }\n }\n if (isColumnSingleValueQueryFilter(filter)) {\n return singleValueToCondition(filter)\n }\n if (isColumnMultiValueFunctionQueryFilter(filter)) {\n return {\n kind: 'condition',\n id: newId(),\n columnName: filter.columnName,\n columnType: null,\n op: 'is_any_of',\n values: [...filter.values],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n }\n // TextMatchesQueryFilter and other non-QB filter types are not part of the\n // QB tree — they belong in the non-QB baseline.\n return null\n}\n\nfunction singleValueToCondition(\n filter: ColumnSingleValueQueryFilter,\n): QBCondition {\n const base = {\n kind: 'condition' as const,\n id: newId(),\n columnName: filter.columnName,\n columnType: null,\n values: [] as string[],\n rangeMin: null as string | null,\n rangeMax: null as string | null,\n text: null as string | null,\n }\n const [firstValue] = filter.values\n switch (filter.operator) {\n case ColumnSingleValueFilterOperator.IN:\n return { ...base, op: 'is_any_of', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.EQUAL:\n return { ...base, op: 'equal', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.NOT_EQUAL:\n return { ...base, op: 'not_equal', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.GREATER_THAN:\n return { ...base, op: 'gt', rangeMin: firstValue ?? null }\n case ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL:\n return { ...base, op: 'gte', rangeMin: firstValue ?? null }\n case ColumnSingleValueFilterOperator.LESS_THAN:\n return { ...base, op: 'lt', rangeMax: firstValue ?? null }\n case ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL:\n return { ...base, op: 'lte', rangeMax: firstValue ?? null }\n case ColumnSingleValueFilterOperator.BETWEEN:\n return {\n ...base,\n op: 'between',\n rangeMin: filter.values[0] ?? null,\n rangeMax: filter.values[1] ?? null,\n }\n case ColumnSingleValueFilterOperator.IS_NULL:\n return { ...base, op: 'no_value' }\n case ColumnSingleValueFilterOperator.IS_NOT_NULL:\n return { ...base, op: 'has_value' }\n case ColumnSingleValueFilterOperator.LIKE: {\n const classified = classifyLikePattern(firstValue ?? '')\n return { ...base, op: classified.op, text: classified.text }\n }\n default:\n // Compile-time exhaustiveness guard; the log fires only if a new operator\n // is added to ColumnSingleValueFilterOperator without a case here.\n filter.operator satisfies never\n console.warn(\n `singleValueToCondition: unrecognized filter operator, falling back to 'equal' for column \"${filter.columnName}\"`,\n { operator: filter.operator },\n )\n return { ...base, op: 'equal' }\n }\n}\n\n// -----------------------------------------------------------------------------\n// Facets → QB (mode switch)\n// -----------------------------------------------------------------------------\n\n/**\n * Translate `selectedFacets` into a QB group whose children mirror each facet\n * (as an AND-combined, non-negated group). The reverse direction is not\n * generally possible; a QB → facets switch clears the tree.\n */\nexport function selectedFacetsToQBGroup(\n selectedFacets: FacetColumnRequest[],\n): QBGroup {\n return {\n kind: 'group',\n id: newId(),\n combinator: 'AND',\n not: false,\n children: selectedFacets\n .map(facetToQBCondition)\n .filter((c): c is QBCondition => c !== null),\n }\n}\n\nfunction facetToQBCondition(facet: FacetColumnRequest): QBCondition | null {\n if (isFacetColumnValuesRequest(facet)) {\n if (!facet.facetValues || facet.facetValues.length === 0) return null\n return {\n kind: 'condition',\n id: newId(),\n columnName: facet.columnName,\n columnType: null,\n op: 'is_any_of',\n values: [...facet.facetValues],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n }\n if (isFacetColumnRangeRequest(facet)) {\n const hasMin = facet.min != null && facet.min !== ''\n const hasMax = facet.max != null && facet.max !== ''\n if (!hasMin && !hasMax) return null\n const base = {\n kind: 'condition' as const,\n id: newId(),\n columnName: facet.columnName,\n columnType: null,\n values: [],\n text: null,\n }\n if (hasMin && hasMax) {\n return {\n ...base,\n op: 'between',\n rangeMin: facet.min!,\n rangeMax: facet.max!,\n }\n }\n if (hasMin) {\n return { ...base, op: 'gte', rangeMin: facet.min!, rangeMax: null }\n }\n return { ...base, op: 'lte', rangeMin: null, rangeMax: facet.max! }\n }\n return null\n}\n\n// -----------------------------------------------------------------------------\n// Utilities\n// -----------------------------------------------------------------------------\n\nlet idCounter = 0\nfunction newId(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID()\n }\n // Monotonic counter is sufficient — QB ids are client-only React keys, not secrets.\n idCounter += 1\n return `qb-${idCounter}`\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"queryBuilderTranslation.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderTranslation.ts"],"sourcesContent":["import {\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n FacetColumnRequest,\n FILTER_GROUP_CONCRETE_TYPE_VALUE,\n FilterGroup,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isFilterGroup,\n} from '../../utils/types/IsType'\nimport { isQBGroup, QBCondition, QBGroup, QBNode } from './QueryBuilderTypes'\n\nconst COLUMN_SINGLE_VALUE_QUERY_FILTER =\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter' as const\nconst COLUMN_MULTI_VALUE_FUNCTION_QUERY_FILTER =\n 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter' as const\n\n// -----------------------------------------------------------------------------\n// Column-kind classification\n// -----------------------------------------------------------------------------\n\n/** A multi-value list column is one whose column type ends in `_LIST`. */\nexport function isListColumn(columnType: string | null): boolean {\n return columnType?.endsWith('_LIST') ?? false\n}\n\n// -----------------------------------------------------------------------------\n// LIKE escaping / classification\n// -----------------------------------------------------------------------------\n\n/**\n * Escape SQL LIKE metacharacters (`%` and `_`) plus the escape character itself\n * (`\\`) so a user's literal `50%` isn't treated as a wildcard match.\n */\nexport function escapeLike(input: string): string {\n return input.replace(/[\\\\%_]/g, ch => '\\\\' + ch)\n}\n\n/**\n * Inverse of {@link escapeLike}: strip the backslash escapes that\n * {@link escapeLike} added.\n */\nexport function unescapeLike(input: string): string {\n return input.replace(/\\\\([\\\\%_])/g, '$1')\n}\n\n/**\n * Classify a LIKE pattern string produced by {@link qbNodeToApiFilter} back\n * into a QB op + un-escaped text. Handles the four wildcard shapes\n * produced by that function (`%val%`, `val%`, `%val`, `val`).\n */\nexport function classifyLikePattern(pattern: string): {\n op: 'contains' | 'starts_with' | 'ends_with' | 'is_exactly'\n text: string\n} {\n const startsPct = pattern.startsWith('%')\n // Only treat a trailing '%' as a wildcard if it isn't itself escaped\n const endsPct = /(?<!\\\\)%$/.test(pattern)\n const core = pattern.slice(startsPct ? 1 : 0, endsPct ? -1 : undefined)\n const text = unescapeLike(core)\n if (startsPct && endsPct) return { op: 'contains', text }\n if (endsPct) return { op: 'starts_with', text }\n if (startsPct) return { op: 'ends_with', text }\n return { op: 'is_exactly', text }\n}\n\n// -----------------------------------------------------------------------------\n// QB → API\n// -----------------------------------------------------------------------------\n\n/**\n * Convert a QB tree node into a `QueryFilter`. Returns `null` when the node\n * (or an entire subtree) has no complete conditions — an incomplete leaf and\n * an empty group are both treated as \"no constraint\" so partial user input\n * never contributes to the outgoing query.\n */\nexport function qbNodeToApiFilter(node: QBNode): QueryFilter | null {\n if (isQBGroup(node)) {\n const children = node.children\n .map(qbNodeToApiFilter)\n .filter((f): f is QueryFilter => f !== null)\n if (children.length === 0) return null\n const filter: FilterGroup = {\n concreteType: FILTER_GROUP_CONCRETE_TYPE_VALUE,\n operator: node.combinator,\n not: node.not || undefined,\n children,\n }\n return filter\n }\n return conditionToApiFilter(node)\n}\n\nfunction conditionToApiFilter(\n node: QBCondition,\n): ColumnSingleValueQueryFilter | ColumnMultiValueFunctionQueryFilter | null {\n const { columnName, columnType, op, values, rangeMin, rangeMax, text } = node\n if (columnName === null) return null\n\n switch (op) {\n case 'is_any_of':\n return anyOfFilter(columnName, columnType, values)\n case 'is_all_of':\n return values.length === 0\n ? null\n : makeMultiValueFilter(columnName, values)\n case 'between':\n return betweenFilter(columnName, rangeMin, rangeMax)\n case 'gt':\n return rangeBoundFilter(\n columnName,\n rangeMin,\n ColumnSingleValueFilterOperator.GREATER_THAN,\n )\n case 'gte':\n return rangeBoundFilter(\n columnName,\n rangeMin,\n ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL,\n )\n case 'lt':\n return rangeBoundFilter(\n columnName,\n rangeMax,\n ColumnSingleValueFilterOperator.LESS_THAN,\n )\n case 'lte':\n return rangeBoundFilter(\n columnName,\n rangeMax,\n ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL,\n )\n case 'equal':\n return equalityFilter(\n columnName,\n values,\n ColumnSingleValueFilterOperator.EQUAL,\n )\n case 'not_equal':\n return equalityFilter(\n columnName,\n values,\n ColumnSingleValueFilterOperator.NOT_EQUAL,\n )\n case 'has_value':\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IS_NOT_NULL,\n [],\n )\n case 'no_value':\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IS_NULL,\n [],\n )\n case 'contains':\n return likeFilter(columnName, text, escaped => `%${escaped}%`)\n case 'starts_with':\n return likeFilter(columnName, text, escaped => `${escaped}%`)\n case 'ends_with':\n return likeFilter(columnName, text, escaped => `%${escaped}`)\n case 'is_exactly':\n return isBlank(text)\n ? null\n : makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.EQUAL,\n [text!],\n )\n default: {\n // Compile-time exhaustiveness guard; the log fires only if a new op is\n // added to QBConditionOp without a case here.\n op satisfies never\n console.warn(\n `conditionToApiFilter: unrecognized QB op, skipping condition for column \"${columnName}\"`,\n { op },\n )\n return null\n }\n }\n}\n\nfunction isBlank(value: string | null | undefined): boolean {\n return value == null || value === ''\n}\n\nfunction anyOfFilter(\n columnName: string,\n columnType: string | null,\n values: string[],\n): ColumnSingleValueQueryFilter | ColumnMultiValueFunctionQueryFilter | null {\n if (values.length === 0) return null\n if (isListColumn(columnType)) return makeMultiValueFilter(columnName, values)\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.IN,\n values,\n )\n}\n\nfunction betweenFilter(\n columnName: string,\n rangeMin: string | null,\n rangeMax: string | null,\n): ColumnSingleValueQueryFilter | null {\n if (isBlank(rangeMin) || isBlank(rangeMax)) return null\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.BETWEEN,\n [rangeMin!, rangeMax!],\n )\n}\n\nfunction equalityFilter(\n columnName: string,\n values: string[],\n operator: ColumnSingleValueFilterOperator,\n): ColumnSingleValueQueryFilter | null {\n if (values.length === 0) return null\n return makeSingleValueFilter(columnName, operator, [values[0]])\n}\n\nfunction likeFilter(\n columnName: string,\n text: string | null,\n wrap: (escapedText: string) => string,\n): ColumnSingleValueQueryFilter | null {\n if (isBlank(text)) return null\n return makeSingleValueFilter(\n columnName,\n ColumnSingleValueFilterOperator.LIKE,\n [wrap(escapeLike(text!))],\n )\n}\n\nfunction makeSingleValueFilter(\n columnName: string,\n operator: ColumnSingleValueFilterOperator,\n values: string[],\n): ColumnSingleValueQueryFilter {\n return {\n concreteType: COLUMN_SINGLE_VALUE_QUERY_FILTER,\n columnName,\n operator,\n values,\n }\n}\n\nfunction makeMultiValueFilter(\n columnName: string,\n values: string[],\n): ColumnMultiValueFunctionQueryFilter {\n return {\n concreteType: COLUMN_MULTI_VALUE_FUNCTION_QUERY_FILTER,\n columnName,\n function: ColumnMultiValueFunction.HAS,\n _function: ColumnMultiValueFunction.HAS,\n values,\n }\n}\n\nfunction rangeBoundFilter(\n columnName: string,\n bound: string | null,\n operator: ColumnSingleValueFilterOperator,\n): ColumnSingleValueQueryFilter | null {\n if (bound == null || bound === '') return null\n return makeSingleValueFilter(columnName, operator, [bound])\n}\n\n// -----------------------------------------------------------------------------\n// API → QB (initial hydration)\n// -----------------------------------------------------------------------------\n\n/**\n * Convert an API `QueryFilter` back into a QB node. Used when the initial\n * query already contains a `FilterGroup` (see filterMode auto-detect) so the\n * QB tree can be reconstructed on mount.\n *\n * Some conversions are lossy — `HAS` always deserializes as `is_any_of` (we\n * can't distinguish it from an `is_all_of` at the API layer), and `EQUAL` on\n * text columns deserializes as `equal` (not `is_exactly`) because they share\n * the same wire representation. Users can adjust the operator picker.\n */\nexport function apiFilterToQBNode(filter: QueryFilter): QBNode | null {\n if (isFilterGroup(filter)) {\n const children = (filter.children ?? [])\n .map(apiFilterToQBNode)\n .filter((n): n is QBNode => n !== null)\n return {\n kind: 'group',\n id: newId(),\n combinator: filter.operator ?? 'AND',\n not: filter.not ?? false,\n children,\n }\n }\n if (isColumnSingleValueQueryFilter(filter)) {\n return singleValueToCondition(filter)\n }\n if (isColumnMultiValueFunctionQueryFilter(filter)) {\n return {\n kind: 'condition',\n id: newId(),\n columnName: filter.columnName,\n columnType: null,\n op: 'is_any_of',\n values: [...filter.values],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n }\n // TextMatchesQueryFilter and other non-QB filter types are not part of the\n // QB tree — they belong in the non-QB baseline.\n return null\n}\n\nfunction singleValueToCondition(\n filter: ColumnSingleValueQueryFilter,\n): QBCondition {\n const base = {\n kind: 'condition' as const,\n id: newId(),\n columnName: filter.columnName,\n columnType: null,\n values: [] as string[],\n rangeMin: null as string | null,\n rangeMax: null as string | null,\n text: null as string | null,\n }\n const [firstValue] = filter.values\n switch (filter.operator) {\n case ColumnSingleValueFilterOperator.IN:\n return { ...base, op: 'is_any_of', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.EQUAL:\n return { ...base, op: 'equal', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.NOT_EQUAL:\n return { ...base, op: 'not_equal', values: [...filter.values] }\n case ColumnSingleValueFilterOperator.GREATER_THAN:\n return { ...base, op: 'gt', rangeMin: firstValue ?? null }\n case ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL:\n return { ...base, op: 'gte', rangeMin: firstValue ?? null }\n case ColumnSingleValueFilterOperator.LESS_THAN:\n return { ...base, op: 'lt', rangeMax: firstValue ?? null }\n case ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL:\n return { ...base, op: 'lte', rangeMax: firstValue ?? null }\n case ColumnSingleValueFilterOperator.BETWEEN:\n return {\n ...base,\n op: 'between',\n rangeMin: filter.values[0] ?? null,\n rangeMax: filter.values[1] ?? null,\n }\n case ColumnSingleValueFilterOperator.IS_NULL:\n return { ...base, op: 'no_value' }\n case ColumnSingleValueFilterOperator.IS_NOT_NULL:\n return { ...base, op: 'has_value' }\n case ColumnSingleValueFilterOperator.LIKE: {\n const classified = classifyLikePattern(firstValue ?? '')\n return { ...base, op: classified.op, text: classified.text }\n }\n default:\n // Compile-time exhaustiveness guard; the log fires only if a new operator\n // is added to ColumnSingleValueFilterOperator without a case here.\n filter.operator satisfies never\n console.warn(\n `singleValueToCondition: unrecognized filter operator, falling back to 'equal' for column \"${filter.columnName}\"`,\n { operator: filter.operator },\n )\n return { ...base, op: 'equal' }\n }\n}\n\n// -----------------------------------------------------------------------------\n// Facets → QB (mode switch)\n// -----------------------------------------------------------------------------\n\n/**\n * Translate `selectedFacets` into a QB group whose children mirror each facet\n * (as an AND-combined, non-negated group). The reverse direction is not\n * generally possible; a QB → facets switch clears the tree.\n */\nexport function selectedFacetsToQBGroup(\n selectedFacets: FacetColumnRequest[],\n): QBGroup {\n return {\n kind: 'group',\n id: newId(),\n combinator: 'AND',\n not: false,\n children: selectedFacets\n .map(facetToQBCondition)\n .filter((c): c is QBCondition => c !== null),\n }\n}\n\nfunction facetToQBCondition(facet: FacetColumnRequest): QBCondition | null {\n if (isFacetColumnValuesRequest(facet)) {\n if (!facet.facetValues || facet.facetValues.length === 0) return null\n return {\n kind: 'condition',\n id: newId(),\n columnName: facet.columnName,\n columnType: null,\n op: 'is_any_of',\n values: [...facet.facetValues],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n }\n if (isFacetColumnRangeRequest(facet)) {\n const hasMin = facet.min != null && facet.min !== ''\n const hasMax = facet.max != null && facet.max !== ''\n if (!hasMin && !hasMax) return null\n const base = {\n kind: 'condition' as const,\n id: newId(),\n columnName: facet.columnName,\n columnType: null,\n values: [],\n text: null,\n }\n if (hasMin && hasMax) {\n return {\n ...base,\n op: 'between',\n rangeMin: facet.min!,\n rangeMax: facet.max!,\n }\n }\n if (hasMin) {\n return { ...base, op: 'gte', rangeMin: facet.min!, rangeMax: null }\n }\n return { ...base, op: 'lte', rangeMin: null, rangeMax: facet.max! }\n }\n return null\n}\n\n// -----------------------------------------------------------------------------\n// Utilities\n// -----------------------------------------------------------------------------\n\nlet idCounter = 0\nfunction newId(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID()\n }\n // Monotonic counter is sufficient — QB ids are client-only React keys, not secrets.\n idCounter += 1\n return `qb-${idCounter}`\n}\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import l from "dayjs";
9
9
  //#region src/components/QueryWrapperPlotNav/LastUpdatedOn.tsx
10
10
  function u() {
11
11
  let { showLastUpdatedOn: r } = n(), { data: i } = t();
12
- return r && i && i.lastUpdatedOn ? /* @__PURE__ */ s("div", {
12
+ return r && i?.lastUpdatedOn ? /* @__PURE__ */ s("div", {
13
13
  style: {
14
14
  display: "flex",
15
15
  flexDirection: "column",
@@ -1 +1 @@
1
- {"version":3,"file":"LastUpdatedOn.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/LastUpdatedOn.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport { Skeleton, Typography } from '@mui/material'\nimport dayjs from 'dayjs'\nimport { Suspense } from 'react'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\n\nfunction LastUpdatedOn() {\n const { showLastUpdatedOn } = useQueryVisualizationContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n\n return showLastUpdatedOn && queryMetadata && queryMetadata.lastUpdatedOn ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n }}\n >\n <Typography variant=\"body1Italic\">\n Last updated on {formatDate(dayjs(queryMetadata.lastUpdatedOn))}\n </Typography>\n </div>\n ) : (\n <></>\n )\n}\n\nexport default function LastUpdatedOnWithSuspense() {\n const { showLastUpdatedOn } = useQueryVisualizationContext()\n if (!showLastUpdatedOn) {\n return <></>\n }\n return (\n <Suspense fallback={<Skeleton width={100}></Skeleton>}>\n <LastUpdatedOn />\n </Suspense>\n )\n}\n"],"mappings":";;;;;;;;;AAOA,SAAS,IAAgB;CACvB,IAAM,EAAE,yBAAsB,EAA6B,GACrD,EAAE,MAAM,MAAkB,EAA4B;CAE5D,OAAO,KAAqB,KAAiB,EAAc,gBACzD,kBAAC,OAAD;EACE,OAAO;GACL,SAAS;GACT,eAAe;GACf,YAAY;EACd;YAEA,kBAAC,GAAD;GAAY,SAAQ;aAApB,CAAkC,oBACf,EAAW,EAAM,EAAc,aAAa,CAAC,CACpD;;CACT,CAAA,IAEL,kBAAA,GAAA,CAAI,CAAA;AAER;AAEA,SAAwB,IAA4B;CAClD,IAAM,EAAE,yBAAsB,EAA6B;CAI3D,OAHK,IAIH,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAU,OAAO,IAAe,CAAA;YAClD,kBAAC,GAAD,CAAgB,CAAA;CACR,CAAA,IALH,kBAAA,GAAA,CAAI,CAAA;AAOf"}
1
+ {"version":3,"file":"LastUpdatedOn.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/LastUpdatedOn.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport { Skeleton, Typography } from '@mui/material'\nimport dayjs from 'dayjs'\nimport { Suspense } from 'react'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\n\nfunction LastUpdatedOn() {\n const { showLastUpdatedOn } = useQueryVisualizationContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n\n return showLastUpdatedOn && queryMetadata?.lastUpdatedOn ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n }}\n >\n <Typography variant=\"body1Italic\">\n Last updated on {formatDate(dayjs(queryMetadata.lastUpdatedOn))}\n </Typography>\n </div>\n ) : (\n <></>\n )\n}\n\nexport default function LastUpdatedOnWithSuspense() {\n const { showLastUpdatedOn } = useQueryVisualizationContext()\n if (!showLastUpdatedOn) {\n return <></>\n }\n return (\n <Suspense fallback={<Skeleton width={100}></Skeleton>}>\n <LastUpdatedOn />\n </Suspense>\n )\n}\n"],"mappings":";;;;;;;;;AAOA,SAAS,IAAgB;CACvB,IAAM,EAAE,yBAAsB,EAA6B,GACrD,EAAE,MAAM,MAAkB,EAA4B;CAE5D,OAAO,KAAqB,GAAe,gBACzC,kBAAC,OAAD;EACE,OAAO;GACL,SAAS;GACT,eAAe;GACf,YAAY;EACd;YAEA,kBAAC,GAAD;GAAY,SAAQ;aAApB,CAAkC,oBACf,EAAW,EAAM,EAAc,aAAa,CAAC,CACpD;;CACT,CAAA,IAEL,kBAAA,GAAA,CAAI,CAAA;AAER;AAEA,SAAwB,IAA4B;CAClD,IAAM,EAAE,yBAAsB,EAA6B;CAI3D,OAHK,IAIH,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAU,OAAO,IAAe,CAAA;YAClD,kBAAC,GAAD,CAAgB,CAAA;CACR,CAAA,IALH,kBAAA,GAAA,CAAI,CAAA;AAOf"}
@@ -39,7 +39,7 @@ type QueryWrapperPlotNavOwnProps = {
39
39
  hideTopLevelControls?: boolean;
40
40
  } & Omit<TopLevelControlsProps, 'entityId'> & Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> & Pick<QueryWrapperProps, 'isRowSelectionVisible' | 'rowSelectionPrimaryKey' | 'isRowSelectionUIFloating' | 'fileIdColumnName' | 'fileNameColumnName' | 'fileVersionColumnName'> & Pick<QueryVisualizationWrapperProps, 'defaultShowPlots' | 'visibleColumnCount' | 'hiddenColumns' | 'columnAliases' | 'renderFacetValue' | 'rgbIndex' | 'showLastUpdatedOn' | 'noContentPlaceholderType' | 'unitDescription' | 'additionalFiltersSessionStorageKey' | 'helpConfiguration' | 'hideCopyToClipboard' | 'hideSearchBarControl' | 'hideVisualizationsControl' | 'enabledExternalAnalysisPlatforms' | 'lockTextMatchesQueryFilterPill'> & Pick<QueryContextType, 'combineRangeFacetConfig'>;
41
41
  export type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams & PlotsContainerProps & QueryWrapperPlotNavOwnProps;
42
- export type QueryWrapperPlotNavContentsProps = Pick<QueryWrapperPlotNavProps, 'tableConfiguration' | 'name' | 'cardConfiguration' | 'facetsToPlot' | 'availableFacets' | 'initialExpandedFacetControls' | 'hideDownload' | 'hideQueryCount' | 'hideSqlEditorControl' | 'hideVisualizationsControl' | 'searchConfiguration' | 'enabledExternalAnalysisPlatforms' | 'cavaticaConnectAccountURL' | 'customControls' | 'customPlots' | 'fileIdColumnName' | 'fileNameColumnName' | 'fileVersionColumnName' | 'initialLimit' | 'initialPlotTypeByFacetColumnName' | 'hideTopLevelControls'> & {
42
+ export type QueryWrapperPlotNavContentsProps = Pick<QueryWrapperPlotNavProps, 'tableConfiguration' | 'name' | 'cardConfiguration' | 'facetsToPlot' | 'availableFacets' | 'initialExpandedFacetControls' | 'hideDownload' | 'hideAddToDownloadListMenuItem' | 'hideProgrammaticOptionsMenuItem' | 'hideQueryCount' | 'hideSqlEditorControl' | 'hideVisualizationsControl' | 'searchConfiguration' | 'enabledExternalAnalysisPlatforms' | 'cavaticaConnectAccountURL' | 'customControls' | 'customPlots' | 'fileIdColumnName' | 'fileNameColumnName' | 'fileVersionColumnName' | 'initialLimit' | 'initialPlotTypeByFacetColumnName' | 'hideTopLevelControls'> & {
43
43
  isFullTextSearchEnabled: boolean;
44
44
  remount?: () => void;
45
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"QueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAiBlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAItE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAGL,8BAA8B,EAC/B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAgB,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAElE,OAAyB,EACvB,qBAAqB,EACrB,aAAa,EACd,MAAM,mDAAmD,CAAA;AAG1D,OAAuB,EACrB,mBAAmB,EACpB,MAAM,qCAAqC,CAAA;AAC5C,OAA4B,EAC1B,wBAAwB,EACzB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAIxE,eAAO,MAAM,0BAA0B,EAAE,MAAgC,CAAA;AACzE,eAAO,MAAM,2BAA2B,EAAE,MAA+B,CAAA;AAEzE,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAA;AAE9D,KAAK,2BAA2B,GAAG;IACjC,2HAA2H;IAC3H,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iLAAiL;IACjL,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mFAAmF;IACnF,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9C,2GAA2G;IAC3G,yBAAyB,CAAC,EAAE,CAAC,wBAAwB,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,mBAAmB,CAAC,EAAE,IAAI,CACxB,aAAa,EACb,cAAc,GAAG,2BAA2B,CAC7C,CAAA;IACD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC7D,4BAA4B,CAAC,EAAE,wBAAwB,CAAC,8BAA8B,CAAC,CAAA;IACvF,WAAW,CAAC,EAAE,4BAA4B,EAAE,CAAA;IAC5C,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAA;IAChD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,GAAG,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,GACzC,IAAI,CAAC,mCAAmC,EAAE,mBAAmB,CAAC,GAC9D,IAAI,CACF,iBAAiB,EACf,uBAAuB,GACvB,wBAAwB,GACxB,0BAA0B,GAC1B,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,CAC1B,GACD,IAAI,CACF,8BAA8B,EAC5B,kBAAkB,GAClB,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,UAAU,GACV,mBAAmB,GACnB,0BAA0B,GAC1B,iBAAiB,GACjB,oCAAoC,GACpC,mBAAmB,GACnB,qBAAqB,GACrB,sBAAsB,GACtB,2BAA2B,GAC3B,kCAAkC,GAClC,gCAAgC,CACnC,GACD,IAAI,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAA;AAEnD,MAAM,MAAM,wBAAwB,GAAG,6BAA6B,GAClE,mBAAmB,GACnB,2BAA2B,CAAA;AAE7B,MAAM,MAAM,gCAAgC,GAAG,IAAI,CACjD,wBAAwB,EACtB,oBAAoB,GACpB,MAAM,GACN,mBAAmB,GACnB,cAAc,GACd,iBAAiB,GACjB,8BAA8B,GAC9B,cAAc,GACd,+BAA+B,GAC/B,iCAAiC,GACjC,gBAAgB,GAChB,sBAAsB,GACtB,2BAA2B,GAC3B,qBAAqB,GACrB,kCAAkC,GAClC,2BAA2B,GAC3B,gBAAgB,GAChB,aAAa,GACb,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,cAAc,GACd,kCAAkC,GAClC,sBAAsB,CACzB,GAAG;IACF,uBAAuB,EAAE,OAAO,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,2CA8JxC;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CA0H1E"}