@edx/frontend-app-subscription-learner-dashboard 1.55.5 → 1.57.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.
Files changed (70) hide show
  1. package/dist/containers/CourseCard/components/CourseCardActions/BeginCourseButton.js +1 -1
  2. package/dist/containers/CourseCard/components/CourseCardActions/BeginCourseButton.js.map +1 -1
  3. package/dist/containers/CourseCard/components/CourseCardActions/ResumeButton.js +1 -1
  4. package/dist/containers/CourseCard/components/CourseCardActions/ResumeButton.js.map +1 -1
  5. package/dist/containers/CourseCard/components/CourseCardActions/ViewCourseButton.js +1 -1
  6. package/dist/containers/CourseCard/components/CourseCardActions/ViewCourseButton.js.map +1 -1
  7. package/dist/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.js +8 -1
  8. package/dist/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.js.map +1 -1
  9. package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.d.ts +3 -1
  10. package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.js +6 -2
  11. package/dist/containers/CourseCard/components/CourseCardBanners/FindCourseBanner.js.map +1 -1
  12. package/dist/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.js +5 -3
  13. package/dist/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.js.map +1 -1
  14. package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.d.ts +3 -1
  15. package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.js +6 -2
  16. package/dist/containers/CourseCard/components/CourseCardBanners/ViewCourseDetailBanner.js.map +1 -1
  17. package/dist/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.js +4 -2
  18. package/dist/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.js.map +1 -1
  19. package/dist/containers/CourseCard/components/CourseCardBanners/index.js +1 -1
  20. package/dist/containers/CourseCard/components/CourseCardBanners/index.js.map +1 -1
  21. package/dist/containers/CoursesPanel/CourseList/index.js +10 -1
  22. package/dist/containers/CoursesPanel/CourseList/index.js.map +1 -1
  23. package/dist/containers/CoursesPanel/NoCoursesView/index.js +4 -1
  24. package/dist/containers/CoursesPanel/NoCoursesView/index.js.map +1 -1
  25. package/dist/containers/ProductCard/index.js +5 -1
  26. package/dist/containers/ProductCard/index.js.map +1 -1
  27. package/dist/containers/ProgramDashboard/ProgramProgress/InProgressTabData/index.js +4 -1
  28. package/dist/containers/ProgramDashboard/ProgramProgress/InProgressTabData/index.js.map +1 -1
  29. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js +4 -1
  30. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js.map +1 -1
  31. package/dist/containers/ProgramDashboard/ProgramProgress/messages.d.ts +5 -0
  32. package/dist/containers/ProgramDashboard/ProgramProgress/messages.js +6 -1
  33. package/dist/containers/ProgramDashboard/ProgramProgress/messages.js.map +1 -1
  34. package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js +5 -1
  35. package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js.map +1 -1
  36. package/dist/containers/ProgramDashboard/ProgramsList/index.js +9 -1
  37. package/dist/containers/ProgramDashboard/ProgramsList/index.js.map +1 -1
  38. package/dist/containers/ProgramsPanel/NoProgramsView/index.js +4 -1
  39. package/dist/containers/ProgramsPanel/NoProgramsView/index.js.map +1 -1
  40. package/dist/containers/SubscriptionBanner/components/SubscriptionBanner.js +19 -3
  41. package/dist/containers/SubscriptionBanner/components/SubscriptionBanner.js.map +1 -1
  42. package/dist/containers/SubscriptionInformation/components/SubscriptionInformation.js +18 -5
  43. package/dist/containers/SubscriptionInformation/components/SubscriptionInformation.js.map +1 -1
  44. package/dist/hooks/useCourseTrackingEvent.d.ts +1 -1
  45. package/dist/hooks/useCourseTrackingEvent.js.map +1 -1
  46. package/dist/hooks/useProgramTrackingEvents.d.ts +2 -0
  47. package/dist/hooks/useProgramTrackingEvents.js +9 -0
  48. package/dist/hooks/useProgramTrackingEvents.js.map +1 -0
  49. package/dist/tracking/constants.js +15 -7
  50. package/dist/tracking/constants.js.map +1 -1
  51. package/dist/tracking/index.d.ts +2 -0
  52. package/dist/tracking/index.js +2 -0
  53. package/dist/tracking/index.js.map +1 -1
  54. package/dist/tracking/trackers/course.d.ts +6 -2
  55. package/dist/tracking/trackers/course.js +7 -2
  56. package/dist/tracking/trackers/course.js.map +1 -1
  57. package/dist/tracking/trackers/program.d.ts +7 -0
  58. package/dist/tracking/trackers/program.js +27 -0
  59. package/dist/tracking/trackers/program.js.map +1 -0
  60. package/dist/tracking/trackers/subscription.d.ts +10 -0
  61. package/dist/tracking/trackers/subscription.js +12 -0
  62. package/dist/tracking/trackers/subscription.js.map +1 -0
  63. package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.js +34 -2
  64. package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/BannerEntry.js.map +1 -1
  65. package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.js +1 -1
  66. package/dist/widgets/ProgressiveProfilingQuiz/SearchPageBanners/messages.js.map +1 -1
  67. package/dist/widgets/ProgressiveProfilingQuiz/data/constants.d.ts +1 -1
  68. package/dist/widgets/ProgressiveProfilingQuiz/data/constants.js +1 -1
  69. package/dist/widgets/ProgressiveProfilingQuiz/data/constants.js.map +1 -1
  70. package/package.json +7 -1
@@ -21,7 +21,7 @@ export const BeginCourseButton = ({ cardId }) => {
21
21
  return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';
22
22
  }, [courseData.enrollment.mode, learnerData === null || learnerData === void 0 ? void 0 : learnerData.enterpriseDashboard]);
23
23
  const { disableBeginCourse } = useActionDisabledState(cardId);
24
- const handleClick = useCourseTrackingEvent(track.course.enterCourseClicked, cardId, homeUrl + execEdTrackingParam);
24
+ const handleClick = useCourseTrackingEvent(track.course.courseCardActionClicked, cardId, homeUrl + execEdTrackingParam);
25
25
  return (_jsx(ActionButton, { disabled: disableBeginCourse, as: "a", href: homeUrl + execEdTrackingParam, onClick: handleClick, children: formatMessage(messages.beginCourse) }));
26
26
  };
27
27
  BeginCourseButton.propTypes = {
@@ -1 +1 @@
1
- {"version":3,"file":"BeginCourseButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IAC9C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,CAAC;IAC/C,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/F,MAAM,EAAE,SAAS,EAAE,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,KAAI,EAAE,CAAC;QAC7D,OAAO,gBAAgB,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAC/B,MAAM,EACN,OAAO,GAAG,mBAAmB,CAC9B,CAAC;IACF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,kBAAkB,EAC5B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,OAAO,GAAG,mBAAmB,EACnC,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,GACvB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,iBAAiB,CAAC,SAAS,GAAG;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,iBAAiB,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { EXECUTIVE_EDUCATION_COURSE_MODES } from '@src/data/constants/course';\n\nimport track from '@src/tracking';\nimport { useCourseData, useCourseTrackingEvent } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const BeginCourseButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseData = useCourseData(cardId);\n const homeUrl = courseData?.courseRun?.homeUrl;\n const execEdTrackingParam = useMemo(() => {\n const isExecEd2UCourse = EXECUTIVE_EDUCATION_COURSE_MODES.includes(courseData.enrollment.mode);\n const { authOrgId } = learnerData?.enterpriseDashboard || {};\n return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';\n }, [courseData.enrollment.mode, learnerData?.enterpriseDashboard]);\n const { disableBeginCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.enterCourseClicked,\n cardId,\n homeUrl + execEdTrackingParam,\n );\n return (\n <ActionButton\n disabled={disableBeginCourse}\n as=\"a\"\n href={homeUrl + execEdTrackingParam}\n onClick={handleClick}\n >\n {formatMessage(messages.beginCourse)}\n </ActionButton>\n );\n};\nBeginCourseButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default BeginCourseButton;\n"]}
1
+ {"version":3,"file":"BeginCourseButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IAC9C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,CAAC;IAC/C,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/F,MAAM,EAAE,SAAS,EAAE,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,KAAI,EAAE,CAAC;QAC7D,OAAO,gBAAgB,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EACpC,MAAM,EACN,OAAO,GAAG,mBAAmB,CAC9B,CAAC;IACF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,kBAAkB,EAC5B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,OAAO,GAAG,mBAAmB,EACnC,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,GACvB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,iBAAiB,CAAC,SAAS,GAAG;IAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,iBAAiB,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { EXECUTIVE_EDUCATION_COURSE_MODES } from '@src/data/constants/course';\n\nimport track from '@src/tracking';\nimport { useCourseData, useCourseTrackingEvent } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const BeginCourseButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseData = useCourseData(cardId);\n const homeUrl = courseData?.courseRun?.homeUrl;\n const execEdTrackingParam = useMemo(() => {\n const isExecEd2UCourse = EXECUTIVE_EDUCATION_COURSE_MODES.includes(courseData.enrollment.mode);\n const { authOrgId } = learnerData?.enterpriseDashboard || {};\n return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';\n }, [courseData.enrollment.mode, learnerData?.enterpriseDashboard]);\n const { disableBeginCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.courseCardActionClicked,\n cardId,\n homeUrl + execEdTrackingParam,\n );\n return (\n <ActionButton\n disabled={disableBeginCourse}\n as=\"a\"\n href={homeUrl + execEdTrackingParam}\n onClick={handleClick}\n >\n {formatMessage(messages.beginCourse)}\n </ActionButton>\n );\n};\nBeginCourseButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default BeginCourseButton;\n"]}
@@ -22,7 +22,7 @@ export const ResumeButton = ({ cardId }) => {
22
22
  return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';
23
23
  }, [courseData.enrollment.mode, learnerData === null || learnerData === void 0 ? void 0 : learnerData.enterpriseDashboard]);
24
24
  const { disableResumeCourse } = useActionDisabledState(cardId);
25
- const handleClick = useCourseTrackingEvent(track.course.enterCourseClicked, cardId, resumeUrl + execEdTrackingParam);
25
+ const handleClick = useCourseTrackingEvent(track.course.courseCardActionClicked, cardId, resumeUrl + execEdTrackingParam);
26
26
  return (_jsx(ActionButton, { disabled: disableResumeCourse, as: "a", href: resumeUrl + execEdTrackingParam, onClick: handleClick, children: formatMessage(messages.resume) }));
