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
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilderControls.js","names":[],"sources":["../../../src/components/QueryBuilder/QueryBuilderControls.tsx"],"sourcesContent":["import { Button, ToggleButton, ToggleButtonGroup } from '@mui/material'\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 { 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\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 <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 </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'\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":";;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,EAAqB,GAAkC;CACrE,IAAM,EAAE,SAAM,iBAAc,wBAAqB,OAAU,GACrD,EAAE,iBAAc,oBAAiB,EAAyB,GAC1D,EAAE,2BAAwB,EAAgB,GAE1C,IAAa,KAAQ,EAAe,GAEpC,IAAU,QAAkB;EAChC,IAAM,IAAc,EAAkB,CAAU;EAChD,GAAoB,MAAQ;GAI1B,IAAM,KAAa,EAAK,MAAM,qBAAqB,CAAC,GAAG,QACrD,MAAK,CAAC,EAAc,CAAC,CACvB,GACM,IAAO,IAAc,CAAC,GAAG,GAAW,CAAW,IAAI;GACzD,OAAO;IACL,GAAG;IACH,OAAO;KACL,GAAG,EAAK;KACR,mBAAmB,EAAK,SAAS,IAAI,IAAO,KAAA;IAC9C;GACF;EACF,CAAC;CACH,GAAG,CAAC,GAAY,CAAmB,CAAC,GAE9B,EAAE,4BAAyB,EAA6B,GAExD,CAAC,GAAa,KAAkB,EAAsB,eAAe,GAErE,IAAiB,GACpB,MAAoB;EACnB,EAAa,EAAoB,GAAY,GAAS,MAAM,IAAI,CAAC;CACnE,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAkB,GACrB,MAAoB;EACnB,EAAa,EAAc,GAAY,CAAO,CAAC;CACjD,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAe,GAClB,MAAoB;EACnB,EAAa,EAAW,GAAY,CAAO,CAAC;CAC9C,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAgB,GAElB,GACA,MACG;EACH,EAAa,EAAY,GAAY,GAAS,CAAK,CAAC;CACtD,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAgB,GACnB,MAAoB;EACnB,EAAa,EAAW,GAAY,CAAO,CAAC;CAC9C,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAoB,GACvB,GAAqB,MAAqD;EACzE,EAAa,EAAgB,GAAY,GAAa,CAAK,CAAC;CAC9D,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAoB,GACvB,MAAwB;EACvB,EAAa,EAAW,GAAY,CAAW,CAAC;CAClD,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAe,EAAoB,GAAY,CAAY,GAE3D,IAAe,SACZ;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF,GAEM,IAAW,QACT,EAAiB,GAAY,CAAoB,GACvD,CAAC,GAAY,CAAoB,CACnC,GAEM,EACJ,MAAM,GACN,WAAW,GACX,OAAO,MACL,EAAiB,MAAgB,QAAQ,IAAa,IAAI;CAE9D,OACE,kBAAC,GAAD;EAAqC,OAAO;YAC1C,kBAAC,GAAD;GAAkB,GAAI;aACpB,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB;KACE,kBAAC,OAAD;MAAK,WAAW,EAAO;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAW,EAAO;iBAAvB,CACE,kBAAC,QAAD;QAAM,WAAW,EAAO;kBAAc;OAAmB,CAAA,GACzD,kBAAC,GAAD;QACE,WAAW,EAAO;QAClB,MAAK;QACL,WAAA;QACA,OAAO;QACP,WAAW,GAAQ,MAA6B;SAC9C,AAAI,KAAQ,QAAM,EAAe,CAAI;QACvC;QACA,cAAW;kBARb,CAUE,kBAAC,GAAD;SAAc,OAAM;SAAgB,cAAW;mBAAe;QAEhD,CAAA,GACd,kBAAC,GAAD;SAAc,OAAM;SAAM,cAAW;mBAAW;QAElC,CAAA,CACG;SAChB;UACL,kBAAC,OAAD;OACE,WAAW,EAAO;OAClB,aAAU;OACV,eAAY;iBAEX,MAAgB,kBACf,IACE,IACF,kBAAC,QAAD;QAAM,WAAW,EAAO;kBAAxB,CAAkC,gCACH,EAAS,OAClC;YACJ,IACF,kBAAC,QAAD;QAAM,WAAW,EAAO;kBAAgB;OAAkB,CAAA,IAE1D,kBAAC,QAAD;QAAM,WAAW,EAAO;kBAAU;OAAkB,CAAA;MAEnD,CAAA,CACF;;KAEL,kBAAC,GAAD;MAAiB,OAAO;MAAY,QAAA;KAAQ,CAAA;KAE5C,kBAAC,OAAD;MAAK,WAAW,EAAO;gBACrB,kBAAC,GAAD;OACE,SAAQ;OACR,OAAM;OACN,SAAS;OACT,WAAW,EAAO;iBACnB;MAEO,CAAA;KACL,CAAA;IACF;;EACW,CAAA;CACiB,CAAA;AAEzC"}
@@ -1,12 +1,12 @@
1
- import { labelForFacetValue as e, labelForOp as t } from "./queryBuilderMetadata.js";
2
- import { isQBGroup as n } from "./QueryBuilderTypes.js";
1
+ import { isQBGroup as e } from "./QueryBuilderTypes.js";
2
+ import { labelForFacetValue as t, labelForOp as n } from "./queryBuilderMetadata.js";
3
3
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
4
  //#region src/components/QueryBuilder/qbTreeToReadable.tsx
5
5
  function o(e, t = (e) => e) {
6
6
  return s(e, !0, t) ?? /* @__PURE__ */ i("span", { children: "(no filters)" });
7
7
  }
8
- function s(e, t, r) {
9
- return n(e) ? c(e, t, r) : l(e, r);
8
+ function s(t, n, r) {
9
+ return e(t) ? c(t, n, r) : l(t, r);
10
10
  }
11
11
  function c(e, t, n) {
12
12
  let o = e.children.map((e, t) => ({
@@ -31,27 +31,27 @@ function c(e, t, n) {
31
31
  ")"
32
32
  ] });
33
33
  }
34
- function l(e, n) {
34
+ function l(e, t) {
35
35
  let r = u(e);
36
36
  if (e.columnName == null && r == null) return null;
37
- let o = e.columnName ? n(e.columnName) : "(unset)";
37
+ let o = e.columnName ? t(e.columnName) : "(unset)";
38
38
  return r == null ? /* @__PURE__ */ a("span", { children: [/* @__PURE__ */ i("strong", { children: o }), " (unset)"] }) : /* @__PURE__ */ a("span", { children: [
39
39
  /* @__PURE__ */ i("strong", { children: o }),
40
40
  " ",
41
- t(e.op),
41
+ n(e.op),
42
42
  " ",
43
43
  r
44
44
  ] });
45
45
  }
46
- function u(t) {
47
- let { op: n, values: r, rangeMin: i, rangeMax: a, text: o } = t;
46
+ function u(e) {
47
+ let { op: n, values: r, rangeMin: i, rangeMax: a, text: o } = e;
48
48
  switch (n) {
49
49
  case "has_value":
50
50
  case "no_value": return "";
51
51
  case "is_any_of":
52
- case "is_all_of": return r.length === 0 ? null : r.map(e).join(", ");
52
+ case "is_all_of": return r.length === 0 ? null : r.map(t).join(", ");
53
53
  case "equal":
54
- case "not_equal": return r.length === 0 ? null : e(r[0]);
54
+ case "not_equal": return r.length === 0 ? null : t(r[0]);
55
55
  case "between": return !i || !a ? null : `${i} and ${a}`;
56
56
  case "gt":
57
57
  case "gte": return i || null;
@@ -0,0 +1,27 @@
1
+ import { DragEndEvent, DragOverEvent } from '@dnd-kit/react';
2
+ import { QBGroup } from './QueryBuilderTypes';
3
+ /** Droppable id for a group's drop zone, kept distinct from the group's own id. */
4
+ export declare function groupDropZoneId(groupId: string): string;
5
+ /** `data` a group's drop zone carries so a drop can name its destination. */
6
+ export declare function groupDropZoneData(groupId: string): {
7
+ groupId: string;
8
+ };
9
+ /**
10
+ * The group a drop zone belongs to, or null when the drop landed on a
11
+ * droppable that is not one — nothing else in the tree registers a zone, so
12
+ * that is the signal to leave the tree alone.
13
+ */
14
+ export declare function readGroupDropZoneTarget(data: unknown): string | null;
15
+ export type QueryBuilderDragHandlers = {
16
+ onDragStart: () => void;
17
+ onDragOver: (event: DragOverEvent) => void;
18
+ onDragEnd: (event: DragEndEvent) => void;
19
+ };
20
+ /**
21
+ * Drag-and-drop for the Query Builder tree, as handlers for `DragDropProvider`.
22
+ *
23
+ * Every drag means "put this node in that group": groups register the only
24
+ * drop zones, and a dropped node joins the group it was released over.
25
+ */
26
+ export declare function useQueryBuilderDrag(tree: QBGroup, onTreeChange: (next: QBGroup) => void): QueryBuilderDragHandlers;
27
+ //# sourceMappingURL=queryBuilderDnd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryBuilderDnd.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderDnd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAG5D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAID,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM;;EAEhD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIpE;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;CACzC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GACpC,wBAAwB,CA+C1B"}
@@ -0,0 +1,41 @@
1
+ import { moveNodeIntoGroup as e } from "./queryBuilderOperations.js";
2
+ import { useCallback as t, useMemo as n, useRef as r } from "react";
3
+ //#region src/components/QueryBuilder/queryBuilderDnd.ts
4
+ function i(e) {
5
+ return `${e}::dropzone`;
6
+ }
7
+ var a = "groupId";
8
+ function o(e) {
9
+ return { [a]: e };
10
+ }
11
+ function s(e) {
12
+ if (typeof e != "object" || !e) return null;
13
+ let t = e[a];
14
+ return typeof t == "string" ? t : null;
15
+ }
16
+ function c(i, a) {
17
+ let o = t((t) => {
18
+ let { source: n, target: r } = t;
19
+ if (n == null || r == null) return;
20
+ let o = s(r.data);
21
+ o != null && a(e(i, String(n.id), o));
22
+ }, [i, a]), c = r(null), l = t(() => {
23
+ c.current = i;
24
+ }, [i]), u = t((e) => o(e.operation), [o]), d = t((e) => {
25
+ let t = c.current;
26
+ c.current = null, e.operation.canceled && t != null && a(t);
27
+ }, [a]);
28
+ return n(() => ({
29
+ onDragStart: l,
30
+ onDragOver: u,
31
+ onDragEnd: d
32
+ }), [
33
+ l,
34
+ u,
35
+ d
36
+ ]);
37
+ }
38
+ //#endregion
39
+ export { o as groupDropZoneData, i as groupDropZoneId, s as readGroupDropZoneTarget, c as useQueryBuilderDrag };
40
+
41
+ //# sourceMappingURL=queryBuilderDnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryBuilderDnd.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderDnd.ts"],"sourcesContent":["import { DragEndEvent, DragOverEvent } from '@dnd-kit/react'\nimport { useCallback, useMemo, useRef } from 'react'\nimport { moveNodeIntoGroup } from './queryBuilderOperations'\nimport { QBGroup } from './QueryBuilderTypes'\n\n/** Droppable id for a group's drop zone, kept distinct from the group's own id. */\nexport function groupDropZoneId(groupId: string): string {\n return `${groupId}::dropzone`\n}\n\nconst GROUP_ID_KEY = 'groupId'\n\n/** `data` a group's drop zone carries so a drop can name its destination. */\nexport function groupDropZoneData(groupId: string) {\n return { [GROUP_ID_KEY]: groupId }\n}\n\n/**\n * The group a drop zone belongs to, or null when the drop landed on a\n * droppable that is not one — nothing else in the tree registers a zone, so\n * that is the signal to leave the tree alone.\n */\nexport function readGroupDropZoneTarget(data: unknown): string | null {\n if (data == null || typeof data !== 'object') return null\n const groupId: unknown = (data as Record<string, unknown>)[GROUP_ID_KEY]\n return typeof groupId === 'string' ? groupId : null\n}\n\nexport type QueryBuilderDragHandlers = {\n onDragStart: () => void\n onDragOver: (event: DragOverEvent) => void\n onDragEnd: (event: DragEndEvent) => void\n}\n\n/**\n * Drag-and-drop for the Query Builder tree, as handlers for `DragDropProvider`.\n *\n * Every drag means \"put this node in that group\": groups register the only\n * drop zones, and a dropped node joins the group it was released over.\n */\nexport function useQueryBuilderDrag(\n tree: QBGroup,\n onTreeChange: (next: QBGroup) => void,\n): QueryBuilderDragHandlers {\n const dropIntoHoveredGroup = useCallback(\n (operation: DragOverEvent['operation']) => {\n const { source, target } = operation\n if (source == null || target == null) return\n const groupId = readGroupDropZoneTarget(target.data)\n if (groupId == null) return\n onTreeChange(moveNodeIntoGroup(tree, String(source.id), groupId))\n },\n [tree, onTreeChange],\n )\n\n // The tree as it stood before the in-flight drag. `onDragOver` rewrites the\n // tree as the pointer moves, so this snapshot is the only way back if the\n // gesture is canceled — dnd-kit reverts its own state, never ours.\n const treeBeforeDrag = useRef<QBGroup | null>(null)\n\n const onDragStart = useCallback(() => {\n treeBeforeDrag.current = tree\n }, [tree])\n\n // Moving the node as the pointer crosses into a group is what keeps React\n // state and the DOM in step within the gesture, which is the contract\n // dnd-kit's sortables expect: rows animate to their new positions, and any\n // optimistic sorting stands down on seeing the indices already updated\n // rather than reordering the DOM behind React's back.\n const onDragOver = useCallback(\n (event: DragOverEvent) => dropIntoHoveredGroup(event.operation),\n [dropIntoHoveredGroup],\n )\n\n // The destination depends only on which group is under the pointer, and\n // `dragover` already fired for that group, so a release has nothing left to\n // apply — the tree already shows the result.\n const onDragEnd = useCallback(\n (event: DragEndEvent) => {\n const snapshot = treeBeforeDrag.current\n treeBeforeDrag.current = null\n if (event.operation.canceled && snapshot != null) onTreeChange(snapshot)\n },\n [onTreeChange],\n )\n\n return useMemo(\n () => ({ onDragStart, onDragOver, onDragEnd }),\n [onDragStart, onDragOver, onDragEnd],\n )\n}\n"],"mappings":";;;AAMA,SAAgB,EAAgB,GAAyB;CACvD,OAAO,GAAG,EAAQ;AACpB;AAEA,IAAM,IAAe;AAGrB,SAAgB,EAAkB,GAAiB;CACjD,OAAO,GAAG,IAAe,EAAQ;AACnC;AAOA,SAAgB,EAAwB,GAA8B;CACpE,IAAoB,OAAO,KAAS,aAAhC,GAA0C,OAAO;CACrD,IAAM,IAAoB,EAAiC;CAC3D,OAAO,OAAO,KAAY,WAAW,IAAU;AACjD;AAcA,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAuB,GAC1B,MAA0C;EACzC,IAAM,EAAE,WAAQ,cAAW;EAC3B,IAAI,KAAU,QAAQ,KAAU,MAAM;EACtC,IAAM,IAAU,EAAwB,EAAO,IAAI;EAC/C,KAAW,QACf,EAAa,EAAkB,GAAM,OAAO,EAAO,EAAE,GAAG,CAAO,CAAC;CAClE,GACA,CAAC,GAAM,CAAY,CACrB,GAKM,IAAiB,EAAuB,IAAI,GAE5C,IAAc,QAAkB;EACpC,EAAe,UAAU;CAC3B,GAAG,CAAC,CAAI,CAAC,GAOH,IAAa,GAChB,MAAyB,EAAqB,EAAM,SAAS,GAC9D,CAAC,CAAoB,CACvB,GAKM,IAAY,GACf,MAAwB;EACvB,IAAM,IAAW,EAAe;EAEhC,AADA,EAAe,UAAU,MACrB,EAAM,UAAU,YAAY,KAAY,QAAM,EAAa,CAAQ;CACzE,GACA,CAAC,CAAY,CACf;CAEA,OAAO,SACE;EAAE;EAAa;EAAY;CAAU,IAC5C;EAAC;EAAa;EAAY;CAAS,CACrC;AACF"}
@@ -0,0 +1 @@
1
+ ._dragHandle_1a118_1{cursor:grab;color:var(--synapse-gray-deemphasized)}._dragSource_1a118_6{opacity:.4}
@@ -0,0 +1,8 @@
1
+ import './queryBuilderDrag.css';var e = {
2
+ dragHandle: "_dragHandle_1a118_1",
3
+ dragSource: "_dragSource_1a118_6"
4
+ };
5
+ //#endregion
6
+ export { e as default };
7
+
8
+ //# sourceMappingURL=queryBuilderDrag.module.js.map
@@ -0,0 +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":""}
@@ -0,0 +1,12 @@
1
+ // Styles shared by both draggable node types in the tree.
2
+
3
+ .dragHandle {
4
+ cursor: grab;
5
+ color: var(--synapse-gray-deemphasized);
6
+ }
7
+
8
+ // The node the pointer is carrying. It stays in the tree and moves between
9
+ // groups as the drag goes, so it is dimmed to read as in-flight.
10
+ .dragSource {
11
+ opacity: 0.4;
12
+ }
@@ -45,6 +45,19 @@ export declare function removeNode(root: QBGroup, nodeId: string): QBGroup;
45
45
  * - The move is a no-op (target group + index equals current group + index).
46
46
  */
47
47
  export declare function moveNode(root: QBGroup, nodeId: string, targetGroupId: string, targetIndex: number): QBGroup;
48
+ /**
49
+ * Move the node identified by `nodeId` to the front of the group identified
50
+ * by `groupId`.
51
+ *
52
+ * This is the operation behind drag-and-drop: only groups are drop targets,
53
+ * so every drag resolves to "put this node in that group". The node always
54
+ * lands first, matching where `addConditionToGroup` puts a new row — within
55
+ * an AND/OR group the order carries no meaning, so there is nothing for a
56
+ * drop position to express. Enforces the same invariants as `moveNode`, and
57
+ * additionally returns the tree unchanged when `groupId` names something that
58
+ * is not a group.
59
+ */
60
+ export declare function moveNodeIntoGroup(root: QBGroup, nodeId: string, groupId: string): QBGroup;
48
61
  /**
49
62
  * Find every node in the tree matching a predicate. Root is included.
50
63
  */
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderOperations.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,OAAO,EACP,MAAM,EACP,MAAM,qBAAqB,CAAA;AAM5B;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,aAAa,CAgBf;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,WAAW,CAYb;AAED,wBAAgB,aAAa,CAAC,UAAU,GAAE,YAAoB,GAAG,OAAO,CAQvE;AAED,iFAAiF;AACjF,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAGT;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE;AAMD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAC/C,OAAO,CAIT;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,GACxD,OAAO,CAET;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAiCT;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACnC,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAI3D"}
1
+ {"version":3,"file":"queryBuilderOperations.d.ts","sourceRoot":"","sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,OAAO,EACP,MAAM,EACP,MAAM,qBAAqB,CAAA;AAM5B;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,aAAa,CAgBf;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,WAAW,CAYb;AAED,wBAAgB,aAAa,CAAC,UAAU,GAAE,YAAoB,GAAG,OAAO,CAQvE;AAED,iFAAiF;AACjF,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAGT;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE;AAMD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAC/C,OAAO,CAIT;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,GACxD,OAAO,CAET;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAiCT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAGT;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACnC,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAI3D"}
@@ -42,14 +42,14 @@ function a() {
42
42
  };
43
43
  }
44
44
  function o(e, t, n, i) {
45
- return v(e, t, r(n, i));
45
+ return y(e, t, r(n, i));
46
46
  }
47
47
  function s(e, t) {
48
- return v(e, t, i());
48
+ return y(e, t, i());
49
49
  }
50
50
  function c(e, t, n, r) {
51
- return y(e, t, (e) => {
52
- let t = w(e.children.length, n), i = [
51
+ return b(e, t, (e) => {
52
+ let t = T(e.children.length, n), i = [
53
53
  ...e.children.slice(0, t),
54
54
  r,
55
55
  ...e.children.slice(t)
@@ -61,53 +61,56 @@ function c(e, t, n, r) {
61
61
  });
62
62
  }
63
63
  function l(e, t) {
64
- return y(e, t, (e) => ({
64
+ return b(e, t, (e) => ({
65
65
  ...e,
66
66
  children: []
67
67
  }));
68
68
  }
69
69
  function u(e, t, n) {
70
- return b(e, t, (e) => e.kind === "condition" ? {
70
+ return x(e, t, (e) => e.kind === "condition" ? {
71
71
  ...e,
72
72
  ...n
73
73
  } : e);
74
74
  }
75
75
  function d(e, t, n) {
76
- return y(e, t, (e) => ({
76
+ return b(e, t, (e) => ({
77
77
  ...e,
78
78
  ...n
79
79
  }));
80
80
  }
81
81
  function f(e, t) {
82
82
  if (e.id === t) return e;
83
- let n = x(e, t);
84
- return n == null ? e : y(e, n.parentId, (e) => ({
83
+ let n = S(e, t);
84
+ return n == null ? e : b(e, n.parentId, (e) => ({
85
85
  ...e,
86
86
  children: e.children.filter((e) => e.id !== t)
87
87
  }));
88
88
  }
89
89
  function p(e, t, n, r) {
90
90
  if (t === e.id || t === n) return e;
91
- let i = x(e, t);
91
+ let i = S(e, t);
92
92
  if (i == null) return e;
93
- let a = S(e, n);
94
- if (a == null || i.node.kind === "group" && C(i.node, n)) return e;
95
- let o = i.parentId === n, s = w(o ? a.children.length - 1 : a.children.length, r);
96
- return o && s === i.index ? e : c(y(e, i.parentId, (e) => ({
93
+ let a = C(e, n);
94
+ if (a == null || i.node.kind === "group" && w(i.node, n)) return e;
95
+ let o = i.parentId === n, s = T(o ? a.children.length - 1 : a.children.length, r);
96
+ return o && s === i.index ? e : c(b(e, i.parentId, (e) => ({
97
97
  ...e,
98
98
  children: e.children.filter((e) => e.id !== t)
99
99
  })), n, s, i.node);
100
100
  }
101
- function m(e, n) {
101
+ function m(e, t, n) {
102
+ return C(e, n) == null ? e : p(e, t, n, 0);
103
+ }
104
+ function h(e, n) {
102
105
  let r = [], i = (e) => {
103
106
  n(e) && r.push(e), t(e) && e.children.forEach(i);
104
107
  };
105
108
  return i(e), r;
106
109
  }
107
- function h(e) {
108
- return m(e, (e) => e.kind === "condition").some((e) => g(e));
109
- }
110
110
  function g(e) {
111
+ return h(e, (e) => e.kind === "condition").some((e) => _(e));
112
+ }
113
+ function _(e) {
111
114
  if (e.columnName == null) return !1;
112
115
  switch (e.op) {
113
116
  case "has_value":
@@ -116,31 +119,31 @@ function g(e) {
116
119
  case "is_all_of":
117
120
  case "equal":
118
121
  case "not_equal": return e.values.length > 0;
119
- case "between": return !_(e.rangeMin) && !_(e.rangeMax);
122
+ case "between": return !v(e.rangeMin) && !v(e.rangeMax);
120
123
  case "gt":
121
- case "gte": return !_(e.rangeMin);
124
+ case "gte": return !v(e.rangeMin);
122
125
  case "lt":
123
- case "lte": return !_(e.rangeMax);
126
+ case "lte": return !v(e.rangeMax);
124
127
  case "contains":
125
128
  case "starts_with":
126
129
  case "ends_with":
127
- case "is_exactly": return !_(e.text);
130
+ case "is_exactly": return !v(e.text);
128
131
  default: return e.op, !1;
129
132
  }
130
133
  }
131
- function _(e) {
134
+ function v(e) {
132
135
  return e == null || e === "";
133
136
  }
134
- function v(e, t, n) {
135
- return y(e, t, (e) => ({
137
+ function y(e, t, n) {
138
+ return b(e, t, (e) => ({
136
139
  ...e,
137
140
  children: [n, ...e.children]
138
141
  }));
139
142
  }
140
- function y(e, t, n) {
141
- return b(e, t, (e) => e.kind === "group" ? n(e) : e);
143
+ function b(e, t, n) {
144
+ return x(e, t, (e) => e.kind === "group" ? n(e) : e);
142
145
  }
143
- function b(e, n, r) {
146
+ function x(e, n, r) {
144
147
  if (e.id === n) {
145
148
  let n = r(e);
146
149
  return t(n) ? n : e;
@@ -151,7 +154,7 @@ function b(e, n, r) {
151
154
  return t !== e && (i = !0), t;
152
155
  }
153
156
  if (t(e)) {
154
- let t = b(e, n, r);
157
+ let t = x(e, n, r);
155
158
  return t !== e && (i = !0), t;
156
159
  }
157
160
  return e;
@@ -161,7 +164,7 @@ function b(e, n, r) {
161
164
  children: a
162
165
  } : e;
163
166
  }
164
- function x(e, n) {
167
+ function S(e, n) {
165
168
  let r = (e) => {
166
169
  for (let i = 0; i < e.children.length; i++) {
167
170
  let a = e.children[i];
@@ -179,22 +182,22 @@ function x(e, n) {
179
182
  };
180
183
  return r(e);
181
184
  }
182
- function S(e, n) {
185
+ function C(e, n) {
183
186
  if (e.id === n) return e;
184
187
  for (let r of e.children) if (t(r)) {
185
- let e = S(r, n);
188
+ let e = C(r, n);
186
189
  if (e) return e;
187
190
  }
188
191
  return null;
189
192
  }
190
- function C(e, n) {
191
- for (let r of e.children) if (r.id === n || t(r) && C(r, n)) return !0;
193
+ function w(e, n) {
194
+ for (let r of e.children) if (r.id === n || t(r) && w(r, n)) return !0;
192
195
  return !1;
193
196
  }
194
- function w(e, t) {
197
+ function T(e, t) {
195
198
  return !Number.isFinite(t) || t < 0 ? 0 : Math.min(e, Math.trunc(t));
196
199
  }
197
200
  //#endregion
198
- export { s as addChildGroup, o as addConditionToGroup, l as clearGroup, n as defaultOpForColumnType, a as defaultQBGroup, m as findNodes, h as hasCompleteCondition, c as insertNodeAt, p as moveNode, r as newBlankCondition, i as newEmptyGroup, f as removeNode, u as updateCondition, d as updateGroup };
201
+ export { s as addChildGroup, o as addConditionToGroup, l as clearGroup, n as defaultOpForColumnType, a as defaultQBGroup, h as findNodes, g as hasCompleteCondition, c as insertNodeAt, p as moveNode, m as moveNodeIntoGroup, r as newBlankCondition, i as newEmptyGroup, f as removeNode, u as updateCondition, d as updateGroup };
199
202
 
200
203
  //# sourceMappingURL=queryBuilderOperations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilderOperations.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"sourcesContent":["import { newQBNodeId } from './queryBuilderId'\nimport {\n isQBGroup,\n QBCombinator,\n QBCondition,\n QBConditionOp,\n QBGroup,\n QBNode,\n} from './QueryBuilderTypes'\n\n// -----------------------------------------------------------------------------\n// Factories\n// -----------------------------------------------------------------------------\n\n/**\n * The initial `op` for a brand-new condition. When the user hasn't picked a\n * column yet the choice is arbitrary — the row's operator picker replaces it\n * as soon as the column is chosen — but we still need a valid discriminant\n * so the UI can render. `is_any_of` renders as a pill-based value input, which\n * degrades gracefully for a blank row.\n */\nexport function defaultOpForColumnType(\n columnType: string | null,\n): QBConditionOp {\n if (columnType == null) return 'is_any_of'\n if (columnType.endsWith('_LIST')) return 'is_any_of'\n switch (columnType) {\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'between'\n case 'BOOLEAN':\n return 'equal'\n case 'STRING':\n return 'contains'\n default:\n return 'is_any_of'\n }\n}\n\nexport function newBlankCondition(\n columnName: string | null,\n columnType: string | null,\n): QBCondition {\n return {\n kind: 'condition',\n id: newQBNodeId(),\n columnName,\n columnType,\n op: defaultOpForColumnType(columnType),\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n}\n\nexport function newEmptyGroup(combinator: QBCombinator = 'AND'): QBGroup {\n return {\n kind: 'group',\n id: newQBNodeId(),\n combinator,\n not: false,\n children: [],\n }\n}\n\n/** Root group with a single blank condition — the QB's default startup state. */\nexport function defaultQBGroup(): QBGroup {\n const root = newEmptyGroup()\n return { ...root, children: [newBlankCondition(null, null)] }\n}\n\n// -----------------------------------------------------------------------------\n// Add / clear\n// -----------------------------------------------------------------------------\n\nexport function addConditionToGroup(\n root: QBGroup,\n targetGroupId: string,\n columnName: string | null,\n columnType: string | null,\n): QBGroup {\n const condition = newBlankCondition(columnName, columnType)\n return prependChild(root, targetGroupId, condition)\n}\n\nexport function addChildGroup(root: QBGroup, targetGroupId: string): QBGroup {\n return prependChild(root, targetGroupId, newEmptyGroup())\n}\n\n/**\n * Insert `node` into the group identified by `targetGroupId` at\n * `targetIndex`. Semantics match `Array.prototype.splice(targetIndex, 0, node)`.\n * If the group can't be found, returns the tree unchanged.\n */\nexport function insertNodeAt(\n root: QBGroup,\n targetGroupId: string,\n targetIndex: number,\n node: QBNode,\n): QBGroup {\n return mapGroup(root, targetGroupId, group => {\n const clamped = clampInsertionIndex(group.children.length, targetIndex)\n const nextChildren = [\n ...group.children.slice(0, clamped),\n node,\n ...group.children.slice(clamped),\n ]\n return { ...group, children: nextChildren }\n })\n}\n\n/**\n * Empty the children of the group identified by `nodeId`. If the id doesn't\n * match any group, returns the tree unchanged.\n */\nexport function clearGroup(root: QBGroup, nodeId: string): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, children: [] }))\n}\n\n// -----------------------------------------------------------------------------\n// Update\n// -----------------------------------------------------------------------------\n\nexport function updateCondition(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBCondition, 'kind' | 'id'>>,\n): QBGroup {\n return mapNode(root, nodeId, node =>\n node.kind === 'condition' ? { ...node, ...patch } : node,\n )\n}\n\nexport function updateGroup(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, ...patch }))\n}\n\n// -----------------------------------------------------------------------------\n// Remove\n// -----------------------------------------------------------------------------\n\n/**\n * Remove the node identified by `nodeId` from the tree. The root cannot be\n * removed — a request to remove the root returns the tree unchanged.\n */\nexport function removeNode(root: QBGroup, nodeId: string): QBGroup {\n if (root.id === nodeId) return root\n const location = findLocation(root, nodeId)\n if (location == null) return root\n return mapGroup(root, location.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n}\n\n// -----------------------------------------------------------------------------\n// Move (DnD)\n// -----------------------------------------------------------------------------\n\n/**\n * Move the node identified by `nodeId` to `targetIndex` of the group\n * identified by `targetGroupId`. `targetIndex` is the insertion index in the\n * target group's children *after* the node has been removed from its current\n * position — same semantics as `Array.prototype.splice(targetIndex, 0, node)`.\n *\n * Returns the tree unchanged if any of the following invariants would be\n * violated:\n * - `nodeId` is the root (root cannot be moved).\n * - `targetGroupId` is `nodeId` (a node can't be dropped into itself).\n * - `targetGroupId` is a descendant of `nodeId` (would create a cycle).\n * - The move is a no-op (target group + index equals current group + index).\n */\nexport function moveNode(\n root: QBGroup,\n nodeId: string,\n targetGroupId: string,\n targetIndex: number,\n): QBGroup {\n if (nodeId === root.id) return root\n if (nodeId === targetGroupId) return root\n\n const source = findLocation(root, nodeId)\n if (source == null) return root\n\n const targetGroup = findGroup(root, targetGroupId)\n if (targetGroup == null) return root\n\n if (\n source.node.kind === 'group' &&\n containsDescendant(source.node, targetGroupId)\n ) {\n return root\n }\n\n const isSameParent = source.parentId === targetGroupId\n const clampedTarget = clampInsertionIndex(\n // When moving within the same parent, the effective target-array length\n // after the node is removed is one shorter.\n isSameParent\n ? targetGroup.children.length - 1\n : targetGroup.children.length,\n targetIndex,\n )\n if (isSameParent && clampedTarget === source.index) return root\n\n const withoutSource = mapGroup(root, source.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n return insertNodeAt(withoutSource, targetGroupId, clampedTarget, source.node)\n}\n\n// -----------------------------------------------------------------------------\n// Query helpers\n// -----------------------------------------------------------------------------\n\n/**\n * Find every node in the tree matching a predicate. Root is included.\n */\nexport function findNodes(\n root: QBGroup,\n predicate: (node: QBNode) => boolean,\n): QBNode[] {\n const acc: QBNode[] = []\n const visit = (node: QBNode) => {\n if (predicate(node)) acc.push(node)\n if (isQBGroup(node)) node.children.forEach(visit)\n }\n visit(root)\n return acc\n}\n\n/**\n * Whether `root` (or any descendant) contains a condition with a resolvable,\n * complete filter — matches the design's \"at least one complete condition\"\n * requirement for `hasResettableFilters`.\n */\nexport function hasCompleteCondition(root: QBGroup): boolean {\n return findNodes(root, node => node.kind === 'condition').some(condition =>\n isConditionComplete(condition as QBCondition),\n )\n}\n\nfunction isConditionComplete(condition: QBCondition): boolean {\n if (condition.columnName == null) return false\n switch (condition.op) {\n case 'has_value':\n case 'no_value':\n return true\n case 'is_any_of':\n case 'is_all_of':\n case 'equal':\n case 'not_equal':\n return condition.values.length > 0\n case 'between':\n return !isBlank(condition.rangeMin) && !isBlank(condition.rangeMax)\n case 'gt':\n case 'gte':\n return !isBlank(condition.rangeMin)\n case 'lt':\n case 'lte':\n return !isBlank(condition.rangeMax)\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return !isBlank(condition.text)\n default:\n condition.op satisfies never\n return false\n }\n}\n\nfunction isBlank(value: string | null | undefined): boolean {\n return value == null || value === ''\n}\n\n// -----------------------------------------------------------------------------\n// Internal traversal helpers\n// -----------------------------------------------------------------------------\n\nfunction prependChild(root: QBGroup, groupId: string, node: QBNode): QBGroup {\n return mapGroup(root, groupId, group => ({\n ...group,\n children: [node, ...group.children],\n }))\n}\n\n/**\n * Replace the group identified by `targetId` with `transform(group)`. If the\n * id is not found, returns the tree unchanged (by reference).\n */\nfunction mapGroup(\n root: QBGroup,\n targetId: string,\n transform: (group: QBGroup) => QBGroup,\n): QBGroup {\n return mapNode(root, targetId, node =>\n node.kind === 'group' ? transform(node) : node,\n )\n}\n\n/**\n * Replace the node identified by `targetId` with `transform(node)`. If the id\n * matches root, the transformed root is returned. Structural sharing: only\n * the ancestor chain of the changed node is rebuilt; unaffected subtrees are\n * kept by reference.\n */\nfunction mapNode(\n root: QBGroup,\n targetId: string,\n transform: (node: QBNode) => QBNode,\n): QBGroup {\n if (root.id === targetId) {\n const next = transform(root)\n return isQBGroup(next) ? next : root\n }\n let changed = false\n const nextChildren = root.children.map(child => {\n if (child.id === targetId) {\n const replaced = transform(child)\n if (replaced !== child) changed = true\n return replaced\n }\n if (isQBGroup(child)) {\n const replaced = mapNode(child, targetId, transform)\n if (replaced !== child) changed = true\n return replaced\n }\n return child\n })\n return changed ? { ...root, children: nextChildren } : root\n}\n\ntype QBNodeLocation = {\n node: QBNode\n parentId: string\n index: number\n}\n\nfunction findLocation(root: QBGroup, targetId: string): QBNodeLocation | null {\n const visit = (group: QBGroup): QBNodeLocation | null => {\n for (let index = 0; index < group.children.length; index++) {\n const child = group.children[index]\n if (child.id === targetId) {\n return { node: child, parentId: group.id, index }\n }\n if (isQBGroup(child)) {\n const nested = visit(child)\n if (nested) return nested\n }\n }\n return null\n }\n return visit(root)\n}\n\nfunction findGroup(root: QBGroup, targetId: string): QBGroup | null {\n if (root.id === targetId) return root\n for (const child of root.children) {\n if (isQBGroup(child)) {\n const nested = findGroup(child, targetId)\n if (nested) return nested\n }\n }\n return null\n}\n\nfunction containsDescendant(group: QBGroup, targetId: string): boolean {\n for (const child of group.children) {\n if (child.id === targetId) return true\n if (isQBGroup(child) && containsDescendant(child, targetId)) return true\n }\n return false\n}\n\nfunction clampInsertionIndex(length: number, index: number): number {\n if (!Number.isFinite(index) || index < 0) return 0\n return Math.min(length, Math.trunc(index))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"queryBuilderOperations.js","names":[],"sources":["../../../src/components/QueryBuilder/queryBuilderOperations.ts"],"sourcesContent":["import { newQBNodeId } from './queryBuilderId'\nimport {\n isQBGroup,\n QBCombinator,\n QBCondition,\n QBConditionOp,\n QBGroup,\n QBNode,\n} from './QueryBuilderTypes'\n\n// -----------------------------------------------------------------------------\n// Factories\n// -----------------------------------------------------------------------------\n\n/**\n * The initial `op` for a brand-new condition. When the user hasn't picked a\n * column yet the choice is arbitrary — the row's operator picker replaces it\n * as soon as the column is chosen — but we still need a valid discriminant\n * so the UI can render. `is_any_of` renders as a pill-based value input, which\n * degrades gracefully for a blank row.\n */\nexport function defaultOpForColumnType(\n columnType: string | null,\n): QBConditionOp {\n if (columnType == null) return 'is_any_of'\n if (columnType.endsWith('_LIST')) return 'is_any_of'\n switch (columnType) {\n case 'INTEGER':\n case 'DOUBLE':\n case 'DATE':\n case 'DATE_TIME':\n return 'between'\n case 'BOOLEAN':\n return 'equal'\n case 'STRING':\n return 'contains'\n default:\n return 'is_any_of'\n }\n}\n\nexport function newBlankCondition(\n columnName: string | null,\n columnType: string | null,\n): QBCondition {\n return {\n kind: 'condition',\n id: newQBNodeId(),\n columnName,\n columnType,\n op: defaultOpForColumnType(columnType),\n values: [],\n rangeMin: null,\n rangeMax: null,\n text: null,\n }\n}\n\nexport function newEmptyGroup(combinator: QBCombinator = 'AND'): QBGroup {\n return {\n kind: 'group',\n id: newQBNodeId(),\n combinator,\n not: false,\n children: [],\n }\n}\n\n/** Root group with a single blank condition — the QB's default startup state. */\nexport function defaultQBGroup(): QBGroup {\n const root = newEmptyGroup()\n return { ...root, children: [newBlankCondition(null, null)] }\n}\n\n// -----------------------------------------------------------------------------\n// Add / clear\n// -----------------------------------------------------------------------------\n\nexport function addConditionToGroup(\n root: QBGroup,\n targetGroupId: string,\n columnName: string | null,\n columnType: string | null,\n): QBGroup {\n const condition = newBlankCondition(columnName, columnType)\n return prependChild(root, targetGroupId, condition)\n}\n\nexport function addChildGroup(root: QBGroup, targetGroupId: string): QBGroup {\n return prependChild(root, targetGroupId, newEmptyGroup())\n}\n\n/**\n * Insert `node` into the group identified by `targetGroupId` at\n * `targetIndex`. Semantics match `Array.prototype.splice(targetIndex, 0, node)`.\n * If the group can't be found, returns the tree unchanged.\n */\nexport function insertNodeAt(\n root: QBGroup,\n targetGroupId: string,\n targetIndex: number,\n node: QBNode,\n): QBGroup {\n return mapGroup(root, targetGroupId, group => {\n const clamped = clampInsertionIndex(group.children.length, targetIndex)\n const nextChildren = [\n ...group.children.slice(0, clamped),\n node,\n ...group.children.slice(clamped),\n ]\n return { ...group, children: nextChildren }\n })\n}\n\n/**\n * Empty the children of the group identified by `nodeId`. If the id doesn't\n * match any group, returns the tree unchanged.\n */\nexport function clearGroup(root: QBGroup, nodeId: string): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, children: [] }))\n}\n\n// -----------------------------------------------------------------------------\n// Update\n// -----------------------------------------------------------------------------\n\nexport function updateCondition(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBCondition, 'kind' | 'id'>>,\n): QBGroup {\n return mapNode(root, nodeId, node =>\n node.kind === 'condition' ? { ...node, ...patch } : node,\n )\n}\n\nexport function updateGroup(\n root: QBGroup,\n nodeId: string,\n patch: Partial<Omit<QBGroup, 'kind' | 'id' | 'children'>>,\n): QBGroup {\n return mapGroup(root, nodeId, group => ({ ...group, ...patch }))\n}\n\n// -----------------------------------------------------------------------------\n// Remove\n// -----------------------------------------------------------------------------\n\n/**\n * Remove the node identified by `nodeId` from the tree. The root cannot be\n * removed — a request to remove the root returns the tree unchanged.\n */\nexport function removeNode(root: QBGroup, nodeId: string): QBGroup {\n if (root.id === nodeId) return root\n const location = findLocation(root, nodeId)\n if (location == null) return root\n return mapGroup(root, location.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n}\n\n// -----------------------------------------------------------------------------\n// Move (DnD)\n// -----------------------------------------------------------------------------\n\n/**\n * Move the node identified by `nodeId` to `targetIndex` of the group\n * identified by `targetGroupId`. `targetIndex` is the insertion index in the\n * target group's children *after* the node has been removed from its current\n * position — same semantics as `Array.prototype.splice(targetIndex, 0, node)`.\n *\n * Returns the tree unchanged if any of the following invariants would be\n * violated:\n * - `nodeId` is the root (root cannot be moved).\n * - `targetGroupId` is `nodeId` (a node can't be dropped into itself).\n * - `targetGroupId` is a descendant of `nodeId` (would create a cycle).\n * - The move is a no-op (target group + index equals current group + index).\n */\nexport function moveNode(\n root: QBGroup,\n nodeId: string,\n targetGroupId: string,\n targetIndex: number,\n): QBGroup {\n if (nodeId === root.id) return root\n if (nodeId === targetGroupId) return root\n\n const source = findLocation(root, nodeId)\n if (source == null) return root\n\n const targetGroup = findGroup(root, targetGroupId)\n if (targetGroup == null) return root\n\n if (\n source.node.kind === 'group' &&\n containsDescendant(source.node, targetGroupId)\n ) {\n return root\n }\n\n const isSameParent = source.parentId === targetGroupId\n const clampedTarget = clampInsertionIndex(\n // When moving within the same parent, the effective target-array length\n // after the node is removed is one shorter.\n isSameParent\n ? targetGroup.children.length - 1\n : targetGroup.children.length,\n targetIndex,\n )\n if (isSameParent && clampedTarget === source.index) return root\n\n const withoutSource = mapGroup(root, source.parentId, group => ({\n ...group,\n children: group.children.filter(child => child.id !== nodeId),\n }))\n return insertNodeAt(withoutSource, targetGroupId, clampedTarget, source.node)\n}\n\n/**\n * Move the node identified by `nodeId` to the front of the group identified\n * by `groupId`.\n *\n * This is the operation behind drag-and-drop: only groups are drop targets,\n * so every drag resolves to \"put this node in that group\". The node always\n * lands first, matching where `addConditionToGroup` puts a new row — within\n * an AND/OR group the order carries no meaning, so there is nothing for a\n * drop position to express. Enforces the same invariants as `moveNode`, and\n * additionally returns the tree unchanged when `groupId` names something that\n * is not a group.\n */\nexport function moveNodeIntoGroup(\n root: QBGroup,\n nodeId: string,\n groupId: string,\n): QBGroup {\n if (findGroup(root, groupId) == null) return root\n return moveNode(root, nodeId, groupId, 0)\n}\n\n// -----------------------------------------------------------------------------\n// Query helpers\n// -----------------------------------------------------------------------------\n\n/**\n * Find every node in the tree matching a predicate. Root is included.\n */\nexport function findNodes(\n root: QBGroup,\n predicate: (node: QBNode) => boolean,\n): QBNode[] {\n const acc: QBNode[] = []\n const visit = (node: QBNode) => {\n if (predicate(node)) acc.push(node)\n if (isQBGroup(node)) node.children.forEach(visit)\n }\n visit(root)\n return acc\n}\n\n/**\n * Whether `root` (or any descendant) contains a condition with a resolvable,\n * complete filter — matches the design's \"at least one complete condition\"\n * requirement for `hasResettableFilters`.\n */\nexport function hasCompleteCondition(root: QBGroup): boolean {\n return findNodes(root, node => node.kind === 'condition').some(condition =>\n isConditionComplete(condition as QBCondition),\n )\n}\n\nfunction isConditionComplete(condition: QBCondition): boolean {\n if (condition.columnName == null) return false\n switch (condition.op) {\n case 'has_value':\n case 'no_value':\n return true\n case 'is_any_of':\n case 'is_all_of':\n case 'equal':\n case 'not_equal':\n return condition.values.length > 0\n case 'between':\n return !isBlank(condition.rangeMin) && !isBlank(condition.rangeMax)\n case 'gt':\n case 'gte':\n return !isBlank(condition.rangeMin)\n case 'lt':\n case 'lte':\n return !isBlank(condition.rangeMax)\n case 'contains':\n case 'starts_with':\n case 'ends_with':\n case 'is_exactly':\n return !isBlank(condition.text)\n default:\n condition.op satisfies never\n return false\n }\n}\n\nfunction isBlank(value: string | null | undefined): boolean {\n return value == null || value === ''\n}\n\n// -----------------------------------------------------------------------------\n// Internal traversal helpers\n// -----------------------------------------------------------------------------\n\nfunction prependChild(root: QBGroup, groupId: string, node: QBNode): QBGroup {\n return mapGroup(root, groupId, group => ({\n ...group,\n children: [node, ...group.children],\n }))\n}\n\n/**\n * Replace the group identified by `targetId` with `transform(group)`. If the\n * id is not found, returns the tree unchanged (by reference).\n */\nfunction mapGroup(\n root: QBGroup,\n targetId: string,\n transform: (group: QBGroup) => QBGroup,\n): QBGroup {\n return mapNode(root, targetId, node =>\n node.kind === 'group' ? transform(node) : node,\n )\n}\n\n/**\n * Replace the node identified by `targetId` with `transform(node)`. If the id\n * matches root, the transformed root is returned. Structural sharing: only\n * the ancestor chain of the changed node is rebuilt; unaffected subtrees are\n * kept by reference.\n */\nfunction mapNode(\n root: QBGroup,\n targetId: string,\n transform: (node: QBNode) => QBNode,\n): QBGroup {\n if (root.id === targetId) {\n const next = transform(root)\n return isQBGroup(next) ? next : root\n }\n let changed = false\n const nextChildren = root.children.map(child => {\n if (child.id === targetId) {\n const replaced = transform(child)\n if (replaced !== child) changed = true\n return replaced\n }\n if (isQBGroup(child)) {\n const replaced = mapNode(child, targetId, transform)\n if (replaced !== child) changed = true\n return replaced\n }\n return child\n })\n return changed ? { ...root, children: nextChildren } : root\n}\n\ntype QBNodeLocation = {\n node: QBNode\n parentId: string\n index: number\n}\n\nfunction findLocation(root: QBGroup, targetId: string): QBNodeLocation | null {\n const visit = (group: QBGroup): QBNodeLocation | null => {\n for (let index = 0; index < group.children.length; index++) {\n const child = group.children[index]\n if (child.id === targetId) {\n return { node: child, parentId: group.id, index }\n }\n if (isQBGroup(child)) {\n const nested = visit(child)\n if (nested) return nested\n }\n }\n return null\n }\n return visit(root)\n}\n\nfunction findGroup(root: QBGroup, targetId: string): QBGroup | null {\n if (root.id === targetId) return root\n for (const child of root.children) {\n if (isQBGroup(child)) {\n const nested = findGroup(child, targetId)\n if (nested) return nested\n }\n }\n return null\n}\n\nfunction containsDescendant(group: QBGroup, targetId: string): boolean {\n for (const child of group.children) {\n if (child.id === targetId) return true\n if (isQBGroup(child) && containsDescendant(child, targetId)) return true\n }\n return false\n}\n\nfunction clampInsertionIndex(length: number, index: number): number {\n if (!Number.isFinite(index) || index < 0) return 0\n return Math.min(length, Math.trunc(index))\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"QueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"names":[],"mappings":"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"}