diff --git a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx b/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx index ff42033a5a7a..fc60d673b3ba 100644 --- a/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx +++ b/frontend/src/components/QueryBuilderV2/Logs/LogsQB.tsx @@ -1,171 +1,79 @@ import './LogsQB.styles.scss'; -import { Button, Dropdown } from 'antd'; import { ENTITY_VERSION_V4 } from 'constants/app'; -import QBEntityOptions from 'container/QueryBuilder/components/QBEntityOptions/QBEntityOptions'; -import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; +import { Formula } from 'container/QueryBuilder/components/Formula/Formula'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; -import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; -import { Copy, Ellipsis, Plus, Sigma, Trash } from 'lucide-react'; -import { memo, useCallback, useState } from 'react'; -import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; +import { memo } from 'react'; import { DataSource } from 'types/common/queryBuilder'; -import QueryAddOns from '../QueryAddOns/QueryAddOns'; -import QueryAggregation from '../QueryAggregation/QueryAggregation'; -import QuerySearch from '../QuerySearch/QuerySearch'; -import { Formula } from 'container/QueryBuilder/components/Formula/Formula'; +import { QueryBuilderV2Props } from '../QueryBuilderV2'; +import QueryFooter from '../QueryV2/QueryFooter/QueryFooter'; +import { QueryV2 } from '../QueryV2/QueryV2'; export const LogsQB = memo(function LogsQB({ - query, filterConfigs, -}: { - query: IBuilderQuery; - filterConfigs: QueryBuilderProps['filterConfigs']; -}): JSX.Element { - const showFunctions = query?.functions?.length > 0; +}: QueryBuilderV2Props): JSX.Element { const version = ENTITY_VERSION_V4; - const { - currentQuery, - cloneQuery, - addNewFormula, - addNewBuilderQuery, - } = useQueryBuilder(); - - const [isCollapsed, setIsCollapsed] = useState(false); - - console.log('isCollapsed', isCollapsed); - - const isListViewPanel = false; - const index = 0; - - const { - isMetricsDataSource, - handleChangeQueryData, - handleDeleteQuery, - handleQueryFunctionsUpdates, - } = useQueryOperations({ - index, - query, - filterConfigs, - isListViewPanel, - entityVersion: version, - }); - - const handleToggleDisableQuery = useCallback(() => { - handleChangeQueryData('disabled', !query.disabled); - }, [handleChangeQueryData, query]); - - const handleToggleCollapsQuery = (): void => { - setIsCollapsed(!isCollapsed); - }; + const { currentQuery, addNewFormula, addNewBuilderQuery } = useQueryBuilder(); return (
-
-
-
-
- 1} - isListViewPanel={isListViewPanel} - index={index} - /> -
+ {currentQuery.builder.queryData.map((query, index) => ( + + ))} - , - }, - { - label: 'Delete', - key: 'delete-query', - icon: , - }, - ], - }} - placement="bottomRight" - > - - -
+ {currentQuery.builder.queryFormulas.length > 0 && ( +
+ {currentQuery.builder.queryFormulas.map((formula, index) => { + const query = + currentQuery.builder.queryData[index] || + currentQuery.builder.queryData[0]; + + return ( +
+ +
+ ); + })}
+ )} -
- - - -
-
- -
- {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 index 160f1997762b..f226ebf9c65a 100644 --- a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss +++ b/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.styles.scss @@ -1,5 +1,19 @@ .metrics-qb { display: flex; - flex-direction: column; + 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 index 6ba75f91737f..ee80b6715678 100644 --- a/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx +++ b/frontend/src/components/QueryBuilderV2/Metrics/MetricsQB.tsx @@ -1,19 +1,87 @@ import './MetricsQB.styles.scss'; -import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; +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 QueryAddOns from '../QueryAddOns/QueryAddOns'; -import QuerySearch from '../QuerySearch/QuerySearch'; -import MetricsAggregateSection from './MerticsAggregateSection/MetricsAggregateSection'; -import { MetricsSelect } from './MetricsSelect/MetricsSelect'; +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); -function MetricsQB({ query }: { query: IBuilderQuery }): JSX.Element { 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/QueryBuilderV2.styles.scss b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss index ddf40b3ce0ce..f10e43621897 100644 --- a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss +++ b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.styles.scss @@ -59,7 +59,8 @@ .code-mirror-where-clause, .query-aggregation-container, - .query-add-ons { + .query-add-ons, + .metrics-aggregation-section-content { position: relative; &::before { @@ -98,9 +99,58 @@ gap: 8px; width: 44px; - padding-left: 8px; + padding: 8px; border-left: 1px solid var(--bg-slate-400); + + .query-name { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 10px; + + padding: 4px; + + border-radius: 0px 2px 2px 0px; + + border-radius: 2px; + border: 1px solid rgba(242, 71, 105, 0.2); + background: rgba(242, 71, 105, 0.1); + + color: var(--Sakura-400, #f56c87); + font-family: 'Space Mono'; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 16px; /* 128.571% */ + text-transform: uppercase; + } + + .formula-name { + display: flex; + + flex-direction: column; + justify-content: center; + align-items: center; + gap: 10px; + + padding: 4px; + + border-radius: 0px 2px 2px 0px; + + border-radius: 2px; + border: 1px solid rgba(173, 127, 88, 0.2); + background: rgba(173, 127, 88, 0.1); + + color: var(--Sienna-500, #ad7f58); + font-family: 'Space Mono'; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 16px; /* 128.571% */ + text-transform: uppercase; + } } .qb-formulas-container { @@ -159,6 +209,12 @@ border-bottom-left-radius: 0px !important; border-bottom-right-radius: 0px !important; + font-family: 'Space Mono'; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 16px; /* 128.571% */ + resize: none; } @@ -222,7 +278,7 @@ gap: 8px; .options { - .query-name.sync-btn { + .query-name { border-radius: 0px 2px 2px 0px !important; border: 1px solid rgba(242, 71, 105, 0.2) !important; background: rgba(242, 71, 105, 0.1) !important; @@ -256,11 +312,10 @@ } .formula-name { - border-radius: 0px 2px 2px 0px !important; - border: 1px solid rgba(242, 71, 105, 0.2) !important; - background: rgba(242, 71, 105, 0.1) !important; + border-radius: 0px 2px 2px 0px; + border: 1px solid rgba(173, 127, 88, 0.2); + background: rgba(173, 127, 88, 0.1); - color: var(--Sakura-400, #f56c87) !important; font-family: 'Space Mono'; font-size: 14px; font-style: normal; @@ -270,7 +325,7 @@ &::before { content: ''; - height: 80px; + height: 65px; content: ''; position: absolute; left: 0; @@ -289,4 +344,37 @@ } } } + + .qb-search-container { + .metrics-select-container { + margin-bottom: 12px; + } + } + + .qb-search-filter-container { + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + + .ant-select { + height: auto; + } + + .ant-select-selector { + border-radius: 2px; + border: 1px solid var(--Slate-400, #1d212d) !important; + background: var(--Ink-300, #16181d) !important; + height: 34px !important; + box-sizing: border-box !important; + } + + .ant-select-arrow { + color: var(--bg-vanilla-400) !important; + } + } + + .query-actions-dropdown { + cursor: pointer; + } } diff --git a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx index 21020f61db78..b06c7310b380 100644 --- a/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryBuilderV2.tsx @@ -1,9 +1,8 @@ import './QueryBuilderV2.styles.scss'; -import { OPERATORS } from 'constants/queryBuilder'; +import { OPERATORS, PANEL_TYPES } from 'constants/queryBuilder'; import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; -import { useMemo } from 'react'; -import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; +import { memo, useMemo } from 'react'; import { DataSource } from 'types/common/queryBuilder'; import { LogsQB } from './Logs/LogsQB'; @@ -11,14 +10,20 @@ import MetricsQB from './Metrics/MetricsQB'; import { QueryBuilderV2Provider } from './QueryBuilderV2Context'; import TracesQB from './Traces/TracesQB'; -type QueryBuilderV2Props = { +export type QueryBuilderV2Props = { source: DataSource; - query: IBuilderQuery; + panelType: PANEL_TYPES; + filterConfigs: QueryBuilderProps['filterConfigs']; + isListViewPanel: boolean; + version: string; }; -function QueryBuilderV2Main({ +const QueryBuilderV2Main = memo(function QueryBuilderV2Main({ source, - query, + panelType, + filterConfigs, + isListViewPanel, + version, }: QueryBuilderV2Props): JSX.Element { const isMetricsDataSource = source === DataSource.METRICS; const isLogsDataSource = source === DataSource.LOGS; @@ -53,28 +58,49 @@ function QueryBuilderV2Main({ return (
- {isMetricsDataSource ? : null} - {isLogsDataSource ? ( - + ) : null} + {isLogsDataSource ? ( + + ) : null} + {isTracesDataSource ? ( + ) : null} - {isTracesDataSource ? : null}
); -} +}); function QueryBuilderV2(props: QueryBuilderV2Props): JSX.Element { - const { source, query } = props; + const { source, panelType, filterConfigs, isListViewPanel, version } = props; return ( - + ); } diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MerticsAggregateSection/MetricsAggregateSection.styles.scss b/frontend/src/components/QueryBuilderV2/QueryV2/MerticsAggregateSection/MetricsAggregateSection.styles.scss similarity index 99% rename from frontend/src/components/QueryBuilderV2/Metrics/MerticsAggregateSection/MetricsAggregateSection.styles.scss rename to frontend/src/components/QueryBuilderV2/QueryV2/MerticsAggregateSection/MetricsAggregateSection.styles.scss index 25995359edd6..d33a667e1c48 100644 --- a/frontend/src/components/QueryBuilderV2/Metrics/MerticsAggregateSection/MetricsAggregateSection.styles.scss +++ b/frontend/src/components/QueryBuilderV2/QueryV2/MerticsAggregateSection/MetricsAggregateSection.styles.scss @@ -7,7 +7,7 @@ .metrics-time-aggregation-section { display: flex; flex-direction: column; - gap: 4px; + gap: 12px; .metrics-time-aggregation-section-title { display: flex; diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MerticsAggregateSection/MetricsAggregateSection.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/MerticsAggregateSection/MetricsAggregateSection.tsx similarity index 100% rename from frontend/src/components/QueryBuilderV2/Metrics/MerticsAggregateSection/MetricsAggregateSection.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/MerticsAggregateSection/MetricsAggregateSection.tsx diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MetricsSelect/MetricsSelect.styles.scss b/frontend/src/components/QueryBuilderV2/QueryV2/MetricsSelect/MetricsSelect.styles.scss similarity index 100% rename from frontend/src/components/QueryBuilderV2/Metrics/MetricsSelect/MetricsSelect.styles.scss rename to frontend/src/components/QueryBuilderV2/QueryV2/MetricsSelect/MetricsSelect.styles.scss diff --git a/frontend/src/components/QueryBuilderV2/Metrics/MetricsSelect/MetricsSelect.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/MetricsSelect/MetricsSelect.tsx similarity index 100% rename from frontend/src/components/QueryBuilderV2/Metrics/MetricsSelect/MetricsSelect.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/MetricsSelect/MetricsSelect.tsx diff --git a/frontend/src/components/QueryBuilderV2/QueryAddOns/HavingFilter/HavingFilter.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/HavingFilter/HavingFilter.tsx similarity index 98% rename from frontend/src/components/QueryBuilderV2/QueryAddOns/HavingFilter/HavingFilter.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/HavingFilter/HavingFilter.tsx index 5e345c321ce6..f35c459dd86b 100644 --- a/frontend/src/components/QueryBuilderV2/QueryAddOns/HavingFilter/HavingFilter.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/HavingFilter/HavingFilter.tsx @@ -1,3 +1,4 @@ +/* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable sonarjs/cognitive-complexity */ import { autocompletion, diff --git a/frontend/src/components/QueryBuilderV2/QueryAddOns/QueryAddOns.styles.scss b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/QueryAddOns.styles.scss similarity index 100% rename from frontend/src/components/QueryBuilderV2/QueryAddOns/QueryAddOns.styles.scss rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/QueryAddOns.styles.scss diff --git a/frontend/src/components/QueryBuilderV2/QueryAddOns/QueryAddOns.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/QueryAddOns.tsx similarity index 93% rename from frontend/src/components/QueryBuilderV2/QueryAddOns/QueryAddOns.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/QueryAddOns.tsx index d601768b07a6..3ccfb5f34c9d 100644 --- a/frontend/src/components/QueryBuilderV2/QueryAddOns/QueryAddOns.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAddOns/QueryAddOns.tsx @@ -122,20 +122,25 @@ function QueryAddOns({ )} {selectedViews.find((view) => view.key === 'having') && (
- { - setSelectedViews( - selectedViews.filter((view) => view.key !== 'having'), - ); - }} - /> +
+
Having
+
+ { + setSelectedViews( + selectedViews.filter((view) => view.key !== 'having'), + ); + }} + /> +
+
)} {selectedViews.find((view) => view.key === 'limit') && (
{ setSelectedViews(selectedViews.filter((view) => view.key !== 'limit')); }} @@ -165,7 +170,7 @@ function QueryAddOns({ {selectedViews.find((view) => view.key === 'legend_format') && (
{ setSelectedViews( diff --git a/frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregation.styles.scss b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregation.styles.scss similarity index 100% rename from frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregation.styles.scss rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregation.styles.scss diff --git a/frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregation.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregation.tsx similarity index 100% rename from frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregation.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregation.tsx diff --git a/frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregationSelect.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregationSelect.tsx similarity index 99% rename from frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregationSelect.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregationSelect.tsx index 62a294b6f7d8..3d836df650e0 100644 --- a/frontend/src/components/QueryBuilderV2/QueryAggregation/QueryAggregationSelect.tsx +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryAggregation/QueryAggregationSelect.tsx @@ -33,7 +33,7 @@ import { useQuery } from 'react-query'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { TracesAggregatorOperator } from 'types/common/queryBuilder'; -import { useQueryBuilderV2Context } from '../QueryBuilderV2Context'; +import { useQueryBuilderV2Context } from '../../QueryBuilderV2Context'; const chipDecoration = Decoration.mark({ class: 'chip-decorator', diff --git a/frontend/src/components/QueryBuilderV2/QueryV2/QueryFooter/QueryFooter.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryFooter/QueryFooter.tsx new file mode 100644 index 000000000000..7a57db00bb43 --- /dev/null +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryFooter/QueryFooter.tsx @@ -0,0 +1,35 @@ +import { Button } from 'antd'; +import { Plus, Sigma } from 'lucide-react'; + +export default function QueryFooter({ + addNewBuilderQuery, + addNewFormula, +}: { + addNewBuilderQuery: () => void; + addNewFormula: () => void; +}): JSX.Element { + return ( +
+
+
+
+ +
+ +
+
+
+ ); +} diff --git a/frontend/src/components/QueryBuilderV2/QuerySearch/QuerySearch.styles.scss b/frontend/src/components/QueryBuilderV2/QueryV2/QuerySearch/QuerySearch.styles.scss similarity index 100% rename from frontend/src/components/QueryBuilderV2/QuerySearch/QuerySearch.styles.scss rename to frontend/src/components/QueryBuilderV2/QueryV2/QuerySearch/QuerySearch.styles.scss diff --git a/frontend/src/components/QueryBuilderV2/QuerySearch/QuerySearch.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QuerySearch/QuerySearch.tsx similarity index 100% rename from frontend/src/components/QueryBuilderV2/QuerySearch/QuerySearch.tsx rename to frontend/src/components/QueryBuilderV2/QueryV2/QuerySearch/QuerySearch.tsx diff --git a/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx b/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx new file mode 100644 index 000000000000..05a1e0bbde0c --- /dev/null +++ b/frontend/src/components/QueryBuilderV2/QueryV2/QueryV2.tsx @@ -0,0 +1,143 @@ +import { Dropdown } from 'antd'; +import { ENTITY_VERSION_V4 } from 'constants/app'; +import QBEntityOptions from 'container/QueryBuilder/components/QBEntityOptions/QBEntityOptions'; +import { QueryProps } from 'container/QueryBuilder/components/Query/Query.interfaces'; +import SpanScopeSelector from 'container/QueryBuilder/filters/QueryBuilderSearchV2/SpanScopeSelector'; +import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; +import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations'; +import { Copy, Ellipsis, Trash } from 'lucide-react'; +import { memo, useCallback, useState } from 'react'; +import { DataSource } from 'types/common/queryBuilder'; + +import MetricsAggregateSection from './MerticsAggregateSection/MetricsAggregateSection'; +import { MetricsSelect } from './MetricsSelect/MetricsSelect'; +import QueryAddOns from './QueryAddOns/QueryAddOns'; +import QueryAggregation from './QueryAggregation/QueryAggregation'; +import QuerySearch from './QuerySearch/QuerySearch'; + +export const QueryV2 = memo(function QueryV2({ + index, + query, + filterConfigs, + isListViewPanel = false, + version, + showSpanScopeSelector = false, + source, +}: QueryProps & { source: DataSource }): JSX.Element { + const { cloneQuery } = useQueryBuilder(); + + const showFunctions = query?.functions?.length > 0; + + const [isCollapsed, setIsCollapsed] = useState(false); + + const { + handleChangeQueryData, + handleDeleteQuery, + handleQueryFunctionsUpdates, + } = useQueryOperations({ + index, + query, + filterConfigs, + isListViewPanel, + entityVersion: version, + }); + + const handleToggleDisableQuery = useCallback(() => { + handleChangeQueryData('disabled', !query.disabled); + }, [handleChangeQueryData, query]); + + const handleToggleCollapsQuery = (): void => { + setIsCollapsed(!isCollapsed); + }; + + const handleCloneEntity = (): void => { + cloneQuery('query', query); + }; + + return ( +
+
+
+
+
+ +
+ + , + onClick: handleCloneEntity, + }, + { + label: 'Delete', + key: 'delete-query', + icon: , + onClick: handleDeleteQuery, + }, + ], + }} + placement="bottomRight" + > + + +
+
+ +
+
+ {source === DataSource.METRICS && ( +
+ +
+ )} + +
+ + + {showSpanScopeSelector && ( + <> +
in
+ + + )} +
+
+ + + + {source === DataSource.METRICS && ( + + )} + + +
+
+
+ ); +}); diff --git a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss index 4c434ad92416..c6fb331e2383 100644 --- a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss +++ b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.styles.scss @@ -1,28 +1,5 @@ .traces-qb { display: flex; - flex-direction: column; + flex-direction: row; gap: 8px; - - .traces-search-filter-container { - display: flex; - flex-direction: row; - align-items: center; - gap: 8px; - - .ant-select { - height: auto; - } - - .ant-select-selector { - border-radius: 2px; - border: 1px solid var(--Slate-400, #1d212d) !important; - background: var(--Ink-300, #16181d) !important; - height: 34px !important; - box-sizing: border-box !important; - } - - .ant-select-arrow { - color: var(--bg-vanilla-400) !important; - } - } } diff --git a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx index 7c896af6002a..aad17e6f1f38 100644 --- a/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx +++ b/frontend/src/components/QueryBuilderV2/Traces/TracesQB.tsx @@ -1,23 +1,86 @@ import './TracesQB.styles.scss'; -import SpanScopeSelector from 'container/QueryBuilder/filters/QueryBuilderSearchV2/SpanScopeSelector'; -import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; +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 QueryAddOns from '../QueryAddOns/QueryAddOns'; -import QueryAggregation from '../QueryAggregation/QueryAggregation'; -import QuerySearch from '../QuerySearch/QuerySearch'; +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, + }); -function TracesQB({ query }: { query: IBuilderQuery }): JSX.Element { return (
-
- -
in
- +
+ {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/container/LogExplorerQuerySection/index.tsx b/frontend/src/container/LogExplorerQuerySection/index.tsx index 86d1b8dc5ef0..b0b58105e075 100644 --- a/frontend/src/container/LogExplorerQuerySection/index.tsx +++ b/frontend/src/container/LogExplorerQuerySection/index.tsx @@ -110,7 +110,13 @@ function LogExplorerQuerySection({ )} {selectedView === SELECTED_VIEWS.QUERY_BUILDER_V2 && ( - + )} ); diff --git a/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss b/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss index 8ce4a59a116a..9a3baa1b8086 100644 --- a/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss +++ b/frontend/src/container/MetricsExplorer/Explorer/Explorer.styles.scss @@ -6,6 +6,7 @@ align-items: center; justify-content: space-between; margin: 10px 0; + padding: 0 1rem; .explore-header-left-actions { display: flex; diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx index c52a423b90f3..03aecd986d7e 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx @@ -1,9 +1,10 @@ import './QuerySection.styles.scss'; import { Color } from '@signozhq/design-tokens'; -import { Button, Tabs, Typography } from 'antd'; +import { Button, Select, Tabs, Typography } from 'antd'; import logEvent from 'api/common/logEvent'; import PromQLIcon from 'assets/Dashboard/PromQl'; +import QueryBuilderV2 from 'components/QueryBuilderV2/QueryBuilderV2'; import TextToolTip from 'components/TextToolTip'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { QBShortcuts } from 'constants/shortcuts/QBShortcuts'; @@ -11,7 +12,7 @@ import { getDefaultWidgetData, PANEL_TYPE_TO_QUERY_TYPES, } from 'container/NewWidget/utils'; -import { QueryBuilder } from 'container/QueryBuilder'; +// import { QueryBuilder } from 'container/QueryBuilder'; import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; import { useKeyboardHotkeys } from 'hooks/hotkeys/useKeyboardHotkeys'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; @@ -26,13 +27,14 @@ import { getPreviousWidgets, getSelectedWidgetIndex, } from 'providers/Dashboard/util'; -import { useCallback, useEffect, useMemo } from 'react'; +import { useCallback, useEffect, useMemo, useState } 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'; @@ -47,6 +49,10 @@ function QuerySection({ const { selectedDashboard, setSelectedDashboard } = useDashboard(); + const [selectedDataSource, setSelectedDataSource] = useState( + DataSource.METRICS, + ); + const isDarkMode = useIsDarkMode(); const { widgets } = selectedDashboard?.data || {}; @@ -150,12 +156,23 @@ function QuerySection({ icon: , label: 'Query Builder', component: ( - +
+