27
27
  };
28
28
  ResumeButton.propTypes = {
@@ -1 +1 @@
1
- {"version":3,"file":"ResumeButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IACzC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/F,MAAM,EAAE,SAAS,EAAE,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,KAAI,EAAE,CAAC;QAC7D,OAAO,gBAAgB,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,mBAAmB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAC/B,MAAM,EACN,SAAS,GAAG,mBAAmB,CAChC,CAAC;IAEF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,mBAAmB,EAC7B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,SAAS,GAAG,mBAAmB,EACrC,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAClB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,YAAY,CAAC,SAAS,GAAG;IACvB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,YAAY,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { EXECUTIVE_EDUCATION_COURSE_MODES } from '@src/data/constants/course';\nimport { baseAppUrl } from '@src/data/services/lms/urls';\nimport track from '@src/tracking';\nimport { useCourseTrackingEvent, useCourseData } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const ResumeButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseData = useCourseData(cardId);\n const resumeUrl = baseAppUrl(courseData?.courseRun?.resumeUrl);\n const execEdTrackingParam = useMemo(() => {\n const isExecEd2UCourse = EXECUTIVE_EDUCATION_COURSE_MODES.includes(courseData.enrollment.mode);\n const { authOrgId } = learnerData?.enterpriseDashboard || {};\n return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';\n }, [courseData.enrollment.mode, learnerData?.enterpriseDashboard]);\n const { disableResumeCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.enterCourseClicked,\n cardId,\n resumeUrl + execEdTrackingParam,\n );\n\n return (\n <ActionButton\n disabled={disableResumeCourse}\n as=\"a\"\n href={resumeUrl + execEdTrackingParam}\n onClick={handleClick}\n >\n {formatMessage(messages.resume)}\n </ActionButton>\n );\n};\nResumeButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default ResumeButton;\n"]}
1
+ {"version":3,"file":"ResumeButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/ResumeButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IACzC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/F,MAAM,EAAE,SAAS,EAAE,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,KAAI,EAAE,CAAC;QAC7D,OAAO,gBAAgB,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,mBAAmB,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,mBAAmB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EACpC,MAAM,EACN,SAAS,GAAG,mBAAmB,CAChC,CAAC;IAEF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,mBAAmB,EAC7B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,SAAS,GAAG,mBAAmB,EACrC,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAClB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,YAAY,CAAC,SAAS,GAAG;IACvB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,YAAY,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { EXECUTIVE_EDUCATION_COURSE_MODES } from '@src/data/constants/course';\nimport { baseAppUrl } from '@src/data/services/lms/urls';\nimport track from '@src/tracking';\nimport { useCourseTrackingEvent, useCourseData } from '@src/hooks';\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const ResumeButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseData = useCourseData(cardId);\n const resumeUrl = baseAppUrl(courseData?.courseRun?.resumeUrl);\n const execEdTrackingParam = useMemo(() => {\n const isExecEd2UCourse = EXECUTIVE_EDUCATION_COURSE_MODES.includes(courseData.enrollment.mode);\n const { authOrgId } = learnerData?.enterpriseDashboard || {};\n return isExecEd2UCourse ? `?org_id=${authOrgId}` : '';\n }, [courseData.enrollment.mode, learnerData?.enterpriseDashboard]);\n const { disableResumeCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.courseCardActionClicked,\n cardId,\n resumeUrl + execEdTrackingParam,\n );\n\n return (\n <ActionButton\n disabled={disableResumeCourse}\n as=\"a\"\n href={resumeUrl + execEdTrackingParam}\n onClick={handleClick}\n >\n {formatMessage(messages.resume)}\n </ActionButton>\n );\n};\nResumeButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default ResumeButton;\n"]}
@@ -13,7 +13,7 @@ export const ViewCourseButton = ({ cardId }) => {
13
13
  const courseData = useCourseData(cardId);
14
14
  const homeUrl = (_a = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _a === void 0 ? void 0 : _a.homeUrl;
15
15
  const { disableViewCourse } = useActionDisabledState(cardId);
16
- const handleClick = useCourseTrackingEvent(track.course.enterCourseClicked, cardId, homeUrl);
16
+ const handleClick = useCourseTrackingEvent(track.course.courseCardActionClicked, cardId, homeUrl);
17
17
  return (_jsx(ActionButton, { disabled: disableViewCourse, as: "a", href: homeUrl, onClick: handleClick, children: formatMessage(messages.viewCourse) }));
18
18
  };
19
19
  ViewCourseButton.propTypes = {
@@ -1 +1 @@
1
- {"version":3,"file":"ViewCourseButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,CAAC;IAC/C,MAAM,EAAE,iBAAiB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAC/B,MAAM,EACN,OAAO,CACR,CAAC;IACF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,GACtB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,gBAAgB,CAAC","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\n\nimport track from '@src/tracking';\nimport { useCourseTrackingEvent, useCourseData } from '@src/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const ViewCourseButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const courseData = useCourseData(cardId);\n const homeUrl = courseData?.courseRun?.homeUrl;\n const { disableViewCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.enterCourseClicked,\n cardId,\n homeUrl,\n );\n return (\n <ActionButton\n disabled={disableViewCourse}\n as=\"a\"\n href={homeUrl}\n onClick={handleClick}\n >\n {formatMessage(messages.viewCourse)}\n </ActionButton>\n );\n};\nViewCourseButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default ViewCourseButton;\n"]}
1
+ {"version":3,"file":"ViewCourseButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,CAAC;IAC/C,MAAM,EAAE,iBAAiB,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EACpC,MAAM,EACN,OAAO,CACR,CAAC;IACF,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,GACtB,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AACF,eAAe,gBAAgB,CAAC","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\n\nimport track from '@src/tracking';\nimport { useCourseTrackingEvent, useCourseData } from '@src/hooks';\nimport useActionDisabledState from '../hooks';\nimport ActionButton from './ActionButton';\nimport messages from './messages';\n\nexport const ViewCourseButton = ({ cardId }) => {\n const { formatMessage } = useIntl();\n const courseData = useCourseData(cardId);\n const homeUrl = courseData?.courseRun?.homeUrl;\n const { disableViewCourse } = useActionDisabledState(cardId);\n\n const handleClick = useCourseTrackingEvent(\n track.course.courseCardActionClicked,\n cardId,\n homeUrl,\n );\n return (\n <ActionButton\n disabled={disableViewCourse}\n as=\"a\"\n href={homeUrl}\n onClick={handleClick}\n >\n {formatMessage(messages.viewCourse)}\n </ActionButton>\n );\n};\nViewCourseButton.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\nexport default ViewCourseButton;\n"]}
@@ -7,6 +7,8 @@ import { useActionWithModal } from '../../../../hooks';
7
7
  import { learnerDashboardQueryKeys } from '../../../../data/hooks/queryKeys';
8
8
  import messages from './messages';
9
9
  import ConfirmCourseUpgradeActionModal from '../../../../components/ConfirmCourseUpgradeActionModal';
10
+ import { eventNames } from '../../../../tracking/constants';
11
+ import { courseEventTracker } from '../../../../tracking/trackers/course';
10
12
  export default function CourseUpgradeButton({ title, courseId, }) {
11
13
  const { formatMessage } = useIntl();
12
14
  const queryClient = useQueryClient();
@@ -17,7 +19,12 @@ export default function CourseUpgradeButton({ title, courseId, }) {
17
19
  queryKey: learnerDashboardQueryKeys.initializeSubsCourseDashboard(),
18
20
  }),
19
21
  });
20
- return (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline-dark", size: "md", onClick: trigger, disabled: !courseId || isTriggering || isPending, children: formatMessage(messages.upgradeAction) }), _jsx(ConfirmCourseUpgradeActionModal, { isLoading: isTriggering, isOpen: isModalOpen || isTriggering, title: formatMessage(messages.upgradeCourseCompleteText, {
22
+ // Handle the upgrade button click, triggering the course upgrade action and tracking the event.
23
+ const handleUpgradeClick = () => {
24
+ courseEventTracker(eventNames.courseCardActionClicked, courseId)();
25
+ trigger();
26
+ };
27
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline-dark", size: "md", onClick: handleUpgradeClick, disabled: !courseId || isTriggering || isPending, children: formatMessage(messages.upgradeAction) }), _jsx(ConfirmCourseUpgradeActionModal, { isLoading: isTriggering, isOpen: isModalOpen || isTriggering, title: formatMessage(messages.upgradeCourseCompleteText, {
21
28
  title,
22
29
  }), loadingTitle: formatMessage(messages.upgradeCourseloadingText), onReload: handleCancelAction, reloadLabel: formatMessage(messages.closeAction), navigateLabel: "Resume Course", navigateTo: `/courses/${courseId}` })] }));
