From 02d17aea7102297b8baf0ed4c4514568d02c4f70 Mon Sep 17 00:00:00 2001
From: Taras Lytvynenko <69678257+Inferato@users.noreply.github.com>
Date: Fri, 10 Nov 2023 00:24:20 +0200
Subject: [PATCH 1/3] fix: Course mode is used to show the correct bulk email
options
---
.../bulk-email-tool/BulkEmailTool.jsx | 6 +-
.../bulk-email-form/BulkEmailForm.jsx | 14 ++++-
.../BulkEmailRecipient.jsx | 56 ++++++++++---------
.../bulkEmailFormCourseMode.factory.js | 18 ++++++
.../test/BulkEmailForm.test.jsx | 14 +++--
.../page-container/PageContainer.jsx | 3 +-
6 files changed, 79 insertions(+), 32 deletions(-)
create mode 100644 src/components/bulk-email-tool/bulk-email-form/data/__factories__/bulkEmailFormCourseMode.factory.js
diff --git a/src/components/bulk-email-tool/BulkEmailTool.jsx b/src/components/bulk-email-tool/BulkEmailTool.jsx
index 8db13776..aeb4aa4f 100644
--- a/src/components/bulk-email-tool/BulkEmailTool.jsx
+++ b/src/components/bulk-email-tool/BulkEmailTool.jsx
@@ -33,7 +33,11 @@ export default function BulkEmailTool() {
-
+
diff --git a/src/components/bulk-email-tool/bulk-email-form/BulkEmailForm.jsx b/src/components/bulk-email-tool/bulk-email-form/BulkEmailForm.jsx
index f0bdc316..eb8dc33e 100644
--- a/src/components/bulk-email-tool/bulk-email-form/BulkEmailForm.jsx
+++ b/src/components/bulk-email-tool/bulk-email-form/BulkEmailForm.jsx
@@ -47,7 +47,12 @@ const FORM_ACTIONS = {
};
function BulkEmailForm(props) {
- const { courseId, cohorts, intl } = props;
+ const {
+ courseId,
+ cohorts,
+ courseModes,
+ intl,
+ } = props;
const [{ editor }, dispatch] = useContext(BulkEmailContext);
const [emailFormStatus, setEmailFormStatus] = useState(FORM_SUBMIT_STATES.DEFAULT);
const [emailFormValidation, setEmailFormValidation] = useState({
@@ -272,6 +277,7 @@ function BulkEmailForm(props) {
handleCheckboxes={onRecipientChange}
additionalCohorts={cohorts}
isValid={emailFormValidation.recipients}
+ courseModes={courseModes}
/>
{intl.formatMessage(messages.bulkEmailSubjectLabel)}
@@ -384,6 +390,12 @@ BulkEmailForm.propTypes = {
courseId: PropTypes.string.isRequired,
cohorts: PropTypes.arrayOf(PropTypes.string),
intl: intlShape.isRequired,
+ courseModes: PropTypes.arrayOf(
+ PropTypes.shape({
+ slug: PropTypes.string.isRequired,
+ name: PropTypes.string.isRequired,
+ }),
+ ).isRequired,
};
export default injectIntl(BulkEmailForm);
diff --git a/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx b/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
index 2bafefc9..4241a0bc 100644
--- a/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
+++ b/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
@@ -14,7 +14,12 @@ const DEFAULT_GROUPS = {
};
export default function BulkEmailRecipient(props) {
- const { handleCheckboxes, selectedGroups, additionalCohorts } = props;
+ const {
+ handleCheckboxes,
+ selectedGroups,
+ additionalCohorts,
+ courseModes,
+ } = props;
return (
@@ -50,18 +55,25 @@ export default function BulkEmailRecipient(props) {
description="A selectable choice from a list of potential email recipients"
/>
- group === DEFAULT_GROUPS.ALL_LEARNERS)}
- className="col col-lg-4 col-sm-6 col-12"
- >
-
-
+ {
+ // additional modes
+ courseModes
+ && courseModes.length > 1
+ && courseModes.map((courseMode) => (
+ group === DEFAULT_GROUPS.ALL_LEARNERS)}
+ className="col col-lg-4 col-sm-6 col-12"
+ >
+
+
+ ))
+ }
{
// additional cohorts
additionalCohorts
@@ -80,18 +92,6 @@ export default function BulkEmailRecipient(props) {
))
}
- group === DEFAULT_GROUPS.ALL_LEARNERS)}
- className="col col-lg-4 col-sm-6 col-12"
- >
-
-
{
+ const AuditModeFactory = Factory.define('AuditModeFactory')
+ .attr('slug', 'audit')
+ .attr('name', 'Audit');
+
+ const VerifiedModeFactory = Factory.define('VerifiedModeFactory')
+ .attr('slug', 'verified')
+ .attr('name', 'Verified Certificate');
+
+ return [
+ AuditModeFactory.build(),
+ VerifiedModeFactory.build(),
+ ];
+};
+
+export default courseModeFactory;
diff --git a/src/components/bulk-email-tool/bulk-email-form/test/BulkEmailForm.test.jsx b/src/components/bulk-email-tool/bulk-email-form/test/BulkEmailForm.test.jsx
index b7a29039..2d0dd1c3 100644
--- a/src/components/bulk-email-tool/bulk-email-form/test/BulkEmailForm.test.jsx
+++ b/src/components/bulk-email-tool/bulk-email-form/test/BulkEmailForm.test.jsx
@@ -12,6 +12,7 @@ import * as bulkEmailFormApi from '../data/api';
import { BulkEmailContext, BulkEmailProvider } from '../../bulk-email-context';
import { formatDate } from '../../../../utils/formatDateAndTime';
import cohortFactory from '../data/__factories__/bulkEmailFormCohort.factory';
+import courseModeFactory from '../data/__factories__/bulkEmailFormCourseMode.factory';
jest.mock('../../text-editor/TextEditor');
@@ -20,12 +21,17 @@ const dispatchMock = jest.fn();
const tomorrow = new Date();
tomorrow.setDate(new Date().getDate() + 1);
+const courseMode = courseModeFactory();
function renderBulkEmailForm() {
const { cohorts } = cohortFactory.build();
return (
-
+
);
}
@@ -33,7 +39,7 @@ function renderBulkEmailForm() {
function renderBulkEmailFormContext(value) {
return (
-
+
);
}
@@ -96,8 +102,8 @@ describe('bulk-email-form', () => {
test('Checking "All Learners" disables each learner group', async () => {
render(renderBulkEmailForm());
fireEvent.click(screen.getByRole('checkbox', { name: 'All Learners' }));
- const verifiedLearners = screen.getByRole('checkbox', { name: 'Learners in the verified certificate track' });
- const auditLearners = screen.getByRole('checkbox', { name: 'Learners in the audit track' });
+ const verifiedLearners = screen.getByRole('checkbox', { name: 'Learners in the Verified Certificate Track' });
+ const auditLearners = screen.getByRole('checkbox', { name: 'Learners in the Audit Track' });
const { cohorts } = cohortFactory.build();
cohorts.forEach(cohort => expect(screen.getByRole('checkbox', { name: `Cohort: ${cohort}` })).toBeDisabled());
expect(verifiedLearners).toBeDisabled();
diff --git a/src/components/page-container/PageContainer.jsx b/src/components/page-container/PageContainer.jsx
index 27ff93be..57c0c643 100644
--- a/src/components/page-container/PageContainer.jsx
+++ b/src/components/page-container/PageContainer.jsx
@@ -39,7 +39,7 @@ export default function PageContainer(props) {
}
const {
- org, number, title, tabs, originalUserIsStaff,
+ org, number, title, tabs, originalUserIsStaff, courseModes,
} = metadataResponse;
const { cohorts } = cohortsResponse;
@@ -48,6 +48,7 @@ export default function PageContainer(props) {
number,
title,
originalUserIsStaff,
+ courseModes,
tabs: [...tabs],
cohorts: cohorts.map(({ name }) => name),
});
From 59a02eb22c2008c7a5181998bd4126ea69c3aff4 Mon Sep 17 00:00:00 2001
From: Taras Lytvynenko <69678257+Inferato@users.noreply.github.com>
Date: Thu, 16 Nov 2023 12:04:04 +0200
Subject: [PATCH 2/3] fix: Logical operations moved into a separate variable
---
.../bulk-email-recipient/BulkEmailRecipient.jsx | 4 ++--
.../__factories__/bulkEmailFormCourseMode.factory.js | 9 +++++++++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx b/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
index 4241a0bc..e6dae7bf 100644
--- a/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
+++ b/src/components/bulk-email-tool/bulk-email-form/bulk-email-recipient/BulkEmailRecipient.jsx
@@ -20,6 +20,7 @@ export default function BulkEmailRecipient(props) {
additionalCohorts,
courseModes,
} = props;
+ const isCourseModes = courseModes && courseModes.length > 1;
return (
@@ -57,8 +58,7 @@ export default function BulkEmailRecipient(props) {
{
// additional modes
- courseModes
- && courseModes.length > 1
+ isCourseModes
&& courseModes.map((courseMode) => (
} An array of course mode objects with attributes 'slug' and 'name'.
+ */
const courseModeFactory = () => {
const AuditModeFactory = Factory.define('AuditModeFactory')
.attr('slug', 'audit')
From ea5d6a2ca19f247a2411b092fa0cd4fd48948b75 Mon Sep 17 00:00:00 2001
From: Taras Lytvynenko <69678257+Inferato@users.noreply.github.com>
Date: Thu, 16 Nov 2023 16:48:10 +0200
Subject: [PATCH 3/3] docs: Unnecessary comment deleted
---
.../data/__factories__/bulkEmailFormCourseMode.factory.js | 5 -----
1 file changed, 5 deletions(-)
diff --git a/src/components/bulk-email-tool/bulk-email-form/data/__factories__/bulkEmailFormCourseMode.factory.js b/src/components/bulk-email-tool/bulk-email-form/data/__factories__/bulkEmailFormCourseMode.factory.js
index 14874fa6..c2fae950 100644
--- a/src/components/bulk-email-tool/bulk-email-form/data/__factories__/bulkEmailFormCourseMode.factory.js
+++ b/src/components/bulk-email-tool/bulk-email-form/data/__factories__/bulkEmailFormCourseMode.factory.js
@@ -1,8 +1,3 @@
-/**
- * Creates a factory function for generating course modes.
- *
- * @returns {Object[]} An array of course mode objects generated by different factories.
- */
import { Factory } from 'rosie'; // eslint-disable-line import/no-extraneous-dependencies
/**