11import type { Settings } from '@gravity-ui/react-data-table' ;
2+ import type { TabsItemProps } from '@gravity-ui/uikit' ;
23import { Tabs , Text } from '@gravity-ui/uikit' ;
34
45import { QueryResultTable } from '../../../../../../components/QueryResultTable' ;
56import type { ParsedResultSet } from '../../../../../../types/store/query' ;
6- import { getArray } from '../../../../../../utils' ;
77import { cn } from '../../../../../../utils/cn' ;
8- import i18n from '../../i18n' ;
98import { QueryResultError } from '../QueryResultError/QueryResultError' ;
109
1110import './ResultSetsViewer.scss' ;
@@ -23,47 +22,42 @@ interface ResultSetsViewerProps {
2322export function ResultSetsViewer ( props : ResultSetsViewerProps ) {
2423 const { selectedResultSet, setSelectedResultSet, resultSets, error} = props ;
2524
26- const resultsSetsCount = resultSets ?. length || 0 ;
2725 const currentResult = resultSets ?. [ selectedResultSet ] ;
2826
2927 const renderTabs = ( ) => {
30- if ( resultsSetsCount > 1 ) {
31- const tabsItems = getArray ( resultsSetsCount ) . map ( ( item ) => ( {
32- id : String ( item ) ,
33- title : `Result #${ item + 1 } ${ resultSets ?. [ item ] ?. truncated ? ' (T)' : '' } ` ,
34- } ) ) ;
28+ const tabsItems : TabsItemProps [ ] =
29+ resultSets ?. map ( ( _ , index ) => {
30+ const resultSet = resultSets ?. [ index ] ;
31+ const rowsPerSecond = resultSet ?. streamMetrics ?. rowsPerSecond ;
32+ const rowsPerSecondFormatted =
33+ rowsPerSecond && rowsPerSecond > 1000
34+ ? `${ ( rowsPerSecond / 1000 ) . toFixed ( 0 ) } k`
35+ : rowsPerSecond ?. toFixed ( 0 ) ;
36+ return {
37+ id : String ( index ) ,
38+ title : (
39+ < div className = { b ( 'tab-title' ) } >
40+ < Text >
41+ { `Result ${ resultSets . length > 1 ? `#${ index + 1 } ${ resultSets ?. [ index ] ?. truncated ? ' (T)' : '' } ` : '' } ` }
42+ </ Text >
43+ < Text color = "secondary" > { resultSet . result ?. length || 0 } </ Text >
44+ </ div >
45+ ) ,
46+ label : {
47+ content : `${ rowsPerSecondFormatted } rows/s` ,
48+ } ,
49+ } ;
50+ } ) || [ ] ;
3551
36- return (
37- < div >
38- < Tabs
39- className = { b ( 'tabs' ) }
40- size = "l"
41- items = { tabsItems }
42- activeTab = { String ( selectedResultSet ) }
43- onSelectTab = { ( tabId ) => setSelectedResultSet ( Number ( tabId ) ) }
44- />
45- </ div >
46- ) ;
47- }
48-
49- return null ;
50- } ;
51-
52- const renderResultHeadWithCount = ( ) => {
5352 return (
54- < div className = { b ( 'head' ) } >
55- < Text variant = "subheader-3" >
56- { currentResult ?. truncated ? i18n ( 'title.truncated' ) : i18n ( 'title.result' ) }
57- </ Text >
58- { currentResult ?. result ? (
59- < Text color = "secondary" variant = "body-2" className = { b ( 'row-count' ) } >
60- { `(${ currentResult ?. result . length } ${
61- currentResult . streamMetrics ?. rowsPerSecond
62- ? `, ${ currentResult . streamMetrics . rowsPerSecond . toFixed ( 0 ) } rows/s`
63- : ''
64- } )`}
65- </ Text >
66- ) : null }
53+ < div >
54+ < Tabs
55+ className = { b ( 'tabs' ) }
56+ size = "l"
57+ items = { tabsItems }
58+ activeTab = { String ( selectedResultSet ) }
59+ onSelectTab = { ( tabId ) => setSelectedResultSet ( Number ( tabId ) ) }
60+ />
6761 </ div >
6862 ) ;
6963 } ;
@@ -74,7 +68,6 @@ export function ResultSetsViewer(props: ResultSetsViewerProps) {
7468 { props . error ? < QueryResultError error = { error } /> : null }
7569 { currentResult ? (
7670 < div className = { b ( 'result' ) } >
77- { renderResultHeadWithCount ( ) }
7871 < QueryResultTable
7972 settings = { props . tableSettings }
8073 data = { currentResult . result }
0 commit comments