Skip to content

Commit ce16baa

Browse files
Merge pull request #4280 from RedisInsight/fe/feature/RI-6372-remember-context-when-switching-btw-rdi
RI-6372 remember context when switching btw rdis
2 parents 6a3ecfa + f1249e7 commit ce16baa

File tree

38 files changed

+382
-624
lines changed

38 files changed

+382
-624
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ const InstancesNavigationPopover = ({ name }: Props) => {
137137
selectedTab={selectedTab}
138138
filteredDbInstances={filteredDbInstances}
139139
filteredRdiInstances={filteredRdiInstances}
140+
onItemClick={showPopover}
140141
/>
141142
<div>
142143
<EuiSpacer size="m" />

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

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
import React, { useState } from 'react'
22
import { EuiListGroup, EuiListGroupItem, EuiLoadingSpinner, EuiText } from '@elastic/eui'
3-
import { useDispatch, useSelector } from 'react-redux'
3+
import { useDispatch } from 'react-redux'
44
import { useHistory, useParams } from 'react-router-dom'
5-
import { checkConnectToRdiInstanceAction, instancesSelector as rdiInstancesSelector } from 'uiSrc/slices/rdi/instances'
6-
import { checkConnectToInstanceAction, instancesSelector as dbInstancesSelector, setConnectedInstanceId } from 'uiSrc/slices/instances/instances'
5+
import { checkConnectToRdiInstanceAction } from 'uiSrc/slices/rdi/instances'
6+
import { checkConnectToInstanceAction, setConnectedInstanceId } from 'uiSrc/slices/instances/instances'
77
import { Pages } from 'uiSrc/constants'
8-
import { resetRdiContext, setAppContextInitialState } from 'uiSrc/slices/app/context'
9-
import { resetKeys } from 'uiSrc/slices/browser/keys'
10-
import { resetRedisearchKeysData } from 'uiSrc/slices/browser/redisearch'
11-
import { resetCliHelperSettings, resetCliSettingsAction } from 'uiSrc/slices/cli/cli-settings'
128
import { Instance, RdiInstance } from 'uiSrc/slices/interfaces'
139
import { TelemetryEvent, getRedisModulesSummary, sendEventTelemetry } from 'uiSrc/telemetry'
1410
import { getDbIndex } from 'uiSrc/utils'
@@ -19,31 +15,32 @@ export interface InstancesListProps {
1915
selectedTab: InstancesTabs
2016
filteredDbInstances: Instance[]
2117
filteredRdiInstances: RdiInstance[]
18+
onItemClick: () => void
2219
}
2320

2421
const InstancesList = ({
2522
selectedTab,
2623
filteredDbInstances,
2724
filteredRdiInstances,
25+
onItemClick,
2826
} :InstancesListProps) => {
2927
const [loading, setLoading] = useState<boolean>(false)
3028
const [selected, setSelected] = useState<string>('')
3129

3230
const { instanceId, rdiInstanceId } = useParams<{ instanceId: string, rdiInstanceId: string }>()
3331
const history = useHistory()
3432
const dispatch = useDispatch()
35-
const { connectedInstance: connectedRdiInstance } = useSelector(rdiInstancesSelector)
36-
const { connectedInstance: connectedDbInstance } = useSelector(dbInstancesSelector)
3733
const instances = selectedTab === InstancesTabs.Databases ? filteredDbInstances : filteredRdiInstances
3834

3935
const connectToInstance = (id = '') => {
4036
dispatch(setConnectedInstanceId(id))
4137
setLoading(false)
38+
onItemClick?.()
4239
history.push(Pages.browser(id))
4340
}
4441

4542
const goToInstance = (instance: Instance) => {
46-
if (connectedDbInstance?.id === instance.id) {
43+
if (instanceId === instance.id) {
4744
// already connected so do nothing
4845
return
4946
}
@@ -62,7 +59,7 @@ const InstancesList = ({
6259
}
6360

6461
const goToRdiInstance = (instance: RdiInstance) => {
65-
if (connectedRdiInstance?.id === instance.id) {
62+
if (rdiInstanceId === instance.id) {
6663
// already connected so do nothing
6764
return
6865
}
@@ -71,7 +68,7 @@ const InstancesList = ({
7168
instance.id,
7269
(id: string) => {
7370
setLoading(false)
74-
71+
onItemClick?.()
7572
history.push(Pages.rdiPipelineConfig(id))
7673
},
7774
() => setLoading(false)

redisinsight/ui/src/pages/instance/InstancePage.spec.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
setConnectedInstance,
3030
setDefaultInstance
3131
} from 'uiSrc/slices/instances/instances'
32-
import { resetConnectedInstance as resetRdiConnectedInstance, loadInstances as loadRdiInstances } from 'uiSrc/slices/rdi/instances'
32+
import { loadInstances as loadRdiInstances } from 'uiSrc/slices/rdi/instances'
3333
import { clearExpertChatHistory } from 'uiSrc/slices/panels/aiAssistant'
3434
import { getAllPlugins } from 'uiSrc/slices/app/plugins'
3535
import { FeatureFlags } from 'uiSrc/constants'
@@ -138,7 +138,6 @@ describe('InstancePage', () => {
138138
clearExpertChatHistory(),
139139
setAppContextConnectedInstanceId(INSTANCE_ID_MOCK),
140140
setDbConfig(undefined),
141-
resetRdiConnectedInstance(),
142141
]
143142

144143
expect(store.getActions().slice(0, expectedActions.length)).toEqual(expectedActions)

redisinsight/ui/src/pages/instance/InstancePage.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,6 @@ const InstancePage = ({ routes = [] }: Props) => {
9797
dispatch(setAppContextConnectedInstanceId(connectionInstanceId))
9898
dispatch(setDbConfig(localStorageService.get(BrowserStorageItem.dbConfig + connectionInstanceId)))
9999

100-
// clear rdi connection
101-
dispatch(resetRdiConnectedInstance())
102-
103100
return () => {
104101
intervalId && clearInterval(intervalId)
105102
}

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
deleteInstancesAction,
1414
checkConnectToRdiInstanceAction,
1515
instancesSelector,
16-
resetConnectedInstance as resetConnectedRdiInstance,
1716
} from 'uiSrc/slices/rdi/instances'
1817
import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry'
1918
import { Nullable, formatLongName, lastConnectionFormat } from 'uiSrc/utils'
@@ -80,10 +79,7 @@ const RdiInstancesListWrapper = ({ width, onEditInstance, editedInstance, onDele
8079
dispatch(checkConnectToRdiInstanceAction(
8180
id,
8281
(id: string) => history.push(Pages.rdiPipeline(id)),
83-
() => {
84-
dispatch(resetConnectedRdiInstance())
85-
dispatch(setAppContextConnectedRdiInstanceId(''))
86-
}
82+
() => dispatch(setAppContextConnectedRdiInstanceId(''))
8783
))
8884
}
8985

redisinsight/ui/src/pages/rdi/instance/InstancePage.spec.tsx

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
resetPipelineManagement,
1414
setAppContextConnectedRdiInstanceId,
1515
setAppContextInitialState,
16-
setPipelineDialogState,
1716
} from 'uiSrc/slices/app/context'
1817
import { resetCliHelperSettings } from 'uiSrc/slices/cli/cli-settings'
1918
import { resetRedisearchKeysData, setRedisearchInitialState } from 'uiSrc/slices/browser/redisearch'
@@ -28,7 +27,7 @@ import {
2827
} from 'uiSrc/slices/instances/instances'
2928
import { setConnectedInstance, loadInstances as loadRdiInstances } from 'uiSrc/slices/rdi/instances'
3029
import { PageNames, Pages } from 'uiSrc/constants'
31-
import { getPipelineStatus, setPipelineInitialState } from 'uiSrc/slices/rdi/pipeline'
30+
import { getPipelineStatus, setPipelineConfig, setPipelineInitialState, setPipelineJobs } from 'uiSrc/slices/rdi/pipeline'
3231
import { clearExpertChatHistory } from 'uiSrc/slices/panels/aiAssistant'
3332

3433
import InstancePage, { Props } from './InstancePage'
@@ -106,6 +105,8 @@ describe('InstancePage', () => {
106105
loadRdiInstances(),
107106
setAppContextConnectedRdiInstanceId(''),
108107
setPipelineInitialState(),
108+
setPipelineConfig(''),
109+
setPipelineJobs([]),
109110
resetPipelineManagement(),
110111
setConnectedInstance(),
111112
setAppContextConnectedRdiInstanceId('rdiInstanceId'),
@@ -136,6 +137,8 @@ describe('InstancePage', () => {
136137
loadRdiInstances(),
137138
setAppContextConnectedRdiInstanceId(''),
138139
setPipelineInitialState(),
140+
setPipelineConfig(''),
141+
setPipelineJobs([]),
139142
resetPipelineManagement(),
140143
setConnectedInstance()
141144
]
@@ -187,20 +190,4 @@ describe('InstancePage', () => {
187190

188191
expect(pushMock).toBeCalledWith(Pages.rdiStatistics(RDI_INSTANCE_ID_MOCK))
189192
})
190-
191-
it('should save proper page on unmount', () => {
192-
const { unmount } = render(
193-
<BrowserRouter>
194-
<InstancePage {...instance(mockedProps)} />
195-
</BrowserRouter>
196-
)
197-
198-
unmount()
199-
const expectedActions = [
200-
setPipelineInitialState(),
201-
setPipelineDialogState(true)
202-
]
203-
204-
expect(store.getActions().slice(0 - expectedActions.length)).toEqual(expectedActions)
205-
})
206193
})

redisinsight/ui/src/pages/rdi/instance/InstancePage.tsx

Lines changed: 13 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
import React, { useEffect, useRef, useState } from 'react'
1+
import React, { useEffect } from 'react'
22
import { useDispatch, useSelector } from 'react-redux'
33
import { useHistory, useLocation, useParams } from 'react-router-dom'
4-
import { Formik, FormikProps } from 'formik'
54

65
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'
76
import {
87
appContextSelector,
98
resetDatabaseContext,
109
resetRdiContext,
1110
setAppContextConnectedRdiInstanceId,
12-
setPipelineDialogState,
1311
} from 'uiSrc/slices/app/context'
1412
import { IRoute, PageNames, Pages } from 'uiSrc/constants'
1513
import {
@@ -22,50 +20,26 @@ import {
2220
fetchInstancesAction,
2321
instancesSelector as dbInstancesSelector
2422
} from 'uiSrc/slices/instances/instances'
25-
import {
26-
deployPipelineAction,
27-
getPipelineStatusAction,
28-
rdiPipelineSelector,
29-
resetPipelineAction,
30-
resetPipelineChecked,
31-
setPipelineInitialState,
32-
} from 'uiSrc/slices/rdi/pipeline'
33-
import { IActionPipelineResultProps, IPipeline } from 'uiSrc/slices/interfaces'
34-
import { createAxiosError, isContainJSONModule, Nullable, pipelineToJson } from 'uiSrc/utils'
35-
import { rdiErrorMessages } from 'uiSrc/pages/rdi/constants'
36-
import { addErrorNotification } from 'uiSrc/slices/app/notifications'
3723

3824
import { RdiInstancePageTemplate } from 'uiSrc/templates'
3925
import { RdiInstanceHeader } from 'uiSrc/components'
40-
import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry'
4126
import InstancePageRouter from './InstancePageRouter'
42-
import { ConfirmLeavePagePopup, RdiPipelineHeader } from './components'
43-
import { useUndeployedChangesPrompt } from './hooks'
27+
import { RdiPipelineHeader } from './components'
4428
import styles from './styles.module.scss'
4529

4630
export interface Props {
4731
routes: IRoute[]
4832
}
4933

50-
const getInitialValues = (data: Nullable<IPipeline>): IPipeline => ({
51-
config: data?.config ?? '',
52-
jobs: data?.jobs ?? [],
53-
})
54-
5534
const RdiInstancePage = ({ routes = [] }: Props) => {
5635
const dispatch = useDispatch()
5736
const history = useHistory()
5837
const { pathname } = useLocation()
5938

6039
const { rdiInstanceId } = useParams<{ rdiInstanceId: string }>()
6140
const { lastPage, contextRdiInstanceId } = useSelector(appContextSelector)
62-
const { data, resetChecked } = useSelector(rdiPipelineSelector)
6341
const { data: rdiInstances } = useSelector(rdiInstancesSelector)
6442
const { data: dbInstances } = useSelector(dbInstancesSelector)
65-
const { showModal, handleCloseModal, handleConfirmLeave } = useUndeployedChangesPrompt()
66-
67-
const [initialFormValues, setInitialFormValues] = useState<IPipeline>(getInitialValues(data))
68-
const formikRef = useRef<FormikProps<IPipeline>>(null)
6943

7044
useEffect(() => {
7145
if (!dbInstances?.length) {
@@ -99,74 +73,18 @@ const RdiInstancePage = ({ routes = [] }: Props) => {
9973
}
10074
}, [])
10175

102-
useEffect(() => {
103-
setInitialFormValues(getInitialValues(data))
104-
formikRef.current?.resetForm()
105-
}, [data])
106-
107-
// set initial values
108-
useEffect(() => () => {
109-
dispatch(setPipelineInitialState())
110-
dispatch(setPipelineDialogState(true))
111-
}, [])
112-
113-
const actionPipelineCallback = (event: TelemetryEvent, result: IActionPipelineResultProps) => {
114-
sendEventTelemetry({
115-
event,
116-
eventData: {
117-
id: rdiInstanceId,
118-
...result,
119-
}
120-
})
121-
dispatch(getPipelineStatusAction(rdiInstanceId))
122-
}
123-
124-
const updatePipelineStatus = () => {
125-
if (resetChecked) {
126-
dispatch(resetPipelineChecked(false))
127-
dispatch(resetPipelineAction(rdiInstanceId,
128-
(result: IActionPipelineResultProps) => actionPipelineCallback(TelemetryEvent.RDI_PIPELINE_RESET, result),
129-
(result: IActionPipelineResultProps) => actionPipelineCallback(TelemetryEvent.RDI_PIPELINE_RESET, result)))
130-
} else {
131-
dispatch(getPipelineStatusAction(rdiInstanceId))
132-
}
133-
}
134-
135-
const onSubmit = (values: IPipeline) => {
136-
const JSONValues = pipelineToJson(values, (errors) => {
137-
dispatch(addErrorNotification(createAxiosError({
138-
message: rdiErrorMessages.invalidStructure(errors[0].filename, errors[0].msg)
139-
})))
140-
})
141-
if (!JSONValues) {
142-
return
143-
}
144-
dispatch(deployPipelineAction(rdiInstanceId, JSONValues, updatePipelineStatus,
145-
() => dispatch(getPipelineStatusAction(rdiInstanceId))),)
146-
}
147-
14876
return (
149-
<Formik
150-
initialValues={initialFormValues}
151-
enableReinitialize
152-
onSubmit={onSubmit}
153-
innerRef={formikRef}
154-
>
155-
<>
156-
<EuiFlexGroup className={styles.page} direction="column" gutterSize="none" responsive={false}>
157-
<EuiFlexItem grow={false}>
158-
<RdiInstanceHeader />
159-
</EuiFlexItem>
160-
<EuiFlexItem grow={false}>
161-
<RdiPipelineHeader />
162-
</EuiFlexItem>
163-
<RdiInstancePageTemplate>
164-
<InstancePageRouter routes={routes} />
165-
{showModal && <ConfirmLeavePagePopup onClose={handleCloseModal} onConfirm={handleConfirmLeave} />}
166-
</RdiInstancePageTemplate>
167-
</EuiFlexGroup>
168-
</>
169-
</Formik>
77+
<EuiFlexGroup className={styles.page} direction="column" gutterSize="none" responsive={false}>
78+
<EuiFlexItem grow={false}>
79+
<RdiInstanceHeader />
80+
</EuiFlexItem>
81+
<EuiFlexItem grow={false}>
82+
<RdiPipelineHeader />
83+
</EuiFlexItem>
84+
<RdiInstancePageTemplate>
85+
<InstancePageRouter routes={routes} />
86+
</RdiInstancePageTemplate>
87+
</EuiFlexGroup>
17088
)
17189
}
17290

redisinsight/ui/src/pages/rdi/instance/components/confirm-leave-page-popup/ConfirmLeavePagePopup.spec.tsx

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)