Skip to content

Commit 54296e5

Browse files
Merge branch 'feature/RI-3942_rts_recommendation' of https://github.com/RedisInsight/RedisInsight into be/feature/RI-3942_rts_recommendation
2 parents 4473851 + e2c9e88 commit 54296e5

File tree

3 files changed

+114
-38
lines changed

3 files changed

+114
-38
lines changed

redisinsight/ui/src/constants/dbAnalysisRecommendations.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,5 +467,41 @@
467467
}
468468
],
469469
"badges": ["configuration_changes"]
470+
},
471+
"RTS": {
472+
"id": "RTS",
473+
"title":"Optimize the use of time series",
474+
"redisStack": true,
475+
"content": [
476+
{
477+
"id": "1",
478+
"type": "paragraph",
479+
"value": "If you are using sorted sets to work with time series data, consider using RedisTimeSeries to optimize the memory usage while having extraordinary query performance and small overhead during ingestion."
480+
},
481+
{
482+
"id": "2",
483+
"type": "spacer",
484+
"value": "l"
485+
},
486+
{
487+
"id": "3",
488+
"type": "span",
489+
"value": "Create a "
490+
},
491+
{
492+
"id": "4",
493+
"type": "link",
494+
"value": {
495+
"href": "https://redis.com/try-free/?utm_source=redis&utm_medium=app&utm_campaign=redisinsight_recommendations/",
496+
"name": "free Redis Stack database"
497+
}
498+
},
499+
{
500+
"id": "5",
501+
"type": "span",
502+
"value": " to use modern data models and processing engines."
503+
}
504+
],
505+
"badges": ["configuration_changes"]
470506
}
471507
}

redisinsight/ui/src/pages/databaseAnalysis/components/recommendations-view/Recommendations.tsx

Lines changed: 63 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
import React from 'react'
1+
import React, { useContext } from 'react'
22
import { useSelector } from 'react-redux'
33
import { useParams } from 'react-router-dom'
4-
import { isNull } from 'lodash'
4+
import { isNull, sortBy } from 'lodash'
55
import {
66
EuiAccordion,
77
EuiPanel,
88
EuiText,
99
EuiFlexGroup,
1010
EuiFlexItem,
11+
EuiIcon,
1112
} from '@elastic/eui'
13+
import { ThemeContext } from 'uiSrc/contexts/themeContext'
1214
import { dbAnalysisSelector } from 'uiSrc/slices/analytics/dbAnalysis'
1315
import recommendationsContent from 'uiSrc/constants/dbAnalysisRecommendations.json'
16+
import { Theme } from 'uiSrc/constants'
1417
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
18+
import RediStackDarkMin from 'uiSrc/assets/img/modules/redistack/RediStackDark-min.svg'
19+
import RediStackLightMin from 'uiSrc/assets/img/modules/redistack/RediStackLight-min.svg'
1520

