Skip to content

Commit a79101d

Browse files
authored
Merge pull request #1766 from RedisInsight/fe/bugfix/RI-4210_Special_fields_can't_be_removed
#RI-4210 - Fields/Members from Hash/Set keys with some special characters can't be deleted
2 parents 6a2a8a4 + 2a86aa3 commit a79101d

File tree

5 files changed

+59
-13
lines changed

5 files changed

+59
-13
lines changed

redisinsight/ui/src/pages/browser/components/hash-details/HashDetails.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
} from 'uiSrc/slices/browser/hash'
3838
import { keysSelector, selectedKeyDataSelector, selectedKeySelector } from 'uiSrc/slices/browser/keys'
3939
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
40-
import { RedisResponseBuffer } from 'uiSrc/slices/interfaces'
40+
import { RedisResponseBuffer, RedisString } from 'uiSrc/slices/interfaces'
4141
import { getBasedOnViewTypeEvent, getMatchType, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
4242
import {
4343
bufferToSerializedFormat,
@@ -151,8 +151,8 @@ const HashDetails = (props: Props) => {
151151
})
152152
}
153153

154-
const handleDeleteField = (field = '') => {
155-
dispatch(deleteHashFields(key, [stringToBuffer(field, viewFormat)], onSuccessRemoved))
154+
const handleDeleteField = (field: RedisString | string = '') => {
155+
dispatch(deleteHashFields(key, [field], onSuccessRemoved))
156156
closePopover()
157157
}
158158

@@ -445,9 +445,10 @@ const HashDetails = (props: Props) => {
445445
/>
446446
</EuiToolTip>
447447
<PopoverDelete
448-
header={createDeleteFieldHeader(fieldItem)}
448+
header={createDeleteFieldHeader(fieldItem as RedisString)}
449449
text={createDeleteFieldMessage(key ?? '')}
450450
item={field}
451+
itemRaw={fieldItem as RedisString}
451452
suffix={suffix}
452453
deleting={deleting}
453454
closePopover={closePopover}

redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.spec.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react'
22
import { instance, mock } from 'ts-mockito'
3+
import { anyToBuffer } from 'uiSrc/utils'
34
import { render, screen, fireEvent } from 'uiSrc/utils/test-utils'
45
import PopoverDelete, { Props } from './PopoverDelete'
56

@@ -40,4 +41,44 @@ describe('PopoverDelete', () => {
4041
fireEvent.click(deleteBtn)
4142
expect(handleDeleteItem).toBeCalledTimes(1)
4243
})
44+
45+
it('should call handleDeleteItem on delete with itemRaw prop', () => {
46+
const itemRawMock = anyToBuffer([1, 2, 3])
47+
const handleDeleteItem = jest.fn()
48+
render(
49+
<PopoverDelete
50+
{...instance(mockedProps)}
51+
item="name"
52+
itemRaw={itemRawMock}
53+
suffix="_"
54+
deleting="name_"
55+
handleDeleteItem={handleDeleteItem}
56+
/>
57+
)
58+
59+
const deleteBtn = screen.getByTestId('remove')
60+
fireEvent.click(deleteBtn)
61+
expect(handleDeleteItem).toBeCalledTimes(1)
62+
expect(handleDeleteItem).toBeCalledWith(itemRawMock)
63+
})
64+
65+
it('should call handleDeleteItem on delete with item prop if itemRaw is not defined', () => {
66+
const itemMock = 'name'
67+
const handleDeleteItem = jest.fn()
68+
render(
69+
<PopoverDelete
70+
{...instance(mockedProps)}
71+
item={itemMock}
72+
itemRaw={undefined}
73+
suffix="_"
74+
deleting="name_"
75+
handleDeleteItem={handleDeleteItem}
76+
/>
77+
)
78+
79+
const deleteBtn = screen.getByTestId('remove')
80+
fireEvent.click(deleteBtn)
81+
expect(handleDeleteItem).toBeCalledTimes(1)
82+
expect(handleDeleteItem).toBeCalledWith(itemMock)
83+
})
4384
})

redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import React from 'react'
22
import { EuiButton, EuiButtonIcon, EuiPopover, EuiText } from '@elastic/eui'
33

4+
import { RedisString } from 'uiSrc/slices/interfaces'
45
import styles from './styles.module.scss'
56

