synapse-react-client 4.0.40 → 4.0.41

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 (195) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.d.ts +1 -0
  6. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.d.ts.map +1 -1
  7. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js +12 -12
  8. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js.map +1 -1
  9. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  10. package/dist/components/Aridhia/AridhiaAccessStatus.js +51 -48
  11. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  12. package/dist/components/Authentication/Constants.d.ts +4 -0
  13. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  14. package/dist/components/Authentication/Constants.js +5 -2
  15. package/dist/components/Authentication/Constants.js.map +1 -1
  16. package/dist/components/Authentication/RecoveryCodeGrid.d.ts.map +1 -1
  17. package/dist/components/Authentication/RecoveryCodeGrid.js +8 -1
  18. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  19. package/dist/components/Authentication/RegenerateBackupCodesWarning.js +4 -1
  20. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  21. package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
  22. package/dist/components/Authentication/TOTPForm.js +20 -18
  23. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  24. package/dist/components/Authentication/TwoFactorBackupCodes.d.ts.map +1 -1
  25. package/dist/components/Authentication/TwoFactorBackupCodes.js +41 -12
  26. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  27. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  28. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +74 -71
  29. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  30. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
  31. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +43 -46
  32. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
  33. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts +11 -0
  34. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts.map +1 -0
  35. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js +61 -0
  36. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js.map +1 -0
  37. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts +33 -0
  38. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts.map +1 -0
  39. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js +187 -0
  40. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js.map +1 -0
  41. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts +14 -0
  42. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts.map +1 -0
  43. package/dist/components/FormTemplateEditor/FormTemplatePreview.js +83 -0
  44. package/dist/components/FormTemplateEditor/FormTemplatePreview.js.map +1 -0
  45. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.d.ts +13 -0
  46. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.d.ts.map +1 -0
  47. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.js +33 -0
  48. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.js.map +1 -0
  49. package/dist/components/FormTemplateEditor/formTemplateValidation.d.ts +32 -0
  50. package/dist/components/FormTemplateEditor/formTemplateValidation.d.ts.map +1 -0
  51. package/dist/components/FormTemplateEditor/formTemplateValidation.js +75 -0
  52. package/dist/components/FormTemplateEditor/formTemplateValidation.js.map +1 -0
  53. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts +25 -0
  54. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts.map +1 -0
  55. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +66 -0
  56. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -0
  57. package/dist/components/FormTemplateEditor/useSaveFormTemplate.d.ts +28 -0
  58. package/dist/components/FormTemplateEditor/useSaveFormTemplate.d.ts.map +1 -0
  59. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js +39 -0
  60. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js.map +1 -0
  61. package/dist/components/FormTemplateEditor/utils.d.ts +21 -0
  62. package/dist/components/FormTemplateEditor/utils.d.ts.map +1 -0
  63. package/dist/components/FormTemplateEditor/utils.js +27 -0
  64. package/dist/components/FormTemplateEditor/utils.js.map +1 -0
  65. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts +1 -1
  66. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts.map +1 -1
  67. package/dist/components/JsonSchemaForm/JsonSchemaForm.css +1 -1
  68. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js +1 -1
  69. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js.map +1 -1
  70. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.scss +6 -1
  71. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.d.ts.map +1 -1
  72. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js +4 -0
  73. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  74. package/dist/components/QueryBuilder/FilterConditionRow.css +1 -1
  75. package/dist/components/QueryBuilder/FilterConditionRow.d.ts +2 -0
  76. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  77. package/dist/components/QueryBuilder/FilterConditionRow.js +112 -109
  78. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  79. package/dist/components/QueryBuilder/FilterConditionRow.module.js +10 -11
  80. package/dist/components/QueryBuilder/FilterConditionRow.module.js.map +1 -1
  81. package/dist/components/QueryBuilder/FilterConditionRow.module.scss +0 -5
  82. package/dist/components/QueryBuilder/FilterGroupNode.css +1 -1
  83. package/dist/components/QueryBuilder/FilterGroupNode.d.ts +4 -0
  84. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
  85. package/dist/components/QueryBuilder/FilterGroupNode.js +85 -51
  86. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
  87. package/dist/components/QueryBuilder/FilterGroupNode.module.js +10 -9
  88. package/dist/components/QueryBuilder/FilterGroupNode.module.js.map +1 -1
  89. package/dist/components/QueryBuilder/FilterGroupNode.module.scss +9 -0
  90. package/dist/components/QueryBuilder/QBDragHandle.d.ts +10 -0
  91. package/dist/components/QueryBuilder/QBDragHandle.d.ts.map +1 -0
  92. package/dist/components/QueryBuilder/QBDragHandle.js +22 -0
  93. package/dist/components/QueryBuilder/QBDragHandle.js.map +1 -0
  94. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  95. package/dist/components/QueryBuilder/QueryBuilderControls.js +112 -107
  96. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  97. package/dist/components/QueryBuilder/qbTreeToReadable.js +11 -11
  98. package/dist/components/QueryBuilder/queryBuilderDnd.d.ts +27 -0
  99. package/dist/components/QueryBuilder/queryBuilderDnd.d.ts.map +1 -0
  100. package/dist/components/QueryBuilder/queryBuilderDnd.js +41 -0
  101. package/dist/components/QueryBuilder/queryBuilderDnd.js.map +1 -0
  102. package/dist/components/QueryBuilder/queryBuilderDrag.css +1 -0
  103. package/dist/components/QueryBuilder/queryBuilderDrag.module.js +8 -0
  104. package/dist/components/QueryBuilder/queryBuilderDrag.module.js.map +1 -0
  105. package/dist/components/QueryBuilder/queryBuilderDrag.module.scss +12 -0
  106. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts +13 -0
  107. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts.map +1 -1
  108. package/dist/components/QueryBuilder/queryBuilderOperations.js +39 -36
  109. package/dist/components/QueryBuilder/queryBuilderOperations.js.map +1 -1
  110. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  111. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +46 -47
  112. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  113. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts +0 -1
  114. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
  115. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +35 -36
  116. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  117. package/dist/components/styled/LeftRightPanel.d.ts.map +1 -1
  118. package/dist/components/styled/LeftRightPanel.js +19 -2
  119. package/dist/components/styled/LeftRightPanel.js.map +1 -1
  120. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +2 -2
  121. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -1
  122. package/dist/mocks/accessRequirement/mockFormTemplates.js +7 -14
  123. package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -1
  124. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts +4 -1
  125. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -1
  126. package/dist/mocks/accessRequirement/mockJsonSchemas.js +36 -15
  127. package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -1
  128. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +41 -14
  129. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
  130. package/dist/mocks/msw/handlers/asyncJobHandlers.js +53 -44
  131. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  132. package/dist/mocks/msw/handlers/chatHandlers.d.ts.map +1 -1
  133. package/dist/mocks/msw/handlers/chatHandlers.js +19 -13
  134. package/dist/mocks/msw/handlers/chatHandlers.js.map +1 -1
  135. package/dist/mocks/msw/handlers/schemaHandlers.d.ts +2 -1
  136. package/dist/mocks/msw/handlers/schemaHandlers.d.ts.map +1 -1
  137. package/dist/mocks/msw/handlers/schemaHandlers.js +13 -7
  138. package/dist/mocks/msw/handlers/schemaHandlers.js.map +1 -1
  139. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -1
  140. package/dist/mocks/msw/handlers/searchQueryHandlers.js +24 -18
  141. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -1
  142. package/dist/mocks/msw/handlers/tableQueryHandlers.d.ts.map +1 -1
  143. package/dist/mocks/msw/handlers/tableQueryHandlers.js +35 -16
  144. package/dist/mocks/msw/handlers/tableQueryHandlers.js.map +1 -1
  145. package/dist/synapse-queries/KeyFactory.d.ts +1 -2
  146. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  147. package/dist/synapse-queries/KeyFactory.js +2 -5
  148. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  149. package/dist/synapse-queries/dataaccess/index.d.ts +0 -1
  150. package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
  151. package/dist/synapse-queries/dataaccess/index.js +3 -4
  152. package/dist/synapse-queries/index.js +180 -184
  153. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts +9 -0
  154. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts.map +1 -0
  155. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.js +22 -0
  156. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.js.map +1 -0
  157. package/dist/testutils/vitest.setup.js +18 -9
  158. package/dist/testutils/vitest.setup.js.map +1 -1
  159. package/dist/tsconfig.build.tsbuildinfo +1 -1
  160. package/dist/utils/APIConstants.d.ts +1 -0
  161. package/dist/utils/APIConstants.d.ts.map +1 -1
  162. package/dist/utils/APIConstants.js +2 -2
  163. package/dist/utils/APIConstants.js.map +1 -1
  164. package/dist/utils/appendFinalQueryParamKey.d.ts.map +1 -1
  165. package/dist/utils/appendFinalQueryParamKey.js +4 -1
  166. package/dist/utils/appendFinalQueryParamKey.js.map +1 -1
  167. package/dist/utils/featureflag/FeatureFlags.d.ts +1 -0
  168. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  169. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  170. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  171. package/dist/utils/functions/ArrayUtils.d.ts +3 -0
  172. package/dist/utils/functions/ArrayUtils.d.ts.map +1 -1
  173. package/dist/utils/functions/ArrayUtils.js +7 -1
  174. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  175. package/dist/utils/jsonschema/generateDataAccessSchema.d.ts +26 -0
  176. package/dist/utils/jsonschema/generateDataAccessSchema.d.ts.map +1 -0
  177. package/dist/utils/jsonschema/generateDataAccessSchema.js +28 -0
  178. package/dist/utils/jsonschema/generateDataAccessSchema.js.map +1 -0
  179. package/dist/utils/jsonschema/submissionContext.d.ts +86 -0
  180. package/dist/utils/jsonschema/submissionContext.d.ts.map +1 -0
  181. package/dist/utils/jsonschema/submissionContext.js +186 -0
  182. package/dist/utils/jsonschema/submissionContext.js.map +1 -0
  183. package/package.json +5 -3
  184. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.d.ts +0 -6
  185. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.d.ts.map +0 -1
  186. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js +0 -32
  187. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js.map +0 -1
  188. package/dist/components/entity/page/title_bar/TitleBarProperties.d.ts +0 -9
  189. package/dist/components/entity/page/title_bar/TitleBarProperties.d.ts.map +0 -1
  190. package/dist/components/entity/page/title_bar/TitleBarProperties.js +0 -24
  191. package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +0 -1
  192. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts +0 -21
  193. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts.map +0 -1
  194. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js +0 -34
  195. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js.map +0 -1
