Skip to content

Commit 71bcb66

Browse files
authored
RI-7195: Extend Query component (#4794)
with useLiteActions
1 parent a2e14f3 commit 71bcb66

File tree

6 files changed

+161
-15
lines changed

6 files changed

+161
-15
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import QueryCard from './query-card'
22
import QueryActions from './query-actions'
3+
import QueryLiteActions from './query-lite-actions'
34
import QueryTutorials from './query-tutorials'
45

5-
export { QueryCard, QueryActions, QueryTutorials }
6+
export { QueryCard, QueryActions, QueryLiteActions, QueryTutorials }
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import React from 'react'
2+
import { render, screen, fireEvent } from 'uiSrc/utils/test-utils'
3+
import QueryLiteActions from './QueryLiteActions'
4+
5+
describe('QueryLiteActions', () => {
6+
const onSubmit = jest.fn()
7+
const onClear = jest.fn()
8+
9+
beforeEach(() => {
10+
jest.clearAllMocks()
11+
})
12+
13+
it('should render both buttons', () => {
14+
render(<QueryLiteActions onSubmit={onSubmit} onClear={onClear} />)
15+
16+
expect(screen.getByTestId('btn-submit')).toBeInTheDocument()
17+
expect(screen.getByTestId('btn-clear')).toBeInTheDocument()
18+
})
19+
20+
it('should call onSubmit when Run button is clicked', () => {
21+
render(<QueryLiteActions onSubmit={onSubmit} onClear={onClear} />)
22+
23+
fireEvent.click(screen.getByTestId('btn-submit'))
24+
expect(onSubmit).toHaveBeenCalledTimes(1)
25+
})
26+
27+
it('should call onClear when Clear button is clicked', () => {
28+
render(<QueryLiteActions onSubmit={onSubmit} onClear={onClear} />)
29+
30+
fireEvent.click(screen.getByTestId('btn-clear'))
31+
expect(onClear).toHaveBeenCalledTimes(1)
32+
})
33+
34+
it('should disable buttons and show loading tooltip when isLoading is true', () => {
35+
render(<QueryLiteActions onSubmit={onSubmit} onClear={onClear} isLoading />)
36+
37+
const submitBtn = screen.getByTestId('btn-submit') as HTMLButtonElement
38+
const clearBtn = screen.getByTestId('btn-clear') as HTMLButtonElement
39+
40+
expect(submitBtn).toBeDisabled()
41+
expect(clearBtn).toBeDisabled()
42+
})
43+
})
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import React from 'react'
2+
3+
import { KEYBOARD_SHORTCUTS } from 'uiSrc/constants'
4+
import { KeyboardShortcut, RiTooltip } from 'uiSrc/components'
5+
6+
import { PlayFilledIcon } from 'uiSrc/components/base/icons'
7+
8+
import { Spacer } from 'uiSrc/components/base/layout/spacer'
9+
import { Button, EmptyButton } from 'uiSrc/components/base/forms/buttons'
10+
import { Text } from 'uiSrc/components/base/text'
11+
12+
export interface Props {
13+
onSubmit: () => void
14+
onClear: () => void
15+
isLoading?: boolean
16+
}
17+
18+
const QueryLiteActions = (props: Props) => {
19+
const { isLoading, onSubmit, onClear } = props
20+
const KeyBoardTooltipContent = KEYBOARD_SHORTCUTS?.workbench?.runQuery && (
21+
<>
22+
<Text size="s">{KEYBOARD_SHORTCUTS.workbench.runQuery?.label}:</Text>
23+
<Spacer size="s" />
24+
<KeyboardShortcut
25+
separator={KEYBOARD_SHORTCUTS?._separator}
26+
items={KEYBOARD_SHORTCUTS.workbench.runQuery.keys}
27+
/>
28+
</>
29+
)
30+
31+
return (
32+
<>
33+
<RiTooltip
34+
position="right"
35+
content={
36+
isLoading
37+
? 'Please wait while the commands are being executed…'
38+
: 'Clear query'
39+
}
40+
data-testid="clear-query-tooltip"
41+
>
42+
<EmptyButton
43+
onClick={onClear}
44+
loading={isLoading}
45+
disabled={isLoading}
46+
aria-label="clear"
47+
data-testid="btn-clear"
48+
>
49+
Clear
50+
</EmptyButton>
51+
</RiTooltip>
52+
53+
<RiTooltip
54+
position="left"
55+
content={
56+
isLoading
57+
? 'Please wait while the commands are being executed…'
58+
: KeyBoardTooltipContent
59+
}
60+
data-testid="run-query-tooltip"
61+
>
62+
<Button
63+
onClick={onSubmit}
64+
loading={isLoading}
65+
disabled={isLoading}
66+
icon={PlayFilledIcon}
67+
aria-label="submit"
68+
data-testid="btn-submit"
69+
>
70+
Run
71+
</Button>
72+
</RiTooltip>
73+
</>
74+
)
75+
}
76+
77+
export default QueryLiteActions
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import QueryLiteActions from './QueryLiteActions'
2+
3+
export default QueryLiteActions

redisinsight/ui/src/pages/workbench/components/query/Query/Query.tsx

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ import {
4040
workbenchResultsSelector,
4141
} from 'uiSrc/slices/workbench/wb-results'
4242
import DedicatedEditor from 'uiSrc/components/monaco-editor/components/dedicated-editor'
43-
import { QueryActions, QueryTutorials } from 'uiSrc/components/query'
43+
import {
44+
QueryActions,
45+
QueryTutorials,
46+
QueryLiteActions,
47+
} from 'uiSrc/components/query'
4448

4549
import {
4650
getRange,
@@ -78,6 +82,7 @@ export interface Props {
7882
activeMode: RunQueryMode
7983
resultsMode?: ResultsMode
8084
setQueryEl: Function
85+
useLiteActions?: boolean
8186
setQuery: (script: string) => void
8287
onSubmit: (query?: string) => void
8388
onKeyDown?: (e: React.KeyboardEvent, script: string) => void
@@ -97,6 +102,7 @@ const Query = (props: Props) => {
97102
indexes = [],
98103
activeMode,
99104
resultsMode,
105+
useLiteActions = false,
100106
setQuery = () => {},
101107
onKeyDown = () => {},
102108
onSubmit = () => {},
@@ -736,19 +742,29 @@ const Query = (props: Props) => {
736742
/>
737743
</div>
738744
<div className={styles.queryFooter}>
739-
<QueryTutorials
740-
tutorials={TUTORIALS}
741-
source="advanced_workbench_editor"
742-
/>
743-
<QueryActions
744-
isDisabled={isDedicatedEditorOpen}
745-
isLoading={isLoading}
746-
activeMode={activeMode}
747-
resultsMode={resultsMode}
748-
onChangeGroupMode={onChangeGroupMode}
749-
onChangeMode={onQueryChangeMode}
750-
onSubmit={handleSubmit}
751-
/>
745+
{useLiteActions ? (
746+
<QueryLiteActions
747+
isLoading={isLoading}
748+
onSubmit={handleSubmit}
749+
onClear={() => setQuery('')}
750+
/>
751+
) : (
752+
<>
753+
<QueryTutorials
754+
tutorials={TUTORIALS}
755+
source="advanced_workbench_editor"
756+
/>
757+
<QueryActions
758+
isDisabled={isDedicatedEditorOpen}
759+
isLoading={isLoading}
760+
activeMode={activeMode}
761+
resultsMode={resultsMode}
762+
onChangeGroupMode={onChangeGroupMode}
763+
onChangeMode={onQueryChangeMode}
764+
onSubmit={handleSubmit}
765+
/>
766+
</>
767+
)}
752768
</div>
753769
</div>
754770
{isDedicatedEditorOpen && (

redisinsight/ui/src/pages/workbench/components/query/QueryWrapper.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@ import { mergeRedisCommandsSpecs } from 'uiSrc/utils/transformers/redisCommands'
1313
import SEARCH_COMMANDS_SPEC from 'uiSrc/pages/workbench/data/supported_commands.json'
1414
import styles from './Query/styles.module.scss'
1515
import Query from './Query'
16+
import { Props as BaseQueryProps } from './Query/Query'
17+
18+
type QueryProps = Pick<BaseQueryProps, 'useLiteActions'>
1619

1720
export interface Props {
1821
query: string
1922
activeMode: RunQueryMode
2023
resultsMode?: ResultsMode
24+
queryProps?: QueryProps
2125
setQuery: (script: string) => void
2226
setQueryEl: Function
2327
onKeyDown?: (e: React.KeyboardEvent, script: string) => void
@@ -37,6 +41,7 @@ const QueryWrapper = (props: Props) => {
3741
onSubmit,
3842
onQueryChangeMode,
3943
onChangeGroupMode,
44+
queryProps = {},
4045
} = props
4146
const { loading: isCommandsLoading } = useSelector(appRedisCommandsSelector)
4247
const { id: connectedIndstanceId } = useSelector(connectedInstanceSelector)
@@ -79,6 +84,7 @@ const QueryWrapper = (props: Props) => {
7984
onSubmit={onSubmit}
8085
onQueryChangeMode={onQueryChangeMode}
8186
onChangeGroupMode={onChangeGroupMode}
87+
{...queryProps}
8288
/>
8389
)
8490
}

0 commit comments

Comments
 (0)