67
export interface Props {
78
header?: string
89
text: JSX.Element | string
910
item: string
11+
itemRaw?: RedisString
1012
suffix: string
1113
deleting: string
1214
closePopover: () => void
1315
showPopover: (item: string) => void
1416
updateLoading: boolean
15-
handleDeleteItem: (item: string) => void
17+
handleDeleteItem: (item: RedisString | string) => void
1618
handleButtonClick?: () => void
1719
appendInfo?: JSX.Element | string | null
1820
testid?: string
@@ -23,6 +25,7 @@ const PopoverDelete = (props: Props) => {
2325
header,
2426
text,
2527
item,
28+
itemRaw,
2629
suffix,
2730
deleting,
2831
closePopover,
@@ -83,7 +86,7 @@ const PopoverDelete = (props: Props) => {
8386
size="s"
8487
color="warning"
8588
iconType="trash"
86-
onClick={() => handleDeleteItem(item)}
89+
onClick={() => handleDeleteItem(itemRaw || item)}
8790
data-testid={testid || 'remove'}
8891
>
8992
Remove

redisinsight/ui/src/pages/browser/components/set-details/SetDetails.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
EuiToolTip,
88
} from '@elastic/eui'
99
import { CellMeasurerCache } from 'react-virtualized'
10-
import { RedisResponseBuffer } from 'uiSrc/slices/interfaces'
10+
import { RedisResponseBuffer, RedisString } from 'uiSrc/slices/interfaces'
1111

1212
import {
1313
bufferToString,
@@ -117,8 +117,8 @@ const SetDetails = (props: Props) => {
117117
})
118118
}
119119

120-
const handleDeleteMember = (member = '') => {
121-
dispatch(deleteSetMembers(key, [stringToBuffer(member, viewFormat)], onSuccessRemoved))
120+
const handleDeleteMember = (member: string | RedisString = '') => {
121+
dispatch(deleteSetMembers(key, [member], onSuccessRemoved))
122122
closePopover()
123123
}
124124

@@ -234,6 +234,7 @@ const SetDetails = (props: Props) => {
234234
header={createDeleteFieldHeader(memberItem)}
235235
text={createDeleteFieldMessage(key ?? '')}
236236
item={member}
237+
itemRaw={memberItem}
237238
suffix={suffix}
238239
deleting={deleting}
239240
closePopover={closePopover}

redisinsight/ui/src/pages/browser/components/zset-details/ZSetDetails.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api'
2222
import HelpTexts from 'uiSrc/constants/help-texts'
2323
import { NoResultsFoundText } from 'uiSrc/constants/texts'
2424
import { selectedKeyDataSelector, keysSelector, selectedKeySelector } from 'uiSrc/slices/browser/keys'
25-
import { RedisResponseBuffer } from 'uiSrc/slices/interfaces'
25+
import { RedisResponseBuffer, RedisString } from 'uiSrc/slices/interfaces'
2626
import { ZsetMember } from 'uiSrc/slices/interfaces/zset'
2727
import {
2828
bufferToString,
@@ -40,7 +40,6 @@ import InlineItemEditor from 'uiSrc/components/inline-item-editor/InlineItemEdit
4040
import { IColumnSearchState, ITableColumn, RelativeWidthSizes } from 'uiSrc/components/virtual-table/interfaces'
4141
import { StopPropagation } from 'uiSrc/components/virtual-table'
4242
import { getColumnWidth } from 'uiSrc/components/virtual-grid'
43-
import { stringToBuffer } from 'uiSrc/utils/formatters/bufferFormatters'
4443
import { AddMembersToZSetDto, SearchZSetMembersResponse } from 'apiSrc/modules/browser/dto'
4544
import PopoverDelete from '../popover-delete/PopoverDelete'
4645

@@ -136,8 +135,8 @@ const ZSetDetails = (props: Props) => {
136135
})
137136
}
138137

139-
const handleDeleteMember = (member = '') => {
140-
dispatch(deleteZSetMembers(key, [stringToBuffer(member, viewFormat)], onSuccessRemoved))
138+
const handleDeleteMember = (member: RedisString | string = '') => {
139+
dispatch(deleteZSetMembers(key, [member], onSuccessRemoved))
141140
closePopover()
142141
}
143142

@@ -361,6 +360,7 @@ const ZSetDetails = (props: Props) => {
361360
header={createDeleteFieldHeader(nameItem)}
362361
text={createDeleteFieldMessage(key ?? '')}
363362
item={name}
363+
itemRaw={nameItem}
364364
suffix={suffix}
365365
deleting={deleting}
366366
closePopover={closePopover}

0 commit comments

Comments
 (0)