@edx/frontend-app-subscription-learner-dashboard 1.0.0 → 1.2.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 (48) hide show
  1. package/dist/containers/CoursesPanel/index.js +1 -1
  2. package/dist/containers/CoursesPanel/index.js.map +1 -1
  3. package/dist/containers/CoursesPanel/index.scss +1 -2
  4. package/dist/containers/CoursesPanel/messages.d.ts +8 -0
  5. package/dist/containers/CoursesPanel/messages.js +5 -0
  6. package/dist/containers/CoursesPanel/messages.js.map +1 -1
  7. package/dist/containers/Dashboard/hooks.js +2 -2
  8. package/dist/containers/Dashboard/hooks.js.map +1 -1
  9. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.d.ts +4 -0
  10. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js +14 -0
  11. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.js.map +1 -0
  12. package/dist/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.scss +3 -0
  13. package/dist/containers/ProgramDashboard/ProgramProgress/messages.d.ts +20 -0
  14. package/dist/containers/ProgramDashboard/ProgramProgress/messages.js +21 -1
  15. package/dist/containers/ProgramDashboard/ProgramProgress/messages.js.map +1 -1
  16. package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.d.ts +4 -0
  17. package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js +42 -0
  18. package/dist/containers/ProgramDashboard/ProgramsList/ProgramListCard.js.map +1 -0
  19. package/dist/containers/ProgramDashboard/ProgramsList/ProgressCategoryBubbles.d.ts +4 -0
  20. package/dist/containers/ProgramDashboard/ProgramsList/ProgressCategoryBubbles.js +10 -0
  21. package/dist/containers/ProgramDashboard/ProgramsList/ProgressCategoryBubbles.js.map +1 -0
  22. package/dist/containers/ProgramDashboard/ProgramsList/index.d.ts +4 -0
  23. package/dist/containers/ProgramDashboard/ProgramsList/index.js +36 -0
  24. package/dist/containers/ProgramDashboard/ProgramsList/index.js.map +1 -0
  25. package/dist/containers/ProgramDashboard/ProgramsList/index.scss +21 -0
  26. package/dist/containers/ProgramDashboard/ProgramsList/messages.d.ts +33 -0
  27. package/dist/containers/ProgramDashboard/ProgramsList/messages.js +35 -0
  28. package/dist/containers/ProgramDashboard/ProgramsList/messages.js.map +1 -0
  29. package/dist/containers/ProgramDashboard/assets/program-card-fallback.svg +3 -0
  30. package/dist/containers/ProgramDashboard/index.d.ts +2 -1
  31. package/dist/containers/ProgramDashboard/index.js +2 -1
  32. package/dist/containers/ProgramDashboard/index.js.map +1 -1
  33. package/dist/data/hooks/index.d.ts +2 -2
  34. package/dist/data/hooks/index.js +2 -2
  35. package/dist/data/hooks/index.js.map +1 -1
  36. package/dist/data/hooks/queryHooks.d.ts +3 -1
  37. package/dist/data/hooks/queryHooks.js +10 -2
  38. package/dist/data/hooks/queryHooks.js.map +1 -1
  39. package/dist/data/services/lms/api.d.ts +2 -1
  40. package/dist/data/services/lms/api.js +6 -1
  41. package/dist/data/services/lms/api.js.map +1 -1
  42. package/dist/data/services/lms/urls.d.ts +1 -0
  43. package/dist/data/services/lms/urls.js +2 -0
  44. package/dist/data/services/lms/urls.js.map +1 -1
  45. package/dist/messages.d.ts +2 -2
  46. package/dist/messages.js +6 -6
  47. package/dist/messages.js.map +1 -1
  48. package/package.json +1 -1
@@ -41,7 +41,7 @@ export const CoursesPanel = () => {
41
41
  verifiedCourse: true,
42
42
  };
43
43
  const limitedCourseListData = Object.assign(Object.assign({}, courseListData), { verifiedCourse: false });
44
- return (_jsxs("div", { className: "course-list-container", children: [_jsx("div", { className: "course-list-heading-container", children: _jsx("h2", { className: "course-list-title", children: formatMessage(messages.myCourses) }) }), hasCourses ? _jsx(CourseListSlot, { courseListData: courseListData }) : _jsx(NoCoursesViewSlot, {}), _jsx("div", { className: "course-list-heading-container", children: _jsx("h2", { className: "course-list-title text-gray-700", children: formatMessage(messages.limitedCourse) }) }), hasCourses ? _jsx(CourseListSlot, { courseListData: limitedCourseListData }) : _jsx(NoCoursesViewSlot, {})] }));
44
+ return (_jsxs("div", { className: "course-list-container", children: [_jsxs("div", { className: "course-list-heading-container", children: [_jsx("h2", { className: "course-list-title", children: formatMessage(messages.myCourses) }), _jsx("p", { className: "mb-4.5", children: formatMessage(messages.lastSession) })] }), hasCourses ? _jsx(CourseListSlot, { courseListData: courseListData }) : _jsx(NoCoursesViewSlot, {}), _jsx("div", { className: "course-list-heading-container", children: _jsx("h2", { className: "course-list-title text-gray-700", children: formatMessage(messages.limitedCourse) }) }), hasCourses ? _jsx(CourseListSlot, { courseListData: limitedCourseListData }) : _jsx(NoCoursesViewSlot, {})] }));
45
45
  };
46
46
  CoursesPanel.propTypes = {};
47
47
  export default CoursesPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/CoursesPanel/index.jsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo } from 'react';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { useInitializeLearnerHome } from '@src/data/hooks';\nimport {\n CourseFilterControls,\n} from '../../containers/CourseFilterControls';\nimport CourseListSlot from '../../slots/CourseListSlot';\nimport NoCoursesViewSlot from '../../slots/NoCoursesViewSlot';\nimport { useFilters } from '@src/data/context';\n\nimport { getVisibleList } from '@src/utils/dataTransformers';\n\nimport messages from './messages';\n\nimport './index.scss';\n\n/**\n * Renders the list of CourseCards, as well as the controls (CourseFilterControls) for modifying the list.\n * Also houses the NoCoursesView to display if the user hasn't enrolled in any courses.\n * @returns List of courses as CourseCards or empty state\n*/\nexport const CoursesPanel = () => {\n const { formatMessage } = useIntl();\n const { data } = useInitializeLearnerHome();\n const hasCourses = useMemo(() => data?.courses?.length > 0, [data]);\n\n const {\n filters, sortBy, pageNumber, setPageNumber,\n } = useFilters();\n const { visibleList, numPages } = useMemo(() => {\n const transformedCourses = data?.coursesByCardId\n ? Object.values(data.coursesByCardId)\n : [];\n return getVisibleList(\n transformedCourses,\n filters,\n sortBy,\n pageNumber,\n );\n }, [data, filters, sortBy, pageNumber]);\n\n // Clamp page number when filtered/mutated list shrinks\n React.useEffect(() => {\n if (numPages > 0 && pageNumber > numPages) {\n setPageNumber(1);\n }\n }, [numPages, pageNumber, setPageNumber]);\n\n // TODO [TEMP]: Passing data twice and displaying the list twice, also fixed the corresponding test cases to reflect this.\n // Reason: Requirements not finalized\n // Action: Revisit after UX and data confirmation\n const courseListData = {\n setPageNumber,\n numPages,\n visibleList,\n verifiedCourse: true,\n };\n\n const limitedCourseListData = {\n ...courseListData,\n verifiedCourse: false,\n };\n\n return (\n <div className=\"course-list-container\">\n <div className=\"course-list-heading-container\">\n <h2 className=\"course-list-title\">{formatMessage(messages.myCourses)}</h2>\n </div>\n {hasCourses ? <CourseListSlot courseListData={courseListData} /> : <NoCoursesViewSlot />}\n\n <div className=\"course-list-heading-container\">\n <h2 className=\"course-list-title text-gray-700\">{formatMessage(messages.limitedCourse)}</h2>\n </div>\n {hasCourses ? <CourseListSlot courseListData={limitedCourseListData} /> : <NoCoursesViewSlot />}\n </div>\n );\n};\n\nCoursesPanel.propTypes = {};\n\nexport default CoursesPanel;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/CoursesPanel/index.jsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo } from 'react';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { useInitializeLearnerHome } from '@src/data/hooks';\nimport {\n CourseFilterControls,\n} from '../../containers/CourseFilterControls';\nimport CourseListSlot from '../../slots/CourseListSlot';\nimport NoCoursesViewSlot from '../../slots/NoCoursesViewSlot';\nimport { useFilters } from '@src/data/context';\n\nimport { getVisibleList } from '@src/utils/dataTransformers';\n\nimport messages from './messages';\n\nimport './index.scss';\n\n/**\n * Renders the list of CourseCards, as well as the controls (CourseFilterControls) for modifying the list.\n * Also houses the NoCoursesView to display if the user hasn't enrolled in any courses.\n * @returns List of courses as CourseCards or empty state\n*/\nexport const CoursesPanel = () => {\n const { formatMessage } = useIntl();\n const { data } = useInitializeLearnerHome();\n const hasCourses = useMemo(() => data?.courses?.length > 0, [data]);\n\n const {\n filters, sortBy, pageNumber, setPageNumber,\n } = useFilters();\n const { visibleList, numPages } = useMemo(() => {\n const transformedCourses = data?.coursesByCardId\n ? Object.values(data.coursesByCardId)\n : [];\n return getVisibleList(\n transformedCourses,\n filters,\n sortBy,\n pageNumber,\n );\n }, [data, filters, sortBy, pageNumber]);\n\n // Clamp page number when filtered/mutated list shrinks\n React.useEffect(() => {\n if (numPages > 0 && pageNumber > numPages) {\n setPageNumber(1);\n }\n }, [numPages, pageNumber, setPageNumber]);\n\n // TODO [TEMP]: Passing data twice and displaying the list twice, also fixed the corresponding test cases to reflect this.\n // Reason: Requirements not finalized\n // Action: Revisit after UX and data confirmation\n const courseListData = {\n setPageNumber,\n numPages,\n visibleList,\n verifiedCourse: true,\n };\n\n const limitedCourseListData = {\n ...courseListData,\n verifiedCourse: false,\n };\n\n return (\n <div className=\"course-list-container\">\n <div className=\"course-list-heading-container\">\n <h2 className=\"course-list-title\">{formatMessage(messages.myCourses)}</h2>\n <p className=\"mb-4.5\">{formatMessage(messages.lastSession)}</p>\n </div>\n {hasCourses ? <CourseListSlot courseListData={courseListData} /> : <NoCoursesViewSlot />}\n\n <div className=\"course-list-heading-container\">\n <h2 className=\"course-list-title text-gray-700\">{formatMessage(messages.limitedCourse)}</h2>\n </div>\n {hasCourses ? <CourseListSlot courseListData={limitedCourseListData} /> : <NoCoursesViewSlot />}\n </div>\n );\n};\n\nCoursesPanel.propTypes = {};\n\nexport default CoursesPanel;\n"]}
@@ -2,9 +2,8 @@
2
2
 
3
3
  .course-list-heading-container {
4
4
  display: flex;
5
- flex-direction: row;
5
+ flex-direction: column;
6
6
  justify-content: space-between;
7
- align-items: center;
8
7
  }
9
8
 
10
9
  .course-list-title {
@@ -13,4 +13,12 @@ declare namespace messages {
13
13
  let description_1: string;
14
14
  export { description_1 as description };
15
15
  }
16
+ namespace lastSession {
17
+ let id_2: string;
18
+ export { id_2 as id };
19
+ let defaultMessage_2: string;
20
+ export { defaultMessage_2 as defaultMessage };
21
+ let description_2: string;
22
+ export { description_2 as description };
23
+ }
16
24
  }
@@ -9,6 +9,11 @@ const messages = defineMessages({
9
9
  id: 'subs.limitedCourses',
10
10
  defaultMessage: 'Limited access courses',
11
11
  description: 'Label for subscription courses with limited access',
12
+ },
13
+ lastSession: {
14
+ id: 'subs.lastSession',
15
+ defaultMessage: 'Last session was Thursday, May 20, 2026.', // This is a placeholder default message. The actual message should be dynamic based on the last session date received via api.
16
+ description: 'Label for subscription courses to show last session information',
12
17
  }
13
18
  });
