@@ -3,13 +3,15 @@ import cn from 'bem-cn-lite';
33import DataTable , { Column , Settings , SortOrder } from '@gravity-ui/react-data-table' ;
44import { Icon , Label , Popover , PopoverBehavior } from '@gravity-ui/uikit' ;
55
6+ import type { ValueOf } from '../../../types/common' ;
67import type { NodesMap } from '../../../types/store/nodesList' ;
78import type { PreparedStorageGroup , VisibleEntities } from '../../../store/reducers/storage/types' ;
9+ import type { HandleSort } from '../../../utils/hooks/useTableSort' ;
810
911import { VISIBLE_ENTITIES } from '../../../store/reducers/storage/constants' ;
1012import { bytesToGB , bytesToSpeed } from '../../../utils/utils' ;
1113import { stringifyVdiskId } from '../../../utils' ;
12- import { getUsage , isFullVDiskData } from '../../../utils/storage' ;
14+ import { getUsage , isFullVDiskData , isSortableStorageProperty } from '../../../utils/storage' ;
1315
1416import shieldIcon from '../../../assets/icons/shield.svg' ;
1517import { Stack } from '../../../components/Stack/Stack' ;
@@ -22,83 +24,60 @@ import {getDegradedSeverity, getUsageSeverityForStorageGroup} from '../utils';
2224import i18n from './i18n' ;
2325import './StorageGroups.scss' ;
2426
25- enum TableColumnsIds {
26- PoolName = 'PoolName' ,
27- Type = 'Type ',
28- ErasureSpecies = 'ErasureSpecies ',
29- GroupID = 'GroupID ',
30- Used = 'Used' ,
31- Limit = 'Limit' ,
32- UsedPercents = 'UsedPercents ',
33- UsedSpaceFlag = 'UsedSpaceFlag' ,
34- Read = 'Read' ,
35- Write = 'Write' ,
36- VDisks = 'VDisks' ,
37- Missing = 'Missing ',
38- }
27+ const TableColumnsIds = {
28+ PoolName : 'PoolName' ,
29+ Kind : 'Kind ',
30+ Erasure : 'Erasure ',
31+ GroupId : 'GroupId ',
32+ Used : 'Used' ,
33+ Limit : 'Limit' ,
34+ Usage : 'Usage ',
35+ UsedSpaceFlag : 'UsedSpaceFlag' ,
36+ Read : 'Read' ,
37+ Write : 'Write' ,
38+ VDisks : 'VDisks' ,
39+ Degraded : 'Degraded ',
40+ } as const ;
3941
40- type TableColumnsIdsKeys = keyof typeof TableColumnsIds ;
41- type TableColumnsIdsValues = typeof TableColumnsIds [ TableColumnsIdsKeys ] ;
42+ type TableColumnId = ValueOf < typeof TableColumnsIds > ;
4243
4344interface StorageGroupsProps {
4445 data : PreparedStorageGroup [ ] ;
4546 nodes ?: NodesMap ;
4647 tableSettings : Settings ;
4748 visibleEntities : VisibleEntities ;
4849 onShowAll ?: VoidFunction ;
50+ sort ?: SortOrder ;
51+ handleSort ?: HandleSort ;
4952}
5053
51- const tableColumnsNames : Record < TableColumnsIdsValues , string > = {
54+ const tableColumnsNames : Record < TableColumnId , string > = {
5255 PoolName : 'Pool Name' ,
53- Type : 'Type' ,
54- ErasureSpecies : 'Erasure' ,
55- GroupID : 'Group ID' ,
56+ Kind : 'Type' ,
57+ Erasure : 'Erasure' ,
58+ GroupId : 'Group ID' ,
5659 Used : 'Used' ,
5760 Limit : 'Limit' ,
5861 UsedSpaceFlag : 'Space' ,
59- UsedPercents : 'Usage' ,
62+ Usage : 'Usage' ,
6063 Read : 'Read' ,
6164 Write : 'Write' ,
6265 VDisks : 'VDisks' ,
63- Missing : 'Degraded' ,
66+ Degraded : 'Degraded' ,
6467} ;
6568
6669const b = cn ( 'global-storage-groups' ) ;
6770
68- function setSortOrder ( visibleEntities : VisibleEntities ) : SortOrder | undefined {
69- switch ( visibleEntities ) {
70- case VISIBLE_ENTITIES . all : {
71- return {
72- columnId : TableColumnsIds . PoolName ,
73- order : DataTable . ASCENDING ,
74- } ;
75- }
76- case VISIBLE_ENTITIES . missing : {
77- return {
78- columnId : TableColumnsIds . Missing ,
79- order : DataTable . DESCENDING ,
80- } ;
81- }
82- case VISIBLE_ENTITIES . space : {
83- return {
84- columnId : TableColumnsIds . UsedSpaceFlag ,
85- order : DataTable . DESCENDING ,
86- } ;
87- }
88- default : {
89- return undefined ;
90- }
91- }
92- }
93-
9471export function StorageGroups ( {
9572 data,
9673 tableSettings,
9774 visibleEntities,
9875 nodes,
9976 onShowAll,
77+ sort,
78+ handleSort,
10079} : StorageGroupsProps ) {
101- const allColumns : Column < PreparedStorageGroup > [ ] = [
80+ const rawColumns : Column < PreparedStorageGroup > [ ] = [
10281 {
10382 name : TableColumnsIds . PoolName ,
10483 header : tableColumnsNames [ TableColumnsIds . PoolName ] ,
@@ -124,8 +103,8 @@ export function StorageGroups({
124103 align : DataTable . LEFT ,
125104 } ,
126105 {
127- name : TableColumnsIds . Type ,
128- header : tableColumnsNames [ TableColumnsIds . Type ] ,
106+ name : TableColumnsIds . Kind ,
107+ header : tableColumnsNames [ TableColumnsIds . Kind ] ,
129108 // prettier-ignore
130109 render : ( { row} ) => (
131110 < >
@@ -146,14 +125,14 @@ export function StorageGroups({
146125 ) ,
147126 } ,
148127 {
149- name : TableColumnsIds . ErasureSpecies ,
150- header : tableColumnsNames [ TableColumnsIds . ErasureSpecies ] ,
128+ name : TableColumnsIds . Erasure ,
129+ header : tableColumnsNames [ TableColumnsIds . Erasure ] ,
151130 render : ( { row} ) => ( row . ErasureSpecies ? row . ErasureSpecies : '-' ) ,
152131 align : DataTable . LEFT ,
153132 } ,
154133 {
155- name : TableColumnsIds . Missing ,
156- header : tableColumnsNames [ TableColumnsIds . Missing ] ,
134+ name : TableColumnsIds . Degraded ,
135+ header : tableColumnsNames [ TableColumnsIds . Degraded ] ,
157136 width : 100 ,
158137 render : ( { row} ) =>
159138 row . Degraded ? (
@@ -165,8 +144,8 @@ export function StorageGroups({
165144 defaultOrder : DataTable . DESCENDING ,
166145 } ,
167146 {
168- name : TableColumnsIds . UsedPercents ,
169- header : tableColumnsNames [ TableColumnsIds . UsedPercents ] ,
147+ name : TableColumnsIds . Usage ,
148+ header : tableColumnsNames [ TableColumnsIds . Usage ] ,
170149 width : 100 ,
171150 render : ( { row} ) => {
172151 // without a limit the usage can be evaluated as 0,
@@ -187,12 +166,13 @@ export function StorageGroups({
187166 align : DataTable . LEFT ,
188167 } ,
189168 {
190- name : TableColumnsIds . GroupID ,
191- header : tableColumnsNames [ TableColumnsIds . GroupID ] ,
169+ name : TableColumnsIds . GroupId ,
170+ header : tableColumnsNames [ TableColumnsIds . GroupId ] ,
192171 width : 130 ,
193172 render : ( { row} ) => {
194173 return < span className = { b ( 'group-id' ) } > { row . GroupID } </ span > ;
195174 } ,
175+ sortAccessor : ( row ) => Number ( row . GroupID ) ,
196176 align : DataTable . RIGHT ,
197177 } ,
198178 {
@@ -296,18 +276,21 @@ export function StorageGroups({
296276 } ,
297277 ] ;
298278
299- let columns = allColumns ;
279+ let columns = rawColumns . map ( ( column ) => ( {
280+ ...column ,
281+ sortable : isSortableStorageProperty ( column . name ) ,
282+ } ) ) ;
300283
301284 if ( visibleEntities === VISIBLE_ENTITIES . all ) {
302- columns = allColumns . filter ( ( col ) => {
285+ columns = columns . filter ( ( col ) => {
303286 return (
304- col . name !== TableColumnsIds . Missing && col . name !== TableColumnsIds . UsedSpaceFlag
287+ col . name !== TableColumnsIds . Degraded && col . name !== TableColumnsIds . UsedSpaceFlag
305288 ) ;
306289 } ) ;
307290 }
308291
309292 if ( visibleEntities === VISIBLE_ENTITIES . space ) {
310- columns = allColumns . filter ( ( col ) => col . name !== TableColumnsIds . Missing ) ;
293+ columns = columns . filter ( ( col ) => col . name !== TableColumnsIds . Degraded ) ;
311294
312295 if ( ! data . length ) {
313296 return (
@@ -321,7 +304,7 @@ export function StorageGroups({
321304 }
322305
323306 if ( visibleEntities === VISIBLE_ENTITIES . missing ) {
324- columns = allColumns . filter ( ( col ) => col . name !== TableColumnsIds . UsedSpaceFlag ) ;
307+ columns = columns . filter ( ( col ) => col . name !== TableColumnsIds . UsedSpaceFlag ) ;
325308
326309 if ( ! data . length ) {
327310 return (
@@ -341,8 +324,9 @@ export function StorageGroups({
341324 data = { data }
342325 columns = { columns }
343326 settings = { tableSettings }
344- initialSortOrder = { setSortOrder ( visibleEntities ) }
345327 emptyDataMessage = { i18n ( 'empty.default' ) }
328+ sortOrder = { sort }
329+ onSort = { handleSort }
346330 />
347331 ) : null ;
348332}
0 commit comments