23
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CourseUpgradeButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,+BAA+B,MAAM,iDAAiD,CAAC;AAO9F,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,KAAK,EACL,QAAQ,GACiB;IACzB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAEhE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,kBAAkB,CACnF,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAC7C;QACE,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,MAAK,IAAI;QACzD,QAAQ,EAAE,GAAG,EAAE,CACb,WAAW,CAAC,iBAAiB,CAAC;YAC5B,QAAQ,EAAE,yBAAyB,CAAC,6BAA6B,EAAE;SACpE,CAAC;KACL,CACF,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,MAAM,IACL,OAAO,EAAC,cAAc,EACtB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,QAAQ,IAAI,YAAY,IAAI,SAAS,YAE/C,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAC/B,EAET,KAAC,+BAA+B,IAC9B,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,WAAW,IAAI,YAAY,EACnC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE;oBACvD,KAAK;iBACN,CAAC,EACF,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAC9D,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAChD,aAAa,EAAC,eAAe,EAC7B,UAAU,EAAE,YAAY,QAAQ,EAAE,GAClC,IACD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import { useQueryClient } from '@tanstack/react-query';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { useUpgradeCourseEnrollment } from '@src/data/hooks/mutationHooks';\nimport { useActionWithModal } from '@src/hooks';\nimport { learnerDashboardQueryKeys } from '@src/data/hooks/queryKeys';\nimport messages from './messages';\nimport ConfirmCourseUpgradeActionModal from '@src/components/ConfirmCourseUpgradeActionModal';\n\ninterface CourseUpgradeButtonProps {\n title: string,\n courseId: string,\n}\n\nexport default function CourseUpgradeButton({\n title,\n courseId,\n}: CourseUpgradeButtonProps) {\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { mutateAsync, isPending } = useUpgradeCourseEnrollment();\n\n const { isTriggering, trigger, handleCancelAction, isModalOpen } = useActionWithModal(\n () => mutateAsync({ courseRunKey: courseId }),\n {\n shouldOpenModal: (response) => response?.success === true,\n onCancel: () =>\n queryClient.invalidateQueries({\n queryKey: learnerDashboardQueryKeys.initializeSubsCourseDashboard(),\n }),\n },\n );\n\n return (\n <>\n <Button\n variant=\"outline-dark\"\n size=\"md\"\n onClick={trigger}\n disabled={!courseId || isTriggering || isPending}\n >\n {formatMessage(messages.upgradeAction)}\n </Button>\n\n <ConfirmCourseUpgradeActionModal\n isLoading={isTriggering}\n isOpen={isModalOpen || isTriggering}\n title={formatMessage(messages.upgradeCourseCompleteText, {\n title,\n })}\n loadingTitle={formatMessage(messages.upgradeCourseloadingText)}\n onReload={handleCancelAction}\n reloadLabel={formatMessage(messages.closeAction)}\n navigateLabel=\"Resume Course\"\n navigateTo={`/courses/${courseId}`}\n />\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"CourseUpgradeButton.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/CourseUpgradeButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,+BAA+B,MAAM,iDAAiD,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAOnE,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,KAAK,EACL,QAAQ,GACiB;IACzB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAEhE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,kBAAkB,CACnF,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAC7C;QACE,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,MAAK,IAAI;QACzD,QAAQ,EAAE,GAAG,EAAE,CACb,WAAW,CAAC,iBAAiB,CAAC;YAC5B,QAAQ,EAAE,yBAAyB,CAAC,6BAA6B,EAAE;SACpE,CAAC;KACL,CACF,CAAC;IAEF,gGAAgG;IAChG,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,kBAAkB,CAAC,UAAU,CAAC,uBAAuB,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,MAAM,IACL,OAAO,EAAC,cAAc,EACtB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,CAAC,QAAQ,IAAI,YAAY,IAAI,SAAS,YAE/C,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAC/B,EAET,KAAC,+BAA+B,IAC9B,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,WAAW,IAAI,YAAY,EACnC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE;oBACvD,KAAK;iBACN,CAAC,EACF,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAC9D,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAChD,aAAa,EAAC,eAAe,EAC7B,UAAU,EAAE,YAAY,QAAQ,EAAE,GAClC,IACD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import { useQueryClient } from '@tanstack/react-query';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { useUpgradeCourseEnrollment } from '@src/data/hooks/mutationHooks';\nimport { useActionWithModal } from '@src/hooks';\nimport { learnerDashboardQueryKeys } from '@src/data/hooks/queryKeys';\nimport messages from './messages';\nimport ConfirmCourseUpgradeActionModal from '@src/components/ConfirmCourseUpgradeActionModal';\nimport { eventNames } from '@src/tracking/constants';\nimport { courseEventTracker } from '@src/tracking/trackers/course';\n\ninterface CourseUpgradeButtonProps {\n title: string,\n courseId: string,\n}\n\nexport default function CourseUpgradeButton({\n title,\n courseId,\n}: CourseUpgradeButtonProps) {\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const { mutateAsync, isPending } = useUpgradeCourseEnrollment();\n\n const { isTriggering, trigger, handleCancelAction, isModalOpen } = useActionWithModal(\n () => mutateAsync({ courseRunKey: courseId }),\n {\n shouldOpenModal: (response) => response?.success === true,\n onCancel: () =>\n queryClient.invalidateQueries({\n queryKey: learnerDashboardQueryKeys.initializeSubsCourseDashboard(),\n }),\n },\n );\n\n // Handle the upgrade button click, triggering the course upgrade action and tracking the event.\n const handleUpgradeClick = () => {\n courseEventTracker(eventNames.courseCardActionClicked, courseId)();\n trigger();\n };\n\n return (\n <>\n <Button\n variant=\"outline-dark\"\n size=\"md\"\n onClick={handleUpgradeClick}\n disabled={!courseId || isTriggering || isPending}\n >\n {formatMessage(messages.upgradeAction)}\n </Button>\n\n <ConfirmCourseUpgradeActionModal\n isLoading={isTriggering}\n isOpen={isModalOpen || isTriggering}\n title={formatMessage(messages.upgradeCourseCompleteText, {\n title,\n })}\n loadingTitle={formatMessage(messages.upgradeCourseloadingText)}\n onReload={handleCancelAction}\n reloadLabel={formatMessage(messages.closeAction)}\n navigateLabel=\"Resume Course\"\n navigateTo={`/courses/${courseId}`}\n />\n </>\n );\n}\n"]}
@@ -1,9 +1,11 @@
1
1
  export default FindCourseBanner;
2
- declare function FindCourseBanner({ findCourseUrl }: {
2
+ declare function FindCourseBanner({ cardId, findCourseUrl }: {
3
+ cardId: any;
3
4
  findCourseUrl: any;
4
5
  }): import("react/jsx-runtime").JSX.Element;
5
6
  declare namespace FindCourseBanner {
6
7
  namespace propTypes {
8
+ let cardId: PropTypes.Validator<string>;
7
9
  let findCourseUrl: PropTypes.Requireable<string>;
8
10
  }
9
11
  }
@@ -2,12 +2,16 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import PropTypes from 'prop-types';
3
3
  import { useIntl } from '@openedx/frontend-base';
4
4
  import { Button, Card, Col, Row } from '@openedx/paragon';
5
+ import track from '../../../../tracking';
6
+ import { useCourseTrackingEvent } from '../../../../hooks';
5
7
  import messages from './messages';
6
- const FindCourseBanner = ({ findCourseUrl }) => {
8
+ const FindCourseBanner = ({ cardId, findCourseUrl }) => {
7
9
  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) }) })] }) }));
10
+ const handleClick = useCourseTrackingEvent(track.course.courseCardActionClicked, cardId, findCourseUrl);
11
+ 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, onClick: handleClick, "data-testid": "find-course-button", children: formatMessage(messages.findCourseAction) }) })] }) }));
9
12
  };
10
13
  FindCourseBanner.propTypes = {
14
+ cardId: PropTypes.string.isRequired,
11
15
  findCourseUrl: PropTypes.string,
12
16
  };
13
17
  export default FindCourseBanner;
@@ -1 +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"]}
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,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE;IACrD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EACpC,MAAM,EACN,aAAa,CACd,CAAC;IAEF,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,EAChC,OAAO,EAAE,WAAW,iBACR,oBAAoB,YAE/B,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAClC,GACL,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,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 track from '@src/tracking';\nimport { useCourseTrackingEvent } from '@src/hooks';\nimport messages from './messages';\n\nconst FindCourseBanner = ({ cardId, findCourseUrl }) => {\n const { formatMessage } = useIntl();\n \n const handleClick = useCourseTrackingEvent(\n track.course.courseCardActionClicked,\n cardId,\n findCourseUrl,\n );\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 onClick={handleClick}\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 cardId: PropTypes.string.isRequired,\n findCourseUrl: PropTypes.string,\n};\n\nexport default FindCourseBanner;\n"]}
@@ -2,9 +2,10 @@ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-run
2
2
  import { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';
3
3
  import { useMemo } from 'react';
4
4
  import { getSiteConfig, useIntl } from '@openedx/frontend-base';
5
- import { utilHooks, useCourseData } from '../../../../hooks';
5
+ import { utilHooks, useCourseData, useCourseTrackingEvent } from '../../../../hooks';
6
6
  import messages from './messages';
7
7
  import PropTypes from 'prop-types';
8
+ import track from '../../../../tracking';
8
9
  export const ViewCertificateBanner = ({ cardId }) => {
9
10
  const courseData = useCourseData(cardId);
10
11
  const { isEarned = false, isVerified = false, mode = '', certPreviewUrl = '', issuedDate = '', } = useMemo(() => {
@@ -20,6 +21,7 @@ export const ViewCertificateBanner = ({ cardId }) => {
20
21
  const { formatMessage } = useIntl();
21
22
  const formatDate = utilHooks.useFormatDate();
22
23
  const showVerifiedBanner = isEarned && isVerified && mode === 'verified';
24
+ const handleClick = useCourseTrackingEvent(track.course.courseCardExternalActionClicked, cardId);
23
25
  return (_jsx(Card.Status, { variant: "warning", className: "bg-light-200 verified-banner", "data-testid": "course-card-view-certificate-banner", children: _jsxs(Row, { className: "align-items-sm-center mt-1", children: [_jsx(Col, { xs: 12, sm: true, className: "pe-sm-3", children: _jsxs("p", { className: "mb-0 font-weight-semi-bold", children: [_jsx("span", { children: _jsxs("b", { children: [formatMessage(messages.congratulationsText), " "] }) }), showVerifiedBanner ? (_jsx(_Fragment, { children: formatMessage(messages.verifiedBannerText, {
24
26
  date: formatDate(issuedDate),
25
27
  }) }))
@@ -27,9 +29,9 @@ export const ViewCertificateBanner = ({ cardId }) => {
27
29
  date: formatDate(issuedDate),
28
30
  }) }))] }) }), _jsxs(Col, { xs: 12, sm: "auto", className: "d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0", children: [_jsx(Button, { variant: "outline-brand", size: "md", href: certPreviewUrl
29
31
  ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`
30
- : undefined, "data-testid": "view-certificate-button", className: "view-certificate-button d-none d-lg-inline-flex", target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.viewCertificate) }), _jsx(Hyperlink, { destination: certPreviewUrl
32
+ : undefined, "data-testid": "view-certificate-button", onClick: handleClick, className: "view-certificate-button d-none d-lg-inline-flex", target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.viewCertificate) }), _jsx(Hyperlink, { destination: certPreviewUrl
31
33
  ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`
32
- : undefined, target: "_blank", rel: "noopener noreferrer", className: "d-lg-none view-certificate-link", "data-testid": "view-certificate-link", isInline: true, children: formatMessage(messages.viewCertificate) })] })] }) }));
34
+ : undefined, target: "_blank", rel: "noopener noreferrer", className: "d-lg-none view-certificate-link", "data-testid": "view-certificate-link", onClick: handleClick, isInline: true, children: formatMessage(messages.viewCertificate) })] })] }) }));
33
35
  };
