From bde078472b3d75c52cf703294ec373f98177d65a Mon Sep 17 00:00:00 2001 From: Yunus M Date: Wed, 4 Jun 2025 16:37:18 +0530 Subject: [PATCH] feat: update explorer views --- .../QueryBuilderV2/Logs/LogsQB.styles.scss | 5 - .../components/QueryBuilderV2/Logs/LogsQB.tsx | 79 ------- .../Metrics/MetricsQB.styles.scss | 19 -- .../QueryBuilderV2/Metrics/MetricsQB.tsx | 89 -------- .../QueryBuilderV2/QueryBuilderV2.styles.scss | 23 +- .../QueryBuilderV2/QueryBuilderV2.tsx | 193 +++++++++-------- .../QueryBuilderV2/QueryV2/QueryV2.tsx | 19 +- .../Traces/TracesQB.styles.scss | 5 - .../QueryBuilderV2/Traces/TracesQB.tsx | 88 -------- .../LogExplorerQuerySection/index.tsx | 28 +-- .../LogsExplorerViews.styles.scss | 59 ++++- .../src/container/LogsExplorerViews/index.tsx | 204 ++++++++---------- .../tests/LogsExplorerViews.test.tsx | 8 +- .../Explorer/Explorer.styles.scss | 4 +- .../MetricsExplorer/Explorer/Explorer.tsx | 16 +- .../LeftContainer/QuerySection/index.tsx | 28 +-- .../QBEntityOptions/QBEntityOptions.tsx | 23 ++ .../QueryBuilder/components/Query/Query.tsx | 1 + .../ToolbarActions/LeftToolbarActions.tsx | 162 +++++++------- .../ToolbarActions/ToolbarActions.styles.scss | 7 +- .../tests/ToolbarActions.test.tsx | 11 +- .../TimeSeriesView/TimeSeriesView.styles.scss | 11 + .../TimeSeriesView/TimeSeriesView.tsx | 6 +- .../src/container/TimeSeriesView/index.tsx | 2 + .../ListView/ListView.styles.scss | 4 + .../TracesExplorer/ListView/index.tsx | 16 +- .../TracesExplorer/QuerySection/index.tsx | 52 +++-- .../src/hooks/useHandleExplorerTabChange.ts | 2 + frontend/src/pages/LogsExplorer/index.tsx | 126 +++++------ frontend/src/pages/LogsExplorer/utils.tsx | 9 +- .../TracesExplorer/Filter/Filter.styles.scss | 17 +- .../TracesExplorer/TracesExplorer.styles.scss | 44 +++- frontend/src/pages/TracesExplorer/index.tsx | 169 ++++++++++----- 33 files changed, 719 insertions(+), 810 deletions(-) delete mode 100644 frontend/src/components/QueryBuilderV2/Logs/LogsQB.styles.scss delete mode 100644 frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx delete mode 100644 frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss delete mode 100644 frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx delete mode 100644 frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss delete mode 100644 frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx create mode 100644 frontend/src/container/TracesExplorer/ListView/ListView.styles.scss diff --git a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.styles.scss b/frontend/src/components/QueryBuilderV2/Logs/LogsQB.styles.scss deleted file mode 100644 index cbfe3e8d28b6..000000000000 --- a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.styles.scss +++ /dev/null @@ -1,5 +0,0 @@ -.logs-qb { - display: flex; - flex-direction: row; - gap: 8px; -} diff --git a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx b/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx deleted file mode 100644 index fc60d673b3ba..000000000000 --- a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import './LogsQB.styles.scss'; - -import { ENTITY_VERSION_V4 } from 'constants/app'; -import { Formula } from 'container/QueryBuilder/components/Formula/Formula'; -import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; -import { memo } from 'react'; -import { DataSource } from 'types/common/queryBuilder'; - -import { QueryBuilderV2Props } from '../QueryBuilderV2'; -import QueryFooter from '../QueryV2/QueryFooter/QueryFooter'; -import { QueryV2 } from '../QueryV2/QueryV2'; - -export const LogsQB = memo(function LogsQB({ - filterConfigs, -}: QueryBuilderV2Props): JSX.Element { - const version = ENTITY_VERSION_V4; - - const { currentQuery, addNewFormula, addNewBuilderQuery } = useQueryBuilder(); - - return ( -
-
- {currentQuery.builder.queryData.map((query, index) => ( - - ))} - - {currentQuery.builder.queryFormulas.length > 0 && ( -
- {currentQuery.builder.queryFormulas.map((formula, index) => { - const query = - currentQuery.builder.queryData[index] || - currentQuery.builder.queryData[0]; - - return ( -
- -
- ); - })} -
- )} - - -
- -
- {currentQuery.builder.queryData.map((query) => ( -
- {query.queryName} -
- ))} - - {currentQuery.builder.queryFormulas.map((formula) => ( -
- {formula.queryName} -
- ))} -
-
- ); -}); diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss b/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss deleted file mode 100644 index f226ebf9c65a..000000000000 --- a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss +++ /dev/null @@ -1,19 +0,0 @@ -.metrics-qb { - display: flex; - flex-direction: row; - gap: 8px; - - border-bottom: 1px solid var(--Slate-400, #1d212d); - - .query-v2 { - .qb-entity-options { - .options { - .query-name { - &::before { - height: 306px !important; - } - } - } - } - } -} diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx b/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx deleted file mode 100644 index ee80b6715678..000000000000 --- a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import './MetricsQB.styles.scss'; - -import { ENTITY_VERSION_V4 } from 'constants/app'; -import { Formula } from 'container/QueryBuilder/components/Formula/Formula'; -import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; -import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; -import { DataSource } from 'types/common/queryBuilder'; - -import { QueryBuilderV2Props } from '../QueryBuilderV2'; -import QueryFooter from '../QueryV2/QueryFooter/QueryFooter'; -import { QueryV2 } from '../QueryV2/QueryV2'; - -function MetricsQB({ filterConfigs }: QueryBuilderV2Props): JSX.Element { - const version = ENTITY_VERSION_V4; - - const { currentQuery, addNewFormula, addNewBuilderQuery } = useQueryBuilder(); - - const { isMetricsDataSource } = useQueryOperations({ - index: 0, - query: currentQuery.builder.queryData[0], - filterConfigs, - isListViewPanel: false, - entityVersion: version, - }); - - console.log('isMetricsDataSource', isMetricsDataSource); - - return ( -
-
- {currentQuery.builder.queryData.map((query, index) => ( - - ))} - - {currentQuery.builder.queryFormulas.length > 0 && ( -
- {currentQuery.builder.queryFormulas.map((formula, index) => { - const query = - currentQuery.builder.queryData[index] || - currentQuery.builder.queryData[0]; - - return ( -
- -
- ); - })} -
- )} - - -
- -
- {currentQuery.builder.queryData.map((query) => ( -
- {query.queryName} -
- ))} - - {currentQuery.builder.queryFormulas.map((formula) => ( -
- {formula.queryName} -
- ))} -
-
- ); -} - -export default MetricsQB; diff --git a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss index f10e43621897..5cff9d7006d4 100644 --- a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss +++ b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss @@ -1,13 +1,10 @@ .query-builder-v2 { display: flex; - flex-direction: column; - gap: 1rem; + flex-direction: row; + gap: 4px; width: 100%; - height: 100%; - display: flex; - flex-direction: column; - gap: 4px; + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif; @@ -160,6 +157,7 @@ margin-left: 32px; padding-bottom: 16px; + padding-left: 8px; .qb-formula { .ant-row { @@ -343,6 +341,19 @@ } } } + + .query-data-source { + margin-left: 8px; + + .ant-select-selector { + min-width: 120px; + + border-radius: 2px; + border: 1px solid var(--Slate-400, #1d212d); + background: var(--Ink-300, #16181d); + box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); + } + } } .qb-search-container { diff --git a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx index b06c7310b380..c2b6b7c738c2 100644 --- a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx @@ -1,108 +1,119 @@ import './QueryBuilderV2.styles.scss'; -import { OPERATORS, PANEL_TYPES } from 'constants/queryBuilder'; +import { PANEL_TYPES } from 'constants/queryBuilder'; +import { Formula } from 'container/QueryBuilder/components/Formula'; import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; -import { memo, useMemo } from 'react'; +import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; +import { memo, useEffect, useMemo } from 'react'; import { DataSource } from 'types/common/queryBuilder'; -import { LogsQB } from './Logs/LogsQB'; -import MetricsQB from './Metrics/MetricsQB'; import { QueryBuilderV2Provider } from './QueryBuilderV2Context'; -import TracesQB from './Traces/TracesQB'; +import QueryFooter from './QueryV2/QueryFooter/QueryFooter'; +import { QueryV2 } from './QueryV2/QueryV2'; -export type QueryBuilderV2Props = { - source: DataSource; - panelType: PANEL_TYPES; - filterConfigs: QueryBuilderProps['filterConfigs']; - isListViewPanel: boolean; - version: string; -}; - -const QueryBuilderV2Main = memo(function QueryBuilderV2Main({ - source, - panelType, - filterConfigs, - isListViewPanel, +export const QueryBuilderV2 = memo(function QueryBuilderV2({ + config, + panelType: newPanelType, + filterConfigs = {}, + queryComponents, + isListViewPanel = false, + showFunctions = false, version, -}: QueryBuilderV2Props): JSX.Element { - const isMetricsDataSource = source === DataSource.METRICS; - const isLogsDataSource = source === DataSource.LOGS; - const isTracesDataSource = source === DataSource.TRACES; +}: QueryBuilderProps): JSX.Element { + const { + currentQuery, + addNewBuilderQuery, + addNewFormula, + handleSetConfig, + panelType, + initialDataSource, + } = useQueryBuilder(); - const listViewLogFilterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => { - const config: QueryBuilderProps['filterConfigs'] = { - stepInterval: { isHidden: true, isDisabled: true }, - having: { isHidden: true, isDisabled: true }, - filters: { - customKey: 'body', - customOp: OPERATORS.CONTAINS, - }, - }; + console.log('isListViewPanel', isListViewPanel, showFunctions); - return config; - }, []); - - const listViewTracesFilterConfigs: QueryBuilderProps['filterConfigs'] = useMemo(() => { - const config: QueryBuilderProps['filterConfigs'] = { - stepInterval: { isHidden: true, isDisabled: true }, - having: { isHidden: true, isDisabled: true }, - limit: { isHidden: true, isDisabled: true }, - filters: { - customKey: 'body', - customOp: OPERATORS.CONTAINS, - }, - }; - - return config; - }, []); - - return ( -
- {isMetricsDataSource ? ( - - ) : null} - {isLogsDataSource ? ( - - ) : null} - {isTracesDataSource ? ( - - ) : null} -
+ const currentDataSource = useMemo( + () => + (config && config.queryVariant === 'static' && config.initialDataSource) || + null, + [config], ); -}); -function QueryBuilderV2(props: QueryBuilderV2Props): JSX.Element { - const { source, panelType, filterConfigs, isListViewPanel, version } = props; + useEffect(() => { + if (currentDataSource !== initialDataSource || newPanelType !== panelType) { + if (newPanelType === PANEL_TYPES.BAR) { + handleSetConfig(PANEL_TYPES.BAR, DataSource.METRICS); + return; + } + handleSetConfig(newPanelType, currentDataSource); + } + }, [ + handleSetConfig, + panelType, + initialDataSource, + currentDataSource, + newPanelType, + ]); return ( - +
+
+ {currentQuery.builder.queryData.map((query, index) => ( + + ))} + + {currentQuery.builder.queryFormulas.length > 0 && ( +
+ {currentQuery.builder.queryFormulas.map((formula, index) => { + const query = + currentQuery.builder.queryData[index] || + currentQuery.builder.queryData[0]; + + return ( +
+ +
+ ); + })} +
+ )} + + +
+ +
+ {currentQuery.builder.queryData.map((query) => ( +
+ {query.queryName} +
+ ))} + + {currentQuery.builder.queryFormulas.map((formula) => ( +
+ {formula.queryName} +
+ ))} +
+
); -} - -export default QueryBuilderV2; +}); diff --git a/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx index 05a1e0bbde0c..56d7c3e28b3a 100644 --- a/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx @@ -17,16 +17,20 @@ import QuerySearch from './QuerySearch/QuerySearch'; export const QueryV2 = memo(function QueryV2({ index, + queryVariant, query, filterConfigs, + queryComponents, isListViewPanel = false, version, showSpanScopeSelector = false, - source, -}: QueryProps & { source: DataSource }): JSX.Element { +}: QueryProps): JSX.Element { const { cloneQuery } = useQueryBuilder(); const showFunctions = query?.functions?.length > 0; + const { dataSource } = query; + + console.log('queryComponents', queryComponents); const [isCollapsed, setIsCollapsed] = useState(false); @@ -34,6 +38,7 @@ export const QueryV2 = memo(function QueryV2({ handleChangeQueryData, handleDeleteQuery, handleQueryFunctionsUpdates, + handleChangeDataSource, } = useQueryOperations({ index, query, @@ -61,7 +66,7 @@ export const QueryV2 = memo(function QueryV2({
@@ -111,7 +118,7 @@ export const QueryV2 = memo(function QueryV2({
- {source === DataSource.METRICS && ( + {dataSource === DataSource.METRICS && (
@@ -129,9 +136,9 @@ export const QueryV2 = memo(function QueryV2({
- + - {source === DataSource.METRICS && ( + {dataSource === DataSource.METRICS && ( )} diff --git a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss deleted file mode 100644 index c6fb331e2383..000000000000 --- a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss +++ /dev/null @@ -1,5 +0,0 @@ -.traces-qb { - display: flex; - flex-direction: row; - gap: 8px; -} diff --git a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx deleted file mode 100644 index aad17e6f1f38..000000000000 --- a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import './TracesQB.styles.scss'; - -import { ENTITY_VERSION_V4 } from 'constants/app'; -import { Formula } from 'container/QueryBuilder/components/Formula'; -import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; -import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; -import { DataSource } from 'types/common/queryBuilder'; - -import { QueryBuilderV2Props } from '../QueryBuilderV2'; -import QueryFooter from '../QueryV2/QueryFooter/QueryFooter'; -import { QueryV2 } from '../QueryV2/QueryV2'; - -function TracesQB({ filterConfigs }: QueryBuilderV2Props): JSX.Element { - const version = ENTITY_VERSION_V4; - - const { currentQuery, addNewFormula, addNewBuilderQuery } = useQueryBuilder(); - - const { isMetricsDataSource } = useQueryOperations({ - index: 0, - query: currentQuery.builder.queryData[0], - filterConfigs, - isListViewPanel: false, - entityVersion: version, - }); - - return ( -
-
- {currentQuery.builder.queryData.map((query, index) => ( - - ))} - - {currentQuery.builder.queryFormulas.length > 0 && ( -
- {currentQuery.builder.queryFormulas.map((formula, index) => { - const query = - currentQuery.builder.queryData[index] || - currentQuery.builder.queryData[0]; - - return ( -
- -
- ); - })} -
- )} - - -
- -
- {currentQuery.builder.queryData.map((query) => ( -
- {query.queryName} -
- ))} - - {currentQuery.builder.queryFormulas.map((formula) => ( -
- {formula.queryName} -
- ))} -
-
- ); -} - -export default TracesQB; diff --git a/frontend/src/container/LogExplorerQuerySection/index.tsx b/frontend/src/container/LogExplorerQuerySection/index.tsx index b0b58105e075..8b8418c745be 100644 --- a/frontend/src/container/LogExplorerQuerySection/index.tsx +++ b/frontend/src/container/LogExplorerQuerySection/index.tsx @@ -1,13 +1,12 @@ import './LogsExplorerQuerySection.styles.scss'; -import QueryBuilderV2 from 'components/QueryBuilderV2/QueryBuilderV2'; +import { QueryBuilderV2 } from 'components/QueryBuilderV2/QueryBuilderV2'; import { initialQueriesMap, OPERATORS, PANEL_TYPES, } from 'constants/queryBuilder'; import ExplorerOrderBy from 'container/ExplorerOrderBy'; -import { QueryBuilder } from 'container/QueryBuilder'; import { OrderByFilterProps } from 'container/QueryBuilder/filters/OrderByFilter/OrderByFilter.interfaces'; import QueryBuilderSearchV2 from 'container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2'; import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; @@ -16,8 +15,8 @@ import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl'; import { + ExplorerViews, prepareQueryWithDefaultTimestamp, - SELECTED_VIEWS, } from 'pages/LogsExplorer/utils'; import { memo, useCallback, useMemo } from 'react'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; @@ -26,7 +25,7 @@ import { DataSource } from 'types/common/queryBuilder'; function LogExplorerQuerySection({ selectedView, }: { - selectedView: SELECTED_VIEWS; + selectedView: ExplorerViews; }): JSX.Element { const { currentQuery, updateAllQueriesOperators } = useQueryBuilder(); @@ -89,7 +88,7 @@ function LogExplorerQuerySection({ return ( <> - {selectedView === SELECTED_VIEWS.SEARCH && ( + {selectedView === ExplorerViews.LIST && (
)} - {selectedView === SELECTED_VIEWS.QUERY_BUILDER && ( - )} - - {selectedView === SELECTED_VIEWS.QUERY_BUILDER_V2 && ( - - )} ); } diff --git a/frontend/src/container/LogsExplorerViews/LogsExplorerViews.styles.scss b/frontend/src/container/LogsExplorerViews/LogsExplorerViews.styles.scss index 633b39849e40..b81b327301d4 100644 --- a/frontend/src/container/LogsExplorerViews/LogsExplorerViews.styles.scss +++ b/frontend/src/container/LogsExplorerViews/LogsExplorerViews.styles.scss @@ -80,10 +80,54 @@ position: relative; } } + } + + .logs-actions-container { + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + + height: 40px; + padding: 4px 8px; + width: 100%; + + border-top: 1px solid var(--Slate-500, #161922); + border-bottom: 1px solid var(--Slate-500, #161922); + box-shadow: 0px 8px 6px 0px #0b0c0e; + + .tab-options { + display: flex; + flex: 1; + justify-content: space-between; + align-items: center; + + .tab-options-left { + display: flex; + align-items: center; + gap: 8px; + } + + .tab-options-right { + display: flex; + align-items: center; + gap: 8px; + } + + .frequency-chart-view-controller { + display: flex; + align-items: center; + gap: 8px; + } + } + .query-stats { display: flex; align-items: center; gap: 12px; + + align-self: flex-end; + .rows { color: var(--bg-vanilla-400); font-family: 'Geist Mono'; @@ -110,13 +154,6 @@ letter-spacing: 0.36px; } } - } - - .logs-actions-container { - display: flex; - justify-content: center; - align-items: center; - gap: 8px; .ant-btn { border: none; @@ -186,6 +223,14 @@ background: var(--bg-robin-400); } } + } + + .logs-actions-container { + .tab-options { + border-top: 1px solid var(--text-vanilla-300); + border-bottom: 1px solid var(--text-vanilla-300); + } + .query-stats { .rows { color: var(--bg-ink-400); diff --git a/frontend/src/container/LogsExplorerViews/index.tsx b/frontend/src/container/LogsExplorerViews/index.tsx index df278312995f..73dffb34150e 100644 --- a/frontend/src/container/LogsExplorerViews/index.tsx +++ b/frontend/src/container/LogsExplorerViews/index.tsx @@ -1,7 +1,7 @@ /* eslint-disable sonarjs/cognitive-complexity */ import './LogsExplorerViews.styles.scss'; -import { Button, Typography } from 'antd'; +import { Button, Switch, Typography } from 'antd'; import { getQueryStats, WsDataEvent } from 'api/common/getQueryStats'; import logEvent from 'api/common/logEvent'; import { getYAxisFormattedValue } from 'components/Graph/yAxisConfig'; @@ -47,7 +47,7 @@ import { set, } from 'lodash-es'; import { Sliders } from 'lucide-react'; -import { SELECTED_VIEWS } from 'pages/LogsExplorer/utils'; +import { ExplorerViews } from 'pages/LogsExplorer/utils'; import { useTimezone } from 'providers/Timezone'; import { memo, @@ -80,15 +80,13 @@ import { v4 } from 'uuid'; import QueryStatus from './QueryStatus'; -function LogsExplorerViews({ +function LogsExplorerViewsContainer({ selectedView, - showFrequencyChart, setIsLoadingQueries, listQueryKeyRef, chartQueryKeyRef, }: { - selectedView: SELECTED_VIEWS; - showFrequencyChart: boolean; + selectedView: ExplorerViews; setIsLoadingQueries: React.Dispatch>; // eslint-disable-next-line @typescript-eslint/no-explicit-any listQueryKeyRef: MutableRefObject; @@ -97,6 +95,7 @@ function LogsExplorerViews({ }): JSX.Element { const { safeNavigate } = useSafeNavigate(); const dispatch = useDispatch(); + const [showFrequencyChart, setShowFrequencyChart] = useState(true); // this is to respect the panel type present in the URL rather than defaulting it to list always. const panelTypes = useGetPanelTypesQueryParam(PANEL_TYPES.LIST); @@ -240,15 +239,6 @@ function LogsExplorerViews({ [currentQuery, selectedPanelType, updateAllQueriesOperators], ); - const handleModeChange = (panelType: PANEL_TYPES): void => { - if (selectedView === SELECTED_VIEWS.SEARCH) { - handleSetConfig(panelType, DataSource.LOGS); - } - - setShowFormatMenuItems(false); - handleExplorerTabChange(panelType); - }; - const { data: listChartData, isFetching: isFetchingListChartData, @@ -460,8 +450,7 @@ function LogsExplorerViews({ useEffect(() => { const shouldChangeView = - (isMultipleQueries || isGroupByExist) && - selectedView !== SELECTED_VIEWS.SEARCH; + (isMultipleQueries || isGroupByExist) && selectedView !== ExplorerViews.LIST; if (selectedPanelType === PANEL_TYPES.LIST && shouldChangeView) { handleExplorerTabChange(PANEL_TYPES.TIME_SERIES); @@ -481,11 +470,7 @@ function LogsExplorerViews({ ]); useEffect(() => { - if ( - selectedView && - selectedView === SELECTED_VIEWS.SEARCH && - handleSetConfig - ) { + if (selectedView && selectedView === ExplorerViews.LIST && handleSetConfig) { handleSetConfig(defaultTo(panelTypes, PANEL_TYPES.LIST), DataSource.LOGS); } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -651,111 +636,90 @@ function LogsExplorerViews({ return (
- {showFrequencyChart && ( - - )} -
-
- - - - - -
- {selectedPanelType === PANEL_TYPES.LIST && ( -
- -
-
+ + )} + + {(selectedPanelType === PANEL_TYPES.TIME_SERIES || + selectedPanelType === PANEL_TYPES.TABLE) && ( +
+ - {showFormatMenuItems && ( - + {queryStats?.read_rows && ( + + {getYAxisFormattedValue(queryStats.read_rows?.toString(), 'short')}{' '} + rows + + )} + + {queryStats?.elapsed_ms && ( + <> +
+ + {getYAxisFormattedValue(queryStats?.elapsed_ms?.toString(), 'ms')} + + )}
-
- )} - {(selectedPanelType === PANEL_TYPES.TIME_SERIES || - selectedPanelType === PANEL_TYPES.TABLE) && ( -
- - {queryStats?.read_rows && ( - - {getYAxisFormattedValue(queryStats.read_rows?.toString(), 'short')}{' '} - rows - - )} - {queryStats?.elapsed_ms && ( - <> -
- - {getYAxisFormattedValue(queryStats?.elapsed_ms?.toString(), 'ms')} - - - )} -
- )} + )} +
+ {selectedPanelType === PANEL_TYPES.LIST && showFrequencyChart && ( + + )} +
{selectedPanelType === PANEL_TYPES.LIST && ( > {}} listQueryKeyRef={{ current: {} }} chartQueryKeyRef={{ current: {} }} @@ -212,8 +211,7 @@ describe('LogsExplorerViews -', () => { {}} listQueryKeyRef={{ current: {} }} chartQueryKeyRef={{ current: {} }} diff --git a/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss b/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss index 9a3baa1b8086..d422aad7155b 100644 --- a/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss +++ b/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss @@ -5,7 +5,7 @@ display: flex; align-items: center; justify-content: space-between; - margin: 10px 0; + margin: 4px 0; padding: 0 1rem; .explore-header-left-actions { @@ -56,7 +56,7 @@ } .explore-content { - margin-top: 10px; + padding: 0 8px; .ant-space { margin-top: 10px; diff --git a/frontend/src/container/MetricsExplorer/Explorer/Explorer.tsx b/frontend/src/container/MetricsExplorer/Explorer/Explorer.tsx index 248c41499dff..42eb125c08fc 100644 --- a/frontend/src/container/MetricsExplorer/Explorer/Explorer.tsx +++ b/frontend/src/container/MetricsExplorer/Explorer/Explorer.tsx @@ -3,10 +3,11 @@ import './Explorer.styles.scss'; import * as Sentry from '@sentry/react'; import { Switch } from 'antd'; import logEvent from 'api/common/logEvent'; -import QueryBuilderV2 from 'components/QueryBuilderV2/QueryBuilderV2'; +import { QueryBuilderV2 } from 'components/QueryBuilderV2/QueryBuilderV2'; import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder'; import ExplorerOptionWrapper from 'container/ExplorerOptions/ExplorerOptionWrapper'; import RightToolbarActions from 'container/QueryBuilder/components/ToolbarActions/RightToolbarActions'; +import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; import DateTimeSelector from 'container/TopNav/DateTimeSelectionV2'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl'; @@ -102,6 +103,11 @@ function Explorer(): JSX.Element { }); }, []); + const queryComponents = useMemo( + (): QueryBuilderProps['queryComponents'] => ({}), + [], + ); + return ( }>
@@ -121,8 +127,12 @@ function Explorer(): JSX.Element {
{/* */} {/* TODO: Enable once we have resolved all related metrics issues */} {/* diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx index 03aecd986d7e..fd38a238bd44 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx @@ -1,10 +1,10 @@ import './QuerySection.styles.scss'; import { Color } from '@signozhq/design-tokens'; -import { Button, Select, Tabs, Typography } from 'antd'; +import { Button, Tabs, Typography } from 'antd'; import logEvent from 'api/common/logEvent'; import PromQLIcon from 'assets/Dashboard/PromQl'; -import QueryBuilderV2 from 'components/QueryBuilderV2/QueryBuilderV2'; +import { QueryBuilderV2 } from 'components/QueryBuilderV2/QueryBuilderV2'; import TextToolTip from 'components/TextToolTip'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { QBShortcuts } from 'constants/shortcuts/QBShortcuts'; @@ -27,14 +27,13 @@ import { getPreviousWidgets, getSelectedWidgetIndex, } from 'providers/Dashboard/util'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; import { UseQueryResult } from 'react-query'; import { SuccessResponse } from 'types/api'; import { Widgets } from 'types/api/dashboard/getAll'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { Query } from 'types/api/queryBuilder/queryBuilderData'; import { EQueryType } from 'types/common/dashboard'; -import { DataSource } from 'types/common/queryBuilder'; import ClickHouseQueryContainer from './QueryBuilder/clickHouse'; import PromQLQueryContainer from './QueryBuilder/promQL'; @@ -49,10 +48,6 @@ function QuerySection({ const { selectedDashboard, setSelectedDashboard } = useDashboard(); - const [selectedDataSource, setSelectedDataSource] = useState( - DataSource.METRICS, - ); - const isDarkMode = useIsDarkMode(); const { widgets } = selectedDashboard?.data || {}; @@ -148,6 +143,11 @@ function QuerySection({ return config; }, []); + const queryComponents = useMemo( + (): QueryBuilderProps['queryComponents'] => ({}), + [], + ); + const items = useMemo(() => { const supportedQueryTypes = PANEL_TYPE_TO_QUERY_TYPES[selectedGraph] || []; @@ -157,20 +157,12 @@ function QuerySection({ label: 'Query Builder', component: (
-