Skip to content

Commit cf07355

Browse files
author
Katrina Nguyen
committed
feat: adds more tracking events
1 parent ab50103 commit cf07355

File tree

12 files changed

+142
-57
lines changed

12 files changed

+142
-57
lines changed

src/components/Admin/AdminSearchForm.jsx

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22
import React from 'react';
33
import PropTypes from 'prop-types';
44
import classNames from 'classnames';
5-
import { connect } from 'react-redux';
65

76
import { Form } from '@openedx/paragon';
87
import { Info } from '@openedx/paragon/icons';
98

109
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
10+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1111

1212
import SearchBar from '../SearchBar';
1313
import { formatTimestamp, updateUrl } from '../../utils';
1414
import IconWithTooltip from '../IconWithTooltip';
1515
import { withLocation, withNavigate } from '../../hoc';
1616
import EVENT_NAMES from '../../eventTracking';
17-
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1817

1918
class AdminSearchForm extends React.Component {
2019
componentDidUpdate(prevProps) {
@@ -72,10 +71,10 @@ class AdminSearchForm extends React.Component {
7271
page: 1,
7372
};
7473
updateUrl(navigate, location.pathname, updateParams);
75-
console.log(EVENT_NAMES.LEARNER_PROGRESS_REPORT.FILTER_BY_GROUP_DROPDOWN)
7674
sendEnterpriseTrackEvent(
77-
enterpriseUUID,
75+
this.props.enterpriseId,
7876
EVENT_NAMES.LEARNER_PROGRESS_REPORT.FILTER_BY_GROUP_DROPDOWN,
77+
{ group: event.target.value },
7978
);
8079
}
8180

@@ -89,7 +88,6 @@ class AdminSearchForm extends React.Component {
8988
searchCourseQuery, searchDateQuery, searchQuery, searchBudgetQuery, searchGroupQuery,
9089
},
9190
} = this.props;
92-
9391
const courseTitles = Array.from(new Set(tableData.map(en => en.course_title).sort()));
9492
const courseDates = Array.from(new Set(tableData.map(en => en.course_start_date).sort().reverse()));
9593
const columnWidth = (budgets?.length || groups?.length) ? 'col-md-3' : 'col-md-6';
@@ -313,13 +311,9 @@ AdminSearchForm.propTypes = {
313311
location: PropTypes.shape({
314312
pathname: PropTypes.string,
315313
}),
316-
enterpriseUUID: PropTypes.string,
314+
enterpriseId: PropTypes.string,
317315
// injected
318316
intl: intlShape.isRequired,
319317
};
320318

321-
const mapStateToProps = state => ({
322-
enterpriseUUID: state.portalConfiguration.enterpriseId,
323-
});
324-
325-
export default connect(mapStateToProps)(withLocation(withNavigate(injectIntl(AdminSearchForm))));
319+
export default withLocation(withNavigate(injectIntl(AdminSearchForm)));

src/components/PeopleManagement/CreateGroupModal.jsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import { snakeCaseObject } from '@edx/frontend-platform/utils';
88
import {
99
ActionRow, Button, FullscreenModal, StatefulButton, useToggle,
1010
} from '@openedx/paragon';
11+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
12+
1113
import LmsApiService from '../../data/services/LmsApiService';
1214
import SystemErrorAlertModal from '../learner-credit-management/cards/assignment-allocation-status-modals/SystemErrorAlertModal';
1315
import CreateGroupModalContent from './CreateGroupModalContent';
1416
import { peopleManagementQueryKeys } from './constants';
15-
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1617
import EVENT_NAMES from '../../eventTracking';
1718

