synapse-react-client 4.0.46 → 4.0.47

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 (559) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/useSubmitAridhiaDar.js +2 -2
  3. package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -1
  4. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +1 -1
  5. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  6. package/dist/components/AccountLevelBadges/AccountLevelBadges.js +1 -1
  7. package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
  8. package/dist/components/AclEditor/AclEditor.test-utils.js +3 -5
  9. package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
  10. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  11. package/dist/components/Aridhia/AridhiaAccessStatus.js +43 -30
  12. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  13. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +6 -2
  14. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -1
  15. package/dist/components/Aridhia/AridhiaDarStatusPopover.js +101 -31
  16. package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -1
  17. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +11 -9
  18. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
  19. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +24 -13
  20. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  21. package/dist/components/Authentication/LastLoginInfo.js +2 -2
  22. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  23. package/dist/components/Authentication/RecoveryCodeForm.js +1 -1
  24. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  25. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  26. package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
  27. package/dist/components/Authentication/TOTPForm.js +3 -3
  28. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  29. package/dist/components/Authentication/index.d.ts +6 -6
  30. package/dist/components/Authentication/index.d.ts.map +1 -1
  31. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +1 -1
  32. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
  33. package/dist/components/CardContainer/CardContainer.js +7 -7
  34. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  35. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js +1 -1
  36. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
  37. package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
  38. package/dist/components/ChallengeSubmission/ChallengeSubmission.js +1 -1
  39. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  40. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +1 -1
  41. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
  42. package/dist/components/CitationPopover/CitationPopoverUtils.js +2 -2
  43. package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
  44. package/dist/components/CohortBuilder/CohortBuilder.css +1 -0
  45. package/dist/components/CohortBuilder/CohortBuilder.d.ts +35 -0
  46. package/dist/components/CohortBuilder/CohortBuilder.d.ts.map +1 -0
  47. package/dist/components/CohortBuilder/CohortBuilder.js +108 -0
  48. package/dist/components/CohortBuilder/CohortBuilder.js.map +1 -0
  49. package/dist/components/CohortBuilder/CohortBuilder.module.js +10 -0
  50. package/dist/components/CohortBuilder/CohortBuilder.module.js.map +1 -0
  51. package/dist/components/CohortBuilder/CohortBuilder.module.scss +20 -0
  52. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts +16 -0
  53. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts.map +1 -0
  54. package/dist/components/CohortBuilder/CohortFilesPanel.js +124 -0
  55. package/dist/components/CohortBuilder/CohortFilesPanel.js.map +1 -0
  56. package/dist/components/CohortBuilder/cohortHandOff.d.ts +25 -0
  57. package/dist/components/CohortBuilder/cohortHandOff.d.ts.map +1 -0
  58. package/dist/components/CohortBuilder/cohortHandOff.js +26 -0
  59. package/dist/components/CohortBuilder/cohortHandOff.js.map +1 -0
  60. package/dist/components/ColumnFilter/ColumnFilter.d.ts.map +1 -1
  61. package/dist/components/ColumnFilter/ColumnFilter.js +14 -13
  62. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  63. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
  64. package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
  65. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +11 -2
  66. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  67. package/dist/components/DataGrid/columns/AutocompleteColumn.js +115 -109
  68. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  69. package/dist/components/DataGrid/columns/NumberColumn.js +1 -1
  70. package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -1
  71. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts +20 -0
  72. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts.map +1 -0
  73. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js +18 -0
  74. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js.map +1 -0
  75. package/dist/components/DataGrid/components/contextMenu.js +3 -3
  76. package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
  77. package/dist/components/DataGrid/hooks/useGridUndoRedo.d.ts.map +1 -1
  78. package/dist/components/DataGrid/hooks/useGridUndoRedo.js +9 -7
  79. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  80. package/dist/components/DataGrid/hooks/useStack.d.ts +1 -1
  81. package/dist/components/DataGrid/hooks/useStack.js +2 -2
  82. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  83. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  84. package/dist/components/DataGrid/utils/columnFactory.js +47 -42
  85. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  86. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js +7 -7
  87. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  88. package/dist/components/DataGrid/utils/json-rx/JsonRx.js +2 -2
  89. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  90. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
  91. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  92. package/dist/components/DownloadCart/MeetAccessRequirementCard.js +1 -1
  93. package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
  94. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +5 -5
  95. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  96. package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
  97. package/dist/components/EntityFinder/details/view/DetailsView.js +4 -4
  98. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  99. package/dist/components/EntityHeaderTable/EntityHeaderTable.js +4 -4
  100. package/dist/components/EntityHeaderTable/Filter.d.ts.map +1 -1
  101. package/dist/components/EntityHeaderTable/Filter.js +1 -1
  102. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  103. package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
  104. package/dist/components/FeaturedDataTabs/FacetPlotsCard.d.ts.map +1 -1
  105. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +80 -84
  106. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  107. package/dist/components/FormTemplateEditor/FormStructurePanel.js +7 -7
  108. package/dist/components/FormTemplateEditor/StepCard.js +9 -9
  109. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +2 -2
  110. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
  111. package/dist/components/FullTextSearch/FullTextSearch.js +8 -8
  112. package/dist/components/GenericCard/CardUtils.js.map +1 -1
  113. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +1 -1
  114. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -1
  115. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +1 -1
  116. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -1
  117. package/dist/components/GenericCard/TableRowGenericCard.js +37 -37
  118. package/dist/components/GoalsV3/GoalsV3.js +1 -1
  119. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  120. package/dist/components/HexGrid/HexGrid.d.ts +3 -1
  121. package/dist/components/HexGrid/HexGrid.d.ts.map +1 -1
  122. package/dist/components/HexGrid/HexGrid.js +14 -13
  123. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  124. package/dist/components/IconSvg/index.d.ts +1 -1
  125. package/dist/components/IconSvg/index.d.ts.map +1 -1
  126. package/dist/components/IconSvg/index.js.map +1 -1
  127. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.d.ts.map +1 -1
  128. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js +3 -3
  129. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  130. package/dist/components/Markdown/MarkdownEditor.js +1 -1
  131. package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
  132. package/dist/components/Markdown/widget/index.d.ts +1 -1
  133. package/dist/components/Markdown/widget/index.d.ts.map +1 -1
  134. package/dist/components/ModalDownload/ModalDownload.d.ts.map +1 -1
  135. package/dist/components/ModalDownload/ModalDownload.js +2 -1
  136. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  137. package/dist/components/Plot/BarPlot.js +1 -1
  138. package/dist/components/Plot/BarPlot.js.map +1 -1
  139. package/dist/components/Plot/PlotPanelHeader.d.ts +3 -2
  140. package/dist/components/Plot/PlotPanelHeader.d.ts.map +1 -1
  141. package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
  142. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js +1 -1
  143. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  144. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js +1 -1
  145. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  146. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  147. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +3 -3
  148. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  149. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  150. package/dist/components/QueryBuilder/FilterConditionRow.js +28 -27
  151. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  152. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
  153. package/dist/components/QueryBuilder/FilterGroupNode.js +91 -75
  154. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
  155. package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -1
  156. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  157. package/dist/components/QueryBuilder/QueryBuilderControls.js +91 -79
  158. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  159. package/dist/components/QueryBuilder/QueryBuilderControls.module.js +11 -11
  160. package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -1
  161. package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +2 -0
  162. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +2 -0
  163. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
  164. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
  165. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts +18 -0
  166. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts.map +1 -0
  167. package/dist/components/QueryBuilder/queryBuilderLimits.js +38 -0
  168. package/dist/components/QueryBuilder/queryBuilderLimits.js.map +1 -0
  169. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +0 -8
  170. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
  171. package/dist/components/QueryBuilder/queryBuilderMetadata.js +6 -9
  172. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
  173. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +5 -4
  174. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
  175. package/dist/components/QueryBuilder/queryBuilderTranslation.js +58 -33
  176. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  177. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -1
  178. package/dist/components/QueryBuilder/useQBCombinedSql.js +4 -4
  179. package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -1
  180. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -1
  181. package/dist/components/QueryBuilder/useQBValueDisplayName.js +5 -5
  182. package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -1
  183. package/dist/components/QuerySortSelector.js +5 -5
  184. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +21 -21
  185. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  186. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts +20 -0
  187. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts.map +1 -0
  188. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js +50 -0
  189. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js.map +1 -0
  190. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts +5 -3
  191. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts.map +1 -1
  192. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js +7 -3
  193. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  194. package/dist/components/QueryWrapper/downloadListFiles.d.ts +25 -0
  195. package/dist/components/QueryWrapper/downloadListFiles.d.ts.map +1 -0
  196. package/dist/components/QueryWrapper/downloadListFiles.js +39 -0
  197. package/dist/components/QueryWrapper/downloadListFiles.js.map +1 -0
  198. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts +16 -0
  199. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts.map +1 -0
  200. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js +50 -0
  201. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js.map +1 -0
  202. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts +4 -1
  203. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts.map +1 -1
  204. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js +15 -28
  205. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
  206. package/dist/components/QueryWrapper/useOnQueryDataChange.d.ts.map +1 -1
  207. package/dist/components/QueryWrapper/useOnQueryDataChange.js +7 -6
  208. package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
  209. package/dist/components/QueryWrapperErrorBoundary.d.ts +3 -1
  210. package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
  211. package/dist/components/QueryWrapperErrorBoundary.js +26 -21
  212. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  213. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +7 -7
  214. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +2 -2
  215. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  216. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +34 -32
  217. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  218. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +7 -7
  219. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  220. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +12 -12
  221. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  222. package/dist/components/RowDataTable/CategorizedRowDataTable.css +1 -0
  223. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts +33 -0
  224. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts.map +1 -0
  225. package/dist/components/RowDataTable/CategorizedRowDataTable.js +64 -0
  226. package/dist/components/RowDataTable/CategorizedRowDataTable.js.map +1 -0
  227. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js +8 -0
  228. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js.map +1 -0
  229. package/dist/components/RowDataTable/CategorizedRowDataTable.module.scss +18 -0
  230. package/dist/components/RowDataTable/RowDataTable.d.ts +13 -0
  231. package/dist/components/RowDataTable/RowDataTable.d.ts.map +1 -1
  232. package/dist/components/RowDataTable/RowDataTable.js +25 -8
  233. package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
  234. package/dist/components/RssFeedCards/RssFeedCards.js +1 -1
  235. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  236. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.d.ts.map +1 -1
  237. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js +2 -2
  238. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
  239. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js +1 -1
  240. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
  241. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +17 -9
  242. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  243. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +39 -30
  244. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  245. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +24 -24
  246. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  247. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js +8 -8
  248. package/dist/components/SynapseChat/SynapseChatMessage.js +1 -1
  249. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  250. package/dist/components/SynapseForm/NavButtons.js.map +1 -1
  251. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  252. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js +1 -1
  253. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
  254. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.d.ts.map +1 -1
  255. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js +3 -3
  256. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  257. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.d.ts.map +1 -1
  258. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +38 -44
  259. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  260. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +4 -4
  261. package/dist/components/SynapseTable/SqlEditor.js +7 -7
  262. package/dist/components/SynapseTable/SynapseTable.js +8 -8
  263. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  264. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  265. package/dist/components/SynapseTable/SynapseTableRenderers.js +73 -72
  266. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  267. package/dist/components/SynapseTable/SynapseTableUtils.js +1 -1
  268. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  269. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  270. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +44 -45
  271. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  272. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js +1 -1
  273. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
  274. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.d.ts.map +1 -1
  275. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +142 -142
  276. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  277. package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +4 -4
  278. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +12 -12
  279. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
  280. package/dist/components/SynapseTable/table-top/ColumnSelection.js +6 -6
  281. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +0 -1
  282. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
  283. package/dist/components/SynapseTable/table-top/DownloadOptions.js +64 -57
  284. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  285. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  286. package/dist/components/SynapseTable/usePrefetchTableData.js +3 -3
  287. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  288. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
  289. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  290. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js +1 -1
  291. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
  292. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +2 -2
  293. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  294. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +60 -60
  295. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  296. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js +1 -1
  297. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  298. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js +1 -1
  299. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  300. package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
  301. package/dist/components/TanStackTable/StyledTanStackTable.js +1 -4
  302. package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
  303. package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
  304. package/dist/components/TotalQueryResults.js +14 -14
  305. package/dist/components/Webhook/WebhookDashboard.d.ts.map +1 -1
  306. package/dist/components/Webhook/WebhookDashboard.js +2 -2
  307. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  308. package/dist/components/download_list/DownloadConfirmationUtils.d.ts +5 -1
  309. package/dist/components/download_list/DownloadConfirmationUtils.d.ts.map +1 -1
  310. package/dist/components/download_list/DownloadConfirmationUtils.js +2 -2
  311. package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
  312. package/dist/components/error/ErrorBanner.d.ts.map +1 -1
  313. package/dist/components/error/ErrorBanner.js +49 -46
  314. package/dist/components/error/ErrorBanner.js.map +1 -1
  315. package/dist/components/file/upload/MultiFileUploadProgress.js +5 -5
  316. package/dist/components/row_renderers/Dataset.d.ts.map +1 -1
  317. package/dist/components/row_renderers/Dataset.js +6 -6
  318. package/dist/components/row_renderers/Dataset.js.map +1 -1
  319. package/dist/components/row_renderers/Funder.js +1 -1
  320. package/dist/components/row_renderers/Funder.js.map +1 -1
  321. package/dist/components/widgets/ElementWithTooltip.d.ts +6 -1
  322. package/dist/components/widgets/ElementWithTooltip.d.ts.map +1 -1
  323. package/dist/components/widgets/ElementWithTooltip.js +22 -14
  324. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  325. package/dist/components/widgets/RangeSlider/RangeSlider.d.ts.map +1 -1
  326. package/dist/components/widgets/RangeSlider/RangeSlider.js +1 -1
  327. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  328. package/dist/components/widgets/SynapseImage.js +1 -1
  329. package/dist/components/widgets/SynapseImage.js.map +1 -1
  330. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +16 -5
  331. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  332. package/dist/components/widgets/facet-nav/FacetNavPanel.js +115 -102
  333. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  334. package/dist/components/widgets/facet-nav/FacetPlotLegendList.d.ts.map +1 -1
  335. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js +4 -2
  336. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
  337. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js +1 -1
  338. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
  339. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts +2 -0
  340. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts.map +1 -1
  341. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
  342. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +7 -0
  343. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
  344. package/dist/components/widgets/facet-nav/PlotsContainer.js +47 -45
  345. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  346. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +4 -4
  347. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts +3 -2
  348. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
  349. package/dist/components/widgets/facet-nav/useFacetPlots.js +16 -15
  350. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  351. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js +4 -4
  352. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +2 -2
  353. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  354. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +62 -60
  355. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  356. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -0
  357. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  358. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +10 -10
  359. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  360. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
  361. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  362. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +2 -1
  363. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  364. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts +3 -2
  365. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts.map +1 -1
  366. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
  367. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts +3 -2
  368. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  369. package/dist/components/widgets/query-filter/FacetFilterControls.js +63 -62
  370. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  371. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.d.ts.map +1 -1
  372. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js +30 -29
  373. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
  374. package/dist/components/widgets/query-filter/RangeFacetFilter.js +5 -5
  375. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts +53 -0
  376. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts.map +1 -0
  377. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js +391 -0
  378. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js.map +1 -0
  379. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts +41 -0
  380. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts.map +1 -0
  381. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js +379 -0
  382. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js.map +1 -0
  383. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts +26 -0
  384. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts.map +1 -0
  385. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js +112 -0
  386. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js.map +1 -0
  387. package/dist/mocks/mockAnnotationColumns.d.ts.map +1 -1
  388. package/dist/mocks/mockAnnotationColumns.js +1 -1
  389. package/dist/mocks/mockAnnotationColumns.js.map +1 -1
  390. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +9 -0
  391. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  392. package/dist/mocks/msw/handlers/aridhiaHandlers.js +24 -15
  393. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  394. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +21 -2
  395. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
  396. package/dist/mocks/msw/handlers/asyncJobHandlers.js +30 -22
  397. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  398. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts +27 -0
  399. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts.map +1 -0
  400. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js +158 -0
  401. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js.map +1 -0
  402. package/dist/mocks/msw/handlers/subscriptionHandlers.js +1 -1
  403. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  404. package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
  405. package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
  406. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  407. package/dist/mocks/query/mockColumnCategoryTable.d.ts +19 -0
  408. package/dist/mocks/query/mockColumnCategoryTable.d.ts.map +1 -0
  409. package/dist/mocks/query/mockColumnCategoryTable.js +188 -0
  410. package/dist/mocks/query/mockColumnCategoryTable.js.map +1 -0
  411. package/dist/stories/ColorPaletteInspector.d.ts.map +1 -1
  412. package/dist/stories/ColorPaletteInspector.js +2 -2
  413. package/dist/stories/ColorPaletteInspector.js.map +1 -1
  414. package/dist/style/components/facet_nav/_facet-nav-panel.scss +8 -0
  415. package/dist/style/main.css +1 -1
  416. package/dist/synapse-queries/auth/useOIDC.js +2 -2
  417. package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
  418. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +2 -2
  419. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -1
  420. package/dist/synapse-queries/challenge/useChallenge.js +2 -2
  421. package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
  422. package/dist/synapse-queries/chat/useChat.js +8 -8
  423. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  424. package/dist/synapse-queries/curation/task/useCurationTask.js +10 -10
  425. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  426. package/dist/synapse-queries/dataaccess/useAccessRequirements.js +24 -24
  427. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  428. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js +4 -4
  429. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
  430. package/dist/synapse-queries/dataaccess/useEDuc.js +6 -6
  431. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  432. package/dist/synapse-queries/dataaccess/useFormTemplate.js +4 -4
  433. package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -1
  434. package/dist/synapse-queries/download/index.js +2 -2
  435. package/dist/synapse-queries/download/useDownloadList.d.ts +5 -0
  436. package/dist/synapse-queries/download/useDownloadList.d.ts.map +1 -1
  437. package/dist/synapse-queries/download/useDownloadList.js +14 -13
  438. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  439. package/dist/synapse-queries/entity/useEntity.d.ts.map +1 -1
  440. package/dist/synapse-queries/entity/useEntity.js +20 -20
  441. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  442. package/dist/synapse-queries/entity/useExportToADWorkbench.d.ts.map +1 -1
  443. package/dist/synapse-queries/entity/useExportToADWorkbench.js +2 -1
  444. package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
  445. package/dist/synapse-queries/entity/useExportToCavatica.d.ts.map +1 -1
  446. package/dist/synapse-queries/entity/useExportToCavatica.js +3 -2
  447. package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
  448. package/dist/synapse-queries/entity/useExportToPluto.d.ts.map +1 -1
  449. package/dist/synapse-queries/entity/useExportToPluto.js +2 -1
  450. package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
  451. package/dist/synapse-queries/entity/useGetQueryResultBundle.d.ts.map +1 -1
  452. package/dist/synapse-queries/entity/useGetQueryResultBundle.js +4 -7
  453. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  454. package/dist/synapse-queries/forum/useReply.js +6 -6
  455. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  456. package/dist/synapse-queries/forum/useThread.js +14 -14
  457. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  458. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
  459. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  460. package/dist/synapse-queries/grid/useGridSession.js +4 -4
  461. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  462. package/dist/synapse-queries/index.js +177 -176
  463. package/dist/synapse-queries/oauth/useOAuthClient.js +9 -9
  464. package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
  465. package/dist/synapse-queries/portal/usePortal.js +7 -7
  466. package/dist/synapse-queries/portal/usePortal.js.map +1 -1
  467. package/dist/synapse-queries/subscription/useSubscription.js +4 -4
  468. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  469. package/dist/synapse-queries/table/useTableUpdateTransaction.js +2 -2
  470. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  471. package/dist/synapse-queries/team/useTeam.js +2 -2
  472. package/dist/synapse-queries/team/useTeam.js.map +1 -1
  473. package/dist/synapse-queries/team/useTeamList.d.ts.map +1 -1
  474. package/dist/synapse-queries/team/useTeamList.js +3 -3
  475. package/dist/synapse-queries/team/useTeamList.js.map +1 -1
  476. package/dist/synapse-queries/team/useTeamMembers.js +8 -8
  477. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  478. package/dist/synapse-queries/termsOfService/useTermsOfService.js +2 -2
  479. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  480. package/dist/synapse-queries/trash/useTrashCan.js +4 -4
  481. package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
  482. package/dist/synapse-queries/user/useCertificationQuiz.js +2 -2
  483. package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
  484. package/dist/synapse-queries/user/useFavorites.js +4 -4
  485. package/dist/synapse-queries/user/useFavorites.js.map +1 -1
  486. package/dist/synapse-queries/user/useRevokeCertification.js +2 -2
  487. package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
  488. package/dist/synapse-queries/wiki/useWiki.js +10 -10
  489. package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
  490. package/dist/tsconfig.build.tsbuildinfo +1 -1
  491. package/dist/utils/ContentTypeUtils.js +4 -4
  492. package/dist/utils/ContentTypeUtils.js.map +1 -1
  493. package/dist/utils/PermissionLevelToAccessType.js +1 -1
  494. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  495. package/dist/utils/analytics/useGoogleAnalytics.js +1 -1
  496. package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
  497. package/dist/utils/context/DocumentMetadataContext.js +1 -1
  498. package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
  499. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  500. package/dist/utils/functions/AccessControlListUtils.js +3 -3
  501. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  502. package/dist/utils/functions/ArrayUtils.js +2 -2
  503. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  504. package/dist/utils/functions/FileHandleUtils.js +1 -1
  505. package/dist/utils/functions/FileHandleUtils.js.map +1 -1
  506. package/dist/utils/functions/RegularExpressions.js +1 -1
  507. package/dist/utils/functions/RegularExpressions.js.map +1 -1
  508. package/dist/utils/functions/StringUtils.d.ts.map +1 -1
  509. package/dist/utils/functions/StringUtils.js +1 -2
  510. package/dist/utils/functions/StringUtils.js.map +1 -1
  511. package/dist/utils/functions/deepLinkingUtils.js +2 -2
  512. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  513. package/dist/utils/functions/enumerationFacet.d.ts +26 -0
  514. package/dist/utils/functions/enumerationFacet.d.ts.map +1 -0
  515. package/dist/utils/functions/enumerationFacet.js +27 -0
  516. package/dist/utils/functions/enumerationFacet.js.map +1 -0
  517. package/dist/utils/functions/facetCountUtils.d.ts +12 -0
  518. package/dist/utils/functions/facetCountUtils.d.ts.map +1 -0
  519. package/dist/utils/functions/facetCountUtils.js +9 -0
  520. package/dist/utils/functions/facetCountUtils.js.map +1 -0
  521. package/dist/utils/functions/getEndpoint.js.map +1 -1
  522. package/dist/utils/functions/getUserData.js +1 -1
  523. package/dist/utils/functions/getUserData.js.map +1 -1
  524. package/dist/utils/functions/queryUtils.d.ts +1 -1
  525. package/dist/utils/functions/queryUtils.d.ts.map +1 -1
  526. package/dist/utils/functions/queryUtils.js +26 -22
  527. package/dist/utils/functions/queryUtils.js.map +1 -1
  528. package/dist/utils/functions/testDownloadSpeed.d.ts.map +1 -1
  529. package/dist/utils/functions/testDownloadSpeed.js +17 -26
  530. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  531. package/dist/utils/functions/unCamelCase.js +1 -1
  532. package/dist/utils/functions/unCamelCase.js.map +1 -1
  533. package/dist/utils/hooks/useGetInfoFromIds.js +5 -5
  534. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  535. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js +1 -1
  536. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
  537. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  538. package/dist/utils/hooks/useLogin.js +5 -5
  539. package/dist/utils/hooks/useLogin.js.map +1 -1
  540. package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
  541. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +6 -0
  542. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -1
  543. package/dist/utils/jsonschema/collectTopLevelProperties.js +1 -1
  544. package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -1
  545. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts +22 -0
  546. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts.map +1 -0
  547. package/dist/utils/jsonschema/getNumberOrEnumInfo.js +39 -0
  548. package/dist/utils/jsonschema/getNumberOrEnumInfo.js.map +1 -0
  549. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts +1 -0
  550. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts.map +1 -1
  551. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js +1 -1
  552. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
  553. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts +5 -0
  554. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
  555. package/dist/utils/jsonschema/getSchemaPropertyInfo.js +30 -15
  556. package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
  557. package/dist/utils/jsonschema/submissionContext.js +2 -2
  558. package/dist/utils/jsonschema/submissionContext.js.map +1 -1
  559. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"EvaluationRoundEditor.js","names":[],"sources":["../../../src/components/Evaluation/EvaluationRoundEditor.tsx"],"sourcesContent":["import {\n createEvaluationRound,\n deleteEvaluationRound,\n updateEvaluationRound,\n} from '@/synapse-client/SynapseClient'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { useListState } from '@/utils/hooks/useListState'\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Grid as Grid2,\n TextField,\n} from '@mui/material'\nimport { DateTimeValidationError } from '@mui/x-date-pickers'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n EvaluationRound,\n EvaluationRoundLimit,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs, { Dayjs } from 'dayjs'\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter'\nimport utc from 'dayjs/plugin/utc'\nimport { upperFirst } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport DateTimePicker from '../DateTimePicker/DateTimePicker'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport IconSvg, { IconSvgProps } from '../IconSvg/IconSvg'\nimport { EvaluationRoundEditorDropdown } from './EvaluationRoundEditorDropdown'\nimport {\n convertEvaluationRoundToInput,\n EvaluationRoundInput,\n EvaluationRoundLimitInput,\n} from './input_models/models'\nimport { EvaluationRoundLimitOptionsList } from './round_limits/EvaluationRoundLimitOptionsList'\n\ndayjs.extend(utc)\ndayjs.extend(isSameOrAfter)\n\nexport type EvaluationRoundEditorProps = {\n evaluationRoundInput: EvaluationRoundInput\n onDelete: () => void\n onSave: (evaluationRound: EvaluationRoundInput) => void\n}\n\nconst disallowCalendarDateBefore = (date: Dayjs) => {\n const startOfDay = date.startOf('day')\n return (currentDate: Dayjs) => currentDate.isSameOrAfter(startOfDay)\n}\n\nconst determineRoundStatus = (\n roundStart: Dayjs | string,\n roundEnd: Dayjs | string,\n) => {\n let className: string\n let iconProps: IconSvgProps | undefined\n let status: string\n const now = dayjs()\n // based off of start/end datetime from props so that users making\n // unsaved changes to the start/end dates do not change the status\n if (now.isSameOrAfter(roundStart)) {\n if (now.isBefore(roundEnd)) {\n className = 'status-in-progress'\n iconProps = { icon: 'sync' }\n status = 'IN PROGRESS'\n } else {\n className = 'status-completed'\n iconProps = { icon: 'clipboardCheck' }\n status = 'COMPLETED'\n }\n } else {\n className = 'status-not-yet-started'\n iconProps = undefined\n status = 'NOT YET STARTED'\n }\n\n return (\n <div className={className}>\n <div className=\"status\">\n {iconProps && <IconSvg {...iconProps} />}\n <span>{status}</span>\n </div>\n </div>\n )\n}\n\nconst convertInputsToEvaluationRound = (\n evaluationRoundInputProp: EvaluationRoundInput,\n startDate: string | Dayjs | null,\n endDate: string | Dayjs | null,\n totalSubmissionLimit: string,\n advancedLimits: EvaluationRoundLimitInput[],\n): EvaluationRound => {\n const limits: EvaluationRoundLimit[] = []\n if (totalSubmissionLimit) {\n const totalSubmissionLimitInt = Number(totalSubmissionLimit)\n if (Number.isNaN(totalSubmissionLimitInt)) {\n throw TypeError('Total Submission is not an integer')\n }\n limits.push({\n limitType: 'TOTAL',\n maximumSubmissions: totalSubmissionLimitInt,\n })\n }\n advancedLimits.forEach(limitInput => {\n if (limitInput.maxSubmissionString) {\n const maxSubmissionInt = Number(limitInput.maxSubmissionString)\n if (Number.isNaN(maxSubmissionInt)) {\n throw TypeError(limitInput.type + ' Limit is not an integer')\n }\n limits.push({\n limitType: limitInput.type,\n maximumSubmissions: maxSubmissionInt,\n })\n }\n })\n\n return {\n id: evaluationRoundInputProp.id,\n etag: evaluationRoundInputProp.etag,\n evaluationId: evaluationRoundInputProp.evaluationId,\n roundStart: dayjs.utc(startDate).toJSON(),\n roundEnd: dayjs.utc(endDate).toJSON(),\n limits: limits,\n }\n}\n\nfunction getDateErrorMessage(\n dateField: 'start' | 'end',\n error: DateTimeValidationError | null,\n): string | null {\n if (error == null) return null\n switch (error) {\n case 'disablePast':\n return `${upperFirst(dateField)} date cannot be in the past`\n case 'invalidDate':\n default:\n return 'Invalid date'\n }\n}\n\nexport function EvaluationRoundEditor({\n evaluationRoundInput,\n onSave,\n onDelete,\n}: EvaluationRoundEditorProps) {\n const { accessToken } = useSynapseContext()\n const { setIsEditing } = useGlobalIsEditingContext()\n const [isDirty, setIsDirty] = useState(false)\n const [error, setError] = useState<string | SynapseClientError | undefined>()\n const [showSaveSuccess, setShowSaveSuccess] = useState<boolean>(false)\n\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n useEffect(() => {\n if (error) {\n setShowSaveSuccess(false)\n }\n }, [error])\n\n const [startDate, setStartDate] = useState<Dayjs | null>(\n evaluationRoundInput.roundStart\n ? dayjs(evaluationRoundInput.roundStart)\n : null,\n )\n const [endDate, setEndDate] = useState<Dayjs | null>(\n evaluationRoundInput.roundEnd ? dayjs(evaluationRoundInput.roundEnd) : null,\n )\n\n const [totalSubmissionLimit, setTotalSubmissionLimit] = useState<string>(\n evaluationRoundInput.totalSubmissionLimit,\n )\n\n const [advancedMode, setAdvancedMode] = useState<boolean>(false)\n\n const [startDateError, setStartDateError] =\n useState<DateTimeValidationError | null>(null)\n const [endDateError, setEndDateError] =\n useState<DateTimeValidationError | null>(null)\n\n const {\n list: advancedLimits,\n handleListRemove,\n handleListChange: handleAdvancedLimitsChangeBase,\n appendToList: appendAdvancedLimit,\n } = useListState<EvaluationRoundLimitInput>(evaluationRoundInput.otherLimits)\n\n const handleAdvancedLimitsChange = (\n ...args: Parameters<typeof handleAdvancedLimitsChangeBase>\n ) => {\n setIsDirty(true)\n return handleAdvancedLimitsChangeBase(...args)\n }\n\n const addAdvancedLimit = (\n ...args: Parameters<typeof appendAdvancedLimit>\n ) => {\n setIsDirty(true)\n return appendAdvancedLimit(...args)\n }\n\n // if we remove the last advanced limit, hide the advanced limits\n const handleAdvancedLimitsRemove = (index: number) => {\n const generatedRemoveFunc = handleListRemove(index)\n return () => {\n //we are deleting the last advanced limit\n setIsDirty(true)\n generatedRemoveFunc()\n if (advancedLimits.length === 1) {\n // NOTE: we dont check for length == 0 because we don't modify the original list,\n // instead the generated function will setState() with a NEW empty list\n // so the original list we reference still has 1 element\n setAdvancedMode(false)\n }\n }\n }\n\n const onSaveButtonClick = () => {\n setShowSaveSuccess(false)\n let evaluationRound\n try {\n evaluationRound = convertInputsToEvaluationRound(\n evaluationRoundInput,\n startDate,\n endDate,\n totalSubmissionLimit,\n advancedLimits,\n )\n } catch (err) {\n // error thrown if number\n setError(err)\n }\n if (evaluationRound) {\n const promise = evaluationRound.id\n ? updateEvaluationRound(evaluationRound, accessToken)\n : createEvaluationRound(evaluationRound, accessToken)\n\n promise\n .then(createdOrUpdatedRound => {\n const newInput = convertEvaluationRoundToInput(\n createdOrUpdatedRound,\n evaluationRoundInput.reactListKey,\n )\n //clear out previous error if any\n setError(undefined)\n setShowSaveSuccess(true)\n setIsDirty(false)\n onSave(newInput)\n })\n .catch(error => setError(error))\n }\n }\n\n const onDeleteButtonClick = () => {\n if (evaluationRoundInput.id) {\n deleteEvaluationRound(\n evaluationRoundInput.evaluationId,\n evaluationRoundInput.id,\n accessToken,\n )\n .then(() => onDelete())\n .catch(error => setError(error))\n } else {\n onDelete()\n }\n }\n\n const disableStartInput = dayjs().isSameOrAfter(\n evaluationRoundInput.roundStart,\n )\n\n return (\n <div className=\"evaluation-round-editor\">\n <Card>\n <CardContent sx={{ p: 3 }}>\n <form aria-label={'Evaluation Round Form'}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <h5>\n ROUND STATUS\n {evaluationRoundInput.id &&\n ' (' + evaluationRoundInput.id + ')'}\n </h5>\n <EvaluationRoundEditorDropdown\n onDelete={onDeleteButtonClick}\n onSave={onSaveButtonClick}\n />\n </Box>\n <Box className=\"round-status\" sx={{ mb: 2 }}>\n {determineRoundStatus(\n evaluationRoundInput.roundStart,\n evaluationRoundInput.roundEnd,\n )}\n </Box>\n <h5>DURATION</h5>\n\n <Grid2 container>\n <Grid2 size={6}>\n <DateTimePicker\n label=\"Round Start\"\n value={startDate}\n onChange={date => {\n setStartDate(date)\n setIsDirty(true)\n }}\n onError={error => setStartDateError(error)}\n disabled={disableStartInput}\n // Don't allow the value to be a past date only if the input is not disabled.\n // i.e. allow a past date if the round has already started\n disablePast={!disableStartInput}\n slotProps={{\n textField: {\n helperText: getDateErrorMessage('start', startDateError),\n },\n }}\n />\n </Grid2>\n <Grid2 size={6}>\n <DateTimePicker\n label=\"Round End\"\n value={endDate}\n onChange={date => {\n setEndDate(date)\n setIsDirty(true)\n }}\n onError={error => setEndDateError(error)}\n disablePast={\n !dayjs(endDate).isSame(evaluationRoundInput.roundEnd)\n }\n slotProps={{\n textField: {\n helperText: getDateErrorMessage('end', endDateError),\n },\n }}\n />\n </Grid2>\n </Grid2>\n <h5 style={{ marginTop: '20px' }}>SUBMISSION LIMITS</h5>\n <TextField\n fullWidth\n label=\"Total Submissions / Round\"\n value={totalSubmissionLimit}\n onChange={event => {\n setTotalSubmissionLimit(event.target.value)\n setIsDirty(true)\n }}\n // Chrome for some reason decides to autofill this input box with email address, so we must disable autofill\n // this is a hacky, but consistent way to disable autofill because Chrome does not respect the spec :(\n // https://bugs.chromium.org/p/chromium/issues/detail?id=914451\n autoComplete=\"new-password\"\n slotProps={{\n htmlInput: {\n pattern: '[0-9]*',\n },\n }}\n />\n <Box sx={{ my: 2 }}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size={'small'}\n onClick={() => setAdvancedMode(!advancedMode)}\n >\n Advanced Limits\n </Button>\n </Box>\n {advancedMode && (\n <EvaluationRoundLimitOptionsList\n limitInputs={advancedLimits}\n handleChange={handleAdvancedLimitsChange}\n handleDeleteLimit={handleAdvancedLimitsRemove}\n onAddNewLimit={addAdvancedLimit}\n />\n )}\n\n {error && (\n <Box sx={{ my: 3 }}>\n <ErrorBanner error={error} />\n </Box>\n )}\n\n {showSaveSuccess && (\n <Box sx={{ my: 3 }}>\n <Alert\n className=\"save-success-alert\"\n severity=\"success\"\n onClose={() => setShowSaveSuccess(false)}\n sx={{ mb: '20px' }}\n >\n Successfully saved.\n </Alert>\n </Box>\n )}\n\n <Box sx={{ mt: 3, textAlign: 'right' }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={onSaveButtonClick}\n >\n Save\n </Button>\n </Box>\n </form>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport const HelpersToTest = {\n disallowCalendarDateBefore,\n determineRoundStatus,\n convertInputsToEvaluationRound,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EvaluationRoundEditor.js","names":[],"sources":["../../../src/components/Evaluation/EvaluationRoundEditor.tsx"],"sourcesContent":["import {\n createEvaluationRound,\n deleteEvaluationRound,\n updateEvaluationRound,\n} from '@/synapse-client/SynapseClient'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { useListState } from '@/utils/hooks/useListState'\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Grid as Grid2,\n TextField,\n} from '@mui/material'\nimport { DateTimeValidationError } from '@mui/x-date-pickers'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n EvaluationRound,\n EvaluationRoundLimit,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs, { Dayjs } from 'dayjs'\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter'\nimport utc from 'dayjs/plugin/utc'\nimport { upperFirst } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport DateTimePicker from '../DateTimePicker/DateTimePicker'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport IconSvg, { IconSvgProps } from '../IconSvg/IconSvg'\nimport { EvaluationRoundEditorDropdown } from './EvaluationRoundEditorDropdown'\nimport {\n convertEvaluationRoundToInput,\n EvaluationRoundInput,\n EvaluationRoundLimitInput,\n} from './input_models/models'\nimport { EvaluationRoundLimitOptionsList } from './round_limits/EvaluationRoundLimitOptionsList'\n\ndayjs.extend(utc)\ndayjs.extend(isSameOrAfter)\n\nexport type EvaluationRoundEditorProps = {\n evaluationRoundInput: EvaluationRoundInput\n onDelete: () => void\n onSave: (evaluationRound: EvaluationRoundInput) => void\n}\n\nconst disallowCalendarDateBefore = (date: Dayjs) => {\n const startOfDay = date.startOf('day')\n return (currentDate: Dayjs) => currentDate.isSameOrAfter(startOfDay)\n}\n\nconst determineRoundStatus = (\n roundStart: Dayjs | string,\n roundEnd: Dayjs | string,\n) => {\n let className: string\n let iconProps: IconSvgProps | undefined\n let status: string\n const now = dayjs()\n // based off of start/end datetime from props so that users making\n // unsaved changes to the start/end dates do not change the status\n if (now.isSameOrAfter(roundStart)) {\n if (now.isBefore(roundEnd)) {\n className = 'status-in-progress'\n iconProps = { icon: 'sync' }\n status = 'IN PROGRESS'\n } else {\n className = 'status-completed'\n iconProps = { icon: 'clipboardCheck' }\n status = 'COMPLETED'\n }\n } else {\n className = 'status-not-yet-started'\n iconProps = undefined\n status = 'NOT YET STARTED'\n }\n\n return (\n <div className={className}>\n <div className=\"status\">\n {iconProps && <IconSvg {...iconProps} />}\n <span>{status}</span>\n </div>\n </div>\n )\n}\n\nconst convertInputsToEvaluationRound = (\n evaluationRoundInputProp: EvaluationRoundInput,\n startDate: string | Dayjs | null,\n endDate: string | Dayjs | null,\n totalSubmissionLimit: string,\n advancedLimits: EvaluationRoundLimitInput[],\n): EvaluationRound => {\n const limits: EvaluationRoundLimit[] = []\n if (totalSubmissionLimit) {\n const totalSubmissionLimitInt = Number(totalSubmissionLimit)\n if (Number.isNaN(totalSubmissionLimitInt)) {\n throw new TypeError('Total Submission is not an integer')\n }\n limits.push({\n limitType: 'TOTAL',\n maximumSubmissions: totalSubmissionLimitInt,\n })\n }\n advancedLimits.forEach(limitInput => {\n if (limitInput.maxSubmissionString) {\n const maxSubmissionInt = Number(limitInput.maxSubmissionString)\n if (Number.isNaN(maxSubmissionInt)) {\n throw new TypeError(limitInput.type + ' Limit is not an integer')\n }\n limits.push({\n limitType: limitInput.type,\n maximumSubmissions: maxSubmissionInt,\n })\n }\n })\n\n return {\n id: evaluationRoundInputProp.id,\n etag: evaluationRoundInputProp.etag,\n evaluationId: evaluationRoundInputProp.evaluationId,\n roundStart: dayjs.utc(startDate).toJSON(),\n roundEnd: dayjs.utc(endDate).toJSON(),\n limits: limits,\n }\n}\n\nfunction getDateErrorMessage(\n dateField: 'start' | 'end',\n error: DateTimeValidationError | null,\n): string | null {\n if (error == null) return null\n switch (error) {\n case 'disablePast':\n return `${upperFirst(dateField)} date cannot be in the past`\n case 'invalidDate':\n default:\n return 'Invalid date'\n }\n}\n\nexport function EvaluationRoundEditor({\n evaluationRoundInput,\n onSave,\n onDelete,\n}: EvaluationRoundEditorProps) {\n const { accessToken } = useSynapseContext()\n const { setIsEditing } = useGlobalIsEditingContext()\n const [isDirty, setIsDirty] = useState(false)\n const [error, setError] = useState<string | SynapseClientError | undefined>()\n const [showSaveSuccess, setShowSaveSuccess] = useState<boolean>(false)\n\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n useEffect(() => {\n if (error) {\n setShowSaveSuccess(false)\n }\n }, [error])\n\n const [startDate, setStartDate] = useState<Dayjs | null>(\n evaluationRoundInput.roundStart\n ? dayjs(evaluationRoundInput.roundStart)\n : null,\n )\n const [endDate, setEndDate] = useState<Dayjs | null>(\n evaluationRoundInput.roundEnd ? dayjs(evaluationRoundInput.roundEnd) : null,\n )\n\n const [totalSubmissionLimit, setTotalSubmissionLimit] = useState<string>(\n evaluationRoundInput.totalSubmissionLimit,\n )\n\n const [advancedMode, setAdvancedMode] = useState<boolean>(false)\n\n const [startDateError, setStartDateError] =\n useState<DateTimeValidationError | null>(null)\n const [endDateError, setEndDateError] =\n useState<DateTimeValidationError | null>(null)\n\n const {\n list: advancedLimits,\n handleListRemove,\n handleListChange: handleAdvancedLimitsChangeBase,\n appendToList: appendAdvancedLimit,\n } = useListState<EvaluationRoundLimitInput>(evaluationRoundInput.otherLimits)\n\n const handleAdvancedLimitsChange = (\n ...args: Parameters<typeof handleAdvancedLimitsChangeBase>\n ) => {\n setIsDirty(true)\n return handleAdvancedLimitsChangeBase(...args)\n }\n\n const addAdvancedLimit = (\n ...args: Parameters<typeof appendAdvancedLimit>\n ) => {\n setIsDirty(true)\n return appendAdvancedLimit(...args)\n }\n\n // if we remove the last advanced limit, hide the advanced limits\n const handleAdvancedLimitsRemove = (index: number) => {\n const generatedRemoveFunc = handleListRemove(index)\n return () => {\n //we are deleting the last advanced limit\n setIsDirty(true)\n generatedRemoveFunc()\n if (advancedLimits.length === 1) {\n // NOTE: we dont check for length == 0 because we don't modify the original list,\n // instead the generated function will setState() with a NEW empty list\n // so the original list we reference still has 1 element\n setAdvancedMode(false)\n }\n }\n }\n\n const onSaveButtonClick = () => {\n setShowSaveSuccess(false)\n let evaluationRound\n try {\n evaluationRound = convertInputsToEvaluationRound(\n evaluationRoundInput,\n startDate,\n endDate,\n totalSubmissionLimit,\n advancedLimits,\n )\n } catch (err) {\n // error thrown if number\n setError(err)\n }\n if (evaluationRound) {\n const promise = evaluationRound.id\n ? updateEvaluationRound(evaluationRound, accessToken)\n : createEvaluationRound(evaluationRound, accessToken)\n\n promise\n .then(createdOrUpdatedRound => {\n const newInput = convertEvaluationRoundToInput(\n createdOrUpdatedRound,\n evaluationRoundInput.reactListKey,\n )\n //clear out previous error if any\n setError(undefined)\n setShowSaveSuccess(true)\n setIsDirty(false)\n onSave(newInput)\n })\n .catch(error => setError(error))\n }\n }\n\n const onDeleteButtonClick = () => {\n if (evaluationRoundInput.id) {\n deleteEvaluationRound(\n evaluationRoundInput.evaluationId,\n evaluationRoundInput.id,\n accessToken,\n )\n .then(() => onDelete())\n .catch(error => setError(error))\n } else {\n onDelete()\n }\n }\n\n const disableStartInput = dayjs().isSameOrAfter(\n evaluationRoundInput.roundStart,\n )\n\n return (\n <div className=\"evaluation-round-editor\">\n <Card>\n <CardContent sx={{ p: 3 }}>\n <form aria-label={'Evaluation Round Form'}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <h5>\n ROUND STATUS\n {evaluationRoundInput.id &&\n ' (' + evaluationRoundInput.id + ')'}\n </h5>\n <EvaluationRoundEditorDropdown\n onDelete={onDeleteButtonClick}\n onSave={onSaveButtonClick}\n />\n </Box>\n <Box className=\"round-status\" sx={{ mb: 2 }}>\n {determineRoundStatus(\n evaluationRoundInput.roundStart,\n evaluationRoundInput.roundEnd,\n )}\n </Box>\n <h5>DURATION</h5>\n\n <Grid2 container>\n <Grid2 size={6}>\n <DateTimePicker\n label=\"Round Start\"\n value={startDate}\n onChange={date => {\n setStartDate(date)\n setIsDirty(true)\n }}\n onError={error => setStartDateError(error)}\n disabled={disableStartInput}\n // Don't allow the value to be a past date only if the input is not disabled.\n // i.e. allow a past date if the round has already started\n disablePast={!disableStartInput}\n slotProps={{\n textField: {\n helperText: getDateErrorMessage('start', startDateError),\n },\n }}\n />\n </Grid2>\n <Grid2 size={6}>\n <DateTimePicker\n label=\"Round End\"\n value={endDate}\n onChange={date => {\n setEndDate(date)\n setIsDirty(true)\n }}\n onError={error => setEndDateError(error)}\n disablePast={\n !dayjs(endDate).isSame(evaluationRoundInput.roundEnd)\n }\n slotProps={{\n textField: {\n helperText: getDateErrorMessage('end', endDateError),\n },\n }}\n />\n </Grid2>\n </Grid2>\n <h5 style={{ marginTop: '20px' }}>SUBMISSION LIMITS</h5>\n <TextField\n fullWidth\n label=\"Total Submissions / Round\"\n value={totalSubmissionLimit}\n onChange={event => {\n setTotalSubmissionLimit(event.target.value)\n setIsDirty(true)\n }}\n // Chrome for some reason decides to autofill this input box with email address, so we must disable autofill\n // this is a hacky, but consistent way to disable autofill because Chrome does not respect the spec :(\n // https://bugs.chromium.org/p/chromium/issues/detail?id=914451\n autoComplete=\"new-password\"\n slotProps={{\n htmlInput: {\n pattern: '[0-9]*',\n },\n }}\n />\n <Box sx={{ my: 2 }}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size={'small'}\n onClick={() => setAdvancedMode(!advancedMode)}\n >\n Advanced Limits\n </Button>\n </Box>\n {advancedMode && (\n <EvaluationRoundLimitOptionsList\n limitInputs={advancedLimits}\n handleChange={handleAdvancedLimitsChange}\n handleDeleteLimit={handleAdvancedLimitsRemove}\n onAddNewLimit={addAdvancedLimit}\n />\n )}\n\n {error && (\n <Box sx={{ my: 3 }}>\n <ErrorBanner error={error} />\n </Box>\n )}\n\n {showSaveSuccess && (\n <Box sx={{ my: 3 }}>\n <Alert\n className=\"save-success-alert\"\n severity=\"success\"\n onClose={() => setShowSaveSuccess(false)}\n sx={{ mb: '20px' }}\n >\n Successfully saved.\n </Alert>\n </Box>\n )}\n\n <Box sx={{ mt: 3, textAlign: 'right' }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={onSaveButtonClick}\n >\n Save\n </Button>\n </Box>\n </form>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport const HelpersToTest = {\n disallowCalendarDateBefore,\n determineRoundStatus,\n convertInputsToEvaluationRound,\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FacetPlotsCard.d.ts","sourceRoot":"","sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAGL,QAAQ,EACT,MAAM,oCAAoC,CAAA;AAY3C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB,CAAA;AAkOD,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,2CAQ5E"}
1
+ {"version":3,"file":"FacetPlotsCard.d.ts","sourceRoot":"","sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAGL,QAAQ,EACT,MAAM,oCAAoC,CAAA;AAY3C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB,CAAA;AAyND,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,2CAQ5E"}
@@ -1,25 +1,26 @@
1
- import { useSynapseContext as e } from "../../utils/context/SynapseContext.js";
2
- import { SkeletonTable as t } from "../Skeleton/SkeletonTable.js";
3
- import { SkeletonParagraph as n } from "../Skeleton/SkeletonParagraph.js";
1
+ import { useQueryVisualizationContext as e } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
2
+ import { useSynapseContext as t } from "../../utils/context/SynapseContext.js";
3
+ import { getEnumerationFacets as n } from "../../utils/functions/enumerationFacet.js";
4
+ import { SkeletonTable as r } from "../Skeleton/SkeletonTable.js";
5
+ import { SkeletonParagraph as i } from "../Skeleton/SkeletonParagraph.js";
4
6
  import "../Skeleton/index.js";
5
- import r from "../ShowMore/ShowMore.js";
7
+ import a from "../ShowMore/ShowMore.js";
6
8
  import "../row_renderers/utils/index.js";
7
- import { useSuspenseGetQueryMetadata as i } from "../QueryWrapper/useGetQueryMetadata.js";
8
- import { useQueryVisualizationContext as a } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
9
+ import { useSuspenseGetQueryMetadata as o } from "../QueryWrapper/useGetQueryMetadata.js";
9
10
  import "../QueryVisualizationWrapper/index.js";
10
- import { Plot as o } from "../Plot/Plot.js";
11
- import { extractPlotDataArray as s, getPlotStyle as c } from "../widgets/facet-nav/FacetNavPanel.js";
12
- import { FacetPlotLegendTable as l } from "../widgets/facet-nav/FacetPlotLegendTable.js";
13
- import { getFacets as u } from "../widgets/facet-nav/useFacetPlots.js";
14
- import { FACET_PLOTS_CARD_CLASSNAME as d, FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME as f, FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME as p, FacetPlotsCardPlotContainer as m, FacetPlotsCardTitleContainer as h } from "./FacetPlotsCardGrid.js";
15
- import { Fragment as g, Suspense as _, useMemo as v } from "react";
16
- import { times as y } from "lodash-es";
17
- import { Box as b, Button as x, Divider as S, Paper as C, Skeleton as w, Typography as T } from "@mui/material";
18
- import { jsx as E, jsxs as D } from "react/jsx-runtime";
19
- import { useSuspenseQuery as O } from "@tanstack/react-query";
20
- import { useMeasure as k } from "@react-hookz/web";
11
+ import { Plot as s } from "../Plot/Plot.js";
12
+ import { extractPlotDataArray as c, getPlotStyle as l } from "../widgets/facet-nav/FacetNavPanel.js";
13
+ import { FacetPlotLegendTable as u } from "../widgets/facet-nav/FacetPlotLegendTable.js";
14
+ import { getFacets as d } from "../widgets/facet-nav/useFacetPlots.js";
15
+ import { FACET_PLOTS_CARD_CLASSNAME as f, FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME as p, FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME as m, FacetPlotsCardPlotContainer as h, FacetPlotsCardTitleContainer as g } from "./FacetPlotsCardGrid.js";
16
+ import { Fragment as _, Suspense as v, useMemo as y } from "react";
17
+ import { times as b } from "lodash-es";
18
+ import { Box as x, Button as S, Divider as C, Paper as w, Skeleton as T, Typography as E } from "@mui/material";
19
+ import { jsx as D, jsxs as O } from "react/jsx-runtime";
20
+ import { useSuspenseQuery as k } from "@tanstack/react-query";
21
+ import { useMeasure as A } from "@react-hookz/web";
21
22
  //#region src/components/FeaturedDataTabs/FacetPlotsCard.tsx
22
- var A = {
23
+ var j = {
23
24
  showlegend: !1,
24
25
  annotations: [],
25
26
  margin: {
@@ -38,148 +39,143 @@ var A = {
38
39
  showgrid: !1
39
40
  }
40
41
  };
41
- function j(e) {
42
- let { numPlots: r } = e;
43
- return /* @__PURE__ */ D(C, {
44
- className: d,
45
- children: [/* @__PURE__ */ D(h, {
46
- className: p,
42
+ function M(e) {
43
+ let { numPlots: t } = e;
44
+ return /* @__PURE__ */ O(w, {
45
+ className: f,
46
+ children: [/* @__PURE__ */ O(g, {
47
+ className: m,
47
48
  children: [
48
- /* @__PURE__ */ E(w, {
49
+ /* @__PURE__ */ D(T, {
49
50
  width: "60%",
50
51
  height: "24px"
51
52
  }),
52
- /* @__PURE__ */ E(n, { numRows: 5 }),
53
- /* @__PURE__ */ E(w, {
53
+ /* @__PURE__ */ D(i, { numRows: 5 }),
54
+ /* @__PURE__ */ D(T, {
54
55
  width: "40%",
55
- children: /* @__PURE__ */ E(x, {
56
+ children: /* @__PURE__ */ D(S, {
56
57
  variant: "contained",
57
58
  children: "Explore"
58
59
  })
59
60
  })
60
61
  ]
61
- }), y(r).map((e) => /* @__PURE__ */ D(m, {
62
- className: f,
62
+ }), b(t).map((e) => /* @__PURE__ */ O(h, {
63
+ className: p,
63
64
  sx: {
64
65
  py: 3,
65
66
  gridRow: `plot${e}`
66
67
  },
67
- children: [/* @__PURE__ */ E(w, {
68
+ children: [/* @__PURE__ */ D(T, {
68
69
  width: "100%",
69
70
  height: "300px"
70
- }), /* @__PURE__ */ E(t, {
71
+ }), /* @__PURE__ */ D(r, {
71
72
  numRows: 4,
72
73
  numCols: 2
73
74
  })]
74
75
  }, e))]
75
76
  });
76
77
  }
77
- function M(t) {
78
- let { title: n, description: _, facetsToPlot: y, detailsPagePath: w, plotType: j = "PIE" } = t, { accessToken: M } = e(), { data: N } = i(), { getColumnDisplayName: P } = a(), [F, I] = k(), L = v(() => y ? u(N, y) : [], [y, N]), R = v(() => ({
79
- ...A,
80
- barmode: j === "STACKED_HORIZONTAL_BAR" ? "stack" : void 0
81
- }), [j]), z = j === "STACKED_HORIZONTAL_BAR" ? 50 : 150, { data: B } = O({
78
+ function N(r) {
79
+ let { title: i, description: v, facetsToPlot: b, detailsPagePath: T, plotType: M = "PIE" } = r, { accessToken: N } = t(), { data: P } = o(), { getColumnDisplayName: F } = e(), [I, L] = A(), R = y(() => b ? d(P, b) : [], [b, P]), z = y(() => ({
80
+ ...j,
81
+ barmode: M === "STACKED_HORIZONTAL_BAR" ? "stack" : void 0
82
+ }), [M]), B = M === "STACKED_HORIZONTAL_BAR" ? 50 : 150, { data: V } = k({
82
83
  queryKey: [
83
84
  "facetPlotDataArray",
84
- y,
85
- L
85
+ b,
86
+ R,
87
+ P.facetPostProcessingApplied
86
88
  ],
87
89
  queryFn: async () => {
88
- if (!y) return [];
89
- let e = (e) => N.columnModels.find((t) => t.name === e.columnName)?.columnType;
90
- return Promise.all(L.map(async (t, n) => await s(t, e(t), n + 1, j, M)));
90
+ if (!b) return [];
91
+ let e = (e) => P.columnModels.find((t) => t.name === e.columnName)?.columnType;
92
+ return Promise.all(R.map(async (t, n) => await c(t, e(t), n + 1, M, N, P.facetPostProcessingApplied)));
91
93
  }
92
- }), V = v(() => {
93
- if (!y) return "";
94
- let e = N?.facets.map((e) => {
95
- let t = e.facetValues;
96
- if (t) {
97
- let e = t.filter((e) => e.isSelected);
98
- return e.length > 0 ? e[0] : void 0;
99
- } else return;
100
- }).filter((e) => e !== void 0)[0];
94
+ }), H = y(() => {
95
+ if (!b) return "";
96
+ let e = n(P?.facets).flatMap((e) => e.facetValues).find((e) => e.isSelected);
101
97
  return e?.value ? e?.value : "";
102
- }, [y, N?.facets]), H = B.length > 1;
103
- return /* @__PURE__ */ D(C, {
104
- className: d,
98
+ }, [b, P?.facets]), U = V.length > 1;
99
+ return /* @__PURE__ */ O(w, {
100
+ className: f,
105
101
  sx: { overflow: "hidden" },
106
- children: [/* @__PURE__ */ D(h, {
107
- className: p,
102
+ children: [/* @__PURE__ */ O(g, {
103
+ className: m,
108
104
  children: [
109
- /* @__PURE__ */ E(T, {
105
+ /* @__PURE__ */ D(E, {
110
106
  variant: "headline1",
111
- children: n ?? (H ? V : P(L[0].columnName))
107
+ children: i ?? (U ? H : F(R[0].columnName))
112
108
  }),
113
- _ && /* @__PURE__ */ E(T, {
109
+ v && /* @__PURE__ */ D(E, {
114
110
  variant: "body1",
115
111
  sx: {
116
112
  color: "grey.700",
117
113
  my: 2
118
114
  },
119
- children: /* @__PURE__ */ E(r, {
120
- summary: _,
115
+ children: /* @__PURE__ */ D(a, {
116
+ summary: v,
121
117
  maxCharacterCount: 200
122
118
  })
123
119
  }),
124
- w && V && /* @__PURE__ */ E(b, {
120
+ T && H && /* @__PURE__ */ D(x, {
125
121
  sx: { my: 2 },
126
- children: /* @__PURE__ */ D(x, {
122
+ children: /* @__PURE__ */ O(S, {
127
123
  variant: "contained",
128
- href: w,
124
+ href: T,
129
125
  color: "secondary",
130
126
  sx: (e) => ({ [e.breakpoints.down("sm")]: { width: "100%" } }),
131
- children: ["Explore ", V]
127
+ children: ["Explore ", H]
132
128
  })
133
129
  })
134
130
  ]
135
- }), B.map((e, t) => /* @__PURE__ */ E(g, { children: /* @__PURE__ */ D(m, {
136
- className: f,
131
+ }), V.map((e, t) => /* @__PURE__ */ D(_, { children: /* @__PURE__ */ O(h, {
132
+ className: p,
137
133
  sx: {
138
134
  pt: t === 0 ? 5 : 0,
139
135
  gridRow: `plot${t}`
140
136
  },
141
- children: [t != 0 && /* @__PURE__ */ E(S, { sx: {
137
+ children: [t != 0 && /* @__PURE__ */ D(C, { sx: {
142
138
  mt: 2,
143
139
  mb: 4
144
- } }), /* @__PURE__ */ D(b, {
140
+ } }), /* @__PURE__ */ O(x, {
145
141
  sx: { minHeight: "130px" },
146
- children: [/* @__PURE__ */ E(b, {
147
- ref: I,
142
+ children: [/* @__PURE__ */ D(x, {
143
+ ref: L,
148
144
  sx: {
149
145
  display: "flex",
150
146
  justifyContent: "center",
151
147
  alignItems: "center"
152
148
  },
153
- children: /* @__PURE__ */ E(o, {
154
- layout: R,
149
+ children: /* @__PURE__ */ D(s, {
150
+ layout: z,
155
151
  data: e?.data ?? [],
156
- style: c(F?.width, j, z),
152
+ style: l(I?.width, M, B),
157
153
  config: { displayModeBar: !1 }
158
- }, `${y[t]}-${F?.width}`)
159
- }), /* @__PURE__ */ E(b, {
154
+ }, `${b[t]}-${I?.width}`)
155
+ }), /* @__PURE__ */ D(x, {
160
156
  sx: {
161
157
  mt: 4,
162
158
  width: "100%"
163
159
  },
164
- children: /* @__PURE__ */ E(l, {
165
- facetName: P(L[t].columnName),
160
+ children: /* @__PURE__ */ D(u, {
161
+ facetName: F(R[t].columnName),
166
162
  labels: e?.labels,
167
163
  colors: e?.colors,
168
164
  isExpanded: !1,
169
- linkToFullQuery: w
165
+ linkToFullQuery: T
170
166
  })
171
167
  })]
172
168
  })]
173
169
  }, t) }, t))]
174
170
  });
175
171
  }
176
- function N(e) {
177
- return /* @__PURE__ */ E(_, {
178
- fallback: /* @__PURE__ */ E(j, { numPlots: (e.facetsToPlot ?? []).length }),
179
- children: /* @__PURE__ */ E(M, { ...e })
172
+ function P(e) {
173
+ return /* @__PURE__ */ D(v, {
174
+ fallback: /* @__PURE__ */ D(M, { numPlots: (e.facetsToPlot ?? []).length }),
175
+ children: /* @__PURE__ */ D(N, { ...e })
180
176
  });
181
177
  }
182
178
  //#endregion
183
- export { N as default };
179
+ export { P as default };
184
180
 
185
181
  //# sourceMappingURL=FacetPlotsCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"sourcesContent":["import { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n Box,\n Button,\n Divider,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnResult,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { useSuspenseQuery } from '@tanstack/react-query'\nimport { times } from 'lodash-es'\nimport Plotly from 'plotly.js-basic-dist'\nimport { Fragment, Suspense, useMemo } from 'react'\nimport Plot from '../Plot/Plot'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ShowMore } from '../row_renderers/utils'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\nimport {\n extractPlotDataArray,\n getPlotStyle,\n PlotType,\n} from '../widgets/facet-nav/FacetNavPanel'\nimport { FacetPlotLegendTable } from '../widgets/facet-nav/FacetPlotLegendTable'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport {\n FACET_PLOTS_CARD_CLASSNAME,\n FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME,\n FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME,\n FacetPlotsCardPlotContainer,\n FacetPlotsCardTitleContainer,\n} from './FacetPlotsCardGrid'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetPlotsCardProps = {\n title?: string\n description?: string\n facetsToPlot?: string[]\n detailsPagePath?: string\n plotType?: PlotType\n}\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nfunction LoadingCard(props: { numPlots: number }) {\n const { numPlots } = props\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Skeleton width={'60%'} height={'24px'} />\n\n <SkeletonParagraph numRows={5} />\n\n <Skeleton width={'40%'}>\n <Button variant={'contained'}>Explore</Button>\n </Skeleton>\n </FacetPlotsCardTitleContainer>\n {times(numPlots).map(index => (\n <FacetPlotsCardPlotContainer\n key={index}\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n py: 3,\n gridRow: `plot${index}`,\n }}\n >\n <Skeleton width={'100%'} height={'300px'} />\n <SkeletonTable numRows={4} numCols={2} />\n </FacetPlotsCardPlotContainer>\n ))}\n </Paper>\n )\n}\n\nfunction FacetPlotsCard(props: FacetPlotsCardProps) {\n const {\n title,\n description,\n facetsToPlot,\n detailsPagePath,\n plotType = 'PIE',\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n const [plotContainerMeasurements, plotContainerRef] = useMeasure()\n\n const facetDataArray = useMemo(() => {\n if (!facetsToPlot) {\n return []\n }\n\n return getFacets(queryMetadata, facetsToPlot)\n }, [facetsToPlot, queryMetadata])\n\n const currentLayout: Partial<Plotly.Layout> = useMemo(() => {\n return {\n ...layout,\n barmode: plotType === 'STACKED_HORIZONTAL_BAR' ? 'stack' : undefined,\n }\n }, [plotType])\n const maxPlotHeight = plotType === 'STACKED_HORIZONTAL_BAR' ? 50 : 150\n const { data: facetPlotDataArray } = useSuspenseQuery({\n queryKey: ['facetPlotDataArray', facetsToPlot, facetDataArray],\n queryFn: async () => {\n if (!facetsToPlot) {\n return []\n }\n\n const getColumnType = (\n facetToPlot: FacetColumnResult,\n ): ColumnTypeEnum | undefined =>\n queryMetadata.columnModels!.find(\n columnModel => columnModel.name === facetToPlot.columnName,\n )?.columnType as ColumnTypeEnum\n\n return Promise.all(\n facetDataArray.map(async (item, index) => {\n const plotData = await extractPlotDataArray(\n item as FacetColumnResultValues,\n getColumnType(item),\n index + 1, //individual plot rgbIndex\n plotType,\n accessToken,\n )\n return plotData\n }),\n )\n },\n })\n\n const selectedFacetValue = useMemo(() => {\n if (!facetsToPlot) {\n return ''\n }\n\n // If we are showing a facet selection based card, then set the selectedFacetValue. For example, facet column \"study\" with value \"ROSMAP\"\n const selectedFacet: FacetColumnResultValueCount | undefined = queryMetadata\n ?.facets!.map(item => {\n const facetValues: FacetColumnResultValueCount[] = (\n item as FacetColumnResultValues\n ).facetValues\n if (facetValues) {\n const filteredFacetValues: FacetColumnResultValueCount[] =\n facetValues.filter(facetValue => {\n return facetValue.isSelected\n })\n return filteredFacetValues.length > 0\n ? filteredFacetValues[0]\n : undefined\n } else {\n return undefined\n }\n })\n .filter(x => x !== undefined)[0]\n\n if (selectedFacet?.value) {\n return selectedFacet?.value\n }\n return ''\n }, [facetsToPlot, queryMetadata?.facets])\n\n const isShowingMultiplePlots = facetPlotDataArray.length > 1\n const cardTitle =\n title ??\n (isShowingMultiplePlots\n ? selectedFacetValue\n : getColumnDisplayName(facetDataArray[0].columnName))\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME} sx={{ overflow: 'hidden' }}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Typography variant={'headline1'}>{cardTitle}</Typography>\n {description && (\n <Typography variant={'body1'} sx={{ color: 'grey.700', my: 2 }}>\n <ShowMore summary={description} maxCharacterCount={200} />\n </Typography>\n )}\n\n {detailsPagePath && selectedFacetValue && (\n <Box sx={{ my: 2 }}>\n <Button\n variant={'contained'}\n href={detailsPagePath}\n color={'secondary'}\n sx={theme => ({\n [theme.breakpoints.down('sm')]: { width: '100%' },\n })}\n >\n Explore {selectedFacetValue}\n </Button>\n </Box>\n )}\n </FacetPlotsCardTitleContainer>\n\n {/* create a plot for every facet to be plotted */}\n {facetPlotDataArray.map((plotData, index) => {\n return (\n <Fragment key={index}>\n <FacetPlotsCardPlotContainer\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n pt: index === 0 ? 5 : 0,\n gridRow: `plot${index}`,\n }}\n key={index}\n >\n {index != 0 && <Divider sx={{ mt: 2, mb: 4 }} />}\n <Box sx={{ minHeight: '130px' }}>\n <Box\n ref={plotContainerRef}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Plot\n key={`${facetsToPlot![index]}-${\n plotContainerMeasurements?.width\n }`}\n layout={currentLayout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n maxPlotHeight,\n )}\n config={{ displayModeBar: false }}\n />\n </Box>\n <Box sx={{ mt: 4, width: '100%' }}>\n <FacetPlotLegendTable\n facetName={getColumnDisplayName(\n facetDataArray[index].columnName,\n )}\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={false}\n linkToFullQuery={detailsPagePath}\n />\n </Box>\n </Box>\n </FacetPlotsCardPlotContainer>\n </Fragment>\n )\n })}\n </Paper>\n )\n}\n\nexport default function FacetPlotsCardWithSuspense(props: FacetPlotsCardProps) {\n return (\n <Suspense\n fallback={<LoadingCard numPlots={(props.facetsToPlot ?? []).length} />}\n >\n <FacetPlotsCard {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"sourcesContent":["import { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n Box,\n Button,\n Divider,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n EnumerationFacet,\n getEnumerationFacets,\n} from '@/utils/functions/enumerationFacet'\nimport { ColumnTypeEnum } from '@sage-bionetworks/synapse-types'\nimport { useSuspenseQuery } from '@tanstack/react-query'\nimport { times } from 'lodash-es'\nimport Plotly from 'plotly.js-basic-dist'\nimport { Fragment, Suspense, useMemo } from 'react'\nimport Plot from '../Plot/Plot'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ShowMore } from '../row_renderers/utils'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\nimport {\n extractPlotDataArray,\n getPlotStyle,\n PlotType,\n} from '../widgets/facet-nav/FacetNavPanel'\nimport { FacetPlotLegendTable } from '../widgets/facet-nav/FacetPlotLegendTable'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport {\n FACET_PLOTS_CARD_CLASSNAME,\n FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME,\n FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME,\n FacetPlotsCardPlotContainer,\n FacetPlotsCardTitleContainer,\n} from './FacetPlotsCardGrid'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetPlotsCardProps = {\n title?: string\n description?: string\n facetsToPlot?: string[]\n detailsPagePath?: string\n plotType?: PlotType\n}\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nfunction LoadingCard(props: { numPlots: number }) {\n const { numPlots } = props\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Skeleton width={'60%'} height={'24px'} />\n\n <SkeletonParagraph numRows={5} />\n\n <Skeleton width={'40%'}>\n <Button variant={'contained'}>Explore</Button>\n </Skeleton>\n </FacetPlotsCardTitleContainer>\n {times(numPlots).map(index => (\n <FacetPlotsCardPlotContainer\n key={index}\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n py: 3,\n gridRow: `plot${index}`,\n }}\n >\n <Skeleton width={'100%'} height={'300px'} />\n <SkeletonTable numRows={4} numCols={2} />\n </FacetPlotsCardPlotContainer>\n ))}\n </Paper>\n )\n}\n\nfunction FacetPlotsCard(props: FacetPlotsCardProps) {\n const {\n title,\n description,\n facetsToPlot,\n detailsPagePath,\n plotType = 'PIE',\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n const [plotContainerMeasurements, plotContainerRef] = useMeasure()\n\n const facetDataArray = useMemo(() => {\n if (!facetsToPlot) {\n return []\n }\n\n return getFacets(queryMetadata, facetsToPlot)\n }, [facetsToPlot, queryMetadata])\n\n const currentLayout: Partial<Plotly.Layout> = useMemo(() => {\n return {\n ...layout,\n barmode: plotType === 'STACKED_HORIZONTAL_BAR' ? 'stack' : undefined,\n }\n }, [plotType])\n const maxPlotHeight = plotType === 'STACKED_HORIZONTAL_BAR' ? 50 : 150\n const { data: facetPlotDataArray } = useSuspenseQuery({\n queryKey: [\n 'facetPlotDataArray',\n facetsToPlot,\n facetDataArray,\n queryMetadata.facetPostProcessingApplied,\n ],\n queryFn: async () => {\n if (!facetsToPlot) {\n return []\n }\n\n const getColumnType = (\n facetToPlot: EnumerationFacet,\n ): ColumnTypeEnum | undefined =>\n queryMetadata.columnModels!.find(\n columnModel => columnModel.name === facetToPlot.columnName,\n )?.columnType as ColumnTypeEnum\n\n return Promise.all(\n facetDataArray.map(async (item, index) => {\n const plotData = await extractPlotDataArray(\n item,\n getColumnType(item),\n index + 1, //individual plot rgbIndex\n plotType,\n accessToken,\n queryMetadata.facetPostProcessingApplied,\n )\n return plotData\n }),\n )\n },\n })\n\n const selectedFacetValue = useMemo(() => {\n if (!facetsToPlot) {\n return ''\n }\n\n // If we are showing a facet selection based card, then set the selectedFacetValue. For example, facet column \"study\" with value \"ROSMAP\"\n const selectedFacet = getEnumerationFacets(queryMetadata?.facets)\n .flatMap(facet => facet.facetValues)\n .find(facetValue => facetValue.isSelected)\n\n if (selectedFacet?.value) {\n return selectedFacet?.value\n }\n return ''\n }, [facetsToPlot, queryMetadata?.facets])\n\n const isShowingMultiplePlots = facetPlotDataArray.length > 1\n const cardTitle =\n title ??\n (isShowingMultiplePlots\n ? selectedFacetValue\n : getColumnDisplayName(facetDataArray[0].columnName))\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME} sx={{ overflow: 'hidden' }}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Typography variant={'headline1'}>{cardTitle}</Typography>\n {description && (\n <Typography variant={'body1'} sx={{ color: 'grey.700', my: 2 }}>\n <ShowMore summary={description} maxCharacterCount={200} />\n </Typography>\n )}\n\n {detailsPagePath && selectedFacetValue && (\n <Box sx={{ my: 2 }}>\n <Button\n variant={'contained'}\n href={detailsPagePath}\n color={'secondary'}\n sx={theme => ({\n [theme.breakpoints.down('sm')]: { width: '100%' },\n })}\n >\n Explore {selectedFacetValue}\n </Button>\n </Box>\n )}\n </FacetPlotsCardTitleContainer>\n\n {/* create a plot for every facet to be plotted */}\n {facetPlotDataArray.map((plotData, index) => {\n return (\n <Fragment key={index}>\n <FacetPlotsCardPlotContainer\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n pt: index === 0 ? 5 : 0,\n gridRow: `plot${index}`,\n }}\n key={index}\n >\n {index != 0 && <Divider sx={{ mt: 2, mb: 4 }} />}\n <Box sx={{ minHeight: '130px' }}>\n <Box\n ref={plotContainerRef}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Plot\n key={`${facetsToPlot![index]}-${\n plotContainerMeasurements?.width\n }`}\n layout={currentLayout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n maxPlotHeight,\n )}\n config={{ displayModeBar: false }}\n />\n </Box>\n <Box sx={{ mt: 4, width: '100%' }}>\n <FacetPlotLegendTable\n facetName={getColumnDisplayName(\n facetDataArray[index].columnName,\n )}\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={false}\n linkToFullQuery={detailsPagePath}\n />\n </Box>\n </Box>\n </FacetPlotsCardPlotContainer>\n </Fragment>\n )\n })}\n </Paper>\n )\n}\n\nexport default function FacetPlotsCardWithSuspense(props: FacetPlotsCardProps) {\n return (\n <Suspense\n fallback={<LoadingCard numPlots={(props.facetsToPlot ?? []).length} />}\n >\n <FacetPlotsCard {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
@@ -4,8 +4,8 @@ import { createEditableStep as n } from "./utils.js";
4
4
  import { StepCard as r } from "./StepCard.js";
5
5
  import { Alert as i, Box as a, Button as o, Paper as s, Stack as c, Typography as l } from "@mui/material";
6
6
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import f from "@mui/icons-material/Add";
8
- import p from "pluralize";
7
+ import f from "pluralize";
8
+ import p from "@mui/icons-material/Add";
9
9
  //#region src/components/FormTemplateEditor/FormStructurePanel.tsx
10
10
  function m({ steps: m, jsonSchema: h, unboundProperties: g, formTemplateId: _, onStepsChange: v, onBindField: y }) {
11
11
  let b = (e, t) => {
@@ -45,7 +45,7 @@ function m({ steps: m, jsonSchema: h, unboundProperties: g, formTemplateId: _, o
45
45
  })] }), /* @__PURE__ */ u(o, {
46
46
  size: "small",
47
47
  variant: "outlined",
48
- startIcon: /* @__PURE__ */ u(f, {}),
48
+ startIcon: /* @__PURE__ */ u(p, {}),
49
49
  onClick: x,
50
50
  children: "Add step"
51
51
  })]
@@ -54,9 +54,9 @@ function m({ steps: m, jsonSchema: h, unboundProperties: g, formTemplateId: _, o
54
54
  severity: "error",
55
55
  sx: { mb: 1.5 },
56
56
  children: [
57
- p("required field", w.length, !0),
57
+ f("required field", w.length, !0),
58
58
  " ",
59
- p("is", w.length),
59
+ f("is", w.length),
60
60
  " not bound to a step and must be bound before saving:",
61
61
  " ",
62
62
  w.map((e) => e.subSchema.title ?? t(e.propertyKey)).join(", "),
@@ -67,9 +67,9 @@ function m({ steps: m, jsonSchema: h, unboundProperties: g, formTemplateId: _, o
67
67
  severity: "warning",
68
68
  sx: { mb: 1.5 },
69
69
  children: [
70
- p("field", T.length, !0),
70
+ f("field", T.length, !0),
71
71
  " ",
72
- p("is", T.length),
72
+ f("is", T.length),
73
73
  " not yet bound to a step. Use a step's \"",
74
74
  "Bind field",
75
75
  "\" dropdown to add",
@@ -8,11 +8,11 @@ import { BIND_FIELD_LABEL as m } from "./utils.js";
8
8
  import { useState as h } from "react";
9
9
  import { Box as g, Collapse as _, IconButton as v, MenuItem as y, Paper as b, Stack as ee, TextField as x, Typography as S } from "@mui/material";
10
10
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
11
- import T from "@mui/icons-material/ExpandLess";
12
- import E from "@mui/icons-material/ExpandMore";
13
- import D from "@mui/icons-material/ArrowDownward";
14
- import O from "@mui/icons-material/ArrowUpward";
15
- import k from "pluralize";
11
+ import T from "pluralize";
12
+ import E from "@mui/icons-material/ExpandLess";
13
+ import D from "@mui/icons-material/ExpandMore";
14
+ import O from "@mui/icons-material/ArrowDownward";
15
+ import k from "@mui/icons-material/ArrowUpward";
16
16
  import A from "@mui/icons-material/Delete";
17
17
  import { useDroppable as j } from "@dnd-kit/react";
18
18
  import M from "@mui/icons-material/DragIndicator";
@@ -39,7 +39,7 @@ function F({ step: F, stepIndex: I, isFirst: te, isLast: L, unboundProperties: R
39
39
  H({ fields: e(F.fields, t, n) });
40
40
  }, ae = (e) => {
41
41
  H({ fields: F.fields.filter((t, n) => n !== e) });
42
- }, oe = k("field", F.fields.length, !0);
42
+ }, oe = T("field", F.fields.length, !0);
43
43
  return /* @__PURE__ */ w(b, {
44
44
  ref: Y,
45
45
  variant: "outlined",
@@ -67,7 +67,7 @@ function F({ step: F, stepIndex: I, isFirst: te, isLast: L, unboundProperties: R
67
67
  size: "small",
68
68
  onClick: () => J((e) => !e),
69
69
  "aria-label": q ? "Collapse step" : "Expand step",
70
- children: C(q ? T : E, { fontSize: "small" })
70
+ children: C(q ? E : D, { fontSize: "small" })
71
71
  }),
72
72
  /* @__PURE__ */ w(g, {
73
73
  sx: {
@@ -95,14 +95,14 @@ function F({ step: F, stepIndex: I, isFirst: te, isLast: L, unboundProperties: R
95
95
  disabled: te,
96
96
  onClick: W,
97
97
  "aria-label": "Move step up",
98
- children: /* @__PURE__ */ C(O, { fontSize: "small" })
98
+ children: /* @__PURE__ */ C(k, { fontSize: "small" })
99
99
  }),
100
100
  /* @__PURE__ */ C(v, {
101
101
  size: "small",
102
102
  disabled: L,
103
103
  onClick: G,
104
104
  "aria-label": "Move step down",
105
- children: /* @__PURE__ */ C(D, { fontSize: "small" })
105
+ children: /* @__PURE__ */ C(O, { fontSize: "small" })
106
106
  }),
107
107
  /* @__PURE__ */ C(v, {
108
108
  size: "small",
@@ -70,12 +70,12 @@ function i(e, t) {
70
70
  return n;
71
71
  }
72
72
  function a(e, t) {
73
- let n = e.toLowerCase().replace(/[^a-z0-9\s]/g, "").trim().split(/\s+/).filter(Boolean).map((e, t) => t === 0 ? e : e.charAt(0).toUpperCase() + e.slice(1)).join("") || "field", r = n, i = 1;
73
+ let n = e.toLowerCase().replaceAll(/[^a-z0-9\s]/g, "").trim().split(/\s+/).filter(Boolean).map((e, t) => t === 0 ? e : e.charAt(0).toUpperCase() + e.slice(1)).join("") || "field", r = n, i = 1;
74
74
  for (; t.has(r);) i += 1, r = `${n}${i}`;
75
75
  return r;
76
76
  }
77
77
  function o(e) {
78
- let t = e.replace(/[^A-Za-z0-9_]/g, "");
78
+ let t = e.replaceAll(/[^A-Za-z0-9_]/g, "");
79
79
  return /^[0-9]/.test(t) ? `_${t}` : t;
80
80
  }
81
81
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"schemaFieldUtils.js","names":[],"sources":["../../../src/components/FormTemplateEditor/schemaFieldUtils.ts"],"sourcesContent":["import { RJSFSchema } from '@rjsf/utils'\n\n/**\n * The set of property shapes the simple editor knows how to author. Anything\n * outside this set surfaces in the UI as \"advanced\" and must be edited via the\n * raw JSON Schema view.\n */\nexport type SimpleFieldType =\n | 'text'\n | 'number'\n | 'boolean'\n | 'choice'\n | 'multiChoice'\n | 'file'\n\nexport const FIELD_TYPE_OPTIONS: { value: SimpleFieldType; label: string }[] = [\n { value: 'text', label: 'Text' },\n { value: 'number', label: 'Number' },\n { value: 'boolean', label: 'Yes / No' },\n { value: 'choice', label: 'Single choice' },\n { value: 'multiChoice', label: 'Multiple choice (select many)' },\n { value: 'file', label: 'File upload' },\n]\n\nexport function detectFieldType(\n prop: RJSFSchema | undefined,\n): SimpleFieldType | null {\n if (!prop || typeof prop !== 'object') return null\n if (prop.format === 'synapse-filehandle-id') return 'file'\n if (prop.type === 'string' && Array.isArray(prop.enum)) return 'choice'\n // RJSF renders an array as a multi-select only when `uniqueItems` is set; without it the\n // property renders as a repeatable list, which the simple editor does not author.\n const items = prop.items as RJSFSchema | undefined\n if (\n prop.type === 'array' &&\n prop.uniqueItems === true &&\n items?.type === 'string' &&\n Array.isArray(items.enum)\n ) {\n return 'multiChoice'\n }\n if (prop.type === 'string' && !prop.format) return 'text'\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n return null\n}\n\nexport function fieldTypeLabel(type: SimpleFieldType | null): string {\n if (type === null) return 'Advanced'\n return FIELD_TYPE_OPTIONS.find(opt => opt.value === type)?.label ?? 'Advanced'\n}\n\n/** The options a 'choice' (`enum`) or 'multiChoice' (`items.enum`) property declares; empty if none. */\nexport function choiceOptions(prop: RJSFSchema): string[] {\n const options = prop.enum ?? (prop.items as RJSFSchema | undefined)?.enum\n return Array.isArray(options) ? (options as string[]) : []\n}\n\n/** Build a fresh schema body for the given simple type, preserving label and help text. */\nexport function applyFieldType(\n prev: RJSFSchema,\n type: SimpleFieldType,\n): RJSFSchema {\n const next: RJSFSchema = {\n title: prev.title,\n description: prev.description,\n }\n const existingChoices = choiceOptions(prev)\n // A choice field needs at least one option to be answerable.\n const choices = existingChoices.length > 0 ? existingChoices : ['Option 1']\n switch (type) {\n case 'text':\n next.type = 'string'\n break\n case 'number':\n next.type = 'number'\n break\n case 'boolean':\n next.type = 'boolean'\n break\n case 'choice':\n next.type = 'string'\n next.enum = choices\n break\n case 'multiChoice':\n next.type = 'array'\n next.items = { type: 'string', enum: choices }\n next.uniqueItems = true\n break\n case 'file':\n next.type = 'number'\n next.format = 'synapse-filehandle-id'\n break\n }\n return next\n}\n\n/** Derive a unique camelCase JSON property key from a display title. */\nexport function generatePropertyKey(\n title: string,\n existingKeys: Set<string>,\n): string {\n const base =\n title\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((w, i) => (i === 0 ? w : w.charAt(0).toUpperCase() + w.slice(1)))\n .join('') || 'field'\n let key = base\n let i = 1\n while (existingKeys.has(key)) {\n i += 1\n key = `${base}${i}`\n }\n return key\n}\n\n/**\n * Sanitize a manually-typed property key: strip characters that aren't\n * valid in a JSON Schema property key used as a JS identifier, preserving\n * the editor's casing (unlike `generatePropertyKey`, which derives a\n * camelCase key from a display title).\n */\nexport function sanitizePropertyKey(raw: string): string {\n const stripped = raw.replace(/[^A-Za-z0-9_]/g, '')\n return /^[0-9]/.test(stripped) ? `_${stripped}` : stripped\n}\n"],"mappings":";AAeA,IAAa,IAAkE;CAC7E;EAAE,OAAO;EAAQ,OAAO;CAAO;CAC/B;EAAE,OAAO;EAAU,OAAO;CAAS;CACnC;EAAE,OAAO;EAAW,OAAO;CAAW;CACtC;EAAE,OAAO;EAAU,OAAO;CAAgB;CAC1C;EAAE,OAAO;EAAe,OAAO;CAAgC;CAC/D;EAAE,OAAO;EAAQ,OAAO;CAAc;AACxC;AAEA,SAAgB,EACd,GACwB;CACxB,IAAI,CAAC,KAAQ,OAAO,KAAS,UAAU,OAAO;CAC9C,IAAI,EAAK,WAAW,yBAAyB,OAAO;CACpD,IAAI,EAAK,SAAS,YAAY,MAAM,QAAQ,EAAK,IAAI,GAAG,OAAO;CAG/D,IAAM,IAAQ,EAAK;CAYnB,OAVE,EAAK,SAAS,WACd,EAAK,gBAAgB,MACrB,GAAO,SAAS,YAChB,MAAM,QAAQ,EAAM,IAAI,IAEjB,gBAEL,EAAK,SAAS,YAAY,CAAC,EAAK,SAAe,SAC/C,EAAK,SAAS,YAAY,EAAK,SAAS,YAAkB,WAC1D,EAAK,SAAS,YAAkB,YAC7B;AACT;AAEA,SAAgB,EAAe,GAAsC;CAEnE,OADI,MAAS,OAAa,aACnB,EAAmB,MAAK,MAAO,EAAI,UAAU,CAAI,GAAG,SAAS;AACtE;AAGA,SAAgB,EAAc,GAA4B;CACxD,IAAM,IAAU,EAAK,QAAS,EAAK,OAAkC;CACrE,OAAO,MAAM,QAAQ,CAAO,IAAK,IAAuB,CAAC;AAC3D;AAGA,SAAgB,EACd,GACA,GACY;CACZ,IAAM,IAAmB;EACvB,OAAO,EAAK;EACZ,aAAa,EAAK;CACpB,GACM,IAAkB,EAAc,CAAI,GAEpC,IAAU,EAAgB,SAAS,IAAI,IAAkB,CAAC,UAAU;CAC1E,QAAQ,GAAR;EACE,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GAEH,AADA,EAAK,OAAO,UACZ,EAAK,OAAO;GACZ;EACF,KAAK;GAGH,AAFA,EAAK,OAAO,SACZ,EAAK,QAAQ;IAAE,MAAM;IAAU,MAAM;GAAQ,GAC7C,EAAK,cAAc;GACnB;EACF,KAAK;GAEH,AADA,EAAK,OAAO,UACZ,EAAK,SAAS;GACd;CACJ;CACA,OAAO;AACT;AAGA,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IACJ,EACG,YAAY,EACZ,QAAQ,gBAAgB,EAAE,EAC1B,KAAK,EACL,MAAM,KAAK,EACX,OAAO,OAAO,EACd,KAAK,GAAG,MAAO,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAE,EACpE,KAAK,EAAE,KAAK,SACb,IAAM,GACN,IAAI;CACR,OAAO,EAAa,IAAI,CAAG,IAEzB,AADA,KAAK,GACL,IAAM,GAAG,IAAO;CAElB,OAAO;AACT;AAQA,SAAgB,EAAoB,GAAqB;CACvD,IAAM,IAAW,EAAI,QAAQ,kBAAkB,EAAE;CACjD,OAAO,SAAS,KAAK,CAAQ,IAAI,IAAI,MAAa;AACpD"}
1
+ {"version":3,"file":"schemaFieldUtils.js","names":[],"sources":["../../../src/components/FormTemplateEditor/schemaFieldUtils.ts"],"sourcesContent":["import { RJSFSchema } from '@rjsf/utils'\n\n/**\n * The set of property shapes the simple editor knows how to author. Anything\n * outside this set surfaces in the UI as \"advanced\" and must be edited via the\n * raw JSON Schema view.\n */\nexport type SimpleFieldType =\n | 'text'\n | 'number'\n | 'boolean'\n | 'choice'\n | 'multiChoice'\n | 'file'\n\nexport const FIELD_TYPE_OPTIONS: { value: SimpleFieldType; label: string }[] = [\n { value: 'text', label: 'Text' },\n { value: 'number', label: 'Number' },\n { value: 'boolean', label: 'Yes / No' },\n { value: 'choice', label: 'Single choice' },\n { value: 'multiChoice', label: 'Multiple choice (select many)' },\n { value: 'file', label: 'File upload' },\n]\n\nexport function detectFieldType(\n prop: RJSFSchema | undefined,\n): SimpleFieldType | null {\n if (!prop || typeof prop !== 'object') return null\n if (prop.format === 'synapse-filehandle-id') return 'file'\n if (prop.type === 'string' && Array.isArray(prop.enum)) return 'choice'\n // RJSF renders an array as a multi-select only when `uniqueItems` is set; without it the\n // property renders as a repeatable list, which the simple editor does not author.\n const items = prop.items as RJSFSchema | undefined\n if (\n prop.type === 'array' &&\n prop.uniqueItems === true &&\n items?.type === 'string' &&\n Array.isArray(items.enum)\n ) {\n return 'multiChoice'\n }\n if (prop.type === 'string' && !prop.format) return 'text'\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n return null\n}\n\nexport function fieldTypeLabel(type: SimpleFieldType | null): string {\n if (type === null) return 'Advanced'\n return FIELD_TYPE_OPTIONS.find(opt => opt.value === type)?.label ?? 'Advanced'\n}\n\n/** The options a 'choice' (`enum`) or 'multiChoice' (`items.enum`) property declares; empty if none. */\nexport function choiceOptions(prop: RJSFSchema): string[] {\n const options = prop.enum ?? (prop.items as RJSFSchema | undefined)?.enum\n return Array.isArray(options) ? (options as string[]) : []\n}\n\n/** Build a fresh schema body for the given simple type, preserving label and help text. */\nexport function applyFieldType(\n prev: RJSFSchema,\n type: SimpleFieldType,\n): RJSFSchema {\n const next: RJSFSchema = {\n title: prev.title,\n description: prev.description,\n }\n const existingChoices = choiceOptions(prev)\n // A choice field needs at least one option to be answerable.\n const choices = existingChoices.length > 0 ? existingChoices : ['Option 1']\n switch (type) {\n case 'text':\n next.type = 'string'\n break\n case 'number':\n next.type = 'number'\n break\n case 'boolean':\n next.type = 'boolean'\n break\n case 'choice':\n next.type = 'string'\n next.enum = choices\n break\n case 'multiChoice':\n next.type = 'array'\n next.items = { type: 'string', enum: choices }\n next.uniqueItems = true\n break\n case 'file':\n next.type = 'number'\n next.format = 'synapse-filehandle-id'\n break\n }\n return next\n}\n\n/** Derive a unique camelCase JSON property key from a display title. */\nexport function generatePropertyKey(\n title: string,\n existingKeys: Set<string>,\n): string {\n const base =\n title\n .toLowerCase()\n .replaceAll(/[^a-z0-9\\s]/g, '')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((w, i) => (i === 0 ? w : w.charAt(0).toUpperCase() + w.slice(1)))\n .join('') || 'field'\n let key = base\n let i = 1\n while (existingKeys.has(key)) {\n i += 1\n key = `${base}${i}`\n }\n return key\n}\n\n/**\n * Sanitize a manually-typed property key: strip characters that aren't\n * valid in a JSON Schema property key used as a JS identifier, preserving\n * the editor's casing (unlike `generatePropertyKey`, which derives a\n * camelCase key from a display title).\n */\nexport function sanitizePropertyKey(raw: string): string {\n const stripped = raw.replaceAll(/[^A-Za-z0-9_]/g, '')\n return /^[0-9]/.test(stripped) ? `_${stripped}` : stripped\n}\n"],"mappings":";AAeA,IAAa,IAAkE;CAC7E;EAAE,OAAO;EAAQ,OAAO;CAAO;CAC/B;EAAE,OAAO;EAAU,OAAO;CAAS;CACnC;EAAE,OAAO;EAAW,OAAO;CAAW;CACtC;EAAE,OAAO;EAAU,OAAO;CAAgB;CAC1C;EAAE,OAAO;EAAe,OAAO;CAAgC;CAC/D;EAAE,OAAO;EAAQ,OAAO;CAAc;AACxC;AAEA,SAAgB,EACd,GACwB;CACxB,IAAI,CAAC,KAAQ,OAAO,KAAS,UAAU,OAAO;CAC9C,IAAI,EAAK,WAAW,yBAAyB,OAAO;CACpD,IAAI,EAAK,SAAS,YAAY,MAAM,QAAQ,EAAK,IAAI,GAAG,OAAO;CAG/D,IAAM,IAAQ,EAAK;CAYnB,OAVE,EAAK,SAAS,WACd,EAAK,gBAAgB,MACrB,GAAO,SAAS,YAChB,MAAM,QAAQ,EAAM,IAAI,IAEjB,gBAEL,EAAK,SAAS,YAAY,CAAC,EAAK,SAAe,SAC/C,EAAK,SAAS,YAAY,EAAK,SAAS,YAAkB,WAC1D,EAAK,SAAS,YAAkB,YAC7B;AACT;AAEA,SAAgB,EAAe,GAAsC;CAEnE,OADI,MAAS,OAAa,aACnB,EAAmB,MAAK,MAAO,EAAI,UAAU,CAAI,GAAG,SAAS;AACtE;AAGA,SAAgB,EAAc,GAA4B;CACxD,IAAM,IAAU,EAAK,QAAS,EAAK,OAAkC;CACrE,OAAO,MAAM,QAAQ,CAAO,IAAK,IAAuB,CAAC;AAC3D;AAGA,SAAgB,EACd,GACA,GACY;CACZ,IAAM,IAAmB;EACvB,OAAO,EAAK;EACZ,aAAa,EAAK;CACpB,GACM,IAAkB,EAAc,CAAI,GAEpC,IAAU,EAAgB,SAAS,IAAI,IAAkB,CAAC,UAAU;CAC1E,QAAQ,GAAR;EACE,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GACH,EAAK,OAAO;GACZ;EACF,KAAK;GAEH,AADA,EAAK,OAAO,UACZ,EAAK,OAAO;GACZ;EACF,KAAK;GAGH,AAFA,EAAK,OAAO,SACZ,EAAK,QAAQ;IAAE,MAAM;IAAU,MAAM;GAAQ,GAC7C,EAAK,cAAc;GACnB;EACF,KAAK;GAEH,AADA,EAAK,OAAO,UACZ,EAAK,SAAS;GACd;CACJ;CACA,OAAO;AACT;AAGA,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IACJ,EACG,YAAY,EACZ,WAAW,gBAAgB,EAAE,EAC7B,KAAK,EACL,MAAM,KAAK,EACX,OAAO,OAAO,EACd,KAAK,GAAG,MAAO,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAE,EACpE,KAAK,EAAE,KAAK,SACb,IAAM,GACN,IAAI;CACR,OAAO,EAAa,IAAI,CAAG,IAEzB,AADA,KAAK,GACL,IAAM,GAAG,IAAO;CAElB,OAAO;AACT;AAQA,SAAgB,EAAoB,GAAqB;CACvD,IAAM,IAAW,EAAI,WAAW,kBAAkB,EAAE;CACpD,OAAO,SAAS,KAAK,CAAQ,IAAI,IAAI,MAAa;AACpD"}
@@ -1,11 +1,11 @@
1
1
  import { useDebouncedEffect as e } from "../../utils/hooks/useDebouncedEffect.js";
2
+ import { useQueryVisualizationContext as t } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
2
3
  import "../../utils/hooks/index.js";
3
- import { HelpPopover as t } from "../HelpPopover/HelpPopover.js";
4
- import n from "../IconSvg/IconSvg.js";
5
- import { useQueryContext as r } from "../QueryContext/QueryContext.js";
4
+ import { HelpPopover as n } from "../HelpPopover/HelpPopover.js";
5
+ import r from "../IconSvg/IconSvg.js";
6
+ import { useQueryContext as i } from "../QueryContext/QueryContext.js";
6
7
  import "../QueryContext/index.js";
7
- import { useGetQueryMetadata as i } from "../QueryWrapper/useGetQueryMetadata.js";
8
- import { useQueryVisualizationContext as a } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
8
+ import { useGetQueryMetadata as a } from "../QueryWrapper/useGetQueryMetadata.js";
9
9
  import "../QueryVisualizationWrapper/index.js";
10
10
  import { updateQueryUsingSearchTerm as o } from "./FullTextSearchUtils.js";
11
11
  import { IconSvgButton as s } from "../IconSvgButton.js";
@@ -15,7 +15,7 @@ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
15
15
  //#region src/components/FullTextSearch/FullTextSearch.tsx
16
16
  var _ = 3, v = 300;
17
17
  function y({ ftsConfig: y }) {
18
- let { executeQueryRequest: b } = r(), { showSearchBar: x } = a(), [S, C] = u(""), [w, T] = u([]), E = l(null), D = y?.minSearchQueryLength ?? _, { data: O } = i(), k = O?.columnModels;
18
+ let { executeQueryRequest: b } = i(), { showSearchBar: x } = t(), [S, C] = u(""), [w, T] = u([]), E = l(null), D = y?.minSearchQueryLength ?? _, { data: O } = a(), k = O?.columnModels;
19
19
  c(() => {
20
20
  (!y?.getSuggestions || S.trim().length < D) && T([]);
21
21
  }, [
@@ -35,7 +35,7 @@ function y({ ftsConfig: y }) {
35
35
  e.preventDefault(), S.trim().length < D ? E.current?.setCustomValidity(`Search term must have a minimum of ${D} characters`) : A(S);
36
36
  }, M = (e) => {
37
37
  E.current?.setCustomValidity(""), C(e.currentTarget.value);
38
- }, N = /* @__PURE__ */ h(n, {
38
+ }, N = /* @__PURE__ */ h(r, {
39
39
  icon: "search",
40
40
  wrap: !1,
41
41
  sx: {
@@ -48,7 +48,7 @@ function y({ ftsConfig: y }) {
48
48
  onClick: () => {
49
49
  C(""), T([]);
50
50
  }
51
- }), y?.searchHelpURL && /* @__PURE__ */ h(t, {
51
+ }), y?.searchHelpURL && /* @__PURE__ */ h(n, {
52
52
  markdownText: "This search bar is powered by MySQL Full Text Search.",
53
53
  helpUrl: y.searchHelpURL,
54
54
  placement: "left"