Skip to content

Commit 108a904

Browse files
committed
#RI-6389 - change form rendering to not force initial props
1 parent 6ac5361 commit 108a904

File tree

6 files changed

+116
-112
lines changed

6 files changed

+116
-112
lines changed

redisinsight/ui/src/pages/home/HomePage.tsx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
EuiPageBody,
44
EuiPanel,
55
} from '@elastic/eui'
6-
import React, { useEffect, useRef, useState } from 'react'
6+
import React, { useEffect, useState } from 'react'
77
import { useDispatch, useSelector } from 'react-redux'
88
import { clusterSelector, resetDataRedisCluster, resetInstancesRedisCluster, } from 'uiSrc/slices/instances/cluster'
99
import { Nullable, setTitle } from 'uiSrc/utils'
@@ -33,6 +33,7 @@ import { sendEventTelemetry, sendPageViewTelemetry, TelemetryEvent, TelemetryPag
3333
import { appRedirectionSelector, setUrlHandlingInitialState } from 'uiSrc/slices/app/url-handling'
3434
import { UrlHandlingActions } from 'uiSrc/slices/interfaces/urlHandling'
3535
import { AddDbType, CREATE_CLOUD_DB_ID } from 'uiSrc/pages/home/constants'
36+
import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features'
3637

3738
import DatabasesList from './components/database-list-component'
3839
import DatabaseListHeader from './components/database-list-header'
@@ -41,7 +42,6 @@ import DatabasePanelDialog from './components/database-panel-dialog'
4142

4243
import './styles.scss'
4344
import styles from './styles.module.scss'
44-
import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features'
4545

4646
enum OpenDialogName {
4747
AddDatabase = 'add',
@@ -208,23 +208,24 @@ const HomePage = () => {
208208
key="instance-controls"
209209
onAddInstance={handleAddInstance}
210210
/>
211-
<DatabasePanelDialog
212-
isOpen={!!openDialog}
213-
editMode={openDialog === OpenDialogName.EditDatabase}
214-
urlHandlingAction={action}
215-
initialValues={dbConnection ?? null}
216-
editedInstance={
217-
openDialog === OpenDialogName.EditDatabase
218-
? editedInstance
219-
: sentinelInstance ?? null
220-
}
221-
onClose={
222-
openDialog === OpenDialogName.EditDatabase
223-
? closeEditDialog
224-
: handleClose
225-
}
226-
onDbEdited={onDbEdited}
227-
/>
211+
{!!openDialog && (
212+
<DatabasePanelDialog
213+
editMode={openDialog === OpenDialogName.EditDatabase}
214+
urlHandlingAction={action}
215+
initialValues={dbConnection ?? null}
216+
editedInstance={
217+
openDialog === OpenDialogName.EditDatabase
218+
? editedInstance
219+
: sentinelInstance ?? null
220+
}
221+
onClose={
222+
openDialog === OpenDialogName.EditDatabase
223+
? closeEditDialog
224+
: handleClose
225+
}
226+
onDbEdited={onDbEdited}
227+
/>
228+
)}
228229
<div key="homePage" className="homePage">
229230
{(!isInstanceExists && !loading && !loadingChanging ? (
230231
<EuiPanel className={styles.emptyPanel} borderRadius="none">

redisinsight/ui/src/pages/home/components/connection-url/ConnectionUrl.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ import {
1212
EuiToolTip
1313
} from '@elastic/eui'
1414
import { useFormik } from 'formik'
15-
import { useDispatch } from 'react-redux'
15+
import { useDispatch, useSelector } from 'react-redux'
1616
import { useHistory } from 'react-router'
1717
import { Nullable, parseRedisUrl } from 'uiSrc/utils'
1818

1919
import { AddDbType } from 'uiSrc/pages/home/constants'
2020
import { Instance } from 'uiSrc/slices/interfaces'
21-
import { createInstanceStandaloneAction, testInstanceStandaloneAction } from 'uiSrc/slices/instances/instances'
21+
import {
22+
createInstanceStandaloneAction,
23+
instancesSelector,
24+
testInstanceStandaloneAction
25+
} from 'uiSrc/slices/instances/instances'
2226
import { Pages } from 'uiSrc/constants'
2327
import ConnectivityOptions from './components/connectivity-options'
2428

@@ -56,6 +60,7 @@ const ConnectionUrlError = (
5660
const ConnectionUrl = (props: Props) => {
5761
const { onSelectOption, onClose } = props
5862
const [isInvalid, setIsInvalid] = useState<Boolean>(false)
63+
const { loadingChanging: isLoading } = useSelector(instancesSelector)
5964

6065
const dispatch = useDispatch()
6166
const history = useHistory()
@@ -153,6 +158,7 @@ const ConnectionUrl = (props: Props) => {
153158
isDisabled={!!isInvalid}
154159
iconType={isInvalid ? 'iInCircle' : undefined}
155160
onClick={handleTestConnection}
161+
isLoading={isLoading}
156162
data-testid="btn-test-connection"
157163
>
158164
Test Connection

redisinsight/ui/src/pages/home/components/database-panel-dialog/DatabasePanelDialog.spec.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react'
22
import { instance, mock } from 'ts-mockito'
3-
import { render, screen, fireEvent, act } from 'uiSrc/utils/test-utils'
3+
import { render, screen, fireEvent } from 'uiSrc/utils/test-utils'
44

55
import DatabasePanelDialog, { Props } from './DatabasePanelDialog'
66

@@ -12,37 +12,37 @@ describe('DatabasePanelDialog', () => {
1212
})
1313

1414
it('should render proper form by dfeault', () => {
15-
render(<DatabasePanelDialog {...instance(mockedProps)} isOpen onClose={jest.fn()} />)
15+
render(<DatabasePanelDialog {...instance(mockedProps)} onClose={jest.fn()} />)
1616

1717
expect(screen.getByTestId('connection-url')).toBeInTheDocument()
1818
})
1919

2020
it('should change screen to cloud and render proper form', () => {
21-
render(<DatabasePanelDialog {...instance(mockedProps)} isOpen onClose={jest.fn()} />)
21+
render(<DatabasePanelDialog {...instance(mockedProps)} onClose={jest.fn()} />)
2222

2323
fireEvent.click(screen.getByTestId('discover-cloud-btn'))
2424

2525
expect(screen.getByTestId('add-db_cloud-api')).toBeInTheDocument()
2626
})
2727

2828
it('should change screen to software and render proper form', () => {
29-
render(<DatabasePanelDialog {...instance(mockedProps)} isOpen onClose={jest.fn()} />)
29+
render(<DatabasePanelDialog {...instance(mockedProps)} onClose={jest.fn()} />)
3030

3131
fireEvent.click(screen.getByTestId('option-btn-software'))
3232

3333
expect(screen.getByTestId('add-db_cluster')).toBeInTheDocument()
3434
})
3535

3636
it('should change tab to sentinel and render proper form', async () => {
37-
render(<DatabasePanelDialog {...instance(mockedProps)} isOpen onClose={jest.fn()} />)
37+
render(<DatabasePanelDialog {...instance(mockedProps)} onClose={jest.fn()} />)
3838

3939
fireEvent.click(screen.getByTestId('option-btn-sentinel'))
4040

4141
expect(screen.getByTestId('add-db_sentinel')).toBeInTheDocument()
4242
})
4343

4444
it('should change screen to import render proper form', async () => {
45-
render(<DatabasePanelDialog {...instance(mockedProps)} isOpen onClose={jest.fn()} />)
45+
render(<DatabasePanelDialog {...instance(mockedProps)} onClose={jest.fn()} />)
4646

4747
fireEvent.click(screen.getByTestId('option-btn-import'))
4848

redisinsight/ui/src/pages/home/components/database-panel-dialog/DatabasePanelDialog.tsx

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import ClusterConnectionFormWrapper from 'uiSrc/pages/home/components/cluster-co
2727
import styles from './styles.module.scss'
2828

2929
export interface Props {
30-
isOpen: boolean
3130
editMode: boolean
3231
urlHandlingAction?: Nullable<UrlHandlingActions>
3332
initialValues?: Nullable<Record<string, any>>
@@ -39,7 +38,6 @@ export interface Props {
3938

4039
const DatabasePanelDialog = (props: Props) => {
4140
const {
42-
isOpen,
4341
editMode,
4442
onClose,
4543
initialValues: initialValuesProp,
@@ -83,35 +81,31 @@ const DatabasePanelDialog = (props: Props) => {
8381
}
8482
}, [editMode])
8583

86-
useEffect(() => {
87-
if (!isOpen) {
88-
// clear state after closing dialog
89-
setConnectionType(null)
90-
if (connectionType === AddDbType.manual) return
91-
92-
switch (connectionType) {
93-
case AddDbType.cloud: {
94-
dispatch(resetDataRedisCluster())
95-
dispatch(resetDataSentinel())
96-
break
97-
}
98-
99-
case AddDbType.sentinel: {
100-
dispatch(resetDataRedisCloud())
101-
dispatch(resetDataRedisCluster())
102-
break
103-
}
104-
105-
case AddDbType.software: {
106-
dispatch(resetDataRedisCloud())
107-
dispatch(resetDataSentinel())
108-
break
109-
}
110-
default:
111-
break
84+
useEffect(() => () => {
85+
if (connectionType === AddDbType.manual) return
86+
87+
switch (connectionType) {
88+
case AddDbType.cloud: {
89+
dispatch(resetDataRedisCluster())
90+
dispatch(resetDataSentinel())
91+
break
92+
}
93+
94+
case AddDbType.sentinel: {
95+
dispatch(resetDataRedisCloud())
96+
dispatch(resetDataRedisCluster())
97+
break
98+
}
99+
100+
case AddDbType.software: {
101+
dispatch(resetDataRedisCloud())
102+
dispatch(resetDataSentinel())
103+
break
112104
}
105+
default:
106+
break
113107
}
114-
}, [isOpen, connectionType])
108+
}, [connectionType])
115109

116110
const changeConnectionType = (connectionType: AddDbType, db: any) => {
117111
dispatch(setUrlHandlingInitialState())
@@ -128,6 +122,7 @@ const DatabasePanelDialog = (props: Props) => {
128122
{connectionType === null && (
129123
<ConnectionUrlForm
130124
onSelectOption={changeConnectionType}
125+
onClose={onClose}
131126
/>
132127
)}
133128
{connectionType === AddDbType.manual && (
@@ -171,7 +166,7 @@ const DatabasePanelDialog = (props: Props) => {
171166

172167
return (
173168
<FormDialog
174-
isOpen={isOpen}
169+
isOpen
175170
onClose={onClose}
176171
header={modalHeader ?? (<EuiTitle size="s"><h4>Add Database</h4></EuiTitle>)}
177172
footer={<div id="footerDatabaseForm" />}

redisinsight/ui/src/pages/home/components/form/DatabaseForm.tsx

Lines changed: 57 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -112,60 +112,63 @@ const DatabaseForm = (props: Props) => {
112112
</EuiFlexItem>
113113
</EuiFlexGroup>
114114
)}
115-
<EuiFlexGroup responsive={false}>
116-
{showFields.host && (
117-
<EuiFlexItem grow={4}>
118-
<EuiFormRow label="Host*">
119-
<EuiFieldText
120-
autoFocus={autoFocus}
121-
name="ip"
122-
id="host"
123-
data-testid="host"
124-
color="secondary"
125-
maxLength={200}
126-
placeholder="Enter Hostname / IP address / Connection URL"
127-
value={formik.values.host ?? ''}
128-
onChange={(e: ChangeEvent<HTMLInputElement>) => {
129-
formik.setFieldValue(
130-
'host',
131-
validateField(e.target.value.trim())
132-
)
133-
}}
134-
onPaste={(event: React.ClipboardEvent<HTMLInputElement>) => handlePasteHostName(onHostNamePaste, event)}
135-
onFocus={selectOnFocus}
136-
append={<AppendHostName />}
137-
disabled={isFieldDisabled('host')}
138-
/>
139-
</EuiFormRow>
140-
</EuiFlexItem>
141-
)}
142-
{isShowPort && (
143-
<EuiFlexItem grow={2}>
144-
<EuiFormRow label="Port*" helpText="Should not exceed 65535.">
145-
<EuiFieldNumber
146-
name="port"
147-
id="port"
148-
data-testid="port"
149-
style={{ width: '100%' }}
150-
placeholder="Enter Port"
151-
value={formik.values.port ?? ''}
152-
maxLength={6}
153-
onChange={(e: ChangeEvent<HTMLInputElement>) => {
154-
formik.setFieldValue(
155-
e.target.name,
156-
validatePortNumber(e.target.value.trim())
157-
)
158-
}}
159-
onFocus={selectOnFocus}
160-
type="text"
161-
min={0}
162-
max={MAX_PORT_NUMBER}
163-
disabled={isFieldDisabled('port')}
164-
/>
165-
</EuiFormRow>
166-
</EuiFlexItem>
167-
)}
168-
</EuiFlexGroup>
115+
116+
{(showFields.host || isShowPort) && (
117+
<EuiFlexGroup responsive={false}>
118+
{showFields.host && (
119+
<EuiFlexItem grow={4}>
120+
<EuiFormRow label="Host*">
121+
<EuiFieldText
122+
autoFocus={autoFocus}
123+
name="ip"
124+
id="host"
125+
data-testid="host"
126+
color="secondary"
127+
maxLength={200}
128+
placeholder="Enter Hostname / IP address / Connection URL"
129+
value={formik.values.host ?? ''}
130+
onChange={(e: ChangeEvent<HTMLInputElement>) => {
131+
formik.setFieldValue(
132+
'host',
133+
validateField(e.target.value.trim())
134+
)
135+
}}
136+
onPaste={(event: React.ClipboardEvent<HTMLInputElement>) => handlePasteHostName(onHostNamePaste, event)}
137+
onFocus={selectOnFocus}
138+
append={<AppendHostName />}
139+
disabled={isFieldDisabled('host')}
140+
/>
141+
</EuiFormRow>
142+
</EuiFlexItem>
143+
)}
144+
{isShowPort && (
145+
<EuiFlexItem grow={2}>
146+
<EuiFormRow label="Port*" helpText="Should not exceed 65535.">
147+
<EuiFieldNumber
148+
name="port"
149+
id="port"
150+
data-testid="port"
151+
style={{ width: '100%' }}
152+
placeholder="Enter Port"
153+
value={formik.values.port ?? ''}
154+
maxLength={6}
155+
onChange={(e: ChangeEvent<HTMLInputElement>) => {
156+
formik.setFieldValue(
157+
e.target.name,
158+
validatePortNumber(e.target.value.trim())
159+
)
160+
}}
161+
onFocus={selectOnFocus}
162+
type="text"
163+
min={0}
164+
max={MAX_PORT_NUMBER}
165+
disabled={isFieldDisabled('port')}
166+
/>
167+
</EuiFormRow>
168+
</EuiFlexItem>
169+
)}
170+
</EuiFlexGroup>
171+
)}
169172

170173
<EuiFlexGroup responsive={false}>
171174
<EuiFlexItem grow={1}>

redisinsight/ui/src/pages/redis-stack/components/edit-connection/EditConnection.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ const EditConnection = () => {
120120
editedInstance={state.data}
121121
onDbEdited={onInstanceChanged}
122122
onClose={onClose}
123-
isOpen
124123
/>
125124
</div>
126125
</div>

0 commit comments

Comments
 (0)