Skip to content

Commit 51f930c

Browse files
authored
Merge pull request #2593 from RedisInsight/fe/feature/RI-4944_browser_navigation
#RI-4944 - rework browser navigation
2 parents e36548c + 8ae4170 commit 51f930c

File tree

27 files changed

+261
-198
lines changed

27 files changed

+261
-198
lines changed

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

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,19 @@
1-
import React, { useContext, useEffect, useState } from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import cx from 'classnames'
3-
import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText, EuiToolTip } from '@elastic/eui'
3+
import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiToolTip } from '@elastic/eui'
44
import MoreInfoPopover from 'uiSrc/components/database-overview/components/MoreInfoPopover'
5-
import { Theme } from 'uiSrc/constants'
6-
import { ThemeContext } from 'uiSrc/contexts/themeContext'
75
import { sortModulesByName } from 'uiSrc/utils/modules'
86

9-
import RediStackDark from 'uiSrc/assets/img/modules/redistack/RediStackDark.svg'
10-
import RediStackDarkMin from 'uiSrc/assets/img/modules/redistack/RediStackDark-min.svg'
11-
import RediStackLight from 'uiSrc/assets/img/modules/redistack/RediStackLight.svg'
12-
import RediStackLightMin from 'uiSrc/assets/img/modules/redistack/RediStackLight-min.svg'
13-
import RediStackLightLogo from 'uiSrc/assets/img/modules/redistack/RedisStackLogoLight.svg'
14-
import RediStackDarkLogo from 'uiSrc/assets/img/modules/redistack/RedisStackLogoDark.svg'
15-
167
import { AdditionalRedisModule } from 'apiSrc/modules/database/models/additional.redis.module'
178
import { getResolutionLimits } from './utils/resolutionHelper'
189
import { IMetric } from './components/OverviewMetrics'
19-
import DatabaseListModules from '../database-list-modules/DatabaseListModules'
2010

2111
import styles from './styles.module.scss'
2212

2313
interface Props {
2414
windowDimensions: number
2515
metrics?: Array<IMetric>
2616
modules?: Array<AdditionalRedisModule>
27-
isRediStack?: boolean
2817
}
2918

