diff --git a/src/course-home/CourseDates.jsx b/src/course-home/CourseDates.jsx deleted file mode 100644 index 8a86a3d0..00000000 --- a/src/course-home/CourseDates.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -export default function CourseDates({ - start, - end, - enrollmentStart, - enrollmentEnd, - enrollmentMode, - isEnrolled, -}) { - return ( - - Upcoming Dates - Course Start:{start} - Course End:{end} - Enrollment Start:{enrollmentStart} - Enrollment End:{enrollmentEnd} - Mode:{enrollmentMode} - {isEnrolled ? 'Active Enrollment' : 'Inactive Enrollment'} - - ); -} - -CourseDates.propTypes = { - start: PropTypes.string, - end: PropTypes.string, - enrollmentStart: PropTypes.string, - enrollmentEnd: PropTypes.string, - enrollmentMode: PropTypes.string, - isEnrolled: PropTypes.bool, -}; - -CourseDates.defaultProps = { - start: null, - end: null, - enrollmentStart: null, - enrollmentEnd: null, - enrollmentMode: null, - isEnrolled: false, -}; diff --git a/src/course-home/outline-tab/CourseDates.jsx b/src/course-home/outline-tab/CourseDates.jsx new file mode 100644 index 00000000..b7da2ab0 --- /dev/null +++ b/src/course-home/outline-tab/CourseDates.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useModel } from '../../model-store'; +import DateSummary from './DateSummary'; + +export default function CourseDates({ courseId }) { + const { + datesWidget, + } = useModel('outline', courseId); + return ( + + Upcoming Dates + {datesWidget.courseDateBlocks.map((courseDateBlock) => ( + + ))} + View all course dates + + ); +} + +CourseDates.propTypes = { + courseId: PropTypes.string, +}; + +CourseDates.defaultProps = { + courseId: null, +}; diff --git a/src/course-home/CourseTools.jsx b/src/course-home/outline-tab/CourseTools.jsx similarity index 96% rename from src/course-home/CourseTools.jsx rename to src/course-home/outline-tab/CourseTools.jsx index ac3b5ef9..d870f155 100644 --- a/src/course-home/CourseTools.jsx +++ b/src/course-home/outline-tab/CourseTools.jsx @@ -5,7 +5,7 @@ import { faBookmark, faCertificate, faInfo, faCalendar, faStar, } from '@fortawesome/free-solid-svg-icons'; import { faNewspaper } from '@fortawesome/free-regular-svg-icons'; -import { useModel } from '../model-store'; +import { useModel } from '../../model-store'; export default function CourseTools( diff --git a/src/course-home/outline-tab/DateSummary.jsx b/src/course-home/outline-tab/DateSummary.jsx new file mode 100644 index 00000000..f1c5b8e1 --- /dev/null +++ b/src/course-home/outline-tab/DateSummary.jsx @@ -0,0 +1,62 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faCalendarAlt } from '@fortawesome/free-regular-svg-icons'; +import { FormattedDate } from '@edx/frontend-platform/i18n'; +import React from 'react'; +import PropTypes from 'prop-types'; +import { isLearnerAssignment } from '../../dates-tab/utils'; +import './DateSummary.scss'; + +export default function DateSummary({ + dateBlock, + userTimezone, +}) { + const linkedTitle = dateBlock.link && isLearnerAssignment(dateBlock); + const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {}; + return ( + + + + + + + + + + {linkedTitle + && {dateBlock.title}} + {!linkedTitle + && {dateBlock.title}} + + {dateBlock.description + && {dateBlock.description}} + {!linkedTitle && dateBlock.link + && {dateBlock.linkText}} + + + + ); +} + +DateSummary.propTypes = { + dateBlock: PropTypes.shape({ + date: PropTypes.string.isRequired, + dateType: PropTypes.string, + description: PropTypes.string, + link: PropTypes.string, + linkText: PropTypes.string, + title: PropTypes.string.isRequired, + learnerHasAccess: PropTypes.bool, + }).isRequired, + userTimezone: PropTypes.string, +}; + +DateSummary.defaultProps = { + userTimezone: null, +}; diff --git a/src/course-home/outline-tab/DateSummary.scss b/src/course-home/outline-tab/DateSummary.scss new file mode 100644 index 00000000..17d7a7a8 --- /dev/null +++ b/src/course-home/outline-tab/DateSummary.scss @@ -0,0 +1,8 @@ +.date-summary-text { + margin-left: 2px; + flex-basis: 100%; +} + +.description-link { + margin-left: 1px; +} diff --git a/src/course-home/outline-tab/OutlineTab.jsx b/src/course-home/outline-tab/OutlineTab.jsx index 2be2a3d6..17dd536a 100644 --- a/src/course-home/outline-tab/OutlineTab.jsx +++ b/src/course-home/outline-tab/OutlineTab.jsx @@ -4,9 +4,9 @@ import { Button } from '@edx/paragon'; import { AlertList } from '../../user-messages'; -import CourseDates from '../CourseDates'; -import CourseTools from '../CourseTools'; -import Section from '../Section'; +import CourseDates from './CourseDates'; +import CourseTools from './CourseTools'; +import Section from './Section'; import { useModel } from '../../model-store'; // Note that we import from the component files themselves in the enrollment-alert package. @@ -78,6 +78,7 @@ export default function OutlineTab() { enrollmentEnd={enrollmentEnd} enrollmentMode={enrollmentMode} isEnrolled={isEnrolled} + courseId={courseId} /> diff --git a/src/course-home/Section.jsx b/src/course-home/outline-tab/Section.jsx similarity index 97% rename from src/course-home/Section.jsx rename to src/course-home/outline-tab/Section.jsx index b8626239..2da936cd 100644 --- a/src/course-home/Section.jsx +++ b/src/course-home/outline-tab/Section.jsx @@ -4,7 +4,7 @@ import { Collapsible } from '@edx/paragon'; import { faChevronRight, faChevronDown } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import SequenceLink from './SequenceLink'; -import { useModel } from '../model-store'; +import { useModel } from '../../model-store'; export default function Section({ courseId, title, sequenceIds }) { const { diff --git a/src/course-home/SequenceLink.jsx b/src/course-home/outline-tab/SequenceLink.jsx similarity index 100% rename from src/course-home/SequenceLink.jsx rename to src/course-home/outline-tab/SequenceLink.jsx diff --git a/src/data/api.js b/src/data/api.js index 4e7e7763..922564b8 100644 --- a/src/data/api.js +++ b/src/data/api.js @@ -187,8 +187,10 @@ export async function getOutlineTabData(courseId, version) { } = tabData; const courseBlocks = normalizeBlocks(courseId, data.course_blocks.blocks); const courseTools = camelCaseObject(data.course_tools); - - return { courseTools, courseBlocks }; + const datesWidget = camelCaseObject(data.dates_widget); + return { + courseTools, courseBlocks, datesWidget, + }; } function normalizeSequenceMetadata(sequence) {