mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-19 01:25:53 +08:00
fix: disable step interval for all views (#3070)
* fix: disable step interval for all views * fix: disable interval for dashboard --------- Co-authored-by: Vishal Sharma <makeavish786@gmail.com>
This commit is contained in:
parent
84c81b054c
commit
5042c56b4c
51
frontend/src/container/LogExplorerQuerySection/index.tsx
Normal file
51
frontend/src/container/LogExplorerQuerySection/index.tsx
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { Button } from 'antd';
|
||||||
|
import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder';
|
||||||
|
import { QueryBuilder } from 'container/QueryBuilder';
|
||||||
|
import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces';
|
||||||
|
import { useGetPanelTypesQueryParam } from 'hooks/queryBuilder/useGetPanelTypesQueryParam';
|
||||||
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
||||||
|
import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl';
|
||||||
|
import { ButtonWrapperStyled } from 'pages/LogsExplorer/styles';
|
||||||
|
import { prepareQueryWithDefaultTimestamp } from 'pages/LogsExplorer/utils';
|
||||||
|
import { memo, useMemo } from 'react';
|
||||||
|
import { DataSource } from 'types/common/queryBuilder';
|
||||||
|
|
||||||
|
function LogExplorerQuerySection(): JSX.Element {
|
||||||
|
const { handleRunQuery, updateAllQueriesOperators } = useQueryBuilder();
|
||||||
|
const panelTypes = useGetPanelTypesQueryParam(PANEL_TYPES.LIST);
|
||||||
|
const defaultValue = useMemo(() => {
|
||||||
|
const updatedQuery = updateAllQueriesOperators(
|
||||||
|
initialQueriesMap.logs,
|
||||||
|
PANEL_TYPES.LIST,
|
||||||
|
DataSource.LOGS,
|
||||||
|
);
|
||||||
|
return prepareQueryWithDefaultTimestamp(updatedQuery);
|
||||||
|
}, [updateAllQueriesOperators]);
|
||||||
|
|
||||||
|
useShareBuilderUrl(defaultValue);
|
||||||
|
const filterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => {
|
||||||
|
const isTable = panelTypes === PANEL_TYPES.TABLE;
|
||||||
|
const config: QueryBuilderProps['filterConfigs'] = {
|
||||||
|
stepInterval: { isHidden: isTable, isDisabled: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}, [panelTypes]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<QueryBuilder
|
||||||
|
panelType={panelTypes}
|
||||||
|
config={{ initialDataSource: DataSource.LOGS, queryVariant: 'static' }}
|
||||||
|
filterConfigs={filterConfigs}
|
||||||
|
actions={
|
||||||
|
<ButtonWrapperStyled>
|
||||||
|
<Button type="primary" onClick={handleRunQuery}>
|
||||||
|
Run Query
|
||||||
|
</Button>
|
||||||
|
</ButtonWrapperStyled>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default memo(LogExplorerQuerySection);
|
@ -3,12 +3,13 @@ import TextToolTip from 'components/TextToolTip';
|
|||||||
import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider';
|
import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider';
|
||||||
import { WidgetGraphProps } from 'container/NewWidget/types';
|
import { WidgetGraphProps } from 'container/NewWidget/types';
|
||||||
import { QueryBuilder } from 'container/QueryBuilder';
|
import { QueryBuilder } from 'container/QueryBuilder';
|
||||||
|
import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces';
|
||||||
import { useGetWidgetQueryRange } from 'hooks/queryBuilder/useGetWidgetQueryRange';
|
import { useGetWidgetQueryRange } from 'hooks/queryBuilder/useGetWidgetQueryRange';
|
||||||
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
||||||
import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl';
|
import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl';
|
||||||
import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval';
|
import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval';
|
||||||
import useUrlQuery from 'hooks/useUrlQuery';
|
import useUrlQuery from 'hooks/useUrlQuery';
|
||||||
import { useCallback } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import { connect, useSelector } from 'react-redux';
|
import { connect, useSelector } from 'react-redux';
|
||||||
import { bindActionCreators, Dispatch } from 'redux';
|
import { bindActionCreators, Dispatch } from 'redux';
|
||||||
import { ThunkDispatch } from 'redux-thunk';
|
import { ThunkDispatch } from 'redux-thunk';
|
||||||
@ -101,12 +102,22 @@ function QuerySection({
|
|||||||
handleStageQuery(currentQuery);
|
handleStageQuery(currentQuery);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const filterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => {
|
||||||
|
const config: QueryBuilderProps['filterConfigs'] = {
|
||||||
|
stepInterval: { isHidden: false, isDisabled: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}, []);
|
||||||
|
|
||||||
const items = [
|
const items = [
|
||||||
{
|
{
|
||||||
key: EQueryType.QUERY_BUILDER,
|
key: EQueryType.QUERY_BUILDER,
|
||||||
label: 'Query Builder',
|
label: 'Query Builder',
|
||||||
tab: <Typography>Query Builder</Typography>,
|
tab: <Typography>Query Builder</Typography>,
|
||||||
children: <QueryBuilder panelType={selectedGraph} />,
|
children: (
|
||||||
|
<QueryBuilder panelType={selectedGraph} filterConfigs={filterConfigs} />
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: EQueryType.CLICKHOUSE,
|
key: EQueryType.CLICKHOUSE,
|
||||||
|
@ -14,5 +14,7 @@ export type QueryBuilderProps = {
|
|||||||
config?: QueryBuilderConfig;
|
config?: QueryBuilderConfig;
|
||||||
panelType: ITEMS;
|
panelType: ITEMS;
|
||||||
actions?: ReactNode;
|
actions?: ReactNode;
|
||||||
inactiveFilters?: Partial<Record<keyof IBuilderQuery, boolean>>;
|
filterConfigs?: Partial<
|
||||||
|
Record<keyof IBuilderQuery, { isHidden: boolean; isDisabled: boolean }>
|
||||||
|
>;
|
||||||
};
|
};
|
||||||
|
@ -15,7 +15,7 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|||||||
config,
|
config,
|
||||||
panelType: newPanelType,
|
panelType: newPanelType,
|
||||||
actions,
|
actions,
|
||||||
inactiveFilters = {},
|
filterConfigs = {},
|
||||||
}: QueryBuilderProps): JSX.Element {
|
}: QueryBuilderProps): JSX.Element {
|
||||||
const {
|
const {
|
||||||
currentQuery,
|
currentQuery,
|
||||||
@ -73,7 +73,7 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|||||||
isAvailableToDisable={isAvailableToDisableQuery}
|
isAvailableToDisable={isAvailableToDisableQuery}
|
||||||
queryVariant={config?.queryVariant || 'dropdown'}
|
queryVariant={config?.queryVariant || 'dropdown'}
|
||||||
query={query}
|
query={query}
|
||||||
inactiveFilters={inactiveFilters}
|
filterConfigs={filterConfigs}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
))}
|
))}
|
||||||
|
@ -6,4 +6,4 @@ export type QueryProps = {
|
|||||||
isAvailableToDisable: boolean;
|
isAvailableToDisable: boolean;
|
||||||
query: IBuilderQuery;
|
query: IBuilderQuery;
|
||||||
queryVariant: 'static' | 'dropdown';
|
queryVariant: 'static' | 'dropdown';
|
||||||
} & Pick<QueryBuilderProps, 'inactiveFilters'>;
|
} & Pick<QueryBuilderProps, 'filterConfigs'>;
|
||||||
|
@ -35,7 +35,7 @@ export const Query = memo(function Query({
|
|||||||
isAvailableToDisable,
|
isAvailableToDisable,
|
||||||
queryVariant,
|
queryVariant,
|
||||||
query,
|
query,
|
||||||
inactiveFilters,
|
filterConfigs,
|
||||||
}: QueryProps): JSX.Element {
|
}: QueryProps): JSX.Element {
|
||||||
const { panelType } = useQueryBuilder();
|
const { panelType } = useQueryBuilder();
|
||||||
const {
|
const {
|
||||||
@ -48,7 +48,7 @@ export const Query = memo(function Query({
|
|||||||
handleChangeQueryData,
|
handleChangeQueryData,
|
||||||
handleChangeOperator,
|
handleChangeOperator,
|
||||||
handleDeleteQuery,
|
handleDeleteQuery,
|
||||||
} = useQueryOperations({ index, query, inactiveFilters });
|
} = useQueryOperations({ index, query, filterConfigs });
|
||||||
|
|
||||||
const handleChangeAggregateEvery = useCallback(
|
const handleChangeAggregateEvery = useCallback(
|
||||||
(value: IBuilderQuery['stepInterval']) => {
|
(value: IBuilderQuery['stepInterval']) => {
|
||||||
@ -112,7 +112,7 @@ export const Query = memo(function Query({
|
|||||||
|
|
||||||
const renderAggregateEveryFilter = useCallback(
|
const renderAggregateEveryFilter = useCallback(
|
||||||
(): JSX.Element | null =>
|
(): JSX.Element | null =>
|
||||||
!inactiveFilters?.stepInterval ? (
|
!filterConfigs?.stepInterval?.isHidden ? (
|
||||||
<Row gutter={[11, 5]}>
|
<Row gutter={[11, 5]}>
|
||||||
<Col flex="5.93rem">
|
<Col flex="5.93rem">
|
||||||
<FilterLabel label="Aggregate Every" />
|
<FilterLabel label="Aggregate Every" />
|
||||||
@ -120,12 +120,18 @@ export const Query = memo(function Query({
|
|||||||
<Col flex="1 1 6rem">
|
<Col flex="1 1 6rem">
|
||||||
<AggregateEveryFilter
|
<AggregateEveryFilter
|
||||||
query={query}
|
query={query}
|
||||||
|
disabled={filterConfigs?.stepInterval?.isDisabled || false}
|
||||||
onChange={handleChangeAggregateEvery}
|
onChange={handleChangeAggregateEvery}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
) : null,
|
) : null,
|
||||||
[inactiveFilters?.stepInterval, query, handleChangeAggregateEvery],
|
[
|
||||||
|
filterConfigs?.stepInterval?.isHidden,
|
||||||
|
filterConfigs?.stepInterval?.isDisabled,
|
||||||
|
query,
|
||||||
|
handleChangeAggregateEvery,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const renderAdditionalFilters = useCallback((): ReactNode => {
|
const renderAdditionalFilters = useCallback((): ReactNode => {
|
||||||
|
@ -8,6 +8,7 @@ import { selectStyle } from '../QueryBuilderSearch/config';
|
|||||||
function AggregateEveryFilter({
|
function AggregateEveryFilter({
|
||||||
onChange,
|
onChange,
|
||||||
query,
|
query,
|
||||||
|
disabled,
|
||||||
}: AggregateEveryFilterProps): JSX.Element {
|
}: AggregateEveryFilterProps): JSX.Element {
|
||||||
const isMetricsDataSource = useMemo(
|
const isMetricsDataSource = useMemo(
|
||||||
() => query.dataSource === DataSource.METRICS,
|
() => query.dataSource === DataSource.METRICS,
|
||||||
@ -20,7 +21,8 @@ function AggregateEveryFilter({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const isDisabled = isMetricsDataSource && !query.aggregateAttribute.key;
|
const isDisabled =
|
||||||
|
(isMetricsDataSource && !query.aggregateAttribute.key) || disabled;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<InputNumber
|
<InputNumber
|
||||||
@ -37,6 +39,7 @@ function AggregateEveryFilter({
|
|||||||
interface AggregateEveryFilterProps {
|
interface AggregateEveryFilterProps {
|
||||||
onChange: (values: number) => void;
|
onChange: (values: number) => void;
|
||||||
query: IBuilderQuery;
|
query: IBuilderQuery;
|
||||||
|
disabled: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default AggregateEveryFilter;
|
export default AggregateEveryFilter;
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import { Button } from 'antd';
|
import { Button } from 'antd';
|
||||||
import { PANEL_TYPES } from 'constants/queryBuilder';
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
||||||
import { QueryBuilder } from 'container/QueryBuilder';
|
import { QueryBuilder } from 'container/QueryBuilder';
|
||||||
|
import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces';
|
||||||
import { useGetPanelTypesQueryParam } from 'hooks/queryBuilder/useGetPanelTypesQueryParam';
|
import { useGetPanelTypesQueryParam } from 'hooks/queryBuilder/useGetPanelTypesQueryParam';
|
||||||
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
||||||
import { memo } from 'react';
|
import { memo, useMemo } from 'react';
|
||||||
import { DataSource } from 'types/common/queryBuilder';
|
import { DataSource } from 'types/common/queryBuilder';
|
||||||
|
|
||||||
import { ButtonWrapper, Container } from './styles';
|
import { ButtonWrapper, Container } from './styles';
|
||||||
@ -13,6 +14,14 @@ function QuerySection(): JSX.Element {
|
|||||||
|
|
||||||
const panelTypes = useGetPanelTypesQueryParam(PANEL_TYPES.LIST);
|
const panelTypes = useGetPanelTypesQueryParam(PANEL_TYPES.LIST);
|
||||||
|
|
||||||
|
const filterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => {
|
||||||
|
const config: QueryBuilderProps['filterConfigs'] = {
|
||||||
|
stepInterval: { isHidden: false, isDisabled: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<QueryBuilder
|
<QueryBuilder
|
||||||
@ -21,6 +30,7 @@ function QuerySection(): JSX.Element {
|
|||||||
queryVariant: 'static',
|
queryVariant: 'static',
|
||||||
initialDataSource: DataSource.TRACES,
|
initialDataSource: DataSource.TRACES,
|
||||||
}}
|
}}
|
||||||
|
filterConfigs={filterConfigs}
|
||||||
actions={
|
actions={
|
||||||
<ButtonWrapper>
|
<ButtonWrapper>
|
||||||
<Button onClick={handleRunQuery} type="primary">
|
<Button onClick={handleRunQuery} type="primary">
|
||||||
|
@ -20,7 +20,7 @@ import { SelectOption } from 'types/common/select';
|
|||||||
export const useQueryOperations: UseQueryOperations = ({
|
export const useQueryOperations: UseQueryOperations = ({
|
||||||
query,
|
query,
|
||||||
index,
|
index,
|
||||||
inactiveFilters,
|
filterConfigs,
|
||||||
}) => {
|
}) => {
|
||||||
const {
|
const {
|
||||||
handleSetQueryData,
|
handleSetQueryData,
|
||||||
@ -64,7 +64,7 @@ export const useQueryOperations: UseQueryOperations = ({
|
|||||||
(dataSource: DataSource): string[] => {
|
(dataSource: DataSource): string[] => {
|
||||||
const result: string[] = mapOfFilters[dataSource].reduce<string[]>(
|
const result: string[] = mapOfFilters[dataSource].reduce<string[]>(
|
||||||
(acc, item) => {
|
(acc, item) => {
|
||||||
if (inactiveFilters && inactiveFilters[item.field]) {
|
if (filterConfigs && filterConfigs[item.field]?.isHidden) {
|
||||||
return acc;
|
return acc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ export const useQueryOperations: UseQueryOperations = ({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
[inactiveFilters],
|
[filterConfigs],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleChangeAggregatorAttribute = useCallback(
|
const handleChangeAggregatorAttribute = useCallback(
|
||||||
|
@ -1,59 +1,16 @@
|
|||||||
import { Button, Col, Row } from 'antd';
|
import { Col, Row } from 'antd';
|
||||||
import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder';
|
import LogExplorerQuerySection from 'container/LogExplorerQuerySection';
|
||||||
import LogsExplorerViews from 'container/LogsExplorerViews';
|
import LogsExplorerViews from 'container/LogsExplorerViews';
|
||||||
import { QueryBuilder } from 'container/QueryBuilder';
|
|
||||||
import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces';
|
|
||||||
import { useGetPanelTypesQueryParam } from 'hooks/queryBuilder/useGetPanelTypesQueryParam';
|
|
||||||
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
|
||||||
import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl';
|
|
||||||
import { useMemo } from 'react';
|
|
||||||
import { DataSource } from 'types/common/queryBuilder';
|
|
||||||
|
|
||||||
// ** Styles
|
// ** Styles
|
||||||
import { ButtonWrapperStyled, WrapperStyled } from './styles';
|
import { WrapperStyled } from './styles';
|
||||||
import { prepareQueryWithDefaultTimestamp } from './utils';
|
|
||||||
|
|
||||||
function LogsExplorer(): JSX.Element {
|
function LogsExplorer(): JSX.Element {
|
||||||
const { handleRunQuery, updateAllQueriesOperators } = useQueryBuilder();
|
|
||||||
const panelTypes = useGetPanelTypesQueryParam(PANEL_TYPES.LIST);
|
|
||||||
|
|
||||||
const defaultValue = useMemo(() => {
|
|
||||||
const updatedQuery = updateAllQueriesOperators(
|
|
||||||
initialQueriesMap.logs,
|
|
||||||
PANEL_TYPES.LIST,
|
|
||||||
DataSource.LOGS,
|
|
||||||
);
|
|
||||||
return prepareQueryWithDefaultTimestamp(updatedQuery);
|
|
||||||
}, [updateAllQueriesOperators]);
|
|
||||||
|
|
||||||
useShareBuilderUrl(defaultValue);
|
|
||||||
|
|
||||||
const inactiveLogsFilters: QueryBuilderProps['inactiveFilters'] = useMemo(() => {
|
|
||||||
if (panelTypes === PANEL_TYPES.TABLE) {
|
|
||||||
const result: QueryBuilderProps['inactiveFilters'] = { stepInterval: true };
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}, [panelTypes]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<WrapperStyled>
|
<WrapperStyled>
|
||||||
<Row gutter={[0, 28]}>
|
<Row gutter={[0, 28]}>
|
||||||
<Col xs={24}>
|
<Col xs={24}>
|
||||||
<QueryBuilder
|
<LogExplorerQuerySection />
|
||||||
panelType={panelTypes}
|
|
||||||
config={{ initialDataSource: DataSource.LOGS, queryVariant: 'static' }}
|
|
||||||
inactiveFilters={inactiveLogsFilters}
|
|
||||||
actions={
|
|
||||||
<ButtonWrapperStyled>
|
|
||||||
<Button type="primary" onClick={handleRunQuery}>
|
|
||||||
Run Query
|
|
||||||
</Button>
|
|
||||||
</ButtonWrapperStyled>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</Col>
|
</Col>
|
||||||
<Col xs={24}>
|
<Col xs={24}>
|
||||||
<LogsExplorerViews />
|
<LogsExplorerViews />
|
||||||
|
@ -7,7 +7,7 @@ import { DataSource } from 'types/common/queryBuilder';
|
|||||||
import { SelectOption } from './select';
|
import { SelectOption } from './select';
|
||||||
|
|
||||||
type UseQueryOperationsParams = Pick<QueryProps, 'index' | 'query'> &
|
type UseQueryOperationsParams = Pick<QueryProps, 'index' | 'query'> &
|
||||||
Pick<QueryBuilderProps, 'inactiveFilters'>;
|
Pick<QueryBuilderProps, 'filterConfigs'>;
|
||||||
|
|
||||||
export type HandleChangeQueryData = <
|
export type HandleChangeQueryData = <
|
||||||
Key extends keyof IBuilderQuery,
|
Key extends keyof IBuilderQuery,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user