3019
interface IState<T> {
@@ -33,11 +22,9 @@ interface IState<T> {
3322
}
3423

3524
const DatabaseOverview = (props: Props) => {
36-
const { metrics: metricsProps = [], modules: modulesProps = [], windowDimensions, isRediStack } = props
25+
const { metrics: metricsProps = [], modules: modulesProps = [], windowDimensions } = props
3726
const [metrics, setMetrics] = useState<IState<IMetric>>({ visible: [], hidden: [] })
38-
const [modules, setModules] = useState<IState<AdditionalRedisModule>>({ visible: [], hidden: [] })
39-
40-
const { theme } = useContext(ThemeContext)
27+
const [modules, setModules] = useState<AdditionalRedisModule[]>([])
4128

4229
useEffect(() => {
4330
const resolutionLimits = getResolutionLimits(
@@ -61,25 +48,9 @@ const DatabaseOverview = (props: Props) => {
6148
setMetrics(metricsState)
6249

6350
const sortedModules = sortModulesByName(modulesProps)
64-
setModules({
65-
visible: sortedModules.slice(0, resolutionLimits.modules),
66-
hidden: sortedModules.slice(resolutionLimits.modules)
67-
})
51+
setModules(sortedModules)
6852
}, [windowDimensions, metricsProps, modulesProps])
6953

70-
const RediStackLogo = (
71-
<div className={styles.RediStackLogoWrapper} data-testid="redis-stack-logo">
72-
<EuiIcon
73-
type={theme === Theme.Dark ? RediStackDark : RediStackLight}
74-
className={styles.redistackIcon}
75-
/>
76-
<EuiIcon
77-
type={theme === Theme.Dark ? RediStackDarkMin : RediStackLightMin}
78-
className={styles.redistackLogoIcon}
79-
/>
80-
</div>
81-
)
82-
8354
const getTooltipContent = (metric: IMetric) => {
8455
if (!metric.children?.length) {
8556
return (
@@ -127,7 +98,6 @@ const DatabaseOverview = (props: Props) => {
12798
'flex-row',
12899
styles.itemContainer,
129100
styles.overview,
130-
{ [styles.noModules]: !modules.visible?.length, [styles.RediStack]: isRediStack }
131101
)}
132102
>
133103
<EuiFlexGroup gutterSize="none" responsive={false}>
@@ -172,32 +142,11 @@ const DatabaseOverview = (props: Props) => {
172142
'flex-row',
173143
styles.itemContainer,
174144
styles.modules,
175-
{ [styles.noModules]: !modules.visible?.length, [styles.RediStack]: isRediStack }
176145
)}
177146
>
178-
{isRediStack && (
179-
<DatabaseListModules
180-
content={isRediStack ? RediStackLogo : undefined}
181-
modules={modulesProps}
182-
tooltipTitle={isRediStack ? (
183-
<>
184-
<EuiIcon
185-
type={theme === Theme.Dark ? RediStackDarkLogo : RediStackLightLogo}
186-
className={styles.tooltipLogo}
187-
data-testid="tooltip-redis-stack-icon"
188-
/>
189-
<EuiText color="subdued" style={{ marginTop: 4, marginBottom: -4 }}>Includes</EuiText>
190-
</>
191-
) : undefined}
192-
withoutStyles
193-
/>
194-
)}
195-
{(!isRediStack && !!modules.visible?.length) && (
196-
<DatabaseListModules dark inCircle modules={modules.visible} />
197-
)}
198147
<MoreInfoPopover
199148
metrics={metrics.hidden}
200-
modules={isRediStack ? [...modules.hidden, ...modules.visible] : modules.hidden}
149+
modules={modules}
201150
/>
202151
</div>
203152
</EuiFlexItem>

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface IProps { windowDimensions: number }
1717
const DatabaseOverviewWrapper = ({ windowDimensions } :IProps) => {
1818
let interval: NodeJS.Timeout
1919
const { theme } = useContext(ThemeContext)
20-
const { id: connectedInstanceId = '', modules = [], isRediStack, db } = useSelector(connectedInstanceSelector)
20+
const { id: connectedInstanceId = '', modules = [], db } = useSelector(connectedInstanceSelector)
2121
const overview = useSelector(connectedInstanceOverviewSelector)
2222

2323
const dispatch = useDispatch()
@@ -40,7 +40,6 @@ const DatabaseOverviewWrapper = ({ windowDimensions } :IProps) => {
4040
modules={modules}
4141
metrics={getOverviewMetrics({ theme, items: overview, db })}
4242
windowDimensions={windowDimensions}
43-
isRediStack={isRediStack}
4443
/>
4544
)
4645
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,11 @@ const MoreInfoPopover = ({ metrics, modules }: IProps) => {
102102
<h4 className={styles.mi_fieldName}>Modules</h4>
103103
{
104104
modules?.map(({ name = '', semanticVersion = '', version = '' }) => (
105-
<div key={name} className={cx(styles.mi_moduleName)}>
105+
<div
106+
key={name}
107+
className={cx(styles.mi_moduleName)}
108+
data-testid={`${truncateText(getModule(name)?.name || DATABASE_LIST_MODULES_TEXT[name] || name, 50)}`}
109+
>
106110
{`${truncateText(getModule(name)?.name || DATABASE_LIST_MODULES_TEXT[name] || name, 50)} `}
107111
{!!(semanticVersion || version) && (
108112
<span className={styles.mi_version}>

redisinsight/ui/src/components/database-overview/styles.module.scss

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,21 @@
1919
margin-left: 6px;
2020
}
2121

22-
.overview {
23-
&.noModules,
24-
&.RediStack {
25-
.overviewItem {
26-
&:last-child {
27-
border-right: 1px solid var(--separatorColor);
28-
}
29-
}
30-
}
31-
}
32-
3322
.modules {
3423
padding-left: 0;
3524
padding-right: 0;
3625
}
3726

38-
.noModules {
39-
//
40-
}
41-
4227
.overviewItem {
4328
padding: 6px 20px;
4429
min-width: 116px;
4530
color: var(--euiTextSubduedColor);
31+
border-right: 1px solid var(--separatorColor);
4632

4733
@media only screen and (max-width: 1024px) {
4834
padding: 6px 10px;
4935
min-width: 96px;
5036
}
51-
&:not(:last-child) {
52-
border-right: 1px solid var(--separatorColor);
53-
}
5437

5538
@media only screen and (max-width: 1124px) {
5639
border-right: 1px solid var(--separatorColor);

redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { cloneDeep } from 'lodash'
22
import React from 'react'
3+
import reactRouterDom from 'react-router-dom'
34
import { instance, mock } from 'ts-mockito'
45
import { cleanup, mockedStore, render, screen, fireEvent } from 'uiSrc/utils/test-utils'
56
import {
@@ -47,6 +48,13 @@ jest.mock('uiSrc/slices/app/context', () => ({
4748
})
4849
}))
4950

51+
jest.mock('react-router-dom', () => ({
52+
...jest.requireActual('react-router-dom'),
53+
useHistory: () => ({
54+
push: jest.fn,
55+
}),
56+
}))
57+
5058
describe('InstanceHeader', () => {
5159
it('should render', () => {
5260
expect(render(<InstanceHeader {...instance(mockedProps)} />)).toBeTruthy()
@@ -114,4 +122,16 @@ describe('InstanceHeader', () => {
114122

115123
expect(screen.getByTestId('change-index-btn')).toBeDisabled()
116124
})
125+
126+
it('should call history push with proper path', () => {
127+
const pushMock = jest.fn()
128+
reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock })
129+
130+
render(<InstanceHeader {...instance(mockedProps)} />)
131+
132+
fireEvent.click(screen.getByTestId('my-redis-db-btn'))
133+
134+
expect(pushMock).toHaveBeenCalledTimes(1)
135+
expect(pushMock).toHaveBeenCalledWith('/')
136+
})
117137
})

redisinsight/ui/src/components/instance-header/InstanceHeader.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { useHistory } from 'react-router-dom'
44
import cx from 'classnames'
55
import {
66
EuiButtonEmpty,
7-
EuiButtonIcon,
87
EuiFieldNumber,
98
EuiFlexGroup,
109
EuiFlexItem,
1110
EuiIcon,
12-
EuiToolTip
11+
EuiToolTip,
12+
EuiText,
1313
} from '@elastic/eui'
1414

1515
import { Pages } from 'uiSrc/constants'
@@ -114,20 +114,23 @@ const InstanceHeader = ({ onChangeDbIndex }: Props) => {
114114
position="bottom"
115115
content={server?.buildType === BuildType.RedisStack ? 'Edit database' : 'My Redis databases'}
116116
>
117-
<EuiButtonIcon
118-
display="empty"
119-
size="s"
120-
iconSize="l"
121-
iconType="sortLeft"
117+
<EuiText
118+
className={styles.breadCrumbLink}
122119
aria-label={server?.buildType === BuildType.RedisStack ? 'Edit database' : 'My Redis databases'}
123-
data-testid="my-redis-db-icon"
120+
data-testid="my-redis-db-btn"
124121
onClick={goHome}
125-
/>
122+
onKeyDown={goHome}
123+
>
124+
Databases
125+
</EuiText>
126126
</EuiToolTip>
127127
</div>
128128
<div style={{ flex: 1, overflow: 'hidden' }}>
129129
<div style={{ maxWidth: '100%' }}>
130130
<EuiFlexGroup gutterSize="none" alignItems="center" responsive={false}>
131+
<EuiFlexItem grow={false}>
132+
<EuiText className={styles.divider}>&#62;</EuiText>
133+
</EuiFlexItem>
131134
<EuiFlexItem style={{ overflow: 'hidden' }}>
132135
<b className={styles.dbName}>{name}</b>
133136
</EuiFlexItem>

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,18 @@
1010

1111
& > div {
1212
display: flex;
13-
&:not(:last-of-type) {
14-
margin-right: 12px;
13+
}
14+
15+
.breadCrumbLink {
16+
color: var(--euiColorPrimary) !important;
17+
font-size: 14px !important;
18+
line-height: 20px;
19+
font-weight: 400;
20+
cursor: pointer;
21+
text-decoration: underline;
22+
23+
&:hover {
24+
text-decoration: none;
1525
}
1626
}
1727
}
@@ -37,9 +47,9 @@
3747
.dbName {
3848
display: inline-block !important;
3949
overflow: hidden;
40-
font-size: 16px;
50+
font-size: 14px;
4151
line-height: 20px;
42-
font-weight: 500;
52+
font-weight: 400;
4353
text-overflow: ellipsis;
4454
max-width: 100%;
4555
white-space: nowrap;
@@ -61,3 +71,11 @@
6171
width: 60px !important;
6272
}
6373

74+
.divider {
75+
color: var(--euiTextSubduedColor);
76+
font-size: 14px;
77+
line-height: 20px;
78+
font-weight: 400;
79+
margin: 0 8px;
80+
}
81+

0 commit comments

Comments
 (0)