1
+ import { useMemo } from 'react' ;
1
2
import cn from 'bem-cn-lite' ;
2
3
3
4
import DataTable , { Column } from '@gravity-ui/react-data-table' ;
@@ -28,6 +29,15 @@ interface SchemaViewerProps {
28
29
}
29
30
30
31
export const SchemaViewer = ( { keyColumnIds = [ ] , columns = [ ] , type} : SchemaViewerProps ) => {
32
+ const keyColumnsOrderValues = useMemo ( ( ) => {
33
+ return keyColumnIds . reduce < Record < number , number > > ( ( result , keyColumnId , index ) => {
34
+ // Put columns with negative values, so they will be the first with ascending sort
35
+ // Minus keyColumnIds.length for the first key, -1 for the last
36
+ result [ keyColumnId ] = index - keyColumnIds . length ;
37
+ return result ;
38
+ } , { } ) ;
39
+ } , [ keyColumnIds ] ) ;
40
+
31
41
let dataTableColumns : Column < TColumnDescription > [ ] = [
32
42
{
33
43
name : SchemaViewerColumns . id ,
@@ -36,8 +46,11 @@ export const SchemaViewer = ({keyColumnIds = [], columns = [], type}: SchemaView
36
46
{
37
47
name : SchemaViewerColumns . key ,
38
48
width : 40 ,
49
+ // Table should start with key columns on sort click
50
+ defaultOrder : DataTable . ASCENDING ,
39
51
sortAccessor : ( row ) => {
40
- return row . Id && keyColumnIds . includes ( row . Id ) ? 1 : 0 ;
52
+ // Values in keyColumnsOrderValues are always negative, so it will be 1 for not key columns
53
+ return ( row . Id && keyColumnsOrderValues [ row . Id ] ) || 1 ;
41
54
} ,
42
55
render : ( { row} ) => {
43
56
return row . Id && keyColumnIds . includes ( row . Id ) ? (
@@ -58,6 +71,8 @@ export const SchemaViewer = ({keyColumnIds = [], columns = [], type}: SchemaView
58
71
{
59
72
name : SchemaViewerColumns . notNull ,
60
73
width : 100 ,
74
+ // Table should start with notNull columns on sort click
75
+ defaultOrder : DataTable . DESCENDING ,
61
76
render : ( { row} ) => {
62
77
if ( row . NotNull ) {
63
78
return '\u2713' ;
@@ -75,22 +90,14 @@ export const SchemaViewer = ({keyColumnIds = [], columns = [], type}: SchemaView
75
90
) ;
76
91
}
77
92
78
- // Display key columns first
79
- const tableData = columns . sort ( ( column ) => {
80
- if ( column . Id && keyColumnIds . includes ( column . Id ) ) {
81
- return 1 ;
82
- }
83
- return - 1 ;
84
- } ) ;
85
-
86
93
return (
87
94
< div className = { b ( ) } >
88
95
< DataTable
89
96
theme = "yandex-cloud"
90
- data = { tableData }
97
+ data = { columns }
91
98
columns = { dataTableColumns }
92
99
settings = { DEFAULT_TABLE_SETTINGS }
93
- initialSortOrder = { { columnId : SchemaViewerColumns . key , order : DataTable . DESCENDING } }
100
+ initialSortOrder = { { columnId : SchemaViewerColumns . key , order : DataTable . ASCENDING } }
94
101
/>
95
102
</ div >
96
103
) ;
0 commit comments