@@ -35,6 +35,10 @@ function u(u) {
35
35
  })
36
36
  ]
37
37
  }),
38
+ !d && g === "inline" && p && /* @__PURE__ */ o("div", {
39
+ className: "field-description-inline",
40
+ children: p
41
+ }),
38
42
  h,
39
43
  !d && g === "expand" && /* @__PURE__ */ o(n, {
40
44
  className: "field-description",
@@ -1 +1 @@
1
- {"version":3,"file":"RJSFInputLabel.js","names":[],"sources":["../../../../src/components/JsonSchemaForm/templates/RJSFInputLabel.tsx"],"sourcesContent":["import { StyledPopover } from '@/components/styled/StyledPopover'\nimport { HelpOutline, HelpTwoTone } from '@mui/icons-material'\nimport { Collapse, IconButton, Tooltip } from '@mui/material'\nimport {\n FormContextType,\n Registry,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { PropsWithChildren, useState } from 'react'\n\ntype RJSFInputLabelProps<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> = PropsWithChildren<{\n /** If true, the label will not be shown\n * @default false */\n hideLabel?: boolean\n /** The rendered label of the field */\n fieldLabel: React.ReactNode\n /** The rendered description of the field */\n description: React.ReactNode\n /** The `registry` object */\n registry: Registry<T, S, F>\n}>\n\n/**\n * Component that handles rendering our custom input label and description fields for RJSF.\n */\nexport function RJSFInputLabelWrapper<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: RJSFInputLabelProps<T, S, F>) {\n const {\n hideLabel = false,\n fieldLabel,\n description,\n registry,\n children,\n } = props\n const descriptionVariant =\n registry.formContext.descriptionVariant || 'popover'\n\n const [showDetails, setShowDetails] = useState(false)\n\n const expandButton = (\n <Tooltip title={'More Info'}>\n <IconButton\n onClick={e => {\n e.preventDefault()\n setShowDetails(!showDetails)\n }}\n aria-expanded={showDetails}\n size={'small'}\n >\n <HelpOutline color={'primary'} sx={{ width: '16px', height: '16px' }} />\n </IconButton>\n </Tooltip>\n )\n\n const popoverButton = (\n <StyledPopover popoverContent={description} maxWidth=\"350px\">\n <HelpTwoTone className={`HelpButton`} />\n </StyledPopover>\n )\n\n return (\n <>\n {!hideLabel && (\n <div className=\"LabelContainer\">\n {fieldLabel}\n {description && descriptionVariant === 'popover' && popoverButton}\n {description && descriptionVariant === 'expand' && expandButton}\n </div>\n )}\n {children}\n {!hideLabel && descriptionVariant === 'expand' && (\n <Collapse className=\"field-description\" in={showDetails}>\n {description}\n </Collapse>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AA8BA,SAAgB,EAId,GAAqC;CACrC,IAAM,EACJ,eAAY,IACZ,eACA,gBACA,aACA,gBACE,GACE,IACJ,EAAS,YAAY,sBAAsB,WAEvC,CAAC,GAAa,KAAkB,EAAS,EAAK;CAuBpD,OACE,kBAAA,GAAA,EAAA,UAAA;EACG,CAAC,KACA,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG;IACA,KAAe,MAAuB,aAV7C,kBAAC,GAAD;KAAe,gBAAgB;KAAa,UAAS;eACnD,kBAAC,GAAD,EAAa,WAAW,aAAe,CAAA;IAC1B,CAQ2C;IACnD,KAAe,MAAuB,YA1B7C,kBAAC,GAAD;KAAS,OAAO;eACd,kBAAC,GAAD;MACE,UAAS,MAAK;OAEZ,AADA,EAAE,eAAe,GACjB,EAAe,CAAC,CAAW;MAC7B;MACA,iBAAe;MACf,MAAM;gBAEN,kBAAC,GAAD;OAAa,OAAO;OAAW,IAAI;QAAE,OAAO;QAAQ,QAAQ;OAAO;MAAI,CAAA;KAC7D,CAAA;IACL,CAegD;GAChD;;EAEN;EACA,CAAC,KAAa,MAAuB,YACpC,kBAAC,GAAD;GAAU,WAAU;GAAoB,IAAI;aACzC;EACO,CAAA;CAEZ,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"RJSFInputLabel.js","names":[],"sources":["../../../../src/components/JsonSchemaForm/templates/RJSFInputLabel.tsx"],"sourcesContent":["import { StyledPopover } from '@/components/styled/StyledPopover'\nimport { HelpOutline, HelpTwoTone } from '@mui/icons-material'\nimport { Collapse, IconButton, Tooltip } from '@mui/material'\nimport {\n FormContextType,\n Registry,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { PropsWithChildren, useState } from 'react'\n\ntype RJSFInputLabelProps<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> = PropsWithChildren<{\n /** If true, the label will not be shown\n * @default false */\n hideLabel?: boolean\n /** The rendered label of the field */\n fieldLabel: React.ReactNode\n /** The rendered description of the field */\n description: React.ReactNode\n /** The `registry` object */\n registry: Registry<T, S, F>\n}>\n\n/**\n * Component that handles rendering our custom input label and description fields for RJSF.\n */\nexport function RJSFInputLabelWrapper<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: RJSFInputLabelProps<T, S, F>) {\n const {\n hideLabel = false,\n fieldLabel,\n description,\n registry,\n children,\n } = props\n const descriptionVariant =\n registry.formContext.descriptionVariant || 'popover'\n\n const [showDetails, setShowDetails] = useState(false)\n\n const expandButton = (\n <Tooltip title={'More Info'}>\n <IconButton\n onClick={e => {\n e.preventDefault()\n setShowDetails(!showDetails)\n }}\n aria-expanded={showDetails}\n size={'small'}\n >\n <HelpOutline color={'primary'} sx={{ width: '16px', height: '16px' }} />\n </IconButton>\n </Tooltip>\n )\n\n const popoverButton = (\n <StyledPopover popoverContent={description} maxWidth=\"350px\">\n <HelpTwoTone className={`HelpButton`} />\n </StyledPopover>\n )\n\n return (\n <>\n {!hideLabel && (\n <div className=\"LabelContainer\">\n {fieldLabel}\n {description && descriptionVariant === 'popover' && popoverButton}\n {description && descriptionVariant === 'expand' && expandButton}\n </div>\n )}\n {!hideLabel && descriptionVariant === 'inline' && description && (\n <div className=\"field-description-inline\">{description}</div>\n )}\n {children}\n {!hideLabel && descriptionVariant === 'expand' && (\n <Collapse className=\"field-description\" in={showDetails}>\n {description}\n </Collapse>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AA8BA,SAAgB,EAId,GAAqC;CACrC,IAAM,EACJ,eAAY,IACZ,eACA,gBACA,aACA,gBACE,GACE,IACJ,EAAS,YAAY,sBAAsB,WAEvC,CAAC,GAAa,KAAkB,EAAS,EAAK;CAuBpD,OACE,kBAAA,GAAA,EAAA,UAAA;EACG,CAAC,KACA,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG;IACA,KAAe,MAAuB,aAV7C,kBAAC,GAAD;KAAe,gBAAgB;KAAa,UAAS;eACnD,kBAAC,GAAD,EAAa,WAAW,aAAe,CAAA;IAC1B,CAQ2C;IACnD,KAAe,MAAuB,YA1B7C,kBAAC,GAAD;KAAS,OAAO;eACd,kBAAC,GAAD;MACE,UAAS,MAAK;OAEZ,AADA,EAAE,eAAe,GACjB,EAAe,CAAC,CAAW;MAC7B;MACA,iBAAe;MACf,MAAM;gBAEN,kBAAC,GAAD;OAAa,OAAO;OAAW,IAAI;QAAE,OAAO;QAAQ,QAAQ;OAAO;MAAI,CAAA;KAC7D,CAAA;IACL,CAegD;GAChD;;EAEN,CAAC,KAAa,MAAuB,YAAY,KAChD,kBAAC,OAAD;GAAK,WAAU;aAA4B;EAAiB,CAAA;EAE7D;EACA,CAAC,KAAa,MAAuB,YACpC,kBAAC,GAAD;GAAU,WAAU;GAAoB,IAAI;aACzC;EACO,CAAA;CAEZ,EAAA,CAAA;AAEN"}
@@ -1 +1 @@
1
- ._row_t1xbt_1{--qb-pill-color:var(--synapse-primary-action-color);align-items:center;gap:8px;min-height:30px;padding:4px 0;display:flex}._dragHandle_t1xbt_10{cursor:grab;color:var(--synapse-gray-deemphasized)}._remove_t1xbt_15{border:1px solid var(--synapse-border-color-gray);color:var(--synapse-gray-600)!important;border-radius:4px!important;padding:4px!important}._remove_t1xbt_15:hover{color:var(--synapse-error);border-color:var(--synapse-error);background-color:#0000!important}._propertyPicker_t1xbt_27 .MuiOutlinedInput-root,._operatorPicker_t1xbt_28 .MuiOutlinedInput-root,._rangeInput_t1xbt_29 .MuiOutlinedInput-root,._textInput_t1xbt_30 .MuiOutlinedInput-root{height:36px;font-size:14px}._propertyPicker_t1xbt_27{min-width:200px}._operatorPicker_t1xbt_28{min-width:120px}._rangeInput_t1xbt_29{width:120px}._textInput_t1xbt_30{min-width:200px}._pillGroupContainer_t1xbt_51{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}._pillFilter_t1xbt_59{max-width:260px}._pillGroupScroll_t1xbt_63{max-height:120px;overflow-y:auto}._pillGroup_t1xbt_51{flex-wrap:wrap;gap:6px;display:flex}._pillGroup_t1xbt_51 .MuiToggleButton-root,._pillGroup_t1xbt_51 .MuiToggleButtonGroup-grouped{text-transform:none;padding:2px 12px;font-size:13px;line-height:1.4;border:1px solid var(--synapse-gray-dark)!important;border-radius:999px!important;margin:0!important}._pillGroup_t1xbt_51 .MuiToggleButton-root.Mui-selected{background-color:var(--qb-pill-color);color:#fff;border-color:var(--qb-pill-color)}._pillGroup_t1xbt_51 .MuiToggleButton-root.Mui-selected:hover{background-color:var(--qb-pill-color)}
1
+ ._row_bmqgz_1{--qb-pill-color:var(--synapse-primary-action-color);align-items:center;gap:8px;min-height:30px;padding:4px 0;display:flex}._remove_bmqgz_10{border:1px solid var(--synapse-border-color-gray);color:var(--synapse-gray-600)!important;border-radius:4px!important;padding:4px!important}._remove_bmqgz_10:hover{color:var(--synapse-error);border-color:var(--synapse-error);background-color:#0000!important}._propertyPicker_bmqgz_22 .MuiOutlinedInput-root,._operatorPicker_bmqgz_23 .MuiOutlinedInput-root,._rangeInput_bmqgz_24 .MuiOutlinedInput-root,._textInput_bmqgz_25 .MuiOutlinedInput-root{height:36px;font-size:14px}._propertyPicker_bmqgz_22{min-width:200px}._operatorPicker_bmqgz_23{min-width:120px}._rangeInput_bmqgz_24{width:120px}._textInput_bmqgz_25{min-width:200px}._pillGroupContainer_bmqgz_46{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}._pillFilter_bmqgz_54{max-width:260px}._pillGroupScroll_bmqgz_58{max-height:120px;overflow-y:auto}._pillGroup_bmqgz_46{flex-wrap:wrap;gap:6px;display:flex}._pillGroup_bmqgz_46 .MuiToggleButton-root,._pillGroup_bmqgz_46 .MuiToggleButtonGroup-grouped{text-transform:none;padding:2px 12px;font-size:13px;line-height:1.4;border:1px solid var(--synapse-gray-dark)!important;border-radius:999px!important;margin:0!important}._pillGroup_bmqgz_46 .MuiToggleButton-root.Mui-selected{background-color:var(--qb-pill-color);color:#fff;border-color:var(--qb-pill-color)}._pillGroup_bmqgz_46 .MuiToggleButton-root.Mui-selected:hover{background-color:var(--qb-pill-color)}
@@ -1,6 +1,8 @@
1
1
  import { QBCondition } from './QueryBuilderTypes';
2
2
  export type FilterConditionRowProps = {
3
3
  condition: QBCondition;
4
+ parentGroupId: string;
5
+ index: number;
4
6
  };
5
7
  export declare function FilterConditionRow(props: FilterConditionRowProps): import("react/jsx-runtime").JSX.Element;
6
8
  //# sourceMappingURL=FilterConditionRow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterConditionRow.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/FilterConditionRow.tsx"],"names":[],"mappings":"AA0BA,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,WAAW,CAAA;CACvB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAgKhE"}
1
+ {"version":3,"file":"FilterConditionRow.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/FilterConditionRow.tsx"],"names":[],"mappings":"AA4BA,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,WAAW,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CA0KhE"}
@@ -1,58 +1,61 @@
1
1
  import { splitAndTrim as e } from "../../utils/functions/StringUtils.js";
2
- import { useQueryBuilderInternalContext as t } from "./QueryBuilderInternalContext.js";
2
+ import { defaultOpForColumnType as t } from "./queryBuilderOperations.js";
3
3
  import { availableOpsForKind as n, classifyColumn as r, labelForFacetValue as i, labelForOp as a } from "./queryBuilderMetadata.js";
4
- import o from "./FilterConditionRow.module.js";
5
- import { defaultOpForColumnType as s } from "./queryBuilderOperations.js";
6
- import { useMemo as c, useState as l } from "react";
7
- import { Autocomplete as u, IconButton as d, InputLabel as f, MenuItem as p, Select as m, TextField as h, ToggleButton as g, ToggleButtonGroup as _, Tooltip as v } from "@mui/material";
8
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
9
- import S from "@mui/icons-material/DeleteOutline";
10
- import C from "@mui/icons-material/DragIndicator";
4
+ import { useQueryBuilderInternalContext as o } from "./QueryBuilderInternalContext.js";
5
+ import s from "./FilterConditionRow.module.js";
6
+ import c from "./queryBuilderDrag.module.js";
7
+ import { QBDragHandle as l } from "./QBDragHandle.js";
8
+ import { useMemo as u, useState as d } from "react";
9
+ import { Autocomplete as f, IconButton as p, InputLabel as m, MenuItem as h, Select as g, TextField as _, ToggleButton as v, ToggleButtonGroup as y, Tooltip as b } from "@mui/material";
10
+ import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
11
+ import w from "@mui/icons-material/DeleteOutline";
12
+ import { useSortable as T } from "@dnd-kit/react/sortable";
11
13
  //#region src/components/QueryBuilder/FilterConditionRow.tsx
12
- function w(e) {
13
- let { condition: i } = e, { columnModels: l, facetResults: g, onlyFacetedColumns: _, getColumnDisplayName: w, updateConditionAt: E, removeConditionAt: D } = t(), A = c(() => new Set(g.filter((e) => e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues").map((e) => e.columnName)), [g]), j = c(() => (_ ? l.filter((e) => A.has(e.name)) : l).map((e) => ({
14
+ function E(e) {
15
+ let { condition: i, parentGroupId: d, index: v } = e, { columnModels: y, facetResults: E, onlyFacetedColumns: O, getColumnDisplayName: k, updateConditionAt: M, removeConditionAt: N } = o(), { ref: P, handleRef: F, isDragSource: I } = T({
16
+ id: i.id,
17
+ index: v,
18
+ group: d,
19
+ disabled: { droppable: !0 }
20
+ }), L = u(() => new Set(E.filter((e) => e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues").map((e) => e.columnName)), [E]), R = u(() => (O ? y.filter((e) => L.has(e.name)) : y).map((e) => ({
14
21
  name: e.name,
15
22
  columnType: e.columnType,
16
- label: w(e.name)
23
+ label: k(e.name)
17
24
  })), [
18
- l,
19
- A,
20
- _,
21
- w
22
- ]), M = j.find((e) => e.name === i.columnName) ?? null, N = i.columnName != null && A.has(i.columnName), P = r(i.columnType, N), F = n(P), I = `qb-op-label-${i.id}`;
23
- return /* @__PURE__ */ x("div", {
24
- className: o.row,
25
+ y,
26
+ L,
27
+ O,
28
+ k
29
+ ]), z = R.find((e) => e.name === i.columnName) ?? null, B = i.columnName != null && L.has(i.columnName), V = r(i.columnType, B), H = n(V), U = `qb-op-label-${i.id}`;
30
+ return /* @__PURE__ */ C("div", {
31
+ ref: P,
32
+ className: `${s.row}${I ? ` ${c.dragSource}` : ""}`,
25
33
  role: "group",
26
34
  "aria-label": `Filter condition${i.columnName ? ` on ${i.columnName}` : ""}`,
27
35
  "data-qb-node-id": i.id,
28
36
  children: [
29
- /* @__PURE__ */ b(v, {
30
- title: "Drag to reorder",
31
- children: /* @__PURE__ */ b(d, {
32
- size: "small",
33
- className: o.dragHandle,
34
- "aria-label": "Drag to reorder condition",
35
- children: /* @__PURE__ */ b(C, { fontSize: "small" })
36
- })
37
+ /* @__PURE__ */ S(l, {
38
+ handleRef: F,
39
+ label: "Drag condition into a condition group"
37
40
  }),
38
- /* @__PURE__ */ b(v, {
41
+ /* @__PURE__ */ S(b, {
39
42
  title: "Remove condition",
40
- children: /* @__PURE__ */ b(d, {
43
+ children: /* @__PURE__ */ S(p, {
41
44
  size: "small",
42
- className: o.remove,
45
+ className: s.remove,
43
46
  "aria-label": "Remove condition",
44
- onClick: () => D(i.id),
45
- children: /* @__PURE__ */ b(S, { fontSize: "small" })
47
+ onClick: () => N(i.id),
48
+ children: /* @__PURE__ */ S(w, { fontSize: "small" })
46
49
  })
47
50
  }),
48
- /* @__PURE__ */ b(u, {
49
- className: o.propertyPicker,
51
+ /* @__PURE__ */ S(f, {
52
+ className: s.propertyPicker,
50
53
  size: "small",
51
- options: j,
54
+ options: R,
52
55
  getOptionLabel: (e) => e.label,
53
56
  isOptionEqualToValue: (e, t) => e.name === t.name,
54
- value: M,
55
- renderInput: (e) => /* @__PURE__ */ b(h, {
57
+ value: z,
58
+ renderInput: (e) => /* @__PURE__ */ S(_, {
56
59
  ...e,
57
60
  variant: "outlined",
58
61
  placeholder: "Select property…",
@@ -61,13 +64,13 @@ function w(e) {
61
64
  "aria-label": "Property"
62
65
  }
63
66
  }),
64
- onChange: (e, t) => {
65
- if (t == null) return;
66
- let a = n(r(t.columnType, k(g, t.name))), o = a.length > 0 ? a[0] : s(t.columnType);
67
- E(i.id, {
68
- columnName: t.name,
69
- columnType: t.columnType,
70
- op: o,
67
+ onChange: (e, a) => {
68
+ if (a == null) return;
69
+ let o = n(r(a.columnType, j(E, a.name))), s = o.length > 0 ? o[0] : t(a.columnType);
70
+ M(i.id, {
71
+ columnName: a.name,
72
+ columnType: a.columnType,
73
+ op: s,
71
74
  values: [],
72
75
  rangeMin: null,
73
76
  rangeMax: null,
@@ -75,168 +78,168 @@ function w(e) {
75
78
  });
76
79
  }
77
80
  }),
78
- F.length > 0 && /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(f, {
79
- id: I,
81
+ H.length > 0 && /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(m, {
82
+ id: U,
80
83
  sx: { display: "none" },
81
84
  children: "Operator"
82
- }), /* @__PURE__ */ b(m, {
83
- className: o.operatorPicker,
85
+ }), /* @__PURE__ */ S(g, {
86
+ className: s.operatorPicker,
84
87
  size: "small",
85
- labelId: I,
88
+ labelId: U,
86
89
  variant: "outlined",
87
- value: F.includes(i.op) ? i.op : F[0],
90
+ value: H.includes(i.op) ? i.op : H[0],
88
91
  onChange: (e) => {
89
92
  let t = e.target.value;
90
- E(i.id, { op: t });
93
+ M(i.id, { op: t });
91
94
  },
92
95
  "aria-label": "Operator",
93
- children: F.map((e) => /* @__PURE__ */ b(p, {
96
+ children: H.map((e) => /* @__PURE__ */ S(h, {
94
97
  value: e,
95
98
  children: a(e)
96
99
  }, e))
97
100
  })] }),
98
- /* @__PURE__ */ b(T, {
101
+ /* @__PURE__ */ S(D, {
99
102
  condition: i,
100
- columnKind: P,
101
- hasFacet: N,
102
- columnModels: l,
103
- facetValues: N && i.columnName != null ? O(g, i.columnName) : [],
104
- onChange: (e) => E(i.id, e)
103
+ columnKind: V,
104
+ hasFacet: B,
105
+ columnModels: y,
106
+ facetValues: B && i.columnName != null ? A(E, i.columnName) : [],
107
+ onChange: (e) => M(i.id, e)
105
108
  })
106
109
  ]
107
110
  });
108
111
  }
109
- function T(t) {
110
- let { condition: n, columnKind: r, hasFacet: i, facetValues: a, onChange: s } = t, { op: c } = n;
112
+ function D(t) {
113
+ let { condition: n, columnKind: r, hasFacet: i, facetValues: a, onChange: o } = t, { op: c } = n;
111
114
  if (c === "has_value" || c === "no_value") return null;
112
115
  switch (c) {
113
116
  case "is_any_of":
114
- case "is_all_of": return (r === "enum" || r === "list") && i ? /* @__PURE__ */ b(D, {
117
+ case "is_all_of": return (r === "enum" || r === "list") && i ? /* @__PURE__ */ S(k, {
115
118
  facetValues: a,
116
119
  selectedValues: n.values,
117
- onChange: (e) => s({ values: e })
118
- }) : /* @__PURE__ */ b(h, {
119
- className: o.textInput,
120
+ onChange: (e) => o({ values: e })
121
+ }) : /* @__PURE__ */ S(_, {
122
+ className: s.textInput,
120
123
  size: "small",
121
124
  variant: "outlined",
122
125
  placeholder: "Comma-separated values",
123
126
  value: n.values.join(", "),
124
127
  slotProps: { htmlInput: { "aria-label": "Values" } },
125
- onChange: (t) => s({ values: e(t.target.value) })
128
+ onChange: (t) => o({ values: e(t.target.value) })
126
129
  });
127
- case "between": return /* @__PURE__ */ x(y, { children: [
128
- /* @__PURE__ */ b(h, {
129
- className: o.rangeInput,
130
+ case "between": return /* @__PURE__ */ C(x, { children: [
131
+ /* @__PURE__ */ S(_, {
132
+ className: s.rangeInput,
130
133
  size: "small",
131
134
  variant: "outlined",
132
135
  type: "text",
133
136
  placeholder: "Min",
134
137
  value: n.rangeMin ?? "",
135
138
  slotProps: { htmlInput: { "aria-label": "Minimum" } },
136
- onChange: (e) => s({ rangeMin: e.target.value })
139
+ onChange: (e) => o({ rangeMin: e.target.value })
137
140
  }),
138
- /* @__PURE__ */ b("span", {
141
+ /* @__PURE__ */ S("span", {
139
142
  "aria-hidden": "true",
140
143
  children: "to"
141
144
  }),
142
- /* @__PURE__ */ b(h, {
143
- className: o.rangeInput,
145
+ /* @__PURE__ */ S(_, {
146
+ className: s.rangeInput,
144
147
  size: "small",
145
148
  variant: "outlined",
146
149
  type: "text",
147
150
  placeholder: "Max",
148
151
  value: n.rangeMax ?? "",
149
152
  slotProps: { htmlInput: { "aria-label": "Maximum" } },
150
- onChange: (e) => s({ rangeMax: e.target.value })
153
+ onChange: (e) => o({ rangeMax: e.target.value })
151
154
  })
152
155
  ] });
153
156
  case "gt":
154
- case "gte": return /* @__PURE__ */ b(h, {
155
- className: o.rangeInput,
157
+ case "gte": return /* @__PURE__ */ S(_, {
158
+ className: s.rangeInput,
156
159
  size: "small",
157
160
  variant: "outlined",
158
161
  type: "text",
159
162
  value: n.rangeMin ?? "",
160
163
  slotProps: { htmlInput: { "aria-label": "Value" } },
161
- onChange: (e) => s({ rangeMin: e.target.value })
164
+ onChange: (e) => o({ rangeMin: e.target.value })
162
165
  });
163
166
  case "lt":
164
- case "lte": return /* @__PURE__ */ b(h, {
165
- className: o.rangeInput,
167
+ case "lte": return /* @__PURE__ */ S(_, {
168
+ className: s.rangeInput,
166
169
  size: "small",
167
170
  variant: "outlined",
168
171
  type: "text",
169
172
  value: n.rangeMax ?? "",
170
173
  slotProps: { htmlInput: { "aria-label": "Value" } },
171
- onChange: (e) => s({ rangeMax: e.target.value })
174
+ onChange: (e) => o({ rangeMax: e.target.value })
172
175
  });
173
176
  case "equal":
174
- case "not_equal": return r === "boolean" ? /* @__PURE__ */ x(_, {
175
- className: o.pillGroup,
177
+ case "not_equal": return r === "boolean" ? /* @__PURE__ */ C(y, {
178
+ className: s.pillGroup,
176
179
  exclusive: !0,
177
180
  value: n.values[0] ?? null,
178
181
  onChange: (e, t) => {
179
- s({ values: t == null ? [] : [t] });
182
+ o({ values: t == null ? [] : [t] });
180
183
  },
181
184
  "aria-label": "Boolean value",
182
- children: [/* @__PURE__ */ b(g, {
185
+ children: [/* @__PURE__ */ S(v, {
183
186
  value: "true",
184
187
  children: "Yes"
185
- }), /* @__PURE__ */ b(g, {
188
+ }), /* @__PURE__ */ S(v, {
186
189
  value: "false",
187
190
  children: "No"
188
191
  })]
189
- }) : /* @__PURE__ */ b(h, {
190
- className: o.textInput,
192
+ }) : /* @__PURE__ */ S(_, {
193
+ className: s.textInput,
191
194
  size: "small",
192
195
  variant: "outlined",
193
196
  value: n.values[0] ?? "",
194
197
  slotProps: { htmlInput: { "aria-label": "Value" } },
195
- onChange: (e) => s({ values: [e.target.value] })
198
+ onChange: (e) => o({ values: [e.target.value] })
196
199
  });
197
200
  case "contains":
198
201
  case "starts_with":
199
202
  case "ends_with":
200
- case "is_exactly": return /* @__PURE__ */ b(h, {
201
- className: o.textInput,
203
+ case "is_exactly": return /* @__PURE__ */ S(_, {
204
+ className: s.textInput,
202
205
  size: "small",
203
206
  variant: "outlined",
204
207
  value: n.text ?? "",
205
208
  slotProps: { htmlInput: { "aria-label": "Value" } },
206
- onChange: (e) => s({ text: e.target.value })
209
+ onChange: (e) => o({ text: e.target.value })
207
210
  });
208
211
  default: return null;
209
212
  }
210
213
  }
211
- var E = 40;
212
- function D(e) {
213
- let { facetValues: t, selectedValues: n, onChange: r } = e, [a, s] = l(""), u = t.length > E, d = c(() => [...t].sort((e, t) => i(e).localeCompare(i(t), void 0, { sensitivity: "base" })), [t]), f = c(() => {
214
- if (!u || a.trim() === "") return d;
214
+ var O = 40;
215
+ function k(e) {
216
+ let { facetValues: t, selectedValues: n, onChange: r } = e, [a, o] = d(""), c = t.length > O, l = u(() => [...t].sort((e, t) => i(e).localeCompare(i(t), void 0, { sensitivity: "base" })), [t]), f = u(() => {
217
+ if (!c || a.trim() === "") return l;
215
218
  let e = a.trim().toLowerCase();
216
- return d.filter((t) => i(t).toLowerCase().includes(e));
219
+ return l.filter((t) => i(t).toLowerCase().includes(e));
217
220
  }, [
218
- d,
221
+ l,
219
222
  a,
220
- u
223
+ c
221
224
  ]);
222
- return /* @__PURE__ */ x("div", {
223
- className: o.pillGroupContainer,
224
- children: [u && /* @__PURE__ */ b(h, {
225
- className: o.pillFilter,
225
+ return /* @__PURE__ */ C("div", {
226
+ className: s.pillGroupContainer,
227
+ children: [c && /* @__PURE__ */ S(_, {
228
+ className: s.pillFilter,
226
229
  size: "small",
227
230
  variant: "outlined",
228
231
  placeholder: `Filter ${t.length} values…`,
229
232
  value: a,
230
- onChange: (e) => s(e.target.value),
233
+ onChange: (e) => o(e.target.value),
231
234
  slotProps: { htmlInput: { "aria-label": "Filter values" } }
232
- }), /* @__PURE__ */ b("div", {
233
- className: o.pillGroupScroll,
234
- children: /* @__PURE__ */ b(_, {
235
- className: o.pillGroup,
235
+ }), /* @__PURE__ */ S("div", {
236
+ className: s.pillGroupScroll,
237
+ children: /* @__PURE__ */ S(y, {
238
+ className: s.pillGroup,
236
239
  value: n,
237
240
  onChange: (e, t) => r(t),
238
241
  "aria-label": "Selected values",
239
- children: f.map((e) => /* @__PURE__ */ b(g, {
242
+ children: f.map((e) => /* @__PURE__ */ S(v, {
240
243
  value: e,
241
244
  children: i(e)
242
245
  }, e))
@@ -244,14 +247,14 @@ function D(e) {
244
247
  })]
245
248
  });
246
249
  }
247
- function O(e, t) {
250
+ function A(e, t) {
248
251
  let n = e.find((e) => e.columnName === t);
249
252
  return n == null ? [] : n.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues" ? n.facetValues.map((e) => e.value) : [];
250
253
  }
251
- function k(e, t) {
254
+ function j(e, t) {
252
255
  return e.some((e) => e.columnName === t && e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnResultValues");
253
256
  }
254
257
  //#endregion
255
- export { w as FilterConditionRow };
258
+ export { E as FilterConditionRow };
256
259
 
257
260
  //# sourceMappingURL=FilterConditionRow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterConditionRow.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.tsx"],"sourcesContent":["import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator'\nimport {\n Autocomplete,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n} from '@mui/material'\nimport { ColumnModel } from '@sage-bionetworks/synapse-types'\nimport { useMemo, useState } from 'react'\nimport { splitAndTrim } from '../../utils/functions/StringUtils'\nimport { useQueryBuilderInternalContext } from './QueryBuilderInternalContext'\nimport {\n availableOpsForKind,\n classifyColumn,\n labelForFacetValue,\n labelForOp,\n QBColumnKind,\n} from './queryBuilderMetadata'\nimport styles from './FilterConditionRow.module.scss'\nimport { defaultOpForColumnType } from './queryBuilderOperations'\nimport { QBCondition, QBConditionOp } from './QueryBuilderTypes'\n\nexport type FilterConditionRowProps = {\n condition: QBCondition\n}\n\nexport function FilterConditionRow(props: FilterConditionRowProps) {\n const { condition } = props\n const {\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n updateConditionAt,\n removeConditionAt,\n } = useQueryBuilderInternalContext()\n\n const facetColumnNames = useMemo(\n () =>\n new Set(\n facetResults\n .filter(\n f =>\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n .map(f => f.columnName),\n ),\n [facetResults],\n )\n\n const propertyOptions = useMemo(() => {\n const source = onlyFacetedColumns\n ? columnModels.filter(cm => facetColumnNames.has(cm.name))\n : columnModels\n return source.map(cm => ({\n name: cm.name,\n columnType: cm.columnType as string,\n label: getColumnDisplayName(cm.name),\n }))\n }, [columnModels, facetColumnNames, onlyFacetedColumns, getColumnDisplayName])\n\n const selectedOption =\n propertyOptions.find(opt => opt.name === condition.columnName) ?? null\n\n const hasFacet =\n condition.columnName != null && facetColumnNames.has(condition.columnName)\n const columnKind = classifyColumn(condition.columnType, hasFacet)\n const availableOps = availableOpsForKind(columnKind)\n\n const operatorLabelId = `qb-op-label-${condition.id}`\n\n return (\n <div\n className={styles.row}\n role=\"group\"\n aria-label={`Filter condition${condition.columnName ? ` on ${condition.columnName}` : ''}`}\n data-qb-node-id={condition.id}\n >\n <Tooltip title=\"Drag to reorder\">\n <IconButton\n size=\"small\"\n className={styles.dragHandle}\n aria-label=\"Drag to reorder condition\"\n >\n <DragIndicatorIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n\n <Tooltip title=\"Remove condition\">\n <IconButton\n size=\"small\"\n className={styles.remove}\n aria-label=\"Remove condition\"\n onClick={() => removeConditionAt(condition.id)}\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n\n <Autocomplete\n className={styles.propertyPicker}\n size=\"small\"\n options={propertyOptions}\n getOptionLabel={opt => opt.label}\n isOptionEqualToValue={(a, b) => a.name === b.name}\n value={selectedOption}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n placeholder=\"Select property…\"\n inputProps={{ ...params.inputProps, 'aria-label': 'Property' }}\n />\n )}\n onChange={(_event, value) => {\n if (value == null) return\n // Pick a default op that matches the new column's kind (so a\n // faceted column shifts the row into pill-picker mode, a numeric\n // column into range mode, etc.). Fall back to the raw columnType\n // default if the kind has no ops.\n const nextKind = classifyColumn(\n value.columnType,\n hasFacetForColumnName(facetResults, value.name),\n )\n const opsForKind = availableOpsForKind(nextKind)\n const nextOp =\n opsForKind.length > 0\n ? opsForKind[0]\n : defaultOpForColumnType(value.columnType)\n updateConditionAt(condition.id, {\n columnName: value.name,\n columnType: value.columnType,\n op: nextOp,\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n })\n }}\n />\n\n {availableOps.length > 0 && (\n <>\n <InputLabel id={operatorLabelId} sx={{ display: 'none' }}>\n Operator\n </InputLabel>\n <Select\n className={styles.operatorPicker}\n size=\"small\"\n labelId={operatorLabelId}\n variant=\"outlined\"\n value={\n availableOps.includes(condition.op)\n ? condition.op\n : availableOps[0]\n }\n onChange={event => {\n const nextOp = event.target.value as QBConditionOp\n updateConditionAt(condition.id, { op: nextOp })\n }}\n aria-label=\"Operator\"\n >\n {availableOps.map(op => (\n <MenuItem key={op} value={op}>\n {labelForOp(op)}\n </MenuItem>\n ))}\n </Select>\n </>\n )}\n\n <ValueInput\n condition={condition}\n columnKind={columnKind}\n hasFacet={hasFacet}\n columnModels={columnModels}\n facetValues={\n hasFacet && condition.columnName != null\n ? findFacetValues(facetResults, condition.columnName)\n : []\n }\n onChange={patch => updateConditionAt(condition.id, patch)}\n />\n </div>\n )\n}\n\ntype ValueInputProps = {\n condition: QBCondition\n columnKind: QBColumnKind\n hasFacet: boolean\n columnModels: ColumnModel[]\n facetValues: string[]\n onChange: (patch: Partial<Omit<QBCondition, 'kind' | 'id'>>) => void\n}\n\nfunction ValueInput(props: ValueInputProps) {\n const { condition, columnKind, hasFacet, facetValues, onChange } = props\n const { op } = condition\n\n // Presence operators have no input at all.\n if (op === 'has_value' || op === 'no_value') return null\n\n switch (op) {\n case 'is_any_of':\n case 'is_all_of':\n if ((columnKind === 'enum' || columnKind === 'list') && hasFacet) {\n return (\n <FacetPillGroup\n facetValues={facetValues}\n selectedValues={condition.values}\n onChange={next => onChange({ values: next })}\n />\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n placeholder=\"Comma-separated values\"\n value={condition.values.join(', ')}\n slotProps={{ htmlInput: { 'aria-label': 'Values' } }}\n onChange={event =>\n onChange({ values: splitAndTrim(event.target.value) })\n }\n />\n )\n case 'between':\n return (\n <>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Min\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Minimum' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n <span aria-hidden=\"true\">to</span>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Max\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Maximum' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n </>\n )\n case 'gt':\n case 'gte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n )\n case 'lt':\n case 'lte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n )\n case 'equal':\n case 'not_equal':\n if (columnKind === 'boolean') {\n return (\n <ToggleButtonGroup\n className={styles.pillGroup}\n exclusive\n value={condition.values[0] ?? null}\n onChange={(_event, next: string | null) => {\n onChange({ values: next == null ? [] : [next] })\n }}\n aria-label=\"Boolean value\"\n >\n <ToggleButton value=\"true\">Yes</ToggleButton>\n <ToggleButton value=\"false\">No</ToggleButton>\n </ToggleButtonGroup>\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.values[0] ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ values: [event.target.value] })}\n />\n )\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.text ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ text: event.target.value })}\n />\n )\n default:\n op satisfies never\n return null\n }\n}\n\ntype FacetPillGroupProps = {\n facetValues: string[]\n selectedValues: string[]\n onChange: (next: string[]) => void\n}\n\n// Above this many pills we show a text filter above the group.\nconst PILL_FILTER_THRESHOLD = 40\n\nfunction FacetPillGroup(props: FacetPillGroupProps) {\n const { facetValues, selectedValues, onChange } = props\n const [filter, setFilter] = useState('')\n const showFilter = facetValues.length > PILL_FILTER_THRESHOLD\n\n // Sort alphabetically by the user-facing label so the pill order is\n // predictable regardless of the backend's facet-result ordering.\n const sortedValues = useMemo(() => {\n return [...facetValues].sort((a, b) =>\n labelForFacetValue(a).localeCompare(labelForFacetValue(b), undefined, {\n sensitivity: 'base',\n }),\n )\n }, [facetValues])\n\n const visibleValues = useMemo(() => {\n if (!showFilter || filter.trim() === '') return sortedValues\n const q = filter.trim().toLowerCase()\n return sortedValues.filter(v =>\n labelForFacetValue(v).toLowerCase().includes(q),\n )\n }, [sortedValues, filter, showFilter])\n\n return (\n <div className={styles.pillGroupContainer}>\n {showFilter && (\n <TextField\n className={styles.pillFilter}\n size=\"small\"\n variant=\"outlined\"\n placeholder={`Filter ${facetValues.length} values…`}\n value={filter}\n onChange={event => setFilter(event.target.value)}\n slotProps={{ htmlInput: { 'aria-label': 'Filter values' } }}\n />\n )}\n <div className={styles.pillGroupScroll}>\n <ToggleButtonGroup\n className={styles.pillGroup}\n value={selectedValues}\n onChange={(_event, next: string[]) => onChange(next)}\n aria-label=\"Selected values\"\n >\n {visibleValues.map(value => (\n <ToggleButton key={value} value={value}>\n {labelForFacetValue(value)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </div>\n </div>\n )\n}\n\nfunction findFacetValues(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): string[] {\n const match = facetResults.find(f => f.columnName === columnName)\n if (match == null) return []\n if (\n match.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues'\n ) {\n return match.facetValues.map(v => v.value)\n }\n return []\n}\n\nfunction hasFacetForColumnName(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): boolean {\n return facetResults.some(\n f =>\n f.columnName === columnName &&\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilterConditionRow.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.tsx"],"sourcesContent":["import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'\nimport { useSortable } from '@dnd-kit/react/sortable'\nimport {\n Autocomplete,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n} from '@mui/material'\nimport { ColumnModel } from '@sage-bionetworks/synapse-types'\nimport { useMemo, useState } from 'react'\nimport { splitAndTrim } from '../../utils/functions/StringUtils'\nimport { useQueryBuilderInternalContext } from './QueryBuilderInternalContext'\nimport {\n availableOpsForKind,\n classifyColumn,\n labelForFacetValue,\n labelForOp,\n QBColumnKind,\n} from './queryBuilderMetadata'\nimport styles from './FilterConditionRow.module.scss'\nimport { QBDragHandle } from './QBDragHandle'\nimport dragStyles from './queryBuilderDrag.module.scss'\nimport { defaultOpForColumnType } from './queryBuilderOperations'\nimport { QBCondition, QBConditionOp } from './QueryBuilderTypes'\n\nexport type FilterConditionRowProps = {\n condition: QBCondition\n parentGroupId: string\n index: number\n}\n\nexport function FilterConditionRow(props: FilterConditionRowProps) {\n const { condition, parentGroupId, index } = props\n const {\n columnModels,\n facetResults,\n onlyFacetedColumns,\n getColumnDisplayName,\n updateConditionAt,\n removeConditionAt,\n } = useQueryBuilderInternalContext()\n\n // A condition is a drag source only. Dropping onto a condition has no\n // meaning in a boolean tree — a node joins a group, not another leaf — so\n // groups own every drop zone and this row never becomes a target.\n const {\n ref: sortableRef,\n handleRef,\n isDragSource,\n } = useSortable({\n id: condition.id,\n index,\n group: parentGroupId,\n disabled: { droppable: true },\n })\n\n const facetColumnNames = useMemo(\n () =>\n new Set(\n facetResults\n .filter(\n f =>\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n .map(f => f.columnName),\n ),\n [facetResults],\n )\n\n const propertyOptions = useMemo(() => {\n const source = onlyFacetedColumns\n ? columnModels.filter(cm => facetColumnNames.has(cm.name))\n : columnModels\n return source.map(cm => ({\n name: cm.name,\n columnType: cm.columnType as string,\n label: getColumnDisplayName(cm.name),\n }))\n }, [columnModels, facetColumnNames, onlyFacetedColumns, getColumnDisplayName])\n\n const selectedOption =\n propertyOptions.find(opt => opt.name === condition.columnName) ?? null\n\n const hasFacet =\n condition.columnName != null && facetColumnNames.has(condition.columnName)\n const columnKind = classifyColumn(condition.columnType, hasFacet)\n const availableOps = availableOpsForKind(columnKind)\n\n const operatorLabelId = `qb-op-label-${condition.id}`\n\n return (\n <div\n ref={sortableRef}\n className={`${styles.row}${isDragSource ? ` ${dragStyles.dragSource}` : ''}`}\n role=\"group\"\n aria-label={`Filter condition${condition.columnName ? ` on ${condition.columnName}` : ''}`}\n data-qb-node-id={condition.id}\n >\n <QBDragHandle\n handleRef={handleRef}\n label=\"Drag condition into a condition group\"\n />\n\n <Tooltip title=\"Remove condition\">\n <IconButton\n size=\"small\"\n className={styles.remove}\n aria-label=\"Remove condition\"\n onClick={() => removeConditionAt(condition.id)}\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n\n <Autocomplete\n className={styles.propertyPicker}\n size=\"small\"\n options={propertyOptions}\n getOptionLabel={opt => opt.label}\n isOptionEqualToValue={(a, b) => a.name === b.name}\n value={selectedOption}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n placeholder=\"Select property…\"\n inputProps={{ ...params.inputProps, 'aria-label': 'Property' }}\n />\n )}\n onChange={(_event, value) => {\n if (value == null) return\n // Pick a default op that matches the new column's kind (so a\n // faceted column shifts the row into pill-picker mode, a numeric\n // column into range mode, etc.). Fall back to the raw columnType\n // default if the kind has no ops.\n const nextKind = classifyColumn(\n value.columnType,\n hasFacetForColumnName(facetResults, value.name),\n )\n const opsForKind = availableOpsForKind(nextKind)\n const nextOp =\n opsForKind.length > 0\n ? opsForKind[0]\n : defaultOpForColumnType(value.columnType)\n updateConditionAt(condition.id, {\n columnName: value.name,\n columnType: value.columnType,\n op: nextOp,\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n })\n }}\n />\n\n {availableOps.length > 0 && (\n <>\n <InputLabel id={operatorLabelId} sx={{ display: 'none' }}>\n Operator\n </InputLabel>\n <Select\n className={styles.operatorPicker}\n size=\"small\"\n labelId={operatorLabelId}\n variant=\"outlined\"\n value={\n availableOps.includes(condition.op)\n ? condition.op\n : availableOps[0]\n }\n onChange={event => {\n const nextOp = event.target.value as QBConditionOp\n updateConditionAt(condition.id, { op: nextOp })\n }}\n aria-label=\"Operator\"\n >\n {availableOps.map(op => (\n <MenuItem key={op} value={op}>\n {labelForOp(op)}\n </MenuItem>\n ))}\n </Select>\n </>\n )}\n\n <ValueInput\n condition={condition}\n columnKind={columnKind}\n hasFacet={hasFacet}\n columnModels={columnModels}\n facetValues={\n hasFacet && condition.columnName != null\n ? findFacetValues(facetResults, condition.columnName)\n : []\n }\n onChange={patch => updateConditionAt(condition.id, patch)}\n />\n </div>\n )\n}\n\ntype ValueInputProps = {\n condition: QBCondition\n columnKind: QBColumnKind\n hasFacet: boolean\n columnModels: ColumnModel[]\n facetValues: string[]\n onChange: (patch: Partial<Omit<QBCondition, 'kind' | 'id'>>) => void\n}\n\nfunction ValueInput(props: ValueInputProps) {\n const { condition, columnKind, hasFacet, facetValues, onChange } = props\n const { op } = condition\n\n // Presence operators have no input at all.\n if (op === 'has_value' || op === 'no_value') return null\n\n switch (op) {\n case 'is_any_of':\n case 'is_all_of':\n if ((columnKind === 'enum' || columnKind === 'list') && hasFacet) {\n return (\n <FacetPillGroup\n facetValues={facetValues}\n selectedValues={condition.values}\n onChange={next => onChange({ values: next })}\n />\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n placeholder=\"Comma-separated values\"\n value={condition.values.join(', ')}\n slotProps={{ htmlInput: { 'aria-label': 'Values' } }}\n onChange={event =>\n onChange({ values: splitAndTrim(event.target.value) })\n }\n />\n )\n case 'between':\n return (\n <>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Min\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Minimum' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n <span aria-hidden=\"true\">to</span>\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n placeholder=\"Max\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Maximum' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n </>\n )\n case 'gt':\n case 'gte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMin ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMin: event.target.value })}\n />\n )\n case 'lt':\n case 'lte':\n return (\n <TextField\n className={styles.rangeInput}\n size=\"small\"\n variant=\"outlined\"\n type=\"text\"\n value={condition.rangeMax ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ rangeMax: event.target.value })}\n />\n )\n case 'equal':\n case 'not_equal':\n if (columnKind === 'boolean') {\n return (\n <ToggleButtonGroup\n className={styles.pillGroup}\n exclusive\n value={condition.values[0] ?? null}\n onChange={(_event, next: string | null) => {\n onChange({ values: next == null ? [] : [next] })\n }}\n aria-label=\"Boolean value\"\n >\n <ToggleButton value=\"true\">Yes</ToggleButton>\n <ToggleButton value=\"false\">No</ToggleButton>\n </ToggleButtonGroup>\n )\n }\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.values[0] ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ values: [event.target.value] })}\n />\n )\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return (\n <TextField\n className={styles.textInput}\n size=\"small\"\n variant=\"outlined\"\n value={condition.text ?? ''}\n slotProps={{ htmlInput: { 'aria-label': 'Value' } }}\n onChange={event => onChange({ text: event.target.value })}\n />\n )\n default:\n op satisfies never\n return null\n }\n}\n\ntype FacetPillGroupProps = {\n facetValues: string[]\n selectedValues: string[]\n onChange: (next: string[]) => void\n}\n\n// Above this many pills we show a text filter above the group.\nconst PILL_FILTER_THRESHOLD = 40\n\nfunction FacetPillGroup(props: FacetPillGroupProps) {\n const { facetValues, selectedValues, onChange } = props\n const [filter, setFilter] = useState('')\n const showFilter = facetValues.length > PILL_FILTER_THRESHOLD\n\n // Sort alphabetically by the user-facing label so the pill order is\n // predictable regardless of the backend's facet-result ordering.\n const sortedValues = useMemo(() => {\n return [...facetValues].sort((a, b) =>\n labelForFacetValue(a).localeCompare(labelForFacetValue(b), undefined, {\n sensitivity: 'base',\n }),\n )\n }, [facetValues])\n\n const visibleValues = useMemo(() => {\n if (!showFilter || filter.trim() === '') return sortedValues\n const q = filter.trim().toLowerCase()\n return sortedValues.filter(v =>\n labelForFacetValue(v).toLowerCase().includes(q),\n )\n }, [sortedValues, filter, showFilter])\n\n return (\n <div className={styles.pillGroupContainer}>\n {showFilter && (\n <TextField\n className={styles.pillFilter}\n size=\"small\"\n variant=\"outlined\"\n placeholder={`Filter ${facetValues.length} values…`}\n value={filter}\n onChange={event => setFilter(event.target.value)}\n slotProps={{ htmlInput: { 'aria-label': 'Filter values' } }}\n />\n )}\n <div className={styles.pillGroupScroll}>\n <ToggleButtonGroup\n className={styles.pillGroup}\n value={selectedValues}\n onChange={(_event, next: string[]) => onChange(next)}\n aria-label=\"Selected values\"\n >\n {visibleValues.map(value => (\n <ToggleButton key={value} value={value}>\n {labelForFacetValue(value)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </div>\n </div>\n )\n}\n\nfunction findFacetValues(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): string[] {\n const match = facetResults.find(f => f.columnName === columnName)\n if (match == null) return []\n if (\n match.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues'\n ) {\n return match.facetValues.map(v => v.value)\n }\n return []\n}\n\nfunction hasFacetForColumnName(\n facetResults: readonly ReturnType<\n typeof useQueryBuilderInternalContext\n >['facetResults'][number][],\n columnName: string,\n): boolean {\n return facetResults.some(\n f =>\n f.columnName === columnName &&\n f.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAoCA,SAAgB,EAAmB,GAAgC;CACjE,IAAM,EAAE,cAAW,kBAAe,aAAU,GACtC,EACJ,iBACA,iBACA,uBACA,yBACA,sBACA,yBACE,EAA+B,GAK7B,EACJ,KAAK,GACL,cACA,oBACE,EAAY;EACd,IAAI,EAAU;EACd;EACA,OAAO;EACP,UAAU,EAAE,WAAW,GAAK;CAC9B,CAAC,GAEK,IAAmB,QAErB,IAAI,IACF,EACG,QACC,MACE,EAAE,iBACF,8DACJ,EACC,KAAI,MAAK,EAAE,UAAU,CAC1B,GACF,CAAC,CAAY,CACf,GAEM,IAAkB,SACP,IACX,EAAa,QAAO,MAAM,EAAiB,IAAI,EAAG,IAAI,CAAC,IACvD,GACU,KAAI,OAAO;EACvB,MAAM,EAAG;EACT,YAAY,EAAG;EACf,OAAO,EAAqB,EAAG,IAAI;CACrC,EAAE,GACD;EAAC;EAAc;EAAkB;EAAoB;CAAoB,CAAC,GAEvE,IACJ,EAAgB,MAAK,MAAO,EAAI,SAAS,EAAU,UAAU,KAAK,MAE9D,IACJ,EAAU,cAAc,QAAQ,EAAiB,IAAI,EAAU,UAAU,GACrE,IAAa,EAAe,EAAU,YAAY,CAAQ,GAC1D,IAAe,EAAoB,CAAU,GAE7C,IAAkB,eAAe,EAAU;CAEjD,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,GAAG,EAAO,MAAM,IAAe,IAAI,EAAW,eAAe;EACxE,MAAK;EACL,cAAY,mBAAmB,EAAU,aAAa,OAAO,EAAU,eAAe;EACtF,mBAAiB,EAAU;YAL7B;GAOE,kBAAC,GAAD;IACa;IACX,OAAM;GACP,CAAA;GAED,kBAAC,GAAD;IAAS,OAAM;cACb,kBAAC,GAAD;KACE,MAAK;KACL,WAAW,EAAO;KAClB,cAAW;KACX,eAAe,EAAkB,EAAU,EAAE;eAE7C,kBAAC,GAAD,EAAmB,UAAS,QAAS,CAAA;IAC3B,CAAA;GACL,CAAA;GAET,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAS;IACT,iBAAgB,MAAO,EAAI;IAC3B,uBAAuB,GAAG,MAAM,EAAE,SAAS,EAAE;IAC7C,OAAO;IACP,cAAa,MACX,kBAAC,GAAD;KACE,GAAI;KACJ,SAAQ;KACR,aAAY;KACZ,YAAY;MAAE,GAAG,EAAO;MAAY,cAAc;KAAW;IAC9D,CAAA;IAEH,WAAW,GAAQ,MAAU;KAC3B,IAAI,KAAS,MAAM;KASnB,IAAM,IAAa,EAJF,EACf,EAAM,YACN,EAAsB,GAAc,EAAM,IAAI,CAET,CAAQ,GACzC,IACJ,EAAW,SAAS,IAChB,EAAW,KACX,EAAuB,EAAM,UAAU;KAC7C,EAAkB,EAAU,IAAI;MAC9B,YAAY,EAAM;MAClB,YAAY,EAAM;MAClB,IAAI;MACJ,QAAQ,CAAC;MACT,UAAU;MACV,UAAU;MACV,MAAM;KACR,CAAC;IACH;GACD,CAAA;GAEA,EAAa,SAAS,KACrB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,IAAI;IAAiB,IAAI,EAAE,SAAS,OAAO;cAAG;GAE9C,CAAA,GACZ,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAS;IACT,SAAQ;IACR,OACE,EAAa,SAAS,EAAU,EAAE,IAC9B,EAAU,KACV,EAAa;IAEnB,WAAU,MAAS;KACjB,IAAM,IAAS,EAAM,OAAO;KAC5B,EAAkB,EAAU,IAAI,EAAE,IAAI,EAAO,CAAC;IAChD;IACA,cAAW;cAEV,EAAa,KAAI,MAChB,kBAAC,GAAD;KAAmB,OAAO;eACvB,EAAW,CAAE;IACN,GAFK,CAEL,CACX;GACK,CAAA,CACR,EAAA,CAAA;GAGJ,kBAAC,GAAD;IACa;IACC;IACF;IACI;IACd,aACE,KAAY,EAAU,cAAc,OAChC,EAAgB,GAAc,EAAU,UAAU,IAClD,CAAC;IAEP,WAAU,MAAS,EAAkB,EAAU,IAAI,CAAK;GACzD,CAAA;EACE;;AAET;AAWA,SAAS,EAAW,GAAwB;CAC1C,IAAM,EAAE,cAAW,eAAY,aAAU,gBAAa,gBAAa,GAC7D,EAAE,UAAO;CAGf,IAAI,MAAO,eAAe,MAAO,YAAY,OAAO;CAEpD,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,aAUH,QATK,MAAe,UAAU,MAAe,WAAW,IAEpD,kBAAC,GAAD;GACe;GACb,gBAAgB,EAAU;GAC1B,WAAU,MAAQ,EAAS,EAAE,QAAQ,EAAK,CAAC;EAC5C,CAAA,IAIH,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,aAAY;GACZ,OAAO,EAAU,OAAO,KAAK,IAAI;GACjC,WAAW,EAAE,WAAW,EAAE,cAAc,SAAS,EAAE;GACnD,WAAU,MACR,EAAS,EAAE,QAAQ,EAAa,EAAM,OAAO,KAAK,EAAE,CAAC;EAExD,CAAA;EAEL,KAAK,WACH,OACE,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAQ;IACR,MAAK;IACL,aAAY;IACZ,OAAO,EAAU,YAAY;IAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,UAAU,EAAE;IACpD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;GAC7D,CAAA;GACD,kBAAC,QAAD;IAAM,eAAY;cAAO;GAAQ,CAAA;GACjC,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,MAAK;IACL,SAAQ;IACR,MAAK;IACL,aAAY;IACZ,OAAO,EAAU,YAAY;IAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,UAAU,EAAE;IACpD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;GAC7D,CAAA;EACD,EAAA,CAAA;EAEN,KAAK;EACL,KAAK,OACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,MAAK;GACL,OAAO,EAAU,YAAY;GAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK,OACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,MAAK;GACL,OAAO,EAAU,YAAY;GAC7B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,UAAU,EAAM,OAAO,MAAM,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK,aAiBH,OAhBI,MAAe,YAEf,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,WAAA;GACA,OAAO,EAAU,OAAO,MAAM;GAC9B,WAAW,GAAQ,MAAwB;IACzC,EAAS,EAAE,QAAQ,KAAQ,OAAO,CAAC,IAAI,CAAC,CAAI,EAAE,CAAC;GACjD;GACA,cAAW;aAPb,CASE,kBAAC,GAAD;IAAc,OAAM;cAAO;GAAiB,CAAA,GAC5C,kBAAC,GAAD;IAAc,OAAM;cAAQ;GAAgB,CAAA,CAC3B;OAIrB,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,OAAO,EAAU,OAAO,MAAM;GAC9B,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,QAAQ,CAAC,EAAM,OAAO,KAAK,EAAE,CAAC;EAC7D,CAAA;EAEL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,cACH,OACE,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,OAAO,EAAU,QAAQ;GACzB,WAAW,EAAE,WAAW,EAAE,cAAc,QAAQ,EAAE;GAClD,WAAU,MAAS,EAAS,EAAE,MAAM,EAAM,OAAO,MAAM,CAAC;EACzD,CAAA;EAEL,SAEE,OAAO;CACX;AACF;AASA,IAAM,IAAwB;AAE9B,SAAS,EAAe,GAA4B;CAClD,IAAM,EAAE,gBAAa,mBAAgB,gBAAa,GAC5C,CAAC,GAAQ,KAAa,EAAS,EAAE,GACjC,IAAa,EAAY,SAAS,GAIlC,IAAe,QACZ,CAAC,GAAG,CAAW,EAAE,MAAM,GAAG,MAC/B,EAAmB,CAAC,EAAE,cAAc,EAAmB,CAAC,GAAG,KAAA,GAAW,EACpE,aAAa,OACf,CAAC,CACH,GACC,CAAC,CAAW,CAAC,GAEV,IAAgB,QAAc;EAClC,IAAI,CAAC,KAAc,EAAO,KAAK,MAAM,IAAI,OAAO;EAChD,IAAM,IAAI,EAAO,KAAK,EAAE,YAAY;EACpC,OAAO,EAAa,QAAO,MACzB,EAAmB,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAChD;CACF,GAAG;EAAC;EAAc;EAAQ;CAAU,CAAC;CAErC,OACE,kBAAC,OAAD;EAAK,WAAW,EAAO;YAAvB,CACG,KACC,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,MAAK;GACL,SAAQ;GACR,aAAa,UAAU,EAAY,OAAO;GAC1C,OAAO;GACP,WAAU,MAAS,EAAU,EAAM,OAAO,KAAK;GAC/C,WAAW,EAAE,WAAW,EAAE,cAAc,gBAAgB,EAAE;EAC3D,CAAA,GAEH,kBAAC,OAAD;GAAK,WAAW,EAAO;aACrB,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,OAAO;IACP,WAAW,GAAQ,MAAmB,EAAS,CAAI;IACnD,cAAW;cAEV,EAAc,KAAI,MACjB,kBAAC,GAAD;KAAiC;eAC9B,EAAmB,CAAK;IACb,GAFK,CAEL,CACf;GACgB,CAAA;EAChB,CAAA,CACF;;AAET;AAEA,SAAS,EACP,GAGA,GACU;CACV,IAAM,IAAQ,EAAa,MAAK,MAAK,EAAE,eAAe,CAAU;CAQhE,OAPI,KAAS,OAAa,CAAC,IAEzB,EAAM,iBACN,iEAEO,EAAM,YAAY,KAAI,MAAK,EAAE,KAAK,IAEpC,CAAC;AACV;AAEA,SAAS,EACP,GAGA,GACS;CACT,OAAO,EAAa,MAClB,MACE,EAAE,eAAe,KACjB,EAAE,iBACA,8DACN;AACF"}
@@ -1,15 +1,14 @@
1
1
  import './FilterConditionRow.css';var e = {
2
- row: "_row_t1xbt_1",
3
- dragHandle: "_dragHandle_t1xbt_10",
4
- remove: "_remove_t1xbt_15",
5
- propertyPicker: "_propertyPicker_t1xbt_27",
6
- operatorPicker: "_operatorPicker_t1xbt_28",
7
- rangeInput: "_rangeInput_t1xbt_29",
8
- textInput: "_textInput_t1xbt_30",
9
- pillGroupContainer: "_pillGroupContainer_t1xbt_51",
10
- pillFilter: "_pillFilter_t1xbt_59",
11
- pillGroupScroll: "_pillGroupScroll_t1xbt_63",
12
- pillGroup: "_pillGroup_t1xbt_51"
2
+ row: "_row_bmqgz_1",
3
+ remove: "_remove_bmqgz_10",
4
+ propertyPicker: "_propertyPicker_bmqgz_22",
5
+ operatorPicker: "_operatorPicker_bmqgz_23",
6
+ rangeInput: "_rangeInput_bmqgz_24",
7
+ textInput: "_textInput_bmqgz_25",
8
+ pillGroupContainer: "_pillGroupContainer_bmqgz_46",
9
+ pillFilter: "_pillFilter_bmqgz_54",
10
+ pillGroupScroll: "_pillGroupScroll_bmqgz_58",
11
+ pillGroup: "_pillGroup_bmqgz_46"
13
12
  };
14
13
  //#endregion
15
14
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"FilterConditionRow.module.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.module.scss"],"sourcesContent":[".row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n min-height: 30px;\n\n // Value pills adopt the parent group's accent — parent sets `--qb-pill-color`\n // as inline style on its wrapper (see FilterGroupNode).\n --qb-pill-color: var(--synapse-primary-action-color);\n}\n\n.dragHandle {\n cursor: grab;\n color: var(--synapse-gray-deemphasized);\n}\n\n.remove {\n color: var(--synapse-gray-600) !important;\n border: 1px solid var(--synapse-border-color-gray);\n border-radius: 4px !important;\n padding: 4px !important;\n\n &:hover {\n color: var(--synapse-error);\n border-color: var(--synapse-error);\n background-color: transparent !important;\n }\n}\n\n// Match the field heights across the row so Property, Operator, and value\n// inputs all sit on the same baseline. Outlined inputs get consistent\n// padding via MUI defaults; we just fix the height and widths.\n.propertyPicker,\n.operatorPicker,\n.rangeInput,\n.textInput {\n :global(.MuiOutlinedInput-root) {\n height: 36px;\n font-size: 14px;\n }\n}\n\n.propertyPicker {\n min-width: 200px;\n}\n\n.operatorPicker {\n min-width: 120px;\n}\n\n.rangeInput {\n width: 120px;\n}\n\n.textInput {\n min-width: 200px;\n}\n\n.pillGroupContainer {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 1;\n min-width: 0;\n}\n\n.pillFilter {\n max-width: 260px;\n}\n\n.pillGroupScroll {\n max-height: 120px;\n overflow-y: auto;\n}\n\n.pillGroup {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n // MUI's ToggleButtonGroup uses `:not(:first-of-type)` rules to collapse\n // grouped buttons into an attached pill bar. `!important` is the pragmatic\n // way to undo that; otherwise our pills have flat left edges and negative\n // margins.\n :global(.MuiToggleButton-root),\n :global(.MuiToggleButtonGroup-grouped) {\n text-transform: none;\n padding: 2px 12px;\n border-radius: 999px !important;\n border: 1px solid var(--synapse-gray-dark) !important;\n margin: 0 !important;\n font-size: 13px;\n line-height: 1.4;\n }\n\n :global(.MuiToggleButton-root.Mui-selected) {\n background-color: var(--qb-pill-color);\n color: white;\n border-color: var(--qb-pill-color);\n }\n\n :global(.MuiToggleButton-root.Mui-selected:hover) {\n background-color: var(--qb-pill-color);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"FilterConditionRow.module.js","names":[],"sources":["../../../src/components/QueryBuilder/FilterConditionRow.module.scss"],"sourcesContent":[".row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n min-height: 30px;\n\n // Value pills adopt the parent group's accent — parent sets `--qb-pill-color`\n // as inline style on its wrapper (see FilterGroupNode).\n --qb-pill-color: var(--synapse-primary-action-color);\n}\n\n.remove {\n color: var(--synapse-gray-600) !important;\n border: 1px solid var(--synapse-border-color-gray);\n border-radius: 4px !important;\n padding: 4px !important;\n\n &:hover {\n color: var(--synapse-error);\n border-color: var(--synapse-error);\n background-color: transparent !important;\n }\n}\n\n// Match the field heights across the row so Property, Operator, and value\n// inputs all sit on the same baseline. Outlined inputs get consistent\n// padding via MUI defaults; we just fix the height and widths.\n.propertyPicker,\n.operatorPicker,\n.rangeInput,\n.textInput {\n :global(.MuiOutlinedInput-root) {\n height: 36px;\n font-size: 14px;\n }\n}\n\n.propertyPicker {\n min-width: 200px;\n}\n\n.operatorPicker {\n min-width: 120px;\n}\n\n.rangeInput {\n width: 120px;\n}\n\n.textInput {\n min-width: 200px;\n}\n\n.pillGroupContainer {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 1;\n min-width: 0;\n}\n\n.pillFilter {\n max-width: 260px;\n}\n\n.pillGroupScroll {\n max-height: 120px;\n overflow-y: auto;\n}\n\n.pillGroup {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n // MUI's ToggleButtonGroup uses `:not(:first-of-type)` rules to collapse\n // grouped buttons into an attached pill bar. `!important` is the pragmatic\n // way to undo that; otherwise our pills have flat left edges and negative\n // margins.\n :global(.MuiToggleButton-root),\n :global(.MuiToggleButtonGroup-grouped) {\n text-transform: none;\n padding: 2px 12px;\n border-radius: 999px !important;\n border: 1px solid var(--synapse-gray-dark) !important;\n margin: 0 !important;\n font-size: 13px;\n line-height: 1.4;\n }\n\n :global(.MuiToggleButton-root.Mui-selected) {\n background-color: var(--qb-pill-color);\n color: white;\n border-color: var(--qb-pill-color);\n }\n\n :global(.MuiToggleButton-root.Mui-selected:hover) {\n background-color: var(--qb-pill-color);\n }\n}\n"],"mappings":""}
@@ -10,11 +10,6 @@
10
10
  --qb-pill-color: var(--synapse-primary-action-color);
11
11
  }
12
12
 
13
- .dragHandle {
14
- cursor: grab;
15
- color: var(--synapse-gray-deemphasized);
16
- }
17
-
18
13
  .remove {
19
14
  color: var(--synapse-gray-600) !important;
20
15
  border: 1px solid var(--synapse-border-color-gray);
@@ -1 +1 @@
1
- ._group_7cqi2_1{border-left:2px solid var(--qb-accent-color,var(--synapse-primary-action-color));border-radius:2px 0 0 2px;padding:8px 0 8px 16px;position:relative}._group_7cqi2_1._nested_7cqi2_7{margin-top:4px;margin-bottom:4px}._header_7cqi2_12{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}._combinator_7cqi2_20 .MuiToggleButton-root{text-transform:none;border-color:var(--synapse-gray-dark);min-width:44px;color:var(--synapse-gray-regular);padding:2px 12px;font-weight:700}._combinator_7cqi2_20 .MuiToggleButton-root.Mui-selected{background-color:var(--qb-accent-color,var(--synapse-primary-action-color));color:#fff;border-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._combinator_7cqi2_20 .MuiToggleButton-root.Mui-selected:hover{background-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._notToggle_7cqi2_39{text-transform:none;border-color:var(--synapse-gray-dark);color:var(--synapse-gray-regular);padding:2px 12px;font-size:13px;font-weight:600}._notToggle_7cqi2_39.Mui-selected,._notToggle_7cqi2_39.Mui-selected:hover{background-color:var(--synapse-error);color:#fff;border-color:var(--synapse-error)}._actions_7cqi2_53{align-items:center;gap:4px;margin-left:auto;display:flex}._actionButton_7cqi2_60{text-transform:none;min-width:0;color:var(--synapse-primary-action-color);padding:2px 8px;font-weight:500}._children_7cqi2_68{flex-direction:column;gap:2px;display:flex}._emptyState_7cqi2_74{color:var(--synapse-gray-deemphasized);padding:8px 4px;font-size:13px;font-style:italic}
1
+ ._group_ryxud_1{border-left:2px solid var(--qb-accent-color,var(--synapse-primary-action-color));border-radius:2px 0 0 2px;padding:8px 0 8px 16px;position:relative}._group_ryxud_1._nested_ryxud_7{margin-top:4px;margin-bottom:4px}._group_ryxud_1._dropTarget_ryxud_11{box-shadow:inset 0 0 0 2px var(--qb-accent-color,var(--synapse-primary-action-color));border-radius:3px}._header_ryxud_16{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}._combinator_ryxud_24 .MuiToggleButton-root{text-transform:none;border-color:var(--synapse-gray-dark);min-width:44px;color:var(--synapse-gray-regular);padding:2px 12px;font-weight:700}._combinator_ryxud_24 .MuiToggleButton-root.Mui-selected{background-color:var(--qb-accent-color,var(--synapse-primary-action-color));color:#fff;border-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._combinator_ryxud_24 .MuiToggleButton-root.Mui-selected:hover{background-color:var(--qb-accent-color,var(--synapse-primary-action-color))}._notToggle_ryxud_43{text-transform:none;border-color:var(--synapse-gray-dark);color:var(--synapse-gray-regular);padding:2px 12px;font-size:13px;font-weight:600}._notToggle_ryxud_43.Mui-selected,._notToggle_ryxud_43.Mui-selected:hover{background-color:var(--synapse-error);color:#fff;border-color:var(--synapse-error)}._actions_ryxud_57{align-items:center;gap:4px;margin-left:auto;display:flex}._actionButton_ryxud_64{text-transform:none;min-width:0;color:var(--synapse-primary-action-color);padding:2px 8px;font-weight:500}._children_ryxud_72{flex-direction:column;gap:2px;display:flex}._emptyState_ryxud_78{color:var(--synapse-gray-deemphasized);padding:8px 4px;font-size:13px;font-style:italic}
@@ -2,6 +2,10 @@ import { QBGroup } from './QueryBuilderTypes';
2
2
  export type FilterGroupNodeProps = {
3
3
  group: QBGroup;
4
4
  isRoot?: boolean;
5
+ parentGroupId?: string;
6
+ index?: number;
7
+ /** Nesting level, used to resolve drops into the innermost group. */
8
+ depth?: number;
5
9
  };
6
10
  export declare function FilterGroupNode(props: FilterGroupNodeProps): import("react/jsx-runtime").JSX.Element;
7
11
  //# sourceMappingURL=FilterGroupNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterGroupNode.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/FilterGroupNode.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAa,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA0G1D"}
1
+ {"version":3,"file":"FilterGroupNode.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/FilterGroupNode.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAa,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAmK1D"}