synapse-react-client 4.0.36 → 4.0.38

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 +15 -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 +5 -5
@@ -38,36 +38,38 @@ import { useAtomValue as P } from "jotai";
38
38
  //#region src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx
39
39
  var F = "isShowingFacetFilters", I = "isHidingFacetFilters", L = "hasSelectedRows";
40
40
  function R(e) {
41
- let { tableConfiguration: t, name: n, cardConfiguration: i, facetsToPlot: s, availableFacets: l, initialExpandedFacetControls: d, hideDownload: g, hideQueryCount: E, hideSqlEditorControl: D, hideVisualizationsControl: R, searchConfiguration: z, cavaticaConnectAccountURL: B, customControls: V, remount: H = () => {}, isFullTextSearchEnabled: U, customPlots: ee, initialLimit: W, initialPlotTypeByFacetColumnName: G, hideTopLevelControls: K } = e, q = o(), [J, Y] = O(!1), { hasFacetedSelectColumn: X, queryMetadataQueryOptions: Z } = q, { isLoading: Q } = N(Z), te = P(u), $ = q.currentQueryRequest, ne = $?.query.selectedFacets !== void 0 && $.query.selectedFacets.length > 0 || $?.query.additionalFilters !== void 0 && $?.query.additionalFilters.length > 0, re = y();
41
+ let { tableConfiguration: t, name: n, cardConfiguration: i, facetsToPlot: s, availableFacets: l, initialExpandedFacetControls: d, hideDownload: g, hideAddToDownloadListMenuItem: E, hideProgrammaticOptionsMenuItem: D, hideQueryCount: R, hideSqlEditorControl: z, hideVisualizationsControl: B, searchConfiguration: V, cavaticaConnectAccountURL: H, customControls: U, remount: W = () => {}, isFullTextSearchEnabled: ee, customPlots: G, initialLimit: K, initialPlotTypeByFacetColumnName: q, hideTopLevelControls: J } = e, Y = o(), [X, Z] = O(!1), { hasFacetedSelectColumn: Q, queryMetadataQueryOptions: te } = Y, { isLoading: ne } = N(te), re = P(u), $ = Y.currentQueryRequest, ie = $?.query.selectedFacets !== void 0 && $.query.selectedFacets.length > 0 || $?.query.additionalFilters !== void 0 && $?.query.additionalFilters.length > 0, ae = y();
42
42
  return /* @__PURE__ */ j(c, { children: (e) => {
43
43
  if (e === void 0) throw Error("No queryVisualizationContext found when using QueryVisualizationContextConsumer");
44
44
  return /* @__PURE__ */ j(k, {
45
- className: `QueryWrapperPlotNav ${e.showFacetFilter ? F : I} ${te ? L : ""} ${K ? "isHidingTopLevelControls" : ""}`,
46
- sx: { "*": { cursor: Q ? "wait" : void 0 } },
45
+ className: `QueryWrapperPlotNav ${e.showFacetFilter ? F : I} ${re ? L : ""} ${J ? "isHidingTopLevelControls" : ""}`,
46
+ sx: { "*": { cursor: ne ? "wait" : void 0 } },
47
47
  children: /* @__PURE__ */ M(m, { children: [
48
- U ? /* @__PURE__ */ j(b, { ftsConfig: z?.ftsConfig }) : /* @__PURE__ */ j(x, {
49
- ...z,
50
- queryContext: q,
48
+ ee ? /* @__PURE__ */ j(b, { ftsConfig: V?.ftsConfig }) : /* @__PURE__ */ j(x, {
49
+ ...V,
50
+ queryContext: Y,
51
51
  queryVisualizationContext: e
52
52
  }),
53
53
  /* @__PURE__ */ j(p, {}),
54
54
  e.showDownloadConfirmation && /* @__PURE__ */ j(a, {
55
- addToDownloadListRequest: re,
55
+ addToDownloadListRequest: ae,
56
56
  onClose: () => e.setShowDownloadConfirmation(!1)
57
57
  }),
58
- !K && /* @__PURE__ */ j(r, { children: /* @__PURE__ */ j(S, {
58
+ !J && /* @__PURE__ */ j(r, { children: /* @__PURE__ */ j(S, {
59
59
  showColumnSelection: t !== void 0,
60
60
  name: n,
61
61
  hideDownload: g,
62
- hideQueryCount: E,
63
- hideFacetFilterControl: !X,
64
- hideVisualizationsControl: !X || R,
65
- hideSqlEditorControl: D,
66
- cavaticaConnectAccountURL: B,
67
- remount: H,
68
- customControls: V
62
+ hideAddToDownloadListMenuItem: E,
63
+ hideProgrammaticOptionsMenuItem: D,
64
+ hideQueryCount: R,
65
+ hideFacetFilterControl: !Q,
66
+ hideVisualizationsControl: !Q || B,
67
+ hideSqlEditorControl: z,
68
+ cavaticaConnectAccountURL: H,
69
+ remount: W,
70
+ customControls: U
69
71
  }) }),
70
- X && /* @__PURE__ */ j(A, { children: /* @__PURE__ */ j(v, {
72
+ Q && /* @__PURE__ */ j(A, { children: /* @__PURE__ */ j(v, {
71
73
  availableFacets: l,
72
74
  initialExpandedFacetControls: d
73
75
  }) }),
@@ -75,28 +77,28 @@ function R(e) {
75
77
  fallback: null,
76
78
  children: /* @__PURE__ */ j(f, {
77
79
  frontText: "",
78
- endText: ne ? "filtered by" : "",
80
+ endText: ie ? "filtered by" : "",
79
81
  hideIfUnfiltered: !0
80
82
  })
81
83
  }),
82
84
  /* @__PURE__ */ j(C, {
83
- customControls: V,
84
- remount: H
85
+ customControls: U,
86
+ remount: W
85
87
  }),
86
88
  /* @__PURE__ */ j(w, {
87
89
  facetsToPlot: s,
88
- customPlots: ee,
89
- initialPlotTypeByFacetColumnName: G
90
+ customPlots: G,
91
+ initialPlotTypeByFacetColumnName: q
90
92
  }),
91
93
  /* @__PURE__ */ j(_, {
92
94
  tableConfiguration: t,
93
95
  hideDownload: g,
94
96
  cardConfiguration: i,
95
- initialLimit: W
97
+ initialLimit: K
96
98
  }),
97
- J && /* @__PURE__ */ j(h, {
98
- getLastQueryRequest: q?.getCurrentQueryRequest,
99
- onClose: () => Y(!1)
99
+ X && /* @__PURE__ */ j(h, {
100
+ getLastQueryRequest: Y?.getCurrentQueryRequest,
101
+ onClose: () => Z(!1)
100
102
  })
101
103
  ] })
102
104
  });
@@ -1 +1 @@
1
- {"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'hiddenColumns'\n | 'columnAliases'\n | 'renderFacetValue'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n | 'lockTextMatchesQueryFilterPill'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\nexport type QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount?: () => void\n}\n\nexport function QueryWrapperPlotNavContents(\n props: QueryWrapperPlotNavContentsProps,\n) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount = () => {},\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n {/* Isolated Suspense so that metadata loading does not hide the table */}\n <Suspense fallback={null}>\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n </Suspense>\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n renderFacetValue={props.renderFacetValue}\n dataUseModifiersColumnName={\n props.cardConfiguration?.genericCardSchema\n ?.dataUseModifiersColumnName\n }\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n hiddenColumns={props.hiddenColumns}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'hiddenColumns'\n | 'columnAliases'\n | 'renderFacetValue'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n | 'lockTextMatchesQueryFilterPill'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\nexport type QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideAddToDownloadListMenuItem'\n | 'hideProgrammaticOptionsMenuItem'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount?: () => void\n}\n\nexport function QueryWrapperPlotNavContents(\n props: QueryWrapperPlotNavContentsProps,\n) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideAddToDownloadListMenuItem,\n hideProgrammaticOptionsMenuItem,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount = () => {},\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideAddToDownloadListMenuItem={\n hideAddToDownloadListMenuItem\n }\n hideProgrammaticOptionsMenuItem={\n hideProgrammaticOptionsMenuItem\n }\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n {/* Isolated Suspense so that metadata loading does not hide the table */}\n <Suspense fallback={null}>\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n </Suspense>\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n renderFacetValue={props.renderFacetValue}\n dataUseModifiersColumnName={\n props.cardConfiguration?.genericCardSchema\n ?.dataUseModifiersColumnName\n }\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n hiddenColumns={props.hiddenColumns}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":"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"}
@@ -52,15 +52,6 @@ export declare function convertToArray<T>(value: T): Array<unknown>;
52
52
  * @param validationSchema
53
53
  */
54
54
  export declare function shouldLiveValidate(existingAnnotations: Record<string, unknown> | undefined, validationSchema: JSONSchema7 | undefined): boolean;
55
- /**
56
- * Returns all possible properties in the schema, including those in nested schemas/definitions. Note that this function
57
- * only works for 'flat objects', i.e. the schema must
58
- * - define an object AND
59
- * - the properties of the object cannot be objects
60
- * which is compatible with how Synapse Annotations are defined.
61
- * @param resolvedSchema
62
- */
63
- export declare function getPossibleTopLevelPropertiesInObjectSchema(resolvedSchema: JSONSchema7): JSONSchema7['properties'];
64
55
  /**
65
56
  * Get the Synapse entity schema ID for a particular concrete type.
66
57
  * @param concreteType
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationEditorUtils.d.ts","sourceRoot":"","sources":["../../../src/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,iFAAiF,CAAA;AACjI,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAIzC;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,GAAE,WAAgB,EAClC,YAAY,GAAE,WAAgB,GAC7B,WAAW,CAyBb;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,0BAA0B,GAAE,WAAW,CAAC,YAAY,CAAM;;;;;;;;EAiB3D;AACD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAS1E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,EAAE,GAC5B,mBAAmB,EAAE,CA2CvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxD,gBAAgB,EAAE,WAAW,GAAG,SAAS,GACxC,OAAO,CAIT;AAED;;;;;;;GAOG;AACH,wBAAgB,2CAA2C,CACzD,cAAc,EAAE,WAAW,GAC1B,WAAW,CAAC,YAAY,CAAC,CAc3B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,kBAAkB,EACrC,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAOR"}
1
+ {"version":3,"file":"AnnotationEditorUtils.d.ts","sourceRoot":"","sources":["../../../src/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,iFAAiF,CAAA;AAEjI,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,GAAE,WAAgB,EAClC,YAAY,GAAE,WAAgB,GAC7B,WAAW,CAwBb;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,0BAA0B,GAAE,WAAW,CAAC,YAAY,CAAM;;;;;;;;EAiB3D;AACD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAS1E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,EAAE,GAC5B,mBAAmB,EAAE,CA2CvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxD,gBAAgB,EAAE,WAAW,GAAG,SAAS,GACxC,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,kBAAkB,EACrC,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAOR"}
@@ -1,25 +1,25 @@
1
1
  import { AdditionalPropertiesSchemaField as e } from "./field/AdditionalPropertiesSchemaField.js";
2
- import { flatMap as t, groupBy as n, isEmpty as r, isObject as i } from "lodash-es";
2
+ import { collectTopLevelProperties as t } from "../../utils/jsonschema/collectTopLevelProperties.js";
3
+ import { flatMap as n, groupBy as r, isEmpty as i } from "lodash-es";
3
4
  import { TranslatableString as a, englishStringTranslator as o } from "@rjsf/utils";
4
- import { JSONPath as s } from "jsonpath-plus";
5
5
  //#region src/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.ts
6
- function c(e = {}, t = {}) {
7
- let n = g(t);
6
+ function s(e = {}, n = {}) {
7
+ let r = t(n);
8
8
  return {
9
9
  $schema: "http://json-schema.org/draft-07/schema#",
10
10
  ...e,
11
11
  definitions: {
12
- ...t.definitions,
12
+ ...n.definitions,
13
13
  ...e.definitions
14
14
  },
15
15
  allOf: [...e.allOf || [], {
16
16
  type: "object",
17
- properties: n
17
+ properties: r
18
18
  }],
19
19
  additionalProperties: !0
20
20
  };
21
21
  }
22
- function l(t = {}) {
22
+ function c(t = {}) {
23
23
  return {
24
24
  ...Object.keys(t).reduce((e, t) => ({
25
25
  ...e,
@@ -32,50 +32,42 @@ function l(t = {}) {
32
32
  additionalProperties: { "ui:field": e }
33
33
  };
34
34
  }
35
- function u(e) {
35
+ function l(e) {
36
36
  let t = {};
37
37
  return Object.keys(e).forEach((n) => {
38
- let i = e[n];
39
- Array.isArray(i) ? (i = i.filter((e) => e != null), r(i) || (t[n] = i)) : t[n] = i;
38
+ let r = e[n];
39
+ Array.isArray(r) ? (r = r.filter((e) => e != null), i(r) || (t[n] = r)) : t[n] = r;
40
40
  }), t;
41
41
  }
42
- function d(e = {}) {
42
+ function u(e = {}) {
43
43
  return Object.keys(e).reduce((t, n) => (e[n] !== null && (t[n] = e[n]), t), {});
44
44
  }
45
- function f(e) {
45
+ function d(e) {
46
46
  return e.property?.startsWith("[") ? e.property.substring(2, e.property.length - 2) : e.property?.startsWith(".") ? e.property.substring(1) : e.property || "";
47
47
  }
48
- function p(e) {
49
- let r = n(e, (e) => e.property);
50
- return Object.keys(r).map((e) => {
51
- let t = r[e];
52
- t.some((e) => e.message === "should match some schema in anyOf") && t.every((e) => e.message === "should be string" || e.message === "should be equal to constant" ? !0 : e.message === "should match some schema in anyOf") && t.length > 0 && (t[0].message = "should be equal to one of the allowed values", r[e] = [t[0]]);
53
- }), e = t(r), e;
48
+ function f(e) {
49
+ let t = r(e, (e) => e.property);
50
+ return Object.keys(t).map((e) => {
51
+ let n = t[e];
52
+ n.some((e) => e.message === "should match some schema in anyOf") && n.every((e) => e.message === "should be string" || e.message === "should be equal to constant" ? !0 : e.message === "should match some schema in anyOf") && n.length > 0 && (n[0].message = "should be equal to one of the allowed values", t[e] = [n[0]]);
53
+ }), e = n(t), e;
54
54
  }
55
- function m(e) {
55
+ function p(e) {
56
56
  return Array.isArray(e) ? e : [e];
57
57
  }
58
- function h(e, t) {
58
+ function m(e, t) {
59
59
  return !!(e && Object.keys(e).length > 0 && t);
60
60
  }
61
- function g(e) {
62
- let t = {}, n = s({
63
- path: "$..properties",
64
- json: e
65
- });
66
- for (let e of n) Object.assign(t, e);
67
- return i(e.properties) && Object.assign(t, e.properties), t;
68
- }
69
- function _(e) {
61
+ function h(e) {
70
62
  return !e || !e.startsWith("org.sagebionetworks") ? null : "org.sagebionetworks-" + e.substring(20);
71
63
  }
72
- function v(e, t) {
64
+ function g(e, t) {
73
65
  switch (e) {
74
66
  case a.NewStringDefault: return "";
75
67
  default: return o(e, t);
76
68
  }
77
69
  }
78
70
  //#endregion
79
- export { m as convertToArray, v as customTranslateString, d as dropNullValues, u as dropNullishArrayValues, f as getFriendlyPropertyName, c as getJsonSchemaForForm, g as getPossibleTopLevelPropertiesInObjectSchema, _ as getSchemaIdForConcreteType, l as getUiSchemaForForm, h as shouldLiveValidate, p as transformErrors };
71
+ export { p as convertToArray, g as customTranslateString, u as dropNullValues, l as dropNullishArrayValues, d as getFriendlyPropertyName, s as getJsonSchemaForForm, h as getSchemaIdForConcreteType, c as getUiSchemaForForm, m as shouldLiveValidate, f as transformErrors };
80
72
 
81
73
  //# sourceMappingURL=AnnotationEditorUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationEditorUtils.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.ts"],"sourcesContent":["import { AdditionalPropertiesSchemaField } from '@/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField'\nimport {\n englishStringTranslator,\n RJSFValidationError,\n TranslatableString,\n} from '@rjsf/utils'\nimport { JSONSchema7 } from 'json-schema'\nimport { JSONPath } from 'jsonpath-plus'\nimport { flatMap, groupBy, isEmpty, isObject } from 'lodash-es'\n\n/**\n * Generates a JSON schema for the form UI based on the provided validation schema and entity schema base properties.\n *\n * To meet the requirements of the desired form to display, we cannot simply show the validation schema. This is because\n * validation schemas may use conditional logic based on default entity properties (e.g. concreteType) to show/hide fields.\n * This method combines the validation schema with the entity schema base properties to create a new schema that will yield\n * the expected form with desired logic.\n * @param validationSchema\n * @param entitySchema\n */\nexport function getJsonSchemaForForm(\n validationSchema: JSONSchema7 = {},\n entitySchema: JSONSchema7 = {},\n): JSONSchema7 {\n const entitySchemaProperties =\n getPossibleTopLevelPropertiesInObjectSchema(entitySchema)\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n // Spread the validation schema to ensure all other references are included\n // Top level properties like \"$defs\" get lost if we simply put the entire schema in `allOf`\n ...validationSchema,\n // JSON Schemas for Synapse types use \"definitions\", so it should be manually merged.\n definitions: {\n ...entitySchema.definitions,\n ...validationSchema.definitions,\n },\n allOf: [\n ...(validationSchema.allOf || []),\n // Add in the entity properties\n {\n type: 'object',\n properties: entitySchemaProperties,\n },\n ],\n // Always allow adding additional annotations (though it may violate the validationSchema)\n additionalProperties: true,\n }\n}\n\n/**\n * Generates the UiSchema for the annotations editor.\n * @param entitySchemaBaseProperties\n */\nexport function getUiSchemaForForm(\n entitySchemaBaseProperties: JSONSchema7['properties'] = {},\n) {\n // Each 'base' entity field (id, name, concreteType, etc.) should be hidden\n const uiSchemaWithHiddenEntityProperties = Object.keys(\n entitySchemaBaseProperties,\n ).reduce((prev, curr) => ({ ...prev, [curr]: { 'ui:widget': 'hidden' } }), {})\n\n return {\n ...uiSchemaWithHiddenEntityProperties,\n 'ui:globalOptions': {\n copyable: false, // copy button clutters the UI, is not very useful since schemas are flat objects\n duplicateKeySuffixSeparator: '_', // the default duplicateKeySuffixSeparator creates invalid annotation keys\n },\n additionalProperties: {\n 'ui:field': AdditionalPropertiesSchemaField,\n },\n }\n}\n/**\n * Strips null values from arrays in the provided form data. If the array is empty after\n * removing null values, the key is removed from the form data.\n *\n * This allows users to submit forms with empty array fields (SWC-5762)\n */\nexport function dropNullishArrayValues(\n formData: Record<string, unknown>,\n): Record<string, unknown> {\n const newFormData: Record<string, unknown> = {}\n Object.keys(formData).forEach(key => {\n let value = formData[key]\n if (Array.isArray(value)) {\n value = value.filter((item: any) => item != null)\n if (!isEmpty(value)) {\n newFormData[key] = value\n }\n } else {\n newFormData[key] = value\n }\n })\n return newFormData\n}\n\nexport function dropNullValues(\n formData: Record<string, unknown> = {},\n): Record<string, unknown> {\n return Object.keys(formData).reduce(\n (acc: Record<string, unknown>, key: string) => {\n if (formData[key] !== null) {\n acc[key] = formData[key]\n }\n return acc\n },\n {},\n )\n}\n\n/**\n * Inspects the property of the AjvError and modifies it to be comparable to simple key strings, like entity property keys.\n * @param error\n * @returns\n */\nexport function getFriendlyPropertyName(error: RJSFValidationError): string {\n if (error.property?.startsWith('[')) {\n // Additional properties are surrounded by brackets and quotations, so let's remove them\n return error.property.substring(2, error.property.length - 2)\n } else if (error.property?.startsWith('.')) {\n return error.property.substring(1)\n } else {\n return error.property || ''\n }\n}\n\nexport function transformErrors(\n errors: RJSFValidationError[],\n): RJSFValidationError[] {\n // Transform the errors in the following ways:\n // - Simplify the set of errors when failing to select an enumeration defined with an anyOf (SWC-5724)\n // - Show a custom error message when using a property that collides with an internal entity property (SWC-5678)\n\n // Fixing anyOf errors\n // Group the errors by the property that the error applies to\n const grouped = groupBy(errors, error => error.property)\n Object.keys(grouped).map(property => {\n const errorGroup = grouped[property]\n\n // First, see if it is an anyOf error\n const hasAnyOfError = errorGroup.some(\n e => e.message === 'should match some schema in anyOf',\n )\n\n // We determine if it's an anyOf *enum* error if all error messages in the property match one of these three messages:\n const isEnumError =\n hasAnyOfError &&\n errorGroup.every(error => {\n if (error.message === 'should be string') {\n return true\n } else if (error.message === 'should be equal to constant') {\n return true\n } else if (error.message === 'should match some schema in anyOf') {\n return true\n } else {\n return false\n }\n })\n\n // If it's an anyOf enum error, we just modify the first message and drop the rest\n if (isEnumError && errorGroup.length > 0) {\n errorGroup[0].message = 'should be equal to one of the allowed values'\n grouped[property] = [errorGroup[0]]\n }\n })\n\n // Ungroup the errors after potentially modifying them\n errors = flatMap(grouped)\n\n // Return the transformed errors.\n return errors\n}\n\n/**\n * Custom annotations in Synapse are always arrays. This function converts initial data to be an array type.\n * If the initial data is an array, return the data itself.\n * Otherwise, wrap the data in an array.\n */\nexport function convertToArray<T>(value: T): Array<unknown> {\n if (Array.isArray(value)) {\n return value\n } else {\n return [value]\n }\n}\n\n/**\n * Returns true if the default behavior of the form should be to live validate\n * @param existingAnnotations\n * @param validationSchema\n */\nexport function shouldLiveValidate(\n existingAnnotations: Record<string, unknown> | undefined,\n validationSchema: JSONSchema7 | undefined,\n): boolean {\n const hasExistingAnnotations =\n existingAnnotations && Object.keys(existingAnnotations).length > 0\n return Boolean(hasExistingAnnotations && validationSchema)\n}\n\n/**\n * Returns all possible properties in the schema, including those in nested schemas/definitions. Note that this function\n * only works for 'flat objects', i.e. the schema must\n * - define an object AND\n * - the properties of the object cannot be objects\n * which is compatible with how Synapse Annotations are defined.\n * @param resolvedSchema\n */\nexport function getPossibleTopLevelPropertiesInObjectSchema(\n resolvedSchema: JSONSchema7,\n): JSONSchema7['properties'] {\n const allProperties = {}\n const foundPropertiesObjects = JSONPath({\n path: '$..properties',\n json: resolvedSchema,\n })\n for (const propertiesObject of foundPropertiesObjects) {\n Object.assign(allProperties, propertiesObject)\n }\n // Use the schema.properties to override any properties defined in definitions\n if (isObject(resolvedSchema.properties)) {\n Object.assign(allProperties, resolvedSchema.properties)\n }\n return allProperties\n}\n\n/**\n * Get the Synapse entity schema ID for a particular concrete type.\n * @param concreteType\n */\nexport function getSchemaIdForConcreteType(\n concreteType: string,\n): string | null {\n if (!concreteType || !concreteType.startsWith('org.sagebionetworks')) {\n return null\n }\n // e.g. 'org.sagebionetworks.repo.model.FileEntity' -> 'org.sagebionetworks-repo.model.FileEntity'\n return (\n 'org.sagebionetworks-' +\n concreteType.substring('org.sagebionetworks'.length + 1)\n )\n}\n\n/**\n * Custom string translator for react-jsonschema-form.\n * Overrides the translation for \"NewStringDefault\" by returning an empty string.\n * For all other keys, falls back to the default English string translator.\n *\n * @param stringToTranslate\n * @param params - Optional parameters used to format the translated string.\n * @returns - The translated string.\n */\nexport function customTranslateString(\n stringToTranslate: TranslatableString,\n params?: string[],\n): string {\n switch (stringToTranslate) {\n case TranslatableString.NewStringDefault:\n return ''\n default:\n return englishStringTranslator(stringToTranslate, params)\n }\n}\n"],"mappings":";;;;;AAoBA,SAAgB,EACd,IAAgC,CAAC,GACjC,IAA4B,CAAC,GAChB;CACb,IAAM,IACJ,EAA4C,CAAY;CAE1D,OAAO;EACL,SAAS;EAGT,GAAG;EAEH,aAAa;GACX,GAAG,EAAa;GAChB,GAAG,EAAiB;EACtB;EACA,OAAO,CACL,GAAI,EAAiB,SAAS,CAAC,GAE/B;GACE,MAAM;GACN,YAAY;EACd,CACF;EAEA,sBAAsB;CACxB;AACF;AAMA,SAAgB,EACd,IAAwD,CAAC,GACzD;CAMA,OAAO;EACL,GALyC,OAAO,KAChD,CACF,EAAE,QAAQ,GAAM,OAAU;GAAE,GAAG;IAAO,IAAO,EAAE,aAAa,SAAS;EAAE,IAAI,CAAC,CAGvE;EACH,oBAAoB;GAClB,UAAU;GACV,6BAA6B;EAC/B;EACA,sBAAsB,EACpB,YAAY,EACd;CACF;AACF;AAOA,SAAgB,EACd,GACyB;CACzB,IAAM,IAAuC,CAAC;CAY9C,OAXA,OAAO,KAAK,CAAQ,EAAE,SAAQ,MAAO;EACnC,IAAI,IAAQ,EAAS;EACrB,AAAI,MAAM,QAAQ,CAAK,KACrB,IAAQ,EAAM,QAAQ,MAAc,KAAQ,IAAI,GAC3C,EAAQ,CAAK,MAChB,EAAY,KAAO,MAGrB,EAAY,KAAO;CAEvB,CAAC,GACM;AACT;AAEA,SAAgB,EACd,IAAoC,CAAC,GACZ;CACzB,OAAO,OAAO,KAAK,CAAQ,EAAE,QAC1B,GAA8B,OACzB,EAAS,OAAS,SACpB,EAAI,KAAO,EAAS,KAEf,IAET,CAAC,CACH;AACF;AAOA,SAAgB,EAAwB,GAAoC;CAOxE,OANE,EAAM,UAAU,WAAW,GAAG,IAEzB,EAAM,SAAS,UAAU,GAAG,EAAM,SAAS,SAAS,CAAC,IACnD,EAAM,UAAU,WAAW,GAAG,IAChC,EAAM,SAAS,UAAU,CAAC,IAE1B,EAAM,YAAY;AAE7B;AAEA,SAAgB,EACd,GACuB;CAOvB,IAAM,IAAU,EAAQ,IAAQ,MAAS,EAAM,QAAQ;CAmCvD,OAlCA,OAAO,KAAK,CAAO,EAAE,KAAI,MAAY;EACnC,IAAM,IAAa,EAAQ;EAuB3B,AApBsB,EAAW,MAC/B,MAAK,EAAE,YAAY,mCAKnB,KACA,EAAW,OAAM,MACX,EAAM,YAAY,sBAEX,EAAM,YAAY,gCADpB,KAGE,EAAM,YAAY,mCAK9B,KAGgB,EAAW,SAAS,MACrC,EAAW,GAAG,UAAU,gDACxB,EAAQ,KAAY,CAAC,EAAW,EAAE;CAEtC,CAAC,GAGD,IAAS,EAAQ,CAAO,GAGjB;AACT;AAOA,SAAgB,EAAkB,GAA0B;CAIxD,OAHE,MAAM,QAAQ,CAAK,IACd,IAEA,CAAC,CAAK;AAEjB;AAOA,SAAgB,EACd,GACA,GACS;CAGT,OAAO,GADL,KAAuB,OAAO,KAAK,CAAmB,EAAE,SAAS,KAC1B;AAC3C;AAUA,SAAgB,EACd,GAC2B;CAC3B,IAAM,IAAgB,CAAC,GACjB,IAAyB,EAAS;EACtC,MAAM;EACN,MAAM;CACR,CAAC;CACD,KAAK,IAAM,KAAoB,GAC7B,OAAO,OAAO,GAAe,CAAgB;CAM/C,OAHI,EAAS,EAAe,UAAU,KACpC,OAAO,OAAO,GAAe,EAAe,UAAU,GAEjD;AACT;AAMA,SAAgB,EACd,GACe;CAKf,OAJI,CAAC,KAAgB,CAAC,EAAa,WAAW,qBAAqB,IAC1D,OAIP,yBACA,EAAa,UAAU,EAAgC;AAE3D;AAWA,SAAgB,EACd,GACA,GACQ;CACR,QAAQ,GAAR;EACE,KAAK,EAAmB,kBACtB,OAAO;EACT,SACE,OAAO,EAAwB,GAAmB,CAAM;CAC5D;AACF"}
1
+ {"version":3,"file":"AnnotationEditorUtils.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.ts"],"sourcesContent":["import { AdditionalPropertiesSchemaField } from '@/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField'\nimport { collectTopLevelProperties } from '@/utils/jsonschema/collectTopLevelProperties'\nimport {\n englishStringTranslator,\n RJSFValidationError,\n TranslatableString,\n} from '@rjsf/utils'\nimport { JSONSchema7 } from 'json-schema'\nimport { flatMap, groupBy, isEmpty } from 'lodash-es'\n\n/**\n * Generates a JSON schema for the form UI based on the provided validation schema and entity schema base properties.\n *\n * To meet the requirements of the desired form to display, we cannot simply show the validation schema. This is because\n * validation schemas may use conditional logic based on default entity properties (e.g. concreteType) to show/hide fields.\n * This method combines the validation schema with the entity schema base properties to create a new schema that will yield\n * the expected form with desired logic.\n * @param validationSchema\n * @param entitySchema\n */\nexport function getJsonSchemaForForm(\n validationSchema: JSONSchema7 = {},\n entitySchema: JSONSchema7 = {},\n): JSONSchema7 {\n const entitySchemaProperties = collectTopLevelProperties(entitySchema)\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n // Spread the validation schema to ensure all other references are included\n // Top level properties like \"$defs\" get lost if we simply put the entire schema in `allOf`\n ...validationSchema,\n // JSON Schemas for Synapse types use \"definitions\", so it should be manually merged.\n definitions: {\n ...entitySchema.definitions,\n ...validationSchema.definitions,\n },\n allOf: [\n ...(validationSchema.allOf || []),\n // Add in the entity properties\n {\n type: 'object',\n properties: entitySchemaProperties,\n },\n ],\n // Always allow adding additional annotations (though it may violate the validationSchema)\n additionalProperties: true,\n }\n}\n\n/**\n * Generates the UiSchema for the annotations editor.\n * @param entitySchemaBaseProperties\n */\nexport function getUiSchemaForForm(\n entitySchemaBaseProperties: JSONSchema7['properties'] = {},\n) {\n // Each 'base' entity field (id, name, concreteType, etc.) should be hidden\n const uiSchemaWithHiddenEntityProperties = Object.keys(\n entitySchemaBaseProperties,\n ).reduce((prev, curr) => ({ ...prev, [curr]: { 'ui:widget': 'hidden' } }), {})\n\n return {\n ...uiSchemaWithHiddenEntityProperties,\n 'ui:globalOptions': {\n copyable: false, // copy button clutters the UI, is not very useful since schemas are flat objects\n duplicateKeySuffixSeparator: '_', // the default duplicateKeySuffixSeparator creates invalid annotation keys\n },\n additionalProperties: {\n 'ui:field': AdditionalPropertiesSchemaField,\n },\n }\n}\n/**\n * Strips null values from arrays in the provided form data. If the array is empty after\n * removing null values, the key is removed from the form data.\n *\n * This allows users to submit forms with empty array fields (SWC-5762)\n */\nexport function dropNullishArrayValues(\n formData: Record<string, unknown>,\n): Record<string, unknown> {\n const newFormData: Record<string, unknown> = {}\n Object.keys(formData).forEach(key => {\n let value = formData[key]\n if (Array.isArray(value)) {\n value = value.filter((item: any) => item != null)\n if (!isEmpty(value)) {\n newFormData[key] = value\n }\n } else {\n newFormData[key] = value\n }\n })\n return newFormData\n}\n\nexport function dropNullValues(\n formData: Record<string, unknown> = {},\n): Record<string, unknown> {\n return Object.keys(formData).reduce(\n (acc: Record<string, unknown>, key: string) => {\n if (formData[key] !== null) {\n acc[key] = formData[key]\n }\n return acc\n },\n {},\n )\n}\n\n/**\n * Inspects the property of the AjvError and modifies it to be comparable to simple key strings, like entity property keys.\n * @param error\n * @returns\n */\nexport function getFriendlyPropertyName(error: RJSFValidationError): string {\n if (error.property?.startsWith('[')) {\n // Additional properties are surrounded by brackets and quotations, so let's remove them\n return error.property.substring(2, error.property.length - 2)\n } else if (error.property?.startsWith('.')) {\n return error.property.substring(1)\n } else {\n return error.property || ''\n }\n}\n\nexport function transformErrors(\n errors: RJSFValidationError[],\n): RJSFValidationError[] {\n // Transform the errors in the following ways:\n // - Simplify the set of errors when failing to select an enumeration defined with an anyOf (SWC-5724)\n // - Show a custom error message when using a property that collides with an internal entity property (SWC-5678)\n\n // Fixing anyOf errors\n // Group the errors by the property that the error applies to\n const grouped = groupBy(errors, error => error.property)\n Object.keys(grouped).map(property => {\n const errorGroup = grouped[property]\n\n // First, see if it is an anyOf error\n const hasAnyOfError = errorGroup.some(\n e => e.message === 'should match some schema in anyOf',\n )\n\n // We determine if it's an anyOf *enum* error if all error messages in the property match one of these three messages:\n const isEnumError =\n hasAnyOfError &&\n errorGroup.every(error => {\n if (error.message === 'should be string') {\n return true\n } else if (error.message === 'should be equal to constant') {\n return true\n } else if (error.message === 'should match some schema in anyOf') {\n return true\n } else {\n return false\n }\n })\n\n // If it's an anyOf enum error, we just modify the first message and drop the rest\n if (isEnumError && errorGroup.length > 0) {\n errorGroup[0].message = 'should be equal to one of the allowed values'\n grouped[property] = [errorGroup[0]]\n }\n })\n\n // Ungroup the errors after potentially modifying them\n errors = flatMap(grouped)\n\n // Return the transformed errors.\n return errors\n}\n\n/**\n * Custom annotations in Synapse are always arrays. This function converts initial data to be an array type.\n * If the initial data is an array, return the data itself.\n * Otherwise, wrap the data in an array.\n */\nexport function convertToArray<T>(value: T): Array<unknown> {\n if (Array.isArray(value)) {\n return value\n } else {\n return [value]\n }\n}\n\n/**\n * Returns true if the default behavior of the form should be to live validate\n * @param existingAnnotations\n * @param validationSchema\n */\nexport function shouldLiveValidate(\n existingAnnotations: Record<string, unknown> | undefined,\n validationSchema: JSONSchema7 | undefined,\n): boolean {\n const hasExistingAnnotations =\n existingAnnotations && Object.keys(existingAnnotations).length > 0\n return Boolean(hasExistingAnnotations && validationSchema)\n}\n\n/**\n * Get the Synapse entity schema ID for a particular concrete type.\n * @param concreteType\n */\nexport function getSchemaIdForConcreteType(\n concreteType: string,\n): string | null {\n if (!concreteType || !concreteType.startsWith('org.sagebionetworks')) {\n return null\n }\n // e.g. 'org.sagebionetworks.repo.model.FileEntity' -> 'org.sagebionetworks-repo.model.FileEntity'\n return (\n 'org.sagebionetworks-' +\n concreteType.substring('org.sagebionetworks'.length + 1)\n )\n}\n\n/**\n * Custom string translator for react-jsonschema-form.\n * Overrides the translation for \"NewStringDefault\" by returning an empty string.\n * For all other keys, falls back to the default English string translator.\n *\n * @param stringToTranslate\n * @param params - Optional parameters used to format the translated string.\n * @returns - The translated string.\n */\nexport function customTranslateString(\n stringToTranslate: TranslatableString,\n params?: string[],\n): string {\n switch (stringToTranslate) {\n case TranslatableString.NewStringDefault:\n return ''\n default:\n return englishStringTranslator(stringToTranslate, params)\n }\n}\n"],"mappings":";;;;;AAoBA,SAAgB,EACd,IAAgC,CAAC,GACjC,IAA4B,CAAC,GAChB;CACb,IAAM,IAAyB,EAA0B,CAAY;CAErE,OAAO;EACL,SAAS;EAGT,GAAG;EAEH,aAAa;GACX,GAAG,EAAa;GAChB,GAAG,EAAiB;EACtB;EACA,OAAO,CACL,GAAI,EAAiB,SAAS,CAAC,GAE/B;GACE,MAAM;GACN,YAAY;EACd,CACF;EAEA,sBAAsB;CACxB;AACF;AAMA,SAAgB,EACd,IAAwD,CAAC,GACzD;CAMA,OAAO;EACL,GALyC,OAAO,KAChD,CACF,EAAE,QAAQ,GAAM,OAAU;GAAE,GAAG;IAAO,IAAO,EAAE,aAAa,SAAS;EAAE,IAAI,CAAC,CAGvE;EACH,oBAAoB;GAClB,UAAU;GACV,6BAA6B;EAC/B;EACA,sBAAsB,EACpB,YAAY,EACd;CACF;AACF;AAOA,SAAgB,EACd,GACyB;CACzB,IAAM,IAAuC,CAAC;CAY9C,OAXA,OAAO,KAAK,CAAQ,EAAE,SAAQ,MAAO;EACnC,IAAI,IAAQ,EAAS;EACrB,AAAI,MAAM,QAAQ,CAAK,KACrB,IAAQ,EAAM,QAAQ,MAAc,KAAQ,IAAI,GAC3C,EAAQ,CAAK,MAChB,EAAY,KAAO,MAGrB,EAAY,KAAO;CAEvB,CAAC,GACM;AACT;AAEA,SAAgB,EACd,IAAoC,CAAC,GACZ;CACzB,OAAO,OAAO,KAAK,CAAQ,EAAE,QAC1B,GAA8B,OACzB,EAAS,OAAS,SACpB,EAAI,KAAO,EAAS,KAEf,IAET,CAAC,CACH;AACF;AAOA,SAAgB,EAAwB,GAAoC;CAOxE,OANE,EAAM,UAAU,WAAW,GAAG,IAEzB,EAAM,SAAS,UAAU,GAAG,EAAM,SAAS,SAAS,CAAC,IACnD,EAAM,UAAU,WAAW,GAAG,IAChC,EAAM,SAAS,UAAU,CAAC,IAE1B,EAAM,YAAY;AAE7B;AAEA,SAAgB,EACd,GACuB;CAOvB,IAAM,IAAU,EAAQ,IAAQ,MAAS,EAAM,QAAQ;CAmCvD,OAlCA,OAAO,KAAK,CAAO,EAAE,KAAI,MAAY;EACnC,IAAM,IAAa,EAAQ;EAuB3B,AApBsB,EAAW,MAC/B,MAAK,EAAE,YAAY,mCAKnB,KACA,EAAW,OAAM,MACX,EAAM,YAAY,sBAEX,EAAM,YAAY,gCADpB,KAGE,EAAM,YAAY,mCAK9B,KAGgB,EAAW,SAAS,MACrC,EAAW,GAAG,UAAU,gDACxB,EAAQ,KAAY,CAAC,EAAW,EAAE;CAEtC,CAAC,GAGD,IAAS,EAAQ,CAAO,GAGjB;AACT;AAOA,SAAgB,EAAkB,GAA0B;CAIxD,OAHE,MAAM,QAAQ,CAAK,IACd,IAEA,CAAC,CAAK;AAEjB;AAOA,SAAgB,EACd,GACA,GACS;CAGT,OAAO,GADL,KAAuB,OAAO,KAAK,CAAmB,EAAE,SAAS,KAC1B;AAC3C;AAMA,SAAgB,EACd,GACe;CAKf,OAJI,CAAC,KAAgB,CAAC,EAAa,WAAW,qBAAqB,IAC1D,OAIP,yBACA,EAAa,UAAU,EAAgC;AAE3D;AAWA,SAAgB,EACd,GACA,GACQ;CACR,QAAQ,GAAR;EACE,KAAK,EAAmB,kBACtB,OAAO;EACT,SACE,OAAO,EAAwB,GAAmB,CAAM;CAC5D;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaDrivenAnnotationEditor.d.ts","sourceRoot":"","sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,IAAI,MAAM,YAAY,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAIzC,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAA;AAwBvE,MAAM,MAAM,iCAAiC,GAAG;IAC9C,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,WAAW,CAAA;IAC9B,2GAA2G;IAC3G,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAChC,uLAAuL;IACvL,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACzD,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAkBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,2CAwUzC"}
1
+ {"version":3,"file":"SchemaDrivenAnnotationEditor.d.ts","sourceRoot":"","sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,IAAI,MAAM,YAAY,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAIzC,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAA;AAwBvE,MAAM,MAAM,iCAAiC,GAAG;IAC9C,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,WAAW,CAAA;IAC9B,2GAA2G;IAC3G,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAChC,uLAAuL;IACvL,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACzD,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAkBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,2CAuUzC"}
@@ -5,7 +5,8 @@ import { useGetSchemaBinding as ne } from "../../synapse-queries/jsonschema/useE
5
5
  import { useGetSchema as r } from "../../synapse-queries/jsonschema/useSchema.js";
6
6
  import "../../synapse-queries/index.js";
7
7
  import { ConfirmationButtons as re, ConfirmationDialog as ie } from "../ConfirmationDialog/ConfirmationDialog.js";
8
- import { customTranslateString as ae, dropNullValues as i, dropNullishArrayValues as a, getFriendlyPropertyName as oe, getJsonSchemaForForm as o, getPossibleTopLevelPropertiesInObjectSchema as s, getSchemaIdForConcreteType as c, getUiSchemaForForm as l, shouldLiveValidate as u, transformErrors as d } from "./AnnotationEditorUtils.js";
8
+ import { collectTopLevelProperties as ae } from "../../utils/jsonschema/collectTopLevelProperties.js";
9
+ import { customTranslateString as oe, dropNullValues as i, dropNullishArrayValues as a, getFriendlyPropertyName as o, getJsonSchemaForForm as s, getSchemaIdForConcreteType as c, getUiSchemaForForm as l, shouldLiveValidate as u, transformErrors as d } from "./AnnotationEditorUtils.js";
9
10
  import { JsonSchemaForm as f } from "../JsonSchemaForm/JsonSchemaForm.js";
10
11
  import p from "../../assets/icons/AddToList.js";
11
12
  import { SynapseAnnotationsRJSFObjectField as m } from "./field/SynapseAnnotationsRJSFObjectField.js";
@@ -49,7 +50,7 @@ function D(i) {
49
50
  }), J = O || ye, Y = c(U?.concreteType ?? ""), { data: X, isLoading: xe } = r(Y ?? "", {
50
51
  enabled: !!Y,
51
52
  throwOnError: !0
52
- }), Z = h(() => s(X ?? {}), [X]), Se = h(() => o(J, X), [J, X]), Ce = h(() => l(Z), [Z]), we = ve || be || xe, { mutate: Te, isPending: Ee } = te({
53
+ }), Z = h(() => ae(X), [X]), Se = h(() => s(J, X), [J, X]), Ce = h(() => l(Z), [Z]), we = ve || be || xe, { mutate: Te, isPending: Ee } = te({
53
54
  onSuccess: () => {
54
55
  A();
55
56
  },
@@ -118,7 +119,7 @@ function D(i) {
118
119
  noHtml5Validate: !0,
119
120
  formRef: I,
120
121
  disabled: Ee,
121
- translateString: ae,
122
+ translateString: oe,
122
123
  formContext: {
123
124
  showDerivedAnnotationPlaceholder: !0,
124
125
  descriptionVariant: "expand",
@@ -182,7 +183,7 @@ function D(i) {
182
183
  content: /* @__PURE__ */ S(b, { children: [
183
184
  /* @__PURE__ */ x("div", { children: "The following errors exist with the annotations you entered:" }),
184
185
  /* @__PURE__ */ x("div", { children: /* @__PURE__ */ x("ul", { children: (L ?? []).map((e, t) => /* @__PURE__ */ S("li", { children: [
185
- /* @__PURE__ */ x("b", { children: `${oe(e)}: ` }),
186
+ /* @__PURE__ */ x("b", { children: `${o(e)}: ` }),
186
187
  " ",
187
188
  `${e.message}`
188
189
  ] }, t)) }) }),
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaDrivenAnnotationEditor.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetJson,\n useGetSchema,\n useGetSchemaBinding,\n useUpdateViaJson,\n} from '@/synapse-queries'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Alert, Box, Divider, Link, Typography } from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport { RJSFValidationError } from '@rjsf/utils'\nimport validator from '@rjsf/validator-ajv8'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { EntityJson } from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7 } from 'json-schema'\nimport { omitBy } from 'lodash-es'\nimport isEmpty from 'lodash-es/isEmpty'\nimport noop from 'lodash-es/noop'\nimport { RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { JsonSchemaForm } from '../JsonSchemaForm/JsonSchemaForm'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport {\n dropNullishArrayValues,\n dropNullValues,\n getPossibleTopLevelPropertiesInObjectSchema,\n getFriendlyPropertyName,\n getJsonSchemaForForm,\n getSchemaIdForConcreteType,\n transformErrors,\n getUiSchemaForForm,\n shouldLiveValidate,\n customTranslateString,\n} from './AnnotationEditorUtils'\nimport SynapseAnnotationsRJSFObjectField from './field/SynapseAnnotationsRJSFObjectField'\nimport { ObjectFieldTemplate } from './template/ObjectFieldTemplate'\nimport SynapseAnnotationsWrapIfAdditionalTemplate from './template/SynapseAnnotationsWrapIfAdditionalTemplate'\nimport TextWidget from './widget/TextWidget'\n\nexport type SchemaDrivenAnnotationEditorProps = {\n /** The entity whose annotations should be edited with the form */\n entityId?: string\n /** If no entity ID is supplied, the schema to use for the form */\n schemaId?: string\n /** May be used to directly provide a JSON Schema to use for the form */\n validationSchema?: JSONSchema7\n /** Optionally supply a ref to the form to handle submission externally with `formRef.current.submit()`. */\n formRef?: RefObject<RJSF | null>\n /** Provide live input validation. This can cause performance degradation. By default, liveValidate will be true if an entity with a schema and existing annotations is being edited */\n liveValidate?: boolean\n /** Invoked after a successful form submission */\n onSuccess?: () => void\n /** If defined and formRef is not supplied, shows a 'Cancel' button and runs this effect on click */\n onCancel?: () => void\n /** Passes new form data upon each change to the form */\n onChange?: (annotations: Record<string, unknown>) => void\n /** If true, the editor will not render its own submit UI. */\n hideActions?: boolean\n}\n\n/**\n * Cleans the formData to remove values that are invalid for Synapse Annotations\n * @param formData\n * @param dropNullishValuesInArrays\n */\nfunction cleanFormData(\n formData: Record<string, unknown> | undefined,\n dropNullishValuesInArrays: boolean,\n) {\n let cleanedFormData = dropNullValues(formData)\n if (dropNullishValuesInArrays) {\n cleanedFormData = dropNullishArrayValues(cleanedFormData)\n }\n return cleanedFormData\n}\n\n/**\n * Renders a form for editing an entity's annotations. The component also supports supplying just a schema ID,\n * but work to support annotation flows without an entity (i.e. before creating entities) is not yet complete.\n */\nexport function SchemaDrivenAnnotationEditor(\n props: SchemaDrivenAnnotationEditorProps,\n) {\n const {\n entityId,\n schemaId,\n validationSchema: validationSchemaFromProps,\n liveValidate: liveValidateFromProps,\n onSuccess = () => {\n /* no-op */\n },\n onCancel,\n formRef: formRefFromParent,\n onChange = noop,\n hideActions = false,\n } = props\n const localRef = useRef<RJSF>(null)\n const ref = formRefFromParent ?? localRef\n\n // Client-side validation errors\n const [validationError, setValidationError] = useState<\n RJSFValidationError[] | undefined\n >(undefined)\n\n // Errors from the backend response\n const [submissionError, setSubmissionError] = useState<\n SynapseClientError | undefined\n >(undefined)\n const [showSubmissionError, setShowSubmissionError] = useState(false)\n\n const [showConfirmation, setShowConfirmation] = useState(false)\n\n const { data } = useGetJson(\n entityId!,\n undefined,\n // Derived annotations will be precomputed and displayed as placeholders in the form\n false,\n {\n // Metadata is being edited, so don't refetch\n staleTime: Infinity,\n enabled: !!entityId,\n throwOnError: true,\n },\n )\n\n const entityJson = data?.entityMetadata\n const annotations = data?.annotations\n\n // Annotation fields fetched and modified via the form\n const [formData, setFormData] = useState<Record<string, unknown> | undefined>(\n undefined,\n )\n\n // Set initial form data when the entity or its annotations change\n useEffect(() => {\n if (data?.entity) {\n const formData = data.entity\n const hasAnnotations = annotations && Object.keys(annotations).length > 0\n\n const newFormData = !hasAnnotations\n ? { ...formData, newKey: [''] }\n : formData\n\n setFormData(newFormData)\n }\n }, [data?.entity, annotations])\n\n const { data: schema, isLoading: isLoadingBinding } = useGetSchemaBinding(\n entityId!,\n {\n enabled: !!entityId,\n refetchOnWindowFocus: false,\n throwOnError: true,\n },\n )\n\n // The full schema which is bound to the entity\n const { data: fetchedValidationSchema, isLoading: isLoadingSchema } =\n useGetSchema(schemaId ?? schema?.jsonSchemaVersionInfo.$id ?? '', {\n enabled: !!schemaId || !!schema,\n throwOnError: true,\n })\n const validationSchema = validationSchemaFromProps || fetchedValidationSchema\n\n const concreteTypeSchemaId = getSchemaIdForConcreteType(\n entityJson?.concreteType ?? '',\n )\n // The schema for the entity type (e.g. FileEntity, TableEntity, etc.)\n const { data: schemaForEntityType, isLoading: isLoadingEntityTypeSchema } =\n useGetSchema(concreteTypeSchemaId ?? '', {\n enabled: !!concreteTypeSchemaId,\n throwOnError: true,\n })\n\n const entitySchemaBaseProperties: JSONSchema7['properties'] = useMemo(\n () =>\n getPossibleTopLevelPropertiesInObjectSchema(schemaForEntityType ?? {}),\n [schemaForEntityType],\n )\n\n const formSchema = useMemo(\n () => getJsonSchemaForForm(validationSchema, schemaForEntityType),\n [validationSchema, schemaForEntityType],\n )\n\n const uiSchema = useMemo(\n () => getUiSchemaForForm(entitySchemaBaseProperties),\n [entitySchemaBaseProperties],\n )\n\n const isLoading =\n isLoadingBinding || isLoadingSchema || isLoadingEntityTypeSchema\n\n const { mutate, isPending: updateIsPending } = useUpdateViaJson({\n onSuccess: () => {\n onSuccess()\n },\n onError: error => {\n setSubmissionError(error)\n setShowSubmissionError(true)\n },\n })\n\n function submitChangedEntity() {\n mutate({\n ...cleanFormData(formData, true),\n ...entityJson,\n } as EntityJson)\n }\n\n const liveValidate =\n liveValidateFromProps ?? shouldLiveValidate(annotations, validationSchema)\n\n const formDataHasNoAnnotations =\n entityJson &&\n isEmpty(\n omitBy(formData, (_value, key) =>\n Object.keys(entityJson).find(k => k === key),\n ),\n )\n\n const showHasNoAnnotationsAlert = schema === null && formDataHasNoAnnotations\n\n return (\n <>\n {isLoading ? (\n <Box sx={{ display: 'flex', margin: '60px auto' }}>\n <SynapseSpinner size={30} />\n </Box>\n ) : (\n <>\n {entityJson && schema && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n <b>{entityJson.name}</b> requires scientific annotations specified\n by <b>{schema.jsonSchemaVersionInfo.$id}</b>\n {'. '}\n <b>\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n schema.jsonSchemaVersionInfo.$id\n }`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View required schema (JSON)\n </Link>\n </b>\n </Alert>\n )}\n {showHasNoAnnotationsAlert && (\n <Alert severity=\"info\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <Typography variant={'smallText1'}>\n <b>{entityJson.name}</b> has no annotations. Click the{' '}\n </Typography>\n <AddToList />\n <Typography variant={'smallText1'}>\n button to annotate.\n </Typography>\n </Box>\n </Alert>\n )}\n <JsonSchemaForm\n validator={validator}\n liveValidate={liveValidate}\n noHtml5Validate={true}\n formRef={ref}\n disabled={updateIsPending}\n translateString={customTranslateString}\n formContext={{\n showDerivedAnnotationPlaceholder: true,\n descriptionVariant: 'expand',\n descriptionFormat: 'table',\n allowFreeSoloEnum: true,\n }}\n experimental_defaultFormStateBehavior={{\n emptyObjectFields: 'skipDefaults',\n }}\n fields={{\n ObjectField: SynapseAnnotationsRJSFObjectField,\n }}\n templates={{\n ObjectFieldTemplate: ObjectFieldTemplate,\n WrapIfAdditionalTemplate:\n SynapseAnnotationsWrapIfAdditionalTemplate,\n }}\n widgets={{\n TextWidget: TextWidget,\n }}\n schema={formSchema}\n uiSchema={uiSchema}\n transformErrors={transformErrors}\n formData={formData}\n onChange={({ formData }) => {\n onChange(formData)\n setFormData(formData)\n setValidationError(undefined)\n }}\n onBlur={() => {\n setFormData(\n // Clean the formData onBlur to remove null values that we will need to strip before submission\n // This will ensure that the user gets accurate validation information since the data will match what the backend will receive\n cleanFormData(\n formData,\n // Don't remove null values in arrays--the fields will disappear, which the user probably does not want\n false,\n ),\n )\n }}\n onSubmit={({ formData, errors }, event) => {\n event.preventDefault()\n if (errors && errors.length > 0) {\n setValidationError(errors)\n }\n setShowSubmissionError(false)\n setFormData(formData)\n submitChangedEntity()\n }}\n onError={(errors: RJSFValidationError[]) => {\n // invoked when submit is clicked and there are client-side validation errors\n setValidationError(errors)\n if ((validationError || liveValidate) && entityId) {\n setShowConfirmation(true)\n }\n }}\n >\n {submissionError && showSubmissionError && (\n <Alert severity=\"error\" sx={{ my: 2 }}>\n Annotations could not be updated: {submissionError.reason}\n </Alert>\n )}\n {!hideActions && (\n <>\n <Divider sx={{ my: 2 }} />\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gridRowStart: 5,\n }}\n >\n <ConfirmationButtons\n hasCancelButton={onCancel !== undefined}\n onCancel={() => {\n if (onCancel) {\n onCancel()\n }\n }}\n onConfirm={() => {\n ref.current!.formElement.current.requestSubmit()\n }}\n confirmButtonProps={{\n children: entityId ? 'Save' : 'Validate',\n }}\n />\n </Box>\n </>\n )}\n </JsonSchemaForm>\n {showConfirmation && (\n <ConfirmationDialog\n open={true}\n onConfirm={() => {\n submitChangedEntity()\n setShowConfirmation(false)\n }}\n onCancel={() => {\n setShowConfirmation(false)\n }}\n title=\"Update Annotations\"\n content={\n <>\n <div>\n The following errors exist with the annotations you entered:\n </div>\n <div>\n <ul>\n {(validationError ?? []).map(\n (e: RJSFValidationError, index: number) => (\n <li key={index}>\n <b>{`${getFriendlyPropertyName(e)}: `}</b>{' '}\n {`${e.message}`}\n </li>\n ),\n )}\n </ul>\n </div>\n <div>\n Are you sure you want to save the invalid annotations?\n </div>\n </>\n }\n confirmButtonProps={{\n children: 'Save',\n }}\n />\n )}\n </>\n )}\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SchemaDrivenAnnotationEditor.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetJson,\n useGetSchema,\n useGetSchemaBinding,\n useUpdateViaJson,\n} from '@/synapse-queries'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Alert, Box, Divider, Link, Typography } from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport { RJSFValidationError } from '@rjsf/utils'\nimport validator from '@rjsf/validator-ajv8'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { EntityJson } from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7 } from 'json-schema'\nimport { omitBy } from 'lodash-es'\nimport isEmpty from 'lodash-es/isEmpty'\nimport noop from 'lodash-es/noop'\nimport { RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { JsonSchemaForm } from '../JsonSchemaForm/JsonSchemaForm'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { collectTopLevelProperties } from '@/utils/jsonschema/collectTopLevelProperties'\nimport {\n dropNullishArrayValues,\n dropNullValues,\n getFriendlyPropertyName,\n getJsonSchemaForForm,\n getSchemaIdForConcreteType,\n transformErrors,\n getUiSchemaForForm,\n shouldLiveValidate,\n customTranslateString,\n} from './AnnotationEditorUtils'\nimport SynapseAnnotationsRJSFObjectField from './field/SynapseAnnotationsRJSFObjectField'\nimport { ObjectFieldTemplate } from './template/ObjectFieldTemplate'\nimport SynapseAnnotationsWrapIfAdditionalTemplate from './template/SynapseAnnotationsWrapIfAdditionalTemplate'\nimport TextWidget from './widget/TextWidget'\n\nexport type SchemaDrivenAnnotationEditorProps = {\n /** The entity whose annotations should be edited with the form */\n entityId?: string\n /** If no entity ID is supplied, the schema to use for the form */\n schemaId?: string\n /** May be used to directly provide a JSON Schema to use for the form */\n validationSchema?: JSONSchema7\n /** Optionally supply a ref to the form to handle submission externally with `formRef.current.submit()`. */\n formRef?: RefObject<RJSF | null>\n /** Provide live input validation. This can cause performance degradation. By default, liveValidate will be true if an entity with a schema and existing annotations is being edited */\n liveValidate?: boolean\n /** Invoked after a successful form submission */\n onSuccess?: () => void\n /** If defined and formRef is not supplied, shows a 'Cancel' button and runs this effect on click */\n onCancel?: () => void\n /** Passes new form data upon each change to the form */\n onChange?: (annotations: Record<string, unknown>) => void\n /** If true, the editor will not render its own submit UI. */\n hideActions?: boolean\n}\n\n/**\n * Cleans the formData to remove values that are invalid for Synapse Annotations\n * @param formData\n * @param dropNullishValuesInArrays\n */\nfunction cleanFormData(\n formData: Record<string, unknown> | undefined,\n dropNullishValuesInArrays: boolean,\n) {\n let cleanedFormData = dropNullValues(formData)\n if (dropNullishValuesInArrays) {\n cleanedFormData = dropNullishArrayValues(cleanedFormData)\n }\n return cleanedFormData\n}\n\n/**\n * Renders a form for editing an entity's annotations. The component also supports supplying just a schema ID,\n * but work to support annotation flows without an entity (i.e. before creating entities) is not yet complete.\n */\nexport function SchemaDrivenAnnotationEditor(\n props: SchemaDrivenAnnotationEditorProps,\n) {\n const {\n entityId,\n schemaId,\n validationSchema: validationSchemaFromProps,\n liveValidate: liveValidateFromProps,\n onSuccess = () => {\n /* no-op */\n },\n onCancel,\n formRef: formRefFromParent,\n onChange = noop,\n hideActions = false,\n } = props\n const localRef = useRef<RJSF>(null)\n const ref = formRefFromParent ?? localRef\n\n // Client-side validation errors\n const [validationError, setValidationError] = useState<\n RJSFValidationError[] | undefined\n >(undefined)\n\n // Errors from the backend response\n const [submissionError, setSubmissionError] = useState<\n SynapseClientError | undefined\n >(undefined)\n const [showSubmissionError, setShowSubmissionError] = useState(false)\n\n const [showConfirmation, setShowConfirmation] = useState(false)\n\n const { data } = useGetJson(\n entityId!,\n undefined,\n // Derived annotations will be precomputed and displayed as placeholders in the form\n false,\n {\n // Metadata is being edited, so don't refetch\n staleTime: Infinity,\n enabled: !!entityId,\n throwOnError: true,\n },\n )\n\n const entityJson = data?.entityMetadata\n const annotations = data?.annotations\n\n // Annotation fields fetched and modified via the form\n const [formData, setFormData] = useState<Record<string, unknown> | undefined>(\n undefined,\n )\n\n // Set initial form data when the entity or its annotations change\n useEffect(() => {\n if (data?.entity) {\n const formData = data.entity\n const hasAnnotations = annotations && Object.keys(annotations).length > 0\n\n const newFormData = !hasAnnotations\n ? { ...formData, newKey: [''] }\n : formData\n\n setFormData(newFormData)\n }\n }, [data?.entity, annotations])\n\n const { data: schema, isLoading: isLoadingBinding } = useGetSchemaBinding(\n entityId!,\n {\n enabled: !!entityId,\n refetchOnWindowFocus: false,\n throwOnError: true,\n },\n )\n\n // The full schema which is bound to the entity\n const { data: fetchedValidationSchema, isLoading: isLoadingSchema } =\n useGetSchema(schemaId ?? schema?.jsonSchemaVersionInfo.$id ?? '', {\n enabled: !!schemaId || !!schema,\n throwOnError: true,\n })\n const validationSchema = validationSchemaFromProps || fetchedValidationSchema\n\n const concreteTypeSchemaId = getSchemaIdForConcreteType(\n entityJson?.concreteType ?? '',\n )\n // The schema for the entity type (e.g. FileEntity, TableEntity, etc.)\n const { data: schemaForEntityType, isLoading: isLoadingEntityTypeSchema } =\n useGetSchema(concreteTypeSchemaId ?? '', {\n enabled: !!concreteTypeSchemaId,\n throwOnError: true,\n })\n\n const entitySchemaBaseProperties: JSONSchema7['properties'] = useMemo(\n () => collectTopLevelProperties(schemaForEntityType),\n [schemaForEntityType],\n )\n\n const formSchema = useMemo(\n () => getJsonSchemaForForm(validationSchema, schemaForEntityType),\n [validationSchema, schemaForEntityType],\n )\n\n const uiSchema = useMemo(\n () => getUiSchemaForForm(entitySchemaBaseProperties),\n [entitySchemaBaseProperties],\n )\n\n const isLoading =\n isLoadingBinding || isLoadingSchema || isLoadingEntityTypeSchema\n\n const { mutate, isPending: updateIsPending } = useUpdateViaJson({\n onSuccess: () => {\n onSuccess()\n },\n onError: error => {\n setSubmissionError(error)\n setShowSubmissionError(true)\n },\n })\n\n function submitChangedEntity() {\n mutate({\n ...cleanFormData(formData, true),\n ...entityJson,\n } as EntityJson)\n }\n\n const liveValidate =\n liveValidateFromProps ?? shouldLiveValidate(annotations, validationSchema)\n\n const formDataHasNoAnnotations =\n entityJson &&\n isEmpty(\n omitBy(formData, (_value, key) =>\n Object.keys(entityJson).find(k => k === key),\n ),\n )\n\n const showHasNoAnnotationsAlert = schema === null && formDataHasNoAnnotations\n\n return (\n <>\n {isLoading ? (\n <Box sx={{ display: 'flex', margin: '60px auto' }}>\n <SynapseSpinner size={30} />\n </Box>\n ) : (\n <>\n {entityJson && schema && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n <b>{entityJson.name}</b> requires scientific annotations specified\n by <b>{schema.jsonSchemaVersionInfo.$id}</b>\n {'. '}\n <b>\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n schema.jsonSchemaVersionInfo.$id\n }`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View required schema (JSON)\n </Link>\n </b>\n </Alert>\n )}\n {showHasNoAnnotationsAlert && (\n <Alert severity=\"info\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <Typography variant={'smallText1'}>\n <b>{entityJson.name}</b> has no annotations. Click the{' '}\n </Typography>\n <AddToList />\n <Typography variant={'smallText1'}>\n button to annotate.\n </Typography>\n </Box>\n </Alert>\n )}\n <JsonSchemaForm\n validator={validator}\n liveValidate={liveValidate}\n noHtml5Validate={true}\n formRef={ref}\n disabled={updateIsPending}\n translateString={customTranslateString}\n formContext={{\n showDerivedAnnotationPlaceholder: true,\n descriptionVariant: 'expand',\n descriptionFormat: 'table',\n allowFreeSoloEnum: true,\n }}\n experimental_defaultFormStateBehavior={{\n emptyObjectFields: 'skipDefaults',\n }}\n fields={{\n ObjectField: SynapseAnnotationsRJSFObjectField,\n }}\n templates={{\n ObjectFieldTemplate: ObjectFieldTemplate,\n WrapIfAdditionalTemplate:\n SynapseAnnotationsWrapIfAdditionalTemplate,\n }}\n widgets={{\n TextWidget: TextWidget,\n }}\n schema={formSchema}\n uiSchema={uiSchema}\n transformErrors={transformErrors}\n formData={formData}\n onChange={({ formData }) => {\n onChange(formData)\n setFormData(formData)\n setValidationError(undefined)\n }}\n onBlur={() => {\n setFormData(\n // Clean the formData onBlur to remove null values that we will need to strip before submission\n // This will ensure that the user gets accurate validation information since the data will match what the backend will receive\n cleanFormData(\n formData,\n // Don't remove null values in arrays--the fields will disappear, which the user probably does not want\n false,\n ),\n )\n }}\n onSubmit={({ formData, errors }, event) => {\n event.preventDefault()\n if (errors && errors.length > 0) {\n setValidationError(errors)\n }\n setShowSubmissionError(false)\n setFormData(formData)\n submitChangedEntity()\n }}\n onError={(errors: RJSFValidationError[]) => {\n // invoked when submit is clicked and there are client-side validation errors\n setValidationError(errors)\n if ((validationError || liveValidate) && entityId) {\n setShowConfirmation(true)\n }\n }}\n >\n {submissionError && showSubmissionError && (\n <Alert severity=\"error\" sx={{ my: 2 }}>\n Annotations could not be updated: {submissionError.reason}\n </Alert>\n )}\n {!hideActions && (\n <>\n <Divider sx={{ my: 2 }} />\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gridRowStart: 5,\n }}\n >\n <ConfirmationButtons\n hasCancelButton={onCancel !== undefined}\n onCancel={() => {\n if (onCancel) {\n onCancel()\n }\n }}\n onConfirm={() => {\n ref.current!.formElement.current.requestSubmit()\n }}\n confirmButtonProps={{\n children: entityId ? 'Save' : 'Validate',\n }}\n />\n </Box>\n </>\n )}\n </JsonSchemaForm>\n {showConfirmation && (\n <ConfirmationDialog\n open={true}\n onConfirm={() => {\n submitChangedEntity()\n setShowConfirmation(false)\n }}\n onCancel={() => {\n setShowConfirmation(false)\n }}\n title=\"Update Annotations\"\n content={\n <>\n <div>\n The following errors exist with the annotations you entered:\n </div>\n <div>\n <ul>\n {(validationError ?? []).map(\n (e: RJSFValidationError, index: number) => (\n <li key={index}>\n <b>{`${getFriendlyPropertyName(e)}: `}</b>{' '}\n {`${e.message}`}\n </li>\n ),\n )}\n </ul>\n </div>\n <div>\n Are you sure you want to save the invalid annotations?\n </div>\n </>\n }\n confirmButtonProps={{\n children: 'Save',\n }}\n />\n )}\n </>\n )}\n </>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseAnnotationsRJSFObjectField.d.ts","sourceRoot":"","sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,UAAU,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EACjB,MAAM,aAAa,CAAA;AAQpB;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtE,CAAC,SAAS,gBAAgB,GAAG,UAAU,EACvC,CAAC,SAAS,eAAe,GAAG,GAAG,EAC/B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,2CAwD3B;AAED,eAAe,iCAAiC,CAAA"}
1
+ {"version":3,"file":"SynapseAnnotationsRJSFObjectField.d.ts","sourceRoot":"","sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,UAAU,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EACjB,MAAM,aAAa,CAAA;AAMpB;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtE,CAAC,SAAS,gBAAgB,GAAG,UAAU,EACvC,CAAC,SAAS,eAAe,GAAG,GAAG,EAC/B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,2CAwD3B;AAED,eAAe,iCAAiC,CAAA"}
@@ -1,4 +1,5 @@
1
- import { convertToArray as e, getPossibleTopLevelPropertiesInObjectSchema as t } from "../AnnotationEditorUtils.js";
1
+ import { collectTopLevelProperties as e } from "../../../utils/jsonschema/collectTopLevelProperties.js";
2
+ import { convertToArray as t } from "../AnnotationEditorUtils.js";
2
3
  import { useEffect as n } from "react";
3
4
  import { jsx as r } from "react/jsx-runtime";
4
5
  import { ADDITIONAL_PROPERTY_FLAG as i, deepEquals as a } from "@rjsf/utils";
@@ -7,10 +8,10 @@ import { getDefaultRegistry as o } from "@rjsf/core";
7
8
  function s(s) {
8
9
  let { schema: c, formData: l, onChange: u } = s, { fields: { ObjectField: d } } = o();
9
10
  return n(() => {
10
- let n = { ...l }, r = t(c);
11
- r && (Object.entries(r).forEach(([t, r]) => {
12
- let a = n[t];
13
- r[i] ? Array.isArray(a) || (n[t] = e(a)) : typeof r == "object" && "type" in r && r.type !== "array" && Array.isArray(a) && (n[t] = a.map((e) => `${e}`).join(", "));
11
+ let n = { ...l }, r = e(c);
12
+ r && (Object.entries(r).forEach(([e, r]) => {
13
+ let a = n[e];
14
+ r[i] ? Array.isArray(a) || (n[e] = t(a)) : typeof r == "object" && "type" in r && r.type !== "array" && Array.isArray(a) && (n[e] = a.map((e) => `${e}`).join(", "));
14
15
  }), a(l, n) || u(n));
15
16
  }, [
16
17
  c,
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseAnnotationsRJSFObjectField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"sourcesContent":["import { getDefaultRegistry } from '@rjsf/core'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n deepEquals,\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useEffect } from 'react'\nimport {\n convertToArray,\n getPossibleTopLevelPropertiesInObjectSchema,\n} from '../AnnotationEditorUtils'\n\n/**\n * Extends the @rjsf/core `ObjectField` and just adds a custom hook for Synapse annotation business logic\n */\nexport function SynapseAnnotationsRJSFObjectField<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: FieldProps<T, S, F>) {\n const { schema, formData, onChange } = props\n const {\n fields: { ObjectField },\n } = getDefaultRegistry<T, S, F>()\n /**\n * For an object, this will\n * - convert additionalProperties formData to arrays\n * - convert schema-defined formData from an array to a non-array if the schema type is not an array\n * @param props\n */\n useEffect(() => {\n const newFormData: Record<string, any> = { ...formData }\n const allProperties = getPossibleTopLevelPropertiesInObjectSchema(schema)\n if (allProperties) {\n Object.entries(allProperties).forEach(([key, propertySchema]) => {\n // Since the annotations object is flat, we can safely use the property name as the key (no nested properties)\n const data = newFormData[key]\n if (\n (\n propertySchema as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n )[ADDITIONAL_PROPERTY_FLAG]\n ) {\n /**\n * All additional properties should be converted to arrays.\n *\n * We need to convert it right away because the order of items is not stable, and seems to depend on if the item is an array or not\n */\n if (!Array.isArray(data)) {\n newFormData[key] = convertToArray(data)\n }\n } else {\n /**\n * If the schema does not call for an array, but the formData is an array, then this will coerce it to a string.\n *\n * This can occur when a formData value is an additionalProperty, which we always treat as an array, then the key\n * is added to the schema (e.g. conditionally).\n */\n if (\n typeof propertySchema === 'object' &&\n 'type' in propertySchema &&\n propertySchema.type !== 'array' &&\n Array.isArray(data)\n ) {\n newFormData[key] = data.map(v => `${v}`).join(', ')\n }\n }\n })\n if (!deepEquals(formData, newFormData)) {\n onChange(newFormData as T)\n }\n }\n }, [schema, formData, onChange])\n\n return <ObjectField {...props} />\n}\n\nexport default SynapseAnnotationsRJSFObjectField\n"],"mappings":";;;;;;AAmBA,SAAgB,EAId,GAA4B;CAC5B,IAAM,EAAE,WAAQ,aAAU,gBAAa,GACjC,EACJ,QAAQ,EAAE,qBACR,EAA4B;CAmDhC,OA5CA,QAAgB;EACd,IAAM,IAAmC,EAAE,GAAG,EAAS,GACjD,IAAgB,EAA4C,CAAM;EACxE,AAAI,MACF,OAAO,QAAQ,CAAa,EAAE,SAAS,CAAC,GAAK,OAAoB;GAE/D,IAAM,IAAO,EAAY;GACzB,AAEI,EAEA,KAOG,MAAM,QAAQ,CAAI,MACrB,EAAY,KAAO,EAAe,CAAI,KAUtC,OAAO,KAAmB,YAC1B,UAAU,KACV,EAAe,SAAS,WACxB,MAAM,QAAQ,CAAI,MAElB,EAAY,KAAO,EAAK,KAAI,MAAK,GAAG,GAAG,EAAE,KAAK,IAAI;EAGxD,CAAC,GACI,EAAW,GAAU,CAAW,KACnC,EAAS,CAAgB;CAG/B,GAAG;EAAC;EAAQ;EAAU;CAAQ,CAAC,GAExB,kBAAC,GAAD,EAAa,GAAI,EAAQ,CAAA;AAClC"}
1
+ {"version":3,"file":"SynapseAnnotationsRJSFObjectField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"sourcesContent":["import { getDefaultRegistry } from '@rjsf/core'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n deepEquals,\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { collectTopLevelProperties } from '@/utils/jsonschema/collectTopLevelProperties'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useEffect } from 'react'\nimport { convertToArray } from '../AnnotationEditorUtils'\n\n/**\n * Extends the @rjsf/core `ObjectField` and just adds a custom hook for Synapse annotation business logic\n */\nexport function SynapseAnnotationsRJSFObjectField<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: FieldProps<T, S, F>) {\n const { schema, formData, onChange } = props\n const {\n fields: { ObjectField },\n } = getDefaultRegistry<T, S, F>()\n /**\n * For an object, this will\n * - convert additionalProperties formData to arrays\n * - convert schema-defined formData from an array to a non-array if the schema type is not an array\n * @param props\n */\n useEffect(() => {\n const newFormData: Record<string, any> = { ...formData }\n const allProperties = collectTopLevelProperties(schema)\n if (allProperties) {\n Object.entries(allProperties).forEach(([key, propertySchema]) => {\n // Since the annotations object is flat, we can safely use the property name as the key (no nested properties)\n const data = newFormData[key]\n if (\n (\n propertySchema as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n )[ADDITIONAL_PROPERTY_FLAG]\n ) {\n /**\n * All additional properties should be converted to arrays.\n *\n * We need to convert it right away because the order of items is not stable, and seems to depend on if the item is an array or not\n */\n if (!Array.isArray(data)) {\n newFormData[key] = convertToArray(data)\n }\n } else {\n /**\n * If the schema does not call for an array, but the formData is an array, then this will coerce it to a string.\n *\n * This can occur when a formData value is an additionalProperty, which we always treat as an array, then the key\n * is added to the schema (e.g. conditionally).\n */\n if (\n typeof propertySchema === 'object' &&\n 'type' in propertySchema &&\n propertySchema.type !== 'array' &&\n Array.isArray(data)\n ) {\n newFormData[key] = data.map(v => `${v}`).join(', ')\n }\n }\n })\n if (!deepEquals(formData, newFormData)) {\n onChange(newFormData as T)\n }\n }\n }, [schema, formData, onChange])\n\n return <ObjectField {...props} />\n}\n\nexport default SynapseAnnotationsRJSFObjectField\n"],"mappings":";;;;;;;AAiBA,SAAgB,EAId,GAA4B;CAC5B,IAAM,EAAE,WAAQ,aAAU,gBAAa,GACjC,EACJ,QAAQ,EAAE,qBACR,EAA4B;CAmDhC,OA5CA,QAAgB;EACd,IAAM,IAAmC,EAAE,GAAG,EAAS,GACjD,IAAgB,EAA0B,CAAM;EACtD,AAAI,MACF,OAAO,QAAQ,CAAa,EAAE,SAAS,CAAC,GAAK,OAAoB;GAE/D,IAAM,IAAO,EAAY;GACzB,AAEI,EAEA,KAOG,MAAM,QAAQ,CAAI,MACrB,EAAY,KAAO,EAAe,CAAI,KAUtC,OAAO,KAAmB,YAC1B,UAAU,KACV,EAAe,SAAS,WACxB,MAAM,QAAQ,CAAI,MAElB,EAAY,KAAO,EAAK,KAAI,MAAK,GAAG,GAAG,EAAE,KAAK,IAAI;EAGxD,CAAC,GACI,EAAW,GAAU,CAAW,KACnC,EAAS,CAAgB;CAG/B,GAAG;EAAC;EAAQ;EAAU;CAAQ,CAAC,GAExB,kBAAC,GAAD,EAAa,GAAI,EAAQ,CAAA;AAClC"}
@@ -15,6 +15,8 @@ export type SearchQueryConfig = {
15
15
  * queried at equal weight.
16
16
  */
17
17
  fieldBoosts?: Record<string, number>;
18
+ /** Whether to append `*` to fieldBoosts at neutral weight. Defaults to true. */
19
+ includeUnlistedFields?: boolean;
18
20
  /**
19
21
  * Fuzziness override. Overrides the per-strategy default. Leave undefined to
20
22
  * use each strategy's natural default (AUTO for MULTI_MATCH/BOOSTED_FUZZY,
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,WAAW,EAEX,uBAAuB,EAIvB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EAIP,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAGV,gBAAgB,EAChB,kBAAkB,EAElB,kBAAkB,EAEnB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAUzD,MAAM,MAAM,mBAAmB,GAC3B,aAAa,GACb,yBAAyB,GACzB,0BAA0B,GAC1B,qBAAqB,GACrB,eAAe,GACf,eAAe,CAAA;AAEnB,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAkJD;;;;;GAKG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,uBAAuB,CAC1C,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,MAAM,GAAG,SAAS,CACnB,CAAA;IACD,2BAA2B,EAAE,uBAAuB,CAClD,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,YAAY,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,EACxE,QAAQ,EACR,MAAM,GAAG,MAAM,GAAG,SAAS,CAC5B,CAAA;IACD,yBAAyB,EAAE,uBAAuB,CAChD,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CACvC,CAAA;CACF,CAAA;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EACpE,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,GACrE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyB7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,WAAW,EAAE,EAC5B,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,gBAAgB,CAkKlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,KAAK,EAAE,gBAAgB,EACvB,YAAY,CAAC,EAAE,WAAW,EAAE,EAC5B,cAAc,CAAC,EAAE,CAAC,wBAAwB,GAAG,uBAAuB,CAAC,EAAE,GACtE,iBAAiB,CAwKnB;AAED,wBAAgB,6BAA6B,CAC3C,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,WAAW,EAAE,EAC5B,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,+BAA+B,CAgJjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,GAAG,SAAS,GACxC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAoC3C;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,+BAA+B,CA2BjC"}
1
+ {"version":3,"file":"SearchQueryUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"names":[],"mappings":"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"}