synapse-react-client 4.0.41 → 4.0.42

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 (313) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.d.ts +7 -0
  3. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.d.ts.map +1 -0
  4. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js +30 -0
  5. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js.map +1 -0
  6. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
  7. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +138 -244
  8. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  9. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.d.ts +13 -0
  10. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.d.ts.map +1 -0
  11. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.js +60 -0
  12. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.js.map +1 -0
  13. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts +8 -2
  14. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
  15. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +179 -63
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
  17. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts +2 -0
  18. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts.map +1 -1
  19. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +13 -13
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
  21. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts +3 -2
  22. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts.map +1 -1
  23. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +1 -1
  24. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts +3 -2
  25. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
  26. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
  27. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.d.ts +12 -0
  28. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.d.ts.map +1 -0
  29. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.js +50 -0
  30. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.js.map +1 -0
  31. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
  32. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +112 -143
  33. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  34. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +4 -2
  35. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -1
  36. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +8 -7
  37. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -1
  38. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts +3 -2
  39. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
  40. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +79 -47
  41. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
  42. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.d.ts +12 -0
  43. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.d.ts.map +1 -0
  44. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.js +51 -0
  45. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.js.map +1 -0
  46. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.d.ts +12 -0
  47. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.d.ts.map +1 -0
  48. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.js +24 -0
  49. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.js.map +1 -0
  50. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts +11 -0
  51. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts.map +1 -0
  52. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.js +0 -0
  53. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.d.ts +22 -0
  54. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.d.ts.map +1 -0
  55. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.js +32 -0
  56. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.js.map +1 -0
  57. package/dist/components/AclEditor/AclEditor.js +20 -20
  58. package/dist/components/Authentication/TwoFactorBackupCodes.js +1 -1
  59. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  60. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  61. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +79 -69
  62. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  63. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  64. package/dist/components/DataGrid/SynapseGrid.js +244 -246
  65. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  66. package/dist/components/DataGrid/components/GridLoadingState.d.ts +23 -0
  67. package/dist/components/DataGrid/components/GridLoadingState.d.ts.map +1 -0
  68. package/dist/components/DataGrid/components/GridLoadingState.js +64 -0
  69. package/dist/components/DataGrid/components/GridLoadingState.js.map +1 -0
  70. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
  71. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +30 -29
  72. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
  73. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +60 -6
  74. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  75. package/dist/components/DataGrid/useDataGridWebsocket.js +71 -60
  76. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  77. package/dist/components/DataGrid/utils/getNamedColumnIndices.d.ts +11 -0
  78. package/dist/components/DataGrid/utils/getNamedColumnIndices.d.ts.map +1 -0
  79. package/dist/components/DataGrid/utils/getNamedColumnIndices.js +8 -0
  80. package/dist/components/DataGrid/utils/getNamedColumnIndices.js.map +1 -0
  81. package/dist/components/FilePreview/FileHandleContentRenderer.d.ts +6 -2
  82. package/dist/components/FilePreview/FileHandleContentRenderer.d.ts.map +1 -1
  83. package/dist/components/FilePreview/FileHandleContentRenderer.js +27 -14
  84. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  85. package/dist/components/FilePreview/PdfPreview.d.ts +1 -1
  86. package/dist/components/FilePreview/PdfPreview.d.ts.map +1 -1
  87. package/dist/components/FilePreview/PdfPreview.js +15 -16
  88. package/dist/components/FilePreview/PdfPreview.js.map +1 -1
  89. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts.map +1 -1
  90. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js +71 -68
  91. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js.map +1 -1
  92. package/dist/components/FormTemplateEditor/FieldLibrary.css +1 -0
  93. package/dist/components/FormTemplateEditor/FieldLibrary.d.ts +17 -0
  94. package/dist/components/FormTemplateEditor/FieldLibrary.d.ts.map +1 -0
  95. package/dist/components/FormTemplateEditor/FieldLibrary.js +88 -0
  96. package/dist/components/FormTemplateEditor/FieldLibrary.js.map +1 -0
  97. package/dist/components/FormTemplateEditor/FieldLibrary.module.js +5 -0
  98. package/dist/components/FormTemplateEditor/FieldLibrary.module.js.map +1 -0
  99. package/dist/components/FormTemplateEditor/FieldLibrary.module.scss +12 -0
  100. package/dist/components/FormTemplateEditor/FieldLibraryRow.d.ts +19 -0
  101. package/dist/components/FormTemplateEditor/FieldLibraryRow.d.ts.map +1 -0
  102. package/dist/components/FormTemplateEditor/FieldLibraryRow.js +115 -0
  103. package/dist/components/FormTemplateEditor/FieldLibraryRow.js.map +1 -0
  104. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.css +1 -0
  105. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.d.ts +9 -0
  106. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.d.ts.map +1 -0
  107. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.js +18 -0
  108. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.js.map +1 -0
  109. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.js +5 -0
  110. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.js.map +1 -0
  111. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.scss +4 -0
  112. package/dist/components/FormTemplateEditor/FormStructurePanel.d.ts +21 -0
  113. package/dist/components/FormTemplateEditor/FormStructurePanel.d.ts.map +1 -0
  114. package/dist/components/FormTemplateEditor/FormStructurePanel.js +108 -0
  115. package/dist/components/FormTemplateEditor/FormStructurePanel.js.map +1 -0
  116. package/dist/components/FormTemplateEditor/FormTemplateEditor.d.ts +10 -0
  117. package/dist/components/FormTemplateEditor/FormTemplateEditor.d.ts.map +1 -0
  118. package/dist/components/FormTemplateEditor/FormTemplateEditor.js +31 -0
  119. package/dist/components/FormTemplateEditor/FormTemplateEditor.js.map +1 -0
  120. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.d.ts +15 -0
  121. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.d.ts.map +1 -0
  122. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js +234 -0
  123. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js.map +1 -0
  124. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts.map +1 -1
  125. package/dist/components/FormTemplateEditor/FormTemplatePreview.js +1 -12
  126. package/dist/components/FormTemplateEditor/FormTemplatePreview.js.map +1 -1
  127. package/dist/components/FormTemplateEditor/StepCard.d.ts +25 -0
  128. package/dist/components/FormTemplateEditor/StepCard.d.ts.map +1 -0
  129. package/dist/components/FormTemplateEditor/StepCard.js +203 -0
  130. package/dist/components/FormTemplateEditor/StepCard.js.map +1 -0
  131. package/dist/components/FormTemplateEditor/StepFieldRow.d.ts +34 -0
  132. package/dist/components/FormTemplateEditor/StepFieldRow.d.ts.map +1 -0
  133. package/dist/components/FormTemplateEditor/StepFieldRow.js +128 -0
  134. package/dist/components/FormTemplateEditor/StepFieldRow.js.map +1 -0
  135. package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts +19 -0
  136. package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts.map +1 -0
  137. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js +78 -0
  138. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js.map +1 -0
  139. package/dist/components/FormTemplateEditor/dragHandle.css +1 -0
  140. package/dist/components/FormTemplateEditor/dragHandle.module.js +8 -0
  141. package/dist/components/FormTemplateEditor/dragHandle.module.js.map +1 -0
  142. package/dist/components/FormTemplateEditor/dragHandle.module.scss +22 -0
  143. package/dist/components/FormTemplateEditor/dropTarget.css +1 -0
  144. package/dist/components/FormTemplateEditor/dropTarget.module.js +5 -0
  145. package/dist/components/FormTemplateEditor/dropTarget.module.js.map +1 -0
  146. package/dist/components/FormTemplateEditor/dropTarget.module.scss +14 -0
  147. package/dist/components/FormTemplateEditor/formTemplateDraftState.d.ts +48 -0
  148. package/dist/components/FormTemplateEditor/formTemplateDraftState.d.ts.map +1 -0
  149. package/dist/components/FormTemplateEditor/formTemplateDraftState.js +126 -0
  150. package/dist/components/FormTemplateEditor/formTemplateDraftState.js.map +1 -0
  151. package/dist/components/FormTemplateEditor/formTemplateSchema.d.ts +35 -0
  152. package/dist/components/FormTemplateEditor/formTemplateSchema.d.ts.map +1 -0
  153. package/dist/components/FormTemplateEditor/formTemplateSchema.js +35 -0
  154. package/dist/components/FormTemplateEditor/formTemplateSchema.js.map +1 -0
  155. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts +3 -1
  156. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts.map +1 -1
  157. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +26 -8
  158. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
  159. package/dist/components/FormTemplateEditor/sortableIds.d.ts +23 -0
  160. package/dist/components/FormTemplateEditor/sortableIds.d.ts.map +1 -0
  161. package/dist/components/FormTemplateEditor/sortableIds.js +24 -0
  162. package/dist/components/FormTemplateEditor/sortableIds.js.map +1 -0
  163. package/dist/components/FormTemplateEditor/useFormTemplateDraft.d.ts +33 -0
  164. package/dist/components/FormTemplateEditor/useFormTemplateDraft.d.ts.map +1 -0
  165. package/dist/components/FormTemplateEditor/useFormTemplateDraft.js +59 -0
  166. package/dist/components/FormTemplateEditor/useFormTemplateDraft.js.map +1 -0
  167. package/dist/components/FormTemplateEditor/useFormTemplateDrag.d.ts +9 -0
  168. package/dist/components/FormTemplateEditor/useFormTemplateDrag.d.ts.map +1 -0
  169. package/dist/components/FormTemplateEditor/useFormTemplateDrag.js +66 -0
  170. package/dist/components/FormTemplateEditor/useFormTemplateDrag.js.map +1 -0
  171. package/dist/components/FormTemplateEditor/useSaveFormTemplate.d.ts.map +1 -1
  172. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js +34 -19
  173. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js.map +1 -1
  174. package/dist/components/FormTemplateEditor/utils.d.ts +2 -2
  175. package/dist/components/FormTemplateEditor/utils.d.ts.map +1 -1
  176. package/dist/components/FormTemplateEditor/utils.js +7 -10
  177. package/dist/components/FormTemplateEditor/utils.js.map +1 -1
  178. package/dist/components/JsonSchemaForm/widgets/SelectWidget.d.ts +11 -0
  179. package/dist/components/JsonSchemaForm/widgets/SelectWidget.d.ts.map +1 -1
  180. package/dist/components/JsonSchemaForm/widgets/SelectWidget.js +28 -19
  181. package/dist/components/JsonSchemaForm/widgets/SelectWidget.js.map +1 -1
  182. package/dist/components/QueryBuilder/FilterConditionRow.d.ts +1 -0
  183. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  184. package/dist/components/QueryBuilder/FilterConditionRow.js +102 -105
  185. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  186. package/dist/components/QueryBuilder/FilterGroupNode.js +6 -6
  187. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  188. package/dist/components/QueryBuilder/QueryBuilderControls.js +88 -81
  189. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  190. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +7 -0
  191. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
  192. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
  193. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts +2 -1
  194. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts.map +1 -1
  195. package/dist/components/QueryBuilder/qbTreeToReadable.js +24 -20
  196. package/dist/components/QueryBuilder/qbTreeToReadable.js.map +1 -1
  197. package/dist/components/QueryBuilder/queryBuilderDrag.css +1 -1
  198. package/dist/components/QueryBuilder/queryBuilderDrag.module.js +2 -2
  199. package/dist/components/QueryBuilder/queryBuilderDrag.module.js.map +1 -1
  200. package/dist/components/QueryBuilder/queryBuilderDrag.module.scss +1 -1
  201. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +16 -0
  202. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
  203. package/dist/components/QueryBuilder/queryBuilderMetadata.js +13 -5
  204. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
  205. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts +18 -0
  206. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -0
  207. package/dist/components/QueryBuilder/useQBValueDisplayName.js +64 -0
  208. package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -0
  209. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +6 -6
  210. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.d.ts +1 -0
  211. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.d.ts.map +1 -1
  212. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +13 -11
  213. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js.map +1 -1
  214. package/dist/components/SynapseTable/SearchV2.js +4 -4
  215. package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
  216. package/dist/components/ToastMessage/ToastMessage.js +25 -22
  217. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  218. package/dist/components/dataaccess/FormTemplateEditorRoute.d.ts +7 -0
  219. package/dist/components/dataaccess/FormTemplateEditorRoute.d.ts.map +1 -0
  220. package/dist/components/dataaccess/FormTemplateEditorRoute.js +26 -0
  221. package/dist/components/dataaccess/FormTemplateEditorRoute.js.map +1 -0
  222. package/dist/components/dataaccess/FormTemplateTable.d.ts +10 -0
  223. package/dist/components/dataaccess/FormTemplateTable.d.ts.map +1 -0
  224. package/dist/components/dataaccess/FormTemplateTable.js +124 -0
  225. package/dist/components/dataaccess/FormTemplateTable.js.map +1 -0
  226. package/dist/components/dataaccess/ReviewerDashboard.d.ts.map +1 -1
  227. package/dist/components/dataaccess/ReviewerDashboard.js +80 -50
  228. package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
  229. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  230. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +2 -0
  231. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  232. package/dist/components/widgets/FileHandleLink.d.ts +12 -2
  233. package/dist/components/widgets/FileHandleLink.d.ts.map +1 -1
  234. package/dist/components/widgets/FileHandleLink.js +25 -29
  235. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  236. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +2 -0
  237. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -1
  238. package/dist/mocks/accessRequirement/mockFormTemplates.js +8 -2
  239. package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -1
  240. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -1
  241. package/dist/mocks/accessRequirement/mockJsonSchemas.js +17 -31
  242. package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -1
  243. package/dist/mocks/msw/handlers/authHandlers.d.ts +1 -0
  244. package/dist/mocks/msw/handlers/authHandlers.d.ts.map +1 -1
  245. package/dist/mocks/msw/handlers/authHandlers.js +6 -2
  246. package/dist/mocks/msw/handlers/authHandlers.js.map +1 -1
  247. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts +2 -0
  248. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
  249. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +52 -46
  250. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  251. package/dist/mocks/msw/handlers/fileHandlers.d.ts.map +1 -1
  252. package/dist/mocks/msw/handlers/fileHandlers.js +25 -21
  253. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  254. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts +2 -1
  255. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts.map +1 -1
  256. package/dist/mocks/msw/handlers/formTemplateHandlers.js +18 -18
  257. package/dist/mocks/msw/handlers/formTemplateHandlers.js.map +1 -1
  258. package/dist/mocks/msw/handlers/schemaHandlers.d.ts +8 -0
  259. package/dist/mocks/msw/handlers/schemaHandlers.d.ts.map +1 -1
  260. package/dist/mocks/msw/handlers/schemaHandlers.js +20 -3
  261. package/dist/mocks/msw/handlers/schemaHandlers.js.map +1 -1
  262. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.d.ts +8 -0
  263. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.d.ts.map +1 -0
  264. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.js +19 -0
  265. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.js.map +1 -0
  266. package/dist/style/abstracts/_cssVariables.scss +13 -0
  267. package/dist/style/components/_toasts.scss +10 -1
  268. package/dist/style/main.css +1 -1
  269. package/dist/synapse-queries/KeyFactory.d.ts +8 -1
  270. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  271. package/dist/synapse-queries/KeyFactory.js +17 -4
  272. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  273. package/dist/synapse-queries/auth/index.d.ts +1 -0
  274. package/dist/synapse-queries/auth/index.d.ts.map +1 -1
  275. package/dist/synapse-queries/auth/index.js +2 -1
  276. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.d.ts +11 -0
  277. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.d.ts.map +1 -0
  278. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +19 -0
  279. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -0
  280. package/dist/synapse-queries/dataaccess/index.js +5 -5
  281. package/dist/synapse-queries/dataaccess/useEDuc.d.ts +18 -0
  282. package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
  283. package/dist/synapse-queries/dataaccess/useEDuc.js +33 -1
  284. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  285. package/dist/synapse-queries/file/useDirectUploadToS3.js +6 -6
  286. package/dist/synapse-queries/file/useFileHandle.d.ts +8 -0
  287. package/dist/synapse-queries/file/useFileHandle.d.ts.map +1 -1
  288. package/dist/synapse-queries/file/useFileHandle.js +15 -6
  289. package/dist/synapse-queries/file/useFileHandle.js.map +1 -1
  290. package/dist/synapse-queries/index.js +260 -253
  291. package/dist/synapse-queries/jsonschema/index.js +2 -2
  292. package/dist/synapse-queries/jsonschema/useSchema.d.ts +5 -0
  293. package/dist/synapse-queries/jsonschema/useSchema.d.ts.map +1 -1
  294. package/dist/synapse-queries/jsonschema/useSchema.js +9 -1
  295. package/dist/synapse-queries/jsonschema/useSchema.js.map +1 -1
  296. package/dist/tsconfig.build.tsbuildinfo +1 -1
  297. package/dist/utils/APIConstants.d.ts +1 -0
  298. package/dist/utils/APIConstants.d.ts.map +1 -1
  299. package/dist/utils/APIConstants.js +2 -2
  300. package/dist/utils/APIConstants.js.map +1 -1
  301. package/dist/utils/featureflag/FeatureFlags.d.ts +1 -0
  302. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  303. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  304. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  305. package/dist/utils/functions/toPascalCase.d.ts +6 -0
  306. package/dist/utils/functions/toPascalCase.d.ts.map +1 -0
  307. package/dist/utils/functions/toPascalCase.js +8 -0
  308. package/dist/utils/functions/toPascalCase.js.map +1 -0
  309. package/dist/utils/jsonschema/submissionContext.d.ts +5 -0
  310. package/dist/utils/jsonschema/submissionContext.d.ts.map +1 -1
  311. package/dist/utils/jsonschema/submissionContext.js +22 -30
  312. package/dist/utils/jsonschema/submissionContext.js.map +1 -1
  313. package/package.json +10 -9
