From 2a72a85efdbca452a7f575c38ceaef5b1df18e11 Mon Sep 17 00:00:00 2001 From: leangseu-edx <83240113+leangseu-edx@users.noreply.github.com> Date: Mon, 7 Nov 2022 15:06:09 -0500 Subject: [PATCH] chore: responsive course card (#64) --- src/containers/CourseCard/CourseCard.scss | 13 ++++- .../__snapshots__/index.test.jsx.snap | 14 ++++++ .../CourseCardActions/ActionButton/hooks.js | 8 ++++ .../ActionButton/hooks.test.js | 21 ++++++++ .../CourseCardActions/ActionButton/index.jsx | 16 +++++++ .../ActionButton/index.test.jsx | 25 ++++++++++ .../CourseCardActions/BeginCourseButton.jsx | 6 +-- .../BeginCourseButton.test.jsx | 1 + .../CourseCardActions/ResumeButton.jsx | 6 +-- .../CourseCardActions/ResumeButton.test.jsx | 1 + .../CourseCardActions/SelectSessionButton.jsx | 6 +-- .../SelectSessionButton.test.jsx | 1 + .../CourseCardActions/UpgradeButton.jsx | 6 +-- .../CourseCardActions/UpgradeButton.test.jsx | 1 + .../CourseCardActions/ViewCourseButton.jsx | 6 +-- .../ViewCourseButton.test.jsx | 6 ++- .../BeginCourseButton.test.jsx.snap | 4 +- .../__snapshots__/ResumeButton.test.jsx.snap | 4 +- .../SelectSessionButton.test.jsx.snap | 12 ++--- .../__snapshots__/UpgradeButton.test.jsx.snap | 12 ++--- .../ViewCourseButton.test.jsx.snap | 8 ++-- .../CourseCardActions/index.test.jsx | 1 + .../components/CourseCardContent.jsx | 20 ++------ .../__snapshots__/index.test.jsx.snap | 2 +- .../components/RelatedProgramsBadge/index.jsx | 2 +- .../CourseCardContent.test.jsx.snap | 26 +++++----- src/containers/Dashboard/DashboardLayout.jsx | 4 -- .../DashboardLayout.test.jsx.snap | 48 ------------------- .../__snapshots__/index.test.jsx.snap | 10 ++-- src/containers/MasqueradeBar/index.jsx | 2 +- src/data/constants/htmlKeys.js | 1 + 31 files changed, 164 insertions(+), 129 deletions(-) create mode 100644 src/containers/CourseCard/components/CourseCardActions/ActionButton/__snapshots__/index.test.jsx.snap create mode 100644 src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.js create mode 100644 src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js create mode 100644 src/containers/CourseCard/components/CourseCardActions/ActionButton/index.jsx create mode 100644 src/containers/CourseCard/components/CourseCardActions/ActionButton/index.test.jsx diff --git a/src/containers/CourseCard/CourseCard.scss b/src/containers/CourseCard/CourseCard.scss index 0c42580..f87c67e 100644 --- a/src/containers/CourseCard/CourseCard.scss +++ b/src/containers/CourseCard/CourseCard.scss @@ -15,8 +15,17 @@ .pgn__card-header-content { margin-top: 1.5rem; } - .pgn__card-footer .pgn__action-row { - white-space: nowrap; + .pgn__card-footer { + flex-wrap: nowrap; + + &.vertical { + flex-direction: column; + } + + .pgn__action-row { + align-self: flex-end; + white-space: nowrap; + } } .course-card-verify-ribbon-container { diff --git a/src/containers/CourseCard/components/CourseCardActions/ActionButton/__snapshots__/index.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/ActionButton/__snapshots__/index.test.jsx.snap new file mode 100644 index 0000000..13ddef0 --- /dev/null +++ b/src/containers/CourseCard/components/CourseCardActions/ActionButton/__snapshots__/index.test.jsx.snap @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ActionButton snapshot is collapsed 1`] = ` + + ); }; BeginCourseButton.propTypes = { diff --git a/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx index efae4e2..2a658be 100644 --- a/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx @@ -11,6 +11,7 @@ jest.mock('data/redux', () => ({ useMasqueradeData: jest.fn(() => ({ isMasquerading: false })), }, })); +jest.mock('./ActionButton', () => 'ActionButton'); let wrapper; const { homeUrl } = hooks.useCardCourseRunData(); diff --git a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx index ea85c56..80c3097 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button } from '@edx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; import { hooks } from 'data/redux'; +import ActionButton from './ActionButton'; import messages from './messages'; export const ResumeButton = ({ cardId }) => { @@ -13,13 +13,13 @@ export const ResumeButton = ({ cardId }) => { const { isMasquerading } = hooks.useMasqueradeData(); const { formatMessage } = useIntl(); return ( - + ); }; ResumeButton.propTypes = { diff --git a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx index c0f57ca..5ca98a8 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx @@ -15,6 +15,7 @@ jest.mock('data/redux', () => ({ useMasqueradeData: jest.fn(() => ({ isMasquerading: false })), }, })); +jest.mock('./ActionButton', () => 'ActionButton'); const { resumeUrl } = hooks.useCardCourseRunData(); diff --git a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.jsx b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.jsx index 2d68f73..bd37f72 100644 --- a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.jsx @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button } from '@edx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; import { hooks } from 'data/redux'; +import ActionButton from './ActionButton'; import messages from './messages'; export const SelectSessionButton = ({ cardId }) => { @@ -14,12 +14,12 @@ export const SelectSessionButton = ({ cardId }) => { const { formatMessage } = useIntl(); const openSessionModal = hooks.useUpdateSelectSessionModalCallback(cardId); return ( - + ); }; SelectSessionButton.propTypes = { diff --git a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx index b591755..646dfde 100644 --- a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx @@ -12,6 +12,7 @@ jest.mock('data/redux', () => ({ useUpdateSelectSessionModalCallback: () => jest.fn().mockName('mockOpenSessionModal'), }, })); +jest.mock('./ActionButton', () => 'ActionButton'); let wrapper; diff --git a/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.jsx b/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.jsx index 28122f8..6d05caa 100644 --- a/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.jsx @@ -1,11 +1,11 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button } from '@edx/paragon'; import { Locked } from '@edx/paragon/icons'; import { useIntl } from '@edx/frontend-platform/i18n'; import { hooks } from 'data/redux'; +import ActionButton from './ActionButton'; import messages from './messages'; export const UpgradeButton = ({ cardId }) => { @@ -15,14 +15,14 @@ export const UpgradeButton = ({ cardId }) => { const { formatMessage } = useIntl(); const isEnabled = (!isMasquerading && canUpgrade); return ( - + ); }; UpgradeButton.propTypes = { diff --git a/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.test.jsx index 8942d1f..5d88fc7 100644 --- a/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/UpgradeButton.test.jsx @@ -11,6 +11,7 @@ jest.mock('data/redux', () => ({ useCardEnrollmentData: jest.fn(() => ({ canUpgrade: true })), }, })); +jest.mock('./ActionButton', () => 'ActionButton'); describe('UpgradeButton', () => { const props = { diff --git a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx index 7703c4e..5f9e3da 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button } from '@edx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; import { hooks } from 'data/redux'; +import ActionButton from './ActionButton'; import messages from './messages'; export const ViewCourseButton = ({ cardId }) => { @@ -12,13 +12,13 @@ export const ViewCourseButton = ({ cardId }) => { const { hasAccess } = hooks.useCardEnrollmentData(cardId); const { formatMessage } = useIntl(); return ( - + ); }; ViewCourseButton.propTypes = { diff --git a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx index d25764d..0f88968 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx @@ -11,20 +11,22 @@ jest.mock('data/redux', () => ({ useCardEntitlementData: jest.fn(), }, })); +jest.mock('./ActionButton', () => 'ActionButton'); let wrapper; -const props = { cardId: 'cardId' }; +const defaultProps = { cardId: 'cardId' }; const homeUrl = 'homeUrl'; const createWrapper = ({ hasAccess = false, isEntitlement = false, isExpired = false, + propsOveride = {}, }) => { hooks.useCardCourseRunData.mockReturnValue({ homeUrl }); hooks.useCardEnrollmentData.mockReturnValueOnce({ hasAccess }); hooks.useCardEntitlementData.mockReturnValueOnce({ isEntitlement, isExpired }); - return shallow(); + return shallow(); }; describe('ViewCourseButton', () => { diff --git a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/BeginCourseButton.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/BeginCourseButton.test.jsx.snap index 33b14b9..aa9aff2 100644 --- a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/BeginCourseButton.test.jsx.snap +++ b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/BeginCourseButton.test.jsx.snap @@ -1,11 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`BeginCourseButton snapshot renders default button when learner has access to the course 1`] = ` - + `; diff --git a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ResumeButton.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ResumeButton.test.jsx.snap index b1687b4..9ea197c 100644 --- a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ResumeButton.test.jsx.snap +++ b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ResumeButton.test.jsx.snap @@ -1,11 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ResumeButton snapshot renders default button when learner has access to the course 1`] = ` - + `; diff --git a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/SelectSessionButton.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/SelectSessionButton.test.jsx.snap index 028a6df..07ec3be 100644 --- a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/SelectSessionButton.test.jsx.snap +++ b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/SelectSessionButton.test.jsx.snap @@ -1,28 +1,28 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SelectSessionButton snapshot renders default button 1`] = ` - + `; exports[`SelectSessionButton snapshot renders disabled button if masquerading 1`] = ` - + `; exports[`SelectSessionButton snapshot renders disabled button when user does not have access to the course 1`] = ` - + `; diff --git a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/UpgradeButton.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/UpgradeButton.test.jsx.snap index 4dce656..0277bc1 100644 --- a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/UpgradeButton.test.jsx.snap +++ b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/UpgradeButton.test.jsx.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`UpgradeButton snapshot can upgrade 1`] = ` - + `; exports[`UpgradeButton snapshot cannot upgrade 1`] = ` - + `; exports[`UpgradeButton snapshot masquerading 1`] = ` - + `; diff --git a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ViewCourseButton.test.jsx.snap b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ViewCourseButton.test.jsx.snap index d137bd9..da92a1f 100644 --- a/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ViewCourseButton.test.jsx.snap +++ b/src/containers/CourseCard/components/CourseCardActions/__snapshots__/ViewCourseButton.test.jsx.snap @@ -1,21 +1,21 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ViewCourseButton learner does not have access to course snapshot 1`] = ` - + `; exports[`ViewCourseButton learner has access to course snapshot 1`] = ` - + `; diff --git a/src/containers/CourseCard/components/CourseCardActions/index.test.jsx b/src/containers/CourseCard/components/CourseCardActions/index.test.jsx index cb45faf..d3574be 100644 --- a/src/containers/CourseCard/components/CourseCardActions/index.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/index.test.jsx @@ -1,6 +1,7 @@ import { shallow } from 'enzyme'; import { hooks } from 'data/redux'; + import CourseCardActions from '.'; jest.mock('data/redux', () => ({ diff --git a/src/containers/CourseCard/components/CourseCardContent.jsx b/src/containers/CourseCard/components/CourseCardContent.jsx index d2e707b..5939ed5 100644 --- a/src/containers/CourseCard/components/CourseCardContent.jsx +++ b/src/containers/CourseCard/components/CourseCardContent.jsx @@ -55,22 +55,10 @@ export const CourseCardContent = ({ cardId, orientation }) => { - {orientation === 'vertical' - ? ( - <> - - - - - - ) : ( - } - > - - - )} + + + + ); diff --git a/src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap b/src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap index 35d4e79..3b56629 100644 --- a/src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap +++ b/src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap @@ -3,7 +3,7 @@ exports[`RelatedProgramsBadge component snapshot: 3 programs 1`] = `