34
36
  ViewCertificateBanner.propTypes = {
35
37
  cardId: PropTypes.string.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewCertificateBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';\nimport { useMemo } from 'react';\nimport { getSiteConfig, useIntl } from '@openedx/frontend-base';\nimport { utilHooks, useCourseData } from '@src/hooks';\nimport messages from './messages';\nimport PropTypes from 'prop-types';\n\nexport const ViewCertificateBanner = ({ cardId }) => {\n const courseData = useCourseData(cardId);\n const {\n isEarned = false,\n isVerified = false,\n mode = '',\n certPreviewUrl = '',\n issuedDate = '',\n } = useMemo(() => ({\n isEarned: courseData?.certificate?.isEarned || false,\n isVerified: courseData?.enrollment?.isVerified || false,\n mode: courseData?.enrollment?.mode || '',\n certPreviewUrl: courseData?.certificate?.certPreviewUrl || '',\n issuedDate: courseData?.certificate?.issuedDate || '',\n }), [courseData]);\n\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n\n const showVerifiedBanner = isEarned && isVerified && mode === 'verified';\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200 verified-banner\" data-testid=\"course-card-view-certificate-banner\">\n <Row className=\"align-items-sm-center mt-1\">\n <Col xs={12} sm className=\"pe-sm-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n <span><b>{formatMessage(messages.congratulationsText)} </b></span>\n {\n showVerifiedBanner ? (\n <>\n {formatMessage(messages.verifiedBannerText, {\n date: formatDate(issuedDate),\n })}\n </>\n )\n : (\n <>\n {formatMessage(messages.completedAndPassedBannerText, {\n date: formatDate(issuedDate),\n })}\n </>\n )\n }\n </p>\n </Col>\n <Col xs={12} sm=\"auto\" className=\"d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0\">\n {/* Desktop: outlined button */}\n <Button\n variant=\"outline-brand\"\n size=\"md\"\n href={certPreviewUrl\n ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`\n : undefined}\n data-testid=\"view-certificate-button\"\n className=\"view-certificate-button d-none d-lg-inline-flex\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.viewCertificate)}\n </Button>\n {/* Tablet/Mobile: plain text link */}\n <Hyperlink\n destination={certPreviewUrl\n ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`\n : undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"d-lg-none view-certificate-link\"\n data-testid=\"view-certificate-link\"\n isInline\n >\n {formatMessage(messages.viewCertificate)}\n </Hyperlink>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewCertificateBanner.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\n\nexport default ViewCertificateBanner;\n"]}
1
+ {"version":3,"file":"ViewCertificateBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/ViewCertificateBanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';\nimport { useMemo } from 'react';\nimport { getSiteConfig, useIntl } from '@openedx/frontend-base';\nimport { utilHooks, useCourseData, useCourseTrackingEvent } from '@src/hooks';\nimport messages from './messages';\nimport PropTypes from 'prop-types';\nimport track from '@src/tracking';\n\nexport const ViewCertificateBanner = ({ cardId }) => {\n const courseData = useCourseData(cardId);\n const {\n isEarned = false,\n isVerified = false,\n mode = '',\n certPreviewUrl = '',\n issuedDate = '',\n } = useMemo(() => ({\n isEarned: courseData?.certificate?.isEarned || false,\n isVerified: courseData?.enrollment?.isVerified || false,\n mode: courseData?.enrollment?.mode || '',\n certPreviewUrl: courseData?.certificate?.certPreviewUrl || '',\n issuedDate: courseData?.certificate?.issuedDate || '',\n }), [courseData]);\n\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n\n const showVerifiedBanner = isEarned && isVerified && mode === 'verified';\n\n const handleClick = useCourseTrackingEvent(track.course.courseCardExternalActionClicked, cardId);\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200 verified-banner\" data-testid=\"course-card-view-certificate-banner\">\n <Row className=\"align-items-sm-center mt-1\">\n <Col xs={12} sm className=\"pe-sm-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n <span><b>{formatMessage(messages.congratulationsText)} </b></span>\n {\n showVerifiedBanner ? (\n <>\n {formatMessage(messages.verifiedBannerText, {\n date: formatDate(issuedDate),\n })}\n </>\n )\n : (\n <>\n {formatMessage(messages.completedAndPassedBannerText, {\n date: formatDate(issuedDate),\n })}\n </>\n )\n }\n </p>\n </Col>\n <Col xs={12} sm=\"auto\" className=\"d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0\">\n {/* Desktop: outlined button */}\n <Button\n variant=\"outline-brand\"\n size=\"md\"\n href={certPreviewUrl\n ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`\n : undefined}\n data-testid=\"view-certificate-button\"\n onClick={handleClick}\n className=\"view-certificate-button d-none d-lg-inline-flex\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.viewCertificate)}\n </Button>\n {/* Tablet/Mobile: plain text link */}\n <Hyperlink\n destination={certPreviewUrl\n ? `${getSiteConfig().lmsBaseUrl}${certPreviewUrl}`\n : undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"d-lg-none view-certificate-link\"\n data-testid=\"view-certificate-link\"\n onClick={handleClick}\n isInline\n >\n {formatMessage(messages.viewCertificate)}\n </Hyperlink>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewCertificateBanner.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\n\nexport default ViewCertificateBanner;\n"]}
@@ -1,9 +1,11 @@
1
1
  export default ViewCourseDetailBanner;
2
- declare function ViewCourseDetailBanner({ viewCourseDetailUrl }: {
2
+ declare function ViewCourseDetailBanner({ cardId, viewCourseDetailUrl }: {
3
+ cardId: any;
3
4
  viewCourseDetailUrl: any;
4
5
  }): import("react/jsx-runtime").JSX.Element;
5
6
  declare namespace ViewCourseDetailBanner {
6
7
  namespace propTypes {
8
+ let cardId: PropTypes.Validator<string>;
7
9
  let viewCourseDetailUrl: PropTypes.Requireable<string>;
8
10
  }
9
11
  }
@@ -2,12 +2,16 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import PropTypes from 'prop-types';
3
3
  import { useIntl } from '@openedx/frontend-base';
4
4
  import { Button, Card, Col, Row } from '@openedx/paragon';
5
+ import track from '../../../../tracking';
6
+ import { useCourseTrackingEvent } from '../../../../hooks';
5
7
  import messages from './messages';
6
- const ViewCourseDetailBanner = ({ viewCourseDetailUrl }) => {
8
+ const ViewCourseDetailBanner = ({ cardId, viewCourseDetailUrl }) => {
7
9
  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) }) })] }) }));
10
+ const handleClick = useCourseTrackingEvent(track.course.courseCardActionClicked, cardId, viewCourseDetailUrl);
11
+ 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", onClick: handleClick, children: formatMessage(messages.viewCourseDetailAction) }) })] }) }));
9
12
  };
10
13
  ViewCourseDetailBanner.propTypes = {
14
+ cardId: PropTypes.string.isRequired,
11
15
  viewCourseDetailUrl: PropTypes.string,
12
16
  };
13
17
  export default ViewCourseDetailBanner;
