Skip to content

Commit 65973cb

Browse files
committed
RI-6280 added rdi telemetry, new button style to insert template btn
1 parent acf0bc8 commit 65973cb

File tree

12 files changed

+188
-22
lines changed

12 files changed

+188
-22
lines changed

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

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@ import { BuildType } from 'uiSrc/constants/env'
44
import { EXTERNAL_LINKS } from 'uiSrc/constants/links'
55
import { appInfoSelector } from 'uiSrc/slices/app/info'
66
import { cleanup, mockedStore, render, screen, fireEvent } from 'uiSrc/utils/test-utils'
7+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
78

89
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
10+
import { appContextSelector } from 'uiSrc/slices/app/context'
911
import NavigationMenu from './NavigationMenu'
1012

13+
jest.mock('uiSrc/telemetry', () => ({
14+
...jest.requireActual('uiSrc/telemetry'),
15+
sendEventTelemetry: jest.fn(),
16+
}))
17+
1118
let store: typeof mockedStore
1219
beforeEach(() => {
1320
cleanup()
@@ -17,6 +24,13 @@ beforeEach(() => {
1724

1825
const mockAppInfoSelector = jest.requireActual('uiSrc/slices/app/info')
1926

27+
jest.mock('uiSrc/slices/app/context', () => ({
28+
...jest.requireActual('uiSrc/slices/app/context'),
29+
appContextSelector: jest.fn().mockReturnValue({
30+
workspace: 'database',
31+
}),
32+
}))
33+
2034
jest.mock('uiSrc/slices/app/info', () => ({
2135
...jest.requireActual('uiSrc/slices/app/info'),
2236
appInfoSelector: jest.fn().mockReturnValue({
@@ -31,6 +45,13 @@ jest.mock('uiSrc/slices/instances/instances', () => ({
3145
}),
3246
}))
3347

48+
jest.mock('uiSrc/slices/rdi/instances', () => ({
49+
...jest.requireActual('uiSrc/slices/rdi/instances'),
50+
connectedInstanceSelector: jest.fn().mockReturnValue({
51+
id: 'mockRdiId',
52+
}),
53+
}))
54+
3455
jest.mock('uiSrc/slices/app/features', () => ({
3556
...jest.requireActual('uiSrc/slices/app/features'),
3657
appFeatureFlagsFeaturesSelector: jest.fn().mockReturnValue({
@@ -157,4 +178,47 @@ describe('NavigationMenu', () => {
157178
expect(githubBtn?.getAttribute('href')).toEqual(EXTERNAL_LINKS.githubRepo)
158179
})
159180
})
181+
182+
it('should render private routes with connectedRdiInstanceId', () => {
183+
(appContextSelector as jest.Mock).mockImplementation(() => ({
184+
...appContextSelector,
185+
workspace: 'redisDataIntegration'
186+
}))
187+
188+
render(<NavigationMenu />)
189+
190+
expect(screen.getByTestId('pipeline-status-page-btn')).toBeTruthy()
191+
expect(screen.getByTestId('pipeline-management-page-btn')).toBeTruthy()
192+
})
193+
194+
it('should call proper telemetry event after click on rdi button', () => {
195+
(appContextSelector as jest.Mock).mockImplementation(() => ({
196+
...appContextSelector,
197+
workspace: 'redisDataIntegration'
198+
}))
199+
const sendEventTelemetryMock = jest.fn();
200+
(sendEventTelemetry as jest.Mock).mockImplementation(() => sendEventTelemetryMock)
201+
202+
render(<NavigationMenu />)
203+
204+
fireEvent.click(screen.getByTestId('pipeline-status-page-btn'))
205+
206+
expect(sendEventTelemetry).toBeCalledWith({
207+
event: TelemetryEvent.OPEN_RDI_CLICKED,
208+
eventData: {
209+
rdiId: 'mockRdiId',
210+
source: 'button',
211+
}
212+
})
213+
214+
fireEvent.click(screen.getByTestId('pipeline-management-page-btn'))
215+
216+
expect(sendEventTelemetry).toBeCalledWith({
217+
event: TelemetryEvent.OPEN_RDI_CLICKED,
218+
eventData: {
219+
rdiId: 'mockRdiId',
220+
source: 'button',
221+
}
222+
})
223+
})
160224
})

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { FeatureFlagComponent } from 'uiSrc/components'
4343

4444
import { appContextSelector } from 'uiSrc/slices/app/context'
4545
import { AppWorkspace } from 'uiSrc/slices/interfaces'
46+
import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry'
4647
import HelpMenu from './components/help-menu/HelpMenu'
4748
import NotificationMenu from './components/notifications-center'
4849

@@ -177,7 +178,16 @@ const NavigationMenu = () => {
177178
tooltipText: 'Pipeline Status',
178179
pageName: PageNames.rdiStatistics,
179180
ariaLabel: 'Pipeline Status page button',
180-
onClick: () => handleGoPage(Pages.rdiStatistics(connectedRdiInstanceId)),
181+
onClick: () => {
182+
sendEventTelemetry({
183+
event: TelemetryEvent.OPEN_RDI_CLICKED,
184+
eventData: {
185+
rdiId: connectedRdiInstanceId,
186+
source: 'button',
187+
}
188+
})
189+
handleGoPage(Pages.rdiStatistics(connectedRdiInstanceId))
190+
},
181191
dataTestId: 'pipeline-status-page-btn',
182192
isActivePage: activePage === `/${PageNames.rdiStatistics}`,
183193
getClassName() {
@@ -191,7 +201,16 @@ const NavigationMenu = () => {
191201
tooltipText: 'Pipeline Management',
192202
pageName: PageNames.rdiPipelineManagement,
193203
ariaLabel: 'Pipeline Management page button',
194-
onClick: () => handleGoPage(Pages.rdiPipelineManagement(connectedRdiInstanceId)),
204+
onClick: () => {
205+
sendEventTelemetry({
206+
event: TelemetryEvent.OPEN_RDI_CLICKED,
207+
eventData: {
208+
rdiId: connectedRdiInstanceId,
209+
source: 'button',
210+
}
211+
})
212+
handleGoPage(Pages.rdiPipelineManagement(connectedRdiInstanceId))
213+
},
195214
dataTestId: 'pipeline-management-page-btn',
196215
isActivePage: isPipelineManagementPath(),
197216
getClassName() {

redisinsight/ui/src/pages/rdi/home/RdiPage.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ describe('RdiPage', () => {
250250

251251
expect(createInstanceAction).toBeCalledWith(
252252
{ name: 'name', url: 'url', username: 'username', password: 'password' },
253+
expect.any(Function),
253254
expect.any(Function)
254255
)
255256
})

redisinsight/ui/src/pages/rdi/home/RdiPage.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
} from 'uiSrc/telemetry'
1919
import HomePageTemplate from 'uiSrc/templates/home-page-template'
2020
import { setTitle } from 'uiSrc/utils'
21+
import { Rdi as RdiInstanceResponse } from 'apiSrc/modules/rdi/models/rdi'
2122
import EmptyMessage from './empty-message/EmptyMessage'
2223
import ConnectionForm from './connection-form/ConnectionForm'
2324
import RdiHeader from './header/RdiHeader'
@@ -62,7 +63,26 @@ const RdiPage = () => {
6263
if (editInstance) {
6364
dispatch(editInstanceAction(editInstance.id, instance, onSuccess))
6465
} else {
65-
dispatch(createInstanceAction({ ...instance }, onSuccess))
66+
dispatch(createInstanceAction(
67+
{ ...instance },
68+
(data: RdiInstanceResponse) => {
69+
sendEventTelemetry({
70+
event: TelemetryEvent.RDI_ENDPOINT_ADDED,
71+
eventData: {
72+
rdiId: data.id,
73+
}
74+
})
75+
onSuccess()
76+
},
77+
(error) => {
78+
sendEventTelemetry({
79+
event: TelemetryEvent.RDI_ENDPOINT_ADD_FAILED,
80+
eventData: {
81+
error,
82+
}
83+
})
84+
}
85+
))
6686
}
6787

6888
sendEventTelemetry({

redisinsight/ui/src/pages/rdi/pipeline-management/components/template-button/TemplateButton.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ const TemplateButton = ({ setFieldValue, value }: TemplateButtonProps) => {
4848
<EuiButton
4949
fill
5050
size="s"
51-
color="secondary"
5251
className={styles.btn}
5352
aria-label="Insert template"
5453
isLoading={loading}
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
.btn {
22
display: flex;
33
align-items: center;
4-
color: var(--recommendationsCountBgColor) !important;
5-
background-color: var(--tableRowSelectedColor) !important;
4+
background-color: var(--insightsTriggerBgColor) !important;
65
border-radius: 4px;
76
border-color: var(--tableRowSelectedColor) !important;
8-
9-
> span {
10-
color: var(--recommendationsCountBgColor) !important;
11-
}
127
}

redisinsight/ui/src/pages/rdi/pipeline-management/components/template-popover/TemplatePopover.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ const TemplatePopover = (props: Props) => {
4747
<EuiButton
4848
fill
4949
size="s"
50-
color="secondary"
5150
className={styles.btn}
5251
aria-label="Insert template"
5352
disabled={loading}

redisinsight/ui/src/pages/rdi/pipeline-management/components/template-popover/styles.module.scss

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,8 @@
1010
.btn {
1111
display: flex;
1212
align-items: center;
13-
color: var(--recommendationsCountBgColor) !important;
14-
background-color: var(--tableRowSelectedColor) !important;
13+
background-color: var(--insightsTriggerBgColor) !important;
1514
border-radius: 4px;
1615
border-color: var(--tableRowSelectedColor) !important;
17-
18-
> span {
19-
color: var(--recommendationsCountBgColor) !important;
20-
}
2116
}
2217
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ export interface RdiInstance extends RdiInstanceResponse {
213213
error: string
214214
}
215215

216+
export interface IErrorData {
217+
message: string
218+
statusCode: number
219+
error: string
220+
errorCode?: number
221+
errors?: string[]
222+
}
223+
216224
export interface InitialStateRdiInstances {
217225
loading: boolean
218226
error: string

redisinsight/ui/src/slices/rdi/instances.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import { AxiosError } from 'axios'
55
import { ApiEndpoints } from 'uiSrc/constants'
66
import { apiService } from 'uiSrc/services'
77
import successMessages from 'uiSrc/components/notifications/success-messages'
8-
import { getApiErrorMessage, isStatusSuccessful, Nullable } from 'uiSrc/utils'
8+
import { getApiErrorMessage, isStatusSuccessful, Maybe, Nullable } from 'uiSrc/utils'
99
import { Rdi as RdiInstanceResponse } from 'apiSrc/modules/rdi/models/rdi'
1010

1111
import { AppDispatch, RootState } from '../store'
1212
import { addErrorNotification, addMessageNotification } from '../app/notifications'
13-
import { InitialStateRdiInstances, RdiInstance } from '../interfaces/rdi'
13+
import { IErrorData, InitialStateRdiInstances, RdiInstance } from '../interfaces/rdi'
1414

1515
export const initialState: InitialStateRdiInstances = {
1616
loading: true,
@@ -184,7 +184,11 @@ export function fetchInstancesAction(onSuccess?: (data: RdiInstance[]) => void)
184184
}
185185

186186
// Asynchronous thunk action
187-
export function createInstanceAction(payload: Partial<RdiInstance>, onSuccess?: (data: RdiInstanceResponse) => void) {
187+
export function createInstanceAction(
188+
payload: Partial<RdiInstance>,
189+
onSuccess?: (data: RdiInstanceResponse) => void,
190+
onFail?: (error: Maybe<string | number>) => void,
191+
) {
188192
return async (dispatch: AppDispatch) => {
189193
dispatch(defaultInstanceChanging())
190194

@@ -202,6 +206,8 @@ export function createInstanceAction(payload: Partial<RdiInstance>, onSuccess?:
202206
const error = _err as AxiosError
203207
const errorMessage = getApiErrorMessage(error)
204208
dispatch(defaultInstanceChangingFailure(errorMessage))
209+
const errorData = error?.response?.data as IErrorData
210+
onFail?.(errorData?.errorCode || errorData?.error)
205211
dispatch(addErrorNotification(error))
206212
}
207213
}

0 commit comments

Comments
 (0)