@@ -9,13 +9,29 @@ import { useTableCellManager } from './TableCellManager';
99import OptimizeTable from 'renderer/components/OptimizeTable' ;
1010import Icon from 'renderer/components/Icon' ;
1111import useDataTableContextMenu from './useDataTableContextMenu' ;
12+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
13+ import {
14+ faArrowDown ,
15+ faArrowUp ,
16+ faChevronDown ,
17+ faChevronUp ,
18+ } from '@fortawesome/free-solid-svg-icons' ;
1219
1320interface QueryResultTableProps {
1421 headers : QueryResultHeader [ ] ;
1522 result : QueryResultWithIndex [ ] ;
23+ onSortHeader ?: ( header : QueryResultHeader , by : 'ASC' | 'DESC' ) => void ;
24+ onSortReset ?: ( ) => void ;
25+ sortedHeader ?: { header : QueryResultHeader ; by : 'ASC' | 'DESC' } ;
1626}
1727
18- function QueryResultTable ( { headers, result } : QueryResultTableProps ) {
28+ function QueryResultTable ( {
29+ headers,
30+ result,
31+ onSortHeader,
32+ onSortReset,
33+ sortedHeader,
34+ } : QueryResultTableProps ) {
1935 const [ newRowCount , setNewRowCount ] = useState ( 0 ) ;
2036 const { collector } = useQueryResultChange ( ) ;
2137 const { cellManager } = useTableCellManager ( ) ;
@@ -104,17 +120,53 @@ function QueryResultTable({ headers, result }: QueryResultTableProps) {
104120 icon : header ?. schema ?. primaryKey ? (
105121 < Icon . GreenKey size = "sm" />
106122 ) : undefined ,
123+ rightIcon :
124+ sortedHeader && sortedHeader . header . name === header . name ? (
125+ sortedHeader . by === 'ASC' ? (
126+ < FontAwesomeIcon icon = { faChevronDown } />
127+ ) : (
128+ < FontAwesomeIcon icon = { faChevronUp } />
129+ )
130+ ) : undefined ,
107131 tooltip : header . columnDefinition ?. comment ,
108132 menu : [
109- { text : 'Order by ASC' , disabled : true } ,
110- { text : 'Order by DESC' , disabled : true } ,
133+ {
134+ text : 'Reset Order' ,
135+ separator : true ,
136+ disabled : ! onSortHeader ,
137+ onClick : ( ) => {
138+ if ( onSortReset ) {
139+ onSortReset ( ) ;
140+ }
141+ } ,
142+ } ,
143+ {
144+ text : 'Order by ASC' ,
145+ icon : < FontAwesomeIcon icon = { faArrowDown } /> ,
146+ disabled : ! onSortHeader ,
147+ onClick : ( ) => {
148+ if ( onSortHeader ) {
149+ onSortHeader ( header , 'ASC' ) ;
150+ }
151+ } ,
152+ } ,
153+ {
154+ text : 'Order by DESC' ,
155+ icon : < FontAwesomeIcon icon = { faArrowUp } /> ,
156+ disabled : ! onSortHeader ,
157+ onClick : ( ) => {
158+ if ( onSortHeader ) {
159+ onSortHeader ( header , 'DESC' ) ;
160+ }
161+ } ,
162+ } ,
111163 ] ,
112164 initialSize : Math . max (
113165 header . name . length * 10 ,
114166 getInitialSizeByHeaderType ( idx , header )
115167 ) ,
116168 } ) ) ;
117- } , [ result ] ) ;
169+ } , [ result , onSortHeader , sortedHeader ] ) ;
118170
119171 const renderCell = useCallback (
120172 ( y : number , x : number ) => {
0 commit comments