Chintan Sudani 76331001b7
fix: issues on WHERE search filter (#2629)
* fix: search filter validation on data source

* fix: value search not working for in/nin

* fix: unwanted key api while searching value & disabled tag

* fix: unnecessary , at end of in/nin value

* fix: added space after operator to get value

* fix: custom value not being selected

* fix: space after tag and value

* fix: api call debounce duration

* fix: suggested changes

* fix: updated query params

* fix: search filter data for logs and traces

* fix: search filter value data type issue

* fix: search filter value tag type

* fix: chip & iscolumn issue

* fix: null handled

* fix: label in list of search filter component

* fix: label in list of search filter component

* fix: code level changes

* fix: incorrect filter operators

* fix: key selection dancing

* fix: missing suggestion

* fix: keys are not getting updated

* fix: strange behaviour - removed duplicate options

* fix: driver id exclusion not working

* fix: loader when 0 options

* fix: exists/not-exists tag value issue

* fix: some weird behaviour about exists

* fix: added duplicate option remove logic at hook level

* fix: removed empty options from list

* fix: closable chip handler on edit

* fix: search filter validation on data source

* fix: value search not working for in/nin

* fix: unwanted key api while searching value & disabled tag

* fix: unnecessary , at end of in/nin value

* fix: added space after operator to get value

* fix: custom value not being selected

* fix: space after tag and value

* fix: api call debounce duration

* fix: suggested changes

* fix: updated query params

* fix: search filter data for logs and traces

* fix: search filter value data type issue

* fix: search filter value tag type

* fix: chip & iscolumn issue

* fix: null handled

* fix: label in list of search filter component

* fix: label in list of search filter component

* fix: code level changes

* fix: incorrect filter operators

* fix: key selection dancing

* fix: missing suggestion

* fix: keys are not getting updated

* fix: strange behaviour - removed duplicate options

* fix: driver id exclusion not working

* fix: loader when 0 options

* fix: exists/not-exists tag value issue

* fix: some weird behaviour about exists

* fix: added duplicate option remove logic at hook level

* fix: removed empty options from list

* fix: closable chip handler on edit

* fix: search filter validation on data source

* fix: lint issues is fixed

* fix: chip & iscolumn issue

* fix: lint changes are updated

* fix: undefined case handled

* fix: undefined case handled

* fix: removed settimeout

* fix: delete chip getting value undefined

* fix: payload correctness

* fix: incorrect value selection

* fix: key text typing doesn't change anything

* fix: search value issue

* fix: payload updated

* fix: auto populate value issue

* fix: payload updated & populate values

* fix: split value for in/nin

* fix: split value getting undefined

* fix: new version of search filter using papaparse library

* fix: removed unwanted space before operator

* fix: added exact find method & removed includes logic

* fix: issue when user create chip for exists not exists operator

* fix: white space logic removed

* fix: allow custom key in from list

* fix: issue when user create chip for exists not exists operator

* fix: removed unwanted includes

* fix: removed unwanted utils function

* fix: replaced join with papa unparse

* fix: removed get count of space utils

* fix: resolved build issue

* fix: code level fixes

* fix: space after key

* fix: quote a value if comma present

* fix: handle custom key object onchange

* chore: coverted into string

* Merge branch 'develop' into fix/issue-search-filter

* chore: eslint rule disabling is removed

* fix: serviceName contains sql

* chore: less restrictive expression

* fix: custom key selection issue

* chore: papa parse version is made exact

---------

Co-authored-by: Palash Gupta <palashgdev@gmail.com>
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
2023-05-12 12:30:00 +05:30

306 lines
7.7 KiB
TypeScript

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,
ReduceToFilter,
} from 'container/QueryBuilder/filters';
import AggregateEveryFilter from 'container/QueryBuilder/filters/AggregateEveryFilter';
import LimitFilter from 'container/QueryBuilder/filters/LimitFilter/LimitFilter';
import { OrderByFilter } from 'container/QueryBuilder/filters/OrderByFilter';
import QueryBuilderSearch from 'container/QueryBuilder/filters/QueryBuilderSearch';
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
import { useQueryOperations } from 'hooks/queryBuilder/useQueryOperations';
// ** Hooks
import React, { 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,
}: QueryProps): JSX.Element {
const { panelType } = useQueryBuilder();
const {
operators,
isMetricsDataSource,
listOfAdditionalFilters,
handleChangeAggregatorAttribute,
handleChangeDataSource,
handleChangeQueryData,
handleChangeOperator,
handleDeleteQuery,
} = useQueryOperations({ index, query });
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<HTMLInputElement>) => {
handleChangeQueryData('legend', event.target.value);
},
[handleChangeQueryData],
);
const renderAdditionalFilters = useCallback((): ReactNode => {
switch (panelType) {
case PANEL_TYPES.TIME_SERIES: {
return (
<>
{!isMetricsDataSource && (
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="Limit" />
</Col>
<Col flex="1 1 12.5rem">
<LimitFilter query={query} onChange={handleChangeLimit} />
</Col>
</Row>
</Col>
)}
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="HAVING" />
</Col>
<Col flex="1 1 12.5rem">
<HavingFilter onChange={handleChangeHavingFilter} query={query} />
</Col>
</Row>
</Col>
{!isMetricsDataSource && (
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="Order by" />
</Col>
<Col flex="1 1 12.5rem">
<OrderByFilter query={query} onChange={handleChangeOrderByKeys} />
</Col>
</Row>
</Col>
)}
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="Aggregate Every" />
</Col>
<Col flex="1 1 6rem">
<AggregateEveryFilter
query={query}
onChange={handleChangeAggregateEvery}
/>
</Col>
</Row>
</Col>
</>
);
}
case PANEL_TYPES.VALUE: {
return (
<>
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="HAVING" />
</Col>
<Col flex="1 1 12.5rem">
<HavingFilter onChange={handleChangeHavingFilter} query={query} />
</Col>
</Row>
</Col>
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel label="Aggregate Every" />
</Col>
<Col flex="1 1 6rem">
<AggregateEveryFilter
query={query}
onChange={handleChangeAggregateEvery}
/>
</Col>
</Row>
</Col>
</>
);
}
default: {
return null;
}
}
}, [
panelType,
query,
isMetricsDataSource,
handleChangeAggregateEvery,
handleChangeHavingFilter,
handleChangeLimit,
handleChangeOrderByKeys,
]);
return (
<ListItemWrapper onDelete={handleDeleteQuery}>
<Col span={24}>
<Row align="middle" gutter={[5, 11]}>
<Col>
<ListMarker
isDisabled={query.disabled}
onDisable={handleToggleDisableQuery}
labelName={query.queryName}
index={index}
isAvailableToDisable={isAvailableToDisable}
/>
</Col>
<Col>
{queryVariant === 'dropdown' ? (
<DataSourceDropdown
onChange={handleChangeDataSource}
value={query.dataSource}
style={{ minWidth: '5.625rem' }}
/>
) : (
<FilterLabel label={transformToUpperCase(query.dataSource)} />
)}
</Col>
<Col flex="1 1 20rem">
<Row gutter={[11, 5]}>
{isMetricsDataSource && (
<Col>
<FilterLabel label="WHERE" />
</Col>
)}
<Col flex="1">
<QueryBuilderSearch query={query} onChange={handleChangeTagFilters} />
</Col>
</Row>
</Col>
</Row>
</Col>
<Col span={11}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<OperatorsSelect
value={query.aggregateOperator}
onChange={handleChangeOperator}
operators={operators}
/>
</Col>
<Col flex="1 1 12.5rem">
<AggregatorFilter
onChange={handleChangeAggregatorAttribute}
query={query}
/>
</Col>
</Row>
</Col>
<Col span={11} offset={2}>
<Row gutter={[11, 5]}>
<Col flex="5.93rem">
<FilterLabel
label={panelType === PANEL_TYPES.VALUE ? 'Reduce to' : 'Group by'}
/>
</Col>
<Col flex="1 1 12.5rem">
{panelType === PANEL_TYPES.VALUE ? (
<ReduceToFilter query={query} onChange={handleChangeReduceTo} />
) : (
<GroupByFilter
disabled={isMetricsDataSource && !query.aggregateAttribute.key}
query={query}
onChange={handleChangeGroupByKeys}
/>
)}
</Col>
</Row>
</Col>
<Col span={24}>
<AdditionalFiltersToggler listOfAdditionalFilter={listOfAdditionalFilters}>
<Row gutter={[0, 11]} justify="space-between">
{renderAdditionalFilters()}
</Row>
</AdditionalFiltersToggler>
</Col>
<Row style={{ width: '100%' }}>
<Input
onChange={handleChangeQueryLegend}
size="middle"
value={query.legend}
addonBefore="Legend Format"
/>
</Row>
</ListItemWrapper>
);
});