@@ -1 +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
+ {"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;AAC1D,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,sBAAsB,GAAG,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE;IACjE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,WAAW,GAAG,sBAAsB,CACxC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EACpC,MAAM,EACN,mBAAmB,CACpB,CAAC;IAEF,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,EACvC,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GACxC,GACL,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,sBAAsB,CAAC,SAAS,GAAG;IACjC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACnC,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';\nimport track from '@src/tracking';\nimport { useCourseTrackingEvent } from '@src/hooks';\n\nimport messages from './messages';\n\nconst ViewCourseDetailBanner = ({ cardId, viewCourseDetailUrl }) => {\n const { formatMessage } = useIntl();\n\n const handleClick = useCourseTrackingEvent(\n track.course.courseCardActionClicked,\n cardId,\n viewCourseDetailUrl,\n );\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 onClick={handleClick}\n >\n {formatMessage(messages.viewCourseDetailAction)}\n </Button>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewCourseDetailBanner.propTypes = {\n cardId: PropTypes.string.isRequired,\n viewCourseDetailUrl: PropTypes.string,\n};\n\nexport default ViewCourseDetailBanner;\n"]}
@@ -3,8 +3,9 @@ import PropTypes from 'prop-types';
3
3
  import { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';
4
4
  import { useMemo } from 'react';
5
5
  import { useIntl } from '@openedx/frontend-base';
6
- import { utilHooks, useCourseData } from '../../../../hooks';
6
+ import { utilHooks, useCourseData, useCourseTrackingEvent } from '../../../../hooks';
7
7
  import messages from './messages';
8
+ import track from '../../../../tracking';
8
9
  export const ViewGradesBanner = ({ cardId }) => {
9
10
  const courseData = useCourseData(cardId);
10
11
  const { endDate = '', } = useMemo(() => {
@@ -16,7 +17,8 @@ export const ViewGradesBanner = ({ cardId }) => {
16
17
  const gradesLink = 'https://courses.edx.org/grades/'; // TODO: Update this when more information is available
17
18
  const { formatMessage } = useIntl();
18
19
  const formatDate = utilHooks.useFormatDate();
19
- return (_jsx(Card.Status, { variant: "warning", className: "bg-light-200 verified-banner", "data-testid": "course-card-view-grades-banner", children: _jsxs(Row, { className: "align-items-sm-center mt-1", children: [_jsx(Col, { xs: 12, sm: true, className: "pe-sm-3", children: _jsx("p", { className: "mb-0 font-weight-semi-bold", children: _jsx("span", { children: formatMessage(messages.courseCompletedBannerText, { date: formatDate(endDate) }) }) }) }), _jsxs(Col, { xs: 12, sm: "auto", className: "d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0", children: [_jsx(Button, { variant: "outline-brand", size: "md", href: gradesLink, "data-testid": "view-grades-button", className: "view-grades-button d-none d-lg-inline-flex", target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.viewGradesText) }), _jsx(Hyperlink, { destination: gradesLink, target: "_blank", rel: "noopener noreferrer", className: "d-lg-none view-grades-link", "data-testid": "view-grades-link", isInline: true, children: formatMessage(messages.viewGradesText) })] })] }) }));
20
+ const handleClick = useCourseTrackingEvent(track.course.courseCardExternalActionClicked, cardId);
21
+ return (_jsx(Card.Status, { variant: "warning", className: "bg-light-200 verified-banner", "data-testid": "course-card-view-grades-banner", children: _jsxs(Row, { className: "align-items-sm-center mt-1", children: [_jsx(Col, { xs: 12, sm: true, className: "pe-sm-3", children: _jsx("p", { className: "mb-0 font-weight-semi-bold", children: _jsx("span", { children: formatMessage(messages.courseCompletedBannerText, { date: formatDate(endDate) }) }) }) }), _jsxs(Col, { xs: 12, sm: "auto", className: "d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0", children: [_jsx(Button, { variant: "outline-brand", size: "md", href: gradesLink, onClick: handleClick, "data-testid": "view-grades-button", className: "view-grades-button d-none d-lg-inline-flex", target: "_blank", rel: "noopener noreferrer", role: "link", children: formatMessage(messages.viewGradesText) }), _jsx(Hyperlink, { destination: gradesLink, onClick: handleClick, target: "_blank", rel: "noopener noreferrer", className: "d-lg-none view-grades-link", "data-testid": "view-grades-link", isInline: true, children: formatMessage(messages.viewGradesText) })] })] }) }));
20
22
  };
21
23
  ViewGradesBanner.propTypes = {
22
24
  cardId: PropTypes.string.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewGradesBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,EACJ,OAAO,GAAG,EAAE,GACb,GAAG,OAAO,CAAC,GAAG,EAAE;;QAAC,OAAA,CAAC;YACjB,OAAO,EAAE,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,KAAI,EAAE;SAC9C,CAAC,CAAA;KAAA,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAElB,MAAM,UAAU,GAAG,iCAAiC,CAAC,CAAC,uDAAuD;IAE7G,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAE7C,OAAO,CACL,KAAC,IAAI,CAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,8BAA8B,iBAAa,gCAAgC,YAClH,MAAC,GAAG,IAAC,SAAS,EAAC,4BAA4B,aACzC,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAC,SAAS,EAAC,SAAS,YACjC,YAAG,SAAS,EAAC,4BAA4B,YACvC,yBAAO,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAQ,GAC7F,GACA,EACN,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,MAAM,EAAC,SAAS,EAAC,kEAAkE,aAEjG,KAAC,MAAM,IACL,OAAO,EAAC,eAAe,EACvB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,UAAU,iBACJ,oBAAoB,EAChC,SAAS,EAAC,4CAA4C,EACtD,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,IAAI,EAAC,MAAM,YAEV,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAChC,EAET,KAAC,SAAS,IACR,WAAW,EAAE,UAAU,EACvB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,4BAA4B,iBAC1B,kBAAkB,EAC9B,QAAQ,kBAEP,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAC7B,IACR,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';\nimport { useMemo } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { utilHooks, useCourseData } from '@src/hooks';\nimport messages from './messages';\n\nexport const ViewGradesBanner = ({ cardId }) => {\n const courseData = useCourseData(cardId);\n const {\n endDate = '',\n } = useMemo(() => ({\n endDate: courseData?.courseRun?.endDate || '',\n }), [courseData]);\n\n const gradesLink = 'https://courses.edx.org/grades/'; // TODO: Update this when more information is available\n\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200 verified-banner\" data-testid=\"course-card-view-grades-banner\">\n <Row className=\"align-items-sm-center mt-1\">\n <Col xs={12} sm className=\"pe-sm-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n <span>{formatMessage(messages.courseCompletedBannerText, { date: formatDate(endDate) })}</span>\n </p>\n </Col>\n <Col xs={12} sm=\"auto\" className=\"d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0\">\n {/* Desktop: outlined button */}\n <Button\n variant=\"outline-brand\"\n size=\"md\"\n href={gradesLink} // TODO: Update this when more information is available\n data-testid=\"view-grades-button\"\n className=\"view-grades-button d-none d-lg-inline-flex\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.viewGradesText)}\n </Button>\n {/* Tablet/Mobile: plain text link */}\n <Hyperlink\n destination={gradesLink} // TODO: Update this when more information is available\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"d-lg-none view-grades-link\"\n data-testid=\"view-grades-link\"\n isInline\n >\n {formatMessage(messages.viewGradesText)}\n </Hyperlink>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewGradesBanner.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\n\nexport default ViewGradesBanner;\n"]}
1
+ {"version":3,"file":"ViewGradesBanner.js","sourceRoot":"","sources":["../../../../../src/containers/CourseCard/components/CourseCardBanners/ViewGradesBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,MAAM,eAAe,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,EACJ,OAAO,GAAG,EAAE,GACb,GAAG,OAAO,CAAC,GAAG,EAAE;;QAAC,OAAA,CAAC;YACjB,OAAO,EAAE,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,0CAAE,OAAO,KAAI,EAAE;SAC9C,CAAC,CAAA;KAAA,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAElB,MAAM,UAAU,GAAG,iCAAiC,CAAC,CAAC,uDAAuD;IAE7G,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;IAEjG,OAAO,CACL,KAAC,IAAI,CAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,8BAA8B,iBAAa,gCAAgC,YAClH,MAAC,GAAG,IAAC,SAAS,EAAC,4BAA4B,aACzC,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAC,SAAS,EAAC,SAAS,YACjC,YAAG,SAAS,EAAC,4BAA4B,YACvC,yBAAO,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAQ,GAC7F,GACA,EACN,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,MAAM,EAAC,SAAS,EAAC,kEAAkE,aAEjG,KAAC,MAAM,IACL,OAAO,EAAC,eAAe,EACvB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,WAAW,iBACR,oBAAoB,EAChC,SAAS,EAAC,4CAA4C,EACtD,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,IAAI,EAAC,MAAM,YAEV,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAChC,EAET,KAAC,SAAS,IACR,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,4BAA4B,iBAC1B,kBAAkB,EAC9B,QAAQ,kBAEP,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAC7B,IACR,IACF,GACM,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,gBAAgB,CAAC,SAAS,GAAG;IAC3B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;CACpC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport { Hyperlink, Button, Card, Row, Col } from '@openedx/paragon';\nimport { useMemo } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { utilHooks, useCourseData, useCourseTrackingEvent } from '@src/hooks';\nimport messages from './messages';\nimport track from '@src/tracking';\n\nexport const ViewGradesBanner = ({ cardId }) => {\n const courseData = useCourseData(cardId);\n const {\n endDate = '',\n } = useMemo(() => ({\n endDate: courseData?.courseRun?.endDate || '',\n }), [courseData]);\n\n const gradesLink = 'https://courses.edx.org/grades/'; // TODO: Update this when more information is available\n\n const { formatMessage } = useIntl();\n const formatDate = utilHooks.useFormatDate();\n\n const handleClick = useCourseTrackingEvent(track.course.courseCardExternalActionClicked, cardId);\n\n return (\n <Card.Status variant=\"warning\" className=\"bg-light-200 verified-banner\" data-testid=\"course-card-view-grades-banner\">\n <Row className=\"align-items-sm-center mt-1\">\n <Col xs={12} sm className=\"pe-sm-3\">\n <p className=\"mb-0 font-weight-semi-bold\">\n <span>{formatMessage(messages.courseCompletedBannerText, { date: formatDate(endDate) })}</span>\n </p>\n </Col>\n <Col xs={12} sm=\"auto\" className=\"d-flex justify-content-start justify-content-sm-end mt-2 mt-sm-0\">\n {/* Desktop: outlined button */}\n <Button\n variant=\"outline-brand\"\n size=\"md\"\n href={gradesLink} // TODO: Update this when more information is available\n onClick={handleClick}\n data-testid=\"view-grades-button\"\n className=\"view-grades-button d-none d-lg-inline-flex\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"link\"\n >\n {formatMessage(messages.viewGradesText)}\n </Button>\n {/* Tablet/Mobile: plain text link */}\n <Hyperlink\n destination={gradesLink} // TODO: Update this when more information is available\n onClick={handleClick}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"d-lg-none view-grades-link\"\n data-testid=\"view-grades-link\"\n isInline\n >\n {formatMessage(messages.viewGradesText)}\n </Hyperlink>\n </Col>\n </Row>\n </Card.Status>\n );\n};\n\nViewGradesBanner.propTypes = {\n cardId: PropTypes.string.isRequired,\n};\n\nexport default ViewGradesBanner;\n"]}
@@ -35,7 +35,7 @@ export const CourseCardBanners = ({ cardId, verifiedCourse, isHistoryTab, isAudi
35
35
  ((_k = courseData === null || courseData === void 0 ? void 0 : courseData.gradeData) === null || _k === void 0 ? void 0 : _k.isPassing) === false &&
36
36
  !((_l = courseData === null || courseData === void 0 ? void 0 : courseData.certificate) === null || _l === void 0 ? void 0 : _l.isEarned);
37
37
  const homeUrl = (_m = courseData === null || courseData === void 0 ? void 0 : courseData.courseRun) === null || _m === void 0 ? void 0 : _m.homeUrl;
38
- return (_jsxs("div", { className: "course-card-banners", "data-testid": "CourseCardBanners", children: [showUpgradeBanner && (_jsx(UpgradeBanner, { courseId: courseId, title: title, upgradeUrl: upgradeUrl })), isDownloadable && _jsx(ViewCertificateBanner, { cardId: cardId }), isCompletedButNotPassed && _jsx(ViewGradesBanner, { cardId: cardId }), showFindCourseBanner && (_jsx(FindCourseBanner, { findCourseUrl: findCourseUrl })), showViewCourseDetailBanner && (_jsx(ViewCourseDetailBanner, { viewCourseDetailUrl: homeUrl }))] }));
38
+ return (_jsxs("div", { className: "course-card-banners", "data-testid": "CourseCardBanners", children: [showUpgradeBanner && (_jsx(UpgradeBanner, { courseId: courseId, title: title, upgradeUrl: upgradeUrl })), isDownloadable && _jsx(ViewCertificateBanner, { cardId: cardId }), isCompletedButNotPassed && _jsx(ViewGradesBanner, { cardId: cardId }), showFindCourseBanner && (_jsx(FindCourseBanner, { cardId: cardId, findCourseUrl: findCourseUrl })), showViewCourseDetailBanner && (_jsx(ViewCourseDetailBanner, { cardId: cardId, viewCourseDetailUrl: homeUrl }))] }));
39
39
  };
40
40
  CourseCardBanners.propTypes = {
41
41
  cardId: PropTypes.string.isRequired,
@@ -1 +1 @@
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 = ({\n cardId,\n verifiedCourse,\n isHistoryTab,\n isAudit,\n isAuditAccessExpired,\n canUpgrade,\n}) => {\n const courseData = useCourseData(cardId);\n if (!courseData) {\n return null;\n }\n\n const courseId = courseData?.courseRun?.courseId ?? '';\n const title = courseData?.course?.courseName ?? '';\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 !courseData?.isFromNonUpgradeableCourses;\n const showViewCourseDetailBanner =\n isHistoryTab &&\n isAudit &&\n isAuditAccessExpired &&\n !canUpgrade &&\n !courseData?.isFromNonUpgradeableCourses;\n const showUpgradeBanner =\n isAudit &&\n canUpgrade &&\n !courseData?.isFromNonUpgradeableCourses &&\n (!isHistoryTab || isAuditAccessExpired);\n const isDownloadable = courseData?.certificate?.isDownloadable || false;\n const isCompletedButNotPassed =\n !!courseData?.courseRun?.isArchived &&\n courseData?.gradeData?.isPassing === false &&\n !courseData?.certificate?.isEarned;\n const homeUrl = courseData?.courseRun?.homeUrl;\n\n return (\n <div className=\"course-card-banners\" data-testid=\"CourseCardBanners\">\n {showUpgradeBanner && (\n <UpgradeBanner\n courseId={courseId}\n title={title}\n upgradeUrl={upgradeUrl}\n />\n )}\n {isDownloadable && <ViewCertificateBanner cardId={cardId} />}\n {isCompletedButNotPassed && <ViewGradesBanner cardId={cardId} />}\n {showFindCourseBanner && (\n <FindCourseBanner findCourseUrl={findCourseUrl} />\n )}\n {showViewCourseDetailBanner && (\n <ViewCourseDetailBanner viewCourseDetailUrl={homeUrl} />\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 = ({\n cardId,\n verifiedCourse,\n isHistoryTab,\n isAudit,\n isAuditAccessExpired,\n canUpgrade,\n}) => {\n const courseData = useCourseData(cardId);\n if (!courseData) {\n return null;\n }\n\n const courseId = courseData?.courseRun?.courseId ?? '';\n const title = courseData?.course?.courseName ?? '';\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 !courseData?.isFromNonUpgradeableCourses;\n const showViewCourseDetailBanner =\n isHistoryTab &&\n isAudit &&\n isAuditAccessExpired &&\n !canUpgrade &&\n !courseData?.isFromNonUpgradeableCourses;\n const showUpgradeBanner =\n isAudit &&\n canUpgrade &&\n !courseData?.isFromNonUpgradeableCourses &&\n (!isHistoryTab || isAuditAccessExpired);\n const isDownloadable = courseData?.certificate?.isDownloadable || false;\n const isCompletedButNotPassed =\n !!courseData?.courseRun?.isArchived &&\n courseData?.gradeData?.isPassing === false &&\n !courseData?.certificate?.isEarned;\n const homeUrl = courseData?.courseRun?.homeUrl;\n\n return (\n <div className=\"course-card-banners\" data-testid=\"CourseCardBanners\">\n {showUpgradeBanner && (\n <UpgradeBanner\n courseId={courseId}\n title={title}\n upgradeUrl={upgradeUrl}\n />\n )}\n {isDownloadable && <ViewCertificateBanner cardId={cardId} />}\n {isCompletedButNotPassed && <ViewGradesBanner cardId={cardId} />}\n {showFindCourseBanner && (\n <FindCourseBanner cardId={cardId} findCourseUrl={findCourseUrl} />\n )}\n {showViewCourseDetailBanner && (\n <ViewCourseDetailBanner cardId={cardId} viewCourseDetailUrl={homeUrl} />\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"]}
@@ -2,14 +2,23 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import PropTypes from 'prop-types';
3
3
  import { Pagination } from '@openedx/paragon';
4
4
  import CourseCard from '../../../containers/CourseCard';
5
+ import { eventNames, trackSubscriptionEvent, } from '../../../tracking/trackers/subscription';
5
6
  import { useIsCollapsed } from './hooks';
6
7
  export const CourseList = ({ courseListData }) => {
7
8
  const { setPageNumber, numPages, visibleList, isHistoryTab, } = courseListData;
8
9
  const isCollapsed = useIsCollapsed();
10
+ const handlePageSelect = (pageNumber) => {
11
+ trackSubscriptionEvent(eventNames.paginationPageSelected, {
12
+ page_number: pageNumber,
13
+ total_pages: numPages,
14
+ tab: isHistoryTab ? 'history' : 'in_progress',
15
+ });
16
+ setPageNumber(pageNumber);
17
+ };
9
18
  return (_jsx(_Fragment, { children: _jsxs("div", { className: "d-flex flex-column flex-grow-1", children: [visibleList.map((course) => {
10
19
  var _a, _b, _c, _d;
11
20
  return (_jsx(CourseCard, { cardId: course.cardId, verifiedCourse: (_a = course === null || course === void 0 ? void 0 : course.enrollment) === null || _a === void 0 ? void 0 : _a.isVerified, isAudit: (_b = course === null || course === void 0 ? void 0 : course.enrollment) === null || _b === void 0 ? void 0 : _b.isAudit, isHistoryTab: isHistoryTab, isAuditAccessExpired: (_c = course === null || course === void 0 ? void 0 : course.enrollment) === null || _c === void 0 ? void 0 : _c.isAuditAccessExpired, canUpgrade: (_d = course === null || course === void 0 ? void 0 : course.enrollment) === null || _d === void 0 ? void 0 : _d.canUpgrade }, course.cardId));
12
- }), numPages > 1 && (_jsx(Pagination, { variant: isCollapsed ? 'reduced' : 'secondary', paginationLabel: "Course List", className: "mx-auto mb-2", pageCount: numPages, onPageSelect: setPageNumber }))] }) }));
21
+ }), numPages > 1 && (_jsx(Pagination, { variant: isCollapsed ? 'reduced' : 'secondary', paginationLabel: "Course List", className: "mx-auto mb-2", pageCount: numPages, onPageSelect: handlePageSelect }))] }) }));
13
22
  };