@@ -8,19 +8,20 @@ import { qbNodeToApiFilter as u } from "./queryBuilderTranslation.js";
8
8
  import { useQueryBuilderDrag as d } from "./queryBuilderDnd.js";
9
9
  import { useQBCombinedSql as f } from "./useQBCombinedSql.js";
10
10
  import { useQBFacetSourceMetadata as p } from "./useQBFacetSourceMetadata.js";
11
- import { QueryBuilderInternalContextProvider as m } from "./QueryBuilderInternalContext.js";
12
- import { FilterGroupNode as h } from "./FilterGroupNode.js";
13
- import { qbTreeToReadable as g } from "./qbTreeToReadable.js";
14
- import _ from "./QueryBuilderControls.module.js";
15
- import { useCallback as v, useMemo as y, useState as b } from "react";
16
- import { Button as x, ToggleButton as S, ToggleButtonGroup as C } from "@mui/material";
17
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
18
- import { DragDropProvider as E } from "@dnd-kit/react";
11
+ import { useQBValueDisplayName as m } from "./useQBValueDisplayName.js";
12
+ import { QueryBuilderInternalContextProvider as h } from "./QueryBuilderInternalContext.js";
13
+ import { FilterGroupNode as g } from "./FilterGroupNode.js";
14
+ import { qbTreeToReadable as _ } from "./qbTreeToReadable.js";
15
+ import v from "./QueryBuilderControls.module.js";
16
+ import { useCallback as y, useMemo as b, useState as x } from "react";
17
+ import { Button as S, ToggleButton as C, ToggleButtonGroup as w } from "@mui/material";
18
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
19
+ import { DragDropProvider as D } from "@dnd-kit/react";
19
20
  //#region src/components/QueryBuilder/QueryBuilderControls.tsx