14
19
  export default messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/containers/CoursesPanel/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,SAAS,EAAE;QACT,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,8DAA8D;KAC5E;IACD,aAAa,EAAE;QACb,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,wBAAwB;QACxC,WAAW,EAAE,oDAAoD;KAClE;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n myCourses: {\n id: 'dashboard.mycourses',\n defaultMessage: 'Courses',\n description: 'Label for courses belonging to a user\\'s active subscription',\n },\n limitedCourse: {\n id: 'subs.limitedCourses',\n defaultMessage: 'Limited access courses',\n description: 'Label for subscription courses with limited access',\n }\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/containers/CoursesPanel/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,SAAS,EAAE;QACT,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,8DAA8D;KAC5E;IACD,aAAa,EAAE;QACb,EAAE,EAAE,qBAAqB;QACzB,cAAc,EAAE,wBAAwB;QACxC,WAAW,EAAE,oDAAoD;KAClE;IACD,WAAW,EAAE;QACX,EAAE,EAAE,kBAAkB;QACtB,cAAc,EAAE,0CAA0C,EAAE,+HAA+H;QAC3L,WAAW,EAAE,iEAAiE;KAC/E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n myCourses: {\n id: 'dashboard.mycourses',\n defaultMessage: 'Courses',\n description: 'Label for courses belonging to a user\\'s active subscription',\n },\n limitedCourse: {\n id: 'subs.limitedCourses',\n defaultMessage: 'Limited access courses',\n description: 'Label for subscription courses with limited access',\n },\n lastSession: {\n id: 'subs.lastSession',\n defaultMessage: 'Last session was Thursday, May 20, 2026.', // This is a placeholder default message. The actual message should be dynamic based on the last session date received via api.\n description: 'Label for subscription courses to show last session information',\n }\n});\n\nexport default messages;\n"]}
@@ -10,8 +10,8 @@ export const state = StrictDict({
10
10
  export const useDashboardMessages = () => {
11
11
  const { formatMessage } = useIntl();
12
12
  return {
13
- spinnerScreenReaderText: formatMessage(appMessages['learner-dash.loadingSR']),
14
- pageTitle: formatMessage(appMessages['learner-dash.title']),
13
+ spinnerScreenReaderText: formatMessage(appMessages['subs-dash.loadingSR']),
14
+ pageTitle: formatMessage(appMessages['subs-dash.title']),
15
15
  };
16
16
  };
17
17
  export const useDashboardLayoutData = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/containers/Dashboard/hooks.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;IAC9B,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,sBAAsB;CACrE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,OAAO;QACL,uBAAuB,EAAE,aAAa,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC7E,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;IAElC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO;QACL,oBAAoB,EAAE,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ;QACxD,cAAc;QACd,iBAAiB;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe;IACb,sBAAsB;IACtB,oBAAoB;CACrB,CAAC","sourcesContent":["import React from 'react';\nimport { useWindowSize, breakpoints } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { StrictDict } from '../../utils';\n\nimport appMessages from '../../messages';\nimport * as module from './hooks';\n\nexport const state = StrictDict({\n sidebarShowing: (val) => React.useState(val), // eslint-disable-line\n});\n\nexport const useDashboardMessages = () => {\n const { formatMessage } = useIntl();\n return {\n spinnerScreenReaderText: formatMessage(appMessages['learner-dash.loadingSR']),\n pageTitle: formatMessage(appMessages['learner-dash.title']),\n };\n};\n\nexport const useDashboardLayoutData = () => {\n const { width } = useWindowSize();\n\n const [sidebarShowing, setSidebarShowing] = module.state.sidebarShowing(true);\n return {\n isDashboardCollapsed: width < breakpoints.large.maxWidth,\n sidebarShowing,\n setSidebarShowing,\n };\n};\n\nexport default {\n useDashboardLayoutData,\n useDashboardMessages,\n};\n"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/containers/Dashboard/hooks.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;IAC9B,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,sBAAsB;CACrE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,OAAO;QACL,uBAAuB,EAAE,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC1E,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;KACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;IAElC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO;QACL,oBAAoB,EAAE,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ;QACxD,cAAc;QACd,iBAAiB;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe;IACb,sBAAsB;IACtB,oBAAoB;CACrB,CAAC","sourcesContent":["import React from 'react';\nimport { useWindowSize, breakpoints } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { StrictDict } from '../../utils';\n\nimport appMessages from '../../messages';\nimport * as module from './hooks';\n\nexport const state = StrictDict({\n sidebarShowing: (val) => React.useState(val), // eslint-disable-line\n});\n\nexport const useDashboardMessages = () => {\n const { formatMessage } = useIntl();\n return {\n spinnerScreenReaderText: formatMessage(appMessages['subs-dash.loadingSR']),\n pageTitle: formatMessage(appMessages['subs-dash.title']),\n };\n};\n\nexport const useDashboardLayoutData = () => {\n const { width } = useWindowSize();\n\n const [sidebarShowing, setSidebarShowing] = module.state.sidebarShowing(true);\n return {\n isDashboardCollapsed: width < breakpoints.large.maxWidth,\n sidebarShowing,\n setSidebarShowing,\n };\n};\n\nexport default {\n useDashboardLayoutData,\n useDashboardMessages,\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { FC } from 'react';
2
+ import { ProgressCardProps } from '../../data/types';
3
+ import './index.scss';
4
+ export declare const ProgressCard: FC<ProgressCardProps>;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Button, Row, Col } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from '../messages';
5
+ import './index.scss';
6
+ export const ProgressCard = ({ progressCardData, isLoading }) => {
7
+ const { formatMessage } = useIntl();
8
+ const { title, enrollmentInfo, certificateStatus } = progressCardData;
9
+ return (_jsxs(Card, { className: "progress-card", "data-testid": "progress-card", isLoading: isLoading, children: [_jsx(Card.Section, { className: "pt-3 pb-2 px-4", children: _jsxs(Row, { children: [_jsxs(Col, { xs: 12, children: [_jsx("h4", { className: "mb-1 font-weight-bold", children: title }), _jsx("div", { className: "text-muted", children: formatMessage(messages.programProgressCardEnrollment, { enrollmentInfo }) })] }), _jsx(Col, { xs: 12, className: "d-flex justify-content-md-end align-items-start", children: _jsx(Button, { variant: "primary", children: formatMessage(messages.programProgressCardResumeButton) }) })] }) }), _jsx(Card.Section, { className: "pt-3 pb-2 px-4", children: _jsxs(Row, { children: [_jsx(Col, { xs: 12, md: 9, children: _jsx("span", { children: formatMessage(messages.programProgressCardCertificate, {
10
+ certificateStatus,
11
+ bold: (chunks) => (_jsx("span", { className: "font-weight-bold", children: chunks })),
12
+ }) }) }), _jsx(Col, { xs: 12, md: 3, className: "d-flex justify-content-md-end", children: _jsx(Button, { variant: "outline-brand", children: formatMessage(messages.programProgressCardUpgradeButton) }) })] }) })] }));
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/containers/ProgramDashboard/ProgramProgress/ProgressCard/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE;IACrF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,CAAC;IAEtE,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAC,eAAe,iBAAa,eAAe,EAAC,SAAS,EAAE,SAAS,aAC9E,KAAC,IAAI,CAAC,OAAO,IAAC,SAAS,EAAC,gBAAgB,YACtC,MAAC,GAAG,eACF,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,aACT,aAAI,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAM,EAClD,cAAK,SAAS,EAAC,YAAY,YACxB,aAAa,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,cAAc,EAAE,CAAC,GACtE,IACF,EACN,KAAC,GAAG,IACF,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,iDAAiD,YAE3D,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,YACtB,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,GACjD,GACL,IACF,GACO,EAEf,KAAC,IAAI,CAAC,OAAO,IAAC,SAAS,EAAC,gBAAgB,YACtC,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAChB,yBACG,aAAa,CAAC,QAAQ,CAAC,8BAA8B,EAAE;oCACtD,iBAAiB;oCACjB,IAAI,EAAE,CAAC,MAAuB,EAAE,EAAE,CAAC,CACjC,eAAM,SAAS,EAAC,kBAAkB,YAAE,MAAM,GAAQ,CACnD;iCACF,CAAC,GACG,GACH,EAEN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,+BAA+B,YAC3D,KAAC,MAAM,IAAC,OAAO,EAAC,eAAe,YAC5B,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC,GAClD,GACL,IACF,GACO,IACV,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { FC } from 'react';\nimport { Card, Button, Row, Col } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { ProgressCardProps } from '../../data/types';\nimport messages from '../messages';\nimport './index.scss';\n\nexport const ProgressCard: FC<ProgressCardProps> = ({ progressCardData, isLoading }) => {\n const { formatMessage } = useIntl();\n const { title, enrollmentInfo, certificateStatus } = progressCardData;\n\n return (\n <Card className=\"progress-card\" data-testid=\"progress-card\" isLoading={isLoading}>\n <Card.Section className=\"pt-3 pb-2 px-4\">\n <Row>\n <Col xs={12}>\n <h4 className=\"mb-1 font-weight-bold\">{title}</h4>\n <div className=\"text-muted\">\n {formatMessage(messages.programProgressCardEnrollment, { enrollmentInfo })}\n </div>\n </Col>\n <Col\n xs={12}\n className=\"d-flex justify-content-md-end align-items-start\"\n >\n <Button variant=\"primary\">\n {formatMessage(messages.programProgressCardResumeButton)}\n </Button>\n </Col>\n </Row>\n </Card.Section>\n\n <Card.Section className=\"pt-3 pb-2 px-4\">\n <Row>\n <Col xs={12} md={9}>\n <span>\n {formatMessage(messages.programProgressCardCertificate, {\n certificateStatus,\n bold: (chunks: React.ReactNode) => (\n <span className=\"font-weight-bold\">{chunks}</span>\n ),\n })}\n </span>\n </Col>\n\n <Col xs={12} md={3} className=\"d-flex justify-content-md-end\">\n <Button variant=\"outline-brand\">\n {formatMessage(messages.programProgressCardUpgradeButton)}\n </Button>\n </Col>\n </Row>\n </Card.Section>\n </Card>\n );\n};\n"]}
@@ -0,0 +1,3 @@
1
+ .progress-card{
2
+ background-color: var(--pgn-color-light-200);
3
+ }
@@ -29,5 +29,25 @@ declare const messages: {
29
29
  id: string;
30
30
  description: string;
31
31
  };
32
+ programProgressCardEnrollment: {
33
+ defaultMessage: string;
34
+ id: string;
35
+ description: string;
36
+ };
37
+ programProgressCardCertificate: {
38
+ defaultMessage: string;
39
+ id: string;
40
+ description: string;
41
+ };
42
+ programProgressCardResumeButton: {
43
+ defaultMessage: string;
44
+ id: string;
45
+ description: string;
46
+ };
47
+ programProgressCardUpgradeButton: {
48
+ defaultMessage: string;
49
+ id: string;
50
+ description: string;
51
+ };
32
52
  };
33
53
  export default messages;
@@ -28,7 +28,27 @@ const messages = defineMessages({
28
28
  programProgressIncompleteText: {
29
29
  defaultMessage: 'Track and plan your progress through the {totalCoursesInProgram} courses in this program. To complete the program, you must earn a verified certificate for each course.',
30
30
  id: 'program.progress.incomplete.text',
31
- description: 'text to diplay when a user has not completed all of the courses for a program',
31
+ description: 'text to display when a user has not completed all of the courses for a program',
32
+ },
33
+ programProgressCardEnrollment: {
34
+ defaultMessage: 'Enrolled: {enrollmentInfo}',
35
+ id: 'program.progress.card.enrollment.text',
36
+ description: 'text to display on the progress card related to the enrollment date for the course',
37
+ },
38
+ programProgressCardCertificate: {
39
+ defaultMessage: '<bold>Certificate Status:</bold> {certificateStatus}',
40
+ id: 'program.progress.card.certificate.text',
41
+ description: 'text to display on the progress card related to the certificate status for the course',
42
+ },
43
+ programProgressCardResumeButton: {
44
+ defaultMessage: 'Resume course',
45
+ id: 'program.progress.card.resume.button.text',
46
+ description: 'text to display on the progress card for the resume course button',
47
+ },
48
+ programProgressCardUpgradeButton: {
49
+ defaultMessage: 'Upgrade with your subscription',
50
+ id: 'program.progress.card.upgrade.button.text',
51
+ description: 'text to display on the progress card for the upgrade button',
32
52
  },
33
53
  });
34
54
  export default messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,2BAA2B,EAAE;QAC3B,cAAc,EAAE,cAAc;QAC9B,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,yCAAyC;KACvD;IACD,gBAAgB,EAAE;QAChB,cAAc,EAAE,uBAAuB;QACvC,EAAE,EAAE,qCAAqC;QACzC,WAAW,EAAE,qGAAqG;KACnH;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,kBAAkB;QAClC,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,yEAAyE;KACvF;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,0EAA0E;QAC1F,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,8EAA8E;KAC5F;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,sBAAsB;QACtC,EAAE,EAAE,oCAAoC;QACxC,WAAW,EAAE,sFAAsF;KACpG;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,0KAA0K;QAC1L,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,+EAA+E;KAC7F;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n programProgressInstitutions: {\n defaultMessage: 'Institutions',\n id: 'program.progress.institutions',\n description: 'Label text for organization image logos',\n },\n programTypeLabel: {\n defaultMessage: '{programType} program',\n id: 'program.progress.program.type.label',\n description: 'Label displaying the program type (e.g. \"MicroMasters program\", \"Professional Certificate program\")',\n },\n programProgressCompleteHeader: {\n defaultMessage: 'Congratulations!',\n id: 'program.progress.complete.header',\n description: 'header text for the program progress page when all courses are complete',\n },\n programProgressCompleteText: {\n defaultMessage: 'You have successfully completed all the requirements for {programTitle}.',\n id: 'program.progress.complete.text',\n description: 'text to display when a user has completed all of the courses for the program',\n },\n programProgressIncompleteHeader: {\n defaultMessage: 'Your Program Journey',\n id: 'program.progress.incomplete.header',\n description: 'header text to display when the user has remaining incomplete courses in the program',\n },\n programProgressIncompleteText: {\n defaultMessage: 'Track and plan your progress through the {totalCoursesInProgram} courses in this program. To complete the program, you must earn a verified certificate for each course.',\n id: 'program.progress.incomplete.text',\n description: 'text to diplay when a user has not completed all of the courses for a program',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramProgress/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,2BAA2B,EAAE;QAC3B,cAAc,EAAE,cAAc;QAC9B,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,yCAAyC;KACvD;IACD,gBAAgB,EAAE;QAChB,cAAc,EAAE,uBAAuB;QACvC,EAAE,EAAE,qCAAqC;QACzC,WAAW,EAAE,qGAAqG;KACnH;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,kBAAkB;QAClC,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,yEAAyE;KACvF;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,0EAA0E;QAC1F,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,8EAA8E;KAC5F;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,sBAAsB;QACtC,EAAE,EAAE,oCAAoC;QACxC,WAAW,EAAE,sFAAsF;KACpG;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,0KAA0K;QAC1L,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,gFAAgF;KAC9F;IACD,6BAA6B,EAAE;QAC7B,cAAc,EAAE,4BAA4B;QAC5C,EAAE,EAAE,uCAAuC;QAC3C,WAAW,EAAE,oFAAoF;KAClG;IACD,8BAA8B,EAAE;QAC9B,cAAc,EAAE,sDAAsD;QACtE,EAAE,EAAE,wCAAwC;QAC5C,WAAW,EAAE,uFAAuF;KACrG;IACD,+BAA+B,EAAE;QAC/B,cAAc,EAAE,eAAe;QAC/B,EAAE,EAAE,0CAA0C;QAC9C,WAAW,EAAE,mEAAmE;KACjF;IACD,gCAAgC,EAAE;QAChC,cAAc,EAAE,gCAAgC;QAChD,EAAE,EAAE,2CAA2C;QAC/C,WAAW,EAAE,6DAA6D;KAC3E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n programProgressInstitutions: {\n defaultMessage: 'Institutions',\n id: 'program.progress.institutions',\n description: 'Label text for organization image logos',\n },\n programTypeLabel: {\n defaultMessage: '{programType} program',\n id: 'program.progress.program.type.label',\n description: 'Label displaying the program type (e.g. \"MicroMasters program\", \"Professional Certificate program\")',\n },\n programProgressCompleteHeader: {\n defaultMessage: 'Congratulations!',\n id: 'program.progress.complete.header',\n description: 'header text for the program progress page when all courses are complete',\n },\n programProgressCompleteText: {\n defaultMessage: 'You have successfully completed all the requirements for {programTitle}.',\n id: 'program.progress.complete.text',\n description: 'text to display when a user has completed all of the courses for the program',\n },\n programProgressIncompleteHeader: {\n defaultMessage: 'Your Program Journey',\n id: 'program.progress.incomplete.header',\n description: 'header text to display when the user has remaining incomplete courses in the program',\n },\n programProgressIncompleteText: {\n defaultMessage: 'Track and plan your progress through the {totalCoursesInProgram} courses in this program. To complete the program, you must earn a verified certificate for each course.',\n id: 'program.progress.incomplete.text',\n description: 'text to display when a user has not completed all of the courses for a program',\n },\n programProgressCardEnrollment: {\n defaultMessage: 'Enrolled: {enrollmentInfo}',\n id: 'program.progress.card.enrollment.text',\n description: 'text to display on the progress card related to the enrollment date for the course',\n },\n programProgressCardCertificate: {\n defaultMessage: '<bold>Certificate Status:</bold> {certificateStatus}',\n id: 'program.progress.card.certificate.text',\n description: 'text to display on the progress card related to the certificate status for the course',\n },\n programProgressCardResumeButton: {\n defaultMessage: 'Resume course',\n id: 'program.progress.card.resume.button.text',\n description: 'text to display on the progress card for the resume course button',\n },\n programProgressCardUpgradeButton: {\n defaultMessage: 'Upgrade with your subscription',\n id: 'program.progress.card.upgrade.button.text',\n description: 'text to display on the progress card for the upgrade button',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ProgramCardProps } from '../data/types';
3
+ declare const ProgramListCard: React.FC<ProgramCardProps>;
4
+ export default ProgramListCard;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from 'react-router-dom';
3
+ import { breakpoints, useWindowSize, Card, Row, } from '@openedx/paragon';
4
+ import programCardFallbackImage from '../assets/program-card-fallback.svg';
5
+ import ProgressCategoryBubbles from './ProgressCategoryBubbles';
6
+ const ProgramListCard = ({ program, }) => {
7
+ var _a;
8
+ const { width: windowWidth } = useWindowSize();
9
+ const getBannerImageURL = () => {
10
+ let imageURL = '';
11
+ // We need to check that the breakpoint value exists before using it
12
+ // Otherwise TypeScript will flag it as it can potentially be undefined in Paragon
13
+ if (program.bannerImage && Object.keys(program.bannerImage).length > 0) {
14
+ if (!windowWidth) {
15
+ return program.bannerImage.medium.url;
16
+ }
17
+ if (typeof breakpoints.large.minWidth === 'number' && windowWidth >= breakpoints.large.minWidth) {
18
+ imageURL = program.bannerImage.large.url;
19
+ }
20
+ else if (typeof breakpoints.medium.minWidth === 'number' && windowWidth >= breakpoints.medium.minWidth) {
21
+ imageURL = program.bannerImage.medium.url;
22
+ }
23
+ else if (typeof breakpoints.small.minWidth === 'number' && windowWidth >= breakpoints.small.minWidth) {
24
+ imageURL = program.bannerImage.small.url;
25
+ }
26
+ else {
27
+ imageURL = program.bannerImage.xSmall.url;
28
+ }
29
+ }
30
+ return imageURL;
31
+ };
32
+ const getOrgImageUrl = () => {
33
+ var _a;
34
+ if (((_a = program.authoringOrganizations) === null || _a === void 0 ? void 0 : _a.length) === 1 && program.authoringOrganizations[0].logoImageUrl) {
35
+ return program.authoringOrganizations[0].logoImageUrl;
36
+ }
37
+ return '';
38
+ };
39
+ return (_jsxs(Card, { className: "program-list-card mb-4 mr-4", isClickable: true, as: Link, to: `/program-progress/${program.uuid}`, "data-testid": "program-list-card", children: [_jsx(Card.ImageCap, { src: getBannerImageURL() || programCardFallbackImage, srcAlt: `program card image for ${program.title}`, logoSrc: getOrgImageUrl(), logoAlt: program.authoringOrganizations && ((_a = program.authoringOrganizations[0]) === null || _a === void 0 ? void 0 : _a.key), className: "banner-image" }), _jsx(Card.Section, { className: "pb-0 small", children: _jsxs(Row, { className: "justify-content-between px-2.5", children: [program.authoringOrganizations && (_jsx("p", { className: "truncate-text-1", children: program.authoringOrganizations.map(org => org.key).join(', ') })), _jsx("p", { children: program.type })] }) }), _jsx(Card.Section, { children: _jsx("h4", { className: "truncate-text-2", children: program.title }) }), _jsx(Card.Section, { children: _jsx(ProgressCategoryBubbles, { inProgress: program.progress.inProgress, notStarted: program.progress.notStarted, completed: program.progress.completed }) })] }));
40
+ };
41
+ export default ProgramListCard;
42
+ //# sourceMappingURL=ProgramListCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramListCard.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramsList/ProgramListCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EACL,WAAW,EACX,aAAa,EACb,IAAI,EACJ,GAAG,GACJ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,wBAAwB,MAAM,qCAAqC,CAAC;AAE3E,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAEhE,MAAM,eAAe,GAA+B,CAAC,EACnD,OAAO,GACR,EAAE,EAAE;;IACH,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;IAE/C,MAAM,iBAAiB,GAAG,GAAW,EAAE;QACrC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,oEAAoE;QACpE,kFAAkF;QAClF,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;YACxC,CAAC;YAED,IAAI,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAChG,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;YAC3C,CAAC;iBAAM,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACzG,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5C,CAAC;iBAAM,IAAI,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACvG,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAW,EAAE;;QAClC,IAAI,CAAA,MAAA,OAAO,CAAC,sBAAsB,0CAAE,MAAM,MAAK,CAAC,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;YACnG,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAC,6BAA6B,EACvC,WAAW,QACX,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,qBAAqB,OAAO,CAAC,IAAI,EAAE,iBAC3B,mBAAmB,aAE/B,KAAC,IAAI,CAAC,QAAQ,IACZ,GAAG,EAAE,iBAAiB,EAAE,IAAI,wBAAwB,EACpD,MAAM,EAAE,0BAA0B,OAAO,CAAC,KAAK,EAAE,EACjD,OAAO,EAAE,cAAc,EAAE,EACzB,OAAO,EAAE,OAAO,CAAC,sBAAsB,KAAI,MAAA,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAA,EACjF,SAAS,EAAC,cAAc,GACxB,EACF,KAAC,IAAI,CAAC,OAAO,IAAC,SAAS,EAAC,YAAY,YAClC,MAAC,GAAG,IAAC,SAAS,EAAC,gCAAgC,aAC5C,OAAO,CAAC,sBAAsB,IAAI,CACjC,YAAG,SAAS,EAAC,iBAAiB,YAC3B,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAC5D,CACL,EACD,sBACG,OAAO,CAAC,IAAI,GACX,IACA,GACO,EACf,KAAC,IAAI,CAAC,OAAO,cACX,aAAI,SAAS,EAAC,iBAAiB,YAAE,OAAO,CAAC,KAAK,GAAM,GACvC,EACf,KAAC,IAAI,CAAC,OAAO,cACX,KAAC,uBAAuB,IACtB,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EACvC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EACvC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,GACrC,GACW,IACV,CACR,CAAC;AACJ,CAAC,CAAC;AACF,eAAe,eAAe,CAAC","sourcesContent":["import React from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n breakpoints,\n useWindowSize,\n Card,\n Row,\n} from '@openedx/paragon';\nimport programCardFallbackImage from '../assets/program-card-fallback.svg';\nimport { ProgramCardProps } from '../data/types';\nimport ProgressCategoryBubbles from './ProgressCategoryBubbles';\n\nconst ProgramListCard: React.FC<ProgramCardProps> = ({\n program,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const getBannerImageURL = (): string => {\n let imageURL = '';\n // We need to check that the breakpoint value exists before using it\n // Otherwise TypeScript will flag it as it can potentially be undefined in Paragon\n if (program.bannerImage && Object.keys(program.bannerImage).length > 0) {\n if (!windowWidth) {\n return program.bannerImage.medium.url;\n }\n\n if (typeof breakpoints.large.minWidth === 'number' && windowWidth >= breakpoints.large.minWidth) {\n imageURL = program.bannerImage.large.url;\n } else if (typeof breakpoints.medium.minWidth === 'number' && windowWidth >= breakpoints.medium.minWidth) {\n imageURL = program.bannerImage.medium.url;\n } else if (typeof breakpoints.small.minWidth === 'number' && windowWidth >= breakpoints.small.minWidth) {\n imageURL = program.bannerImage.small.url;\n } else {\n imageURL = program.bannerImage.xSmall.url;\n }\n }\n return imageURL;\n };\n\n const getOrgImageUrl = (): string => {\n if (program.authoringOrganizations?.length === 1 && program.authoringOrganizations[0].logoImageUrl) {\n return program.authoringOrganizations[0].logoImageUrl;\n }\n return '';\n };\n\n return (\n <Card\n className=\"program-list-card mb-4 mr-4\"\n isClickable\n as={Link}\n to={`/program-progress/${program.uuid}`}\n data-testid=\"program-list-card\"\n >\n <Card.ImageCap\n src={getBannerImageURL() || programCardFallbackImage}\n srcAlt={`program card image for ${program.title}`}\n logoSrc={getOrgImageUrl()}\n logoAlt={program.authoringOrganizations && program.authoringOrganizations[0]?.key}\n className=\"banner-image\"\n />\n <Card.Section className=\"pb-0 small\">\n <Row className=\"justify-content-between px-2.5\">\n {program.authoringOrganizations && (\n <p className=\"truncate-text-1\">\n {program.authoringOrganizations.map(org => org.key).join(', ')}\n </p>\n )}\n <p>\n {program.type}\n </p>\n </Row>\n </Card.Section>\n <Card.Section>\n <h4 className=\"truncate-text-2\">{program.title}</h4>\n </Card.Section>\n <Card.Section>\n <ProgressCategoryBubbles\n inProgress={program.progress.inProgress}\n notStarted={program.progress.notStarted}\n completed={program.progress.completed}\n />\n </Card.Section>\n </Card>\n );\n};\nexport default ProgramListCard;\n"]}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { Progress } from '../data/types';
3
+ declare const ProgressCategoryBubbles: React.FC<Progress>;
4
+ export default ProgressCategoryBubbles;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Bubble, Stack } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from './messages';
5
+ const ProgressCategoryBubbles = ({ notStarted, inProgress, completed }) => {
6
+ const { formatMessage } = useIntl();
7
+ return (_jsxs(Stack, { direction: "horizontal", gap: 2, className: "flex-wrap", children: [_jsxs(Stack, { direction: "vertical", className: "align-items-center", gap: 1, children: [_jsx(Bubble, { variant: "success", "data-testid": "completed-count", children: completed }), _jsx("div", { children: formatMessage(messages.progressCategoryBubblesSuccess) })] }), _jsxs(Stack, { direction: "vertical", className: "align-items-center", gap: 1, children: [_jsx(Bubble, { "data-testid": "in-progress-count", children: inProgress }), _jsx("div", { children: formatMessage(messages.progressCategoryBubblesInProgress) })] }), _jsxs(Stack, { direction: "vertical", className: "align-items-center", gap: 1, children: [_jsx(Bubble, { className: "text-gray-900", variant: "warning", "data-testid": "remaining-count", children: notStarted }), _jsx("div", { children: formatMessage(messages.progressCategoryBubblesRemaining) })] })] }));
8
+ };
9
+ export default ProgressCategoryBubbles;
10
+ //# sourceMappingURL=ProgressCategoryBubbles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressCategoryBubbles.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramsList/ProgressCategoryBubbles.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAIlC,MAAM,uBAAuB,GAAuB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5F,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,OAAO,CACL,MAAC,KAAK,IAAC,SAAS,EAAC,YAAY,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,WAAW,aACzD,MAAC,KAAK,IAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,oBAAoB,EAAC,GAAG,EAAE,CAAC,aAC/D,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,iBAAa,iBAAiB,YACpD,SAAS,GACH,EACT,wBACG,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,GACnD,IACA,EAER,MAAC,KAAK,IAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,oBAAoB,EAAC,GAAG,EAAE,CAAC,aAC/D,KAAC,MAAM,mBAAa,mBAAmB,YACpC,UAAU,GACJ,EACT,wBACG,aAAa,CAAC,QAAQ,CAAC,iCAAiC,CAAC,GACtD,IACA,EAER,MAAC,KAAK,IAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,oBAAoB,EAAC,GAAG,EAAE,CAAC,aAC/D,KAAC,MAAM,IAAC,SAAS,EAAC,eAAe,EAAC,OAAO,EAAC,SAAS,iBAAa,iBAAiB,YAC9E,UAAU,GACJ,EACT,wBACG,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC,GACrD,IACA,IACF,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,uBAAuB,CAAC","sourcesContent":["import React from 'react';\nimport { Bubble, Stack } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from './messages';\n\nimport { Progress } from '../data/types';\n\nconst ProgressCategoryBubbles: React.FC<Progress> = ({ notStarted, inProgress, completed }) => {\n const { formatMessage } = useIntl();\n return (\n <Stack direction=\"horizontal\" gap={2} className=\"flex-wrap\">\n <Stack direction=\"vertical\" className=\"align-items-center\" gap={1}>\n <Bubble variant=\"success\" data-testid=\"completed-count\">\n {completed}\n </Bubble>\n <div>\n {formatMessage(messages.progressCategoryBubblesSuccess)}\n </div>\n </Stack>\n\n <Stack direction=\"vertical\" className=\"align-items-center\" gap={1}>\n <Bubble data-testid=\"in-progress-count\">\n {inProgress}\n </Bubble>\n <div>\n {formatMessage(messages.progressCategoryBubblesInProgress)}\n </div>\n </Stack>\n\n <Stack direction=\"vertical\" className=\"align-items-center\" gap={1}>\n <Bubble className=\"text-gray-900\" variant=\"warning\" data-testid=\"remaining-count\">\n {notStarted}\n </Bubble>\n <div>\n {formatMessage(messages.progressCategoryBubblesRemaining)}\n </div>\n </Stack>\n </Stack>\n );\n};\n\nexport default ProgressCategoryBubbles;\n"]}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import './index.scss';
3
+ declare const ProgramsList: React.FC;
4
+ export default ProgramsList;
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { Alert, CardGrid, Col, Container, Row, Spinner, } from '@openedx/paragon';
4
+ import { useIntl, logError, getSiteConfig } from '@openedx/frontend-base';
5
+ import appMessages from '../../../messages';
6
+ import ProgramListCard from './ProgramListCard';
7
+ import messages from './messages';
8
+ import './index.scss';
9
+ import { useProgramsListData } from '../../../data/hooks';
10
+ const ProgramsList = () => {
11
+ const { formatMessage } = useIntl();
12
+ const { data: programsData = [], isLoading, isError: errorState, error, } = useProgramsListData();
13
+ useEffect(() => {
14
+ if (error) {
15
+ logError(error);
16
+ }
17
+ }, [error]);
18
+ const renderPrograms = () => {
19
+ if (isLoading) {
20
+ return (_jsx(Col, { sm: 12, className: "d-flex justify-content-center py-4", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(appMessages['subs-dash.loadingSR']) }) }));
21
+ }
22
+ if (programsData.length > 0) {
23
+ return (_jsx(_Fragment, { children: _jsx(Col, { sm: 12, md: 12, children: _jsx(CardGrid, { columnSizes: { xs: 12, lg: 6 }, children: programsData.map(program => (_jsx(ProgramListCard, { program: program }, program.uuid))) }) }) }));
24
+ }
25
+ return null;
26
+ };
27
+ const renderFailureAlert = () => {
28
+ const contactUrl = `${getSiteConfig().lmsBaseUrl}/contact`;
29
+ return (_jsx(Alert, { className: "mx-auto container-mw-md", variant: "danger", children: formatMessage(messages.errorLoadingProgramEnrollments, {
30
+ contactSupportUrl: (_jsx(Alert.Link, { href: contactUrl, children: contactUrl })),
31
+ }) }));
32
+ };
33
+ return (_jsxs(Container, { size: "lg", children: [_jsx("h3", { children: formatMessage(messages.programsListHeaderText) }), _jsx("p", { children: formatMessage(messages.programsListDescriptionText) }), _jsx(Row, { className: "py-3", children: errorState ? renderFailureAlert() : renderPrograms() })] }));
34
+ };
35
+ export default ProgramsList;
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramsList/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EACL,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,GAC9C,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,OAAO,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,YAAY,GAAa,GAAG,EAAE;IAClC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,EACJ,IAAI,EAAE,YAAY,GAAG,EAAE,EACvB,SAAS,EACT,OAAO,EAAE,UAAU,EACnB,KAAK,GACN,GAAG,mBAAmB,EAAE,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CACL,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAC,oCAAoC,YACzD,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,EAAC,gBAAgB,EAAE,aAAa,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,GAAI,GAC/F,CACP,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CACL,4BACE,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,YACjB,KAAC,QAAQ,IAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,YACrC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAC3B,KAAC,eAAe,IAEd,OAAO,EAAE,OAAO,IADX,OAAO,CAAC,IAAI,CAEjB,CACH,CAAC,GACO,GACP,GACL,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,MAAM,UAAU,GAAG,GAAG,aAAa,EAAE,CAAC,UAAU,UAAU,CAAC;QAC3D,OAAO,CACL,KAAC,KAAK,IAAC,SAAS,EAAC,yBAAyB,EAAC,OAAO,EAAC,QAAQ,YACxD,aAAa,CAAC,QAAQ,CAAC,8BAA8B,EAAE;gBACtD,iBAAiB,EAAE,CACjB,KAAC,KAAK,CAAC,IAAI,IAAC,IAAI,EAAE,UAAU,YACzB,UAAU,GACA,CACd;aACF,CAAC,GACI,CACT,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IAAC,IAAI,EAAC,IAAI,aAClB,uBACG,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAC5C,EACL,sBACG,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,GAClD,EACJ,KAAC,GAAG,IAAC,SAAS,EAAC,MAAM,YAClB,UAAU,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,GACjD,IACI,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import React, { useEffect } from 'react';\nimport {\n Alert, CardGrid, Col, Container, Row, Spinner,\n} from '@openedx/paragon';\nimport { useIntl, logError, getSiteConfig } from '@openedx/frontend-base';\nimport appMessages from '../../../messages';\nimport ProgramListCard from './ProgramListCard';\nimport messages from './messages';\n\nimport './index.scss';\nimport { useProgramsListData } from '@src/data/hooks';\n\nconst ProgramsList: React.FC = () => {\n const { formatMessage } = useIntl();\n\n const {\n data: programsData = [],\n isLoading,\n isError: errorState,\n error,\n } = useProgramsListData();\n\n useEffect(() => {\n if (error) {\n logError(error);\n }\n }, [error]);\n\n const renderPrograms = () => {\n if (isLoading) {\n return (\n <Col sm={12} className=\"d-flex justify-content-center py-4\">\n <Spinner animation=\"border\" screenReaderText={formatMessage(appMessages['subs-dash.loadingSR'])} />\n </Col>\n );\n }\n if (programsData.length > 0) {\n return (\n <>\n <Col sm={12} md={12}>\n <CardGrid columnSizes={{ xs: 12, lg: 6 }}>\n {programsData.map(program => (\n <ProgramListCard\n key={program.uuid}\n program={program}\n />\n ))}\n </CardGrid>\n </Col>\n </>\n );\n }\n return null;\n };\n\n const renderFailureAlert = () => {\n const contactUrl = `${getSiteConfig().lmsBaseUrl}/contact`;\n return (\n <Alert className=\"mx-auto container-mw-md\" variant=\"danger\">\n {formatMessage(messages.errorLoadingProgramEnrollments, {\n contactSupportUrl: (\n <Alert.Link href={contactUrl}>\n {contactUrl}\n </Alert.Link>\n ),\n })}\n </Alert>\n );\n };\n\n return (\n <Container size=\"lg\">\n <h3>\n {formatMessage(messages.programsListHeaderText)}\n </h3>\n <p>\n {formatMessage(messages.programsListDescriptionText)}\n </p>\n <Row className=\"py-3\">\n {errorState ? renderFailureAlert() : renderPrograms()}\n </Row>\n </Container>\n );\n};\n\nexport default ProgramsList;\n"]}
@@ -0,0 +1,21 @@
1
+ // The current Truncate component in Paragon is deprecated and soon to be removed
2
+ // See https://github.com/openedx/paragon/issues/3311 for developments on this issue
3
+
4
+ .truncate-text-1 {
5
+ overflow: hidden;
6
+ display: -webkit-box;
7
+ -webkit-box-orient: vertical;
8
+ -webkit-line-clamp: 1;
9
+ }
10
+
11
+ .truncate-text-2 {
12
+ overflow: hidden;
13
+ display: -webkit-box;
14
+ -webkit-box-orient: vertical;
15
+ -webkit-line-clamp: 2;
16
+ }
17
+
18
+ .banner-image > .pgn__card-logo-cap {
19
+ width: 12rem;
20
+ height: 4.7rem;
21
+ }
@@ -0,0 +1,33 @@
1
+ declare const messages: {
2
+ programsListHeaderText: {
3
+ defaultMessage: string;
4
+ id: string;
5
+ description: string;
6
+ };
7
+ programsListDescriptionText: {
8
+ defaultMessage: string;
9
+ id: string;
10
+ description: string;
11
+ };
12
+ progressCategoryBubblesRemaining: {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ progressCategoryBubblesInProgress: {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ progressCategoryBubblesSuccess: {
23
+ id: string;
24
+ defaultMessage: string;
25
+ description: string;
26
+ };
27
+ errorLoadingProgramEnrollments: {
28
+ id: string;
29
+ defaultMessage: string;
30
+ description: string;
31
+ };
32
+ };
33
+ export default messages;
@@ -0,0 +1,35 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ programsListHeaderText: {
4
+ defaultMessage: 'Programs',
5
+ id: 'programs.list.header.text',
6
+ description: 'Header text for the programs list',
7
+ },
8
+ programsListDescriptionText: {
9
+ defaultMessage: 'When you enroll in a course associated with a program — professional certificate or MicroMasters — the program will be displayed here',
10
+ id: 'programs.list.description.text',
11
+ description: 'Description text for the programs list',
12
+ },
13
+ progressCategoryBubblesRemaining: {
14
+ id: 'dashboard.programs.program.listing.card.remaining.courses.count',
15
+ defaultMessage: 'Remaining',
16
+ description: 'Label for remaining courses count on program card',
17
+ },
18
+ progressCategoryBubblesInProgress: {
19
+ id: 'dashboard.programs.program.listing.card.inProgress.courses.count',
20
+ defaultMessage: 'In Progress',
21
+ description: 'Label for in progress courses count on program card',
22
+ },
23
+ progressCategoryBubblesSuccess: {
24
+ id: 'dashboard.programs.program.listing.card.completed.courses.count',
25
+ defaultMessage: 'Completed',
26
+ description: 'Label for completed courses count on program card',
27
+ },
28
+ errorLoadingProgramEnrollments: {
29
+ id: 'alert.error.loading.program.enrollments',
30
+ defaultMessage: 'An error occurred while attempting to retrieve program enrollments. Try refreshing the page. If that doesn\'t solve the issue, contact support at {contactSupportUrl}.',
31
+ description: 'Alert message for failure to load program enrollments',
32
+ },
33
+ });
34
+ export default messages;
35
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/containers/ProgramDashboard/ProgramsList/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,sBAAsB,EAAE;QACtB,cAAc,EAAE,UAAU;QAC1B,EAAE,EAAE,2BAA2B;QAC/B,WAAW,EAAE,mCAAmC;KACjD;IACD,2BAA2B,EAAE;QAC3B,cAAc,EAAE,uIAAuI;QACvJ,EAAE,EAAE,gCAAgC;QACpC,WAAW,EAAE,wCAAwC;KACtD;IACD,gCAAgC,EAAE;QAChC,EAAE,EAAE,iEAAiE;QACrE,cAAc,EAAE,WAAW;QAC3B,WAAW,EAAE,mDAAmD;KACjE;IACD,iCAAiC,EAAE;QACjC,EAAE,EAAE,kEAAkE;QACtE,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,qDAAqD;KACnE;IACD,8BAA8B,EAAE;QAC9B,EAAE,EAAE,iEAAiE;QACrE,cAAc,EAAE,WAAW;QAC3B,WAAW,EAAE,mDAAmD;KACjE;IACD,8BAA8B,EAAE;QAC9B,EAAE,EAAE,yCAAyC;QAC7C,cAAc,EAAE,wKAAwK;QACxL,WAAW,EAAE,uDAAuD;KACrE;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n programsListHeaderText: {\n defaultMessage: 'Programs',\n id: 'programs.list.header.text',\n description: 'Header text for the programs list',\n },\n programsListDescriptionText: {\n defaultMessage: 'When you enroll in a course associated with a program — professional certificate or MicroMasters — the program will be displayed here',\n id: 'programs.list.description.text',\n description: 'Description text for the programs list',\n },\n progressCategoryBubblesRemaining: {\n id: 'dashboard.programs.program.listing.card.remaining.courses.count',\n defaultMessage: 'Remaining',\n description: 'Label for remaining courses count on program card',\n },\n progressCategoryBubblesInProgress: {\n id: 'dashboard.programs.program.listing.card.inProgress.courses.count',\n defaultMessage: 'In Progress',\n description: 'Label for in progress courses count on program card',\n },\n progressCategoryBubblesSuccess: {\n id: 'dashboard.programs.program.listing.card.completed.courses.count',\n defaultMessage: 'Completed',\n description: 'Label for completed courses count on program card',\n },\n errorLoadingProgramEnrollments: {\n id: 'alert.error.loading.program.enrollments',\n defaultMessage: 'An error occurred while attempting to retrieve program enrollments. Try refreshing the page. If that doesn\\'t solve the issue, contact support at {contactSupportUrl}.',\n description: 'Alert message for failure to load program enrollments',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,3 @@
1
+ <svg width="380" height="203" viewBox="0 0 380 203" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="380" height="203" fill="#D8D4D6"/>
3
+ </svg>
@@ -1,2 +1,3 @@
1
1
  import ProgramProgress from './ProgramProgress';
2
- export { ProgramProgress, };
2
+ import ProgramsList from './ProgramsList';
3
+ export { ProgramProgress, ProgramsList, };
@@ -1,3 +1,4 @@
1
1
  import ProgramProgress from './ProgramProgress';
2
- export { ProgramProgress, };
2
+ import ProgramsList from './ProgramsList';
3
+ export { ProgramProgress, ProgramsList, };
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ProgramDashboard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,eAAe,GAChB,CAAC","sourcesContent":["import ProgramProgress from './ProgramProgress';\n\nexport {\n ProgramProgress,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ProgramDashboard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,YAAY,GACb,CAAC","sourcesContent":["import ProgramProgress from './ProgramProgress';\nimport ProgramsList from './ProgramsList';\n\nexport {\n ProgramProgress,\n ProgramsList,\n};\n"]}
@@ -1,3 +1,3 @@
1
- import { useInitializeLearnerHome } from './queryHooks';
1
+ import { useInitializeLearnerHome, useProgramsListData } from './queryHooks';
2
2
  import { useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail } from './mutationHooks';
3
- export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, };
3
+ export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, };
@@ -1,4 +1,4 @@
1
- import { useInitializeLearnerHome } from './queryHooks';
1
+ import { useInitializeLearnerHome, useProgramsListData } from './queryHooks';
2
2
  import { useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, } from './mutationHooks';
3
- export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, };
3
+ export { useInitializeLearnerHome, useUnenrollFromCourse, useUpdateEntitlementEnrollment, useDeleteEntitlementEnrollment, useUpdateEmailSettings, useCreateCreditRequest, useSendConfirmEmail, useProgramsListData, };
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,CAAC","sourcesContent":["import { useInitializeLearnerHome } from './queryHooks';\nimport {\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n} from './mutationHooks';\n\nexport {\n useInitializeLearnerHome,\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,CAAC","sourcesContent":["import { useInitializeLearnerHome, useProgramsListData } from './queryHooks';\nimport {\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n} from './mutationHooks';\n\nexport {\n useInitializeLearnerHome,\n useUnenrollFromCourse,\n useUpdateEntitlementEnrollment,\n useDeleteEntitlementEnrollment,\n useUpdateEmailSettings,\n useCreateCreditRequest,\n useSendConfirmEmail,\n useProgramsListData,\n};\n"]}
@@ -1,3 +1,4 @@
1
+ import { ProgramData } from '@src/containers/ProgramDashboard/data/types';
1
2
  declare const useInitializeLearnerHome: () => {
2
3
  data: any;
3
4
  error: any;
@@ -161,4 +162,5 @@ declare const useInitializeLearnerHome: () => {
161
162
  fetchStatus: import("@tanstack/query-core").FetchStatus;
162
163
  promise: Promise<any>;
163
164
  };
164
- export { useInitializeLearnerHome, };
165
+ declare const useProgramsListData: () => import("@tanstack/react-query").UseQueryResult<ProgramData[], Error>;
166
+ export { useInitializeLearnerHome, useProgramsListData, };
@@ -11,7 +11,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query';
11
11
  import { useContext, useEffect } from 'react';
12
12
  import { useMasquerade } from '../../data/context';
13
13
  import GlobalDataContext from '../../data/contexts/GlobalDataContext';
14
- import { initializeList, } from '../../data/services/lms/api';
14
+ import { initializeList, fetchProgramsListData, } from '../../data/services/lms/api';
15
15
  import { getTransformedCourseDataObject } from '../../utils/dataTransformers';
16
16
  import { learnerDashboardQueryKeys } from './queryKeys';
17
17
  const useInitializeLearnerHome = () => {
@@ -53,5 +53,13 @@ const useInitializeLearnerHome = () => {
53
53
  }
54
54
  return Object.assign(Object.assign({}, query), { data });
55
55
  };
56
- export { useInitializeLearnerHome, };
56
+ const useProgramsListData = () => {
57
+ return useQuery({
58
+ queryKey: ['programsList'],
59
+ queryFn: fetchProgramsListData,
60
+ retry: false,
61
+ refetchOnWindowFocus: false,
62
+ });
63
+ };
64
+ export { useInitializeLearnerHome, useProgramsListData, };
57
65
  //# sourceMappingURL=queryHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EACL,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,wBAAwB,GAAG,GAAG,EAAE;IACpC,MAAM,EAAE,cAAc,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,QAAQ,CAAC;QACrB,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,cAAc,CAAC;QAC9D,OAAO,EAAE,GAAS,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;YAClD,uCACK,IAAI,KACP,eAAe,EAAE,8BAA8B,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,KAAI,EAAE,CAAC,IACpE;QACJ,CAAC,CAAA;QACD,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,0DAA0D;QACpF,KAAK,EAAE,CAAC,YAAY,EAAE,KAAU,EAAE,EAAE;;YAClC,gEAAgE;YAChE,IAAI,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,MAAM,KAAI,GAAG,IAAI,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,MAAM,IAAG,GAAG;gBAAE,OAAO,KAAK,CAAC;YAClF,OAAO,YAAY,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,YAAY,EAAE,CAAC,cAAc;QAC7B,cAAc,EAAE,CAAC,cAAc;KAChC,CAAC,CAAC;IAEH,iFAAiF;IACjF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;gBACzD,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,mBAAmB,EAAE,CAAC;gBACvD,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE5E,sEAAsE;IACtE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,yBAAyB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,uCAAY,KAAK,KAAE,IAAI,IAAG;AAC5B,CAAC,CAAC;AAEF,OAAO,EACL,wBAAwB,GACzB,CAAC","sourcesContent":["import { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useContext, useEffect } from 'react';\nimport { useMasquerade } from '@src/data/context';\nimport GlobalDataContext from '@src/data/contexts/GlobalDataContext';\nimport {\n initializeList,\n} from '@src/data/services/lms/api';\nimport { getTransformedCourseDataObject } from '@src/utils/dataTransformers';\nimport { learnerDashboardQueryKeys } from './queryKeys';\n\nconst useInitializeLearnerHome = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n const { setEmailConfirmation, setPlatformSettings } = useContext(GlobalDataContext);\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initialize(masqueradeUser),\n queryFn: async () => {\n const data = await initializeList(masqueradeUser);\n return {\n ...data,\n coursesByCardId: getTransformedCourseDataObject(data?.courses || []),\n };\n },\n staleTime: 5 * 60 * 1000, // 5 minutes — dashboard data rarely changes while viewing\n retry: (failureCount, error: any) => {\n // Don't retry client errors (4xx) — they won't resolve on retry\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n // Populate shell-level GlobalDataProvider so header widgets can access this data\n useEffect(() => {\n if (query.data && !masqueradeUser) {\n if (query.data.emailConfirmation && setEmailConfirmation) {\n setEmailConfirmation(query.data.emailConfirmation);\n }\n if (query.data.platformSettings && setPlatformSettings) {\n setPlatformSettings(query.data.platformSettings);\n }\n }\n }, [masqueradeUser, query.data, setEmailConfirmation, setPlatformSettings]);\n\n // When masquerading fails, fall back to the normal user's cached data\n let { data } = query;\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(learnerDashboardQueryKeys.initialize(undefined));\n }\n\n return { ...query, data };\n};\n\nexport {\n useInitializeLearnerHome,\n};\n"]}
1
+ {"version":3,"file":"queryHooks.js","sourceRoot":"","sources":["../../../src/data/hooks/queryHooks.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,wBAAwB,GAAG,GAAG,EAAE;IACpC,MAAM,EAAE,cAAc,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,QAAQ,CAAC;QACrB,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,cAAc,CAAC;QAC9D,OAAO,EAAE,GAAS,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;YAClD,uCACK,IAAI,KACP,eAAe,EAAE,8BAA8B,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,KAAI,EAAE,CAAC,IACpE;QACJ,CAAC,CAAA;QACD,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,0DAA0D;QACpF,KAAK,EAAE,CAAC,YAAY,EAAE,KAAU,EAAE,EAAE;;YAClC,gEAAgE;YAChE,IAAI,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,MAAM,KAAI,GAAG,IAAI,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,MAAM,IAAG,GAAG;gBAAE,OAAO,KAAK,CAAC;YAClF,OAAO,YAAY,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,YAAY,EAAE,CAAC,cAAc;QAC7B,cAAc,EAAE,CAAC,cAAc;KAChC,CAAC,CAAC;IAEH,iFAAiF;IACjF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;gBACzD,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,mBAAmB,EAAE,CAAC;gBACvD,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE5E,sEAAsE;IACtE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,yBAAyB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,uCAAY,KAAK,KAAE,IAAI,IAAG;AAC5B,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC/B,OAAO,QAAQ,CAAgB;QAC7B,QAAQ,EAAE,CAAC,cAAc,CAAC;QAC1B,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,KAAK;QACZ,oBAAoB,EAAE,KAAK;KAC5B,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GACpB,CAAC","sourcesContent":["import { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useContext, useEffect } from 'react';\nimport { useMasquerade } from '@src/data/context';\nimport GlobalDataContext from '@src/data/contexts/GlobalDataContext';\nimport {\n initializeList,\n fetchProgramsListData,\n} from '@src/data/services/lms/api';\nimport { ProgramData } from '@src/containers/ProgramDashboard/data/types';\nimport { getTransformedCourseDataObject } from '@src/utils/dataTransformers';\nimport { learnerDashboardQueryKeys } from './queryKeys';\n\nconst useInitializeLearnerHome = () => {\n const { masqueradeUser } = useMasquerade();\n const queryClient = useQueryClient();\n const { setEmailConfirmation, setPlatformSettings } = useContext(GlobalDataContext);\n\n const query = useQuery({\n queryKey: learnerDashboardQueryKeys.initialize(masqueradeUser),\n queryFn: async () => {\n const data = await initializeList(masqueradeUser);\n return {\n ...data,\n coursesByCardId: getTransformedCourseDataObject(data?.courses || []),\n };\n },\n staleTime: 5 * 60 * 1000, // 5 minutes — dashboard data rarely changes while viewing\n retry: (failureCount, error: any) => {\n // Don't retry client errors (4xx) — they won't resolve on retry\n if (error?.response?.status >= 400 && error?.response?.status < 500) return false;\n return failureCount < 3;\n },\n retryOnMount: !masqueradeUser,\n refetchOnMount: !masqueradeUser,\n });\n\n // Populate shell-level GlobalDataProvider so header widgets can access this data\n useEffect(() => {\n if (query.data && !masqueradeUser) {\n if (query.data.emailConfirmation && setEmailConfirmation) {\n setEmailConfirmation(query.data.emailConfirmation);\n }\n if (query.data.platformSettings && setPlatformSettings) {\n setPlatformSettings(query.data.platformSettings);\n }\n }\n }, [masqueradeUser, query.data, setEmailConfirmation, setPlatformSettings]);\n\n // When masquerading fails, fall back to the normal user's cached data\n let { data } = query;\n if (masqueradeUser && query.isError) {\n data = queryClient.getQueryData(learnerDashboardQueryKeys.initialize(undefined));\n }\n\n return { ...query, data };\n};\n\nconst useProgramsListData = () => {\n return useQuery<ProgramData[]>({\n queryKey: ['programsList'],\n queryFn: fetchProgramsListData,\n retry: false,\n refetchOnWindowFocus: false,\n });\n};\n\nexport {\n useInitializeLearnerHome,\n useProgramsListData,\n};\n"]}
@@ -29,4 +29,5 @@ declare const createCreditRequest: ({ providerId, courseId, username }: {
29
29
  username: any;
30
30
  }) => Promise<any>;
31
31
  declare const sendConfirmEmail: (sendEmailUrl: string) => Promise<any>;
32
- export { initializeList, unenrollFromCourse, updateEntitlementEnrollment, deleteEntitlementEnrollment, updateEmailSettings, logEvent, logShare, createCreditRequest, sendConfirmEmail, };
32
+ declare const fetchProgramsListData: () => Promise<any>;
33
+ export { initializeList, unenrollFromCourse, updateEntitlementEnrollment, deleteEntitlementEnrollment, updateEmailSettings, logEvent, logShare, createCreditRequest, sendConfirmEmail, fetchProgramsListData, };
@@ -76,5 +76,10 @@ const sendConfirmEmail = (sendEmailUrl) => __awaiter(void 0, void 0, void 0, fun
76
76
  const response = yield getAuthenticatedHttpClient().post(sendEmailUrl);
77
77
  return response;
78
78
  });
79
- export { initializeList, unenrollFromCourse, updateEntitlementEnrollment, deleteEntitlementEnrollment, updateEmailSettings, logEvent, logShare, createCreditRequest, sendConfirmEmail, };
79
+ const fetchProgramsListData = () => __awaiter(void 0, void 0, void 0, function* () {
80
+ const url = urls.programsApiUrl();
81
+ const { data } = yield getAuthenticatedHttpClient().get(url);
82
+ return data;
83
+ });
84
+ export { initializeList, unenrollFromCourse, updateEntitlementEnrollment, deleteEntitlementEnrollment, updateEmailSettings, logEvent, logShare, createCreditRequest, sendConfirmEmail, fetchProgramsListData, };
80
85
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/lms/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { apiKeys, enableEmailsAction, unenrollmentAction } from '@src/data/services/lms/constants';\nimport urls from '@src/data/services/lms/urls';\nimport { stringifyUrl } from '@src/data/services/lms/utils';\nimport eventNames from '@src/tracking/constants';\n\nconst initializeList = async (user) => {\n const { data } = await getAuthenticatedHttpClient().get(\n stringifyUrl(urls.getInitApiUrl(), { [apiKeys.user]: user }),\n );\n return data;\n};\n\nconst unenrollFromCourse = async ({ courseId }) => {\n const url = urls.courseUnenroll();\n const formData = new FormData();\n formData.append(apiKeys.courseId, courseId);\n Object.entries(unenrollmentAction).forEach(([key, value]) => {\n formData.append(key, value);\n });\n const response = await getAuthenticatedHttpClient().post(url, formData);\n return response;\n};\n\nconst updateEntitlementEnrollment = async ({ uuid, courseId }) => {\n const url = urls.entitlementEnrollment(uuid);\n const content = { [apiKeys.courseRunId]: courseId };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst deleteEntitlementEnrollment = async ({ uuid, isRefundable }) => {\n const url = stringifyUrl(\n urls.entitlementEnrollment(uuid),\n { [apiKeys.isRefund]: isRefundable },\n );\n const response = await getAuthenticatedHttpClient().delete(url);\n return response;\n};\n\nconst updateEmailSettings = async ({ courseId, enable }) => {\n const url = urls.updateEmailSettings();\n const content = { [apiKeys.courseId]: courseId, ...(enable && enableEmailsAction) };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst logEvent = async ({ eventName, data, courseId }) => {\n const url = urls.event();\n const content = {\n courserun_key: courseId,\n event_type: eventName,\n page: window.location.href,\n event: JSON.stringify(data),\n };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst logShare = ({ courseId, site }) => {\n const eventData = {\n eventName: eventNames.shareClicked,\n courseId,\n data: {\n course_id: courseId,\n social_media_site: site,\n location: 'dashboard',\n },\n };\n return logEvent(eventData);\n};\n\nconst createCreditRequest = async ({ providerId, courseId, username }) => {\n const url = urls.creditRequestUrl(providerId);\n const content = { course_key: courseId, username };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst sendConfirmEmail = async (sendEmailUrl: string) => {\n const response = await getAuthenticatedHttpClient().post(sendEmailUrl);\n return response;\n};\n\nexport {\n initializeList,\n unenrollFromCourse,\n updateEntitlementEnrollment,\n deleteEntitlementEnrollment,\n updateEmailSettings,\n logEvent,\n logShare,\n createCreditRequest,\n sendConfirmEmail,\n};\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/lms/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { apiKeys, enableEmailsAction, unenrollmentAction } from '@src/data/services/lms/constants';\nimport urls from '@src/data/services/lms/urls';\nimport { stringifyUrl } from '@src/data/services/lms/utils';\nimport eventNames from '@src/tracking/constants';\n\nconst initializeList = async (user) => {\n const { data } = await getAuthenticatedHttpClient().get(\n stringifyUrl(urls.getInitApiUrl(), { [apiKeys.user]: user }),\n );\n return data;\n};\n\nconst unenrollFromCourse = async ({ courseId }) => {\n const url = urls.courseUnenroll();\n const formData = new FormData();\n formData.append(apiKeys.courseId, courseId);\n Object.entries(unenrollmentAction).forEach(([key, value]) => {\n formData.append(key, value);\n });\n const response = await getAuthenticatedHttpClient().post(url, formData);\n return response;\n};\n\nconst updateEntitlementEnrollment = async ({ uuid, courseId }) => {\n const url = urls.entitlementEnrollment(uuid);\n const content = { [apiKeys.courseRunId]: courseId };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst deleteEntitlementEnrollment = async ({ uuid, isRefundable }) => {\n const url = stringifyUrl(\n urls.entitlementEnrollment(uuid),\n { [apiKeys.isRefund]: isRefundable },\n );\n const response = await getAuthenticatedHttpClient().delete(url);\n return response;\n};\n\nconst updateEmailSettings = async ({ courseId, enable }) => {\n const url = urls.updateEmailSettings();\n const content = { [apiKeys.courseId]: courseId, ...(enable && enableEmailsAction) };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst logEvent = async ({ eventName, data, courseId }) => {\n const url = urls.event();\n const content = {\n courserun_key: courseId,\n event_type: eventName,\n page: window.location.href,\n event: JSON.stringify(data),\n };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst logShare = ({ courseId, site }) => {\n const eventData = {\n eventName: eventNames.shareClicked,\n courseId,\n data: {\n course_id: courseId,\n social_media_site: site,\n location: 'dashboard',\n },\n };\n return logEvent(eventData);\n};\n\nconst createCreditRequest = async ({ providerId, courseId, username }) => {\n const url = urls.creditRequestUrl(providerId);\n const content = { course_key: courseId, username };\n const response = await getAuthenticatedHttpClient().post(url, content);\n return response;\n};\n\nconst sendConfirmEmail = async (sendEmailUrl: string) => {\n const response = await getAuthenticatedHttpClient().post(sendEmailUrl);\n return response;\n};\n\nconst fetchProgramsListData = async () => {\n const url = urls.programsApiUrl();\n const { data } = await getAuthenticatedHttpClient().get(url);\n return data;\n};\n\nexport {\n initializeList,\n unenrollFromCourse,\n updateEntitlementEnrollment,\n deleteEntitlementEnrollment,\n updateEmailSettings,\n logEvent,\n logShare,\n createCreditRequest,\n sendConfirmEmail,\n fetchProgramsListData,\n};\n"]}
@@ -4,5 +4,6 @@ export function baseAppUrl(url: any): any;
4
4
  export function learningMfeUrl(url: any): any;
5
5
  export function creditPurchaseUrl(courseId: any): string;
6
6
  export function creditRequestUrl(providerId: any): string;
7
+ export function programsApiUrl(): string;
7
8
  declare const _default: any;
8
9
  export default _default;
@@ -21,6 +21,7 @@ export const creditPurchaseUrl = (courseId) => {
21
21
  : `${config.ECOMMERCE_BASE_URL}/credit/checkout/${courseId}/`;
22
22
  };
23
23
  export const creditRequestUrl = (providerId) => `${getApiUrl()}/credit/v1/providers/${providerId}/request/`;
24
+ export const programsApiUrl = () => `${getApiUrl()}/dashboard/v0/programs/`;
24
25
  export default StrictDict({
25
26
  getApiUrl,
26
27
  baseAppUrl,
@@ -33,5 +34,6 @@ export default StrictDict({
33
34
  learningMfeUrl,
34
35
  programsUrl,
35
36
  updateEmailSettings,
37
+ programsApiUrl,
36
38
  });
37
39
  //# sourceMappingURL=urls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,MAAM,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAEjE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,UAAU,EAAE,QAAQ,CAAC;AAC5C,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,GAAG,UAAU,EAAE,oBAAoB,CAAC;AACjE,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,wBAAwB,CAAC;AACzE,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,iCAAiC,IAAI,cAAc,CAAC;AAE1G,8CAA8C;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AAE3I,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAE7F,kBAAkB;AAClB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,EAAE;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,mBAAmB;QAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,mBAAmB,IAAI,QAAQ,GAAG;QAC9C,CAAC,CAAC,GAAG,MAAM,CAAC,kBAAkB,oBAAoB,QAAQ,GAAG,CAAC;AAClE,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,wBAAwB,UAAU,WAAW,CAAC;AAE5G,eAAe,UAAU,CAAC;IACxB,SAAS;IACT,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,qBAAqB;IACrB,KAAK;IACL,aAAa;IACb,cAAc;IACd,WAAW;IACX,mBAAmB;CACpB,CAAC,CAAC","sourcesContent":["import { appId } from '../../../constants';\nimport { StrictDict } from '../../../utils';\n\nimport { getAppConfig, getSiteConfig } from '@openedx/frontend-base';\n\nconst getBaseUrl = () => getSiteConfig().lmsBaseUrl;\n\nexport const getApiUrl = () => (`${getSiteConfig().lmsBaseUrl}/api`);\n\nconst getInitApiUrl = () => (`${getApiUrl()}/learner_home/init`);\n\nconst event = () => `${getBaseUrl()}/event`;\nconst courseUnenroll = () => `${getBaseUrl()}/change_enrollment`;\nconst updateEmailSettings = () => `${getApiUrl()}/change_email_settings`;\nconst entitlementEnrollment = (uuid) => `${getApiUrl()}/entitlements/v1/entitlements/${uuid}/enrollments`;\n\n// if url is null or absolute, return it as is\nexport const updateUrl = (base, url) => ((url == null || url.startsWith('http://') || url.startsWith('https://')) ? url : `${base}${url}`);\n\nexport const baseAppUrl = (url) => updateUrl(getBaseUrl(), url);\nexport const learningMfeUrl = (url) => updateUrl(getAppConfig(appId).LEARNING_BASE_URL, url);\n\n// static view url\nconst programsUrl = () => baseAppUrl('/dashboard/programs');\n\nexport const creditPurchaseUrl = (courseId) => {\n const config = getAppConfig(appId);\n return config.CREDIT_PURCHASE_URL\n ? `${config.CREDIT_PURCHASE_URL}/${courseId}/`\n : `${config.ECOMMERCE_BASE_URL}/credit/checkout/${courseId}/`;\n};\nexport const creditRequestUrl = (providerId) => `${getApiUrl()}/credit/v1/providers/${providerId}/request/`;\n\nexport default StrictDict({\n getApiUrl,\n baseAppUrl,\n courseUnenroll,\n creditPurchaseUrl,\n creditRequestUrl,\n entitlementEnrollment,\n event,\n getInitApiUrl,\n learningMfeUrl,\n programsUrl,\n updateEmailSettings,\n});\n"]}
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,MAAM,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAEjE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,UAAU,EAAE,QAAQ,CAAC;AAC5C,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,GAAG,UAAU,EAAE,oBAAoB,CAAC;AACjE,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,wBAAwB,CAAC;AACzE,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,iCAAiC,IAAI,cAAc,CAAC;AAE1G,8CAA8C;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AAE3I,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAE7F,kBAAkB;AAClB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,EAAE;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,mBAAmB;QAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,mBAAmB,IAAI,QAAQ,GAAG;QAC9C,CAAC,CAAC,GAAG,MAAM,CAAC,kBAAkB,oBAAoB,QAAQ,GAAG,CAAC;AAClE,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,wBAAwB,UAAU,WAAW,CAAC;AAE5G,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,yBAAyB,CAAC;AAE5E,eAAe,UAAU,CAAC;IACxB,SAAS;IACT,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,qBAAqB;IACrB,KAAK;IACL,aAAa;IACb,cAAc;IACd,WAAW;IACX,mBAAmB;IACnB,cAAc;CACf,CAAC,CAAC","sourcesContent":["import { appId } from '../../../constants';\nimport { StrictDict } from '../../../utils';\n\nimport { getAppConfig, getSiteConfig } from '@openedx/frontend-base';\n\nconst getBaseUrl = () => getSiteConfig().lmsBaseUrl;\n\nexport const getApiUrl = () => (`${getSiteConfig().lmsBaseUrl}/api`);\n\nconst getInitApiUrl = () => (`${getApiUrl()}/learner_home/init`);\n\nconst event = () => `${getBaseUrl()}/event`;\nconst courseUnenroll = () => `${getBaseUrl()}/change_enrollment`;\nconst updateEmailSettings = () => `${getApiUrl()}/change_email_settings`;\nconst entitlementEnrollment = (uuid) => `${getApiUrl()}/entitlements/v1/entitlements/${uuid}/enrollments`;\n\n// if url is null or absolute, return it as is\nexport const updateUrl = (base, url) => ((url == null || url.startsWith('http://') || url.startsWith('https://')) ? url : `${base}${url}`);\n\nexport const baseAppUrl = (url) => updateUrl(getBaseUrl(), url);\nexport const learningMfeUrl = (url) => updateUrl(getAppConfig(appId).LEARNING_BASE_URL, url);\n\n// static view url\nconst programsUrl = () => baseAppUrl('/dashboard/programs');\n\nexport const creditPurchaseUrl = (courseId) => {\n const config = getAppConfig(appId);\n return config.CREDIT_PURCHASE_URL\n ? `${config.CREDIT_PURCHASE_URL}/${courseId}/`\n : `${config.ECOMMERCE_BASE_URL}/credit/checkout/${courseId}/`;\n};\nexport const creditRequestUrl = (providerId) => `${getApiUrl()}/credit/v1/providers/${providerId}/request/`;\n\nexport const programsApiUrl = () => `${getApiUrl()}/dashboard/v0/programs/`;\n\nexport default StrictDict({\n getApiUrl,\n baseAppUrl,\n courseUnenroll,\n creditPurchaseUrl,\n creditRequestUrl,\n entitlementEnrollment,\n event,\n getInitApiUrl,\n learningMfeUrl,\n programsUrl,\n updateEmailSettings,\n programsApiUrl,\n});\n"]}
@@ -1,11 +1,11 @@
1
1
  export default messages;
2
2
  declare const messages: {
3
- 'learner-dash.loadingSR': {
3
+ 'subs-dash.loadingSR': {
4
4
  id: string;
5
5
  description: string;
6
6
  defaultMessage: string;
7
7
  };
8
- 'learner-dash.title': {
8
+ 'subs-dash.title': {
9
9
  id: string;
10
10
  description: string;
11
11
  defaultMessage: string;
package/dist/messages.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import { defineMessages } from '@openedx/frontend-base';
2
2
  const messages = defineMessages({
3
- 'learner-dash.loadingSR': {
4
- id: 'learner-dash.loadingSR',
3
+ 'subs-dash.loadingSR': {
4
+ id: 'subs-dash.loadingSR',
5
5
  description: 'Page loading screen-reader text',
6
6
  defaultMessage: 'Loading...',
7
7
  },
8
- 'learner-dash.title': {
9
- id: 'learner-dash.title',
10
- description: 'Page title: Learner Home',
11
- defaultMessage: 'Learner Home',
8
+ 'subs-dash.title': {
9
+ id: 'subs-dash.title',
10
+ description: 'Page title: Subscription Dashboard',
11
+ defaultMessage: 'Subscription Dashboard',
12
12
  },
13
13
  });
14
14
  export default messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,wBAAwB,EAAE;QACxB,EAAE,EAAE,wBAAwB;QAC5B,WAAW,EAAE,iCAAiC;QAC9C,cAAc,EAAE,YAAY;KAC7B;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,oBAAoB;QACxB,WAAW,EAAE,0BAA0B;QACvC,cAAc,EAAE,cAAc;KAC/B;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'learner-dash.loadingSR': {\n id: 'learner-dash.loadingSR',\n description: 'Page loading screen-reader text',\n defaultMessage: 'Loading...',\n },\n 'learner-dash.title': {\n id: 'learner-dash.title',\n description: 'Page title: Learner Home',\n defaultMessage: 'Learner Home',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,qBAAqB,EAAE;QACrB,EAAE,EAAE,qBAAqB;QACzB,WAAW,EAAE,iCAAiC;QAC9C,cAAc,EAAE,YAAY;KAC7B;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,iBAAiB;QACrB,WAAW,EAAE,oCAAoC;QACjD,cAAc,EAAE,wBAAwB;KACzC;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'subs-dash.loadingSR': {\n id: 'subs-dash.loadingSR',\n description: 'Page loading screen-reader text',\n defaultMessage: 'Loading...',\n },\n 'subs-dash.title': {\n id: 'subs-dash.title',\n description: 'Page title: Subscription Dashboard',\n defaultMessage: 'Subscription Dashboard',\n },\n});\n\nexport default messages;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-app-subscription-learner-dashboard",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",