14
23
  export const courseListDataShape = PropTypes.shape({
15
24
  showFilters: PropTypes.bool.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/CoursesPanel/CourseList/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,UAAU,MAAM,4BAA4B,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IAC/C,MAAM,EACJ,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,GACnD,GAAG,cAAc,CAAC;IAEnB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CACL,4BACE,eAAK,SAAS,EAAC,gCAAgC,aAC5C,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;oBAAC,OAAA,CAC3B,KAAC,UAAU,IAET,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,cAAc,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,UAAU,EAC9C,OAAO,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,OAAO,EACpC,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,oBAAoB,EAC9D,UAAU,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,UAAU,IANrC,MAAM,CAAC,MAAM,CAOlB,CACH,CAAA;iBAAA,CAAC,EACD,QAAQ,GAAG,CAAC,IAAI,CACf,KAAC,UAAU,IACT,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAC9C,eAAe,EAAC,aAAa,EAC7B,SAAS,EAAC,cAAc,EACxB,SAAS,EAAE,QAAQ,EACnB,YAAY,EAAE,aAAa,GAC3B,CACH,IACG,GACL,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC;IACjD,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACtC,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU;IAC5D,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACrC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACxC,cAAc,EAAE,SAAS,CAAC,IAAI;IAC9B,YAAY,EAAE,SAAS,CAAC,IAAI;CAC7B,CAAC,CAAC;AAEH,UAAU,CAAC,SAAS,GAAG;IACrB,cAAc,EAAE,mBAAmB;CACpC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { Pagination } from '@openedx/paragon';\nimport CourseCard from '@src/containers/CourseCard';\n\nimport { useIsCollapsed } from './hooks';\n\nexport const CourseList = ({ courseListData }) => {\n const {\n setPageNumber, numPages, visibleList, isHistoryTab,\n } = courseListData;\n\n const isCollapsed = useIsCollapsed();\n return (\n <>\n <div className=\"d-flex flex-column flex-grow-1\">\n {visibleList.map((course) => (\n <CourseCard\n key={course.cardId}\n cardId={course.cardId}\n verifiedCourse={course?.enrollment?.isVerified}\n isAudit={course?.enrollment?.isAudit}\n isHistoryTab={isHistoryTab}\n isAuditAccessExpired={course?.enrollment?.isAuditAccessExpired}\n canUpgrade={course?.enrollment?.canUpgrade}\n />\n ))}\n {numPages > 1 && (\n <Pagination\n variant={isCollapsed ? 'reduced' : 'secondary'}\n paginationLabel=\"Course List\"\n className=\"mx-auto mb-2\"\n pageCount={numPages}\n onPageSelect={setPageNumber}\n />\n )}\n </div>\n </>\n );\n};\n\nexport const courseListDataShape = PropTypes.shape({\n showFilters: PropTypes.bool.isRequired,\n visibleList: PropTypes.arrayOf(PropTypes.shape()).isRequired,\n numPages: PropTypes.number.isRequired,\n setPageNumber: PropTypes.func.isRequired,\n verifiedCourse: PropTypes.bool,\n isHistoryTab: PropTypes.bool,\n});\n\nCourseList.propTypes = {\n courseListData: courseListDataShape,\n};\n\nexport default CourseList;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/CoursesPanel/CourseList/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,UAAU,MAAM,4BAA4B,CAAC;AACpD,OAAO,EACL,UAAU,EAAE,sBAAsB,GACnC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;IAC/C,MAAM,EACJ,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,GACnD,GAAG,cAAc,CAAC;IAEnB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,EAAE;QACtC,sBAAsB,CAAC,UAAU,CAAC,sBAAsB,EAAE;YACxD,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,QAAQ;YACrB,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;SAC9C,CAAC,CAAC;QACH,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO,CACL,4BACE,eAAK,SAAS,EAAC,gCAAgC,aAC5C,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;oBAAC,OAAA,CAC3B,KAAC,UAAU,IAET,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,cAAc,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,UAAU,EAC9C,OAAO,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,OAAO,EACpC,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,oBAAoB,EAC9D,UAAU,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,0CAAE,UAAU,IANrC,MAAM,CAAC,MAAM,CAOlB,CACH,CAAA;iBAAA,CAAC,EACD,QAAQ,GAAG,CAAC,IAAI,CACf,KAAC,UAAU,IACT,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAC9C,eAAe,EAAC,aAAa,EAC7B,SAAS,EAAC,cAAc,EACxB,SAAS,EAAE,QAAQ,EACnB,YAAY,EAAE,gBAAgB,GAC9B,CACH,IACG,GACL,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC;IACjD,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACtC,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU;IAC5D,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IACrC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACxC,cAAc,EAAE,SAAS,CAAC,IAAI;IAC9B,YAAY,EAAE,SAAS,CAAC,IAAI;CAC7B,CAAC,CAAC;AAEH,UAAU,CAAC,SAAS,GAAG;IACrB,cAAc,EAAE,mBAAmB;CACpC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { Pagination } from '@openedx/paragon';\nimport CourseCard from '@src/containers/CourseCard';\nimport {\n eventNames, trackSubscriptionEvent,\n} from '@src/tracking/trackers/subscription';\n\nimport { useIsCollapsed } from './hooks';\n\nexport const CourseList = ({ courseListData }) => {\n const {\n setPageNumber, numPages, visibleList, isHistoryTab,\n } = courseListData;\n\n const isCollapsed = useIsCollapsed();\n\n const handlePageSelect = (pageNumber) => {\n trackSubscriptionEvent(eventNames.paginationPageSelected, {\n page_number: pageNumber,\n total_pages: numPages,\n tab: isHistoryTab ? 'history' : 'in_progress',\n });\n setPageNumber(pageNumber);\n };\n\n return (\n <>\n <div className=\"d-flex flex-column flex-grow-1\">\n {visibleList.map((course) => (\n <CourseCard\n key={course.cardId}\n cardId={course.cardId}\n verifiedCourse={course?.enrollment?.isVerified}\n isAudit={course?.enrollment?.isAudit}\n isHistoryTab={isHistoryTab}\n isAuditAccessExpired={course?.enrollment?.isAuditAccessExpired}\n canUpgrade={course?.enrollment?.canUpgrade}\n />\n ))}\n {numPages > 1 && (\n <Pagination\n variant={isCollapsed ? 'reduced' : 'secondary'}\n paginationLabel=\"Course List\"\n className=\"mx-auto mb-2\"\n pageCount={numPages}\n onPageSelect={handlePageSelect}\n />\n )}\n </div>\n </>\n );\n};\n\nexport const courseListDataShape = PropTypes.shape({\n showFilters: PropTypes.bool.isRequired,\n visibleList: PropTypes.arrayOf(PropTypes.shape()).isRequired,\n numPages: PropTypes.number.isRequired,\n setPageNumber: PropTypes.func.isRequired,\n verifiedCourse: PropTypes.bool,\n isHistoryTab: PropTypes.bool,\n});\n\nCourseList.propTypes = {\n courseListData: courseListDataShape,\n};\n\nexport default CourseList;\n"]}
@@ -6,12 +6,15 @@ import { Button } from '@openedx/paragon';
6
6
  import { Search } from '@openedx/paragon/icons';
7
7
  import { baseAppUrl } from '../../../data/services/lms/urls';
8
8
  import { useInitializeSubsDashboard } from '../../../data/hooks';
9
+ import track from '../../../tracking';
9
10
  export const NoCoursesView = () => {
10
11
  var _a;
11
12
  const { formatMessage } = useIntl();
12
13
  const { data: learnerData } = useInitializeSubsDashboard();
13
14
  const courseSearchUrl = ((_a = learnerData === null || learnerData === void 0 ? void 0 : learnerData.platformSettings) === null || _a === void 0 ? void 0 : _a.courseSearchUrl) || '';
14
- return (_jsxs("div", { className: "no-courses-content-view", children: [_jsx("p", { children: formatMessage(messages.inProgressCoursesPrompt) }), _jsx(Button, { variant: "brand", as: "a", href: baseAppUrl(courseSearchUrl), iconBefore: Search, children: formatMessage(messages.findCoursesButton) })] }));
15
+ const courseSearchHref = baseAppUrl(courseSearchUrl);
16
+ const handleClick = track.course.noCoursesViewClicked('no-courses-view-button', courseSearchHref);
17
+ return (_jsxs("div", { className: "no-courses-content-view", children: [_jsx("p", { children: formatMessage(messages.inProgressCoursesPrompt) }), _jsx(Button, { variant: "brand", as: "a", href: courseSearchHref, iconBefore: Search, onClick: handleClick, children: formatMessage(messages.findCoursesButton) })] }));
15
18
  };
16
19
  export default NoCoursesView;
17
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/CoursesPanel/NoCoursesView/index.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;;IAChC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,eAAe,GAAG,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,0CAAE,eAAe,KAAI,EAAE,CAAC;IAE7E,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,sBAAI,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC,GAAK,EACxD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,UAAU,CAAC,eAAe,CAAC,EACjC,UAAU,EAAE,MAAM,YAEjB,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GACnC,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import React from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from './messages';\nimport { Button } from '@openedx/paragon';\nimport { Search } from '@openedx/paragon/icons';\nimport { baseAppUrl } from '@src/data/services/lms/urls';\n\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\n\nexport const NoCoursesView = () => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseSearchUrl = learnerData?.platformSettings?.courseSearchUrl || '';\n\n return (\n <div className=\"no-courses-content-view\">\n <p>{formatMessage(messages.inProgressCoursesPrompt)}</p>\n <Button\n variant=\"brand\"\n as=\"a\"\n href={baseAppUrl(courseSearchUrl)}\n iconBefore={Search}\n >\n {formatMessage(messages.findCoursesButton)}\n </Button>\n </div>\n );\n};\n\nexport default NoCoursesView;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/CoursesPanel/NoCoursesView/index.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,MAAM,eAAe,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;;IAChC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC3D,MAAM,eAAe,GAAG,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,0CAAE,eAAe,KAAI,EAAE,CAAC;IAC7E,MAAM,gBAAgB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,oBAAoB,CACnD,wBAAwB,EACxB,gBAAgB,CACjB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,sBAAI,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC,GAAK,EACxD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,EAAE,EAAC,GAAG,EACN,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,WAAW,YAEnB,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GACnC,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import React from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from './messages';\nimport { Button } from '@openedx/paragon';\nimport { Search } from '@openedx/paragon/icons';\nimport { baseAppUrl } from '@src/data/services/lms/urls';\n\nimport { useInitializeSubsDashboard } from '@src/data/hooks';\nimport track from '@src/tracking';\n\nexport const NoCoursesView = () => {\n const { formatMessage } = useIntl();\n const { data: learnerData } = useInitializeSubsDashboard();\n const courseSearchUrl = learnerData?.platformSettings?.courseSearchUrl || '';\n const courseSearchHref = baseAppUrl(courseSearchUrl);\n\n const handleClick = track.course.noCoursesViewClicked(\n 'no-courses-view-button',\n courseSearchHref,\n );\n\n return (\n <div className=\"no-courses-content-view\">\n <p>{formatMessage(messages.inProgressCoursesPrompt)}</p>\n <Button\n variant=\"brand\"\n as=\"a\"\n href={courseSearchHref}\n iconBefore={Search}\n onClick={handleClick}\n >\n {formatMessage(messages.findCoursesButton)}\n </Button>\n </div>\n );\n};\n\nexport default NoCoursesView;\n"]}
@@ -5,6 +5,7 @@ import { Timelapse, Speed, FormatListNumbered } from '@openedx/paragon/icons';
5
5
  import './index.scss';
6
6
  import cardFallbackImg from '@openedx/brand-openedx/paragon/images/card-imagecap-fallback.png';
7
7
  import messages from './messages';
8
+ import { eventNames, trackSubscriptionEvent } from '../../tracking/trackers/subscription';
8
9
  const getIdentifyingUrlPath = (marketingUrl) => {
9
10
  if (!marketingUrl) {
10
11
  return null;
@@ -21,6 +22,9 @@ export const ProductCard = ({ item, isLoading }) => {
21
22
  const { formatMessage } = useIntl();
22
23
  const identifyingUrlPath = getIdentifyingUrlPath(item.marketing_url);
23
24
  const totalProgramCourses = item.product === 'program' && item.subject && item.subject.length ? item.subject.length : 0;
24
- return (_jsxs(Card, { className: "shadow-sm d-flex flex-column rounded w-100 overflow-hidden align-items-stretch card-container", variant: "light", "data-testid": "product-card", isLoading: isLoading, as: identifyingUrlPath ? Hyperlink : 'div', destination: identifyingUrlPath ? `/subscription-enroll/${identifyingUrlPath}` : undefined, children: [_jsx(Card.Header, { title: item.product === 'program' ? `${item.content_type}` : 'Course', className: "pb-2 pt-2 bg-light-500 text-primary-500 content-type", size: "xs" }), _jsx("div", { className: "position-relative image-container", children: _jsx(Card.ImageCap, { src: item.url || cardFallbackImg, srcAlt: `${item.title} main-image`, "data-testid": "product-card-image", logoSrc: item.thumbnail || '', logoAlt: `${item.title} thumbnail-image` }) }), _jsx(Card.Header, { title: item.title, subtitle: item.partner, size: "sm", className: "product-card-title" }), _jsxs(Card.Section, { className: "d-flex flex-column flex-grow-1 overflow-hidden mt-5", children: [totalProgramCourses > 0 ? (_jsxs("span", { className: "d-flex align-items-center mb-2", children: [_jsx(Icon, { src: FormatListNumbered, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.courses, { count: totalProgramCourses }) })] })) : null, typeof item.weeks_to_complete === 'number' && (_jsxs("span", { className: "d-flex align-items-center mb-2", children: [_jsx(Icon, { src: Timelapse, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.weeksToComplete, { count: item.weeks_to_complete }) })] })), item.level ? (_jsxs("span", { className: `d-flex align-items-center${typeof item.weeks_to_complete === 'number' ? ' mt-3' : ''}`, children: [_jsx(Icon, { src: Speed, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.level, { level: item.level }) })] })) : null] })] }));
25
+ const handleClick = () => {
26
+ trackSubscriptionEvent(eventNames.cardTileSelected, {});
27
+ };
28
+ return (_jsxs(Card, { className: "shadow-sm d-flex flex-column rounded w-100 overflow-hidden align-items-stretch card-container", variant: "light", "data-testid": "product-card", isLoading: isLoading, as: identifyingUrlPath ? Hyperlink : 'div', onClick: identifyingUrlPath && !isLoading ? handleClick : undefined, destination: identifyingUrlPath ? `/subscription-enroll/${identifyingUrlPath}` : undefined, children: [_jsx(Card.Header, { title: item.product === 'program' ? `${item.content_type}` : 'Course', className: "pb-2 pt-2 bg-light-500 text-primary-500 content-type", size: "xs" }), _jsx("div", { className: "position-relative image-container", children: _jsx(Card.ImageCap, { src: item.url || cardFallbackImg, srcAlt: `${item.title} main-image`, "data-testid": "product-card-image", logoSrc: item.thumbnail || '', logoAlt: `${item.title} thumbnail-image` }) }), _jsx(Card.Header, { title: item.title, subtitle: item.partner, size: "sm", className: "product-card-title" }), _jsxs(Card.Section, { className: "d-flex flex-column flex-grow-1 overflow-hidden mt-5", children: [totalProgramCourses > 0 ? (_jsxs("span", { className: "d-flex align-items-center mb-2", children: [_jsx(Icon, { src: FormatListNumbered, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.courses, { count: totalProgramCourses }) })] })) : null, typeof item.weeks_to_complete === 'number' && (_jsxs("span", { className: "d-flex align-items-center mb-2", children: [_jsx(Icon, { src: Timelapse, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.weeksToComplete, { count: item.weeks_to_complete }) })] })), item.level ? (_jsxs("span", { className: `d-flex align-items-center${typeof item.weeks_to_complete === 'number' ? ' mt-3' : ''}`, children: [_jsx(Icon, { src: Speed, className: "mr-2" }), _jsx("span", { children: formatMessage(messages.level, { level: item.level }) })] })) : null] })] }));
25
29
  };
