Skip to content

Commit 63374a3

Browse files
committed
fix: renderChartToolbar
1 parent 71bdd6f commit 63374a3

File tree

6 files changed

+54
-39
lines changed

6 files changed

+54
-39
lines changed

src/components/MetricChart/MetricChart.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
border: none;
1414
}
1515

16-
&__title {
17-
margin-bottom: 10px;
18-
}
19-
2016
&__chart {
2117
position: relative;
2218

src/components/MetricChart/MetricChart.tsx

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@ import React from 'react';
33
import ChartKit, {settings} from '@gravity-ui/chartkit';
44
import type {YagrWidgetData} from '@gravity-ui/chartkit/yagr';
55
import {YagrPlugin} from '@gravity-ui/chartkit/yagr';
6-
import {Flex} from '@gravity-ui/uikit';
76

87
import {cn} from '../../utils/cn';
98
import type {TimeFrame} from '../../utils/timeframes';
109
import {ResponseError} from '../Errors/ResponseError';
1110
import {Loader} from '../Loader';
12-
import {TimeFrameDropdown} from '../TimeFrameDropdown/TimeFrameDropdown';
13-
import {TimeFrameSelector} from '../TimeFrameSelector/TimeFrameSelector';
1411

1512
import {colorToRGBA, colors} from './colors';
1613
import {getDefaultDataFormatter} from './getDefaultDataFormatter';
@@ -106,7 +103,6 @@ const emptyChartData: PreparedMetricsData = {timeline: [], metrics: []};
106103
interface DiagnosticsChartProps {
107104
database: string;
108105

109-
title?: string;
110106
metrics: MetricDescription[];
111107
timeFrame?: TimeFrame;
112108

@@ -132,19 +128,12 @@ interface DiagnosticsChartProps {
132128
/** Make chart take full width of container */
133129
fullWidth?: boolean;
134130

135-
/** Show timeframe selector to the right of chart title */
136-
withTimeframeSelector?: boolean;
137-
138-
/** Callback when timeframe is changed via the selector */
139-
onTimeFrameChange?: (timeFrame: TimeFrame) => void;
140-
141-
/** Timeframe component to choose between 'selector' and 'dropdown' */
142-
timeFrameComponent?: 'selector' | 'dropdown';
131+
/** Render custom toolbar content to the right of chart title */
132+
renderChartToolbar?: () => React.ReactNode;
143133
}
144134

145135
export const MetricChart = ({
146136
database,
147-
title,
148137
metrics,
149138
timeFrame = '1h',
150139
autorefresh,
@@ -155,9 +144,7 @@ export const MetricChart = ({
155144
isChartVisible,
156145
noBorder,
157146
fullWidth,
158-
withTimeframeSelector,
159-
onTimeFrameChange,
160-
timeFrameComponent = 'selector',
147+
renderChartToolbar,
161148
}: DiagnosticsChartProps) => {
162149
// Use a reasonable default for maxDataPoints when fullWidth is true
163150
const effectiveWidth = fullWidth ? 600 : width;
@@ -209,16 +196,7 @@ export const MetricChart = ({
209196
width: fullWidth ? '100%' : width,
210197
}}
211198
>
212-
<Flex className={b('title')} justifyContent="space-between" alignItems="center">
213-
<div>{title}</div>
214-
{withTimeframeSelector &&
215-
onTimeFrameChange &&
216-
(timeFrameComponent === 'dropdown' ? (
217-
<TimeFrameDropdown value={timeFrame} onChange={onTimeFrameChange} />
218-
) : (
219-
<TimeFrameSelector value={timeFrame} onChange={onTimeFrameChange} />
220-
))}
221-
</Flex>
199+
{renderChartToolbar?.()}
222200
{renderContent()}
223201
</div>
224202
);

src/components/QueriesActivityBar/QueriesActivityBar.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@
9696
gap: var(--g-spacing-3);
9797
}
9898

99+
&__toolbar {
100+
margin-bottom: 10px;
101+
}
102+
99103
// Focus states for accessibility
100104
&__header:focus-visible,
101105
&__open-queries-button:focus-visible {

src/components/QueriesActivityBar/QueriesActivityCharts.tsx

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import React from 'react';
22

3+
import {Flex} from '@gravity-ui/uikit';
4+
35
import {defaultDashboardConfig} from '../../containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/defaultDashboardConfig';
46
import {cn} from '../../utils/cn';
57
import {useAutoRefreshInterval} from '../../utils/hooks';
68
import type {TimeFrame} from '../../utils/timeframes';
79
import {MetricChart} from '../MetricChart/MetricChart';
810
import type {ChartDataStatus} from '../MetricChart/types';
11+
import {TimeFrameDropdown} from '../TimeFrameDropdown/TimeFrameDropdown';
912

1013
const b = cn('queries-activity-bar');
1114

@@ -55,6 +58,32 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
5558
setLatenciesTimeFrame(newTimeFrame);
5659
}, []);
5760

61+
const renderQueriesChartToolbar = React.useCallback(
62+
() => (
63+
<Flex className={b('toolbar')} justifyContent="space-between" alignItems="center">
64+
<div>{queriesChartConfig.title}</div>
65+
<TimeFrameDropdown
66+
value={queriesTimeFrame}
67+
onChange={handleQueriesTimeFrameChange}
68+
/>
69+
</Flex>
70+
),
71+
[queriesChartConfig.title, queriesTimeFrame],
72+
);
73+
74+
const renderLatenciesChartToolbar = React.useCallback(
75+
() => (
76+
<Flex className={b('toolbar')} justifyContent="space-between" alignItems="center">
77+
<div>{latenciesChartConfig.title}</div>
78+
<TimeFrameDropdown
79+
value={latenciesTimeFrame}
80+
onChange={handleLatenciesTimeFrameChange}
81+
/>
82+
</Flex>
83+
),
84+
[latenciesChartConfig.title, latenciesTimeFrame],
85+
);
86+
5887
// WORKAROUND: Charts are rendered outside Disclosure component due to YAGR tooltip bug
5988
// Issue: https://github.com/gravity-ui/yagr/issues/262
6089

@@ -72,7 +101,6 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
72101
<div className={b('chart-container')}>
73102
<MetricChart
74103
database={tenantName}
75-
title={queriesChartConfig.title}
76104
metrics={queriesChartConfig.metrics}
77105
timeFrame={queriesTimeFrame}
78106
autorefresh={shouldRefresh}
@@ -82,16 +110,13 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
82110
isChartVisible={hasChartsLoaded}
83111
noBorder={true}
84112
fullWidth={true}
85-
withTimeframeSelector={true}
86-
onTimeFrameChange={handleQueriesTimeFrameChange}
87-
timeFrameComponent="dropdown"
113+
renderChartToolbar={renderQueriesChartToolbar}
88114
/>
89115
</div>
90116

91117
<div className={b('chart-container')}>
92118
<MetricChart
93119
database={tenantName}
94-
title={latenciesChartConfig.title}
95120
metrics={latenciesChartConfig.metrics}
96121
timeFrame={latenciesTimeFrame}
97122
autorefresh={shouldRefresh}
@@ -101,9 +126,7 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
101126
isChartVisible={hasChartsLoaded}
102127
noBorder={true}
103128
fullWidth={true}
104-
withTimeframeSelector={true}
105-
onTimeFrameChange={handleLatenciesTimeFrameChange}
106-
timeFrameComponent="dropdown"
129+
renderChartToolbar={renderLatenciesChartToolbar}
107130
/>
108131
</div>
109132
</div>

src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@
1111
flex-flow: row wrap;
1212
gap: 16px;
1313
}
14+
15+
&__toolbar {
16+
margin-bottom: 10px;
17+
}
1418
}