1621
import { renderContent, renderBadges, renderBadgesLegend } from './utils'
1722
import styles from './styles.module.scss'
@@ -20,6 +25,7 @@ const Recommendations = () => {
2025
const { data, loading } = useSelector(dbAnalysisSelector)
2126
const { recommendations = [] } = data ?? {}
2227

28+
const { theme } = useContext(ThemeContext)
2329
const { instanceId } = useParams<{ instanceId: string }>()
2430

2531
const handleToggle = (isOpen: boolean, id: string) => sendEventTelemetry({
@@ -32,6 +38,31 @@ const Recommendations = () => {
3238
}
3339
})
3440

41+
const sortedRecommendations = sortBy(recommendations, ({ name }) =>
42+
(recommendationsContent[name]?.redisStack ? -1 : 0))
43+
44+
const renderButtonContent = (redisStack: boolean, title: string, badges: string[]) => (
45+
<EuiFlexGroup className={styles.accordionButton} responsive={false} alignItems="center" justifyContent="spaceBetween">
46+
<EuiFlexGroup alignItems="center">
47+
<EuiFlexItem grow={false}>
48+
{redisStack && (
49+
<EuiIcon
50+
type={theme === Theme.Dark ? RediStackDarkMin : RediStackLightMin}
51+
className={styles.redisStack}
52+
data-testid="redis-stack-icon"
53+
/>
54+
)}
55+
</EuiFlexItem>
56+
<EuiFlexItem grow={false}>
57+
{title}
58+
</EuiFlexItem>
59+
</EuiFlexGroup>
60+
<EuiFlexItem grow={false}>
61+
{renderBadges(badges)}
62+
</EuiFlexItem>
63+
</EuiFlexGroup>
64+
)
65+
3566
if (loading) {
3667
return (
3768
<div className={styles.loadingWrapper} data-testid="recommendations-loader" />
@@ -51,37 +82,37 @@ const Recommendations = () => {
5182
<div>
5283
{renderBadgesLegend()}
5384
</div>
54-
{recommendations.map(({ name }) => {
55-
const { id = '', title = '', content = '', badges = [] } = recommendationsContent[name]
85+
<div className={styles.recommendationsContainer}>
86+
{sortedRecommendations.map(({ name }) => {
87+
const {
88+
id = '',
89+
title = '',
90+
content = '',
91+
badges = [],
92+
redisStack = false
93+
} = recommendationsContent[name]
5694

57-
const buttonContent = (
58-
<EuiFlexGroup className={styles.accordionButton} responsive={false} alignItems="center" justifyContent="spaceBetween">
59-
<EuiFlexItem grow={false}>{title}</EuiFlexItem>
60-
<EuiFlexItem grow={false}>
61-
{renderBadges(badges)}
62-
</EuiFlexItem>
63-
</EuiFlexGroup>
64-
)
65-
return (
66-
<div key={id} className={styles.recommendation}>
67-
<EuiAccordion
68-
id={name}
69-
arrowDisplay="right"
70-
buttonContent={buttonContent}
71-
buttonClassName={styles.accordionBtn}
72-
buttonProps={{ 'data-test-subj': `${id}-button` }}
73-
className={styles.accordion}
74-
initialIsOpen
75-
onToggle={(isOpen) => handleToggle(isOpen, id)}
76-
data-testid={`${id}-accordion`}
77-
>
78-
<EuiPanel className={styles.accordionContent} color="subdued">
79-
{renderContent(content)}
80-
</EuiPanel>
81-
</EuiAccordion>
82-
</div>
83-
)
84-
})}
95+
return (
96+
<div key={id} className={styles.recommendation}>
97+
<EuiAccordion
98+
id={name}
99+
arrowDisplay="right"
100+
buttonContent={renderButtonContent(redisStack, title, badges)}
101+
buttonClassName={styles.accordionBtn}
102+
buttonProps={{ 'data-test-subj': `${id}-button` }}
103+
className={styles.accordion}
104+
initialIsOpen
105+
onToggle={(isOpen) => handleToggle(isOpen, id)}
106+
data-testid={`${id}-accordion`}
107+
>
108+
<EuiPanel className={styles.accordionContent} color="subdued">
109+
{renderContent(content)}
110+
</EuiPanel>
111+
</EuiAccordion>
112+
</div>
113+
)
114+
})}
115+
</div>
85116
</div>
86117
)
87118
}

redisinsight/ui/src/pages/databaseAnalysis/components/recommendations-view/styles.module.scss

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
@import "@elastic/eui/src/global_styling/index";
44

55
.wrapper {
6-
@include euiScrollBar;
7-
overflow-y: auto;
8-
overflow-x: hidden;
9-
max-height: 100%;
10-
padding-top: 30px;
6+
height: 100%;
117

128
.badgesLegend {
13-
margin: 0 22px 14px 0 !important;
9+
margin: 20px 22px 14px 0 !important;
1410

1511
.badgeWrapper {
1612
margin-right: 0;
@@ -34,6 +30,13 @@
3430
align-items: center;
3531
margin-right: 24px;
3632
}
33+
}
34+
35+
.recommendationsContainer {
36+
@include euiScrollBar;
37+
overflow-y: auto;
38+
overflow-x: hidden;
39+
max-height: 100%;
3740

3841
.accordionButton :global(.euiFlexItem) {
3942
margin: 0;
@@ -112,4 +115,10 @@
112115
.span {
113116
display: inline;
114117
}
118+
119+
.redisStack {
120+
width: 20px;
121+
height: 20px;
122+
margin-right: 16px;
123+
}
115124
}

0 commit comments

Comments
 (0)