@@ -3,15 +3,17 @@ import { EuiFieldText, EuiIcon, EuiPopover, EuiSpacer, EuiTab, EuiTabs, EuiText
3
3
import cx from 'classnames'
4
4
import { useSelector } from 'react-redux'
5
5
import { useHistory , useParams } from 'react-router-dom'
6
+ import { orderBy } from 'lodash'
6
7
import { instancesSelector as rdiInstancesSelector } from 'uiSrc/slices/rdi/instances'
7
8
import { instancesSelector as dbInstancesSelector } from 'uiSrc/slices/instances/instances'
8
9
import Divider from 'uiSrc/components/divider/Divider'
9
- import { Pages } from 'uiSrc/constants'
10
+ import { BrowserStorageItem , Pages } from 'uiSrc/constants'
10
11
import Down from 'uiSrc/assets/img/Down.svg?react'
11
12
import Search from 'uiSrc/assets/img/Search.svg'
12
13
import { Instance , RdiInstance } from 'uiSrc/slices/interfaces'
13
14
import { TelemetryEvent , sendEventTelemetry } from 'uiSrc/telemetry'
14
15
import { getDbIndex } from 'uiSrc/utils'
16
+ import { localStorageService } from 'uiSrc/services'
15
17
import InstancesList from './components/instances-list'
16
18
import styles from './styles.module.scss'
17
19
@@ -38,11 +40,48 @@ const InstancesNavigationPopover = ({ name }: Props) => {
38
40
const history = useHistory ( )
39
41
40
42
useEffect ( ( ) => {
41
- const dbFiltered = dbInstances ?. filter ( ( db ) => {
42
- const label = `${ db . name } ${ getDbIndex ( db . db ) } `
43
- return label . toLowerCase ?.( ) . includes ( searchFilter )
44
- } )
45
- const rdiFiltered = rdiInstances ?. filter ( ( rdi ) => rdi . name ?. toLowerCase ?.( ) . includes ( searchFilter ) )
43
+ const filterAndSort = (
44
+ arr : Instance [ ] | RdiInstance [ ] ,
45
+ search : string ,
46
+ sort : { field : string , direction : 'asc' | 'desc' }
47
+ ) : ( Instance | RdiInstance
48
+ ) [ ] => {
49
+ if ( ! arr ?. length ) return arr
50
+ const filtered = arr . filter ( ( instance ) => {
51
+ const label = `${ instance . name } ${ getDbIndex ( instance . db ) } `
52
+ return label . toLowerCase ?.( ) . includes ( search )
53
+ } )
54
+
55
+ const sortingFunc = ( ins ) => {
56
+ if ( sort . field === 'lastConnection' ) {
57
+ return ins . lastConnection ? - new Date ( `${ ins . lastConnection } ` ) : - Infinity
58
+ }
59
+ if ( sort . field === 'host' ) {
60
+ return `${ ins . host } :${ ins . port } `
61
+ }
62
+ return sort . field
63
+ }
64
+
65
+ return orderBy (
66
+ filtered ,
67
+ sortingFunc ,
68
+ sort . direction
69
+ )
70
+ }
71
+
72
+ const dbSort = localStorageService . get ( BrowserStorageItem . instancesSorting ) ?? {
73
+ field : 'lastConnection' ,
74
+ direction : 'asc'
75
+ }
76
+
77
+ const dbFiltered = filterAndSort ( dbInstances , searchFilter , dbSort )
78
+
79
+ const rdiSort = localStorageService . get ( BrowserStorageItem . rdiInstancesSorting ) ?? {
80
+ field : 'lastConnection' ,
81
+ direction : 'asc'
82
+ }
83
+
84
+ const rdiFiltered = filterAndSort ( rdiInstances , searchFilter , rdiSort )
46
85
setFilteredDbInstances ( dbFiltered )
47
86
setFilteredRdiInstances ( rdiFiltered )
48
87
} , [ dbInstances , rdiInstances , searchFilter ] )
0 commit comments