Skip to content

Commit cf1d201

Browse files
committed
Merge branch 'feature/RI-4186-Upload_custom_tutorials' into fe/feature/I-4181_to-tutorial-button
2 parents 1205650 + c6f920e commit cf1d201

File tree

19 files changed

+516
-286
lines changed

19 files changed

+516
-286
lines changed

.circleci/config.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,22 @@ jobs:
698698
- run:
699699
name: Build Docker image (API + UI)
700700
command: |
701-
docker build --build-arg NODE_ENV=<< parameters.env >> --build-arg SERVER_TLS_CERT="$SERVER_TLS_CERT" --build-arg SERVER_TLS_KEY="$SERVER_TLS_KEY" -t riv2:latest .
701+
TELEMETRY=$SEGMENT_WRITE_KEY_DEV
702+
703+
if [ << parameters.env >> == 'production' ]; then
704+
TELEMETRY=$SEGMENT_WRITE_KEY
705+
fi
706+
707+
if [ << parameters.env >> == 'staging' ]; then
708+
TELEMETRY=$SEGMENT_WRITE_KEY_STAGE
709+
fi
710+
711+
docker build --build-arg NODE_ENV=<< parameters.env >> \
712+
--build-arg SERVER_TLS_CERT="$SERVER_TLS_CERT" \
713+
--build-arg SERVER_TLS_KEY="$SERVER_TLS_KEY" \
714+
--build-arg SEGMENT_WRITE_KEY="$TELEMETRY" \
715+
-t riv2:latest .
716+
702717
mkdir -p docker-release
703718
docker image save -o docker-release/docker.tar riv2
704719
- persist_to_workspace:

Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ COPY redisinsight ./redisinsight
1313
RUN yarn --cwd redisinsight/api
1414
ARG SERVER_TLS_CERT
1515
ARG SERVER_TLS_KEY
16+
ARG SEGMENT_WRITE_KEY
1617
ENV SERVER_TLS_CERT=${SERVER_TLS_CERT}
1718
ENV SERVER_TLS_KEY=${SERVER_TLS_KEY}
19+
ENV SEGMENT_WRITE_KEY=${SEGMENT_WRITE_KEY}
1820
RUN yarn build:web
1921
RUN yarn build:statics
2022

@@ -61,8 +63,10 @@ RUN dbus-uuidgen > /var/lib/dbus/machine-id
6163
ARG NODE_ENV=production
6264
ARG SERVER_TLS_CERT
6365
ARG SERVER_TLS_KEY
66+
ARG SEGMENT_WRITE_KEY
6467
ENV SERVER_TLS_CERT=${SERVER_TLS_CERT}
6568
ENV SERVER_TLS_KEY=${SERVER_TLS_KEY}
69+
ENV SEGMENT_WRITE_KEY=${SEGMENT_WRITE_KEY}
6670
ENV NODE_ENV=${NODE_ENV}
6771
ENV SERVER_STATIC_CONTENT=true
6872
ENV BUILD_TYPE='DOCKER_ON_PREMISE'
Lines changed: 8 additions & 0 deletions
Loading
Lines changed: 10 additions & 0 deletions
Loading

redisinsight/ui/src/components/navigation-menu/NavigationMenu.tsx

Lines changed: 3 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@ import React, { useEffect, useState } from 'react'
33
import { useHistory, useLocation } from 'react-router-dom'
44
import cx from 'classnames'
55
import { last } from 'lodash'
6-
import { useDispatch, useSelector } from 'react-redux'
6+
import { useSelector } from 'react-redux'
77
import {
88
EuiButtonIcon,
9-
EuiFlexGroup,
10-
EuiFlexItem,
119
EuiIcon,
1210
EuiLink,
1311
EuiPageSideBar,
14-
EuiPopover,
15-
EuiSpacer,
16-
EuiText,
17-
EuiTitle,
1812
EuiToolTip
1913
} from '@elastic/eui'
2014
import HighlightedFeature from 'uiSrc/components/hightlighted-feature/HighlightedFeature'
@@ -26,10 +20,7 @@ import { getRouterLinkProps } from 'uiSrc/services'
2620
import { appFeaturePagesHighlightingSelector } from 'uiSrc/slices/app/features'
2721
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
2822
import {
29-
appElectronInfoSelector,
3023
appInfoSelector,
31-
setReleaseNotesViewed,
32-
setShortcutsFlyoutState
3324
} from 'uiSrc/slices/app/info'
3425
import LogoSVG from 'uiSrc/assets/img/logo.svg'
3526
import SettingsSVG from 'uiSrc/assets/img/sidebar/settings.svg'
@@ -48,6 +39,7 @@ import { BuildType } from 'uiSrc/constants/env'
4839
import { renderOnboardingTourWithChild } from 'uiSrc/utils/onboarding'
4940
import { ONBOARDING_FEATURES } from 'uiSrc/components/onboarding-features'
5041

