Skip to content

Commit 578d9ba

Browse files
Merge pull request #4269 from RedisInsight/fe/bugfix/RI-6580-instance-nav-bugfixes
RI-6371 fix sorting, added empty list view
2 parents 4e10b08 + 81d1bd1 commit 578d9ba

File tree

11 files changed

+138
-20
lines changed

11 files changed

+138
-20
lines changed

redisinsight/ui/src/components/instance-header/components/instances-navigation-popover/InstancesNavigationPopover.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import { useHistory, useParams } from 'react-router-dom'
66
import { instancesSelector as rdiInstancesSelector } from 'uiSrc/slices/rdi/instances'
77
import { instancesSelector as dbInstancesSelector } from 'uiSrc/slices/instances/instances'
88
import Divider from 'uiSrc/components/divider/Divider'
9-
import { Pages } from 'uiSrc/constants'
9+
import { BrowserStorageItem, DEFAULT_SORT, Pages } from 'uiSrc/constants'
1010
import Down from 'uiSrc/assets/img/Down.svg?react'
1111
import Search from 'uiSrc/assets/img/Search.svg'
1212
import { Instance, RdiInstance } from 'uiSrc/slices/interfaces'
1313
import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry'
14-
import { getDbIndex } from 'uiSrc/utils'
14+
import { localStorageService } from 'uiSrc/services'
15+
import { filterAndSort } from 'uiSrc/utils'
1516
import InstancesList from './components/instances-list'
1617
import styles from './styles.module.scss'
1718

@@ -38,11 +39,13 @@ const InstancesNavigationPopover = ({ name }: Props) => {
3839
const history = useHistory()
3940

4041
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))
42+
const dbSort = localStorageService.get(BrowserStorageItem.instancesSorting) ?? DEFAULT_SORT
43+
44+
const dbFiltered = filterAndSort(dbInstances, searchFilter, dbSort)
45+
46+
const rdiSort = localStorageService.get(BrowserStorageItem.rdiInstancesSorting) ?? DEFAULT_SORT
47+
48+
const rdiFiltered = filterAndSort(rdiInstances, searchFilter, rdiSort)
4649
setFilteredDbInstances(dbFiltered)
4750
setFilteredRdiInstances(rdiFiltered)
4851
}, [dbInstances, rdiInstances, searchFilter])