20
- function D(D) {
21
- let { tree: O, onTreeChange: k, onlyFacetedColumns: A = !1 } = D, { columnModels: j, facetResults: M } = p(), { executeQueryRequest: N } = t(), P = O ?? o(), F = v(() => {
22
- let t = u(P);
23
- N((n) => {
21
+ function O(O) {
22
+ let { tree: k, onTreeChange: A, onlyFacetedColumns: j = !1 } = O, { columnModels: M, facetResults: N } = p(), { executeQueryRequest: P } = t(), F = k ?? o(), I = y(() => {
23
+ let t = u(F);
24
+ P((n) => {
24
25
  let r = (n.query.additionalFilters ?? []).filter((t) => !e(t)), i = t ? [...r, t] : r;
25
26
  return {
26
27
  ...n,
@@ -30,105 +31,111 @@ function D(D) {
30
31
  }
31
32
  };
32
33
  });
33
- }, [P, N]), { getColumnDisplayName: I } = n(), [L, R] = b("plain-english"), z = v((e) => {
34
- k(i(P, e, null, null));
35
- }, [P, k]), B = v((e) => {
36
- k(r(P, e));
37
- }, [P, k]), V = v((e) => {
38
- k(a(P, e));
39
- }, [P, k]), H = v((e, t) => {
40
- k(l(P, e, t));
41
- }, [P, k]), U = v((e) => {
42
- k(s(P, e));
43
- }, [P, k]), W = v((e, t) => {
44
- k(c(P, e, t));
45
- }, [P, k]), G = v((e) => {
46
- k(s(P, e));
47
- }, [P, k]), K = d(P, k), q = y(() => ({
48
- columnModels: j,
49
- facetResults: M,
50
- onlyFacetedColumns: A,
51
- getColumnDisplayName: I,
52
- addConditionAt: z,
53
- addChildGroupAt: B,
54
- clearGroupAt: V,
55
- updateGroupAt: H,
56
- removeGroupAt: U,
57
- updateConditionAt: W,
58
- removeConditionAt: G
34
+ }, [F, P]), { getColumnDisplayName: L } = n(), R = m(M, N), [z, B] = x("plain-english"), V = y((e) => {
35
+ A(i(F, e, null, null));
36
+ }, [F, A]), H = y((e) => {
37
+ A(r(F, e));
38
+ }, [F, A]), U = y((e) => {
39
+ A(a(F, e));
40
+ }, [F, A]), W = y((e, t) => {
41
+ A(l(F, e, t));
42
+ }, [F, A]), G = y((e) => {
43
+ A(s(F, e));
44
+ }, [F, A]), K = y((e, t) => {
45
+ A(c(F, e, t));
46
+ }, [F, A]), q = y((e) => {
47
+ A(s(F, e));
48
+ }, [F, A]), J = d(F, A), Y = b(() => ({
49
+ columnModels: M,
50
+ facetResults: N,
51
+ onlyFacetedColumns: j,
52
+ getColumnDisplayName: L,
53
+ getValueDisplayName: R,
54
+ addConditionAt: V,
55
+ addChildGroupAt: H,
56
+ clearGroupAt: U,
57
+ updateGroupAt: W,
58
+ removeGroupAt: G,
59
+ updateConditionAt: K,
60
+ removeConditionAt: q
59
61
  }), [
60
- j,
61
62
  M,
62
- A,
63
- I,
64
- z,
65
- B,
63
+ N,
64
+ j,
65
+ L,
66
+ R,
66
67
  V,
67
68
  H,
68
69
  U,
69
70
  W,
70
- G
71
- ]), J = y(() => g(P, I), [P, I]), { data: Y, isPending: X, error: Z } = f(L === "sql" ? P : null);
72
- return /* @__PURE__ */ w(m, {
73
- value: q,
74
- children: /* @__PURE__ */ w(E, {
75
- ...K,
76
- children: /* @__PURE__ */ T("div", {
77
- className: _.root,
71
+ G,
72
+ K,
73
+ q
74
+ ]), X = b(() => _(F, L, R), [
75
+ F,
76
+ L,
77
+ R
78
+ ]), { data: Z, isPending: Q, error: $ } = f(z === "sql" ? F : null);
79
+ return /* @__PURE__ */ T(h, {
80
+ value: Y,
81
+ children: /* @__PURE__ */ T(D, {
82
+ ...J,
83
+ children: /* @__PURE__ */ E("div", {
84
+ className: v.root,
78
85
  children: [
79
- /* @__PURE__ */ T("div", {
80
- className: _.summaryBar,
81
- children: [/* @__PURE__ */ T("div", {
82
- className: _.summaryHeader,
83
- children: [/* @__PURE__ */ w("span", {
84
- className: _.summaryLabel,
86
+ /* @__PURE__ */ E("div", {
87
+ className: v.summaryBar,
88
+ children: [/* @__PURE__ */ E("div", {
89
+ className: v.summaryHeader,
90
+ children: [/* @__PURE__ */ T("span", {
91
+ className: v.summaryLabel,
85
92
  children: "Query Summary"
86
- }), /* @__PURE__ */ T(C, {
87
- className: _.summaryModeToggle,
93
+ }), /* @__PURE__ */ E(w, {
94
+ className: v.summaryModeToggle,
88
95
  size: "small",
89
96
  exclusive: !0,
90
- value: L,
97
+ value: z,
91
98
  onChange: (e, t) => {
92
- t != null && R(t);
99
+ t != null && B(t);
93
100
  },
94
101
  "aria-label": "Query summary display mode",
95
- children: [/* @__PURE__ */ w(S, {
102
+ children: [/* @__PURE__ */ T(C, {
96
103
  value: "plain-english",
97
104
  "aria-label": "Show summary",
98
105
  children: "Summary"
99
- }), /* @__PURE__ */ w(S, {
106
+ }), /* @__PURE__ */ T(C, {
100
107
  value: "sql",
101
108
  "aria-label": "Show SQL",
102
109
  children: "SQL"
103
110
  })]
104
111
  })]
105
- }), /* @__PURE__ */ w("div", {
106
- className: _.summaryContent,
112
+ }), /* @__PURE__ */ T("div", {
113
+ className: v.summaryContent,
107
114
  "aria-live": "polite",
108
115
  "aria-atomic": "true",
109
- children: L === "plain-english" ? J : Z ? /* @__PURE__ */ T("span", {
110
- className: _.sqlError,
111
- children: ["Could not load SQL preview: ", Z.message]
112
- }) : X ? /* @__PURE__ */ w("span", {
113
- className: _.sqlPlaceholder,
116
+ children: z === "plain-english" ? X : $ ? /* @__PURE__ */ E("span", {
117
+ className: v.sqlError,
118
+ children: ["Could not load SQL preview: ", $.message]
119
+ }) : Q ? /* @__PURE__ */ T("span", {
120
+ className: v.sqlPlaceholder,
114
121
  children: "Loading SQL…"
115
- }) : /* @__PURE__ */ w("code", {
116
- className: _.sqlText,
117
- children: Y
122
+ }) : /* @__PURE__ */ T("code", {
123
+ className: v.sqlText,
124
+ children: Z
118
125
  })
119
126
  })]
120
127
  }),
121
- /* @__PURE__ */ w(h, {
122
- group: P,
128
+ /* @__PURE__ */ T(g, {
129
+ group: F,
123
130
  isRoot: !0
124
131
  }),
125
- /* @__PURE__ */ w("div", {
126
- className: _.applyRow,
127
- children: /* @__PURE__ */ w(x, {
132
+ /* @__PURE__ */ T("div", {
133
+ className: v.applyRow,
134
+ children: /* @__PURE__ */ T(S, {
128
135
  variant: "contained",
129
136
  color: "primary",
130
- onClick: F,
131
- className: _.applyButton,
137
+ onClick: I,
138
+ className: v.applyButton,
132
139
  children: "Update Results"
133
140
  })
134
141
  })
@@ -138,6 +145,6 @@ function D(D) {
138
145
  });
139
146
  }
140
147
  //#endregion
141
- export { D as QueryBuilderControls };
148
+ export { O as QueryBuilderControls };
142
149
 
143
150
  //# sourceMappingURL=QueryBuilderControls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilderControls.js","names":[],"sources":["../../../src/components/QueryBuilder/QueryBuilderControls.tsx"],"sourcesContent":["import { Button, ToggleButton, ToggleButtonGroup } from '@mui/material'\nimport { DragDropProvider } from '@dnd-kit/react'\nimport { useCallback, useMemo, useState } from 'react'\nimport { isFilterGroup } from '../../utils/types/IsType'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { FilterGroupNode } from './FilterGroupNode'\nimport { useQueryBuilderDrag } from './queryBuilderDnd'\nimport { qbNodeToApiFilter } from './queryBuilderTranslation'\nimport { qbTreeToReadable } from './qbTreeToReadable'\nimport { QueryBuilderInternalContextProvider } from './QueryBuilderInternalContext'\nimport styles from './QueryBuilderControls.module.scss'\nimport {\n addChildGroup,\n addConditionToGroup,\n clearGroup,\n defaultQBGroup,\n removeNode,\n updateCondition,\n updateGroup,\n} from './queryBuilderOperations'\nimport { QBCondition, QBGroup } from './QueryBuilderTypes'\nimport { useQBCombinedSql } from './useQBCombinedSql'\nimport { useQBFacetSourceMetadata } from './useQBFacetSourceMetadata'\n\nexport type QueryBuilderControlsProps = {\n /** The QB tree. When null, an empty default tree is rendered. */\n tree: QBGroup | null\n /** Called with the next tree after any dispatched edit. */\n onTreeChange: (next: QBGroup) => void\n /**\n * When true, the property picker only offers columns that have facet\n * metadata (Cohort Builder mode). Defaults to false.\n */\n onlyFacetedColumns?: boolean\n}\n\ntype SummaryMode = 'plain-english' | 'sql'\n\n/**\n * Top-level Query Builder panel. Uses `useQBFacetSourceMetadata()` — must be\n * rendered inside the Suspense boundary that already wraps\n * `QueryVisualizationWrapper` in `QueryWrapperPlotNav`. Facet metadata is\n * pulled from a companion query that strips the QB's own `FilterGroup` out\n * of `additionalFilters` so pill values remain stable while the user builds.\n */\nexport function QueryBuilderControls(props: QueryBuilderControlsProps) {\n const { tree, onTreeChange, onlyFacetedColumns = false } = props\n const { columnModels, facetResults } = useQBFacetSourceMetadata()\n const { executeQueryRequest } = useQueryContext()\n\n const activeTree = tree ?? defaultQBGroup()\n\n const onApply = useCallback(() => {\n const filterGroup = qbNodeToApiFilter(activeTree)\n executeQueryRequest(prev => {\n // Preserve any non-QB additionalFilters (e.g. lockedColumn constraints\n // introduced by portal detail pages) — Update Results only owns the\n // FilterGroup slot.\n const preserved = (prev.query.additionalFilters ?? []).filter(\n f => !isFilterGroup(f),\n )\n const next = filterGroup ? [...preserved, filterGroup] : preserved\n return {\n ...prev,\n query: {\n ...prev.query,\n additionalFilters: next.length > 0 ? next : undefined,\n },\n }\n })\n }, [activeTree, executeQueryRequest])\n\n const { getColumnDisplayName } = useQueryVisualizationContext()\n\n const [summaryMode, setSummaryMode] = useState<SummaryMode>('plain-english')\n\n const addConditionAt = useCallback(\n (groupId: string) => {\n onTreeChange(addConditionToGroup(activeTree, groupId, null, null))\n },\n [activeTree, onTreeChange],\n )\n const addChildGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(addChildGroup(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const clearGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(clearGroup(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const updateGroupAt = useCallback(\n (\n groupId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n ) => {\n onTreeChange(updateGroup(activeTree, groupId, patch))\n },\n [activeTree, onTreeChange],\n )\n const removeGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(removeNode(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const updateConditionAt = useCallback(\n (conditionId: string, patch: Partial<Omit<QBCondition, 'kind' | 'id'>>) => {\n onTreeChange(updateCondition(activeTree, conditionId, patch))\n },\n [activeTree, onTreeChange],\n )\n const removeConditionAt = useCallback(\n (conditionId: string) => {\n onTreeChange(removeNode(activeTree, conditionId))\n },\n [activeTree, onTreeChange],\n )\n const dragHandlers = useQueryBuilderDrag(activeTree, onTreeChange)\n\n const contextValue = useMemo(\n () => ({\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n addConditionAt,\n addChildGroupAt,\n clearGroupAt,\n updateGroupAt,\n removeGroupAt,\n updateConditionAt,\n removeConditionAt,\n }),\n [\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n addConditionAt,\n addChildGroupAt,\n clearGroupAt,\n updateGroupAt,\n removeGroupAt,\n updateConditionAt,\n removeConditionAt,\n ],\n )\n\n const readable = useMemo(\n () => qbTreeToReadable(activeTree, getColumnDisplayName),\n [activeTree, getColumnDisplayName],\n )\n\n const {\n data: combinedSql,\n isPending: isSqlPending,\n error: sqlError,\n } = useQBCombinedSql(summaryMode === 'sql' ? activeTree : null)\n\n return (\n <QueryBuilderInternalContextProvider value={contextValue}>\n <DragDropProvider {...dragHandlers}>\n <div className={styles.root}>\n <div className={styles.summaryBar}>\n <div className={styles.summaryHeader}>\n <span className={styles.summaryLabel}>Query Summary</span>\n <ToggleButtonGroup\n className={styles.summaryModeToggle}\n size=\"small\"\n exclusive\n value={summaryMode}\n onChange={(_event, next: SummaryMode | null) => {\n if (next != null) setSummaryMode(next)\n }}\n aria-label=\"Query summary display mode\"\n >\n <ToggleButton value=\"plain-english\" aria-label=\"Show summary\">\n Summary\n </ToggleButton>\n <ToggleButton value=\"sql\" aria-label=\"Show SQL\">\n SQL\n </ToggleButton>\n </ToggleButtonGroup>\n </div>\n <div\n className={styles.summaryContent}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {summaryMode === 'plain-english' ? (\n readable\n ) : sqlError ? (\n <span className={styles.sqlError}>\n Could not load SQL preview: {sqlError.message}\n </span>\n ) : isSqlPending ? (\n <span className={styles.sqlPlaceholder}>Loading SQL…</span>\n ) : (\n <code className={styles.sqlText}>{combinedSql}</code>\n )}\n </div>\n </div>\n\n <FilterGroupNode group={activeTree} isRoot />\n\n <div className={styles.applyRow}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={onApply}\n className={styles.applyButton}\n >\n Update Results\n </Button>\n </div>\n </div>\n </DragDropProvider>\n </QueryBuilderInternalContextProvider>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"QueryBuilderControls.js","names":[],"sources":["../../../src/components/QueryBuilder/QueryBuilderControls.tsx"],"sourcesContent":["import { Button, ToggleButton, ToggleButtonGroup } from '@mui/material'\nimport { DragDropProvider } from '@dnd-kit/react'\nimport { useCallback, useMemo, useState } from 'react'\nimport { isFilterGroup } from '../../utils/types/IsType'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { FilterGroupNode } from './FilterGroupNode'\nimport { useQueryBuilderDrag } from './queryBuilderDnd'\nimport { qbNodeToApiFilter } from './queryBuilderTranslation'\nimport { qbTreeToReadable } from './qbTreeToReadable'\nimport { QueryBuilderInternalContextProvider } from './QueryBuilderInternalContext'\nimport styles from './QueryBuilderControls.module.scss'\nimport {\n addChildGroup,\n addConditionToGroup,\n clearGroup,\n defaultQBGroup,\n removeNode,\n updateCondition,\n updateGroup,\n} from './queryBuilderOperations'\nimport { QBCondition, QBGroup } from './QueryBuilderTypes'\nimport { useQBCombinedSql } from './useQBCombinedSql'\nimport { useQBFacetSourceMetadata } from './useQBFacetSourceMetadata'\nimport { useQBValueDisplayName } from './useQBValueDisplayName'\n\nexport type QueryBuilderControlsProps = {\n /** The QB tree. When null, an empty default tree is rendered. */\n tree: QBGroup | null\n /** Called with the next tree after any dispatched edit. */\n onTreeChange: (next: QBGroup) => void\n /**\n * When true, the property picker only offers columns that have facet\n * metadata (Cohort Builder mode). Defaults to false.\n */\n onlyFacetedColumns?: boolean\n}\n\ntype SummaryMode = 'plain-english' | 'sql'\n\n/**\n * Top-level Query Builder panel. Uses `useQBFacetSourceMetadata()` — must be\n * rendered inside the Suspense boundary that already wraps\n * `QueryVisualizationWrapper` in `QueryWrapperPlotNav`. Facet metadata is\n * pulled from a companion query that strips the QB's own `FilterGroup` out\n * of `additionalFilters` so pill values remain stable while the user builds.\n */\nexport function QueryBuilderControls(props: QueryBuilderControlsProps) {\n const { tree, onTreeChange, onlyFacetedColumns = false } = props\n const { columnModels, facetResults } = useQBFacetSourceMetadata()\n const { executeQueryRequest } = useQueryContext()\n\n const activeTree = tree ?? defaultQBGroup()\n\n const onApply = useCallback(() => {\n const filterGroup = qbNodeToApiFilter(activeTree)\n executeQueryRequest(prev => {\n // Preserve any non-QB additionalFilters (e.g. lockedColumn constraints\n // introduced by portal detail pages) — Update Results only owns the\n // FilterGroup slot.\n const preserved = (prev.query.additionalFilters ?? []).filter(\n f => !isFilterGroup(f),\n )\n const next = filterGroup ? [...preserved, filterGroup] : preserved\n return {\n ...prev,\n query: {\n ...prev.query,\n additionalFilters: next.length > 0 ? next : undefined,\n },\n }\n })\n }, [activeTree, executeQueryRequest])\n\n const { getColumnDisplayName } = useQueryVisualizationContext()\n const getValueDisplayName = useQBValueDisplayName(columnModels, facetResults)\n\n const [summaryMode, setSummaryMode] = useState<SummaryMode>('plain-english')\n\n const addConditionAt = useCallback(\n (groupId: string) => {\n onTreeChange(addConditionToGroup(activeTree, groupId, null, null))\n },\n [activeTree, onTreeChange],\n )\n const addChildGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(addChildGroup(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const clearGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(clearGroup(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const updateGroupAt = useCallback(\n (\n groupId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n ) => {\n onTreeChange(updateGroup(activeTree, groupId, patch))\n },\n [activeTree, onTreeChange],\n )\n const removeGroupAt = useCallback(\n (groupId: string) => {\n onTreeChange(removeNode(activeTree, groupId))\n },\n [activeTree, onTreeChange],\n )\n const updateConditionAt = useCallback(\n (conditionId: string, patch: Partial<Omit<QBCondition, 'kind' | 'id'>>) => {\n onTreeChange(updateCondition(activeTree, conditionId, patch))\n },\n [activeTree, onTreeChange],\n )\n const removeConditionAt = useCallback(\n (conditionId: string) => {\n onTreeChange(removeNode(activeTree, conditionId))\n },\n [activeTree, onTreeChange],\n )\n const dragHandlers = useQueryBuilderDrag(activeTree, onTreeChange)\n\n const contextValue = useMemo(\n () => ({\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n getValueDisplayName,\n addConditionAt,\n addChildGroupAt,\n clearGroupAt,\n updateGroupAt,\n removeGroupAt,\n updateConditionAt,\n removeConditionAt,\n }),\n [\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n getValueDisplayName,\n addConditionAt,\n addChildGroupAt,\n clearGroupAt,\n updateGroupAt,\n removeGroupAt,\n updateConditionAt,\n removeConditionAt,\n ],\n )\n\n const readable = useMemo(\n () =>\n qbTreeToReadable(activeTree, getColumnDisplayName, getValueDisplayName),\n [activeTree, getColumnDisplayName, getValueDisplayName],\n )\n\n const {\n data: combinedSql,\n isPending: isSqlPending,\n error: sqlError,\n } = useQBCombinedSql(summaryMode === 'sql' ? activeTree : null)\n\n return (\n <QueryBuilderInternalContextProvider value={contextValue}>\n <DragDropProvider {...dragHandlers}>\n <div className={styles.root}>\n <div className={styles.summaryBar}>\n <div className={styles.summaryHeader}>\n <span className={styles.summaryLabel}>Query Summary</span>\n <ToggleButtonGroup\n className={styles.summaryModeToggle}\n size=\"small\"\n exclusive\n value={summaryMode}\n onChange={(_event, next: SummaryMode | null) => {\n if (next != null) setSummaryMode(next)\n }}\n aria-label=\"Query summary display mode\"\n >\n <ToggleButton value=\"plain-english\" aria-label=\"Show summary\">\n Summary\n </ToggleButton>\n <ToggleButton value=\"sql\" aria-label=\"Show SQL\">\n SQL\n </ToggleButton>\n </ToggleButtonGroup>\n </div>\n <div\n className={styles.summaryContent}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {summaryMode === 'plain-english' ? (\n readable\n ) : sqlError ? (\n <span className={styles.sqlError}>\n Could not load SQL preview: {sqlError.message}\n </span>\n ) : isSqlPending ? (\n <span className={styles.sqlPlaceholder}>Loading SQL…</span>\n ) : (\n <code className={styles.sqlText}>{combinedSql}</code>\n )}\n </div>\n </div>\n\n <FilterGroupNode group={activeTree} isRoot />\n\n <div className={styles.applyRow}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={onApply}\n className={styles.applyButton}\n >\n Update Results\n </Button>\n </div>\n </div>\n </DragDropProvider>\n </QueryBuilderInternalContextProvider>\n )\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { ColumnModel, FacetColumnResult } from '@sage-bionetworks/synapse-types';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { QBCondition, QBGroup } from './QueryBuilderTypes';
4
+ import { QBValueDisplayNameFn } from './useQBValueDisplayName';
4
5
  /**
5
6
  * Internal-only context shared between `QueryBuilderControls`,
6
7
  * `FilterGroupNode`, and `FilterConditionRow`. Exposes the dispatch surface
@@ -23,6 +24,12 @@ export type QueryBuilderInternalContextType = {
23
24
  * `QueryVisualizationContext.getColumnDisplayName` when available.
24
25
  */
25
26
  getColumnDisplayName: (columnName: string) => string;
27
+ /**
28
+ * Returns the user-facing label for a value of the given column — resolves
29
+ * Synapse IDs to entity/user/evaluation names, and the backend's
30
+ * `VALUE_NOT_SET` sentinel to `Not Assigned`.
31
+ */
32
+ getValueDisplayName: QBValueDisplayNameFn;
26
33
  addConditionAt: (groupId: string) => void;
27
34
  addChildGroupAt: (groupId: string) => void;
28
35
  clearGroupAt: (groupId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilderInternalContext.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/QueryBuilderInternalContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAChF,OAAO,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mEAAmE;IACnE,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,0EAA0E;IAC1E,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC1C;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IAGpD,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,KACtD,IAAI,CAAA;IACT,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAGxC,iBAAiB,EAAE,CACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,KAC7C,IAAI,CAAA;IACT,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAKD,MAAM,MAAM,wCAAwC,GAAG,iBAAiB,CAAC;IACvE,KAAK,EAAE,+BAA+B,CAAA;CACvC,CAAC,CAAA;AAEF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,2CAOhD;AAED,wBAAgB,8BAA8B,IAAI,+BAA+B,CAQhF"}
1
+ {"version":3,"file":"QueryBuilderInternalContext.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/QueryBuilderInternalContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAChF,OAAO,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mEAAmE;IACnE,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,0EAA0E;IAC1E,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC1C;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IACpD;;;;OAIG;IACH,mBAAmB,EAAE,oBAAoB,CAAA;IAGzC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,KACtD,IAAI,CAAA;IACT,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAGxC,iBAAiB,EAAE,CACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,KAC7C,IAAI,CAAA;IACT,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAKD,MAAM,MAAM,wCAAwC,GAAG,iBAAiB,CAAC;IACvE,KAAK,EAAE,+BAA+B,CAAA;CACvC,CAAC,CAAA;AAEF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,2CAOhD;AAED,wBAAgB,8BAA8B,IAAI,+BAA+B,CAQhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilderInternalContext.js","names":[],"sources":["../../../src/components/QueryBuilder/QueryBuilderInternalContext.tsx"],"sourcesContent":["import { ColumnModel, FacetColumnResult } from '@sage-bionetworks/synapse-types'\nimport { createContext, PropsWithChildren, useContext } from 'react'\nimport { QBCondition, QBGroup } from './QueryBuilderTypes'\n\n/**\n * Internal-only context shared between `QueryBuilderControls`,\n * `FilterGroupNode`, and `FilterConditionRow`. Exposes the dispatch surface\n * for tree edits + the query metadata each row needs (column models, facet\n * results, and the Cohort Builder `onlyFacetedColumns` toggle).\n */\nexport type QueryBuilderInternalContextType = {\n /** All columns available in the query (unfiltered by faceting). */\n columnModels: ColumnModel[]\n /** Facet results keyed by column name (used to populate pill choices). */\n facetResults: readonly FacetColumnResult[]\n /**\n * When true, the property picker only offers columns that have facet\n * metadata. Cohort Builder sets this true.\n */\n onlyFacetedColumns: boolean\n /**\n * Returns the user-facing label for a column — resolves `columnAliases`\n * first, then falls back to `unCamelCase(name)`. Wired from\n * `QueryVisualizationContext.getColumnDisplayName` when available.\n */\n getColumnDisplayName: (columnName: string) => string\n\n // -- Group operations --\n addConditionAt: (groupId: string) => void\n addChildGroupAt: (groupId: string) => void\n clearGroupAt: (groupId: string) => void\n updateGroupAt: (\n groupId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n ) => void\n removeGroupAt: (groupId: string) => void\n\n // -- Condition operations --\n updateConditionAt: (\n conditionId: string,\n patch: Partial<Omit<QBCondition, 'kind' | 'id'>>,\n ) => void\n removeConditionAt: (conditionId: string) => void\n}\n\nconst QueryBuilderInternalContext =\n createContext<QueryBuilderInternalContextType | null>(null)\n\nexport type QueryBuilderInternalContextProviderProps = PropsWithChildren<{\n value: QueryBuilderInternalContextType\n}>\n\nexport function QueryBuilderInternalContextProvider(\n props: QueryBuilderInternalContextProviderProps,\n) {\n return (\n <QueryBuilderInternalContext.Provider value={props.value}>\n {props.children}\n </QueryBuilderInternalContext.Provider>\n )\n}\n\nexport function useQueryBuilderInternalContext(): QueryBuilderInternalContextType {\n const context = useContext(QueryBuilderInternalContext)\n if (context == null) {\n throw new Error(\n 'QueryBuilderInternalContext missing — must be rendered inside QueryBuilderControls',\n )\n }\n return context\n}\n"],"mappings":";;;AA6CA,IAAM,IACJ,EAAsD,IAAI;AAM5D,SAAgB,EACd,GACA;CACA,OACE,kBAAC,EAA4B,UAA7B;EAAsC,OAAO,EAAM;YAChD,EAAM;CAC6B,CAAA;AAE1C;AAEA,SAAgB,IAAkE;CAChF,IAAM,IAAU,EAAW,CAA2B;CACtD,IAAI,KAAW,MACb,MAAU,MACR,oFACF;CAEF,OAAO;AACT"}
1
+ {"version":3,"file":"QueryBuilderInternalContext.js","names":[],"sources":["../../../src/components/QueryBuilder/QueryBuilderInternalContext.tsx"],"sourcesContent":["import { ColumnModel, FacetColumnResult } from '@sage-bionetworks/synapse-types'\nimport { createContext, PropsWithChildren, useContext } from 'react'\nimport { QBCondition, QBGroup } from './QueryBuilderTypes'\nimport { QBValueDisplayNameFn } from './useQBValueDisplayName'\n\n/**\n * Internal-only context shared between `QueryBuilderControls`,\n * `FilterGroupNode`, and `FilterConditionRow`. Exposes the dispatch surface\n * for tree edits + the query metadata each row needs (column models, facet\n * results, and the Cohort Builder `onlyFacetedColumns` toggle).\n */\nexport type QueryBuilderInternalContextType = {\n /** All columns available in the query (unfiltered by faceting). */\n columnModels: ColumnModel[]\n /** Facet results keyed by column name (used to populate pill choices). */\n facetResults: readonly FacetColumnResult[]\n /**\n * When true, the property picker only offers columns that have facet\n * metadata. Cohort Builder sets this true.\n */\n onlyFacetedColumns: boolean\n /**\n * Returns the user-facing label for a column — resolves `columnAliases`\n * first, then falls back to `unCamelCase(name)`. Wired from\n * `QueryVisualizationContext.getColumnDisplayName` when available.\n */\n getColumnDisplayName: (columnName: string) => string\n /**\n * Returns the user-facing label for a value of the given column — resolves\n * Synapse IDs to entity/user/evaluation names, and the backend's\n * `VALUE_NOT_SET` sentinel to `Not Assigned`.\n */\n getValueDisplayName: QBValueDisplayNameFn\n\n // -- Group operations --\n addConditionAt: (groupId: string) => void\n addChildGroupAt: (groupId: string) => void\n clearGroupAt: (groupId: string) => void\n updateGroupAt: (\n groupId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n ) => void\n removeGroupAt: (groupId: string) => void\n\n // -- Condition operations --\n updateConditionAt: (\n conditionId: string,\n patch: Partial<Omit<QBCondition, 'kind' | 'id'>>,\n ) => void\n removeConditionAt: (conditionId: string) => void\n}\n\nconst QueryBuilderInternalContext =\n createContext<QueryBuilderInternalContextType | null>(null)\n\nexport type QueryBuilderInternalContextProviderProps = PropsWithChildren<{\n value: QueryBuilderInternalContextType\n}>\n\nexport function QueryBuilderInternalContextProvider(\n props: QueryBuilderInternalContextProviderProps,\n) {\n return (\n <QueryBuilderInternalContext.Provider value={props.value}>\n {props.children}\n </QueryBuilderInternalContext.Provider>\n )\n}\n\nexport function useQueryBuilderInternalContext(): QueryBuilderInternalContextType {\n const context = useContext(QueryBuilderInternalContext)\n if (context == null) {\n throw new Error(\n 'QueryBuilderInternalContext missing — must be rendered inside QueryBuilderControls',\n )\n }\n return context\n}\n"],"mappings":";;;AAoDA,IAAM,IACJ,EAAsD,IAAI;AAM5D,SAAgB,EACd,GACA;CACA,OACE,kBAAC,EAA4B,UAA7B;EAAsC,OAAO,EAAM;YAChD,EAAM;CAC6B,CAAA;AAE1C;AAEA,SAAgB,IAAkE;CAChF,IAAM,IAAU,EAAW,CAA2B;CACtD,IAAI,KAAW,MACb,MAAU,MACR,oFACF;CAEF,OAAO;AACT"}
@@ -1,5 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { QBGroup } from './QueryBuilderTypes';
3
+ import { QBValueDisplayNameFn } from './useQBValueDisplayName';
3
4
  /**
4
5
  * Render a QB tree as a plain-English React node with the AND / OR / NOT
5
6
  * connectives styled inline. Used by the QB's Reads-As summary bar.
@@ -10,5 +11,5 @@ import { QBGroup } from './QueryBuilderTypes';
10
11
  * - Excluded (NOT) groups are always parenthesized and prefixed with NOT.
11
12
  * - Incomplete conditions render as `(unset)`.
12
13
  */
13
- export declare function qbTreeToReadable(root: QBGroup, getColumnDisplayName?: (columnName: string) => string): ReactNode;
14
+ export declare function qbTreeToReadable(root: QBGroup, getColumnDisplayName?: (columnName: string) => string, getValueDisplayName?: QBValueDisplayNameFn): ReactNode;
14
15
  //# sourceMappingURL=qbTreeToReadable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"qbTreeToReadable.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/qbTreeToReadable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAA0B,OAAO,EAAU,MAAM,qBAAqB,CAAA;AAG7E;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,oBAAoB,GAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAqB,GAClE,SAAS,CAIX"}
1
+ {"version":3,"file":"qbTreeToReadable.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/qbTreeToReadable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAA0B,OAAO,EAAU,MAAM,qBAAqB,CAAA;AAE7E,OAAO,EACL,oBAAoB,EAErB,MAAM,yBAAyB,CAAA;AAEhC;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,oBAAoB,GAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAqB,EACnE,mBAAmB,GAAE,oBAA4C,GAChE,SAAS,CAKX"}
@@ -1,9 +1,13 @@
1
1
  import { isQBGroup as e } from "./QueryBuilderTypes.js";
2
- import { labelForFacetValue as t, labelForOp as n } from "./queryBuilderMetadata.js";
2
+ import { labelForOp as t } from "./queryBuilderMetadata.js";
3
+ import { rawQBValueDisplayName as n } from "./useQBValueDisplayName.js";
3
4
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
5
  //#region src/components/QueryBuilder/qbTreeToReadable.tsx
5
- function o(e, t = (e) => e) {
6
- return s(e, !0, t) ?? /* @__PURE__ */ i("span", { children: "(no filters)" });
6
+ function o(e, t = (e) => e, r = n) {
7
+ return s(e, !0, {
8
+ getColumnDisplayName: t,
9
+ getValueDisplayName: r
10
+ }) ?? /* @__PURE__ */ i("span", { children: "(no filters)" });
7
11
  }
8
12
  function s(t, n, r) {
9
13
  return e(t) ? c(t, n, r) : l(t, r);
@@ -31,36 +35,36 @@ function c(e, t, n) {
31
35
  ")"
32
36
  ] });
33
37
  }
34
- function l(e, t) {
35
- let r = u(e);
36
- if (e.columnName == null && r == null) return null;
37
- let o = e.columnName ? t(e.columnName) : "(unset)";
38
- return r == null ? /* @__PURE__ */ a("span", { children: [/* @__PURE__ */ i("strong", { children: o }), " (unset)"] }) : /* @__PURE__ */ a("span", { children: [
39
- /* @__PURE__ */ i("strong", { children: o }),
38
+ function l(e, n) {
39
+ let { getColumnDisplayName: r, getValueDisplayName: o } = n, s = u(e, o);
40
+ if (e.columnName == null && s == null) return null;
41
+ let c = e.columnName ? r(e.columnName) : "(unset)";
42
+ return s == null ? /* @__PURE__ */ a("span", { children: [/* @__PURE__ */ i("strong", { children: c }), " (unset)"] }) : /* @__PURE__ */ a("span", { children: [
43
+ /* @__PURE__ */ i("strong", { children: c }),
40
44
  " ",
41
- n(e.op),
45
+ t(e.op),
42
46
  " ",
43
- r
47
+ s
44
48
  ] });
45
49
  }
46
- function u(e) {
47
- let { op: n, values: r, rangeMin: i, rangeMax: a, text: o } = e;
48
- switch (n) {
50
+ function u(e, t) {
51
+ let { columnName: n, op: r, values: i, rangeMin: a, rangeMax: o, text: s } = e, c = (e) => t(n, e);
52
+ switch (r) {
49
53
  case "has_value":
50
54
  case "no_value": return "";
51
55
  case "is_any_of":
52
- case "is_all_of": return r.length === 0 ? null : r.map(t).join(", ");
56
+ case "is_all_of": return i.length === 0 ? null : i.map(c).join(", ");
53
57
  case "equal":
54
- case "not_equal": return r.length === 0 ? null : t(r[0]);
55
- case "between": return !i || !a ? null : `${i} and ${a}`;
58
+ case "not_equal": return i.length === 0 ? null : c(i[0]);
59
+ case "between": return !a || !o ? null : `${a} and ${o}`;
56
60
  case "gt":
57
- case "gte": return i || null;
61
+ case "gte": return a || null;
58
62
  case "lt":
59
- case "lte": return a || null;
63
+ case "lte": return o || null;
60
64
  case "contains":
61
65
  case "starts_with":
62
66
  case "ends_with":
63
- case "is_exactly": return o ? `"${o}"` : null;
67
+ case "is_exactly": return s ? `"${s}"` : null;
64
68
  default: return null;
65
69
  }
66
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"qbTreeToReadable.js","names":[],"sources":["../../../src/components/QueryBuilder/qbTreeToReadable.tsx"],"sourcesContent":["import { ReactNode } from 'react'\nimport { isQBGroup, QBCondition, QBGroup, QBNode } from './QueryBuilderTypes'\nimport { labelForFacetValue, labelForOp } from './queryBuilderMetadata'\n\n/**\n * Render a QB tree as a plain-English React node with the AND / OR / NOT\n * connectives styled inline. Used by the QB's Reads-As summary bar.\n *\n * Rules (per the design's plain-English summary spec):\n * - The root group reads without outer parentheses.\n * - Nested groups retain parentheses.\n * - Excluded (NOT) groups are always parenthesized and prefixed with NOT.\n * - Incomplete conditions render as `(unset)`.\n */\nexport function qbTreeToReadable(\n root: QBGroup,\n getColumnDisplayName: (columnName: string) => string = name => name,\n): ReactNode {\n const rendered = renderNode(root, true, getColumnDisplayName)\n if (rendered == null) return <span>(no filters)</span>\n return rendered\n}\n\nfunction renderNode(\n node: QBNode,\n isRoot: boolean,\n getColumnDisplayName: (columnName: string) => string,\n): ReactNode | null {\n if (isQBGroup(node)) return renderGroup(node, isRoot, getColumnDisplayName)\n return renderCondition(node, getColumnDisplayName)\n}\n\nfunction renderGroup(\n group: QBGroup,\n isRoot: boolean,\n getColumnDisplayName: (columnName: string) => string,\n): ReactNode | null {\n const parts = group.children\n .map((child, index) => ({\n key: child.id,\n node: renderNode(child, false, getColumnDisplayName),\n index,\n }))\n .filter(part => part.node != null)\n\n if (parts.length === 0) return null\n\n const combinator = group.combinator\n const inner = parts.map((part, index) => (\n <span key={part.key}>\n {index > 0 && (\n <>\n {' '}\n <ConnectiveSpan combinator={combinator} />{' '}\n </>\n )}\n {part.node}\n </span>\n ))\n\n const body = <span>{inner}</span>\n\n if (group.not) {\n return (\n <span>\n <NotSpan /> ({body})\n </span>\n )\n }\n if (isRoot) return body\n return <span>({body})</span>\n}\n\nfunction renderCondition(\n condition: QBCondition,\n getColumnDisplayName: (columnName: string) => string,\n): ReactNode | null {\n const valueSummary = summarizeConditionValue(condition)\n // Skip fully-blank rows so they don't clutter the summary bar. A row is\n // fully blank when the user hasn't picked a column AND hasn't entered any\n // value yet — that's an in-progress row we don't want to narrate.\n if (condition.columnName == null && valueSummary == null) return null\n const columnName = condition.columnName\n ? getColumnDisplayName(condition.columnName)\n : '(unset)'\n if (valueSummary == null) {\n return (\n <span>\n <strong>{columnName}</strong> (unset)\n </span>\n )\n }\n return (\n <span>\n <strong>{columnName}</strong> {labelForOp(condition.op)} {valueSummary}\n </span>\n )\n}\n\nfunction summarizeConditionValue(condition: QBCondition): string | null {\n const { op, values, rangeMin, rangeMax, text } = condition\n switch (op) {\n case 'has_value':\n case 'no_value':\n return ''\n case 'is_any_of':\n case 'is_all_of':\n return values.length === 0\n ? null\n : values.map(labelForFacetValue).join(', ')\n case 'equal':\n case 'not_equal':\n return values.length === 0 ? null : labelForFacetValue(values[0])\n case 'between':\n if (!rangeMin || !rangeMax) return null\n return `${rangeMin} and ${rangeMax}`\n case 'gt':\n case 'gte':\n return rangeMin ? rangeMin : null\n case 'lt':\n case 'lte':\n return rangeMax ? rangeMax : null\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return text ? `\"${text}\"` : null\n default:\n op satisfies never\n return null\n }\n}\n\nfunction ConnectiveSpan({ combinator }: { combinator: 'AND' | 'OR' }) {\n const color =\n combinator === 'OR'\n ? 'var(--synapse-warning)'\n : 'var(--synapse-primary-action-color)'\n return (\n <span style={{ color, fontWeight: 700 }} aria-hidden=\"false\">\n {combinator}\n </span>\n )\n}\n\nfunction NotSpan() {\n return (\n <span style={{ color: 'var(--synapse-error)', fontWeight: 700 }}>NOT</span>\n )\n}\n"],"mappings":";;;;AAcA,SAAgB,EACd,GACA,KAAuD,MAAQ,GACpD;CAGX,OAFiB,EAAW,GAAM,IAAM,CACpC,KAAyB,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA;AAEvD;AAEA,SAAS,EACP,GACA,GACA,GACkB;CAElB,OADI,EAAU,CAAI,IAAU,EAAY,GAAM,GAAQ,CAAoB,IACnE,EAAgB,GAAM,CAAoB;AACnD;AAEA,SAAS,EACP,GACA,GACA,GACkB;CAClB,IAAM,IAAQ,EAAM,SACjB,KAAK,GAAO,OAAW;EACtB,KAAK,EAAM;EACX,MAAM,EAAW,GAAO,IAAO,CAAoB;EACnD;CACF,EAAE,EACD,QAAO,MAAQ,EAAK,QAAQ,IAAI;CAEnC,IAAI,EAAM,WAAW,GAAG,OAAO;CAE/B,IAAM,IAAa,EAAM,YAanB,IAAO,kBAAC,QAAD,EAAA,UAZC,EAAM,KAAK,GAAM,MAC7B,kBAAC,QAAD,EAAA,UAAA,CACG,IAAQ,KACP,kBAAA,GAAA,EAAA,UAAA;EACG;EACD,kBAAC,GAAD,EAA4B,cAAa,CAAA;EAAE;CAC3C,EAAA,CAAA,GAEH,EAAK,IACF,EAAA,GARK,EAAK,GAQV,CAGY,EAAY,CAAA;CAUhC,OARI,EAAM,MAEN,kBAAC,QAAD,EAAA,UAAA;EACE,kBAAC,GAAD,CAAU,CAAA;EAAC;EAAG;EAAK;CACf,EAAA,CAAA,IAGN,IAAe,IACZ,kBAAC,QAAD,EAAA,UAAA;EAAM;EAAE;EAAK;CAAO,EAAA,CAAA;AAC7B;AAEA,SAAS,EACP,GACA,GACkB;CAClB,IAAM,IAAe,EAAwB,CAAS;CAItD,IAAI,EAAU,cAAc,QAAQ,KAAgB,MAAM,OAAO;CACjE,IAAM,IAAa,EAAU,aACzB,EAAqB,EAAU,UAAU,IACzC;CAQJ,OAPI,KAAgB,OAEhB,kBAAC,QAAD,EAAA,UAAA,CACE,kBAAC,UAAD,EAAA,UAAS,EAAmB,CAAA,GAAC,UACzB,EAAA,CAAA,IAIR,kBAAC,QAAD,EAAA,UAAA;EACE,kBAAC,UAAD,EAAA,UAAS,EAAmB,CAAA;EAAC;EAAE,EAAW,EAAU,EAAE;EAAE;EAAE;CACtD,EAAA,CAAA;AAEV;AAEA,SAAS,EAAwB,GAAuC;CACtE,IAAM,EAAE,OAAI,WAAQ,aAAU,aAAU,YAAS;CACjD,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,YACH,OAAO;EACT,KAAK;EACL,KAAK,aACH,OAAO,EAAO,WAAW,IACrB,OACA,EAAO,IAAI,CAAkB,EAAE,KAAK,IAAI;EAC9C,KAAK;EACL,KAAK,aACH,OAAO,EAAO,WAAW,IAAI,OAAO,EAAmB,EAAO,EAAE;EAClE,KAAK,WAEH,OADI,CAAC,KAAY,CAAC,IAAiB,OAC5B,GAAG,EAAS,OAAO;EAC5B,KAAK;EACL,KAAK,OACH,OAAO,KAAsB;EAC/B,KAAK;EACL,KAAK,OACH,OAAO,KAAsB;EAC/B,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO,IAAO,IAAI,EAAK,KAAK;EAC9B,SAEE,OAAO;CACX;AACF;AAEA,SAAS,EAAe,EAAE,iBAA4C;CAKpE,OACE,kBAAC,QAAD;EAAM,OAAO;GAAE,OAJf,MAAe,OACX,2BACA;GAEkB,YAAY;EAAI;EAAG,eAAY;YAClD;CACG,CAAA;AAEV;AAEA,SAAS,IAAU;CACjB,OACE,kBAAC,QAAD;EAAM,OAAO;GAAE,OAAO;GAAwB,YAAY;EAAI;YAAG;CAAS,CAAA;AAE9E"}
1
+ {"version":3,"file":"qbTreeToReadable.js","names":[],"sources":["../../../src/components/QueryBuilder/qbTreeToReadable.tsx"],"sourcesContent":["import { ReactNode } from 'react'\nimport { isQBGroup, QBCondition, QBGroup, QBNode } from './QueryBuilderTypes'\nimport { labelForOp } from './queryBuilderMetadata'\nimport {\n QBValueDisplayNameFn,\n rawQBValueDisplayName,\n} from './useQBValueDisplayName'\n\n/**\n * Render a QB tree as a plain-English React node with the AND / OR / NOT\n * connectives styled inline. Used by the QB's Reads-As summary bar.\n *\n * Rules (per the design's plain-English summary spec):\n * - The root group reads without outer parentheses.\n * - Nested groups retain parentheses.\n * - Excluded (NOT) groups are always parenthesized and prefixed with NOT.\n * - Incomplete conditions render as `(unset)`.\n */\nexport function qbTreeToReadable(\n root: QBGroup,\n getColumnDisplayName: (columnName: string) => string = name => name,\n getValueDisplayName: QBValueDisplayNameFn = rawQBValueDisplayName,\n): ReactNode {\n const displayNames = { getColumnDisplayName, getValueDisplayName }\n const rendered = renderNode(root, true, displayNames)\n if (rendered == null) return <span>(no filters)</span>\n return rendered\n}\n\ntype DisplayNames = {\n getColumnDisplayName: (columnName: string) => string\n getValueDisplayName: QBValueDisplayNameFn\n}\n\nfunction renderNode(\n node: QBNode,\n isRoot: boolean,\n displayNames: DisplayNames,\n): ReactNode | null {\n if (isQBGroup(node)) return renderGroup(node, isRoot, displayNames)\n return renderCondition(node, displayNames)\n}\n\nfunction renderGroup(\n group: QBGroup,\n isRoot: boolean,\n displayNames: DisplayNames,\n): ReactNode | null {\n const parts = group.children\n .map((child, index) => ({\n key: child.id,\n node: renderNode(child, false, displayNames),\n index,\n }))\n .filter(part => part.node != null)\n\n if (parts.length === 0) return null\n\n const combinator = group.combinator\n const inner = parts.map((part, index) => (\n <span key={part.key}>\n {index > 0 && (\n <>\n {' '}\n <ConnectiveSpan combinator={combinator} />{' '}\n </>\n )}\n {part.node}\n </span>\n ))\n\n const body = <span>{inner}</span>\n\n if (group.not) {\n return (\n <span>\n <NotSpan /> ({body})\n </span>\n )\n }\n if (isRoot) return body\n return <span>({body})</span>\n}\n\nfunction renderCondition(\n condition: QBCondition,\n displayNames: DisplayNames,\n): ReactNode | null {\n const { getColumnDisplayName, getValueDisplayName } = displayNames\n const valueSummary = summarizeConditionValue(condition, getValueDisplayName)\n // Skip fully-blank rows so they don't clutter the summary bar. A row is\n // fully blank when the user hasn't picked a column AND hasn't entered any\n // value yet — that's an in-progress row we don't want to narrate.\n if (condition.columnName == null && valueSummary == null) return null\n const columnName = condition.columnName\n ? getColumnDisplayName(condition.columnName)\n : '(unset)'\n if (valueSummary == null) {\n return (\n <span>\n <strong>{columnName}</strong> (unset)\n </span>\n )\n }\n return (\n <span>\n <strong>{columnName}</strong> {labelForOp(condition.op)} {valueSummary}\n </span>\n )\n}\n\nfunction summarizeConditionValue(\n condition: QBCondition,\n getValueDisplayName: QBValueDisplayNameFn,\n): string | null {\n const { columnName, op, values, rangeMin, rangeMax, text } = condition\n const labelForValue = (value: string) =>\n getValueDisplayName(columnName, value)\n switch (op) {\n case 'has_value':\n case 'no_value':\n return ''\n case 'is_any_of':\n case 'is_all_of':\n return values.length === 0 ? null : values.map(labelForValue).join(', ')\n case 'equal':\n case 'not_equal':\n return values.length === 0 ? null : labelForValue(values[0])\n case 'between':\n if (!rangeMin || !rangeMax) return null\n return `${rangeMin} and ${rangeMax}`\n case 'gt':\n case 'gte':\n return rangeMin ? rangeMin : null\n case 'lt':\n case 'lte':\n return rangeMax ? rangeMax : null\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return text ? `\"${text}\"` : null\n default:\n op satisfies never\n return null\n }\n}\n\nfunction ConnectiveSpan({ combinator }: { combinator: 'AND' | 'OR' }) {\n const color =\n combinator === 'OR'\n ? 'var(--synapse-warning)'\n : 'var(--synapse-primary-action-color)'\n return (\n <span style={{ color, fontWeight: 700 }} aria-hidden=\"false\">\n {combinator}\n </span>\n )\n}\n\nfunction NotSpan() {\n return (\n <span style={{ color: 'var(--synapse-error)', fontWeight: 700 }}>NOT</span>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- ._dragHandle_1a118_1{cursor:grab;color:var(--synapse-gray-deemphasized)}._dragSource_1a118_6{opacity:.4}
1
+ ._dragHandle_p23fj_1{cursor:grab;color:var(--synapse-gray-deemphasized)}._dragSource_p23fj_6{opacity:var(--synapse-drag-source-opacity)}
@@ -1,6 +1,6 @@
1
1
  import './queryBuilderDrag.css';var e = {
2
- dragHandle: "_dragHandle_1a118_1",
3
- dragSource: "_dragSource_1a118_6"
2
+ dragHandle: "_dragHandle_p23fj_1",
3
+ dragSource: "_dragSource_p23fj_6"
4
4
  };
5
5
  //#endregion
6
6
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderDrag.module.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderDrag.module.scss"],"sourcesContent":["// Styles shared by both draggable node types in the tree.\n\n.dragHandle {\n cursor: grab;\n color: var(--synapse-gray-deemphasized);\n}\n\n// The node the pointer is carrying. It stays in the tree and moves between\n// groups as the drag goes, so it is dimmed to read as in-flight.\n.dragSource {\n opacity: 0.4;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"queryBuilderDrag.module.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderDrag.module.scss"],"sourcesContent":["// Styles shared by both draggable node types in the tree.\n\n.dragHandle {\n cursor: grab;\n color: var(--synapse-gray-deemphasized);\n}\n\n// The node the pointer is carrying. It stays in the tree and moves between\n// groups as the drag goes, so it is dimmed to read as in-flight.\n.dragSource {\n opacity: var(--synapse-drag-source-opacity);\n}\n"],"mappings":""}
@@ -8,5 +8,5 @@
8
8
  // The node the pointer is carrying. It stays in the tree and moves between
9
9
  // groups as the drag goes, so it is dimmed to read as in-flight.
10
10
  .dragSource {
11
- opacity: 0.4;
11
+ opacity: var(--synapse-drag-source-opacity);
12
12
  }
@@ -1,4 +1,12 @@
1
+ /**
2
+ * Column-kind classification and operator availability per kind. The QB uses
3
+ * this both to populate the operator picker dropdown and to decide what shape
4
+ * of value input to render.
5
+ */
6
+ import { FacetColumnResult, FacetColumnResultValues } from '@sage-bionetworks/synapse-types';
1
7
  import { QBConditionOp } from './QueryBuilderTypes';
8
+ /** Narrows a facet result to the enumerated-values variant the QB can render. */
9
+ export declare function isFacetColumnResultValues(facet: FacetColumnResult): facet is FacetColumnResultValues;
2
10
  /** Categorization of columns for the QB UI. Not a synapse-types concept. */
3
11
  export type QBColumnKind = 'enum' | 'list' | 'range' | 'boolean' | 'text' | 'unknown';
4
12
  /**
@@ -21,4 +29,12 @@ export declare function labelForOp(op: QBConditionOp): string;
21
29
  * The underlying value stored on the QB condition is unchanged.
22
30
  */
23
31
  export declare function labelForFacetValue(value: string): string;
32
+ /**
33
+ * Does a facet value match the pill filter query? Matching considers both the
34
+ * user-facing label and the underlying value, so a pill labeled with a
35
+ * resolved entity or user name is still findable by the ID it stores.
36
+ *
37
+ * An empty query matches everything.
38
+ */
39
+ export declare function facetValueMatchesFilter(value: string, label: string, query: string): boolean;
24
40
  //# sourceMappingURL=queryBuilderMetadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderMetadata.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderMetadata.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,MAAM,GACN,SAAS,CAAA;AAEb;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,EAAE,OAAO,GAChB,YAAY,CA4Bd;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,EAAE,CAoCvE;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAoCpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"queryBuilderMetadata.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderMetadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,iCAAiC,CAAA;AAMxC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,iBAAiB,GACvB,KAAK,IAAI,uBAAuB,CAKlC;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,MAAM,GACN,SAAS,CAAA;AAEb;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,EAAE,OAAO,GAChB,YAAY,CA4Bd;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,EAAE,CAoCvE;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAoCpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAQT"}
@@ -1,6 +1,10 @@
1
1
  import { FRIENDLY_VALUE_NOT_SET as e } from "../../utils/SynapseConstants.js";
2
+ import { parseSynId as t } from "../../utils/functions/RegularExpressions.js";
2
3
  //#region src/components/QueryBuilder/queryBuilderMetadata.ts
3
- function t(e, t) {
4
+ function n(e) {
5
+ return e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues";
6
+ }
7
+ function r(e, t) {
4
8
  if (e?.endsWith("_LIST")) return "list";
5
9
  if (t) return "enum";
6
10
  if (e == null) return "unknown";
@@ -21,7 +25,7 @@ function t(e, t) {
21
25
  default: return "text";
22
26
  }
23
27
  }
24
- function n(e) {
28
+ function i(e) {
25
29
  switch (e) {
26
30
  case "enum": return [
27
31
  "is_any_of",
@@ -62,7 +66,7 @@ function n(e) {
62
66
  default: return [];
63
67
  }
64
68
  }
65
- function r(e) {
69
+ function a(e) {
66
70
  switch (e) {
67
71
  case "is_any_of": return "is any of";
68
72
  case "is_all_of": return "is all of";
@@ -82,10 +86,14 @@ function r(e) {
82
86
  default: return e;
83
87
  }
84
88
  }
85
- function i(t) {
89
+ function o(t) {
86
90
  return t === "org.sagebionetworks.UNDEFINED_NULL_NOTSET" ? e : t;
87
91
  }
92
+ function s(e, n, r) {
93
+ let i = r.trim().toLowerCase();
94
+ return i === "" || n.toLowerCase().includes(i) || e.toLowerCase().includes(i) ? !0 : t(i)?.targetId === `syn${e}`;
95
+ }
88
96
  //#endregion
89
- export { n as availableOpsForKind, t as classifyColumn, i as labelForFacetValue, r as labelForOp };
97
+ export { i as availableOpsForKind, r as classifyColumn, s as facetValueMatchesFilter, n as isFacetColumnResultValues, o as labelForFacetValue, a as labelForOp };
90
98
 
91
99
  //# sourceMappingURL=queryBuilderMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderMetadata.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderMetadata.ts"],"sourcesContent":["/**\n * Column-kind classification and operator availability per kind. The QB uses\n * this both to populate the operator picker dropdown and to decide what shape\n * of value input to render.\n */\nimport {\n FRIENDLY_VALUE_NOT_SET,\n VALUE_NOT_SET,\n} from '../../utils/SynapseConstants'\nimport { QBConditionOp } from './QueryBuilderTypes'\n\n/** Categorization of columns for the QB UI. Not a synapse-types concept. */\nexport type QBColumnKind =\n | 'enum'\n | 'list'\n | 'range'\n | 'boolean'\n | 'text'\n | 'unknown'\n\n/**\n * Classify a column into a QB kind based on its `ColumnTypeEnum` string and\n * whether the column has a facet in the query result. `hasFacet` distinguishes\n * a faceted single-value column (`enum`) from a plain single-value column\n * (`text`).\n */\nexport function classifyColumn(\n columnType: string | null,\n hasFacet: boolean,\n): QBColumnKind {\n // `_LIST` columns keep the `list` kind so `is_all_of` remains available.\n if (columnType?.endsWith('_LIST')) return 'list'\n // Any faceted column becomes an enum picker regardless of the raw column\n // type (even when the type is unknown, e.g. when the QB tree was hydrated\n // from `selectedFacets` without column-model context).\n if (hasFacet) return 'enum'\n if (columnType == null) return 'unknown'\n switch (columnType) {\n case 'BOOLEAN':\n return 'boolean'\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'range'\n case 'STRING':\n case 'LARGETEXT':\n case 'LINK':\n case 'MEDIUMTEXT':\n case 'USERID':\n case 'ENTITYID':\n case 'EVALUATIONID':\n case 'SUBMISSIONID':\n return 'text'\n default:\n return 'text'\n }\n}\n\n/**\n * Ordered list of operators offered for a given column kind. Order controls\n * the operator picker dropdown ordering.\n */\nexport function availableOpsForKind(kind: QBColumnKind): QBConditionOp[] {\n switch (kind) {\n case 'enum':\n return ['is_any_of', 'has_value', 'no_value']\n case 'list':\n return ['is_any_of', 'is_all_of', 'has_value', 'no_value']\n case 'range':\n return [\n 'between',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'equal',\n 'not_equal',\n 'has_value',\n 'no_value',\n ]\n case 'boolean':\n return ['equal', 'has_value', 'no_value']\n case 'text':\n return [\n 'contains',\n 'starts_with',\n 'ends_with',\n 'is_exactly',\n 'has_value',\n 'no_value',\n ]\n case 'unknown':\n // No column picked yet; offer nothing until one is selected.\n return []\n default:\n kind satisfies never\n return []\n }\n}\n\n/** Human-readable label for an operator, shown in the operator picker. */\nexport function labelForOp(op: QBConditionOp): string {\n switch (op) {\n case 'is_any_of':\n return 'is any of'\n case 'is_all_of':\n return 'is all of'\n case 'between':\n return 'between'\n case 'gt':\n return '>'\n case 'gte':\n return '≥'\n case 'lt':\n return '<'\n case 'lte':\n return '≤'\n case 'equal':\n return 'equals'\n case 'not_equal':\n return 'does not equal'\n case 'has_value':\n return 'has value'\n case 'no_value':\n return 'has no value'\n case 'contains':\n return 'contains'\n case 'starts_with':\n return 'starts with'\n case 'ends_with':\n return 'ends with'\n case 'is_exactly':\n return 'is exactly'\n default:\n op satisfies never\n return op\n }\n}\n\n/**\n * Returns the user-facing label for a raw facet value. Backend sentinels like\n * `VALUE_NOT_SET` display as `Not Assigned`; every other value renders as-is.\n * The underlying value stored on the QB condition is unchanged.\n */\nexport function labelForFacetValue(value: string): string {\n return value === VALUE_NOT_SET ? FRIENDLY_VALUE_NOT_SET : value\n}\n"],"mappings":";;AA0BA,SAAgB,EACd,GACA,GACc;CAEd,IAAI,GAAY,SAAS,OAAO,GAAG,OAAO;CAI1C,IAAI,GAAU,OAAO;CACrB,IAAI,KAAc,MAAM,OAAO;CAC/B,QAAQ,GAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAMA,SAAgB,EAAoB,GAAqC;CACvE,QAAQ,GAAR;EACE,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;EAAU;EAC9C,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;GAAa;EAAU;EAC3D,KAAK,SACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WACH,OAAO;GAAC;GAAS;GAAa;EAAU;EAC1C,KAAK,QACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WAEH,OAAO,CAAC;EACV,SAEE,OAAO,CAAC;CACZ;AACF;AAGA,SAAgB,EAAW,GAA2B;CACpD,QAAQ,GAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,SAEE,OAAO;CACX;AACF;AAOA,SAAgB,EAAmB,GAAuB;CACxD,OAAO,MAAA,8CAA0B,IAAyB;AAC5D"}
1
+ {"version":3,"file":"queryBuilderMetadata.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderMetadata.ts"],"sourcesContent":["/**\n * Column-kind classification and operator availability per kind. The QB uses\n * this both to populate the operator picker dropdown and to decide what shape\n * of value input to render.\n */\nimport {\n FacetColumnResult,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { parseSynId } from '../../utils/functions/RegularExpressions'\nimport {\n FRIENDLY_VALUE_NOT_SET,\n VALUE_NOT_SET,\n} from '../../utils/SynapseConstants'\nimport { QBConditionOp } from './QueryBuilderTypes'\n\n/** Narrows a facet result to the enumerated-values variant the QB can render. */\nexport function isFacetColumnResultValues(\n facet: FacetColumnResult,\n): facet is FacetColumnResultValues {\n return (\n facet.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues'\n )\n}\n\n/** Categorization of columns for the QB UI. Not a synapse-types concept. */\nexport type QBColumnKind =\n | 'enum'\n | 'list'\n | 'range'\n | 'boolean'\n | 'text'\n | 'unknown'\n\n/**\n * Classify a column into a QB kind based on its `ColumnTypeEnum` string and\n * whether the column has a facet in the query result. `hasFacet` distinguishes\n * a faceted single-value column (`enum`) from a plain single-value column\n * (`text`).\n */\nexport function classifyColumn(\n columnType: string | null,\n hasFacet: boolean,\n): QBColumnKind {\n // `_LIST` columns keep the `list` kind so `is_all_of` remains available.\n if (columnType?.endsWith('_LIST')) return 'list'\n // Any faceted column becomes an enum picker regardless of the raw column\n // type (even when the type is unknown, e.g. when the QB tree was hydrated\n // from `selectedFacets` without column-model context).\n if (hasFacet) return 'enum'\n if (columnType == null) return 'unknown'\n switch (columnType) {\n case 'BOOLEAN':\n return 'boolean'\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'range'\n case 'STRING':\n case 'LARGETEXT':\n case 'LINK':\n case 'MEDIUMTEXT':\n case 'USERID':\n case 'ENTITYID':\n case 'EVALUATIONID':\n case 'SUBMISSIONID':\n return 'text'\n default:\n return 'text'\n }\n}\n\n/**\n * Ordered list of operators offered for a given column kind. Order controls\n * the operator picker dropdown ordering.\n */\nexport function availableOpsForKind(kind: QBColumnKind): QBConditionOp[] {\n switch (kind) {\n case 'enum':\n return ['is_any_of', 'has_value', 'no_value']\n case 'list':\n return ['is_any_of', 'is_all_of', 'has_value', 'no_value']\n case 'range':\n return [\n 'between',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'equal',\n 'not_equal',\n 'has_value',\n 'no_value',\n ]\n case 'boolean':\n return ['equal', 'has_value', 'no_value']\n case 'text':\n return [\n 'contains',\n 'starts_with',\n 'ends_with',\n 'is_exactly',\n 'has_value',\n 'no_value',\n ]\n case 'unknown':\n // No column picked yet; offer nothing until one is selected.\n return []\n default:\n kind satisfies never\n return []\n }\n}\n\n/** Human-readable label for an operator, shown in the operator picker. */\nexport function labelForOp(op: QBConditionOp): string {\n switch (op) {\n case 'is_any_of':\n return 'is any of'\n case 'is_all_of':\n return 'is all of'\n case 'between':\n return 'between'\n case 'gt':\n return '>'\n case 'gte':\n return '≥'\n case 'lt':\n return '<'\n case 'lte':\n return '≤'\n case 'equal':\n return 'equals'\n case 'not_equal':\n return 'does not equal'\n case 'has_value':\n return 'has value'\n case 'no_value':\n return 'has no value'\n case 'contains':\n return 'contains'\n case 'starts_with':\n return 'starts with'\n case 'ends_with':\n return 'ends with'\n case 'is_exactly':\n return 'is exactly'\n default:\n op satisfies never\n return op\n }\n}\n\n/**\n * Returns the user-facing label for a raw facet value. Backend sentinels like\n * `VALUE_NOT_SET` display as `Not Assigned`; every other value renders as-is.\n * The underlying value stored on the QB condition is unchanged.\n */\nexport function labelForFacetValue(value: string): string {\n return value === VALUE_NOT_SET ? FRIENDLY_VALUE_NOT_SET : value\n}\n\n/**\n * Does a facet value match the pill filter query? Matching considers both the\n * user-facing label and the underlying value, so a pill labeled with a\n * resolved entity or user name is still findable by the ID it stores.\n *\n * An empty query matches everything.\n */\nexport function facetValueMatchesFilter(\n value: string,\n label: string,\n query: string,\n): boolean {\n const normalizedQuery = query.trim().toLowerCase()\n if (normalizedQuery === '') return true\n if (label.toLowerCase().includes(normalizedQuery)) return true\n if (value.toLowerCase().includes(normalizedQuery)) return true\n // An entity ID pasted from elsewhere in Synapse carries a `syn` prefix (and\n // possibly a version suffix) that an ENTITYID column's stored value doesn't.\n return parseSynId(normalizedQuery)?.targetId === `syn${value}`\n}\n"],"mappings":";;;AAiBA,SAAgB,EACd,GACkC;CAClC,OACE,EAAM,iBACN;AAEJ;AAiBA,SAAgB,EACd,GACA,GACc;CAEd,IAAI,GAAY,SAAS,OAAO,GAAG,OAAO;CAI1C,IAAI,GAAU,OAAO;CACrB,IAAI,KAAc,MAAM,OAAO;CAC/B,QAAQ,GAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAMA,SAAgB,EAAoB,GAAqC;CACvE,QAAQ,GAAR;EACE,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;EAAU;EAC9C,KAAK,QACH,OAAO;GAAC;GAAa;GAAa;GAAa;EAAU;EAC3D,KAAK,SACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WACH,OAAO;GAAC;GAAS;GAAa;EAAU;EAC1C,KAAK,QACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,WAEH,OAAO,CAAC;EACV,SAEE,OAAO,CAAC;CACZ;AACF;AAGA,SAAgB,EAAW,GAA2B;CACpD,QAAQ,GAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,SAEE,OAAO;CACX;AACF;AAOA,SAAgB,EAAmB,GAAuB;CACxD,OAAO,MAAA,8CAA0B,IAAyB;AAC5D;AASA,SAAgB,EACd,GACA,GACA,GACS;CACT,IAAM,IAAkB,EAAM,KAAK,EAAE,YAAY;CAMjD,OALI,MAAoB,MACpB,EAAM,YAAY,EAAE,SAAS,CAAe,KAC5C,EAAM,YAAY,EAAE,SAAS,CAAe,IAAU,KAGnD,EAAW,CAAe,GAAG,aAAa,MAAM;AACzD"}
@@ -0,0 +1,18 @@
1
+ import { ColumnModel, FacetColumnResult } from '@sage-bionetworks/synapse-types';
2
+ /**
3
+ * Resolves the user-facing label for a value stored on a QB condition. Columns
4
+ * whose values are Synapse IDs resolve to the object's name; every other
5
+ * column falls back to {@link labelForFacetValue}.
6
+ */
7
+ export type QBValueDisplayNameFn = (columnName: string | null, value: string) => string;
8
+ /**
9
+ * Builds the labeling function used for every value the QB displays — pill
10
+ * choices and the plain-English summary alike.
11
+ *
12
+ * IDs are looked up in batch for the whole panel rather than per condition, so
13
+ * a value keeps its name whether or not a condition is currently selecting it.
14
+ */
15
+ export declare function useQBValueDisplayName(columnModels: ColumnModel[], facetResults: readonly FacetColumnResult[]): QBValueDisplayNameFn;
16
+ /** Labeler used when no ID resolution is available (e.g. outside the panel). */
17
+ export declare const rawQBValueDisplayName: QBValueDisplayNameFn;
18
+ //# sourceMappingURL=useQBValueDisplayName.d.ts.map