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