42+
import HelpMenu from './components/help-menu/HelpMenu'
5143
import NotificationMenu from './components/notifications-center'
5244

5345
import styles from './styles.module.scss'
@@ -72,13 +64,10 @@ interface INavigations {
7264
const NavigationMenu = () => {
7365
const history = useHistory()
7466
const location = useLocation()
75-
const dispatch = useDispatch()
7667

7768
const [activePage, setActivePage] = useState(Pages.home)
78-
const [isHelpMenuActive, setIsHelpMenuActive] = useState(false)
7969

8070
const { id: connectedInstanceId = '' } = useSelector(connectedInstanceSelector)
81-
const { isReleaseNotesViewed } = useSelector(appElectronInfoSelector)
8271
const { server } = useSelector(appInfoSelector)
8372
const highlightedPages = useSelector(appFeaturePagesHighlightingSelector)
8473

@@ -88,11 +77,6 @@ const NavigationMenu = () => {
8877

8978
const handleGoPage = (page: string) => history.push(page)
9079

91-
const onKeyboardShortcutClick = () => {
92-
setIsHelpMenuActive(false)
93-
dispatch(setShortcutsFlyoutState(true))
94-
}
95-
9680
const isAnalyticsPath = (activePage: string) => !!ANALYTICS_ROUTES.find(
9781
({ path }) => (`/${last(path.split('/'))}` === activePage)
9882
)
@@ -180,106 +164,6 @@ const NavigationMenu = () => {
180164
},
181165
]
182166

183-
const onClickReleaseNotes = async () => {
184-
if (isReleaseNotesViewed === false) {
185-
dispatch(setReleaseNotesViewed(true))
186-
}
187-
}
188-
189-
const HelpMenuButton = () => (
190-
<EuiButtonIcon
191-
className={
192-
cx(styles.navigationButton, { [styles.navigationButtonNotified]: isReleaseNotesViewed === false })
193-
}
194-
iconType="questionInCircle"
195-
iconSize="l"
196-
aria-label="Help Menu"
197-
onClick={() => setIsHelpMenuActive((value) => !value)}
198-
data-testid="help-menu-button"
199-
/>
200-
)
201-
202-
const HelpMenu = () => (
203-
<EuiPopover
204-
anchorPosition="rightUp"
205-
isOpen={isHelpMenuActive}
206-
anchorClassName={styles.unsupportedInfo}
207-
panelClassName={cx('euiToolTip', 'popoverLikeTooltip', styles.popoverWrapper)}
208-
closePopover={() => setIsHelpMenuActive(false)}
209-
button={(
210-
<>
211-
{!isHelpMenuActive && (
212-
<EuiToolTip content="Help" position="right" key="help-menu">
213-
{HelpMenuButton()}
214-
</EuiToolTip>
215-
)}
216-
217-
{isHelpMenuActive && HelpMenuButton()}
218-
</>
219-
)}
220-
>
221-
<div className={styles.popover} data-testid="help-center">
222-
<EuiTitle size="xs">
223-
<span>Help Center</span>
224-
</EuiTitle>
225-
<EuiSpacer size="l" />
226-
<EuiFlexGroup className={styles.helpMenuItems} responsive={false}>
227-
<EuiFlexItem className={styles.helpMenuItem}>
228-
<EuiLink
229-
external={false}
230-
className={styles.helpMenuItemLink}
231-
href={EXTERNAL_LINKS.githubIssues}
232-
target="_blank"
233-
data-testid="submit-bug-btn"
234-
>
235-
<EuiIcon type="flag" size="xl" />
236-
<EuiSpacer size="s" />
237-
<EuiText size="xs" textAlign="center" className={styles.helpMenuText}>
238-
Submit a Bug or Idea
239-
</EuiText>
240-
</EuiLink>
241-
</EuiFlexItem>
242-
243-
<EuiFlexItem
244-
className={styles.helpMenuItem}
245-
onClick={() => onKeyboardShortcutClick()}
246-
data-testid="shortcuts-btn"
247-
>
248-
<div className={styles.helpMenuItemLink}>
249-
<EuiIcon type="keyboardShortcut" size="xl" />
250-
<EuiSpacer size="s" />
251-
<EuiText
252-
size="xs"
253-
textAlign="center"
254-
className={styles.helpMenuText}
255-
>
256-
Keyboard Shortcuts
257-
</EuiText>
258-
</div>
259-
</EuiFlexItem>
260-
261-
<EuiFlexItem className={styles.helpMenuItem}>
262-
<EuiLink
263-
external={false}
264-
className={styles.helpMenuItemLink}
265-
onClick={onClickReleaseNotes}
266-
href={EXTERNAL_LINKS.releaseNotes}
267-
target="_blank"
268-
data-testid="release-notes-btn"
269-
>
270-
<div className={cx({ [styles.helpMenuItemNotified]: isReleaseNotesViewed === false })}>
271-
<EuiIcon type="package" size="xl" />
272-
</div>
273-
<EuiSpacer size="s" />
274-
<EuiText size="xs" textAlign="center" className={styles.helpMenuText}>Release Notes</EuiText>
275-
</EuiLink>
276-
</EuiFlexItem>
277-
278-
</EuiFlexGroup>
279-
</div>
280-
</EuiPopover>
281-
)
282-
283167
return (
284168
<EuiPageSideBar aria-label="Main navigation" className={cx(styles.navigation, 'eui-yScroll')}>
285169
<div className={styles.container}>
@@ -325,7 +209,7 @@ const NavigationMenu = () => {
325209
</div>
326210
<div className={styles.bottomContainer}>
327211
<NotificationMenu />
328-
{HelpMenu()}
212+
<HelpMenu />
329213
{publicRoutes.map((nav) => (
330214
<HighlightedFeature
331215
key={nav.tooltipText}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import React from 'react'
2+
import { cloneDeep } from 'lodash'
3+
import { render, screen, fireEvent, mockedStore, cleanup } from 'uiSrc/utils/test-utils'
4+
import { setOnboarding } from 'uiSrc/slices/app/features'
5+
6+
import { ONBOARDING_FEATURES } from 'uiSrc/components/onboarding-features'
7+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
8+
import { setReleaseNotesViewed, setShortcutsFlyoutState } from 'uiSrc/slices/app/info'
9+
10+
import HelpMenu from './HelpMenu'
11+
12+
jest.mock('uiSrc/telemetry', () => ({
13+
...jest.requireActual('uiSrc/telemetry'),
14+
sendEventTelemetry: jest.fn(),
15+
}))
16+
17+
jest.mock('uiSrc/slices/app/info', () => ({
18+
...jest.requireActual('uiSrc/slices/app/info'),
19+
appElectronInfoSelector: jest.fn().mockReturnValue({
20+
isReleaseNotesViewed: false
21+
})
22+
}))
23+
24+
let store: typeof mockedStore
25+
beforeEach(() => {
26+
cleanup()
27+
store = cloneDeep(mockedStore)
28+
store.clearActions()
29+
})
30+
31+
describe('HelpMenu', () => {
32+
it('should render', () => {
33+
expect(render(<HelpMenu />)).toBeTruthy()
34+
})
35+
36+
it('should call proper action after click on keyboard shortcuts', () => {
37+
render(<HelpMenu />)
38+
39+
fireEvent.click(screen.getByTestId('help-menu-button'))
40+
fireEvent.click(screen.getByTestId('shortcuts-btn'))
41+
42+
const expectedActions = [setShortcutsFlyoutState(true)]
43+
expect(store.getActions()).toEqual(expectedActions)
44+
})
45+
46+
it('should call proper action after click on release notes', () => {
47+
render(<HelpMenu />)
48+
49+
fireEvent.click(screen.getByTestId('help-menu-button'))
50+
fireEvent.click(screen.getByTestId('release-notes-btn'))
51+
52+
const expectedActions = [setReleaseNotesViewed(true)]
53+
expect(store.getActions()).toEqual(expectedActions)
54+
})
55+
56+
it('should call proper action after click on reset onboarding', () => {
57+
render(<HelpMenu />)
58+
59+
fireEvent.click(screen.getByTestId('help-menu-button'))
60+
fireEvent.click(screen.getByTestId('reset-onboarding-btn'))
61+
62+
const expectedActions = [setOnboarding({
63+
currentStep: 0,
64+
totalSteps: Object.keys(ONBOARDING_FEATURES || {}).length
65+
})]
66+
expect(store.getActions()).toEqual(expectedActions)
67+
})
68+
69+
it('should call proper telemetry after click reset onboarding', () => {
70+
const sendEventTelemetryMock = jest.fn();
71+
(sendEventTelemetry as jest.Mock).mockImplementation(() => sendEventTelemetryMock)
72+
render(<HelpMenu />)
73+
74+
fireEvent.click(screen.getByTestId('help-menu-button'))
75+
fireEvent.click(screen.getByTestId('reset-onboarding-btn'))
76+
77+
expect(sendEventTelemetry).toBeCalledWith({
78+
event: TelemetryEvent.ONBOARDING_TOUR_TRIGGERED,
79+
eventData: {
80+
databaseId: '-',
81+
}
82+
});
83+
84+
(sendEventTelemetry as jest.Mock).mockRestore()
85+
})
86+
})

0 commit comments

Comments
 (0)