@edx/frontend-app-subscription-learner-dashboard 1.44.1 → 1.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ export default FindCourseBanner;
2
+ declare function FindCourseBanner({ findCourseUrl }: {
3
+ findCourseUrl: any;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ declare namespace FindCourseBanner {
6
+ namespace propTypes {
7
+ let findCourseUrl: PropTypes.Requireable<string>;
8
+ }
9
+ }
10
+ import PropTypes from 'prop-types';
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import PropTypes from 'prop-types';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Button, Card, Col, Row } from '@openedx/paragon';
5
+ import messages from './messages';
6
+ const FindCourseBanner = ({ findCourseUrl }) => {
7
+ const { formatMessage } = useIntl();
8
+ return (_jsx(Card.Status, { variant: "warning", className: "bg-light-200", "data-testid": "find-course-banner", children: _jsxs(Row, { className: "align-items-center mt-1", children: [_jsx(Col, { xs: 12, lg: 8, className: "pe-lg-3", children: _jsx("p", { className: "mb-0 font-weight-semi-bold", children: formatMessage(messages.findCourseBannerText) }) }), _jsx(Col, { xs: 12, sm: 4, className: "d-flex justify-content-end mt-2 mt-lg-0", children: _jsx(Button, { variant: "outline-dark", size: "md", href: findCourseUrl || undefined, "data-testid": "find-course-button", children: formatMessage(messages.findCourseAction) }) })] }) }));
9
+ };
10
+ FindCourseBanner.propTypes = {
11
+ findCourseUrl: PropTypes.string,
12
+ };
13
+ export default FindCourseBanner;
14
+ //# sourceMappingURL=FindCourseBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindCourseBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,gBAAgB,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,OAAO,CACL,KAAC,IAAI,CAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,cAAc,iBAAa,oBAAoB,YACtF,MAAC,GAAG,IAAC,SAAS,EAAC,yBAAyB,aACtC,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,SAAS,YACrC,YAAG,SAAS,EAAC,4BAA4B,YACtC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAC3C,GACA,EACN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,yCAAyC,YACrE,KAAC,MAAM,IACL,OAAO,EAAC,cAAc,EACtB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,aAAa,IAAI,SAAS,iBACpB,oBAAoB,YAE/B,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAClC,GACL,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,aAAa,EAAE,SAAS,CAAC,MAAM;CAChC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, Card, Col, Row } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst FindCourseBanner = ({ findCourseUrl }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200\" data-testid=\"find-course-banner\">\n <Row className=\"align-items-center mt-1\">\n <Col xs={12} lg={8} className=\"pe-lg-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n {formatMessage(messages.findCourseBannerText)}\n </p>\n </Col>\n <Col xs={12} sm={4} className=\"d-flex justify-content-end mt-2 mt-lg-0\">\n <Button\n variant=\"outline-dark\"\n size=\"md\"\n href={findCourseUrl || undefined}\n data-testid=\"find-course-button\"\n >\n {formatMessage(messages.findCourseAction)}\n </Button>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nFindCourseBanner.propTypes = {\n findCourseUrl: PropTypes.string,\n};\n\nexport default FindCourseBanner;\n"]}
@@ -0,0 +1,10 @@
1
+ export default ViewCourseDetailBanner;
2
+ declare function ViewCourseDetailBanner({ viewCourseDetailUrl }: {
3
+ viewCourseDetailUrl: any;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ declare namespace ViewCourseDetailBanner {
6
+ namespace propTypes {
7
+ let viewCourseDetailUrl: PropTypes.Requireable<string>;
8
+ }
9
+ }
10
+ import PropTypes from 'prop-types';
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import PropTypes from 'prop-types';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Button, Card, Col, Row } from '@openedx/paragon';
5
+ import messages from './messages';
6
+ const ViewCourseDetailBanner = ({ viewCourseDetailUrl }) => {
7
+ const { formatMessage } = useIntl();
8
+ return (_jsx(Card.Status, { variant: "warning", className: "bg-light-200", "data-testid": "view-course-detail-banner", children: _jsxs(Row, { className: "align-items-center mt-1", children: [_jsx(Col, { xs: 12, lg: 8, className: "pe-lg-3", children: _jsx("p", { className: "mb-0 font-weight-semi-bold", children: formatMessage(messages.viewCourseDetailBannerText) }) }), _jsx(Col, { xs: 12, sm: 4, className: "d-flex justify-content-end mt-2 mt-lg-0", children: _jsx(Button, { variant: "outline-dark", size: "md", href: viewCourseDetailUrl || undefined, "data-testid": "view-course-detail-button", children: formatMessage(messages.viewCourseDetailAction) }) })] }) }));
9
+ };
10
+ ViewCourseDetailBanner.propTypes = {
11
+ viewCourseDetailUrl: PropTypes.string,
12
+ };
13
+ export default ViewCourseDetailBanner;
14
+ //# sourceMappingURL=ViewCourseDetailBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewCourseDetailBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,sBAAsB,GAAG,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE;IACzD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,OAAO,CACL,KAAC,IAAI,CAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,cAAc,iBAAa,2BAA2B,YAC7F,MAAC,GAAG,IAAC,SAAS,EAAC,yBAAyB,aACtC,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,SAAS,YACrC,YAAG,SAAS,EAAC,4BAA4B,YACtC,aAAa,CAAC,QAAQ,CAAC,0BAA0B,CAAC,GACjD,GACA,EACN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,yCAAyC,YACrE,KAAC,MAAM,IACL,OAAO,EAAC,cAAc,EACtB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,mBAAmB,IAAI,SAAS,iBAC1B,2BAA2B,YAEtC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GACxC,GACL,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,sBAAsB,CAAC,SAAS,GAAG;IACjC,mBAAmB,EAAE,SAAS,CAAC,MAAM;CACtC,CAAC;AAEF,eAAe,sBAAsB,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, Card, Col, Row } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst ViewCourseDetailBanner = ({ viewCourseDetailUrl }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200\" data-testid=\"view-course-detail-banner\">\n <Row className=\"align-items-center mt-1\">\n <Col xs={12} lg={8} className=\"pe-lg-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n {formatMessage(messages.viewCourseDetailBannerText)}\n </p>\n </Col>\n <Col xs={12} sm={4} className=\"d-flex justify-content-end mt-2 mt-lg-0\">\n <Button\n variant=\"outline-dark\"\n size=\"md\"\n href={viewCourseDetailUrl || undefined}\n data-testid=\"view-course-detail-button\"\n >\n {formatMessage(messages.viewCourseDetailAction)}\n </Button>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewCourseDetailBanner.propTypes = {\n viewCourseDetailUrl: PropTypes.string,\n};\n\nexport default ViewCourseDetailBanner;\n"]}
@@ -1,26 +1,40 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import PropTypes from 'prop-types';
3
+ import FindCourseBanner from './FindCourseBanner';
3
4
  import { useCourseData } from '../../../../hooks';
4
5
  import UpgradeBanner from './UpgradeBanner';
5
6
  import ViewCertificateBanner from './ViewCertificateBanner';
6
7
  import ViewGradesBanner from './ViewGradesBanner';
8
+ import ViewCourseDetailBanner from './ViewCourseDetailBanner';
7
9
  export const CourseCardBanners = ({ cardId, verifiedCourse, isHistoryTab, isAudit, isAuditAccessExpired, canUpgrade }) => {
8
- var _a, _b, _c, _d, _e, _f;
10
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
9
11
  const courseData = useCourseData(cardId);
10
12
  if (!courseData) {
11
13
  return null;
12
14
  }
13
15
  const upgradeUrl = (_b = (_a = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _a === void 0 ? void 0 : _a.marketingUrl) !== null && _b !== void 0 ? _b : '';
14
- const showUpgradeBanner = (isHistoryTab
16
+ const findCourseUrl = '/subscription-search';
17
+ const showFindCourseBanner = (isHistoryTab
15
18
  && isAuditAccessExpired
16
- && (courseData === null || courseData === void 0 ? void 0 : courseData.isFromNonUpgradeableCourses)) || (!isHistoryTab && isAudit && canUpgrade);
17
- const isDownloadable = ((_c = courseData === null || courseData === void 0 ? void 0 : courseData.certificate) === null || _c === void 0 ? void 0 : _c.isDownloadable) || false;
18
- const isCompletedButNotPassed = !!((_d = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _d === void 0 ? void 0 : _d.isArchived)
19
- && ((_e = courseData === null || courseData === void 0 ? void 0 : courseData.gradeData) === null || _e === void 0 ? void 0 : _e.isPassing) === false
20
- && !((_f = courseData === null || courseData === void 0 ? void 0 : courseData.certificate) === null || _f === void 0 ? void 0 : _f.isEarned);
19
+ && isAudit
20
+ && ((_c = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _c === void 0 ? void 0 : _c.isArchived));
21
+ const showViewCourseDetailBanner = (isHistoryTab
22
+ && isAuditAccessExpired
23
+ && isAudit
24
+ && ((_d = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _d === void 0 ? void 0 : _d.isArchived)
25
+ && !(courseData === null || courseData === void 0 ? void 0 : courseData.isFromNonUpgradeableCourses));
26
+ const showUpgradeBanner = (isAudit
27
+ && canUpgrade
28
+ && !(courseData === null || courseData === void 0 ? void 0 : courseData.isFromNonUpgradeableCourses)
29
+ && (!isHistoryTab || isAuditAccessExpired));
30
+ const isDownloadable = ((_e = courseData === null || courseData === void 0 ? void 0 : courseData.certificate) === null || _e === void 0 ? void 0 : _e.isDownloadable) || false;
31
+ const isCompletedButNotPassed = !!((_f = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _f === void 0 ? void 0 : _f.isArchived)
32
+ && ((_g = courseData === null || courseData === void 0 ? void 0 : courseData.gradeData) === null || _g === void 0 ? void 0 : _g.isPassing) === false
33
+ && !((_h = courseData === null || courseData === void 0 ? void 0 : courseData.certificate) === null || _h === void 0 ? void 0 : _h.isEarned);
34
+ const homeUrl = (_j = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _j === void 0 ? void 0 : _j.homeUrl;
21
35
  return (_jsxs("div", { className: "course-card-banners", "data-testid": "CourseCardBanners", children: [showUpgradeBanner && (_jsx(UpgradeBanner, { upgradeUrl: upgradeUrl })), isDownloadable &&
22
36
  _jsx(ViewCertificateBanner, { cardId: cardId }), isCompletedButNotPassed &&
23
- _jsx(ViewGradesBanner, { cardId: cardId })] }));
37
+ _jsx(ViewGradesBanner, { cardId: cardId }), showFindCourseBanner && (_jsx(FindCourseBanner, { findCourseUrl: findCourseUrl })), showViewCourseDetailBanner && (_jsx(ViewCourseDetailBanner, { viewCourseDetailUrl: homeUrl }))] }));
24
38
  };
25
39
  CourseCardBanners.propTypes = {
26
40
  cardId: PropTypes.string.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,EAAE;;IACvH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,YAAY,mCAAI,EAAE,CAAC;IAC7D,MAAM,iBAAiB,GAAG,CAAC,YAAY;WAClC,oBAAoB;YACpB,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,2BAA2B,CAAA,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,0CAAE,cAAc,KAAI,KAAK,CAAC;IACxE,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,UAAU,CAAA;WAC7D,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,SAAS,MAAK,KAAK;WAC1C,CAAC,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,0CAAE,QAAQ,CAAA,CAAC;IAEzC,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,iBAAa,mBAAmB,aACjE,iBAAiB,IAAI,CACpB,KAAC,aAAa,IAAC,UAAU,EAAE,UAAU,GAAI,CAC1C,EACA,cAAc;gBACb,KAAC,qBAAqB,IAAC,MAAM,EAAE,MAAM,GAAI,EAE1C,uBAAuB;gBACtB,KAAC,gBAAgB,IAAC,MAAM,EAAE,MAAM,GAAI,IAElC,CACP,CAAC;AACJ,CAAC,CAAC;AACF,iBAAiB,CAAC,SAAS,GAAG;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,cAAc,EAAE,SAAS,CAAC,IAAI;IAC9B,YAAY,EAAE,SAAS,CAAC,IAAI;IAC5B,OAAO,EAAE,SAAS,CAAC,IAAI;IACvB,oBAAoB,EAAE,SAAS,CAAC,IAAI;IACpC,UAAU,EAAE,SAAS,CAAC,IAAI;CAC3B,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { useCourseData } from '@src/hooks';\nimport UpgradeBanner from './UpgradeBanner';\nimport ViewCertificateBanner from './ViewCertificateBanner';\nimport ViewGradesBanner from './ViewGradesBanner';\n\nexport const CourseCardBanners = ({ cardId, verifiedCourse, isHistoryTab, isAudit, isAuditAccessExpired, canUpgrade }) => {\n const courseData = useCourseData(cardId);\n if (!courseData) {\n return null;\n }\n\n const upgradeUrl = courseData?.courseRun?.marketingUrl ?? '';\n const showUpgradeBanner = (isHistoryTab\n && isAuditAccessExpired\n && courseData?.isFromNonUpgradeableCourses) || (!isHistoryTab && isAudit && canUpgrade);\n const isDownloadable = courseData?.certificate?.isDownloadable || false;\n const isCompletedButNotPassed = !!courseData?.courseRun?.isArchived\n && courseData?.gradeData?.isPassing === false\n && !courseData?.certificate?.isEarned;\n\n return (\n <div className=\"course-card-banners\" data-testid=\"CourseCardBanners\">\n {showUpgradeBanner && (\n <UpgradeBanner upgradeUrl={upgradeUrl} />\n )}\n {isDownloadable &&\n <ViewCertificateBanner cardId={cardId} />\n }\n {isCompletedButNotPassed &&\n <ViewGradesBanner cardId={cardId} />\n }\n </div>\n );\n};\nCourseCardBanners.propTypes = {\n cardId: PropTypes.string.isRequired,\n verifiedCourse: PropTypes.bool,\n isHistoryTab: PropTypes.bool,\n isAudit: PropTypes.bool,\n isAuditAccessExpired: PropTypes.bool,\n canUpgrade: PropTypes.bool,\n};\n\nexport default CourseCardBanners;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/index.jsx"],"names":[],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport FindCourseBanner from './FindCourseBanner';\nimport { useCourseData } from '@src/hooks';\nimport UpgradeBanner from './UpgradeBanner';\nimport ViewCertificateBanner from './ViewCertificateBanner';\nimport ViewGradesBanner from './ViewGradesBanner';\nimport ViewCourseDetailBanner from './ViewCourseDetailBanner';\n\nexport const CourseCardBanners = ({ cardId, verifiedCourse, isHistoryTab, isAudit, isAuditAccessExpired, canUpgrade }) => {\n const courseData = useCourseData(cardId);\n if (!courseData) {\n return null;\n }\n\n const upgradeUrl = courseData?.courseRun?.marketingUrl ?? '';\n const findCourseUrl = '/subscription-search';\n const showFindCourseBanner = (\n isHistoryTab\n && isAuditAccessExpired\n && isAudit\n && courseData?.courseRun?.isArchived\n );\n const showViewCourseDetailBanner = (\n isHistoryTab\n && isAuditAccessExpired\n && isAudit\n && courseData?.courseRun?.isArchived\n && !courseData?.isFromNonUpgradeableCourses\n );\n const showUpgradeBanner = (\n isAudit\n && canUpgrade\n && !courseData?.isFromNonUpgradeableCourses\n && (!isHistoryTab || isAuditAccessExpired)\n );\n const isDownloadable = courseData?.certificate?.isDownloadable || false;\n const isCompletedButNotPassed = !!courseData?.courseRun?.isArchived\n && courseData?.gradeData?.isPassing === false\n && !courseData?.certificate?.isEarned;\n const homeUrl = courseData?.courseRun?.homeUrl;\n\n\n return (\n <div className=\"course-card-banners\" data-testid=\"CourseCardBanners\">\n {showUpgradeBanner && (\n <UpgradeBanner upgradeUrl={upgradeUrl} />\n )}\n {isDownloadable &&\n <ViewCertificateBanner cardId={cardId} />\n }\n {isCompletedButNotPassed &&\n <ViewGradesBanner cardId={cardId} />\n }\n {showFindCourseBanner && (\n <FindCourseBanner\n findCourseUrl={findCourseUrl}\n />\n )}\n {showViewCourseDetailBanner && (\n <ViewCourseDetailBanner\n viewCourseDetailUrl={homeUrl}\n />\n )}\n </div>\n );\n};\nCourseCardBanners.propTypes = {\n cardId: PropTypes.string.isRequired,\n verifiedCourse: PropTypes.bool,\n isHistoryTab: PropTypes.bool,\n isAudit: PropTypes.bool,\n isAuditAccessExpired: PropTypes.bool,\n canUpgrade: PropTypes.bool,\n};\n\nexport default CourseCardBanners;\n"]}
@@ -229,4 +229,36 @@ declare namespace messages {
229
229
  let defaultMessage_28: string;
230
230
  export { defaultMessage_28 as defaultMessage };
231
231
  }
232
+ namespace viewCourseDetailBannerText {
233
+ let id_29: string;
234
+ export { id_29 as id };
235
+ let description_29: string;
236
+ export { description_29 as description };
237
+ let defaultMessage_29: string;
238
+ export { defaultMessage_29 as defaultMessage };
239
+ }
240
+ namespace viewCourseDetailAction {
241
+ let id_30: string;
242
+ export { id_30 as id };
243
+ let description_30: string;
244
+ export { description_30 as description };
245
+ let defaultMessage_30: string;
246
+ export { defaultMessage_30 as defaultMessage };
247
+ }
248
+ namespace findCourseBannerText {
249
+ let id_31: string;
250
+ export { id_31 as id };
251
+ let description_31: string;
252
+ export { description_31 as description };
253
+ let defaultMessage_31: string;
254
+ export { defaultMessage_31 as defaultMessage };
255
+ }
256
+ namespace findCourseAction {
257
+ let id_32: string;
258
+ export { id_32 as id };
259
+ let description_32: string;
260
+ export { description_32 as description };
261
+ let defaultMessage_32: string;
262
+ export { defaultMessage_32 as defaultMessage };
263
+ }
232
264
  }
@@ -145,6 +145,26 @@ const messages = defineMessages({
145
145
  description: 'View grades link text for verified courses',
146
146
  defaultMessage: 'View grades',
147
147
  },
148
+ viewCourseDetailBannerText: {
149
+ id: 'learner-dash.courseCard.banners.viewCourseDetailBannerText',
150
+ description: 'View course detail banner text for verified courses',
151
+ defaultMessage: 'Enroll in a new course-run with your subscription.',
152
+ },
153
+ viewCourseDetailAction: {
154
+ id: 'learner-dash.courseCard.banners.viewCourseDetailAction',
155
+ description: 'View course detail action link text for verified courses',
156
+ defaultMessage: 'View course details',
157
+ },
158
+ findCourseBannerText: {
159
+ id: 'learner-dash.courseCard.banners.findCourseBannerText',
160
+ description: 'Find course banner text for verified courses',
161
+ defaultMessage: 'This course-run is no longer available. Enroll in a new session or similar course.',
162
+ },
163
+ findCourseAction: {
164
+ id: 'learner-dash.courseCard.banners.findCourseAction',
165
+ description: 'Find course action link text for verified courses',
166
+ defaultMessage: 'Find a course',
167
+ },
148
168
  });
149
169
  export default messages;
150
170
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/messages.js"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n auditAccessExpired: {\n id: 'learner-dash.courseCard.banners.auditAccessExpired',\n description: 'Audit access expiration banner message',\n defaultMessage: 'Your audit access to this course has expired.',\n },\n findAnotherCourse: {\n id: 'learner-dash.courseCard.banners.findAnotherCourse',\n description: 'Action prompt taking learners to course exploration',\n defaultMessage: 'Find another course',\n },\n certRestricted: {\n id: 'learner-dash.courseCard.banners.certificateRestricted',\n description: 'Restricted certificate warning message',\n defaultMessage: 'Your Certificate of Achievement is being held pending confirmation that the issuance of your Certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria, and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know by contacting {supportEmail}.',\n },\n certRestrictedNoEmail: {\n id: 'learner-dash.courseCard.banners.certificateRestrictedNoEmail',\n description: 'Restricted certificate warning message',\n defaultMessage: 'Your Certificate of Achievement is being held pending confirmation that the issuance of your Certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria, and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know.',\n },\n certRefundContactBilling: {\n id: 'learner-dash.courseCard.banners.certificateRefundContactBilling',\n description: 'Message to learners to contact billing for certificate refunds',\n defaultMessage: 'If you would like a refund on your Certificate of Achievement, please contact our billing address {billingEmail}',\n },\n certRefundContactBillingNoEmail: {\n id: 'learner-dash.courseCard.banners.certificateRefundContactBillingNoEmail',\n description: 'Message to learners to contact billing for certificate refunds',\n defaultMessage: 'If you would like a refund on your Certificate of Achievement, please contact us.',\n },\n passingGrade: {\n id: 'learner-dash.courseCard.banners.passingGrade',\n description: 'Message to learners with minimum passing grade for the course',\n defaultMessage: 'Grade required to pass the course: {minPassingGrade}\\u200f%',\n },\n notEligibleForCert: {\n id: 'learner-dash.courseCard.banners.notEligibleForCert',\n description: 'Certificate inelligibility message',\n defaultMessage: 'You are not eligible for a certificate.',\n },\n viewGrades: {\n id: 'learner-dash.courseCard.banners.viewGrades',\n description: 'Gradses link text',\n defaultMessage: 'View grades.',\n },\n certReady: {\n id: 'learner-dash.courseCard.banners.certReady',\n description: 'Certificate ready message',\n defaultMessage: 'Congratulations. Your certificate is ready.',\n },\n viewCertificate: {\n id: 'learner-dash.courseCard.banners.viewCertificate',\n description: 'Certificate link text',\n defaultMessage: 'View certificate',\n },\n certMinGrade: {\n id: 'learner-dash.courseCard.banners.certMinGrade',\n description: 'Passing grade requirement message',\n defaultMessage: 'Grade required for a certificate: {minPassingGrade}\\u200f%',\n },\n downloadCertificate: {\n id: 'learner-dash.courseCard.banners.downloadCertificate',\n description: 'Certificate download link text',\n defaultMessage: 'Download Certificate.',\n },\n gradeAndCertReadyAfter: {\n id: 'learner-dash.courseCard.banners.gradseAndCertReadyAfter',\n description: 'Grade and certificate availability date message',\n defaultMessage: 'Your grade and certificate will be ready after {availableDate}.',\n },\n entitlementUnavailable: {\n id: 'learner-dash.courseCard.banners.entitlementUnavailable',\n description: 'Entitlement course message when no sessions are available',\n defaultMessage: 'There are no sessions available at the moment. The course team will create new sessions soon. If no sessions appear, please contact {emailLink} for information.',\n },\n entitlementExpiringSoon: {\n id: 'learner-dash.courseCard.banners.entitlementExpiringSoon',\n description: 'Entitlement course message when the entitlement is expiring soon.',\n defaultMessage: 'You must {selectSessionButton} by {changeDeadline} to access the course.',\n },\n entitlementExpired: {\n id: 'learner-dash.courseCard.banners.entitlementExpired',\n description: 'Entitlement course message when the entitlement is expired.',\n defaultMessage: 'You can no longer change sessions.',\n },\n selectSession: {\n id: 'learner-dash.courseCard.banners.selectSession',\n description: 'Entitlement session selection link text',\n defaultMessage: 'select a session',\n },\n prerequisitesNotMet: {\n id: 'learner-dash.courseCard.banners.prerequisitesNotMet',\n description: 'Message to learners with unmet prerequisites',\n defaultMessage: 'You can\\'t access this course just yet because you have not met the pre-requisites.',\n },\n courseHasNotStarted: {\n id: 'learner-dash.courseCard.banners.courseHasNotStarted',\n description: 'Course has not started message',\n defaultMessage: 'You can\\'t access this course just yet because the course hasn\\'t started yet. The course will start on {startDate}.',\n },\n redeem: {\n id: 'learner-dash.courseCard.banners.redeem',\n description: 'Redeem link text',\n defaultMessage: 'Redeem',\n },\n subscriptionUpgradeBannerText: {\n id: 'learner-dash.courseCard.banners.subscriptionUpgradeBannerText',\n description: 'Banner text for subscription courses where audit access has expired',\n defaultMessage: 'This course is included in your subscription. Upgrade to get full course access.',\n },\n subscriptionRedeemBannerText: {\n id: 'learner-dash.courseCard.banners.subscriptionRedeemBannerText',\n description: 'Banner text for subscription courses where audit access has expired',\n defaultMessage: 'This course is included in your subscription. Redeem to get full course access.',\n },\n upgradeAction: {\n id: 'learner-dash.courseCard.banners.upgradeAction',\n description: 'Upgrade button text for subscription upgrade banner',\n defaultMessage: 'Upgrade',\n },\n verifiedBannerText: {\n id: 'learner-dash.courseCard.banners.verifiedBannerText',\n description: 'Banner text for verified courses',\n defaultMessage: 'You passed this course on {date} and earned a verified certificate.',\n },\n completedAndPassedBannerText: {\n id: 'learner-dash.courseCard.banners.completedAndPassedBannerText',\n description: 'Banner text for completed and passed courses',\n defaultMessage: 'You completed and passed this course on {date}.',\n },\n congratulationsText: {\n id: 'learner-dash.courseCard.banners.congratulationsText',\n description: 'Congratulations text for verified courses',\n defaultMessage: 'Congratulations!',\n },\n courseCompletedBannerText: {\n id: 'learner-dash.courseCard.banners.courseCompletedBannerText',\n description: 'Course completed banner text for verified courses',\n defaultMessage: 'You completed this course on {date}.',\n },\n viewGradesText: {\n id: 'learner-dash.courseCard.banners.viewGradesText',\n description: 'View grades link text for verified courses',\n defaultMessage: 'View grades',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/messages.js"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n auditAccessExpired: {\n id: 'learner-dash.courseCard.banners.auditAccessExpired',\n description: 'Audit access expiration banner message',\n defaultMessage: 'Your audit access to this course has expired.',\n },\n findAnotherCourse: {\n id: 'learner-dash.courseCard.banners.findAnotherCourse',\n description: 'Action prompt taking learners to course exploration',\n defaultMessage: 'Find another course',\n },\n certRestricted: {\n id: 'learner-dash.courseCard.banners.certificateRestricted',\n description: 'Restricted certificate warning message',\n defaultMessage: 'Your Certificate of Achievement is being held pending confirmation that the issuance of your Certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria, and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know by contacting {supportEmail}.',\n },\n certRestrictedNoEmail: {\n id: 'learner-dash.courseCard.banners.certificateRestrictedNoEmail',\n description: 'Restricted certificate warning message',\n defaultMessage: 'Your Certificate of Achievement is being held pending confirmation that the issuance of your Certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria, and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know.',\n },\n certRefundContactBilling: {\n id: 'learner-dash.courseCard.banners.certificateRefundContactBilling',\n description: 'Message to learners to contact billing for certificate refunds',\n defaultMessage: 'If you would like a refund on your Certificate of Achievement, please contact our billing address {billingEmail}',\n },\n certRefundContactBillingNoEmail: {\n id: 'learner-dash.courseCard.banners.certificateRefundContactBillingNoEmail',\n description: 'Message to learners to contact billing for certificate refunds',\n defaultMessage: 'If you would like a refund on your Certificate of Achievement, please contact us.',\n },\n passingGrade: {\n id: 'learner-dash.courseCard.banners.passingGrade',\n description: 'Message to learners with minimum passing grade for the course',\n defaultMessage: 'Grade required to pass the course: {minPassingGrade}\\u200f%',\n },\n notEligibleForCert: {\n id: 'learner-dash.courseCard.banners.notEligibleForCert',\n description: 'Certificate inelligibility message',\n defaultMessage: 'You are not eligible for a certificate.',\n },\n viewGrades: {\n id: 'learner-dash.courseCard.banners.viewGrades',\n description: 'Gradses link text',\n defaultMessage: 'View grades.',\n },\n certReady: {\n id: 'learner-dash.courseCard.banners.certReady',\n description: 'Certificate ready message',\n defaultMessage: 'Congratulations. Your certificate is ready.',\n },\n viewCertificate: {\n id: 'learner-dash.courseCard.banners.viewCertificate',\n description: 'Certificate link text',\n defaultMessage: 'View certificate',\n },\n certMinGrade: {\n id: 'learner-dash.courseCard.banners.certMinGrade',\n description: 'Passing grade requirement message',\n defaultMessage: 'Grade required for a certificate: {minPassingGrade}\\u200f%',\n },\n downloadCertificate: {\n id: 'learner-dash.courseCard.banners.downloadCertificate',\n description: 'Certificate download link text',\n defaultMessage: 'Download Certificate.',\n },\n gradeAndCertReadyAfter: {\n id: 'learner-dash.courseCard.banners.gradseAndCertReadyAfter',\n description: 'Grade and certificate availability date message',\n defaultMessage: 'Your grade and certificate will be ready after {availableDate}.',\n },\n entitlementUnavailable: {\n id: 'learner-dash.courseCard.banners.entitlementUnavailable',\n description: 'Entitlement course message when no sessions are available',\n defaultMessage: 'There are no sessions available at the moment. The course team will create new sessions soon. If no sessions appear, please contact {emailLink} for information.',\n },\n entitlementExpiringSoon: {\n id: 'learner-dash.courseCard.banners.entitlementExpiringSoon',\n description: 'Entitlement course message when the entitlement is expiring soon.',\n defaultMessage: 'You must {selectSessionButton} by {changeDeadline} to access the course.',\n },\n entitlementExpired: {\n id: 'learner-dash.courseCard.banners.entitlementExpired',\n description: 'Entitlement course message when the entitlement is expired.',\n defaultMessage: 'You can no longer change sessions.',\n },\n selectSession: {\n id: 'learner-dash.courseCard.banners.selectSession',\n description: 'Entitlement session selection link text',\n defaultMessage: 'select a session',\n },\n prerequisitesNotMet: {\n id: 'learner-dash.courseCard.banners.prerequisitesNotMet',\n description: 'Message to learners with unmet prerequisites',\n defaultMessage: 'You can\\'t access this course just yet because you have not met the pre-requisites.',\n },\n courseHasNotStarted: {\n id: 'learner-dash.courseCard.banners.courseHasNotStarted',\n description: 'Course has not started message',\n defaultMessage: 'You can\\'t access this course just yet because the course hasn\\'t started yet. The course will start on {startDate}.',\n },\n redeem: {\n id: 'learner-dash.courseCard.banners.redeem',\n description: 'Redeem link text',\n defaultMessage: 'Redeem',\n },\n subscriptionUpgradeBannerText: {\n id: 'learner-dash.courseCard.banners.subscriptionUpgradeBannerText',\n description: 'Banner text for subscription courses where audit access has expired',\n defaultMessage: 'This course is included in your subscription. Upgrade to get full course access.',\n },\n subscriptionRedeemBannerText: {\n id: 'learner-dash.courseCard.banners.subscriptionRedeemBannerText',\n description: 'Banner text for subscription courses where audit access has expired',\n defaultMessage: 'This course is included in your subscription. Redeem to get full course access.',\n },\n upgradeAction: {\n id: 'learner-dash.courseCard.banners.upgradeAction',\n description: 'Upgrade button text for subscription upgrade banner',\n defaultMessage: 'Upgrade',\n },\n verifiedBannerText: {\n id: 'learner-dash.courseCard.banners.verifiedBannerText',\n description: 'Banner text for verified courses',\n defaultMessage: 'You passed this course on {date} and earned a verified certificate.',\n },\n completedAndPassedBannerText: {\n id: 'learner-dash.courseCard.banners.completedAndPassedBannerText',\n description: 'Banner text for completed and passed courses',\n defaultMessage: 'You completed and passed this course on {date}.',\n },\n congratulationsText: {\n id: 'learner-dash.courseCard.banners.congratulationsText',\n description: 'Congratulations text for verified courses',\n defaultMessage: 'Congratulations!',\n },\n courseCompletedBannerText: {\n id: 'learner-dash.courseCard.banners.courseCompletedBannerText',\n description: 'Course completed banner text for verified courses',\n defaultMessage: 'You completed this course on {date}.',\n },\n viewGradesText: {\n id: 'learner-dash.courseCard.banners.viewGradesText',\n description: 'View grades link text for verified courses',\n defaultMessage: 'View grades',\n },\n viewCourseDetailBannerText: {\n id: 'learner-dash.courseCard.banners.viewCourseDetailBannerText',\n description: 'View course detail banner text for verified courses',\n defaultMessage: 'Enroll in a new course-run with your subscription.',\n },\n viewCourseDetailAction: {\n id: 'learner-dash.courseCard.banners.viewCourseDetailAction',\n description: 'View course detail action link text for verified courses',\n defaultMessage: 'View course details',\n },\n findCourseBannerText: {\n id: 'learner-dash.courseCard.banners.findCourseBannerText',\n description: 'Find course banner text for verified courses',\n defaultMessage: 'This course-run is no longer available. Enroll in a new session or similar course.',\n },\n findCourseAction: {\n id: 'learner-dash.courseCard.banners.findCourseAction',\n description: 'Find course action link text for verified courses',\n defaultMessage: 'Find a course',\n },\n});\n\nexport default messages;\n"]}
@@ -12,13 +12,7 @@ export const CourseCardDetails = ({ cardId, isHistoryTab = false }) => {
12
12
  const { providerName, accessMessage, isEntitlement, isFulfilled, canChange, openSessionModal, changeOrLeaveSessionMessage, isAuditAccessExpired, isAudit, canUpgrade, isFromNonUpgradeableCourses, } = useCardDetailsData({ cardId });
13
13
  const showAuditTrackBadge = (isHistoryTab && isAuditAccessExpired) || (!isHistoryTab && isAudit && canUpgrade);
14
14
  const showDefaultAccessMessage = !(isEntitlement && !isFulfilled) && accessMessage;
15
- let renderedAccessMessage = null;
16
- if (isHistoryTab && isAuditAccessExpired) {
17
- renderedAccessMessage = isFromNonUpgradeableCourses
18
- ? formatMessage(messages.auditAccessExpiredNotIncluded)
19
- : formatMessage(messages.auditAccessExpired);
20
- }
21
- return (_jsxs("div", { "data-testid": "CourseCardDetails", children: [providerName && (_jsx("span", { className: "small text-muted mr-2", "data-testid": "course-provider", children: providerName })), showDefaultAccessMessage && (_jsx("span", { className: "small text-gray-700", "data-testid": "course-end-date", children: accessMessage })), showAuditTrackBadge && (_jsxs("div", { children: [_jsx(Badge, { className: "mr-2 mt-2 bg-light-200 text-dark-700", "data-testid": "audit-track-badge", children: formatMessage(messages.auditTrackBadge) }), renderedAccessMessage && (_jsx("span", { className: "small text-gray-700", "data-testid": "course-audit-access-expired", children: renderedAccessMessage }))] })), isEntitlement && isFulfilled && canChange ? (_jsx(Button, { variant: "link", size: "inline", className: "m-0 p-0", onClick: openSessionModal, children: changeOrLeaveSessionMessage })) : null] }));
15
+ return (_jsxs("div", { "data-testid": "CourseCardDetails", children: [providerName && (_jsx("span", { className: "small text-muted mr-2", "data-testid": "course-provider", children: providerName })), showDefaultAccessMessage && (_jsx("span", { className: "small text-gray-700", "data-testid": "course-end-date", children: accessMessage })), showAuditTrackBadge && (_jsxs("div", { children: [_jsx(Badge, { className: "mr-2 mt-2 bg-light-200 text-dark-700", "data-testid": "audit-track-badge", children: formatMessage(messages.auditTrackBadge) }), _jsx("span", { className: "small text-gray-700", "data-testid": "course-audit-access-expired", children: formatMessage(messages.auditAccessExpired) })] })), isEntitlement && isFulfilled && canChange ? (_jsx(Button, { variant: "link", size: "inline", className: "m-0 p-0", onClick: openSessionModal, children: changeOrLeaveSessionMessage })) : null] }));
22
16
  };
23
17
  CourseCardDetails.propTypes = {
24
18
  cardId: PropTypes.string.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardDetails/index.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,kBAAkB,MAAM,SAAS,CAAC;AACzC,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE,EAAE;IACpE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,EACJ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,2BAA2B,GAC5B,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnC,MAAM,mBAAmB,GAAG,CAAC,YAAY,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;IAC/G,MAAM,wBAAwB,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC;IAEnF,IAAI,qBAAqB,GAAG,IAAI,CAAC;IAEjC,IAAI,YAAY,IAAI,oBAAoB,EAAE,CAAC;QACzC,qBAAqB,GAAG,2BAA2B;YACjD,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACvD,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CACL,8BAAiB,mBAAmB,aAC7B,YAAY,IAAI,CACf,eAAM,SAAS,EAAC,uBAAuB,iBAAa,iBAAiB,YAClE,YAAY,GACR,CACR,EAEA,wBAAwB,IAAI,CAC3B,eAAM,SAAS,EAAC,qBAAqB,iBAAa,iBAAiB,YAChE,aAAa,GACT,CACR,EAEA,mBAAmB,IAAI,CACtB,0BACE,KAAC,KAAK,IAAC,SAAS,EAAC,sCAAsC,iBAAa,mBAAmB,YACpF,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAClC,EACP,qBAAqB,IAAI,CACxB,eAAM,SAAS,EAAC,qBAAqB,iBAAa,6BAA6B,YAC5E,qBAAqB,GACjB,CACR,IACG,CACP,EAEA,aAAa,IAAI,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAC3C,KAAC,MAAM,IAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,gBAAgB,YAC/E,2BAA2B,GACrB,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,iBAAiB,CAAC,SAAS,GAAG;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,YAAY,EAAE,SAAS,CAAC,IAAI;CAC7B,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from './messages';\nimport { Button } from '@openedx/paragon';\nimport { Badge } from '@openedx/paragon';\nimport useCardDetailsData from './hooks';\nimport './index.scss';\n\nexport const CourseCardDetails = ({ cardId, isHistoryTab = false }) => {\n const { formatMessage } = useIntl();\n\n const {\n providerName,\n accessMessage,\n isEntitlement,\n isFulfilled,\n canChange,\n openSessionModal,\n changeOrLeaveSessionMessage,\n isAuditAccessExpired,\n isAudit,\n canUpgrade,\n isFromNonUpgradeableCourses,\n } = useCardDetailsData({ cardId });\n\n const showAuditTrackBadge = (isHistoryTab && isAuditAccessExpired) || (!isHistoryTab && isAudit && canUpgrade);\n const showDefaultAccessMessage = !(isEntitlement && !isFulfilled) && accessMessage;\n\n let renderedAccessMessage = null;\n\n if (isHistoryTab && isAuditAccessExpired) {\n renderedAccessMessage = isFromNonUpgradeableCourses\n ? formatMessage(messages.auditAccessExpiredNotIncluded)\n : formatMessage(messages.auditAccessExpired);\n }\n\n return (\n <div data-testid=\"CourseCardDetails\">\n {providerName && (\n <span className=\"small text-muted mr-2\" data-testid=\"course-provider\">\n {providerName}\n </span>\n )}\n\n {showDefaultAccessMessage && (\n <span className=\"small text-gray-700\" data-testid=\"course-end-date\">\n {accessMessage}\n </span>\n )}\n\n {showAuditTrackBadge && (\n <div>\n <Badge className=\"mr-2 mt-2 bg-light-200 text-dark-700\" data-testid=\"audit-track-badge\">\n {formatMessage(messages.auditTrackBadge)}\n </Badge>\n {renderedAccessMessage && (\n <span className=\"small text-gray-700\" data-testid=\"course-audit-access-expired\">\n {renderedAccessMessage}\n </span>\n )}\n </div>\n )}\n \n {isEntitlement && isFulfilled && canChange ? (\n <Button variant=\"link\" size=\"inline\" className=\"m-0 p-0\" onClick={openSessionModal}>\n {changeOrLeaveSessionMessage}\n </Button>\n ) : null}\n </div>\n );\n};\n\nCourseCardDetails.propTypes = {\n cardId: PropTypes.string.isRequired,\n isHistoryTab: PropTypes.bool,\n};\n\nexport default CourseCardDetails;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardDetails/index.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,kBAAkB,MAAM,SAAS,CAAC;AACzC,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE,EAAE;IACpE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,EACJ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,2BAA2B,GAC5B,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnC,MAAM,mBAAmB,GAAG,CAAC,YAAY,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC;IAC/G,MAAM,wBAAwB,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC;IAEnF,OAAO,CACL,8BAAiB,mBAAmB,aAC7B,YAAY,IAAI,CACf,eAAM,SAAS,EAAC,uBAAuB,iBAAa,iBAAiB,YAClE,YAAY,GACR,CACR,EAEA,wBAAwB,IAAI,CAC3B,eAAM,SAAS,EAAC,qBAAqB,iBAAa,iBAAiB,YAChE,aAAa,GACT,CACR,EAEA,mBAAmB,IAAI,CACtB,0BACE,KAAC,KAAK,IAAC,SAAS,EAAC,sCAAsC,iBAAa,mBAAmB,YACpF,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAClC,EACN,eAAM,SAAS,EAAC,qBAAqB,iBAAa,6BAA6B,YAC5E,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GACtC,IACL,CACP,EAEA,aAAa,IAAI,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAC3C,KAAC,MAAM,IAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,gBAAgB,YAC/E,2BAA2B,GACrB,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,iBAAiB,CAAC,SAAS,GAAG;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,YAAY,EAAE,SAAS,CAAC,IAAI;CAC7B,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from './messages';\nimport { Button } from '@openedx/paragon';\nimport { Badge } from '@openedx/paragon';\nimport useCardDetailsData from './hooks';\nimport './index.scss';\n\nexport const CourseCardDetails = ({ cardId, isHistoryTab = false }) => {\n const { formatMessage } = useIntl();\n\n const {\n providerName,\n accessMessage,\n isEntitlement,\n isFulfilled,\n canChange,\n openSessionModal,\n changeOrLeaveSessionMessage,\n isAuditAccessExpired,\n isAudit,\n canUpgrade,\n isFromNonUpgradeableCourses,\n } = useCardDetailsData({ cardId });\n\n const showAuditTrackBadge = (isHistoryTab && isAuditAccessExpired) || (!isHistoryTab && isAudit && canUpgrade);\n const showDefaultAccessMessage = !(isEntitlement && !isFulfilled) && accessMessage;\n\n return (\n <div data-testid=\"CourseCardDetails\">\n {providerName && (\n <span className=\"small text-muted mr-2\" data-testid=\"course-provider\">\n {providerName}\n </span>\n )}\n\n {showDefaultAccessMessage && (\n <span className=\"small text-gray-700\" data-testid=\"course-end-date\">\n {accessMessage}\n </span>\n )}\n\n {showAuditTrackBadge && (\n <div>\n <Badge className=\"mr-2 mt-2 bg-light-200 text-dark-700\" data-testid=\"audit-track-badge\">\n {formatMessage(messages.auditTrackBadge)}\n </Badge>\n <span className=\"small text-gray-700\" data-testid=\"course-audit-access-expired\">\n {formatMessage(messages.auditAccessExpired)}\n </span>\n </div>\n )}\n \n {isEntitlement && isFulfilled && canChange ? (\n <Button variant=\"link\" size=\"inline\" className=\"m-0 p-0\" onClick={openSessionModal}>\n {changeOrLeaveSessionMessage}\n </Button>\n ) : null}\n </div>\n );\n};\n\nCourseCardDetails.propTypes = {\n cardId: PropTypes.string.isRequired,\n isHistoryTab: PropTypes.bool,\n};\n\nexport default CourseCardDetails;\n"]}
@@ -71,8 +71,18 @@ const useInitializeSubsCourseDashboard = () => {
71
71
  ];
72
72
  // Transform only once so cardIds remain consistent everywhere.
73
73
  const coursesByCardId = getTransformedCourseDataObject(allCourses);
74
- // Filter the already-transformed courses to preserve the same cardIds.
75
- const historyCoursesByCardId = Object.fromEntries(Object.entries(coursesByCardId).filter(([, course]) => { var _a; return ((_a = course === null || course === void 0 ? void 0 : course.enrollment) === null || _a === void 0 ? void 0 : _a.isAuditAccessExpired) === true; }));
74
+ // History should contain subscription + non-upgradeable courses
75
+ // with expired audit access.
76
+ const historyCourseIds = new Set([
77
+ ...((data === null || data === void 0 ? void 0 : data.subscriptionCourses) || []),
78
+ ...((data === null || data === void 0 ? void 0 : data.nonUpgradeableCourses) || []),
79
+ ].map(course => course === null || course === void 0 ? void 0 : course.courseId));
80
+ const historyCoursesByCardId = Object.fromEntries(Object.entries(coursesByCardId).filter(([, course]) => {
81
+ var _a;
82
+ return historyCourseIds.has(course === null || course === void 0 ? void 0 : course.courseId)
83
+ && (course === null || course === void 0 ? void 0 : course.isAudit) === true
84
+ && ((_a = course === null || course === void 0 ? void 0 : course.enrollment) === null || _a === void 0 ? void 0 : _a.isAuditAccessExpired) === true;
85
+ }));
76
86
  return Object.assign(Object.assign({}, data), { coursesByCardId,
77
87
  historyCoursesByCardId });
78
88
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useContext, useEffect } from 'react';\nimport { useMasquerade } from '@src/data/context';\nimport GlobalDataContext from '@src/data/contexts/GlobalDataContext';\nimport { ProgramListData, ProgramProgressData } from '@src/containers/ProgramDashboard/data/types';\nimport { getTransformedCourseDataObject } from '@src/utils/dataTransformers';\nimport { learnerDashboardQueryKeys } from './queryKeys';\nimport { getProgramProgressData, getProgramsListData, initializeCourseList, initializeSubsList } from '@src/data/services/subs';\n\nconst useInitializeSubsDashboard = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n const { setEmailConfirmation, setPlatformSettings } = useContext(GlobalDataContext);\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initializeSubsDashboard(masqueradeUser),\n queryFn: async () => {\n const data = await initializeSubsList(masqueradeUser);\n return {\n ...data,\n };\n },\n staleTime: 5 * 60 * 1000, // 5 minutes — dashboard data rarely changes while viewing\n retry: (failureCount, error: any) => {\n // Don't retry client errors (4xx) — they won't resolve on retry\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n // Populate shell-level GlobalDataProvider so header widgets can access this data\n useEffect(() => {\n if (query.data && !masqueradeUser) {\n if (query.data.emailConfirmation && setEmailConfirmation) {\n setEmailConfirmation(query.data.emailConfirmation);\n }\n if (query.data.platformSettings && setPlatformSettings) {\n setPlatformSettings(query.data.platformSettings);\n }\n }\n }, [masqueradeUser, query.data, setEmailConfirmation, setPlatformSettings]);\n\n // When masquerading fails, fall back to the normal user's cached data\n let { data } = query;\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(learnerDashboardQueryKeys.initializeSubsDashboard(undefined));\n }\n\n return { ...query, data };\n};\n\nconst useInitializeSubsCourseDashboard = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initializeSubsCourseDashboard(masqueradeUser),\n queryFn: async () => {\n const data = await initializeCourseList(masqueradeUser);\n\n const subscriptionAndUpgradeableCourses = [\n ...(data?.subscriptionCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: false,\n })),\n ...(data?.upgradeableCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: false,\n })),\n ];\n\n const nonUpgradeableCoursesWithFlag = (data?.nonUpgradeableCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: true,\n }));\n\n const allCourses = [\n ...subscriptionAndUpgradeableCourses,\n ...nonUpgradeableCoursesWithFlag,\n ];\n\n // Transform only once so cardIds remain consistent everywhere.\n const coursesByCardId = getTransformedCourseDataObject(allCourses);\n\n // Filter the already-transformed courses to preserve the same cardIds.\n const historyCoursesByCardId = Object.fromEntries(\n Object.entries(coursesByCardId as Record<string, { enrollment?: { isAuditAccessExpired?: boolean } }>).filter(\n ([, course]) => course?.enrollment?.isAuditAccessExpired === true,\n ),\n );\n\n return {\n ...data,\n coursesByCardId,\n historyCoursesByCardId,\n };\n },\n staleTime: 5 * 60 * 1000,\n retry: (failureCount, error: any) => {\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n let { data } = query;\n\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(\n learnerDashboardQueryKeys.initializeSubsCourseDashboard(undefined),\n );\n }\n\n return { ...query, data };\n};\n\nconst useProgramsListData = () => {\n return useQuery<ProgramListData>({\n queryKey: ['programsList'],\n queryFn: getProgramsListData,\n retry: false,\n refetchOnWindowFocus: false,\n });\n};\n\nconst useProgramProgressData = (uuid: string) => {\n return useQuery<ProgramProgressData>({\n queryKey: ['programProgress', uuid],\n queryFn: () => getProgramProgressData(uuid),\n enabled: !!uuid,\n staleTime: 1000 * 60 * 5, // 5 min caching\n retry: 2,\n });\n};\n\nexport {\n useInitializeSubsDashboard,\n useInitializeSubsCourseDashboard,\n useProgramProgressData,\n useProgramsListData,\n};\n"]}
1
+ {"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useContext, useEffect } from 'react';\nimport { useMasquerade } from '@src/data/context';\nimport GlobalDataContext from '@src/data/contexts/GlobalDataContext';\nimport { ProgramListData, ProgramProgressData } from '@src/containers/ProgramDashboard/data/types';\nimport { getTransformedCourseDataObject } from '@src/utils/dataTransformers';\nimport { learnerDashboardQueryKeys } from './queryKeys';\nimport { getProgramProgressData, getProgramsListData, initializeCourseList, initializeSubsList } from '@src/data/services/subs';\n\nconst useInitializeSubsDashboard = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n const { setEmailConfirmation, setPlatformSettings } = useContext(GlobalDataContext);\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initializeSubsDashboard(masqueradeUser),\n queryFn: async () => {\n const data = await initializeSubsList(masqueradeUser);\n return {\n ...data,\n };\n },\n staleTime: 5 * 60 * 1000, // 5 minutes — dashboard data rarely changes while viewing\n retry: (failureCount, error: any) => {\n // Don't retry client errors (4xx) — they won't resolve on retry\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n // Populate shell-level GlobalDataProvider so header widgets can access this data\n useEffect(() => {\n if (query.data && !masqueradeUser) {\n if (query.data.emailConfirmation && setEmailConfirmation) {\n setEmailConfirmation(query.data.emailConfirmation);\n }\n if (query.data.platformSettings && setPlatformSettings) {\n setPlatformSettings(query.data.platformSettings);\n }\n }\n }, [masqueradeUser, query.data, setEmailConfirmation, setPlatformSettings]);\n\n // When masquerading fails, fall back to the normal user's cached data\n let { data } = query;\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(learnerDashboardQueryKeys.initializeSubsDashboard(undefined));\n }\n\n return { ...query, data };\n};\n\nconst useInitializeSubsCourseDashboard = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initializeSubsCourseDashboard(masqueradeUser),\n queryFn: async () => {\n const data = await initializeCourseList(masqueradeUser);\n\n const subscriptionAndUpgradeableCourses = [\n ...(data?.subscriptionCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: false,\n })),\n ...(data?.upgradeableCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: false,\n })),\n ];\n\n const nonUpgradeableCoursesWithFlag = (data?.nonUpgradeableCourses || []).map(course => ({\n ...course,\n isFromNonUpgradeableCourses: true,\n }));\n\n const allCourses = [\n ...subscriptionAndUpgradeableCourses,\n ...nonUpgradeableCoursesWithFlag,\n ];\n\n // Transform only once so cardIds remain consistent everywhere.\n const coursesByCardId = getTransformedCourseDataObject(allCourses);\n\n // History should contain subscription + non-upgradeable courses\n // with expired audit access.\n const historyCourseIds = new Set([\n ...(data?.subscriptionCourses || []),\n ...(data?.nonUpgradeableCourses || []),\n ].map(course => course?.courseId));\n\n const historyCoursesByCardId = Object.fromEntries(\n Object.entries(\n coursesByCardId as Record<\n string,\n {\n courseId?: string,\n isAudit?: boolean,\n enrollment?: {\n isAuditAccessExpired?: boolean,\n },\n }\n >,\n ).filter(\n ([, course]) =>\n historyCourseIds.has(course?.courseId)\n && course?.isAudit === true\n && course?.enrollment?.isAuditAccessExpired === true,\n ),\n );\n\n return {\n ...data,\n coursesByCardId,\n historyCoursesByCardId,\n };\n },\n staleTime: 5 * 60 * 1000,\n retry: (failureCount, error: any) => {\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n let { data } = query;\n\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(\n learnerDashboardQueryKeys.initializeSubsCourseDashboard(undefined),\n );\n }\n\n return { ...query, data };\n};\n\nconst useProgramsListData = () => {\n return useQuery<ProgramListData>({\n queryKey: ['programsList'],\n queryFn: getProgramsListData,\n retry: false,\n refetchOnWindowFocus: false,\n });\n};\n\nconst useProgramProgressData = (uuid: string) => {\n return useQuery<ProgramProgressData>({\n queryKey: ['programProgress', uuid],\n queryFn: () => getProgramProgressData(uuid),\n enabled: !!uuid,\n staleTime: 1000 * 60 * 5, // 5 min caching\n retry: 2,\n });\n};\n\nexport {\n useInitializeSubsDashboard,\n useInitializeSubsCourseDashboard,\n useProgramProgressData,\n useProgramsListData,\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-app-subscription-learner-dashboard",
3
- "version": "1.44.1",
3
+ "version": "1.45.0",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",