Skip to content

Commit ee9a3f6

Browse files
#RI-2928, RI-2921, RI-2914, RI-2924, RI-2927 (#672)
* #RI-2928, RI-2921, RI-2914, RI-2924, RI-2927
1 parent 77fc2f9 commit ee9a3f6

File tree

5 files changed

+55
-51
lines changed

5 files changed

+55
-51
lines changed

redisinsight/ui/src/components/range-filter/RangeFilter.spec.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,13 @@ describe('RangeFilter', () => {
5151
)
5252
expect(handleChangeEnd).toBeCalledTimes(1)
5353
})
54-
it('should reset start and end values on press Reset buttons', () => {
55-
const handleChangeEnd = jest.fn()
56-
const handleChangeStart = jest.fn()
54+
it('should call handleResetFilter onClick reset button', () => {
55+
const handleResetFilter = jest.fn()
5756

5857
render(
5958
<RangeFilter
6059
{...instance(mockedProps)}
61-
handleChangeStart={handleChangeStart}
62-
handleChangeEnd={handleChangeEnd}
60+
handleResetFilter={handleResetFilter}
6361
start={1}
6462
end={100}
6563
min={1}
@@ -70,7 +68,6 @@ describe('RangeFilter', () => {
7068

7169
fireEvent.click(resetBtn)
7270

73-
expect(handleChangeEnd).toBeCalledWith(120)
74-
expect(handleChangeStart).toBeCalledWith(1)
71+
expect(handleResetFilter).toBeCalledTimes(1)
7572
})
7673
})

redisinsight/ui/src/components/range-filter/RangeFilter.tsx

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface Props {
1414
end: number
1515
handleChangeStart: (value: number) => void
1616
handleChangeEnd: (value: number) => void
17+
handleResetFilter: () => void
1718
}
1819

1920
function usePrevious(value: any) {
@@ -25,7 +26,7 @@ function usePrevious(value: any) {
2526
}
2627

2728
const RangeFilter = (props: Props) => {
28-
const { max, min, start, end, handleChangeStart, handleChangeEnd } = props
29+
const { max, min, start, end, handleChangeStart, handleChangeEnd, handleResetFilter } = props
2930

3031
const [startVal, setStartVal] = useState(start)
3132
const [endVal, setEndVal] = useState(end)
@@ -39,15 +40,7 @@ const RangeFilter = (props: Props) => {
3940
const maxValRef = useRef<HTMLInputElement>(null)
4041
const range = useRef<HTMLInputElement>(null)
4142

42-
const prevValue = usePrevious({ max }) ?? { max: 0 }
43-
44-
const resetFilter = useCallback(
45-
() => {
46-
handleChangeStart(min)
47-
handleChangeEnd(max)
48-
},
49-
[min, max]
50-
)
43+
const prevValue = usePrevious({ max, min }) ?? { max: 0, min: 0 }
5144

5245
const onChangeStart = useCallback(
5346
({ target: { value } }) => {
@@ -112,6 +105,9 @@ const RangeFilter = (props: Props) => {
112105
if (max && prevValue && prevValue.max !== max && end === prevValue.max) {
113106
handleChangeEnd(max)
114107
}
108+
if (min && prevValue && prevValue.min !== min && start === prevValue.min) {
109+
handleChangeStart(min)
110+
}
115111
}, [prevValue])
116112

117113
if (start === 0 && end === 0) {
@@ -171,7 +167,7 @@ const RangeFilter = (props: Props) => {
171167
data-testid="range-filter-btn"
172168
className={styles.resetButton}
173169
type="button"
174-
onClick={resetFilter}
170+
onClick={handleResetFilter}
175171
>
176172
{buttonString}
177173
</button>

redisinsight/ui/src/pages/browser/components/stream-details/StreamDetails/StreamDetails.tsx

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,25 @@ const headerHeight = 60
2828
const rowHeight = 54
2929
const actionsWidth = 54
3030
const minColumnWidth = 190
31-
const xrangeIdPrefix = '('
32-
const noItemsMessageString = 'There are no Entries in the Stream.'
31+
const noItemsMessageInEmptyStream = 'There are no Entries in the Stream.'
32+
const noItemsMessageInRange = 'No results found.'
3333

3434
interface IStreamEntry extends StreamEntryDto {
3535
editing: boolean
3636
}
3737

38+
const getNextId = (id: string, sortOrder: SortOrder): string => {
39+
const splittedId = id.split('-')
40+
// if we don't have prefix
41+
if (splittedId.length === 1) {
42+
return `${id}-1`
43+
}
44+
if (sortOrder === SortOrder.DESC) {
45+
return splittedId[1] === '0' ? `${parseInt(splittedId[0], 10) - 1}` : `${splittedId[0]}-${+splittedId[1] - 1}`
46+
}
47+
return `${splittedId[0]}-${+splittedId[1] + 1}`
48+
}
49+
3850
export interface Props {
3951
data: IStreamEntry[]
4052
columns: ITableColumn[]
@@ -72,24 +84,33 @@ const StreamDetails = (props: Props) => {
7284
return false
7385
}
7486
return sortedColumnOrder === SortOrder.ASC
75-
? lastLoadedEntryTimeStamp > lastRangeEntryTimestamp
76-
: lastLoadedEntryTimeStamp < firstRangeEntryTimestamp
87+
? lastLoadedEntryTimeStamp <= lastRangeEntryTimestamp
88+
: lastLoadedEntryTimeStamp >= firstRangeEntryTimestamp
7789
}
78-
const previousLoadedString = `${xrangeIdPrefix + lastLoadedEntryId}`
90+
const nextId = getNextId(lastLoadedEntryId, sortedColumnOrder)
7991

8092
if (shouldLoadMore()) {
8193
dispatch(
8294
fetchMoreStreamEntries(
8395
key,
84-
sortedColumnOrder === SortOrder.DESC ? start : previousLoadedString,
85-
sortedColumnOrder === SortOrder.DESC ? previousLoadedString : end,
96+
sortedColumnOrder === SortOrder.DESC ? start : nextId,
97+
sortedColumnOrder === SortOrder.DESC ? nextId : end,
8698
SCAN_COUNT_DEFAULT,
8799
sortedColumnOrder,
88100
)
89101
)
90102
}
91103
}
92104

105+
const loadEntries = () => {
106+
dispatch(fetchStreamEntries(
107+
key,
108+
SCAN_COUNT_DEFAULT,
109+
sortedColumnOrder,
110+
false
111+
))
112+
}
113+
93114
const onChangeSorting = (column: any, order: SortOrder) => {
94115
setSortedColumnName(column)
95116
setSortedColumnOrder(order)
@@ -100,13 +121,15 @@ const StreamDetails = (props: Props) => {
100121
const handleChangeStartFilter = useCallback(
101122
(value: number) => {
102123
dispatch(updateStart(value.toString()))
124+
loadEntries()
103125
},
104126
[]
105127
)
106128

107129
const handleChangeEndFilter = useCallback(
108130
(value: number) => {
109131
dispatch(updateEnd(value.toString()))
132+
loadEntries()
110133
},
111134
[]
112135
)
@@ -117,6 +140,15 @@ const StreamDetails = (props: Props) => {
117140
const startNumber = useMemo(() => (start === '' ? 0 : parseInt(start, 10)), [start])
118141
const endNumber = useMemo(() => (end === '' ? 0 : parseInt(end, 10)), [end])
119142

143+
const handleResetFilter = useCallback(
144+
() => {
145+
dispatch(updateStart(firstEntryTimeStamp.toString()))
146+
dispatch(updateEnd(lastEntryTimeStamp.toString()))
147+
loadEntries()
148+
},
149+
[lastEntryTimeStamp, firstEntryTimeStamp]
150+
)
151+
120152
useEffect(() => {
121153
if (start === '' && firstEntry?.id !== '') {
122154
dispatch(updateStart(firstEntryTimeStamp.toString()))
@@ -129,17 +161,6 @@ const StreamDetails = (props: Props) => {
129161
}
130162
}, [lastEntryTimeStamp])
131163

132-
useEffect(() => {
133-
if (start !== '' && end !== '') {
134-
dispatch(fetchStreamEntries(
135-
key,
136-
SCAN_COUNT_DEFAULT,
137-
sortedColumnOrder,
138-
false
139-
))
140-
}
141-
}, [start, end])
142-
143164
return (
144165
<>
145166
{shouldFilterRender ? (
@@ -150,6 +171,7 @@ const StreamDetails = (props: Props) => {
150171
end={endNumber}
151172
handleChangeStart={handleChangeStartFilter}
152173
handleChangeEnd={handleChangeEndFilter}
174+
handleResetFilter={handleResetFilter}
153175
/>
154176
)
155177
: (
@@ -191,7 +213,7 @@ const StreamDetails = (props: Props) => {
191213
totalItemsCount={total}
192214
onWheel={onClosePopover}
193215
onChangeSorting={onChangeSorting}
194-
noItemsMessage={noItemsMessageString}
216+
noItemsMessage={isNull(firstEntry) && isNull(lastEntry) ? noItemsMessageInEmptyStream : noItemsMessageInRange}
195217
tableWidth={columns.length * minColumnWidth - actionsWidth}
196218
sortedColumn={entries?.length ? {
197219
column: sortedColumnName,

redisinsight/ui/src/pages/browser/components/stream-details/StreamDetailsWrapper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ const StreamDetailsWrapper = (props: Props) => {
177177
<PopoverDelete
178178
text={(
179179
<>
180-
This Entry will be removed from
180+
Entry {id} will be removed from
181181
<br />
182182
{key}
183183
</>

redisinsight/ui/src/slices/browser/stream.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
22
import axios, { AxiosError, CancelTokenSource } from 'axios'
3-
import { remove } from 'lodash'
43

54
import { apiService } from 'uiSrc/services'
65
import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api'
76
import { ApiEndpoints, SortOrder } from 'uiSrc/constants'
8-
import { fetchKeyInfo, refreshKeyInfoAction, } from 'uiSrc/slices/browser/keys'
7+
import { refreshKeyInfoAction, } from 'uiSrc/slices/browser/keys'
98
import { getApiErrorMessage, getUrl, isStatusSuccessful, Maybe, Nullable } from 'uiSrc/utils'
109
import { getStreamRangeStart, getStreamRangeEnd } from 'uiSrc/utils/streamUtils'
1110
import successMessages from 'uiSrc/components/notifications/success-messages'
1211
import {
1312
AddStreamEntriesDto,
1413
AddStreamEntriesResponse,
1514
GetStreamEntriesResponse,
16-
StreamEntryDto,
1715
} from 'apiSrc/modules/browser/dto/stream.dto'
1816
import { AppDispatch, RootState } from '../store'
1917
import { StateStream } from '../interfaces/stream'
@@ -108,14 +106,6 @@ const streamSlice = createSlice({
108106
state.loading = false
109107
state.error = payload
110108
},
111-
removeEntriesFromList: (state, { payload }: PayloadAction<string[]>) => {
112-
remove(state.data?.entries, (entry: StreamEntryDto) => payload.includes(entry.id))
113-
114-
state.data = {
115-
...state.data,
116-
total: state.data.total - 1,
117-
}
118-
},
119109
updateStart: (state, { payload }: PayloadAction<string>) => {
120110
state.range.start = payload
121111
},
@@ -145,7 +135,6 @@ export const {
145135
removeStreamEntries,
146136
removeStreamEntriesSuccess,
147137
removeStreamEntriesFailure,
148-
removeEntriesFromList,
149138
updateStart,
150139
updateEnd,
151140
cleanRangeFilter
@@ -364,7 +353,7 @@ export function deleteStreamEntry(key: string, entries: string[]) {
364353
)
365354
if (isStatusSuccessful(status)) {
366355
dispatch(removeStreamEntriesSuccess())
367-
dispatch(removeEntriesFromList(entries))
356+
dispatch<any>(refreshStreamEntries(key, false))
368357
dispatch<any>(refreshKeyInfoAction(key))
369358
dispatch(addMessageNotification(
370359
successMessages.REMOVED_KEY_VALUE(

0 commit comments

Comments
 (0)