+ {intl.formatMessage(messages.header)}
+
+ {intl.formatMessage(messages.description)}
+ {progressLink && (
+ <>
+
+
+ >
+ )}
+
+
+ );
+}
+
+HiddenAfterDue.propTypes = {
+ intl: intlShape.isRequired,
+ courseId: PropTypes.string.isRequired,
+};
+
+export default injectIntl(HiddenAfterDue);
diff --git a/src/courseware/course/sequence/hidden-after-due/index.js b/src/courseware/course/sequence/hidden-after-due/index.js
new file mode 100644
index 00000000..41df7093
--- /dev/null
+++ b/src/courseware/course/sequence/hidden-after-due/index.js
@@ -0,0 +1 @@
+export { default } from './HiddenAfterDue';
diff --git a/src/courseware/course/sequence/hidden-after-due/messages.js b/src/courseware/course/sequence/hidden-after-due/messages.js
new file mode 100644
index 00000000..61706631
--- /dev/null
+++ b/src/courseware/course/sequence/hidden-after-due/messages.js
@@ -0,0 +1,23 @@
+import { defineMessages } from '@edx/frontend-platform/i18n';
+
+const messages = defineMessages({
+ header: {
+ id: 'learn.hiddenAfterDue.header',
+ defaultMessage: 'The due date for this assignment has passed.',
+ },
+ description: {
+ id: 'learn.hiddenAfterDue.description',
+ defaultMessage: 'Because the due date has passed, this assignment is no longer available.',
+ },
+ gradeAvailable: {
+ id: 'learn.hiddenAfterDue.gradeAvailable',
+ defaultMessage: 'If you have completed this assignment, your grade is available on the {progressPage}.',
+ },
+ progressPage: {
+ id: 'learn.hiddenAfterDue.progressPage',
+ defaultMessage: 'progress page',
+ description: 'This is the text for the link embedded in learn.hiddenAfterDue.gradeAvailable',
+ },
+});
+
+export default messages;
diff --git a/src/courseware/data/__factories__/sequenceMetadata.factory.js b/src/courseware/data/__factories__/sequenceMetadata.factory.js
index 3ec46b8e..17bca146 100644
--- a/src/courseware/data/__factories__/sequenceMetadata.factory.js
+++ b/src/courseware/data/__factories__/sequenceMetadata.factory.js
@@ -58,6 +58,7 @@ Factory.define('sequenceMetadata')
save_position: true,
prev_url: null,
is_time_limited: false,
+ is_hidden_after_due: false,
show_completion: true,
banner_text: null,
format: 'Homework',
diff --git a/src/courseware/data/api.js b/src/courseware/data/api.js
index 4e1b10d5..08d757d4 100644
--- a/src/courseware/data/api.js
+++ b/src/courseware/data/api.js
@@ -253,6 +253,7 @@ function normalizeSequenceMetadata(sequence) {
gatedContent: camelCaseObject(sequence.gated_content),
isTimeLimited: sequence.is_time_limited,
isProctored: sequence.is_proctored,
+ isHiddenAfterDue: sequence.is_hidden_after_due,
// Position comes back from the server 1-indexed. Adjust here.
activeUnitIndex: sequence.position ? sequence.position - 1 : 0,
saveUnitPosition: sequence.save_position,
diff --git a/src/courseware/data/pact-tests/lmsPact.test.jsx b/src/courseware/data/pact-tests/lmsPact.test.jsx
index 60f59503..2129c32b 100644
--- a/src/courseware/data/pact-tests/lmsPact.test.jsx
+++ b/src/courseware/data/pact-tests/lmsPact.test.jsx
@@ -331,6 +331,7 @@ describe('Courseware Service', () => {
item_id: string('block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions'),
is_time_limited: boolean(false),
is_proctored: boolean(false),
+ is_hidden_after_due: boolean(false),
position: null,
tag: boolean('sequential'),
banner_text: null,
@@ -367,6 +368,7 @@ describe('Courseware Service', () => {
},
isTimeLimited: false,
isProctored: false,
+ isHiddenAfterDue: false,
activeUnitIndex: 0,
saveUnitPosition: false,
showCompletion: false,
diff --git a/src/pacts/frontend-app-learning-lms.json b/src/pacts/frontend-app-learning-lms.json
index 100a02eb..2a6bc058 100644
--- a/src/pacts/frontend-app-learning-lms.json
+++ b/src/pacts/frontend-app-learning-lms.json
@@ -489,6 +489,7 @@
"item_id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions",
"is_time_limited": false,
"is_proctored": false,
+ "is_hidden_after_due": true,
"position": null,
"tag": "sequential",
"banner_text": null,