src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22

3+
import {Flex} from '@gravity-ui/uikit';
34
import {StringParam, useQueryParam} from 'use-query-params';
45

56
import {MetricChart} from '../../../../../components/MetricChart';
@@ -60,14 +61,22 @@ export const TenantDashboard = ({database, charts}: TenantDashboardProps) => {
6061
const chartWidth = charts.length === 1 ? CHART_WIDTH_FULL : CHART_WIDTH;
6162
const chartHeight = CHART_WIDTH / 1.5;
6263

64+
const renderChartToolbar = React.useCallback(
65+
(chartConfig: ChartConfig) => (
66+
<Flex className={b('toolbar')} justifyContent="space-between" alignItems="center">
67+
<div>{chartConfig.title}</div>
68+
</Flex>
69+
),
70+
[],
71+
);
72+
6373
const renderContent = () => {
6474
return charts.map((chartConfig) => {
6575
const chartId = chartConfig.metrics.map(({target}) => target).join('&');
6676
return (
6777
<MetricChart
6878
key={chartId}
6979
database={database}
70-
title={chartConfig.title}
7180
metrics={chartConfig.metrics}
7281
timeFrame={timeFrame as TimeFrame}
7382
chartOptions={chartConfig.options}
@@ -76,6 +85,7 @@ export const TenantDashboard = ({database, charts}: TenantDashboardProps) => {
7685
height={chartHeight}
7786
onChartDataStatusChange={handleChartDataStatusChange}
7887
isChartVisible={!isDashboardHidden}
88+
renderChartToolbar={() => renderChartToolbar(chartConfig)}
7989
/>
8090
);
8191
});

0 commit comments

Comments
 (0)