Skip to content

Commit e2c9e88

Browse files
Merge branch 'feature/RI-3942_rts_recommendation' of https://github.com/RedisInsight/RedisInsight into feature/RI-3942_rts_recommendation
2 parents 40caef0 + 5197bc2 commit e2c9e88

File tree

3 files changed

+84
-13
lines changed

3 files changed

+84
-13
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: 42 additions & 13 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" />
@@ -52,23 +83,21 @@ const Recommendations = () => {
5283
{renderBadgesLegend()}
5384
</div>
5485
<div className={styles.recommendationsContainer}>
55-
{recommendations.map(({ name }) => {
56-
const { id = '', title = '', content = '', badges = [] } = recommendationsContent[name]
86+
{sortedRecommendations.map(({ name }) => {
87+
const {
88+
id = '',
89+
title = '',
90+
content = '',
91+
badges = [],
92+
redisStack = false
93+
} = recommendationsContent[name]
5794

58-
const buttonContent = (
59-
<EuiFlexGroup className={styles.accordionButton} responsive={false} alignItems="center" justifyContent="spaceBetween">
60-
<EuiFlexItem grow={false}>{title}</EuiFlexItem>
61-
<EuiFlexItem grow={false}>
62-
{renderBadges(badges)}
63-
</EuiFlexItem>
64-
</EuiFlexGroup>
65-
)
6695
return (
6796
<div key={id} className={styles.recommendation}>
6897
<EuiAccordion
6998
id={name}
7099
arrowDisplay="right"
71-
buttonContent={buttonContent}
100+
buttonContent={renderButtonContent(redisStack, title, badges)}
72101
buttonClassName={styles.accordionBtn}
73102
buttonProps={{ 'data-test-subj': `${id}-button` }}
74103
className={styles.accordion}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,10 @@
115115
.span {
116116
display: inline;
117117
}
118+
119+
.redisStack {
120+
width: 20px;
121+
height: 20px;
122+
margin-right: 16px;
123+
}
118124
}

0 commit comments

Comments
 (0)