Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
} from 'uiSrc/slices/interfaces'
import { Theme } from 'uiSrc/constants'
import { getModule, truncateText } from 'uiSrc/utils'
import { IDatabaseModule, sortModules } from 'uiSrc/utils/modules'
import { ThemeContext } from 'uiSrc/contexts/themeContext'

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

const mainContent = []
const mainContent: IDatabaseModule[] = []

const handleCopy = (text = '') => {
navigator?.clipboard?.writeText(text)
}

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

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

mainContent.push({ icon, content, abbreviation })
mainContent.push({ icon, content, abbreviation, moduleName })

return {
moduleName,
icon,
abbreviation,
content
}
})
}))

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

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

const Module = (moduleName: string = '', abbreviation: string = '', icon: string, content: string = '') => (
<span key={moduleName || abbreviation || content}>
const Module = (moduleName: string = '', abbreviation: string = '', icon: string, content: string = '') => {
return (
<span key={moduleName || abbreviation || content}>
{icon ? (
<EuiButtonIcon
iconType={icon}
Expand All @@ -162,7 +164,8 @@ const DatabaseListModules = React.memo((props: Props) => {
</EuiTextColor>
)}
</span>
)
)
}

const Modules = () => (
newModules.map(({ icon, content, abbreviation, moduleName }, i) => (
Expand Down Expand Up @@ -197,6 +200,7 @@ const DatabaseListModules = React.memo((props: Props) => {
title={tooltipTitle ?? undefined}
display="inlineBlock"
content={Content}
data-testid="modules-tooltip"
>
<>
{content ?? Modules()}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ const DatabaseOverview = (props: Props) => {
}, [windowDimensions, metricsProps, modulesProps])

const RediStackLogo = (
<div className={styles.RediStackLogoWrapper}>
<div className={styles.RediStackLogoWrapper} data-testid="redis-stack-logo">
<EuiIcon type={theme === Theme.Dark ? RediStackDark : RediStackLight} className={styles.redistackIcon}/>
<EuiIcon type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo} className={styles.redistackLogoIcon}/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,11 @@ const DatabaseAlias = (props: Props) => {
<EuiFlexGroup responsive={false} justifyContent="spaceBetween" gutterSize="xs">
{isRediStack && (
<EuiFlexItem grow={false}>
<EuiIcon type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo} className={styles.redistackIcon}/>
<EuiIcon
type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo}
className={styles.redistackIcon}
data-testid="redis-stack-icon"
/>
</EuiFlexItem>
)}
<EuiFlexItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ const DatabasesListWrapper = ({
content={isRediStack ? (
<EuiIcon
type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo}
data-testid="redis-stack-icon"
/>
) : undefined}
modules={modules}
Expand Down
28 changes: 28 additions & 0 deletions redisinsight/ui/src/utils/modules.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { DATABASE_LIST_MODULES_TEXT, RedisDefaultModules } from 'uiSrc/slices/interfaces'

export interface IDatabaseModule {
abbreviation: string
moduleName: string
icon?: any
content?: any,
[key: string]: any
}

const PREDEFINED_MODULES_ORDER = [
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Search],
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.ReJSON],
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.TimeSeries],
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Bloom],
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.Gears],
DATABASE_LIST_MODULES_TEXT[RedisDefaultModules.AI]
]

export const sortModules = (modules: IDatabaseModule[]) => {
return modules.sort((a, b) => {
if (!a.moduleName && !a.abbreviation) return 1
if (!b.moduleName && !b.abbreviation) return -1
if (PREDEFINED_MODULES_ORDER.indexOf(a.moduleName) === -1) return 1
if (PREDEFINED_MODULES_ORDER.indexOf(b.moduleName) === -1) return -1
return PREDEFINED_MODULES_ORDER.indexOf(a.moduleName) - PREDEFINED_MODULES_ORDER.indexOf(b.moduleName)
})
}
10 changes: 8 additions & 2 deletions redisinsight/ui/src/utils/redistack.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import { map, isEqual } from 'lodash'
import { Instance } from 'uiSrc/slices/interfaces'
import { Instance, RedisDefaultModules } from 'uiSrc/slices/interfaces'

export const REDISTACK_PORT = 6379
export const REDISTACK_MODULES = ['ReJSON', 'graph', 'timeseries', 'search', 'bf'].sort()
export const REDISTACK_MODULES = [
RedisDefaultModules.ReJSON,
RedisDefaultModules.Graph,
RedisDefaultModules.TimeSeries,
RedisDefaultModules.Search,
RedisDefaultModules.Bloom,
].sort()

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

Expand Down
45 changes: 45 additions & 0 deletions redisinsight/ui/src/utils/tests/modules.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { IDatabaseModule, sortModules } from 'uiSrc/utils/modules'

const modules1: IDatabaseModule[] = [
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
{ moduleName: 'My1Module', abbreviation: 'MD' },
{ moduleName: 'RediSearch', abbreviation: 'RS' },
]
const modules2: IDatabaseModule[] = [
{ moduleName: '', abbreviation: '' },
{ moduleName: '', abbreviation: '' },
{ moduleName: 'RedisBloom', abbreviation: 'RS' },
{ moduleName: '', abbreviation: '' },
{ moduleName: '', abbreviation: '' },
{ moduleName: 'MycvModule', abbreviation: 'MC' },
{ moduleName: 'My1Module', abbreviation: 'MD' },
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
{ moduleName: 'My2Modul2e', abbreviation: 'MX' },
{ moduleName: 'RediSearch', abbreviation: 'RS' },
]

const result1: IDatabaseModule[] = [
{ moduleName: 'RediSearch', abbreviation: 'RS' },
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
{ moduleName: 'My1Module', abbreviation: 'MD' }
]

const result2: IDatabaseModule[] = [
{ moduleName: 'RediSearch', abbreviation: 'RS' },
{ moduleName: 'RedisJSON', abbreviation: 'RS' },
{ moduleName: 'RedisBloom', abbreviation: 'RS' },
{ moduleName: 'MycvModule', abbreviation: 'MC' },
{ moduleName: 'My1Module', abbreviation: 'MD' },
{ moduleName: 'My2Modul2e', abbreviation: 'MX' },
{ moduleName: '', abbreviation: '' },
{ moduleName: '', abbreviation: '' },
{ moduleName: '', abbreviation: '' },
{ moduleName: '', abbreviation: '' },
]

describe('sortModules', () => {
it('should proper sort modules list', () => {
expect(sortModules(modules1)).toEqual(result1)
expect(sortModules(modules2)).toEqual(result2)
})
})