Skip to content

Commit ff87281

Browse files
Merge pull request #141 from RedisInsight/feature/RI-2117_Minimize_CLI
* #RI-2117 - Minimize/Maximize CLI and minimize Command Helper
2 parents 6657be6 + 583e9e3 commit ff87281

File tree

22 files changed

+277
-89
lines changed

22 files changed

+277
-89
lines changed

redisinsight/ui/src/components/bottom-group-components/BottomGroupComponents.spec.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { cloneDeep } from 'lodash'
22
import React from 'react'
33

44
import { cleanup, fireEvent, mockedStore, render, screen } from 'uiSrc/utils/test-utils'
5-
import { toggleCli, toggleCliHelper } from 'uiSrc/slices/cli/cli-settings'
5+
import { resetCliHelperSettings, resetCliSettings } from 'uiSrc/slices/cli/cli-settings'
6+
import { resetOutputLoading } from 'uiSrc/slices/cli/cli-output'
67

78
import BottomGroupComponents from './BottomGroupComponents'
89

@@ -43,8 +44,8 @@ describe('BottomGroupComponents', () => {
4344

4445
it('should not to close command helper after closing cli', () => {
4546
render(<BottomGroupComponents />)
46-
fireEvent.click(screen.getByTestId('collapse-cli'))
47-
const expectedActions = [toggleCli()]
47+
fireEvent.click(screen.getByTestId('close-cli'))
48+
const expectedActions = [resetCliSettings(), resetOutputLoading()]
4849
expect(store.getActions()).toEqual(expect.arrayContaining(expectedActions))
4950

5051
expect(screen.getByTestId('command-helper')).toBeInTheDocument()
@@ -54,7 +55,7 @@ describe('BottomGroupComponents', () => {
5455
render(<BottomGroupComponents />)
5556
fireEvent.click(screen.getByTestId('close-command-helper'))
5657

57-
const expectedActions = [toggleCliHelper()]
58+
const expectedActions = [resetCliHelperSettings()]
5859
expect(store.getActions()).toEqual(expect.arrayContaining(expectedActions))
5960

6061
expect(screen.getByTestId('cli')).toBeInTheDocument()

redisinsight/ui/src/components/bottom-group-components/components/bottom-group-minimized/BottomGroupMinimized.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
import React from 'react'
1+
import React, { useEffect } from 'react'
22
import cx from 'classnames'
33
import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'
44
import { useDispatch, useSelector } from 'react-redux'
55
import { useParams } from 'react-router-dom'
66

7+
import {
8+
toggleCli,
9+
toggleCliHelper,
10+
cliSettingsSelector,
11+
clearSearchingCommand,
12+
setCliEnteringCommand,
13+
} from 'uiSrc/slices/cli/cli-settings'
714
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
8-
import { toggleCli, toggleCliHelper, cliSettingsSelector } from 'uiSrc/slices/cli/cli-settings'
915

1016
import styles from '../../styles.module.scss'
1117

@@ -14,6 +20,12 @@ const BottomGroupMinimized = () => {
1420
const { instanceId = '' } = useParams<{ instanceId: string }>()
1521
const dispatch = useDispatch()
1622

23+
useEffect(() =>
24+
() => {
25+
dispatch(clearSearchingCommand())
26+
dispatch(setCliEnteringCommand())
27+
}, [])
28+
1729
const handleExpandCli = () => {
1830
sendEventTelemetry({
1931
event: TelemetryEvent.CLI_OPENED,

redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ describe('CliBody', () => {
244244
key: keys.ESCAPE,
245245
})
246246

247-
expect(screen.getByTestId('collapse-cli')).toHaveFocus()
247+
expect(screen.getByTestId('close-cli')).toHaveFocus()
248248
})
249249

250250
it('"Tab" with command="" should setCommand first command from constants/commands ', () => {

redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ const CliBody = (props: Props) => {
141141
}
142142

143143
const onKeyEsc = () => {
144-
document.getElementById('collapse-cli')?.focus()
144+
document.getElementById('close-cli')?.focus()
145145
}
146146

147147
const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {

redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.spec.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,6 @@ describe('CliBodyWrapper', () => {
7878
expect(render(<CliBodyWrapper />)).toBeTruthy()
7979
})
8080

81-
it('should SessionStorage be called', () => {
82-
const mockUuid = 'test-uuid'
83-
sessionStorageService.get = jest.fn().mockReturnValue(mockUuid)
84-
85-
render(<CliBodyWrapper />)
86-
87-
expect(sessionStorageService.get).toBeCalledWith(BrowserStorageItem.cliClientUuid)
88-
})
89-
9081
it('should render with SessionStorage', () => {
9182
render(<CliBodyWrapper />)
9283

redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { useParams } from 'react-router-dom'
99
import {
1010
cliSettingsSelector,
1111
createCliClientAction,
12-
updateCliClientAction,
1312
setCliEnteringCommand,
1413
clearSearchingCommand,
1514
} from 'uiSrc/slices/cli/cli-settings'
@@ -21,9 +20,7 @@ import {
2120
processUnsupportedCommand,
2221
} from 'uiSrc/slices/cli/cli-output'
2322
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
24-
import { BrowserStorageItem } from 'uiSrc/constants'
2523
import { ConnectionType } from 'uiSrc/slices/interfaces'
26-
import { sessionStorageService } from 'uiSrc/services'
2724
import { ClusterNodeRole } from 'uiSrc/slices/interfaces/cli'
2825
import { connectedInstanceSelector } from 'uiSrc/slices/instances'
2926
import { checkUnsupportedCommand, clearOutput } from 'uiSrc/utils/cliHelper'
@@ -34,8 +31,6 @@ import CliBody from './CliBody'
3431
import styles from './CliBody/styles.module.scss'
3532

3633
const CliBodyWrapper = () => {
37-
const cliClientUuid = sessionStorageService.get(BrowserStorageItem.cliClientUuid) ?? ''
38-
3934
const [command, setCommand] = useState('')
4035

4136
const dispatch = useDispatch()
@@ -46,7 +41,8 @@ const CliBodyWrapper = () => {
4641
unsupportedCommands,
4742
isEnteringCommand,
4843
isSearching,
49-
matchedCommand
44+
matchedCommand,
45+
cliClientUuid,
5046
} = useSelector(cliSettingsSelector)
5147
const { host, port, connectionType } = useSelector(connectedInstanceSelector)
5248

@@ -55,12 +51,7 @@ const CliBodyWrapper = () => {
5551
dispatch(concatToOutput(InitOutputText(host, port)))
5652
}
5753

58-
if (cliClientUuid) {
59-
dispatch(updateCliClientAction(cliClientUuid, onSuccess, onFail))
60-
return
61-
}
62-
63-
dispatch(createCliClientAction(onSuccess, onFail))
54+
!cliClientUuid && dispatch(createCliClientAction(onSuccess, onFail))
6455
}, [])
6556

6657
useEffect(() => {

redisinsight/ui/src/components/cli/components/cli-header/CliHeader.spec.tsx

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import {
1111
waitFor,
1212
} from 'uiSrc/utils/test-utils'
1313
import { BrowserStorageItem } from 'uiSrc/constants'
14-
import { processCliClient, toggleCli } from 'uiSrc/slices/cli/cli-settings'
14+
import { processCliClient, resetCliSettings, toggleCli } from 'uiSrc/slices/cli/cli-settings'
1515
import { connectedInstanceSelector } from 'uiSrc/slices/instances'
1616
import { sessionStorageService } from 'uiSrc/services'
17+
import { resetOutputLoading } from 'uiSrc/slices/cli/cli-output'
1718
import CliHeader from './CliHeader'
1819

1920
let store: typeof mockedStore
@@ -44,39 +45,47 @@ describe('CliHeader', () => {
4445
expect(render(<CliHeader />)).toBeTruthy()
4546
})
4647

47-
it('should "toggleCli" action be called after click "collapse-cli" button', () => {
48+
it('should "resetCliSettings" action be called after click "close-cli" button', () => {
4849
render(<CliHeader />)
49-
fireEvent.click(screen.getByTestId('collapse-cli'))
50+
fireEvent.click(screen.getByTestId('close-cli'))
5051

51-
const expectedActions = [toggleCli()]
52+
const expectedActions = [resetCliSettings(), resetOutputLoading()]
5253
expect(store.getActions()).toEqual(expectedActions)
5354
})
5455

55-
it('should "toggleCli" action be called after click "collapse-cli" button', async () => {
56+
it('should "resetCliSettings" action be called after click "close-cli" button', async () => {
5657
const mockUuid = 'test-uuid'
5758
sessionStorageMock.getItem = jest.fn().mockReturnValue(mockUuid)
5859

5960
render(<CliHeader />)
6061

6162
await waitFor(() => {
62-
fireEvent.click(screen.getByTestId('collapse-cli'))
63+
fireEvent.click(screen.getByTestId('close-cli'))
6364
})
6465

66+
const expectedActions = [resetCliSettings(), resetOutputLoading()]
67+
expect(store.getActions()).toEqual(expectedActions)
68+
})
69+
70+
it('should "toggleCli" action be called after click "hide-cli" button', () => {
71+
render(<CliHeader />)
72+
fireEvent.click(screen.getByTestId('hide-cli'))
73+
6574
const expectedActions = [toggleCli()]
6675
expect(store.getActions()).toEqual(expectedActions)
6776
})
6877

69-
it('should "processCliClient" action be called after unmount with mocked sessionStorage item ', () => {
78+
it('should "toggleCli" action be called after click "hide-cli" button', async () => {
7079
const mockUuid = 'test-uuid'
71-
sessionStorageService.get = jest.fn().mockReturnValue(mockUuid)
72-
73-
const { unmount } = render(<CliHeader />)
80+
sessionStorageMock.getItem = jest.fn().mockReturnValue(mockUuid)
7481

75-
unmount()
82+
render(<CliHeader />)
7683

77-
expect(sessionStorageService.get).toBeCalledWith(BrowserStorageItem.cliClientUuid)
84+
await waitFor(() => {
85+
fireEvent.click(screen.getByTestId('hide-cli'))
86+
})
7887

79-
const expectedActions = [processCliClient()]
88+
const expectedActions = [toggleCli()]
8089
expect(store.getActions()).toEqual(expectedActions)
8190
})
8291

@@ -99,3 +108,23 @@ describe('CliHeader', () => {
99108
expect(endpointEl).toHaveTextContent(endpoint)
100109
})
101110
})
111+
112+
it('should "processCliClient" action be called after close cli with mocked sessionStorage item ', async () => {
113+
const mockUuid = 'test-uuid'
114+
sessionStorageService.get = jest.fn().mockReturnValue(mockUuid)
115+
116+
render(<CliHeader />)
117+
118+
await waitFor(() => {
119+
fireEvent.click(screen.getByTestId('close-cli'))
120+
})
121+
122+
expect(sessionStorageService.get).toBeCalledWith(BrowserStorageItem.cliClientUuid)
123+
124+
const expectedActions = [
125+
processCliClient(),
126+
resetCliSettings(),
127+
resetOutputLoading(),
128+
]
129+
expect(store.getActions()).toEqual(expectedActions)
130+
})

redisinsight/ui/src/components/cli/components/cli-header/CliHeader.tsx

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React, { useEffect } from 'react'
22
import { useDispatch, useSelector } from 'react-redux'
33
import { useParams } from 'react-router-dom'
4-
54
import cx from 'classnames'
65
import {
76
EuiFlexGroup,
@@ -14,13 +13,15 @@ import {
1413
} from '@elastic/eui'
1514

1615
import {
17-
deleteCliClientAction,
1816
toggleCli,
17+
resetCliSettings,
18+
deleteCliClientAction,
1919
} from 'uiSrc/slices/cli/cli-settings'
20-
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
2120
import { BrowserStorageItem } from 'uiSrc/constants'
2221
import { sessionStorageService } from 'uiSrc/services'
2322
import { connectedInstanceSelector } from 'uiSrc/slices/instances'
23+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
24+
import { resetOutputLoading } from 'uiSrc/slices/cli/cli-output'
2425

2526
import styles from './styles.module.scss'
2627

@@ -41,18 +42,29 @@ const CliHeader = () => {
4142
useEffect(() => {
4243
window.addEventListener('beforeunload', removeCliClient, false)
4344
return () => {
44-
removeCliClient()
4545
window.removeEventListener('beforeunload', removeCliClient, false)
4646
}
4747
}, [])
4848

49-
const handleCollapseCli = () => {
49+
const handleCloseCli = () => {
5050
sendEventTelemetry({
5151
event: TelemetryEvent.CLI_HIDDEN,
5252
eventData: {
5353
databaseId: instanceId
5454
}
5555
})
56+
removeCliClient()
57+
dispatch(resetCliSettings())
58+
dispatch(resetOutputLoading())
59+
}
60+
61+
const handleHideCli = () => {
62+
sendEventTelemetry({
63+
event: TelemetryEvent.CLI_MINIMIZED,
64+
eventData: {
65+
databaseId: instanceId
66+
}
67+
})
5668
dispatch(toggleCli())
5769
}
5870

@@ -88,6 +100,24 @@ const CliHeader = () => {
88100
</EuiText>
89101
</EuiToolTip>
90102
</EuiFlexItem>
103+
<EuiFlexItem grow={false}>
104+
<EuiToolTip
105+
content="Minimize"
106+
position="top"
107+
display="inlineBlock"
108+
anchorClassName="flex-row"
109+
>
110+
<EuiButtonIcon
111+
iconType="minus"
112+
color="primary"
113+
id="hide-cli"
114+
aria-label="hide cli"
115+
data-testid="hide-cli"
116+
className={styles.icon}
117+
onClick={handleHideCli}
118+
/>
119+
</EuiToolTip>
120+
</EuiFlexItem>
91121
<EuiFlexItem grow={false}>
92122
<EuiToolTip
93123
content="Close"
@@ -98,11 +128,11 @@ const CliHeader = () => {
98128
<EuiButtonIcon
99129
iconType="cross"
100130
color="primary"
101-
id="collapse-cli"
102-
aria-label="collapse cli"
103-
data-testid="collapse-cli"
131+
id="close-cli"
132+
aria-label="close cli"
133+
data-testid="close-cli"
104134
className={styles.icon}
105-
onClick={handleCollapseCli}
135+
onClick={handleCloseCli}
106136
/>
107137
</EuiToolTip>
108138
</EuiFlexItem>

redisinsight/ui/src/components/command-helper/CommandHelperHeader/CommandHelperHeader.spec.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
render,
77
screen,
88
} from 'uiSrc/utils/test-utils'
9-
import { toggleCliHelper } from 'uiSrc/slices/cli/cli-settings'
9+
import { resetCliHelperSettings, toggleCliHelper } from 'uiSrc/slices/cli/cli-settings'
1010
import CommandHelperHeader from './CommandHelperHeader'
1111

1212
let store: typeof mockedStore
@@ -21,10 +21,18 @@ describe('CommandHelperHeader', () => {
2121
expect(render(<CommandHelperHeader />)).toBeTruthy()
2222
})
2323

24-
it('should "toggleCli" action be called after click "close-command-helper" button', () => {
24+
it('should "resetCliHelperSettings" action be called after click "close-command-helper" button', () => {
2525
render(<CommandHelperHeader />)
2626
fireEvent.click(screen.getByTestId('close-command-helper'))
2727

28+
const expectedActions = [resetCliHelperSettings()]
29+
expect(store.getActions()).toEqual(expectedActions)
30+
})
31+
32+
it('should "toggleCliHelper" action be called after click "hide-command-helper" button', () => {
33+
render(<CommandHelperHeader />)
34+
fireEvent.click(screen.getByTestId('hide-command-helper'))
35+
2836
const expectedActions = [toggleCliHelper()]
2937
expect(store.getActions()).toEqual(expectedActions)
3038
})

0 commit comments

Comments
 (0)