diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QuerySection.styles.scss b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QuerySection.styles.scss index b7cd213ae1..0b59cf4bf5 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QuerySection.styles.scss +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QuerySection.styles.scss @@ -1,4 +1,7 @@ .dashboard-navigation { + .run-query-dashboard-btn { + min-width: 180px; + } .ant-tabs-tab { border: none !important; margin-left: 0px !important; diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx index 5e9bc20e98..fa07efb43e 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useMemo } from 'react'; +import { QueryKey } from 'react-query'; import { Color } from '@signozhq/design-tokens'; import { Button, Tabs, Typography } from 'antd'; import logEvent from 'api/common/logEvent'; @@ -35,8 +36,11 @@ import ClickHouseQueryContainer from './QueryBuilder/clickHouse'; import PromQLQueryContainer from './QueryBuilder/promQL'; import './QuerySection.styles.scss'; - -function QuerySection({ selectedGraph }: QueryProps): JSX.Element { +function QuerySection({ + selectedGraph, + queryRangeKey, + isLoadingQueries, +}: QueryProps): JSX.Element { const { currentQuery, handleRunQuery: handleRunQueryFromQueryBuilder, @@ -237,7 +241,13 @@ function QuerySection({ selectedGraph }: QueryProps): JSX.Element { tabBarExtraContent={ - + } items={items} @@ -248,6 +258,8 @@ function QuerySection({ selectedGraph }: QueryProps): JSX.Element { interface QueryProps { selectedGraph: PANEL_TYPES; + queryRangeKey?: QueryKey; + isLoadingQueries?: boolean; } export default QuerySection; diff --git a/frontend/src/container/NewWidget/LeftContainer/index.tsx b/frontend/src/container/NewWidget/LeftContainer/index.tsx index dacc3b903c..c439e75441 100644 --- a/frontend/src/container/NewWidget/LeftContainer/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/index.tsx @@ -1,4 +1,5 @@ import { memo, useEffect } from 'react'; +import { useMemo } from 'react'; import { useSelector } from 'react-redux'; import { ENTITY_VERSION_V5 } from 'constants/app'; import { PANEL_TYPES } from 'constants/queryBuilder'; @@ -24,8 +25,8 @@ function LeftContainer({ setSelectedTracesFields, selectedWidget, requestData, - setRequestData, isLoadingPanelData, + setRequestData, setQueryResponse, enableDrillDown = false, }: WidgetGraphProps): JSX.Element { @@ -35,15 +36,20 @@ function LeftContainer({ AppState, GlobalReducer >((state) => state.globalTime); - const queryResponse = useGetQueryRange(requestData, ENTITY_VERSION_V5, { - enabled: !!stagedQuery, - queryKey: [ + const queryRangeKey = useMemo( + () => [ REACT_QUERY_KEY.GET_QUERY_RANGE, globalSelectedInterval, requestData, minTime, maxTime, ], + [globalSelectedInterval, requestData, minTime, maxTime], + ); + const queryResponse = useGetQueryRange(requestData, ENTITY_VERSION_V5, { + enabled: !!stagedQuery, + queryKey: queryRangeKey, + keepPreviousData: true, }); // Update parent component with query response for legend colors @@ -64,7 +70,11 @@ function LeftContainer({ enableDrillDown={enableDrillDown} /> - + {selectedGraph === PANEL_TYPES.LIST && ( void; onStageRunQuery?: () => void; + queryRangeKey?: QueryKey; } function RunQueryBtn({ + className, label, isLoadingQueries, handleCancelQuery, onStageRunQuery, + queryRangeKey, }: RunQueryBtnProps): JSX.Element { const isMac = getUserOperatingSystem() === UserOperatingSystem.MACOS; - return isLoadingQueries ? ( + const queryClient = useQueryClient(); + const isKeyFetchingCount = useIsFetching( + queryRangeKey as QueryKey | undefined, + ); + const isLoading = + typeof isLoadingQueries === 'boolean' + ? isLoadingQueries + : isKeyFetchingCount > 0; + + const onCancel = useCallback(() => { + if (handleCancelQuery) { + return handleCancelQuery(); + } + if (queryRangeKey) { + queryClient.cancelQueries(queryRangeKey); + } + }, [handleCancelQuery, queryClient, queryRangeKey]); + + return isLoading ? ( ) : (