From d017c3194e43adfe5c53e6d9778895347c41399d Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 16 Feb 2021 14:36:05 -0500 Subject: [PATCH] feat: Show effort estimation if the backend provides it (#357) AA-614 --- .../__factories__/courseBlocks.factory.js | 2 + .../data/__snapshots__/redux.test.js.snap | 6 ++ src/course-home/data/api.js | 6 ++ src/course-home/outline-tab/Section.jsx | 6 +- src/course-home/outline-tab/SequenceLink.jsx | 12 ++-- .../sequence-navigation/UnitNavigation.jsx | 14 +++- .../UnitNavigationEffortEstimate.jsx | 66 +++++++++++++++++++ src/courseware/data/api.js | 8 ++- src/shared/effort-estimate/EffortEstimate.jsx | 62 +++++++++++++++++ src/shared/effort-estimate/index.js | 3 + 10 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 src/courseware/course/sequence/sequence-navigation/UnitNavigationEffortEstimate.jsx create mode 100644 src/shared/effort-estimate/EffortEstimate.jsx create mode 100644 src/shared/effort-estimate/index.js diff --git a/src/course-home/data/__factories__/courseBlocks.factory.js b/src/course-home/data/__factories__/courseBlocks.factory.js index a31a4090..56041725 100644 --- a/src/course-home/data/__factories__/courseBlocks.factory.js +++ b/src/course-home/data/__factories__/courseBlocks.factory.js @@ -65,6 +65,8 @@ export default function buildSimpleCourseBlocks(courseId, title, options = {}) { type: 'chapter', display_name: 'Title of Section', complete: options.complete || false, + effort_time: 15, + effort_activities: 2, resume_block: options.resumeBlock || false, children: sequenceBlock.map(block => block.id), }, diff --git a/src/course-home/data/__snapshots__/redux.test.js.snap b/src/course-home/data/__snapshots__/redux.test.js.snap index 585552c4..e837efef 100644 --- a/src/course-home/data/__snapshots__/redux.test.js.snap +++ b/src/course-home/data/__snapshots__/redux.test.js.snap @@ -353,6 +353,8 @@ Object { "courseBlocks": Object { "courses": Object { "block-v1:edX+DemoX+Demo_Course+type@course+block@bcdabcdabcdabcdabcdabcdabcdabcd3": Object { + "effortActivities": undefined, + "effortTime": undefined, "id": "course-v1:edX+DemoX+Demo_Course_1", "sectionIds": Array [ "block-v1:edX+DemoX+Demo_Course+type@chapter+block@bcdabcdabcdabcdabcdabcdabcdabcd2", @@ -364,6 +366,8 @@ Object { "block-v1:edX+DemoX+Demo_Course+type@chapter+block@bcdabcdabcdabcdabcdabcdabcdabcd2": Object { "complete": false, "courseId": "course-v1:edX+DemoX+Demo_Course_1", + "effortActivities": 2, + "effortTime": 15, "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@bcdabcdabcdabcdabcdabcdabcdabcd2", "resumeBlock": false, "sequenceIds": Array [ @@ -377,6 +381,8 @@ Object { "complete": false, "description": null, "due": null, + "effortActivities": undefined, + "effortTime": undefined, "icon": null, "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@bcdabcdabcdabcdabcdabcdabcdabcd1", "sectionId": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@bcdabcdabcdabcdabcdabcdabcdabcd2", diff --git a/src/course-home/data/api.js b/src/course-home/data/api.js index 366fdfd5..3f265f6c 100644 --- a/src/course-home/data/api.js +++ b/src/course-home/data/api.js @@ -26,6 +26,8 @@ export function normalizeOutlineBlocks(courseId, blocks) { switch (block.type) { case 'course': models.courses[block.id] = { + effortActivities: block.effort_activities, + effortTime: block.effort_time, id: courseId, title: block.display_name, sectionIds: block.children || [], @@ -35,6 +37,8 @@ export function normalizeOutlineBlocks(courseId, blocks) { case 'chapter': models.sections[block.id] = { complete: block.complete, + effortActivities: block.effort_activities, + effortTime: block.effort_time, id: block.id, title: block.display_name, resumeBlock: block.resume_block, @@ -47,6 +51,8 @@ export function normalizeOutlineBlocks(courseId, blocks) { complete: block.complete, description: block.description, due: block.due, + effortActivities: block.effort_activities, + effortTime: block.effort_time, icon: block.icon, id: block.id, showLink: !!block.lms_web_url, // we reconstruct the url ourselves as an MFE-internal diff --git a/src/course-home/outline-tab/Section.jsx b/src/course-home/outline-tab/Section.jsx index cf06eecc..b76126f6 100644 --- a/src/course-home/outline-tab/Section.jsx +++ b/src/course-home/outline-tab/Section.jsx @@ -5,8 +5,11 @@ import { Collapsible, IconButton } from '@edx/paragon'; import { faCheckCircle as fasCheckCircle, faMinus, faPlus } from '@fortawesome/free-solid-svg-icons'; import { faCheckCircle as farCheckCircle } from '@fortawesome/free-regular-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +import EffortEstimate from '../../shared/effort-estimate'; import SequenceLink from './SequenceLink'; import { useModel } from '../../generic/model-store'; + import genericMessages from '../../generic/messages'; import messages from './messages'; @@ -60,10 +63,11 @@ function Section({ )}
- {title} + {title} , {intl.formatMessage(complete ? messages.completedSection : messages.incompleteSection)} +
); diff --git a/src/course-home/outline-tab/SequenceLink.jsx b/src/course-home/outline-tab/SequenceLink.jsx index d903699f..530d278a 100644 --- a/src/course-home/outline-tab/SequenceLink.jsx +++ b/src/course-home/outline-tab/SequenceLink.jsx @@ -12,6 +12,7 @@ import { faCheckCircle as fasCheckCircle } from '@fortawesome/free-solid-svg-ico import { faCheckCircle as farCheckCircle } from '@fortawesome/free-regular-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import EffortEstimate from '../../shared/effort-estimate'; import { useModel } from '../../generic/model-store'; import messages from './messages'; @@ -62,10 +63,13 @@ function SequenceLink({ /> )} -
{displayTitle}
- - , {intl.formatMessage(complete ? messages.completedAssignment : messages.incompleteAssignment)} - +
+ {displayTitle} + + , {intl.formatMessage(complete ? messages.completedAssignment : messages.incompleteAssignment)} + + +
{due && (
diff --git a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx index d86350f5..26610f9e 100644 --- a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx +++ b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx @@ -8,6 +8,7 @@ import { useSelector } from 'react-redux'; import { getCourseExitNavigation } from '../../course-exit'; +import UnitNavigationEffortEstimate from './UnitNavigationEffortEstimate'; import { useSequenceNavigationMetadata } from './hooks'; import messages from './messages'; @@ -28,8 +29,15 @@ function UnitNavigation({ const buttonText = (isLastUnit && exitText) ? exitText : intl.formatMessage(messages.nextButton); const disabled = isLastUnit && !exitActive; return ( - ); @@ -39,7 +47,7 @@ function UnitNavigation({