diff --git a/redisinsight/ui/src/components/query/QueryWrapper.tsx b/redisinsight/ui/src/components/query/QueryWrapper.tsx index e4d41ad5c0..458e4f8880 100644 --- a/redisinsight/ui/src/components/query/QueryWrapper.tsx +++ b/redisinsight/ui/src/components/query/QueryWrapper.tsx @@ -80,7 +80,7 @@ const QueryWrapper = (props: Props) => { const command = [commandLine, multiCommands].join('') ? [commandLine, multiCommands].join(';') : null return { - command, + command: command?.toUpperCase(), databaseId: instanceId, multiple: multiCommands ? 'Multiple' : 'Single', pipeline: batchSize > 1, diff --git a/redisinsight/ui/src/pages/browser/components/browser-left-panel/BrowserLeftPanel.tsx b/redisinsight/ui/src/pages/browser/components/browser-left-panel/BrowserLeftPanel.tsx index 29817681cb..00a6450572 100644 --- a/redisinsight/ui/src/pages/browser/components/browser-left-panel/BrowserLeftPanel.tsx +++ b/redisinsight/ui/src/pages/browser/components/browser-left-panel/BrowserLeftPanel.tsx @@ -54,13 +54,14 @@ const BrowserLeftPanel = (props: Props) => { const { loading: patternLoading, viewType, searchMode, isSearched: patternIsSearched } = useSelector(keysSelector) const { contextInstanceId } = useSelector(appContextSelector) const { - keyList: { isDataLoaded, scrollPatternTopPosition, scrollRedisearchTopPosition } + keyList: { isDataPatternLoaded, isDataRedisearchLoaded, scrollPatternTopPosition, scrollRedisearchTopPosition } } = useSelector(appContextBrowser) const keyListRef = useRef() const dispatch = useDispatch() + const isDataLoaded = searchMode === SearchMode.Pattern ? isDataPatternLoaded : isDataRedisearchLoaded const keysState = searchMode === SearchMode.Pattern ? patternKeysState : redisearchKeysState const loading = searchMode === SearchMode.Pattern ? patternLoading : redisearchLoading || redisearchListLoading const isSearched = searchMode === SearchMode.Pattern ? patternIsSearched : redisearchIsSearched @@ -79,8 +80,8 @@ const BrowserLeftPanel = (props: Props) => { searchMode, '0', keyViewType === KeyViewType.Browser ? SCAN_COUNT_DEFAULT : SCAN_TREE_COUNT_DEFAULT, - () => dispatch(setBrowserKeyListDataLoaded(true)), - () => dispatch(setBrowserKeyListDataLoaded(false)) + () => dispatch(setBrowserKeyListDataLoaded(searchMode, true)), + () => dispatch(setBrowserKeyListDataLoaded(searchMode, false)) )) }, [searchMode]) diff --git a/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx b/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx index 6e09bdeb36..c0ccfc3598 100644 --- a/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx @@ -33,6 +33,7 @@ import { fetchKeysMetadata, keysDataSelector, keysSelector, + resetKeysData, selectedKeySelector, setLastBatchKeys, sourceKeysFetch, @@ -117,6 +118,7 @@ const KeyList = forwardRef((props: Props, ref) => { if (itemsRef.current.length === 0) { cancelAllMetadataRequests() setFirstDataLoaded(true) + dispatch(resetKeysData(searchMode)) rerender({}) return } diff --git a/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx b/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx index 99da0e5d48..659417a07b 100644 --- a/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx +++ b/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx @@ -168,8 +168,8 @@ const KeysHeader = (props: Props) => { searchMode, '0', viewType === KeyViewType.Browser ? SCAN_COUNT_DEFAULT : SCAN_TREE_COUNT_DEFAULT, - () => dispatch(setBrowserKeyListDataLoaded(true)), - () => dispatch(setBrowserKeyListDataLoaded(false)), + () => dispatch(setBrowserKeyListDataLoaded(searchMode, true)), + () => dispatch(setBrowserKeyListDataLoaded(searchMode, false)), )) } @@ -229,11 +229,14 @@ const KeysHeader = (props: Props) => { } }) } - dispatch(resetKeysData(searchMode)) - dispatch(changeKeyViewType(type)) dispatch(resetBrowserTree()) + dispatch(resetKeysData(searchMode)) localStorageService.set(BrowserStorageItem.browserViewType, type) loadKeys(type) + + setTimeout(() => { + dispatch(changeKeyViewType(type)) + }, 0) } const handleSwitchSearchMode = (mode: SearchMode) => { diff --git a/redisinsight/ui/src/pages/databaseAnalysis/components/top-keys/Table.tsx b/redisinsight/ui/src/pages/databaseAnalysis/components/top-keys/Table.tsx index eda469b676..53dae55f42 100644 --- a/redisinsight/ui/src/pages/databaseAnalysis/components/top-keys/Table.tsx +++ b/redisinsight/ui/src/pages/databaseAnalysis/components/top-keys/Table.tsx @@ -59,8 +59,8 @@ const Table = (props: Props) => { SearchMode.Pattern, '0', viewType === KeyViewType.Browser ? SCAN_COUNT_DEFAULT : SCAN_TREE_COUNT_DEFAULT, - () => dispatch(setBrowserKeyListDataLoaded(true)), - () => dispatch(setBrowserKeyListDataLoaded(false)), + () => dispatch(setBrowserKeyListDataLoaded(SearchMode.Pattern, true)), + () => dispatch(setBrowserKeyListDataLoaded(SearchMode.Pattern, false)), )) dispatch(resetBrowserTree()) dispatch(setBrowserSelectedKey(stringToBuffer(name))) diff --git a/redisinsight/ui/src/pages/databaseAnalysis/components/top-namespace/Table.tsx b/redisinsight/ui/src/pages/databaseAnalysis/components/top-namespace/Table.tsx index 3ea871152c..5a476322b1 100644 --- a/redisinsight/ui/src/pages/databaseAnalysis/components/top-namespace/Table.tsx +++ b/redisinsight/ui/src/pages/databaseAnalysis/components/top-namespace/Table.tsx @@ -71,8 +71,8 @@ const NameSpacesTable = (props: Props) => { SearchMode.Pattern, '0', viewType === KeyViewType.Browser ? SCAN_COUNT_DEFAULT : SCAN_TREE_COUNT_DEFAULT, - () => dispatch(setBrowserKeyListDataLoaded(true)), - () => dispatch(setBrowserKeyListDataLoaded(false)), + () => dispatch(setBrowserKeyListDataLoaded(SearchMode.Pattern, true)), + () => dispatch(setBrowserKeyListDataLoaded(SearchMode.Pattern, false)), )) dispatch(resetBrowserTree()) history.push(Pages.browser(instanceId)) diff --git a/redisinsight/ui/src/pages/workbench/WorkbenchPage.spec.tsx b/redisinsight/ui/src/pages/workbench/WorkbenchPage.spec.tsx index 2edc4d815b..1fa2f57494 100644 --- a/redisinsight/ui/src/pages/workbench/WorkbenchPage.spec.tsx +++ b/redisinsight/ui/src/pages/workbench/WorkbenchPage.spec.tsx @@ -167,7 +167,7 @@ describe('Telemetry', () => { expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.WORKBENCH_COMMAND_SUBMITTED, eventData: { - command: 'info;', + command: 'info;'.toUpperCase(), databaseId: INSTANCE_ID_MOCK, group: false, multiple: 'Single', @@ -205,7 +205,7 @@ describe('Telemetry', () => { expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.WORKBENCH_COMMAND_SUBMITTED, eventData: { - command: 'info;', + command: 'info;'.toUpperCase(), databaseId: INSTANCE_ID_MOCK, group: false, multiple: 'Single', diff --git a/redisinsight/ui/src/slices/app/context.ts b/redisinsight/ui/src/slices/app/context.ts index 3bf65167ed..c277f2244c 100644 --- a/redisinsight/ui/src/slices/app/context.ts +++ b/redisinsight/ui/src/slices/app/context.ts @@ -5,13 +5,15 @@ import { BrowserStorageItem, DEFAULT_DELIMITER, KeyTypes } from 'uiSrc/constants import { localStorageService } from 'uiSrc/services' import { RootState } from '../store' import { RedisResponseBuffer, StateAppContext } from '../interfaces' +import { SearchMode } from '../interfaces/keys' export const initialState: StateAppContext = { contextInstanceId: '', lastPage: '', browser: { keyList: { - isDataLoaded: false, + isDataPatternLoaded: false, + isDataRedisearchLoaded: false, scrollPatternTopPosition: 0, scrollRedisearchTopPosition: 0, isNotRendered: true, @@ -73,8 +75,11 @@ const appContextSlice = createSlice({ setBrowserSelectedKey: (state, { payload }: { payload: Nullable }) => { state.browser.keyList.selectedKey = payload }, - setBrowserKeyListDataLoaded: (state, { payload }: { payload: boolean }) => { - state.browser.keyList.isDataLoaded = payload + setBrowserPatternKeyListDataLoaded: (state, { payload }: { payload: boolean }) => { + state.browser.keyList.isDataPatternLoaded = payload + }, + setBrowserRedisearchKeyListDataLoaded: (state, { payload }: { payload: boolean }) => { + state.browser.keyList.isDataRedisearchLoaded = payload }, setBrowserPatternScrollPosition: (state, { payload }: { payload: number }) => { state.browser.keyList.scrollPatternTopPosition = payload @@ -176,7 +181,8 @@ const appContextSlice = createSlice({ export const { setAppContextInitialState, setAppContextConnectedInstanceId, - setBrowserKeyListDataLoaded, + setBrowserPatternKeyListDataLoaded, + setBrowserRedisearchKeyListDataLoaded, setBrowserSelectedKey, setBrowserPatternScrollPosition, setBrowserRedisearchScrollPosition, @@ -222,3 +228,13 @@ export const appContextAnalytics = (state: RootState) => // The reducer export default appContextSlice.reducer + +// Asynchronous thunk action +export function setBrowserKeyListDataLoaded( + searchMode: SearchMode, + value: boolean, +) { + return searchMode === SearchMode.Pattern + ? setBrowserPatternKeyListDataLoaded(value) + : setBrowserRedisearchKeyListDataLoaded(value) +} diff --git a/redisinsight/ui/src/slices/browser/keys.ts b/redisinsight/ui/src/slices/browser/keys.ts index 6dc17253b7..ac69773609 100644 --- a/redisinsight/ui/src/slices/browser/keys.ts +++ b/redisinsight/ui/src/slices/browser/keys.ts @@ -321,6 +321,8 @@ const keysSlice = createSlice({ resetPatternKeysData: (state) => { // state.data.keys = [] + state.data.total = 0 + state.data.scanned = 0 state.data.keys.length = 0 }, diff --git a/redisinsight/ui/src/slices/browser/redisearch.ts b/redisinsight/ui/src/slices/browser/redisearch.ts index 012c5a3b3d..e779e3261b 100644 --- a/redisinsight/ui/src/slices/browser/redisearch.ts +++ b/redisinsight/ui/src/slices/browser/redisearch.ts @@ -150,6 +150,8 @@ const redisearchSlice = createSlice({ }, resetRedisearchKeysData: (state) => { + state.data.total = 0 + state.data.scanned = 0 state.data.keys.length = 0 }, diff --git a/redisinsight/ui/src/slices/interfaces/app.ts b/redisinsight/ui/src/slices/interfaces/app.ts index bf88afa8da..274acd49ed 100644 --- a/redisinsight/ui/src/slices/interfaces/app.ts +++ b/redisinsight/ui/src/slices/interfaces/app.ts @@ -40,7 +40,8 @@ export interface StateAppContext { lastPage: string browser: { keyList: { - isDataLoaded: boolean + isDataPatternLoaded: boolean + isDataRedisearchLoaded: boolean scrollPatternTopPosition: number scrollRedisearchTopPosition: number isNotRendered: boolean diff --git a/redisinsight/ui/src/slices/tests/app/context.spec.ts b/redisinsight/ui/src/slices/tests/app/context.spec.ts index 040a05c701..11c50933d3 100644 --- a/redisinsight/ui/src/slices/tests/app/context.spec.ts +++ b/redisinsight/ui/src/slices/tests/app/context.spec.ts @@ -11,7 +11,8 @@ import reducer, { initialState, setAppContextInitialState, setAppContextConnectedInstanceId, - setBrowserKeyListDataLoaded, + setBrowserPatternKeyListDataLoaded, + setBrowserRedisearchKeyListDataLoaded, setBrowserSelectedKey, setBrowserPatternScrollPosition, setBrowserPanelSizes, @@ -126,20 +127,44 @@ describe('slices', () => { }) }) - describe('setBrowserKeyListDataLoaded', () => { + describe('setBrowserPatternKeyListDataLoaded', () => { it('should properly set context is data loaded', () => { // Arrange - const isDataLoaded = true + const isDataPatternLoaded = true const state = { ...initialState.browser, keyList: { ...initialState.browser.keyList, - isDataLoaded + isDataPatternLoaded } } // Act - const nextState = reducer(initialState, setBrowserKeyListDataLoaded(isDataLoaded)) + const nextState = reducer(initialState, setBrowserPatternKeyListDataLoaded(isDataPatternLoaded)) + + // Assert + const rootState = Object.assign(initialStateDefault, { + app: { context: nextState }, + }) + + expect(appContextBrowser(rootState)).toEqual(state) + }) + }) + + describe('setBrowserRedisearchKeyListDataLoaded', () => { + it('should properly set context is data loaded', () => { + // Arrange + const isDataRedisearchLoaded = true + const state = { + ...initialState.browser, + keyList: { + ...initialState.browser.keyList, + isDataRedisearchLoaded + } + } + + // Act + const nextState = reducer(initialState, setBrowserRedisearchKeyListDataLoaded(isDataRedisearchLoaded)) // Assert const rootState = Object.assign(initialStateDefault, {