import './QueryBuilder.styles.scss'; import { Button, Col, Divider, Row, Tooltip } from 'antd'; import { MAX_FORMULAS, MAX_QUERIES } 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, }: 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) { 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', }); } }; return (
{' '} {currentQuery.builder.queryData.map((query, index) => ( ))} {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 ( ); })} {currentQuery.builder.queryData.map((query) => ( ))} {currentQuery.builder.queryFormulas.map((formula) => ( ))}
); });