Skip to content

Commit 7f57a43

Browse files
committed
fix: move to separate component
1 parent cc1cd52 commit 7f57a43

File tree

3 files changed

+113
-83
lines changed

3 files changed

+113
-83
lines changed

src/components/QueriesActivityBar/QueriesActivityBar.tsx

Lines changed: 4 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {CirclePlay, Clock, Display, Person, Rocket} from '@gravity-ui/icons';
44
import {ArrowToggle, Button, Disclosure, Flex, Icon, Label, Text} from '@gravity-ui/uikit';
55
import {useHistory, useLocation} from 'react-router-dom';
66

7-
import {defaultDashboardConfig} from '../../containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/defaultDashboardConfig';
87
import {TenantTabsGroups, getTenantPath} from '../../containers/Tenant/TenantPages';
98
import {parseQuery} from '../../routes';
109
import {topQueriesApi} from '../../store/reducers/executeTopQueries/executeTopQueries';
@@ -13,10 +12,9 @@ import type {KeyValueRow} from '../../types/api/query';
1312
import {cn} from '../../utils/cn';
1413
import {useAutoRefreshInterval} from '../../utils/hooks';
1514
import type {TimeFrame} from '../../utils/timeframes';
16-
import {MetricChart} from '../MetricChart/MetricChart';
1715
import {chartApi} from '../MetricChart/reducer';
18-
import type {ChartDataStatus} from '../MetricChart/types';
1916

17+
import {QueriesActivityCharts} from './QueriesActivityCharts';
2018
import i18n from './i18n';
2119
import {calculateLatency, calculateQueriesPerSecond} from './utils';
2220

@@ -33,16 +31,8 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
3331
const location = useLocation();
3432
const [autoRefreshInterval] = useAutoRefreshInterval();
3533
const [expanded, setExpanded] = React.useState(false);
36-
const [queriesTimeFrame, setQueriesTimeFrame] = React.useState<TimeFrame>('1h');
37-
const [latenciesTimeFrame, setLatenciesTimeFrame] = React.useState<TimeFrame>('1h');
38-
const [areChartsHidden, setAreChartsHidden] = React.useState(true);
39-
40-
// Extract chart configurations from defaultDashboardConfig
41-
const queriesChartConfig = defaultDashboardConfig[0]; // Queries per second chart
42-
const latenciesChartConfig = defaultDashboardConfig[1]; // Transaction latencies chart
43-
44-
// Refetch data only if charts successfully loaded
45-
const shouldRefresh = areChartsHidden ? 0 : autoRefreshInterval;
34+
const [queriesTimeFrame] = React.useState<TimeFrame>('1h');
35+
const [latenciesTimeFrame] = React.useState<TimeFrame>('1h');
4636

4737
// Fetch running queries
4838
const {data: runningQueriesData} = topQueriesApi.useGetRunningQueriesQuery(
@@ -118,12 +108,6 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
118108
history.push(path);
119109
};
120110

121-
const handleChartDataStatusChange = React.useCallback((status: ChartDataStatus) => {
122-
if (status === 'success') {
123-
setAreChartsHidden(false);
124-
}
125-
}, []);
126-
127111
// Helper to format trend display
128112
const formatTrendValue = (val: number) => {
129113
if (val >= 1) {
@@ -135,14 +119,6 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
135119
}
136120
};
137121

