Skip to content

Commit 9743e53

Browse files
authored
Merge pull request #1689 from RedisInsight/feature/RI-3978_host_port_edit
Feature/ri 3978 host port edit
2 parents 3ae624b + 68c2756 commit 9743e53

File tree

13 files changed

+126
-44
lines changed

13 files changed

+126
-44
lines changed

redisinsight/api/src/modules/database/database.analytics.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ describe('DatabaseAnalytics', () => {
190190
expect(sendEventSpy).toHaveBeenCalledWith(
191191
TelemetryEvents.RedisInstanceEditedByUser,
192192
{
193+
port: cur.port,
193194
databaseId: cur.id,
194195
connectionType: cur.connectionType,
195196
provider: HostingProvider.RE_CLUSTER,
@@ -200,6 +201,7 @@ describe('DatabaseAnalytics', () => {
200201
useSSH: 'disabled',
201202
timeout: mockDatabaseWithTlsAuth.timeout / 1_000, // milliseconds to seconds
202203
previousValues: {
204+
port: prev.port,
203205
connectionType: prev.connectionType,
204206
provider: prev.provider,
205207
useTLS: 'enabled',
@@ -225,6 +227,7 @@ describe('DatabaseAnalytics', () => {
225227
expect(sendEventSpy).toHaveBeenCalledWith(
226228
TelemetryEvents.RedisInstanceEditedByUser,
227229
{
230+
port: cur.port,
228231
databaseId: cur.id,
229232
connectionType: cur.connectionType,
230233
provider: HostingProvider.RE_CLUSTER,
@@ -235,6 +238,7 @@ describe('DatabaseAnalytics', () => {
235238
useSSH: 'disabled',
236239
timeout: mockDatabaseWithTlsAuth.timeout / 1_000, // milliseconds to seconds
237240
previousValues: {
241+
port: prev.port,
238242
connectionType: prev.connectionType,
239243
provider: prev.provider,
240244
useTLS: 'disabled',

redisinsight/api/src/modules/database/database.analytics.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export class DatabaseAnalytics extends TelemetryBaseService {
8888
this.sendEvent(
8989
TelemetryEvents.RedisInstanceEditedByUser,
9090
{
91+
port: cur.port,
9192
databaseId: cur.id,
9293
connectionType: cur.connectionType,
9394
provider: cur.provider,
@@ -100,6 +101,7 @@ export class DatabaseAnalytics extends TelemetryBaseService {
100101
useSSH: cur?.ssh ? 'enabled' : 'disabled',
101102
timeout: cur?.timeout / 1_000, // milliseconds to seconds
102103
previousValues: {
104+
port: prev.port,
103105
connectionType: prev.connectionType,
104106
provider: prev.provider,
105107
useTLS: prev.tls ? 'enabled' : 'disabled',

redisinsight/api/src/modules/database/database.service.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,15 @@ describe('DatabaseService', () => {
131131
it('should update existing database and send analytics event', async () => {
132132
expect(await service.update(
133133
mockDatabase.id,
134-
{ password: 'password' } as UpdateDatabaseDto,
134+
{ password: 'password', port: 6380 } as UpdateDatabaseDto,
135135
true,
136136
)).toEqual(mockDatabase);
137137
expect(analytics.sendInstanceEditedEvent).toHaveBeenCalledWith(
138138
mockDatabase,
139139
{
140140
...mockDatabase,
141141
password: 'password',
142+
port: 6380,
142143
},
143144
true,
144145
);

redisinsight/api/src/modules/database/database.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ export class DatabaseService {
143143
): Promise<Database> {
144144
this.logger.log(`Updating database: ${id}`);
145145
const oldDatabase = await this.get(id, true);
146-
let database = merge(oldDatabase, dto);
146+
147+
let database = merge({}, oldDatabase, dto);
147148

148149
try {
149150
database = await this.databaseFactory.createDatabaseModel(database);

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import {
1010
import { optimizeLSInstances, setTitle } from 'uiSrc/utils'
1111
import { PageHeader } from 'uiSrc/components'
1212
import { BrowserStorageItem } from 'uiSrc/constants'
13+
import { resetKeys } from 'uiSrc/slices/browser/keys'
14+
import { resetCliHelperSettings, resetCliSettingsAction } from 'uiSrc/slices/cli/cli-settings'
15+
import { resetRedisearchKeysData } from 'uiSrc/slices/browser/redisearch'
16+
import { appContextSelector, setAppContextInitialState } from 'uiSrc/slices/app/context'
1317
import { Instance } from 'uiSrc/slices/interfaces'
1418
import { cloudSelector, resetSubscriptionsRedisCloud } from 'uiSrc/slices/instances/cloud'
1519
import { editedInstanceSelector, fetchEditedInstanceAction, fetchInstancesAction, instancesSelector, setEditedInstance } from 'uiSrc/slices/instances/instances'
@@ -55,6 +59,8 @@ const HomePage = () => {
5559

5660
const { identified: analyticsIdentified } = useSelector(appAnalyticsInfoSelector)
5761

62+
const { contextInstanceId } = useSelector(appContextSelector)
63+
5864
!welcomeIsShow && setTitle('My Redis databases')
5965

6066
useEffect(() => {
@@ -127,7 +133,15 @@ const HomePage = () => {
127133
}
128134
}, [instances])
129135

130-
const onInstanceChanged = () => ({})
136+
const onDbEdited = () => {
137+
if (contextInstanceId && contextInstanceId === editedInstance?.id) {
138+
dispatch(resetKeys())
139+
dispatch(resetRedisearchKeysData())
140+
dispatch(resetCliSettingsAction())
141+
dispatch(resetCliHelperSettings())
142+
dispatch(setAppContextInitialState())
143+
}
144+
}
131145

132146
const closeEditDialog = () => {
133147
dispatch(setEditedInstance(null))
@@ -245,7 +259,7 @@ const HomePage = () => {
245259
isResizablePanel
246260
editedInstance={editedInstance}
247261
onClose={closeEditDialog}
248-
onDbAdded={onInstanceChanged}
262+
onDbEdited={onDbEdited}
249263
/>
250264
)}
251265

@@ -256,7 +270,6 @@ const HomePage = () => {
256270
isResizablePanel
257271
editedInstance={sentinelInstance ?? null}
258272
onClose={handleClose}
259-
onDbAdded={onInstanceChanged}
260273
isFullWidth={!instances.length}
261274
/>
262275
)}
@@ -285,7 +298,6 @@ const HomePage = () => {
285298
isResizablePanel
286299
editedInstance={sentinelInstance ?? null}
287300
onClose={handleClose}
288-
onDbAdded={onInstanceChanged}
289301
isFullWidth={!instances.length}
290302
/>
291303
)}

redisinsight/ui/src/pages/home/components/AddDatabases/AddDatabasesContainer.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export interface Props {
3131
editMode: boolean;
3232
editedInstance: Nullable<Instance>;
3333
onClose?: () => void;
34-
onDbAdded: () => void;
3534
onDbEdited?: () => void;
3635
onAliasEdited?: (value: string) => void;
3736
isFullWidth?: boolean;

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceForm/InstanceForm.spec.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,39 @@ describe('InstanceForm', () => {
151151
)
152152
})
153153

154+
it('should change port input properly', async () => {
155+
const handleSubmit = jest.fn()
156+
render(
157+
<div id="footerDatabaseForm">
158+
<InstanceForm
159+
{...instance(mockedProps)}
160+
isEditMode
161+
formFields={{
162+
...formFields,
163+
connectionType: ConnectionType.Standalone,
164+
}}
165+
onSubmit={handleSubmit}
166+
/>
167+
</div>
168+
)
169+
170+
await act(() => {
171+
fireEvent.change(screen.getByTestId('port'), {
172+
target: { value: '123' },
173+
})
174+
})
175+
176+
const submitBtn = screen.getByTestId(BTN_SUBMIT)
177+
await act(() => {
178+
fireEvent.click(submitBtn)
179+
})
180+
expect(handleSubmit).toBeCalledWith(
181+
expect.objectContaining({
182+
port: '123',
183+
})
184+
)
185+
})
186+
154187
it('should change tls checkbox', async () => {
155188
const handleSubmit = jest.fn()
156189
const handleTestConnection = jest.fn()

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceForm/form-components/DatabaseForm.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { ChangeEvent } from 'react'
2+
import { useSelector } from 'react-redux'
23
import { FormikProps } from 'formik'
34

45
import {
@@ -10,6 +11,8 @@ import {
1011
EuiFormRow, EuiIcon,
1112
EuiToolTip
1213
} from '@elastic/eui'
14+
import { BuildType } from 'uiSrc/constants/env'
15+
import { appInfoSelector } from 'uiSrc/slices/app/info'
1316
import { handlePasteHostName, MAX_PORT_NUMBER, MAX_TIMEOUT_NUMBER, selectOnFocus, validateField, validatePortNumber, validateTimeoutNumber } from 'uiSrc/utils'
1417
import { ConnectionType, InstanceType } from 'uiSrc/slices/interfaces'
1518
import { DbConnectionInfo } from '../interfaces'
@@ -37,6 +40,8 @@ const DatabaseForm = (props: Props) => {
3740
connectionType
3841
} = props
3942

43+
const { server } = useSelector(appInfoSelector)
44+
4045
const AppendHostName = () => (
4146
<EuiToolTip
4247
title={(
@@ -75,8 +80,8 @@ const DatabaseForm = (props: Props) => {
7580

7681
return (
7782
<>
78-
{(!isEditMode || isCloneMode) && (
79-
<EuiFlexGroup className={flexGroupClassName}>
83+
<EuiFlexGroup className={flexGroupClassName}>
84+
{(!isEditMode || isCloneMode) && (
8085
<EuiFlexItem className={flexItemClassName}>
8186
<EuiFormRow label="Host*">
8287
<EuiFieldText
@@ -100,7 +105,8 @@ const DatabaseForm = (props: Props) => {
100105
/>
101106
</EuiFormRow>
102107
</EuiFlexItem>
103-
108+
)}
109+
{server?.buildType !== BuildType.RedisStack && (
104110
<EuiFlexItem className={flexItemClassName}>
105111
<EuiFormRow label="Port*" helpText="Should not exceed 65535.">
106112
<EuiFieldNumber
@@ -124,8 +130,8 @@ const DatabaseForm = (props: Props) => {
124130
/>
125131
</EuiFormRow>
126132
</EuiFlexItem>
127-
</EuiFlexGroup>
128-
)}
133+
)}
134+
</EuiFlexGroup>
129135

130136
{(
131137
(!isEditMode || isCloneMode)

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceForm/form-components/DbInfo.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import React from 'react'
2+
import { useSelector } from 'react-redux'
23
import { EuiIcon, EuiListGroup, EuiListGroupItem, EuiText, EuiTextColor, EuiToolTip } from '@elastic/eui'
34
import { capitalize } from 'lodash'
45
import cx from 'classnames'
56
import { DatabaseListModules } from 'uiSrc/components'
7+
import { BuildType } from 'uiSrc/constants/env'
8+
import { appInfoSelector } from 'uiSrc/slices/app/info'
69
import { ConnectionType } from 'uiSrc/slices/interfaces'
710
import { Nullable } from 'uiSrc/utils'
811
import { Endpoint } from 'apiSrc/common/models'
@@ -22,6 +25,9 @@ export interface Props {
2225

2326
const DbInfo = (props: Props) => {
2427
const { connectionType, nameFromProvider, nodes = null, host, port, db, modules } = props
28+
29+
const { server } = useSelector(appInfoSelector)
30+
2531
const AppendEndpoints = () => (
2632
<EuiToolTip
2733
title="Host:port"
@@ -76,7 +82,6 @@ const DbInfo = (props: Props) => {
7682
)}
7783
/>
7884
)}
79-
8085
<EuiListGroupItem
8186
label={(
8287
<>
@@ -90,17 +95,18 @@ const DbInfo = (props: Props) => {
9095
</>
9196
)}
9297
/>
93-
94-
<EuiListGroupItem
95-
label={(
96-
<EuiText color="subdued" size="s">
97-
Port:
98-
<EuiTextColor color="default" className={styles.dbInfoListValue}>
99-
{port}
100-
</EuiTextColor>
101-
</EuiText>
102-
)}
103-
/>
98+
{server?.buildType === BuildType.RedisStack && (
99+
<EuiListGroupItem
100+
label={(
101+
<EuiText color="subdued" size="s">
102+
Port:
103+
<EuiTextColor color="default" className={styles.dbInfoListValue}>
104+
{port}
105+
</EuiTextColor>
106+
</EuiText>
107+
)}
108+
/>
109+
)}
104110

105111
{!!db && (
106112
<EuiListGroupItem

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceFormWrapper.spec.tsx

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,19 +145,6 @@ describe('InstanceFormWrapper', () => {
145145
expect(onClose).toBeCalled()
146146
})
147147

148-
it('should submit', () => {
149-
const onSubmit = jest.fn()
150-
render(
151-
<InstanceFormWrapper
152-
{...instance(mockedProps)}
153-
editedInstance={mockedEditedInstance}
154-
onDbAdded={onSubmit}
155-
/>
156-
)
157-
fireEvent.click(screen.getByTestId('submit-form-btn'))
158-
expect(onSubmit).toBeCalled()
159-
})
160-
161148
it('should submit with editMode', () => {
162149
const component = render(
163150
<InstanceFormWrapper

0 commit comments

Comments
 (0)