26
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ProductCard/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Card, Hyperlink, Icon } from '@openedx/paragon';\nimport { Timelapse, Speed, FormatListNumbered } from '@openedx/paragon/icons';\nimport './index.scss';\nimport cardFallbackImg from '@openedx/brand-openedx/paragon/images/card-imagecap-fallback.png';\nimport { ProductCardProps } from './data/types';\nimport messages from './messages';\n\nconst getIdentifyingUrlPath = (marketingUrl: string): string | null => {\n if (!marketingUrl) {\n return null;\n }\n try {\n const path = new URL(marketingUrl, window.location.origin).pathname.replace(/^\\//, '');\n return path || null;\n } catch {\n return null;\n }\n};\n\nexport const ProductCard: FC<ProductCardProps> = ({ item, isLoading }) => {\n const { formatMessage } = useIntl();\n const identifyingUrlPath = getIdentifyingUrlPath(item.marketing_url);\n const totalProgramCourses = item.product === 'program' && item.subject && item.subject.length ? item.subject.length : 0;\n\n return (\n <Card\n className=\"shadow-sm d-flex flex-column rounded w-100 overflow-hidden align-items-stretch card-container\"\n variant=\"light\"\n data-testid=\"product-card\"\n isLoading={isLoading}\n as={identifyingUrlPath ? Hyperlink : 'div'}\n destination={identifyingUrlPath ? `/subscription-enroll/${identifyingUrlPath}` : undefined}\n >\n <Card.Header title={item.product === 'program' ? `${item.content_type}` : 'Course'} className=\"pb-2 pt-2 bg-light-500 text-primary-500 content-type\" size=\"xs\" />\n\n <div className=\"position-relative image-container\">\n <Card.ImageCap\n src={item.url || cardFallbackImg}\n srcAlt={`${item.title} main-image`}\n data-testid=\"product-card-image\"\n logoSrc={item.thumbnail || ''}\n logoAlt={`${item.title} thumbnail-image`}\n />\n </div>\n\n <Card.Header title={item.title} subtitle={item.partner} size=\"sm\" className=\"product-card-title\" />\n\n <Card.Section className=\"d-flex flex-column flex-grow-1 overflow-hidden mt-5\">\n {totalProgramCourses > 0 ? (\n <span className=\"d-flex align-items-center mb-2\">\n <Icon src={FormatListNumbered} className=\"mr-2\" />\n <span>{formatMessage(messages.courses, { count: totalProgramCourses })}</span>\n </span>\n ) : null}\n {typeof item.weeks_to_complete === 'number' && (\n <span className=\"d-flex align-items-center mb-2\">\n <Icon src={Timelapse} className=\"mr-2\" />\n <span>{formatMessage(messages.weeksToComplete, { count: item.weeks_to_complete })}</span>\n </span>\n )}\n {item.level ? (\n <span className={`d-flex align-items-center${typeof item.weeks_to_complete === 'number' ? ' mt-3' : ''}`}>\n <Icon src={Speed} className=\"mr-2\" />\n <span>{formatMessage(messages.level, { level: item.level })}</span>\n </span>\n ) : null}\n </Card.Section>\n\n </Card>\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ProductCard/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Card, Hyperlink, Icon } from '@openedx/paragon';\nimport { Timelapse, Speed, FormatListNumbered } from '@openedx/paragon/icons';\nimport './index.scss';\nimport cardFallbackImg from '@openedx/brand-openedx/paragon/images/card-imagecap-fallback.png';\nimport { ProductCardProps } from './data/types';\nimport messages from './messages';\nimport { eventNames, trackSubscriptionEvent } from '@src/tracking/trackers/subscription';\n\nconst getIdentifyingUrlPath = (marketingUrl: string): string | null => {\n if (!marketingUrl) {\n return null;\n }\n try {\n const path = new URL(marketingUrl, window.location.origin).pathname.replace(/^\\//, '');\n return path || null;\n } catch {\n return null;\n }\n};\n\nexport const ProductCard: FC<ProductCardProps> = ({ item, isLoading }) => {\n const { formatMessage } = useIntl();\n const identifyingUrlPath = getIdentifyingUrlPath(item.marketing_url);\n const totalProgramCourses = item.product === 'program' && item.subject && item.subject.length ? item.subject.length : 0;\n\n const handleClick = () => {\n trackSubscriptionEvent(eventNames.cardTileSelected, {});\n };\n\n return (\n <Card\n className=\"shadow-sm d-flex flex-column rounded w-100 overflow-hidden align-items-stretch card-container\"\n variant=\"light\"\n data-testid=\"product-card\"\n isLoading={isLoading}\n as={identifyingUrlPath ? Hyperlink : 'div'}\n onClick={identifyingUrlPath && !isLoading ? handleClick : undefined}\n destination={identifyingUrlPath ? `/subscription-enroll/${identifyingUrlPath}` : undefined}\n >\n <Card.Header title={item.product === 'program' ? `${item.content_type}` : 'Course'} className=\"pb-2 pt-2 bg-light-500 text-primary-500 content-type\" size=\"xs\" />\n\n <div className=\"position-relative image-container\">\n <Card.ImageCap\n src={item.url || cardFallbackImg}\n srcAlt={`${item.title} main-image`}\n data-testid=\"product-card-image\"\n logoSrc={item.thumbnail || ''}\n logoAlt={`${item.title} thumbnail-image`}\n />\n </div>\n\n <Card.Header title={item.title} subtitle={item.partner} size=\"sm\" className=\"product-card-title\" />\n\n <Card.Section className=\"d-flex flex-column flex-grow-1 overflow-hidden mt-5\">\n {totalProgramCourses > 0 ? (\n <span className=\"d-flex align-items-center mb-2\">\n <Icon src={FormatListNumbered} className=\"mr-2\" />\n <span>{formatMessage(messages.courses, { count: totalProgramCourses })}</span>\n </span>\n ) : null}\n {typeof item.weeks_to_complete === 'number' && (\n <span className=\"d-flex align-items-center mb-2\">\n <Icon src={Timelapse} className=\"mr-2\" />\n <span>{formatMessage(messages.weeksToComplete, { count: item.weeks_to_complete })}</span>\n </span>\n )}\n {item.level ? (\n <span className={`d-flex align-items-center${typeof item.weeks_to_complete === 'number' ? ' mt-3' : ''}`}>\n <Icon src={Speed} className=\"mr-2\" />\n <span>{formatMessage(messages.level, { level: item.level })}</span>\n </span>\n ) : null}\n </Card.Section>\n\n </Card>\n );\n};\n"]}
@@ -19,7 +19,7 @@ export const InProgressTabData = () => {
19
19
  const shouldShowCompletedMessage = !inProgressCount && !remainingCount && completedCount > 0;
20
20
  const progressCards = inProgressData.map((course) => {
21
21
  const courseRuns = course.courseRuns || [];
22
- const [{ pacingType = '', enrollmentDate = '', end = '', courseUrl = '', upgradeUrl = '', seats = [], key = '' } = {}] = Array.isArray(courseRuns) ? courseRuns : [];
22
+ const [{ pacingType = '', enrollmentDate = '', end = '', courseUrl = '', upgradeUrl = '', seats = [], key = '', isAudit, canUpgrade, isAuditAccessExpired } = {}] = Array.isArray(courseRuns) ? courseRuns : [];
23
23
  const progressCardData = {
24
24
  title: course.title,
25
25
  enrollment_date: enrollmentDate,
@@ -32,6 +32,9 @@ export const InProgressTabData = () => {
32
32
  seats: seats || [],
33
33
  expired: course.expired || false, // using expired from course object to determine if the course is expired as per condition on confluence and learners dashboard code.
34
34
  courseRunKey: key || '',
35
+ isAudit: isAudit || false,
36
+ canUpgradeCourse: canUpgrade || false,
37
+ isAuditAccessExpired: isAuditAccessExpired || false,
35
38
  };
36
39
  return (_jsx(ProgressCard, { progressCardData: progressCardData, isLoading: isLoading, tabType: inProgressTabType }, course.key));
37
40
  });