Skip to content

Commit 6a3f380

Browse files
committed
RI-6336 - WIP - moving to per DB config
1 parent f740a06 commit 6a3f380

File tree

11 files changed

+57
-31
lines changed

11 files changed

+57
-31
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ const propsMock = {
5050
onAddKeyPanel: jest.fn(),
5151
}
5252

53-
const shownColumns = [BrowserColumns.Size, BrowserColumns.TTL]
54-
5553
const mockedKeySlice = {
5654
viewType: KeyViewType.Browser,
5755
searchMode: SearchMode.Pattern,

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
setBrowserPatternScrollPosition,
2525
setBrowserIsNotRendered,
2626
setBrowserRedisearchScrollPosition,
27+
appContextDbConfig,
2728
} from 'uiSrc/slices/app/context'
2829
import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api'
2930
import { KeysStoreData, SearchMode } from 'uiSrc/slices/interfaces/keys'
@@ -82,7 +83,8 @@ const KeyList = forwardRef((props: Props, ref) => {
8283

8384
const selectedKey = useSelector(selectedKeySelector)
8485
const { nextCursor, previousResultCount } = useSelector(keysDataSelector)
85-
const { isSearched, isFiltered, searchMode, deleting, shownColumns } = useSelector(keysSelector)
86+
const { isSearched, isFiltered, searchMode } = useSelector(keysSelector)
87+
const { shownColumns } = useSelector(appContextDbConfig)
8688
const { keyList: { isNotRendered: isNotRenderedContext } } = useSelector(appContextBrowser)
8789

8890
const [, rerender] = useState({})
@@ -282,6 +284,7 @@ const KeyList = forwardRef((props: Props, ref) => {
282284
dispatch(fetchKeysMetadata(
283285
itemsToFetch.map(({ name }) => name),
284286
commonFilterType,
287+
shownColumns,
285288
controller.current?.signal,
286289
(loadedItems) => onSuccessFetchedMetadata(startIndex, loadedItems),
287290
() => { rerender({}) }

redisinsight/ui/src/pages/browser/components/key-list/styles.module.scss

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,30 @@
2929
.ReactVirtualized__Table__rowColumn {
3030
.moveOnHoverKey {
3131
transition: transform ease 0.3s;
32-
&.hide { transform: translateX(-8px) }
32+
33+
&.hide {
34+
transform: translateX(-8px)
35+
}
3336
}
37+
3438
.showOnHoverKey {
3539
display: none;
36-
&.show { display: block !important; }}
40+
41+
&.show {
42+
display: block !important;
43+
}
44+
}
3745
}
3846

3947
&:hover {
4048
.ReactVirtualized__Table__rowColumn {
41-
.moveOnHoverKey { transform: translateX(-8px) }
42-
.showOnHoverKey { display: block !important; }
49+
.moveOnHoverKey {
50+
transform: translateX(-8px)
51+
}
52+
53+
.showOnHoverKey {
54+
display: block !important;
55+
}
4356
}
4457
}
4558
}
@@ -79,4 +92,4 @@
7992

8093
:global(.table-row-selected) .action {
8194
opacity: 1;
82-
}
95+
}

redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import ColumnsIcon from 'uiSrc/assets/img/icons/columns.svg?react'
99
import TreeViewIcon from 'uiSrc/assets/img/icons/treeview.svg?react'
1010
import KeysSummary from 'uiSrc/components/keys-summary'
1111
import { SCAN_COUNT_DEFAULT, SCAN_TREE_COUNT_DEFAULT } from 'uiSrc/constants/api'
12-
import { resetBrowserTree, setBrowserKeyListDataLoaded, } from 'uiSrc/slices/app/context'
12+
import { appContextDbConfig, resetBrowserTree, setBrowserKeyListDataLoaded, setBrowserShownColumns, } from 'uiSrc/slices/app/context'
1313

14-
import { changeKeyViewType, fetchKeys, keysSelector, resetKeysData, setShownColumns } from 'uiSrc/slices/browser/keys'
14+
import { changeKeyViewType, fetchKeys, keysSelector, resetKeysData } from 'uiSrc/slices/browser/keys'
1515
import { redisearchSelector } from 'uiSrc/slices/browser/redisearch'
1616
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
1717
import { KeysStoreData, KeyViewType, SearchMode } from 'uiSrc/slices/interfaces/keys'
@@ -59,7 +59,8 @@ const KeysHeader = (props: Props) => {
5959
} = props
6060

6161
const { id: instanceId } = useSelector(connectedInstanceSelector)
62-
const { viewType, searchMode, isFiltered, shownColumns } = useSelector(keysSelector)
62+
const { viewType, searchMode, isFiltered } = useSelector(keysSelector)
63+
const { shownColumns } = useSelector(appContextDbConfig)
6364
const { selectedIndex } = useSelector(redisearchSelector)
6465

6566
const [columnsConfigShown, setColumnsConfigShown] = useState(false)
@@ -193,7 +194,7 @@ const KeysHeader = (props: Props) => {
193194
status ? shown.push(BrowserColumns.Size) : hidden.push(BrowserColumns.Size)
194195
}
195196

196-
dispatch(setShownColumns(newColumns))
197+
dispatch(setBrowserShownColumns(newColumns))
197198
sendEventTelemetry({
198199
event: TelemetryEvent.SHOW_BROWSER_COLUMN_CLICKED,
199200
eventData: {

redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
FixedSizeTree as Tree,
88
} from 'react-vtree'
99
import { EuiIcon, EuiImage, EuiLoadingSpinner, EuiProgress } from '@elastic/eui'
10-
import { useDispatch } from 'react-redux'
10+
import { useDispatch, useSelector } from 'react-redux'
1111

1212
import { bufferToString, Maybe, Nullable } from 'uiSrc/utils'
1313
import { useDisposableWebworker } from 'uiSrc/services'
@@ -18,6 +18,7 @@ import KeyLightSVG from 'uiSrc/assets/img/sidebar/browser.svg'
1818
import KeyDarkSVG from 'uiSrc/assets/img/sidebar/browser_active.svg'
1919
import { RedisResponseBuffer, RedisString } from 'uiSrc/slices/interfaces'
2020
import { fetchKeysMetadataTree } from 'uiSrc/slices/browser/keys'
21+
import { appContextDbConfig } from 'uiSrc/slices/app/context'
2122
import { GetKeyInfoResponse } from 'apiSrc/modules/browser/keys/dto'
2223

2324
import { Node } from './components/Node'
@@ -72,6 +73,7 @@ const VirtualTree = (props: Props) => {
7273

7374
const { theme } = useContext(ThemeContext)
7475
const [rerenderState, rerender] = useState({})
76+
const { shownColumns } = useSelector(appContextDbConfig)
7577
const controller = useRef<Nullable<AbortController>>(null)
7678
const elements = useRef<any>({})
7779
const nodes = useRef<TreeNode[]>([])
@@ -144,6 +146,7 @@ const VirtualTree = (props: Props) => {
144146
dispatch(fetchKeysMetadataTree(
145147
itemsInit,
146148
filter,
149+
shownColumns,
147150
controller.current?.signal,
148151
(loadedItems) =>
149152
onSuccessFetchedMetadata(loadedItems),
@@ -251,7 +254,7 @@ const VirtualTree = (props: Props) => {
251254
<AutoSizer>
252255
{({ height, width }) => (
253256
<div data-testid="virtual-tree" style={{ position: 'relative' }}>
254-
{ nodes.current.length > 0 && (
257+
{nodes.current.length > 0 && (
255258
<>
256259
{loading && (
257260
<EuiProgress
@@ -275,7 +278,7 @@ const VirtualTree = (props: Props) => {
275278
</Tree>
276279
</>
277280
)}
278-
{ nodes.current.length === 0 && loading && (
281+
{nodes.current.length === 0 && loading && (
279282
<div className={styles.loadingContainer} style={{ width, height }} data-testid="virtual-tree-spinner">
280283
<div className={styles.loadingBody}>
281284
<EuiLoadingSpinner size="xl" className={styles.loadingSpinner} />

redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import KeyRowSize from 'uiSrc/pages/browser/components/key-row-size'
1717
import KeyRowName from 'uiSrc/pages/browser/components/key-row-name'
1818
import KeyRowType from 'uiSrc/pages/browser/components/key-row-type'
1919
import { RedisResponseBuffer } from 'uiSrc/slices/interfaces'
20-
import { keysSelector } from 'uiSrc/slices/browser/keys'
20+
import { appContextDbConfig } from 'uiSrc/slices/app/context'
2121
import { DeleteKeyPopover } from '../../../delete-key-popover/DeleteKeyPopover'
2222
import { TreeData } from '../../interfaces'
2323
import styles from './styles.module.scss'
@@ -60,7 +60,7 @@ const Node = ({
6060

6161
const delimiterView = delimiters.length === 1 ? delimiters[0] : '-'
6262

63-
const { shownColumns } = useSelector(keysSelector)
63+
const { shownColumns } = useSelector(appContextDbConfig)
6464
const getSize = shownColumns.includes(BrowserColumns.Size)
6565
const getTtl = shownColumns.includes(BrowserColumns.TTL)
6666

redisinsight/ui/src/pages/browser/modules/key-details/KeyDetails.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { KeyTypes } from 'uiSrc/constants'
1616
import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
1717
import { RedisResponseBuffer } from 'uiSrc/slices/interfaces'
1818
import { Nullable } from 'uiSrc/utils'
19+
import { appContextDbConfig } from 'uiSrc/slices/app/context'
1920
import { NoKeySelected } from './components/no-key-selected'
2021
import { DynamicTypeDetails } from './components/dynamic-type-details'
2122

@@ -43,6 +44,7 @@ const KeyDetails = (props: Props) => {
4344

4445
const { instanceId } = useParams<{ instanceId: string }>()
4546
const { viewType } = useSelector(keysSelector)
47+
const { shownColumns } = useSelector(appContextDbConfig)
4648
const { loading, error = '', data } = useSelector(selectedKeySelector)
4749
const isKeySelected = !isNull(useSelector(selectedKeyDataSelector))
4850
const { type: keyType } = useSelector(selectedKeyDataSelector) ?? { type: KeyTypes.String }
@@ -54,6 +56,7 @@ const KeyDetails = (props: Props) => {
5456

5557
dispatch(fetchKeyInfo(
5658
keyProp,
59+
shownColumns,
5760
undefined,
5861
(data) => {
5962
if (!data) return

redisinsight/ui/src/slices/app/context.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
DEFAULT_TREE_SORTING,
1212
KeyTypes, Pages,
1313
SortOrder,
14+
BrowserColumns,
1415
} from 'uiSrc/constants'
1516
import { localStorageService, setCapabilityStorageField, setDBConfigStorageField } from 'uiSrc/services'
1617
import { clearExpertChatHistory } from 'uiSrc/slices/panels/aiAssistant'
@@ -30,6 +31,8 @@ import { SearchMode } from '../interfaces/keys'
3031
import { AppWorkspace, RedisResponseBuffer, StateAppContext } from '../interfaces'
3132
import { AppDispatch, RootState } from '../store'
3233

34+
const DEFAULT_SHOWN_COLUMNS = [BrowserColumns.Size, BrowserColumns.TTL]
35+
3336
export const initialState: StateAppContext = {
3437
workspace: localStorageService.get(BrowserStorageItem.homePage) === Pages.rdi
3538
? AppWorkspace.RDI
@@ -42,6 +45,7 @@ export const initialState: StateAppContext = {
4245
treeViewSort: DEFAULT_TREE_SORTING,
4346
slowLogDurationUnit: DEFAULT_SLOWLOG_DURATION_UNIT,
4447
showHiddenRecommendations: DEFAULT_SHOW_HIDDEN_RECOMMENDATIONS,
48+
shownColumns: DEFAULT_SHOWN_COLUMNS,
4549
},
4650
dbIndex: {
4751
disabled: false
@@ -131,6 +135,7 @@ const appContextSlice = createSlice({
131135
state.dbConfig.treeViewSort = payload?.treeViewSort ?? DEFAULT_TREE_SORTING
132136
state.dbConfig.slowLogDurationUnit = payload?.slowLogDurationUnit ?? DEFAULT_SLOWLOG_DURATION_UNIT
133137
state.dbConfig.showHiddenRecommendations = payload?.showHiddenRecommendations
138+
state.dbConfig.shownColumns = payload?.shownColumns ?? DEFAULT_SHOWN_COLUMNS
134139
},
135140
setSlowLogUnits: (state, { payload }) => {
136141
state.dbConfig.slowLogDurationUnit = payload
@@ -144,6 +149,10 @@ const appContextSlice = createSlice({
144149
state.dbConfig.treeViewSort = payload
145150
setDBConfigStorageField(state.contextInstanceId, BrowserStorageItem.treeViewSort, payload)
146151
},
152+
setBrowserShownColumns: (state, { payload }: PayloadAction<BrowserColumns[]>) => {
153+
state.dbConfig.shownColumns = payload
154+
setDBConfigStorageField(state.contextInstanceId, BrowserStorageItem.browserShownColumns, payload)
155+
},
147156
setRecommendationsShowHidden: (state, { payload }: { payload: boolean }) => {
148157
state.dbConfig.showHiddenRecommendations = payload
149158
setDBConfigStorageField(state.contextInstanceId, BrowserStorageItem.showHiddenRecommendations, payload)
@@ -275,6 +284,7 @@ export const {
275284
setLastPipelineManagementPage,
276285
setPipelineDialogState,
277286
resetPipelineManagement,
287+
setBrowserShownColumns,
278288
} = appContextSlice.actions
279289

280290
// Selectors

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ export const initialState: KeysStore = {
8080
isBrowserFullScreen: false,
8181
searchMode: localStorageService?.get(BrowserStorageItem.browserSearchMode) ?? SearchMode.Pattern,
8282
viewType: localStorageService?.get(BrowserStorageItem.browserViewType) ?? KeyViewType.Browser,
83-
shownColumns: localStorageService?.get(BrowserStorageItem.browserShownColumns)
84-
?? [BrowserColumns.Size, BrowserColumns.TTL],
8583
data: {
8684
total: 0,
8785
scanned: 0,
@@ -425,10 +423,6 @@ const keysSlice = createSlice({
425423
setSelectedKeyRefreshDisabled: (state, { payload }: PayloadAction<boolean>) => {
426424
state.selectedKey.isRefreshDisabled = payload
427425
},
428-
setShownColumns: (state, { payload }: PayloadAction<BrowserColumns[]>) => {
429-
state.shownColumns = payload
430-
localStorageService?.set(BrowserStorageItem.browserShownColumns, payload)
431-
},
432426
},
433427
})
434428

@@ -479,7 +473,6 @@ export const {
479473
deleteSearchHistorySuccess,
480474
deleteSearchHistoryFailure,
481475
setSelectedKeyRefreshDisabled,
482-
setShownColumns
483476
} = keysSlice.actions
484477

485478
// A selector
@@ -663,6 +656,7 @@ export function fetchMorePatternKeysAction(oldKeys: IKeyPropTypes[] = [], cursor
663656
// Asynchronous thunk action
664657
export function fetchKeyInfo(
665658
key: RedisResponseBuffer,
659+
shownColumns: BrowserColumns[] = [BrowserColumns.Size, BrowserColumns.TTL],
666660
resetData?: boolean,
667661
onSuccess?: (data: Nullable<IKeyPropTypes>) => void
668662
) {
@@ -672,7 +666,6 @@ export function fetchKeyInfo(
672666
try {
673667
const state = stateInit()
674668
const { encoding } = state.app.info
675-
const { shownColumns } = state.browser.keys
676669
const { data, status } = await apiService.post(
677670
getUrl(
678671
state.connections.instances?.connectedInstance?.id ?? '',
@@ -736,13 +729,15 @@ export function fetchKeyInfo(
736729
}
737730

738731
// Asynchronous thunk action
739-
export function refreshKeyInfoAction(key: RedisResponseBuffer) {
732+
export function refreshKeyInfoAction(
733+
key: RedisResponseBuffer,
734+
shownColumns: BrowserColumns[] = [BrowserColumns.Size, BrowserColumns.TTL]
735+
) {
740736
return async (dispatch: AppDispatch, stateInit: () => RootState) => {
741737
dispatch(refreshKeyInfo())
742738
try {
743739
const state = stateInit()
744740
const { encoding } = state.app.info
745-
const { shownColumns } = state.browser.keys
746741
const { data, status } = await apiService.post(
747742
getUrl(
748743
state.connections.instances?.connectedInstance?.id ?? '',
@@ -1045,14 +1040,14 @@ export function editKeyTTL(key: RedisResponseBuffer, ttl: number) {
10451040
export function fetchKeysMetadata(
10461041
keys: RedisString[],
10471042
filter: Nullable<KeyTypes>,
1043+
shownColumns: BrowserColumns[] = [BrowserColumns.Size, BrowserColumns.TTL],
10481044
signal?: AbortSignal,
10491045
onSuccessAction?: (data: GetKeyInfoResponse[]) => void,
10501046
onFailAction?: () => void
10511047
) {
10521048
return async (_dispatch: AppDispatch, stateInit: () => RootState) => {
10531049
try {
10541050
const state = stateInit()
1055-
const { shownColumns } = state.browser.keys
10561051
const { data } = await apiService.post<GetKeyInfoResponse[]>(
10571052
getUrl(
10581053
state.connections.instances?.connectedInstance?.id,
@@ -1082,14 +1077,14 @@ export function fetchKeysMetadata(
10821077
export function fetchKeysMetadataTree(
10831078
keys: RedisString[],
10841079
filter: Nullable<KeyTypes>,
1080+
shownColumns: BrowserColumns[] = [BrowserColumns.Size, BrowserColumns.TTL],
10851081
signal?: AbortSignal,
10861082
onSuccessAction?: (data: GetKeyInfoResponse[]) => void,
10871083
onFailAction?: () => void
10881084
) {
10891085
return async (_dispatch: AppDispatch, stateInit: () => RootState) => {
10901086
try {
10911087
const state = stateInit()
1092-
const { shownColumns } = state.browser.keys
10931088
const { data } = await apiService.post<GetKeyInfoResponse[]>(
10941089
getUrl(
10951090
state.connections.instances?.connectedInstance?.id,

redisinsight/ui/src/slices/interfaces/app.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { AxiosError } from 'axios'
22
import { EuiComboBoxOptionOption } from '@elastic/eui'
33
import { RelativeWidthSizes } from 'uiSrc/components/virtual-table/interfaces'
44
import { Nullable } from 'uiSrc/utils'
5-
import { DurationUnits, FeatureFlags, ICommands, SortOrder } from 'uiSrc/constants'
5+
import { BrowserColumns, DurationUnits, FeatureFlags, ICommands, SortOrder } from 'uiSrc/constants'
66
import { GetServerInfoResponse } from 'apiSrc/modules/server/dto/server.dto'
77
import { RedisString as RedisStringAPI } from 'apiSrc/common/constants/redis-string'
88

@@ -74,6 +74,7 @@ export interface StateAppContext {
7474
treeViewSort: SortOrder
7575
slowLogDurationUnit: DurationUnits
7676
showHiddenRecommendations: boolean
77+
shownColumns: BrowserColumns[]
7778
}
7879
dbIndex: {
7980
disabled: boolean

0 commit comments

Comments
 (0)