Skip to content

Commit 8119be8

Browse files
committed
#RI-2491 - sort database modules
1 parent 5055576 commit 8119be8

File tree

7 files changed

+100
-12
lines changed

7 files changed

+100
-12
lines changed

redisinsight/ui/src/components/database-list-modules/DatabaseListModules.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from 'uiSrc/slices/interfaces'
1010
import { Theme } from 'uiSrc/constants'
1111
import { getModule, truncateText } from 'uiSrc/utils'
12+
import { IDatabaseModule, sortModules } from 'uiSrc/utils/modules'
1213
import { ThemeContext } from 'uiSrc/contexts/themeContext'
1314

1415
import RedisAILight from 'uiSrc/assets/img/modules/RedisAILight.svg'
@@ -84,13 +85,13 @@ const DatabaseListModules = React.memo((props: Props) => {
8485
const { content, modules, inCircle, highlight, tooltipTitle, maxViewModules, withoutStyles } = props
8586
const { theme } = useContext(ThemeContext)
8687

87-
const mainContent = []
88+
const mainContent: IDatabaseModule[] = []
8889

8990
const handleCopy = (text = '') => {
9091
navigator?.clipboard?.writeText(text)
9192
}
9293

93-
const newModules = modules?.map(({ name: propName, semanticVersion = '', version = '' }) => {
94+
const newModules: IDatabaseModule[] = sortModules(modules?.map(({ name: propName, semanticVersion = '', version = '' }) => {
9495
const moduleName = modulesDefaultInit[propName]?.text || propName
9596

9697
const { abbreviation = '', name = moduleName } = getModule(moduleName)
@@ -104,15 +105,15 @@ const DatabaseListModules = React.memo((props: Props) => {
104105
icon = theme === Theme.Dark ? UnknownDark : UnknownLight
105106
}
106107

107-
mainContent.push({ icon, content, abbreviation })
108+
mainContent.push({ icon, content, abbreviation, moduleName })
108109

109110
return {
110111
moduleName,
111112
icon,
112113
abbreviation,
113114
content
114115
}
115-
})
116+
}))
116117

117118
// set count of hidden modules
118119
if (maxViewModules && newModules.length > maxViewModules + 1) {
@@ -125,7 +126,7 @@ const DatabaseListModules = React.memo((props: Props) => {
125126
})
126127
}
127128

128-
const Content = mainContent.map(({ icon, content, abbreviation = '' }) => (
129+
const Content = sortModules(mainContent).map(({ icon, content, abbreviation = '' }) => (
129130
<div className={styles.tooltipItem} key={content || abbreviation}>
130131
{!!icon && (<EuiIcon type={icon} style={{ marginRight: 10 }} />)}
131132
{!icon && (
@@ -141,8 +142,9 @@ const DatabaseListModules = React.memo((props: Props) => {
141142
</div>
142143
))
143144

144-
const Module = (moduleName: string = '', abbreviation: string = '', icon: string, content: string = '') => (
145-
<span key={moduleName || abbreviation || content}>
145+
const Module = (moduleName: string = '', abbreviation: string = '', icon: string, content: string = '') => {
146+
return (
147+
<span key={moduleName || abbreviation || content}>
146148
{icon ? (
147149
<EuiButtonIcon
148150
iconType={icon}
@@ -162,7 +164,8 @@ const DatabaseListModules = React.memo((props: Props) => {
162164
</EuiTextColor>
163165
)}
164166
</span>
165-
)
167+
)
168+
}
166169

167170
const Modules = () => (
168171
newModules.map(({ icon, content, abbreviation, moduleName }, i) => (
@@ -197,6 +200,7 @@ const DatabaseListModules = React.memo((props: Props) => {
197200
title={tooltipTitle ?? undefined}
198201
display="inlineBlock"
199202
content={Content}
203+
data-testid="modules-tooltip"
200204
>
201205
<>
202206
{content ?? Modules()}

redisinsight/ui/src/components/database-overview/DatabaseOverview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const DatabaseOverview = (props: Props) => {
6363
}, [windowDimensions, metricsProps, modulesProps])
6464

6565
const RediStackLogo = (
66-
<div className={styles.RediStackLogoWrapper}>
66+
<div className={styles.RediStackLogoWrapper} data-testid="redis-stack-logo">
6767
<EuiIcon type={theme === Theme.Dark ? RediStackDark : RediStackLight} className={styles.redistackIcon}/>
6868
<EuiIcon type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo} className={styles.redistackLogoIcon}/>
6969
</div>

redisinsight/ui/src/pages/home/components/DatabaseAlias/DatabaseAlias.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ const DatabaseAlias = (props: Props) => {
7979
<EuiFlexGroup responsive={false} justifyContent="spaceBetween" gutterSize="xs">
8080
{isRediStack && (
8181
<EuiFlexItem grow={false}>
82-
<EuiIcon type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo} className={styles.redistackIcon}/>
82+
<EuiIcon
83+
type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo}
84+
className={styles.redistackIcon}
85+
data-testid="redis-stack-icon"
86+
/>
8387
</EuiFlexItem>
8488
)}
8589
<EuiFlexItem

redisinsight/ui/src/pages/home/components/DatabasesListComponent/DatabasesListWrapper.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ const DatabasesListWrapper = ({
301301
content={isRediStack ? (
302302
<EuiIcon
303303
type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo}
304+
data-testid="redis-stack-icon"
304305
/>
305306
) : undefined}
306307
modules={modules}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { DATABASE_LIST_MODULES_TEXT, RedisDefaultModules } from 'uiSrc/slices/interfaces'
2+
3+
export interface IDatabaseModule {
4+
abbreviation: string
5+
moduleName: string
6+
icon?: any
7+
content?: any,
8+
[key: string]: any
9+
}
10+
11+
const PREDEFINED_MODULES_ORDER = [
12+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Search],
13+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.ReJSON],
14+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.TimeSeries],
15+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Bloom],
16+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Gears],
17+
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.AI]
18+
]
19+
20+
export const sortModules = (modules: IDatabaseModule[]) => {
21+
return modules.sort((a, b) => {
22+
if (!a.moduleName && !a.abbreviation) return 1
23+
if (!b.moduleName && !b.abbreviation) return -1
24+
if (PREDEFINED_MODULES_ORDER.indexOf(a.moduleName) === -1) return 1
25+
if (PREDEFINED_MODULES_ORDER.indexOf(b.moduleName) === -1) return -1
26+
return PREDEFINED_MODULES_ORDER.indexOf(a.moduleName) - PREDEFINED_MODULES_ORDER.indexOf(b.moduleName)
27+
})
28+
}

redisinsight/ui/src/utils/redistack.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { map, isEqual } from 'lodash'
2-
import { Instance } from 'uiSrc/slices/interfaces'
2+
import { Instance, RedisDefaultModules } from 'uiSrc/slices/interfaces'
33

44
export const REDISTACK_PORT = 6379
5-
export const REDISTACK_MODULES = ['ReJSON', 'graph', 'timeseries', 'search', 'bf'].sort()
5+
export const REDISTACK_MODULES = [
6+
RedisDefaultModules.ReJSON,
7+
RedisDefaultModules.Graph,
8+
RedisDefaultModules.TimeSeries,
9+
RedisDefaultModules.Search,
10+
RedisDefaultModules.Bloom,
11+
].sort()
612

713
const checkRediStackModules = (modules: any[]) => isEqual(map(modules, 'name').sort(), REDISTACK_MODULES)
814

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { IDatabaseModule, sortModules } from 'uiSrc/utils/modules'
2+
3+
const modules1: IDatabaseModule[] = [
4+
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
5+
{ moduleName: 'My1Module', abbreviation: 'MD' },
6+
{ moduleName: 'RediSearch', abbreviation: 'RS' },
7+
]
8+
const modules2: IDatabaseModule[] = [
9+
{ moduleName: '', abbreviation: '' },
10+
{ moduleName: '', abbreviation: '' },
11+
{ moduleName: 'RedisBloom', abbreviation: 'RS' },
12+
{ moduleName: '', abbreviation: '' },
13+
{ moduleName: '', abbreviation: '' },
14+
{ moduleName: 'MycvModule', abbreviation: 'MC' },
15+
{ moduleName: 'My1Module', abbreviation: 'MD' },
16+
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
17+
{ moduleName: 'My2Modul2e', abbreviation: 'MX' },
18+
{ moduleName: 'RediSearch', abbreviation: 'RS' },
19+
]
20+
21+
const result1: IDatabaseModule[] = [
22+
{ moduleName: 'RediSearch', abbreviation: 'RS' },
23+
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
24+
{ moduleName: 'My1Module', abbreviation: 'MD' }
25+
]
26+
27+
const result2: IDatabaseModule[] = [
28+
{ moduleName: 'RediSearch', abbreviation: 'RS' },
29+
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
30+
{ moduleName: 'RedisBloom', abbreviation: 'RS' },
31+
{ moduleName: 'MycvModule', abbreviation: 'MC' },
32+
{ moduleName: 'My1Module', abbreviation: 'MD' },
33+
{ moduleName: 'My2Modul2e', abbreviation: 'MX' },
34+
{ moduleName: '', abbreviation: '' },
35+
{ moduleName: '', abbreviation: '' },
36+
{ moduleName: '', abbreviation: '' },
37+
{ moduleName: '', abbreviation: '' },
38+
]
39+
40+
describe('sortModules', () => {
41+
it('should proper sort modules list', () => {
42+
expect(sortModules(modules1)).toEqual(result1)
43+
expect(sortModules(modules2)).toEqual(result2)
44+
})
45+
})

0 commit comments

Comments
 (0)