11import React from 'react' ;
22
3- import type { RadioButtonOption } from '@gravity-ui/uikit' ;
4- import { RadioButton } from '@gravity-ui/uikit' ;
3+ import type { Column } from '@gravity-ui/react-data-table' ;
4+ import type { RadioButtonOption , SelectOption } from '@gravity-ui/uikit' ;
5+ import { RadioButton , Select , TableColumnSetup } from '@gravity-ui/uikit' ;
56import { useHistory , useLocation } from 'react-router-dom' ;
67import { StringParam , useQueryParam } from 'use-query-params' ;
78import { z } from 'zod' ;
@@ -12,6 +13,7 @@ import {Search} from '../../../../components/Search';
1213import { TableWithControlsLayout } from '../../../../components/TableWithControlsLayout/TableWithControlsLayout' ;
1314import { parseQuery } from '../../../../routes' ;
1415import { setTopQueriesFilters } from '../../../../store/reducers/executeTopQueries/executeTopQueries' ;
16+ import type { TimeFrame } from '../../../../store/reducers/executeTopQueries/types' ;
1517import { changeUserInput , setIsDirty } from '../../../../store/reducers/query/query' ;
1618import {
1719 TENANT_PAGE ,
@@ -20,11 +22,22 @@ import {
2022} from '../../../../store/reducers/tenant/constants' ;
2123import { cn } from '../../../../utils/cn' ;
2224import { useTypedDispatch , useTypedSelector } from '../../../../utils/hooks' ;
25+ import { useSelectedColumns } from '../../../../utils/hooks/useSelectedColumns' ;
2326import { useChangeInputWithConfirmation } from '../../../../utils/hooks/withConfirmation/useChangeInputWithConfirmation' ;
2427import { TenantTabsGroups , getTenantPath } from '../../TenantPages' ;
2528
2629import { RunningQueriesData } from './RunningQueriesData' ;
2730import { TopQueriesData } from './TopQueriesData' ;
31+ import { getRunningQueriesColumns , getTopQueriesColumns } from './columns/columns' ;
32+ import {
33+ DEFAULT_RUNNING_QUERIES_COLUMNS ,
34+ DEFAULT_TOP_QUERIES_COLUMNS ,
35+ REQUIRED_RUNNING_QUERIES_COLUMNS ,
36+ REQUIRED_TOP_QUERIES_COLUMNS ,
37+ RUNNING_QUERIES_SELECTED_COLUMNS_LS_KEY ,
38+ TOP_QUERIES_COLUMNS_TITLES ,
39+ TOP_QUERIES_SELECTED_COLUMNS_LS_KEY ,
40+ } from './columns/constants' ;
2841import i18n from './i18n' ;
2942
3043import './TopQueries.scss' ;
@@ -51,7 +64,35 @@ const QUERY_MODE_OPTIONS: RadioButtonOption[] = [
5164 } ,
5265] ;
5366
67+ const TimeFrameIds = {
68+ hour : 'hour' ,
69+ minute : 'minute' ,
70+ } as const ;
71+
5472const queryModeSchema = z . nativeEnum ( QueryModeIds ) . catch ( QueryModeIds . top ) ;
73+ const timeFrameSchema = z . nativeEnum ( TimeFrameIds ) . catch ( TimeFrameIds . hour ) ;
74+
75+ const TIME_FRAME_OPTIONS : SelectOption [ ] = [
76+ {
77+ value : TimeFrameIds . hour ,
78+ content : i18n ( 'timeframe_hour' ) ,
79+ } ,
80+ {
81+ value : TimeFrameIds . minute ,
82+ content : i18n ( 'timeframe_minute' ) ,
83+ } ,
84+ ] ;
85+
86+ const DEFAULT_TIME_FILTER_VALUE = {
87+ start : {
88+ value : 'now-6h' ,
89+ type : 'relative' ,
90+ } ,
91+ end : {
92+ value : 'now' ,
93+ type : 'relative' ,
94+ } ,
95+ } as const ;
5596
5697interface TopQueriesProps {
5798 tenantName : string ;
@@ -62,8 +103,10 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
62103 const location = useLocation ( ) ;
63104 const history = useHistory ( ) ;
64105 const [ _queryMode = QueryModeIds . top , setQueryMode ] = useQueryParam ( 'queryMode' , StringParam ) ;
106+ const [ _timeFrame = TimeFrameIds . hour , setTimeFrame ] = useQueryParam ( 'timeFrame' , StringParam ) ;
65107
66108 const queryMode = queryModeSchema . parse ( _queryMode ) ;
109+ const timeFrame = timeFrameSchema . parse ( _timeFrame ) ;
67110
68111 const isTopQueries = queryMode === QueryModeIds . top ;
69112
@@ -93,10 +136,30 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
93136 dispatch ( setTopQueriesFilters ( { text} ) ) ;
94137 } ;
95138
139+ const handleTimeFrameChange = ( value : string [ ] ) => {
140+ setTimeFrame ( value [ 0 ] as TimeFrame ) ;
141+ } ;
142+
96143 const handleDateRangeChange = ( value : DateRangeValues ) => {
97144 dispatch ( setTopQueriesFilters ( value ) ) ;
98145 } ;
99146
147+ // Get columns based on query mode
148+ const columns : Column < any > [ ] = React . useMemo ( ( ) => {
149+ return isTopQueries ? getTopQueriesColumns ( ) : getRunningQueriesColumns ( ) ;
150+ } , [ isTopQueries ] ) ;
151+
152+ // Use selected columns hook
153+ const { columnsToShow, columnsToSelect, setColumns} = useSelectedColumns (
154+ columns ,
155+ isTopQueries
156+ ? TOP_QUERIES_SELECTED_COLUMNS_LS_KEY
157+ : RUNNING_QUERIES_SELECTED_COLUMNS_LS_KEY ,
158+ TOP_QUERIES_COLUMNS_TITLES ,
159+ isTopQueries ? DEFAULT_TOP_QUERIES_COLUMNS : DEFAULT_RUNNING_QUERIES_COLUMNS ,
160+ isTopQueries ? REQUIRED_TOP_QUERIES_COLUMNS : REQUIRED_RUNNING_QUERIES_COLUMNS ,
161+ ) ;
162+
100163 const DataComponent = isTopQueries ? TopQueriesData : RunningQueriesData ;
101164
102165 return (
@@ -107,21 +170,42 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
107170 value = { queryMode }
108171 onUpdate = { setQueryMode }
109172 />
173+ { isTopQueries && (
174+ < Select
175+ options = { TIME_FRAME_OPTIONS }
176+ value = { [ timeFrame ] }
177+ onUpdate = { handleTimeFrameChange }
178+ />
179+ ) }
180+ { isTopQueries && (
181+ < DateRange
182+ from = { filters . from }
183+ to = { filters . to }
184+ onChange = { handleDateRangeChange }
185+ defaultValue = { DEFAULT_TIME_FILTER_VALUE }
186+ />
187+ ) }
110188 < Search
111189 value = { filters . text }
112190 onChange = { handleTextSearchUpdate }
113191 placeholder = { i18n ( 'filter.text.placeholder' ) }
114192 className = { b ( 'search' ) }
115193 />
116- { isTopQueries ? (
117- < DateRange
118- from = { filters . from }
119- to = { filters . to }
120- onChange = { handleDateRangeChange }
121- />
122- ) : null }
194+ < TableColumnSetup
195+ popupWidth = { 200 }
196+ items = { columnsToSelect }
197+ showStatus
198+ onUpdate = { setColumns }
199+ sortable = { false }
200+ />
123201 </ TableWithControlsLayout . Controls >
124- < DataComponent database = { tenantName } onRowClick = { onRowClick } rowClassName = { b ( 'row' ) } />
202+ < DataComponent
203+ database = { tenantName }
204+ onRowClick = { onRowClick }
205+ rowClassName = { b ( 'row' ) }
206+ timeFrame = { timeFrame }
207+ columns = { columnsToShow }
208+ />
125209 </ TableWithControlsLayout >
126210 ) ;
127211} ;
0 commit comments