import { Col, Input, Row } from 'antd'; // ** Constants import { PANEL_TYPES } from 'constants/queryBuilder'; // ** Components import { AdditionalFiltersToggler, DataSourceDropdown, FilterLabel, ListItemWrapper, ListMarker, } from 'container/QueryBuilder/components'; import { AggregatorFilter, GroupByFilter, HavingFilter, OperatorsSelect, OrderByFilter, ReduceToFilter, } from 'container/QueryBuilder/filters'; import AggregateEveryFilter from 'container/QueryBuilder/filters/AggregateEveryFilter'; import LimitFilter from 'container/QueryBuilder/filters/LimitFilter/LimitFilter'; import QueryBuilderSearch from 'container/QueryBuilder/filters/QueryBuilderSearch'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useQueryOperations } from 'hooks/queryBuilder/useQueryOperations'; // ** Hooks import { ChangeEvent, memo, ReactNode, useCallback } from 'react'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { transformToUpperCase } from 'utils/transformToUpperCase'; // ** Types import { QueryProps } from './Query.interfaces'; export const Query = memo(function Query({ index, isAvailableToDisable, queryVariant, query, filterConfigs, queryComponents, }: QueryProps): JSX.Element { const { panelType } = useQueryBuilder(); const { operators, isMetricsDataSource, isTracePanelType, listOfAdditionalFilters, handleChangeAggregatorAttribute, handleChangeDataSource, handleChangeQueryData, handleChangeOperator, handleDeleteQuery, } = useQueryOperations({ index, query, filterConfigs }); const handleChangeAggregateEvery = useCallback( (value: IBuilderQuery['stepInterval']) => { handleChangeQueryData('stepInterval', value); }, [handleChangeQueryData], ); const handleChangeLimit = useCallback( (value: IBuilderQuery['limit']) => { handleChangeQueryData('limit', value); }, [handleChangeQueryData], ); const handleChangeHavingFilter = useCallback( (value: IBuilderQuery['having']) => { handleChangeQueryData('having', value); }, [handleChangeQueryData], ); const handleChangeOrderByKeys = useCallback( (value: IBuilderQuery['orderBy']) => { handleChangeQueryData('orderBy', value); }, [handleChangeQueryData], ); const handleToggleDisableQuery = useCallback(() => { handleChangeQueryData('disabled', !query.disabled); }, [handleChangeQueryData, query]); const handleChangeTagFilters = useCallback( (value: IBuilderQuery['filters']) => { handleChangeQueryData('filters', value); }, [handleChangeQueryData], ); const handleChangeReduceTo = useCallback( (value: IBuilderQuery['reduceTo']) => { handleChangeQueryData('reduceTo', value); }, [handleChangeQueryData], ); const handleChangeGroupByKeys = useCallback( (value: IBuilderQuery['groupBy']) => { handleChangeQueryData('groupBy', value); }, [handleChangeQueryData], ); const handleChangeQueryLegend = useCallback( (event: ChangeEvent) => { handleChangeQueryData('legend', event.target.value); }, [handleChangeQueryData], ); const renderOrderByFilter = useCallback((): ReactNode => { if (queryComponents?.renderOrderBy) { return queryComponents.renderOrderBy({ query, onChange: handleChangeOrderByKeys, }); } return ; }, [queryComponents, query, handleChangeOrderByKeys]); const renderAggregateEveryFilter = useCallback( (): JSX.Element | null => !filterConfigs?.stepInterval?.isHidden ? ( ) : null, [ filterConfigs?.stepInterval?.isHidden, filterConfigs?.stepInterval?.isDisabled, query, handleChangeAggregateEvery, ], ); const renderAdditionalFilters = useCallback((): ReactNode => { switch (panelType) { case PANEL_TYPES.TIME_SERIES: { return ( <> {!isMetricsDataSource && ( )} {!isMetricsDataSource && ( {renderOrderByFilter()} )} {renderAggregateEveryFilter()} ); } case PANEL_TYPES.VALUE: { return ( <> {renderAggregateEveryFilter()} ); } default: { return ( <> {renderOrderByFilter()} {renderAggregateEveryFilter()} ); } } }, [ panelType, isMetricsDataSource, query, handleChangeLimit, handleChangeHavingFilter, renderOrderByFilter, renderAggregateEveryFilter, ]); return ( {queryVariant === 'dropdown' ? ( ) : ( )} {isMetricsDataSource && ( )} {isMetricsDataSource && ( )} {!isMetricsDataSource && ( )} {panelType === PANEL_TYPES.VALUE ? ( ) : ( )} {!isTracePanelType && ( {renderAdditionalFilters()} )} {panelType !== PANEL_TYPES.LIST && panelType !== PANEL_TYPES.TRACE && ( )} ); });