138-
const handleQueriesTimeFrameChange = React.useCallback((newTimeFrame: TimeFrame) => {
139-
setQueriesTimeFrame(newTimeFrame);
140-
}, []);
141-
142-
const handleLatenciesTimeFrameChange = React.useCallback((newTimeFrame: TimeFrame) => {
143-
setLatenciesTimeFrame(newTimeFrame);
144-
}, []);
145-
146122
return (
147123
<div className={b({expanded})}>
148124
<Disclosure expanded={expanded} onUpdate={setExpanded} className={b('disclosure')}>
@@ -237,61 +213,7 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
237213
</div>
238214
</div>
239215
</Disclosure>
240-
241-
{/*
242-
WORKAROUND: Charts are rendered outside Disclosure component due to YAGR tooltip bug
243-
Issue: https://github.com/gravity-ui/yagr/issues/262
244-
245-
Problem: YAGR tooltips don't work when charts are mounted inside collapsible containers
246-
that use CSS transforms or have complex nested DOM structures. The tooltip initialization
247-
fails when the chart is not immediately visible during mounting.
248-
249-
TODO: Remove this workaround once the upstream issue is fixed
250-
*/}
251-
{expanded && (
252-
<div
253-
className={b('charts')}
254-
style={{display: areChartsHidden ? 'none' : undefined}}
255-
>
256-
<div className={b('chart-container')}>
257-
<MetricChart
258-
database={tenantName}
259-
title={queriesChartConfig.title}
260-
metrics={queriesChartConfig.metrics}
261-
timeFrame={queriesTimeFrame}
262-
autorefresh={shouldRefresh}
263-
height={260}
264-
chartOptions={queriesChartConfig.options}
265-
onChartDataStatusChange={handleChartDataStatusChange}
266-
isChartVisible={!areChartsHidden}
267-
noBorder={true}
268-
fullWidth={true}
269-
withTimeframeSelector={true}
270-
onTimeFrameChange={handleQueriesTimeFrameChange}
271-
timeFrameComponent="dropdown"
272-
/>
273-
</div>
274-
275-
<div className={b('chart-container')}>
276-
<MetricChart
277-
database={tenantName}
278-
title={latenciesChartConfig.title}
279-
metrics={latenciesChartConfig.metrics}
280-
timeFrame={latenciesTimeFrame}
281-
autorefresh={shouldRefresh}
282-
height={260}
283-
chartOptions={latenciesChartConfig.options}
284-
onChartDataStatusChange={handleChartDataStatusChange}
285-
isChartVisible={!areChartsHidden}
286-
noBorder={true}
287-
fullWidth={true}
288-
withTimeframeSelector={true}
289-
onTimeFrameChange={handleLatenciesTimeFrameChange}
290-
timeFrameComponent="dropdown"
291-
/>
292-
</div>
293-
</div>
294-
)}
216+
<QueriesActivityCharts tenantName={tenantName} expanded={expanded} />
295217
</div>
296218
);
297219
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import React from 'react';
2+
3+
import {defaultDashboardConfig} from '../../containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/defaultDashboardConfig';
4+
import {cn} from '../../utils/cn';
5+
import {useAutoRefreshInterval} from '../../utils/hooks';
6+
import type {TimeFrame} from '../../utils/timeframes';
7+
import {MetricChart} from '../MetricChart/MetricChart';
8+
import type {ChartDataStatus} from '../MetricChart/types';
9+
10+
const b = cn('queries-activity-bar');
11+
12+
interface QueriesActivityChartsProps {
13+
tenantName: string;
14+
expanded: boolean;
15+
}
16+
17+
export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityChartsProps) {
18+
const [autoRefreshInterval] = useAutoRefreshInterval();
19+
const [queriesTimeFrame, setQueriesTimeFrame] = React.useState<TimeFrame>('1h');
20+
const [latenciesTimeFrame, setLatenciesTimeFrame] = React.useState<TimeFrame>('1h');
21+
const [areChartsHidden, setAreChartsHidden] = React.useState(true);
22+
23+
// Extract chart configurations from defaultDashboardConfig
24+
const getChartByTarget = (target: string) => {
25+
return defaultDashboardConfig.find((chart) =>
26+
chart.metrics.some((metric) => metric.target === target),
27+
);
28+
};
29+
30+
const queriesChartConfig = getChartByTarget('queries.requests');
31+
const latenciesChartConfig = getChartByTarget('queries.latencies.p99');
32+
33+
// Early return if required charts are not found
34+
if (!queriesChartConfig || !latenciesChartConfig) {
35+
console.warn('Required chart configurations not found in defaultDashboardConfig');
36+
return null;
37+
}
38+
39+
// Refetch data only if charts successfully loaded
40+
const shouldRefresh = areChartsHidden ? 0 : autoRefreshInterval;
41+
42+
const handleChartDataStatusChange = React.useCallback((status: ChartDataStatus) => {
43+
if (status === 'success') {
44+
setAreChartsHidden(false);
45+
}
46+
}, []);
47+
48+
const handleQueriesTimeFrameChange = React.useCallback((newTimeFrame: TimeFrame) => {
49+
setQueriesTimeFrame(newTimeFrame);
50+
}, []);
51+
52+
const handleLatenciesTimeFrameChange = React.useCallback((newTimeFrame: TimeFrame) => {
53+
setLatenciesTimeFrame(newTimeFrame);
54+
}, []);
55+
56+
// WORKAROUND: Charts are rendered outside Disclosure component due to YAGR tooltip bug
57+
// Issue: https://github.com/gravity-ui/yagr/issues/262
58+
59+
// Problem: YAGR tooltips don't work when charts are mounted inside collapsible containers
60+
// that use CSS transforms or have complex nested DOM structures. The tooltip initialization
61+
// fails when the chart is not immediately visible during mounting.
62+
63+
// TODO: Remove this workaround once the upstream issue is fixed
64+
if (!expanded) {
65+
return null;
66+
}
67+
68+
return (
69+
<div className={b('charts')} style={{display: areChartsHidden ? 'none' : undefined}}>
70+
<div className={b('chart-container')}>
71+
<MetricChart
72+
database={tenantName}
73+
title={queriesChartConfig.title}
74+
metrics={queriesChartConfig.metrics}
75+
timeFrame={queriesTimeFrame}
76+
autorefresh={shouldRefresh}
77+
height={260}
78+
chartOptions={queriesChartConfig.options}
79+
onChartDataStatusChange={handleChartDataStatusChange}
80+
isChartVisible={!areChartsHidden}
81+
noBorder={true}
82+
fullWidth={true}
83+
withTimeframeSelector={true}
84+
onTimeFrameChange={handleQueriesTimeFrameChange}
85+
timeFrameComponent="dropdown"
86+
/>
87+
</div>
88+
89+
<div className={b('chart-container')}>
90+
<MetricChart
91+
database={tenantName}
92+
title={latenciesChartConfig.title}
93+
metrics={latenciesChartConfig.metrics}
94+
timeFrame={latenciesTimeFrame}
95+
autorefresh={shouldRefresh}
96+
height={260}
97+
chartOptions={latenciesChartConfig.options}
98+
onChartDataStatusChange={handleChartDataStatusChange}
99+
isChartVisible={!areChartsHidden}
100+
noBorder={true}
101+
fullWidth={true}
102+
withTimeframeSelector={true}
103+
onTimeFrameChange={handleLatenciesTimeFrameChange}
104+
timeFrameComponent="dropdown"
105+
/>
106+
</div>
107+
</div>
108+
);
109+
}

src/components/QueriesActivityBar/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)