1819
const CreateGroupModal = ({
@@ -26,6 +27,7 @@ const CreateGroupModal = ({
2627
const [groupName, setGroupName] = useState('');
2728
const [canCreateGroup, setCanCreateGroup] = useState(false);
2829
const [canInviteMembers, setCanInviteMembers] = useState(false);
30+
const [isCreateGroupFileUpload, setIsCreateGroupFileUpload] = useState(false);
2931
const [isSystemErrorModalOpen, openSystemErrorModal, closeSystemErrorModal] = useToggle(false);
3032
const handleCloseCreateGroupModal = () => {
3133
closeModal();
@@ -40,22 +42,29 @@ const CreateGroupModal = ({
4042
groupName,
4143
};
4244
let groupCreationResponse;
43-
4445
try {
4546
groupCreationResponse = await LmsApiService.createEnterpriseGroup(options);
4647
sendEnterpriseTrackEvent(
4748
enterpriseUUID,
4849
EVENT_NAMES.PEOPLE_MANAGEMENT.CREATE_GROUP_MODAL_BUTTON_SUBMIT,
49-
{ status: 'success'},
50+
{ status: 'success' },
5051
);
52+
53+
if (isCreateGroupFileUpload) {
54+
sendEnterpriseTrackEvent(
55+
enterpriseUUID,
56+
EVENT_NAMES.PEOPLE_MANAGEMENT.GROUP_CREATE_WITH_UPLOAD_CSV,
57+
);
58+
}
5159
} catch (err) {
5260
logError(err);
5361
setCreateButtonState('error');
5462
openSystemErrorModal();
5563
sendEnterpriseTrackEvent(
5664
enterpriseUUID,
5765
EVENT_NAMES.PEOPLE_MANAGEMENT.CREATE_GROUP_MODAL_BUTTON_SUBMIT,
58-
{ status: 'error',
66+
{
67+
status: 'error',
5968
message: err,
6069
},
6170
);
@@ -128,6 +137,7 @@ const CreateGroupModal = ({
128137
onEmailAddressesChange={handleEmailAddressesChange}
129138
isGroupInvite
130139
enterpriseUUID={enterpriseUUID}
140+
setIsCreateGroupFileUpload={setIsCreateGroupFileUpload}
131141
/>
132142
</FullscreenModal>
133143
<SystemErrorAlertModal

src/components/PeopleManagement/CreateGroupModalContent.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { useEnterpriseLearners } from '../learner-credit-management/data';
1818

1919
const CreateGroupModalContent = ({
2020
onEmailAddressesChange,
21+
setIsCreateGroupFileUpload,
2122
onSetGroupName,
2223
isGroupInvite,
2324
enterpriseUUID,
@@ -138,6 +139,7 @@ const CreateGroupModalContent = ({
138139
<FileUpload
139140
memberInviteMetadata={memberInviteMetadata}
140141
setEmailAddressesInputValue={setEmailAddressesInputValue}
142+
setIsCreateGroupFileUpload={setIsCreateGroupFileUpload}
141143
/>
142144
</Col>
143145
<Col>
@@ -161,6 +163,7 @@ CreateGroupModalContent.propTypes = {
161163
onSetGroupName: PropTypes.func,
162164
isGroupInvite: PropTypes.bool,
163165
enterpriseUUID: PropTypes.string.isRequired,
166+
setIsCreateGroupFileUpload: PropTypes.func,
164167
};
165168

166169
export default CreateGroupModalContent;

src/components/PeopleManagement/DownloadCSVButton.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
22
import PropTypes from 'prop-types';
33
import { useIntl } from '@edx/frontend-platform/i18n';
44
import { connect } from 'react-redux';
5+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
56

67
import {
78
Icon, Spinner, StatefulButton, Toast, useToggle,
@@ -10,7 +11,6 @@ import { Download, Check } from '@openedx/paragon/icons';
1011
import { logError } from '@edx/frontend-platform/logging';
1112
import { downloadCsv, getTimeStampedFilename } from '../../utils';
1213
import EVENT_NAMES from '../../eventTracking';
13-
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1414

1515
const csvHeaders = ['Name', 'Email', 'Joined Organization', 'Enrollments'];
1616

@@ -19,7 +19,12 @@ const dataEntryToRow = (entry) => {
1919
return [name, email, joinedOrg, enrollments];
2020
};
2121

22-
const DownloadCsvButton = ({ enterpriseUUID, testId, fetchData, totalCt }) => {
22+
const DownloadCsvButton = ({
23+
enterpriseUUID,
24+
testId,
25+
fetchData,
26+
totalCt,
27+
}) => {
2328
const [buttonState, setButtonState] = useState('pageLoading');
2429
const [isToastOpen, openToast, closeToast] = useToggle(false);
2530
const intl = useIntl();

src/components/PeopleManagement/GroupDetailPage/DownloadCsvIconButton.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import PropTypes from 'prop-types';
33
import { defineMessages, useIntl } from '@edx/frontend-platform/i18n';
44
import { connect } from 'react-redux';
55

6+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
67
import {
78
Icon, IconButtonWithTooltip, Toast, useToggle,
89
} from '@openedx/paragon';
910
import { Download } from '@openedx/paragon/icons';
1011
import { logError } from '@edx/frontend-platform/logging';
1112
import GeneralErrorModal from '../GeneralErrorModal';
1213
import { downloadCsv, getTimeStampedFilename } from '../../../utils';
13-
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1414
import EVENT_NAMES from '../../../eventTracking';
1515

1616
const csvHeaders = ['Name', 'Email', 'Recent action', 'Enrollments'];
@@ -57,15 +57,16 @@ const DownloadCsvIconButton = ({
5757
sendEnterpriseTrackEvent(
5858
enterpriseUUID,
5959
EVENT_NAMES.PEOPLE_MANAGEMENT.DOWNLOAD_GROUP_MEMBERS,
60-
{ status: 'success'}
60+
{ status: 'success' },
6161
);
6262
}).catch((err) => {
6363
logError(err);
6464
openErrorModal();
6565
sendEnterpriseTrackEvent(
6666
enterpriseUUID,
6767
EVENT_NAMES.PEOPLE_MANAGEMENT.DOWNLOAD_GROUP_MEMBERS,
68-
{ status: 'error',
68+
{
69+
status: 'error',
6970
message: err,
7071
},
7172
);
@@ -116,4 +117,4 @@ const mapStateToProps = state => ({
116117
enterpriseUUID: state.portalConfiguration.enterpriseId,
117118
});
118119

119-
export default connect(mapStateToProps)(DownloadCsvIconButton);
120+
export default connect(mapStateToProps)(DownloadCsvIconButton);

src/components/PeopleManagement/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
ActionRow, Button, Skeleton, Toast, useToggle,
88
} from '@openedx/paragon';
99
import { Add } from '@openedx/paragon/icons';
10+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
1011

1112
import Hero from '../Hero';
1213
import { SUBSIDY_TYPES } from '../../data/constants/subsidyTypes';
@@ -16,7 +17,6 @@ import { useAllFlexEnterpriseGroups } from '../learner-credit-management/data';
1617
import ZeroState from './ZeroState';
1718
import GroupCardGrid from './GroupCardGrid';
1819
import PeopleManagementTable from './PeopleManagementTable';
19-
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
2020
import EVENT_NAMES from '../../eventTracking';
2121

2222
const PeopleManagementPage = ({ enterpriseId }) => {
@@ -56,7 +56,7 @@ const PeopleManagementPage = ({ enterpriseId }) => {
5656
enterpriseId,
5757
EVENT_NAMES.PEOPLE_MANAGEMENT.PAGE_VISIT,
5858
);
59-
}, []);
59+
}, [enterpriseId]);
6060

6161
useEffect(() => {
6262
// parameter is for confirmation toast after deleting a group

src/components/PeopleManagement/tests/AddMembersModal.test.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const defaultProps = {
6262
enterpriseUUID,
6363
groupName: 'test-group-name',
6464
groupUuid: TEST_GROUP,
65+
setIsCreateGroupFileUpload: jest.fn(),
6566
};
6667

6768
const mockTabledata = {

src/components/PeopleManagement/tests/DownloadCsvButton.test.jsx

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,25 @@ import React from 'react';
22
import { IntlProvider } from '@edx/frontend-platform/i18n';
33
import { logError } from '@edx/frontend-platform/logging';
44
import { act, render, screen } from '@testing-library/react';
5+
import configureMockStore from 'redux-mock-store';
6+
import thunk from 'redux-thunk';
7+
import { Provider } from 'react-redux';
58

69
import '@testing-library/jest-dom/extend-expect';
710

11+
import { sendEnterpriseTrackEvent } from '@edx/frontend-enterprise-utils';
812
import userEvent from '@testing-library/user-event';
913
import DownloadCsvButton from '../DownloadCSVButton';
1014
import { downloadCsv } from '../../../utils';
15+
import EVENT_NAMES from '../../../eventTracking';
16+
17+
jest.mock('@edx/frontend-enterprise-utils', () => {
18+
const originalModule = jest.requireActual('@edx/frontend-enterprise-utils');
19+
return ({
20+
...originalModule,
21+
sendEnterpriseTrackEvent: jest.fn(),
22+
});
23+
});
1124

1225
jest.mock('file-saver', () => ({
1326
...jest.requireActual('file-saver'),
@@ -51,11 +64,20 @@ const DEFAULT_PROPS = {
5164
fetchData: jest.fn(() => Promise.resolve(mockData)),
5265
testId,
5366
};
67+
const enterpriseId = 'test-enterprise-id';
68+
const mockStore = configureMockStore([thunk]);
69+
const store = mockStore({
70+
portalConfiguration: {
71+
enterpriseId,
72+
},
73+
});
5474

5575
const DownloadCSVButtonWrapper = props => (
56-
<IntlProvider locale="en">
57-
<DownloadCsvButton {...props} />
58-
</IntlProvider>
76+
<Provider store={store}>
77+
<IntlProvider locale="en">
78+
<DownloadCsvButton {...props} />
79+
</IntlProvider>
80+
</Provider>
5981
);
6082

6183
describe('DownloadCSVButton', () => {
@@ -71,7 +93,11 @@ describe('DownloadCSVButton', () => {
7193
// Click the download button.
7294
screen.getByTestId(testId).click();
7395
await flushPromises();
74-
96+
expect(sendEnterpriseTrackEvent).toHaveBeenCalledWith(
97+
enterpriseId,
98+
EVENT_NAMES.PEOPLE_MANAGEMENT.DOWNLOAD_ALL_ORG_MEMBERS,
99+
{ status: 'success' },
100+
);
75101
expect(DEFAULT_PROPS.fetchData).toHaveBeenCalled();
76102
const expectedFileName = '2024-01-20-people-report.csv';
77103
const expectedHeaders = ['Name', 'Email', 'Joined Organization', 'Enrollments'];
@@ -94,5 +120,13 @@ describe('DownloadCSVButton', () => {
94120

95121
expect(DEFAULT_PROPS.fetchData).toHaveBeenCalled();
96122
expect(logError).toHaveBeenCalled();
123+
expect(sendEnterpriseTrackEvent).toHaveBeenCalledWith(
124+
enterpriseId,
125+
EVENT_NAMES.PEOPLE_MANAGEMENT.DOWNLOAD_ALL_ORG_MEMBERS,
126+
{
127+
status: 'error',
128+
message: new Error('Error fetching data'),
129+
},
130+
);
97131
});
98132
});

0 commit comments

Comments
 (0)