import './QueryBuilder.styles.scss'; import { Button, Col, Divider, Row, Tooltip } from 'antd'; import { MAX_FORMULAS, MAX_QUERIES, OPERATORS, PANEL_TYPES, } from 'constants/queryBuilder'; // ** Hooks import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { DatabaseZap, Sigma } from 'lucide-react'; // ** Constants import { memo, useEffect, useMemo, useRef } from 'react'; import { DataSource } from 'types/common/queryBuilder'; // ** Components import { Formula, Query } from './components'; // ** Types import { QueryBuilderProps } from './QueryBuilder.interfaces'; export const QueryBuilder = memo(function QueryBuilder({ config, panelType: newPanelType, filterConfigs = {}, queryComponents, isListViewPanel = false, }: QueryBuilderProps): JSX.Element { const { currentQuery, addNewBuilderQuery, addNewFormula, handleSetConfig, panelType, initialDataSource, } = useQueryBuilder(); const containerRef = useRef(null); const currentDataSource = useMemo( () => (config && config.queryVariant === 'static' && config.initialDataSource) || null, [config], ); useEffect(() => { if (currentDataSource !== initialDataSource || newPanelType !== panelType) { if (newPanelType === PANEL_TYPES.BAR) { handleSetConfig(PANEL_TYPES.BAR, DataSource.METRICS); return; } handleSetConfig(newPanelType, currentDataSource); } }, [ handleSetConfig, panelType, initialDataSource, currentDataSource, newPanelType, ]); const isDisabledQueryButton = useMemo( () => currentQuery.builder.queryData.length >= MAX_QUERIES, [currentQuery], ); const isDisabledFormulaButton = useMemo( () => currentQuery.builder.queryFormulas.length >= MAX_FORMULAS, [currentQuery], ); const isAvailableToDisableQuery = useMemo( () => currentQuery.builder.queryData.length > 0 || currentQuery.builder.queryFormulas.length > 0, [currentQuery], ); const handleScrollIntoView = ( entityType: string, entityName: string, ): void => { const selectedEntity = document.getElementById( `qb-${entityType}-${entityName}`, ); if (selectedEntity) { selectedEntity.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest', }); } }; const listViewLogFilterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => { const config: QueryBuilderProps['filterConfigs'] = { stepInterval: { isHidden: true, isDisabled: true }, having: { isHidden: true, isDisabled: true }, filters: { customKey: 'body', customOp: OPERATORS.CONTAINS, }, }; return config; }, []); const listViewTracesFilterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => { const config: QueryBuilderProps['filterConfigs'] = { stepInterval: { isHidden: true, isDisabled: true }, having: { isHidden: true, isDisabled: true }, limit: { isHidden: true, isDisabled: true }, filters: { customKey: 'body', customOp: OPERATORS.CONTAINS, }, }; return config; }, []); return ( {!isListViewPanel && (
)} {' '} {panelType === PANEL_TYPES.LIST && isListViewPanel && ( )} {!isListViewPanel && currentQuery.builder.queryData.map((query, index) => ( ))} {!isListViewPanel && currentQuery.builder.queryFormulas.map((formula, index) => { const isAllMetricDataSource = currentQuery.builder.queryData.every( (query) => query.dataSource === DataSource.METRICS, ); const query = currentQuery.builder.queryData[index] || currentQuery.builder.queryData[0]; return ( ); })} {!isListViewPanel && ( {currentQuery.builder.queryData.map((query) => ( ))} {currentQuery.builder.queryFormulas.map((formula) => ( ))} )}
); });