redisinsight/ui/src/components/instance-header/components/instances-navigation-popover/components/instances-list/InstancesList.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ const InstancesList = ({
3737
const instances = selectedTab === InstancesTabs.Databases ? filteredDbInstances : filteredRdiInstances
3838

3939
const connectToInstance = (id = '') => {
40-
dispatch(resetRdiContext())
41-
4240
dispatch(setConnectedInstanceId(id))
4341
setLoading(false)
4442
history.push(Pages.browser(id))
@@ -95,6 +93,13 @@ const InstancesList = ({
9593
return id === rdiInstanceId
9694
}
9795

96+
if (!instances?.length) {
97+
const emptyMsg = selectedTab === InstancesTabs.Databases ? 'No databases' : 'No RDI endpoints'
98+
return (
99+
<div className={styles.emptyMsg}>{emptyMsg}</div>
100+
)
101+
}
102+
98103
return (
99104
<div className={styles.listContainer}>
100105
<EuiListGroup flush maxWidth="none" gutterSize="none">

redisinsight/ui/src/components/instance-header/components/instances-navigation-popover/styles.module.scss

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@
6060
}
6161
}
6262

63+
.emptyMsg {
64+
padding: 20px;
65+
text-align: center;
66+
font-size: 14px !important;
67+
line-height: 16.8px !important;
68+
color: var(--euiTextSubduedColor) !important;
69+
}
70+
6371
.listContainer {
6472
@include eui.scrollBar;
6573
max-height: 160px;
@@ -74,7 +82,6 @@
7482
.loading {
7583
margin-right: 8px;
7684
border-color: var(--separatorDropdownColor) !important;
77-
7885
border-top-color: var(--euiColorGhost) !important;
7986
}
8087
}

redisinsight/ui/src/constants/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ export * from './redisearch'
3333
export * from './browser/keyDetailsHeader'
3434
export * from './tutorials'
3535
export * from './datetime'
36+
export * from './sorting'
3637
export { ApiEndpoints, BrowserStorageItem, ApiStatusCode, apiErrors }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { PropertySort } from '@elastic/eui'
2+
3+
export const DEFAULT_SORT: PropertySort = {
4+
field: 'lastConnection',
5+
direction: 'asc'
6+
}

redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ describe('DatabasesListWrapper', () => {
161161
eventData: {
162162
databaseId: 'e37cc441-a4f2-402c-8bdb-fc2413cbbaff',
163163
provider: 'provider',
164+
source: 'db_list',
164165
RediSearch: {
165166
loaded: false
166167
},

redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import RediStackLightLogo from 'uiSrc/assets/img/modules/redistack/RedisStackLog
2525
import CloudLinkIcon from 'uiSrc/assets/img/oauth/cloud_link.svg?react'
2626
import DatabaseListModules from 'uiSrc/components/database-list-modules/DatabaseListModules'
2727
import ItemList from 'uiSrc/components/item-list'
28-
import { BrowserStorageItem, FeatureFlags, Pages, Theme } from 'uiSrc/constants'
28+
import { BrowserStorageItem, DEFAULT_SORT, FeatureFlags, Pages, Theme } from 'uiSrc/constants'
2929
import { EXTERNAL_LINKS } from 'uiSrc/constants/links'
3030
import { ThemeContext } from 'uiSrc/contexts/themeContext'
3131
import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete'
@@ -93,10 +93,7 @@ const DatabasesListWrapper = (props: Props) => {
9393
const [width, setWidth] = useState(0)
9494
const [, forceRerender] = useState({})
9595
const sortingRef = useRef<PropertySort>(
96-
localStorageService.get(BrowserStorageItem.instancesSorting) ?? {
97-
field: 'lastConnection',
98-
direction: 'asc'
99-
}
96+
localStorageService.get(BrowserStorageItem.instancesSorting) ?? DEFAULT_SORT
10097
)
10198

10299
const deletingIdRef = useRef('')
@@ -152,6 +149,7 @@ const DatabasesListWrapper = (props: Props) => {
152149
eventData: {
153150
databaseId: id,
154151
provider,
152+
source: 'db_list',
155153
...modulesSummary,
156154
}
157155
})

redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useHistory, useLocation } from 'react-router-dom'
55

66
import cx from 'classnames'
77
import ItemList from 'uiSrc/components/item-list'
8-
import { BrowserStorageItem, Pages } from 'uiSrc/constants'
8+
import { BrowserStorageItem, DEFAULT_SORT, Pages } from 'uiSrc/constants'
99
import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete'
1010
import { localStorageService } from 'uiSrc/services'
1111
import { Instance, RdiInstance } from 'uiSrc/slices/interfaces'
@@ -230,10 +230,7 @@ const RdiInstancesListWrapper = ({ width, onEditInstance, editedInstance, onDele
230230
}
231231
}
232232

233-
const sort: PropertySort = localStorageService.get(BrowserStorageItem.rdiInstancesSorting) ?? {
234-
field: 'lastConnection',
235-
direction: 'asc'
236-
}
233+
const sort: PropertySort = localStorageService.get(BrowserStorageItem.rdiInstancesSorting) ?? DEFAULT_SORT
237234

238235
return (
239236
<div className={styles.container}>

redisinsight/ui/src/utils/instance/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import getUrl from './getUrlInstance'
22

33
export * from './instanceModules'
44
export * from './instanceOptions'
5+
export * from './instanceNavigation'
56

67
export {
78
getUrl
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { orderBy } from 'lodash'
2+
import { PropertySort } from '@elastic/eui'
3+
import { Instance, RdiInstance } from 'uiSrc/slices/interfaces'
4+
import { getDbIndex } from '../longNames'
5+
6+
export const filterAndSort = (
7+
arr: Array<Instance | RdiInstance>,
8+
search: string,
9+
sort: PropertySort
10+
): Array<Instance | RdiInstance> => {
11+
if (!arr?.length) return arr
12+
const filtered = arr.filter((instance) => {
13+
const label = `${instance.name} ${getDbIndex(instance.db)}`
14+
return label.toLowerCase?.().includes(search.toLowerCase())
15+
})
16+
17+
const sortingFunc = (ins) => {
18+
if (sort.field === 'lastConnection') {
19+
return ins.lastConnection ? -new Date(`${ins.lastConnection}`) : -Infinity
20+
}
21+
if (sort.field === 'host') {
22+
return `${ins.host}:${ins.port}`
23+
}
24+
return sort.field
25+
}
26+
27+
return orderBy(
28+
filtered,
29+
sortingFunc,
30+
sort.direction
31+
)
32+
}

0 commit comments

Comments
 (0)