1
1
import React , { ChangeEvent , useEffect , useState } from 'react'
2
- import { EuiFieldText , EuiIcon , EuiListGroup , EuiListGroupItem , EuiPopover , EuiSpacer , EuiTab , EuiTabs , EuiText } from '@elastic/eui'
2
+ import { EuiDescriptionListDescription , EuiFieldText , EuiIcon , EuiListGroup , EuiListGroupItem , EuiLoadingSpinner , EuiPopover , EuiSpacer , EuiTab , EuiTabs , EuiText } from '@elastic/eui'
3
3
import cx from 'classnames'
4
4
import { useDispatch , useSelector } from 'react-redux'
5
5
import { useHistory , useParams } from 'react-router-dom'
@@ -15,6 +15,7 @@ import Down from 'uiSrc/assets/img/Down.svg?react'
15
15
import Search from 'uiSrc/assets/img/Search.svg'
16
16
import { Instance , RdiInstance } from 'uiSrc/slices/interfaces'
17
17
import { TelemetryEvent , getRedisModulesSummary , sendEventTelemetry } from 'uiSrc/telemetry'
18
+ import { getDbIndex } from 'uiSrc/utils'
18
19
import styles from './styles.module.scss'
19
20
20
21
export interface Props {
@@ -31,6 +32,8 @@ const InstancesNavigationPopover = ({ name }: Props) => {
31
32
const [ searchFilter , setSearchFilter ] = useState ( '' )
32
33
const [ filteredDbInstances , setFilteredDbInstances ] = useState < Instance [ ] > ( [ ] )
33
34
const [ filteredRdiInstances , setFilteredRdiInstances ] = useState < RdiInstance [ ] > ( [ ] )
35
+ const [ loading , setLoading ] = useState < boolean > ( false )
36
+ const [ selected , setSelected ] = useState < string > ( '' )
34
37
35
38
const { instanceId, rdiInstanceId } = useParams < { instanceId : string , rdiInstanceId : string } > ( )
36
39
const [ selectedTab , setSelectedTab ] = useState ( rdiInstanceId ? InstancesTabs . RDI : InstancesTabs . Databases )
@@ -41,7 +44,10 @@ const InstancesNavigationPopover = ({ name }: Props) => {
41
44
const dispatch = useDispatch ( )
42
45
43
46
useEffect ( ( ) => {
44
- const dbFiltered = dbInstances ?. filter ( ( db ) => db . name ?. toLowerCase ?.( ) . includes ( searchFilter ) )
47
+ const dbFiltered = dbInstances ?. filter ( ( db ) => {
48
+ const label = `${ db . name } ${ getDbIndex ( db . db ) } `
49
+ return label . toLowerCase ?.( ) . includes ( searchFilter )
50
+ } )
45
51
const rdiFiltered = rdiInstances ?. filter ( ( rdi ) => rdi . name ?. toLowerCase ?.( ) . includes ( searchFilter ) )
46
52
setFilteredDbInstances ( dbFiltered )
47
53
setFilteredRdiInstances ( rdiFiltered )
@@ -77,11 +83,11 @@ const InstancesNavigationPopover = ({ name }: Props) => {
77
83
dispatch ( setAppContextInitialState ( ) )
78
84
79
85
dispatch ( setConnectedInstanceId ( id ) )
80
-
86
+ setLoading ( false )
81
87
history . push ( Pages . browser ( id ) )
82
88
}
83
89
84
- const btnLabel = selectedTab === InstancesTabs . Databases ? 'All Databases' : 'All RDIs '
90
+ const btnLabel = selectedTab === InstancesTabs . Databases ? 'Redis Databases page ' : 'Redis Data Integration page '
85
91
86
92
const goHome = ( ) => {
87
93
history . push ( selectedTab === InstancesTabs . Databases ? Pages . home : Pages . rdi )
@@ -94,6 +100,7 @@ const InstancesNavigationPopover = ({ name }: Props) => {
94
100
// already connected so do nothing
95
101
return
96
102
}
103
+ setLoading ( true )
97
104
const modulesSummary = getRedisModulesSummary ( instance . modules )
98
105
sendEventTelemetry ( {
99
106
event : TelemetryEvent . CONFIG_DATABASES_OPEN_DATABASE ,
@@ -104,18 +111,22 @@ const InstancesNavigationPopover = ({ name }: Props) => {
104
111
...modulesSummary ,
105
112
}
106
113
} )
107
- dispatch ( checkConnectToInstanceAction ( instance . id , connectToInstance , ( ) => { } , false ) )
114
+ dispatch ( checkConnectToInstanceAction ( instance . id , connectToInstance , ( ) => setLoading ( false ) , false ) )
108
115
}
109
116
110
117
const goToRdiInstance = ( instance : RdiInstance ) => {
111
118
if ( connectedRdiInstance ?. id === instance . id ) {
112
119
// already connected so do nothing
113
120
return
114
121
}
122
+ setLoading ( true )
115
123
dispatch ( checkConnectToRdiInstanceAction (
116
124
instance . id ,
117
- ( id : string ) => history . push ( Pages . rdiPipeline ( id ) ) ,
118
- ( ) => dispatch ( setAppContextConnectedRdiInstanceId ( '' ) )
125
+ ( id : string ) => {
126
+ setLoading ( false )
127
+ history . push ( Pages . rdiPipeline ( id ) )
128
+ } ,
129
+ ( ) => setLoading ( false )
119
130
) )
120
131
}
121
132
@@ -127,15 +138,34 @@ const InstancesNavigationPopover = ({ name }: Props) => {
127
138
}
128
139
}
129
140
141
+ const isInstanceActive = ( id : string ) => {
142
+ if ( selectedTab === InstancesTabs . Databases ) {
143
+ return id === instanceId
144
+ }
145
+ return id === rdiInstanceId
146
+ }
147
+
130
148
return (
131
149
< div className = { styles . listContainer } >
132
150
< EuiListGroup flush maxWidth = "none" gutterSize = "none" >
133
151
{ instances ?. map ( ( instance ) => (
134
152
< EuiListGroupItem
135
153
className = { styles . item }
154
+ isActive = { isInstanceActive ( instance . id ) }
155
+ disabled = { loading }
136
156
key = { instance . id }
137
- label = { instance . name }
138
- onClick = { ( ) => goToPage ( instance ) }
157
+ label = { (
158
+ < EuiText style = { { display : 'flex' , alignItems : 'center' } } >
159
+ { loading && instance ?. id === selected && < EuiLoadingSpinner size = "s" style = { { marginRight : '8px' } } /> }
160
+ { instance . name }
161
+ { ' ' }
162
+ { getDbIndex ( instance . db ) }
163
+ </ EuiText >
164
+ ) }
165
+ onClick = { ( ) => {
166
+ setSelected ( instance . id )
167
+ goToPage ( instance )
168
+ } }
139
169
/>
140
170
) ) }
141
171
</ EuiListGroup >
0 commit comments