diff --git a/frontend/src/container/QueryBuilder/components/Query/Query.tsx b/frontend/src/container/QueryBuilder/components/Query/Query.tsx index d6b1837081..bccae6d46b 100644 --- a/frontend/src/container/QueryBuilder/components/Query/Query.tsx +++ b/frontend/src/container/QueryBuilder/components/Query/Query.tsx @@ -19,6 +19,7 @@ import { OperatorsSelect, 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/useQueryBuilder'; @@ -204,6 +205,17 @@ export const Query = memo(function Query({ [index, query, handleSetQueryData], ); + const handleChangeAggregateEvery = useCallback( + (value: number): void => { + const newQuery: IBuilderQueryForm = { + ...query, + stepInterval: value, + }; + handleSetQueryData(index, newQuery); + }, + [index, query, handleSetQueryData], + ); + return ( @@ -276,6 +288,17 @@ export const Query = memo(function Query({ )} + + + + + + + + diff --git a/frontend/src/container/QueryBuilder/filters/AggregateEveryFilter/index.tsx b/frontend/src/container/QueryBuilder/filters/AggregateEveryFilter/index.tsx new file mode 100644 index 0000000000..027fabeec4 --- /dev/null +++ b/frontend/src/container/QueryBuilder/filters/AggregateEveryFilter/index.tsx @@ -0,0 +1,62 @@ +import { Input } from 'antd'; +import getStep from 'lib/getStep'; +import React, { useMemo } from 'react'; +import { useSelector } from 'react-redux'; +import { AppState } from 'store/reducers'; +import { IBuilderQueryForm } from 'types/api/queryBuilder/queryBuilderData'; +import { GlobalReducer } from 'types/reducer/globalTime'; + +import { selectStyle } from '../QueryBuilderSearch/config'; + +function AggregateEveryFilter({ + onChange, + query, +}: AggregateEveryFilterProps): JSX.Element { + const { maxTime, minTime } = useSelector( + (state) => state.globalTime, + ); + + const stepInterval = useMemo( + () => + getStep({ + start: minTime, + end: maxTime, + inputFormat: 'ns', + }), + [maxTime, minTime], + ); + + const handleKeyDown = (event: { + keyCode: number; + which: number; + preventDefault: () => void; + }): void => { + const keyCode = event.keyCode || event.which; + const isBackspace = keyCode === 8; + const isNumeric = + (keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105); + + if (!isNumeric && !isBackspace) { + event.preventDefault(); + } + }; + + return ( + onChange(Number(event.target.value))} + onKeyDown={handleKeyDown} + /> + ); +} + +interface AggregateEveryFilterProps { + onChange: (values: number) => void; + query: IBuilderQueryForm; +} + +export default AggregateEveryFilter; diff --git a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/index.tsx b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/index.tsx index d08345b47c..f31e813fc5 100644 --- a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/index.tsx +++ b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/index.tsx @@ -35,7 +35,7 @@ function QueryBuilderSearch({ query }: QueryBuilderSearchProps): JSX.Element { return ( - + {value} diff --git a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/style.ts b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/style.ts index 064392b773..5969c0f1a7 100644 --- a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/style.ts +++ b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearch/style.ts @@ -2,8 +2,8 @@ import { CheckOutlined } from '@ant-design/icons'; import { Typography } from 'antd'; import styled from 'styled-components'; -export const TypographyText = styled(Typography.Text)<{ isInNin: boolean }>` - width: ${({ isInNin }): string => (isInNin ? '10rem' : 'auto')}; +export const TypographyText = styled(Typography.Text)<{ $isInNin: boolean }>` + width: ${({ $isInNin }): string => ($isInNin ? '10rem' : 'auto')}; `; export const StyledCheckOutlined = styled(CheckOutlined)`