Skip to content

Commit 0bd631c

Browse files
authored
Merge pull request #3145 from RedisInsight/fe/bugfix/RI-5371
#RI-5371 - fix showing no results messages
2 parents d91d0b5 + 7668e93 commit 0bd631c

File tree

14 files changed

+86
-45
lines changed

14 files changed

+86
-45
lines changed

redisinsight/ui/src/constants/texts.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ export const NoResultsFoundText = (
99
No results found.
1010
</EuiText>
1111
)
12+
13+
export const LoadingText = (
14+
<EuiText size="m" data-testid="loading-keys" style={{ lineHeight: 1.4 }}>
15+
loading...
16+
</EuiText>
17+
)
18+
1219
export const NoSelectedIndexText = (
1320
<EuiText size="m" data-testid="no-result-select-index">
1421
Select an index and enter a query to search per values of keys.

redisinsight/ui/src/pages/browser/components/browser-left-panel/BrowserLeftPanel.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ const BrowserLeftPanel = (props: Props) => {
6767

6868
const isDataLoaded = searchMode === SearchMode.Pattern ? isDataPatternLoaded : isDataRedisearchLoaded
6969
const keysState = searchMode === SearchMode.Pattern ? patternKeysState : redisearchKeysState
70-
const loading = searchMode === SearchMode.Pattern ? patternLoading : redisearchLoading || redisearchListLoading
70+
const loading = searchMode === SearchMode.Pattern ? patternLoading : redisearchLoading
71+
const headerLoading = searchMode === SearchMode.Pattern ? patternLoading : redisearchListLoading
7172
const isSearched = searchMode === SearchMode.Pattern ? patternIsSearched : redisearchIsSearched
7273
const scrollTopPosition = searchMode === SearchMode.Pattern ? scrollPatternTopPosition : scrollRedisearchTopPosition
7374
const commonFilterType = searchMode === SearchMode.Pattern ? filter : keysState.keys?.[0]?.type
@@ -123,7 +124,7 @@ const BrowserLeftPanel = (props: Props) => {
123124
<div className={styles.container}>
124125
<KeysHeader
125126
keysState={keysState}
126-
loading={loading}
127+
loading={headerLoading}
127128
isSearched={isSearched}
128129
loadKeys={loadKeys}
129130
handleScanMoreClick={handleScanMoreClick}

redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ const KeyList = forwardRef((props: Props, ref) => {
8585
const { keyList: { isNotRendered: isNotRenderedContext } } = useSelector(appContextBrowser)
8686

8787
const [, rerender] = useState({})
88-
const [firstDataLoaded, setFirstDataLoaded] = useState<boolean>(!!keysState.keys.length)
88+
const [firstDataLoaded, setFirstDataLoaded] = useState<boolean>(
89+
!!keysState.keys.length || !isNotRenderedContext
90+
)
8991
const [deletePopoverIndex, setDeletePopoverIndex] = useState<Maybe<number>>(undefined)
9092

9193
const controller = useRef<Nullable<AbortController>>(null)
9294
const itemsRef = useRef(keysState.keys)
93-
const isNotRendered = useRef(isNotRenderedContext)
9495
const renderedRowsIndexesRef = useRef({ startIndex: 0, lastIndex: 0 })
9596

9697
const dispatch = useDispatch()
@@ -108,15 +109,16 @@ const KeyList = forwardRef((props: Props, ref) => {
108109
useEffect(() => {
109110
itemsRef.current = [...keysState.keys]
110111

111-
if (!isNotRendered.current && !loading) {
112+
if (
113+
(!firstDataLoaded && keysState.lastRefreshTime)
114+
|| (searchMode === SearchMode.Redisearch && itemsRef.current.length === 0)
115+
) {
112116
setFirstDataLoaded(true)
117+
dispatch(setBrowserIsNotRendered(false))
113118
}
114119

115-
isNotRendered.current = false
116-
dispatch(setBrowserIsNotRendered(isNotRendered.current))
117120
if (itemsRef.current.length === 0) {
118121
cancelAllMetadataRequests()
119-
setFirstDataLoaded(true)
120122
rerender({})
121123
return
122124
}
@@ -135,24 +137,13 @@ const KeyList = forwardRef((props: Props, ref) => {
135137

136138
const NoItemsMessage = () => (
137139
<NoKeysMessage
140+
isLoading={loading || !firstDataLoaded}
138141
total={keysState.total}
139142
scanned={keysState.scanned}
140143
onAddKeyPanel={onAddKeyPanel}
141144
/>
142145
)
143146

144-
const getNoItemsMessage = () => {
145-
if (isNotRendered.current) {
146-
return ''
147-
}
148-
149-
if (itemsRef.current.length < keysState.keys.length) {
150-
return 'loading...'
151-
}
152-
153-
return <NoItemsMessage />
154-
}
155-
156147
const onLoadMoreItems = (props: { startIndex: number, stopIndex: number }) => {
157148
if (searchMode === SearchMode.Redisearch
158149
&& keysState.maxResults
@@ -331,6 +322,8 @@ const KeyList = forwardRef((props: Props, ref) => {
331322
},
332323
]
333324

325+
const noItemsMessage = NoItemsMessage()
326+
334327
const VirtualizeTable = () => (
335328
<VirtualTable
336329
selectable
@@ -346,7 +339,7 @@ const KeyList = forwardRef((props: Props, ref) => {
346339
items={itemsRef.current}
347340
totalItemsCount={keysState.total ?? Infinity}
348341
scanned={isSearched || isFiltered ? keysState.scanned : 0}
349-
noItemsMessage={getNoItemsMessage()}
342+
noItemsMessage={noItemsMessage}
350343
selectedKey={selectedKey.data}
351344
scrollTopProp={scrollTopPosition}
352345
setScrollTopPosition={setScrollTopPosition}

redisinsight/ui/src/pages/browser/components/key-tree/KeyTree.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ const KeyTree = forwardRef((props: Props, ref) => {
105105
}, [keysState.keys])
106106

107107
useEffect(() => {
108-
setFirstDataLoaded(true)
108+
if (keysState.lastRefreshTime) {
109+
setFirstDataLoaded(true)
110+
}
111+
109112
setItems(parseKeyNames(keysState.keys))
110-
}, [sorting, delimiter, keysState.lastRefreshTime])
113+
}, [keysState.lastRefreshTime, delimiter, sorting])
111114

112115
useEffect(() => {
113116
openSelectedKey(selectedKeyName)
@@ -161,19 +164,14 @@ const KeyTree = forwardRef((props: Props, ref) => {
161164
}
162165

163166
if (keysState.keys.length === 0) {
164-
const NoItemsMessage = () => {
165-
if (loading || !firstDataLoaded) {
166-
return <span>loading...</span>
167-
}
168-
169-
return (
170-
<NoKeysMessage
171-
total={keysState.total}
172-
scanned={keysState.scanned}
173-
onAddKeyPanel={onAddKeyPanel}
174-
/>
175-
)
176-
}
167+
const NoItemsMessage = () => (
168+
<NoKeysMessage
169+
isLoading={loading || !firstDataLoaded}
170+
total={keysState.total}
171+
scanned={keysState.scanned}
172+
onAddKeyPanel={onAddKeyPanel}
173+
/>
174+
)
177175

178176
return (
179177
<div className={cx(styles.content)}>

redisinsight/ui/src/pages/browser/components/no-keys-message/NoKeysMessage.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { SearchMode } from 'uiSrc/slices/interfaces/keys'
55

66
import {
77
FullScanNoResultsFoundText,
8+
LoadingText,
89
NoResultsFoundText,
910
NoSelectedIndexText,
1011
ScanNoResultsFoundText,
@@ -15,6 +16,7 @@ import { redisearchSelector } from 'uiSrc/slices/browser/redisearch'
1516
import NoKeysFound from '../no-keys-found'
1617

1718
export interface Props {
19+
isLoading: boolean
1820
total: number
1921
scanned: number
2022
onAddKeyPanel: (value: boolean) => void
@@ -25,6 +27,7 @@ const NoKeysMessage = (props: Props) => {
2527
total,
2628
scanned,
2729
onAddKeyPanel,
30+
isLoading,
2831
} = props
2932

3033
const { selectedIndex, isSearched: redisearchIsSearched } = useSelector(redisearchSelector)
@@ -35,6 +38,10 @@ const NoKeysMessage = (props: Props) => {
3538
return NoSelectedIndexText
3639
}
3740

41+
if (isLoading) {
42+
return LoadingText
43+
}
44+
3845
if (total === 0) {
3946
return NoResultsFoundText
4047
}
@@ -44,6 +51,10 @@ const NoKeysMessage = (props: Props) => {
4451
}
4552
}
4653

54+
if (isLoading) {
55+
return LoadingText
56+
}
57+
4758
if (total === 0) {
4859
return (<NoKeysFound onAddKeyPanel={onAddKeyPanel} />)
4960
}

redisinsight/ui/src/pages/workbench/components/wb-results/WBResults/WBResults.spec.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { cloneDeep } from 'lodash'
22
import React from 'react'
33
import { instance, mock } from 'ts-mockito'
44
import { CommandExecutionUI } from 'uiSrc/slices/interfaces'
5-
import { cleanup, mockedStore, render } from 'uiSrc/utils/test-utils'
5+
import { cleanup, mockedStore, render, screen } from 'uiSrc/utils/test-utils'
66
import WBResults, { Props } from './WBResults'
77

88
const mockedProps = mock<Props>()
@@ -27,12 +27,18 @@ describe('WBResults', () => {
2727
expect(render(<WBResults {...instance(mockedProps)} />)).toBeTruthy()
2828
})
2929

30-
it('should not render NoResults component with empty items', () => {
31-
const { getByTestId } = render(<WBResults {...instance(mockedProps)} items={[]} />)
30+
it('should render NoResults component with empty items', () => {
31+
const { getByTestId } = render(<WBResults {...instance(mockedProps)} items={[]} isResultsLoaded />)
3232

3333
expect(getByTestId('wb_no-results')).toBeInTheDocument()
3434
})
3535

36+
it('should not render NoResults component with empty items and loading state', () => {
37+
render(<WBResults {...instance(mockedProps)} items={[]} isResultsLoaded={false} />)
38+
39+
expect(screen.queryByTestId('wb_no-results')).not.toBeInTheDocument()
40+
})
41+
3642
it('should render with custom props', () => {
3743
const itemsMock: CommandExecutionUI[] = [
3844
{

redisinsight/ui/src/pages/workbench/components/wb-results/WBResults/WBResults.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22
import cx from 'classnames'
33
import {
4-
EuiButtonEmpty,
4+
EuiButtonEmpty, EuiProgress,
55
} from '@elastic/eui'
66

77
import { CodeButtonParams } from 'uiSrc/constants'
@@ -16,6 +16,7 @@ import WbNoResultsMessage from 'uiSrc/pages/workbench/components/wb-no-results-m
1616
import styles from './styles.module.scss'
1717

1818
export interface Props {
19+
isResultsLoaded: boolean
1920
items: CommandExecutionUI[]
2021
clearing: boolean
2122
processing: boolean
@@ -30,6 +31,7 @@ export interface Props {
3031
}
3132
const WBResults = (props: Props) => {
3233
const {
34+
isResultsLoaded,
3335
items = [],
3436
clearing,
3537
processing,
@@ -60,7 +62,15 @@ const WBResults = (props: Props) => {
6062

6163
return (
6264
<div className={styles.wrapper}>
63-
{!!items.length && (
65+
{!isResultsLoaded && (
66+
<EuiProgress
67+
color="primary"
68+
size="xs"
69+
position="absolute"
70+
data-testid="progress-wb-history"
71+
/>
72+
)}
73+
{!!items?.length && (
6474
<div className={styles.header}>
6575
<EuiButtonEmpty
6676
size="s"
@@ -76,7 +86,7 @@ const WBResults = (props: Props) => {
7686
)}
7787
<div className={cx(styles.container)}>
7888
<div ref={scrollDivRef} />
79-
{items.length ? items.map((
89+
{items?.length ? items.map((
8090
{
8191
command = '',
8292
isOpen = false,
@@ -124,7 +134,7 @@ const WBResults = (props: Props) => {
124134
onQueryDelete={() => onQueryDelete(id)}
125135
/>
126136
)) : null}
127-
{!items.length && (<WbNoResultsMessage />)}
137+
{(isResultsLoaded && !items.length) && (<WbNoResultsMessage />)}
128138
</div>
129139
</div>
130140
)

redisinsight/ui/src/pages/workbench/components/wb-results/WBResults/styles.module.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
display: flex;
1313
flex-direction: column;
14+
15+
position: relative;
1416
}
1517

1618
.container {

redisinsight/ui/src/pages/workbench/components/wb-results/WBResultsWrapper.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { CodeButtonParams } from 'uiSrc/constants'
66
import WBResults from './WBResults'
77

88
export interface Props {
9+
isResultsLoaded: boolean
910
items: CommandExecutionUI[]
1011
clearing: boolean
1112
processing: boolean

redisinsight/ui/src/pages/workbench/components/wb-view/WBView/WBView.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface Props {
3939
items: CommandExecutionUI[]
4040
clearing: boolean
4141
processing: boolean
42+
isResultsLoaded: boolean
4243
setScript: (script: string) => void
4344
setScriptEl: Function
4445
scriptEl: Nullable<monacoEditor.editor.IStandaloneCodeEditor>
@@ -74,6 +75,7 @@ const WBView = (props: Props) => {
7475
scriptEl,
7576
activeMode,
7677
resultsMode,
78+
isResultsLoaded,
7779
onSubmit,
7880
onQueryOpen,
7981
onQueryDelete,
@@ -218,6 +220,7 @@ const WBView = (props: Props) => {
218220
items={items}
219221
clearing={clearing}
220222
processing={processing}
223+
isResultsLoaded={isResultsLoaded}
221224
activeMode={activeMode}
222225
activeResultsMode={resultsMode}
223226
scrollDivRef={scrollDivRef}

0 commit comments

Comments
 (0)