@openedx/frontend-app-gradebook 2.0.0-alpha.4 → 2.0.0-alpha.6

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 (81) hide show
  1. package/README.rst +1 -5
  2. package/dist/Gradebook.d.ts +7 -0
  3. package/dist/Gradebook.js +12 -0
  4. package/dist/Gradebook.js.map +1 -0
  5. package/dist/Main.d.ts +0 -1
  6. package/dist/Main.js +7 -9
  7. package/dist/Main.js.map +1 -1
  8. package/dist/app.js +2 -2
  9. package/dist/app.js.map +1 -1
  10. package/dist/components/BulkManagementHistoryView/ResultsSummary.d.ts +2 -3
  11. package/dist/components/BulkManagementHistoryView/ResultsSummary.js +6 -3
  12. package/dist/components/BulkManagementHistoryView/ResultsSummary.js.map +1 -1
  13. package/dist/components/BulkManagementHistoryView/data/api.d.ts +2 -2
  14. package/dist/components/BulkManagementHistoryView/data/api.js +4 -2
  15. package/dist/components/BulkManagementHistoryView/data/api.js.map +1 -1
  16. package/dist/components/BulkManagementHistoryView/data/apiHook.js +3 -3
  17. package/dist/components/BulkManagementHistoryView/data/apiHook.js.map +1 -1
  18. package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js +3 -1
  19. package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js.map +1 -1
  20. package/dist/components/GradebookFilters/data/api.d.ts +4 -4
  21. package/dist/components/GradebookFilters/data/api.js +6 -6
  22. package/dist/components/GradebookFilters/data/api.js.map +1 -1
  23. package/dist/components/GradebookFilters/data/apiHook.js +5 -5
  24. package/dist/components/GradebookFilters/data/apiHook.js.map +1 -1
  25. package/dist/components/GradebookHeader/index.js +21 -6
  26. package/dist/components/GradebookHeader/index.js.map +1 -1
  27. package/dist/components/GradesView/BulkManagementControls/index.js +3 -1
  28. package/dist/components/GradesView/BulkManagementControls/index.js.map +1 -1
  29. package/dist/components/GradesView/InterventionsReport/index.js +3 -1
  30. package/dist/components/GradesView/InterventionsReport/index.js.map +1 -1
  31. package/dist/components/GradesView/data/api.d.ts +2 -1
  32. package/dist/components/GradesView/data/api.js +2 -2
  33. package/dist/components/GradesView/data/api.js.map +1 -1
  34. package/dist/components/GradesView/data/apiHook.js +18 -15
  35. package/dist/components/GradesView/data/apiHook.js.map +1 -1
  36. package/dist/components/GradesView/data/hooks.js +14 -6
  37. package/dist/components/GradesView/data/hooks.js.map +1 -1
  38. package/dist/components/GradesView/data/queryKeys.d.ts +4 -0
  39. package/dist/components/GradesView/data/queryKeys.js +4 -0
  40. package/dist/components/GradesView/data/queryKeys.js.map +1 -1
  41. package/dist/data/api.d.ts +2 -2
  42. package/dist/data/api.js +4 -4
  43. package/dist/data/api.js.map +1 -1
  44. package/dist/data/apiHook.js +7 -7
  45. package/dist/data/apiHook.js.map +1 -1
  46. package/dist/data/courseIdContext.d.ts +2 -0
  47. package/dist/data/courseIdContext.js +6 -0
  48. package/dist/data/courseIdContext.js.map +1 -0
  49. package/dist/data/gradebookNavigationContext.d.ts +6 -0
  50. package/dist/data/gradebookNavigationContext.js +9 -0
  51. package/dist/data/gradebookNavigationContext.js.map +1 -0
  52. package/dist/data/query.d.ts +14 -0
  53. package/dist/data/query.js +27 -0
  54. package/dist/data/query.js.map +1 -0
  55. package/dist/data/queryKeys.js +3 -0
  56. package/dist/data/queryKeys.js.map +1 -1
  57. package/dist/data/services/lms/api.js +17 -13
  58. package/dist/data/services/lms/api.js.map +1 -1
  59. package/dist/data/services/lms/urls.d.ts +13 -13
  60. package/dist/data/services/lms/urls.js +15 -17
  61. package/dist/data/services/lms/urls.js.map +1 -1
  62. package/dist/data/services/segment/constants.d.ts +0 -5
  63. package/dist/data/services/segment/constants.js +0 -2
  64. package/dist/data/services/segment/constants.js.map +1 -1
  65. package/dist/data/services/segment/events.d.ts +8 -8
  66. package/dist/data/services/segment/events.js +10 -10
  67. package/dist/data/services/segment/events.js.map +1 -1
  68. package/dist/i18n/utils.d.ts +1 -1
  69. package/dist/index.d.ts +1 -0
  70. package/dist/index.js +1 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/slots.d.ts +3 -0
  73. package/dist/slots.js +22 -0
  74. package/dist/slots.js.map +1 -0
  75. package/package.json +2 -2
  76. package/dist/data/queryClient.d.ts +0 -10
  77. package/dist/data/queryClient.js +0 -34
  78. package/dist/data/queryClient.js.map +0 -1
  79. package/dist/providers.d.ts +0 -3
  80. package/dist/providers.js +0 -13
  81. package/dist/providers.js.map +0 -1
@@ -7,21 +7,22 @@ const { get, post, stringifyUrl } = utils;
7
7
  /*********************************************************************************
8
8
  * GET Actions
9
9
  *********************************************************************************/
10
- const assignmentTypes = () => get(urls.getAssignmentTypesUrl());
11
- const cohorts = () => get(urls.getCohortsUrl());
12
- const roles = () => get(urls.getRolesUrl());
13
- const tracks = () => get(urls.getTracksUrl());
10
+ const assignmentTypes = (courseId) => get(urls.getAssignmentTypesUrl(courseId));
11
+ const cohorts = (courseId) => get(urls.getCohortsUrl(courseId));
12
+ const roles = (courseId) => get(urls.getRolesUrl(courseId));
13
+ const tracks = (courseId) => get(urls.getTracksUrl(courseId));
14
14
  /**
15
- * fetch.gradebookData(searchText, cohort, track, options)
15
+ * fetch.gradebookData(courseId, searchText, cohort, track, options)
16
16
  * fetches updated gradebook data based on current filter selections.
17
17
  * Raises an error if assignment grade limits are set, but not assignment.
18
+ * @param {string} courseId - course identifier
18
19
  * @param {string} searchText - search text filter
19
20
  * @param {nunber} cohort - selected cohort filter
20
21
  * @param {string} track - selected track filter
21
22
  * @param {object} options - additional optional filter values
22
23
  * @return {Promise} - get response
23
24
  */
24
- const gradebookData = (searchText, cohort, track, options = {}) => {
25
+ const gradebookData = (courseId, searchText, cohort, track, options = {}) => {
25
26
  if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {
26
27
  throw new Error(messages.errors.missingAssignment);
27
28
  }
@@ -37,14 +38,15 @@ const gradebookData = (searchText, cohort, track, options = {}) => {
37
38
  [paramKeys.assignmentGradeMax]: options.assignmentGradeMax,
38
39
  [paramKeys.assignmentGradeMin]: options.assignmentGradeMin,
39
40
  };
40
- return get(stringifyUrl(urls.getGradebookUrl(), queryParams));
41
+ return get(stringifyUrl(urls.getGradebookUrl(courseId), queryParams));
41
42
  };
42
43
  /**
43
- * fetch.gradeBulkOperationHistory()
44
+ * fetch.gradeBulkOperationHistory(courseId)
44
45
  * fetches bulk operation history and raises an error if the operation fails
46
+ * @param {string} courseId - course identifier
45
47
  * @return {Promise} - get response
46
48
  */
47
- const gradeBulkOperationHistory = () => get(urls.getBulkHistoryUrl())
49
+ const gradeBulkOperationHistory = (courseId) => get(urls.getBulkHistoryUrl(courseId))
48
50
  .then(response => response.data)
49
51
  .catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));
50
52
  /**
@@ -59,8 +61,9 @@ const gradeOverrideHistory = (subsectionId, userId) => (get(sectionOverrideHisto
59
61
  * POST Actions
60
62
  *********************************************************************************/
61
63
  /**
62
- * updateGradebookData(updateData)
64
+ * updateGradebookData(courseId, updateData)
63
65
  * sends an update message with new grades overrides
66
+ * @param {string} courseId - course identifier
64
67
  * @param {object[]} updateData
65
68
  * {
66
69
  * user_id: <int>,
@@ -74,15 +77,16 @@ const gradeOverrideHistory = (subsectionId, userId) => (get(sectionOverrideHisto
74
77
  * }
75
78
  * @return {Promise} - post response
76
79
  */
77
- const updateGradebookData = (updateData) => post(urls.getBulkUpdateUrl(), updateData);
80
+ const updateGradebookData = (courseId, updateData) => post(urls.getBulkUpdateUrl(courseId), updateData);
78
81
  /**
79
- * uploadGradeCsv(formData)
82
+ * uploadGradeCsv(courseId, formData)
80
83
  * Posts form data to grade csv url. On success, forwards response data.
81
84
  * Reject promise with result on failure.
85
+ * @param {string} courseId - course identifier
82
86
  * @param {object} formData - new grade data
83
87
  * @return {Promise} - post response
84
88
  */
85
- const uploadGradeCsv = (formData) => (post(gradeCsvUrl(), formData).then((result) => {
89
+ const uploadGradeCsv = (courseId, formData) => (post(gradeCsvUrl(courseId), formData).then((result) => {
86
90
  if (result.status === 200 && !result.data.error_messages.length) {
87
91
  return result.data;
88
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/lms/api.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\n\nimport urls, {\n gradeCsvUrl,\n sectionOverrideHistoryUrl,\n} from './urls';\nimport { pageSize, paramKeys } from './constants';\nimport messages from './messages';\n\nimport * as utils from './utils';\n\nconst { get, post, stringifyUrl } = utils;\n\n/*********************************************************************************\n * GET Actions\n *********************************************************************************/\nconst assignmentTypes = () => get(urls.getAssignmentTypesUrl());\nconst cohorts = () => get(urls.getCohortsUrl());\nconst roles = () => get(urls.getRolesUrl());\nconst tracks = () => get(urls.getTracksUrl());\n\n/**\n * fetch.gradebookData(searchText, cohort, track, options)\n * fetches updated gradebook data based on current filter selections.\n * Raises an error if assignment grade limits are set, but not assignment.\n * @param {string} searchText - search text filter\n * @param {nunber} cohort - selected cohort filter\n * @param {string} track - selected track filter\n * @param {object} options - additional optional filter values\n * @return {Promise} - get response\n */\nconst gradebookData = (searchText, cohort, track, options = {}) => {\n if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {\n throw new Error(messages.errors.missingAssignment);\n }\n const queryParams = {\n [paramKeys.pageSize]: pageSize,\n [paramKeys.userContains]: searchText,\n [paramKeys.cohortId]: cohort,\n [paramKeys.enrollmentMode]: track,\n [paramKeys.courseGradeMax]: options.courseGradeMax,\n [paramKeys.courseGradeMin]: options.courseGradeMin,\n [paramKeys.excludedCourseRoles]: options.includeCourseRoleMembers ? null : ['all'],\n [paramKeys.assignment]: options.assignment,\n [paramKeys.assignmentGradeMax]: options.assignmentGradeMax,\n [paramKeys.assignmentGradeMin]: options.assignmentGradeMin,\n };\n return get(stringifyUrl(urls.getGradebookUrl(), queryParams));\n};\n\n/**\n * fetch.gradeBulkOperationHistory()\n * fetches bulk operation history and raises an error if the operation fails\n * @return {Promise} - get response\n */\nconst gradeBulkOperationHistory = () => get(urls.getBulkHistoryUrl())\n .then(response => response.data)\n .catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));\n\n/**\n * fetch.gradeOverrideHistory(subsectionId, userId)\n * fetches grade override history for a given user on a given subsection\n * @param {string} subsectionId - subsection identifier\n * @param {string} userId - user identifier\n * @return {Promise} - get response\n */\nconst gradeOverrideHistory = (subsectionId, userId) => (\n get(sectionOverrideHistoryUrl(subsectionId, userId))\n);\n\n/*********************************************************************************\n * POST Actions\n *********************************************************************************/\n/**\n * updateGradebookData(updateData)\n * sends an update message with new grades overrides\n * @param {object[]} updateData\n * {\n * user_id: <int>,\n * usage_id: <string>\n * grade: {\n * earned_all_override: <int>\n * possible_all_override: <int>\n * earned_graded_override: <int>\n * possible_graded_override: <int>\n * }\n * }\n * @return {Promise} - post response\n */\nconst updateGradebookData = (updateData) => post(urls.getBulkUpdateUrl(), updateData);\n\n/**\n * uploadGradeCsv(formData)\n * Posts form data to grade csv url. On success, forwards response data.\n * Reject promise with result on failure.\n * @param {object} formData - new grade data\n * @return {Promise} - post response\n */\nconst uploadGradeCsv = (formData) => (\n post(gradeCsvUrl(), formData).then((result) => {\n if (result.status === 200 && !result.data.error_messages.length) {\n return result.data;\n }\n return Promise.reject(result);\n })\n);\n\nexport default StrictDict({\n fetch: StrictDict({\n assignmentTypes,\n cohorts,\n gradebookData,\n gradeBulkOperationHistory,\n gradeOverrideHistory,\n roles,\n tracks,\n }),\n updateGradebookData,\n uploadGradeCsv,\n});\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/lms/api.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\n\nimport urls, {\n gradeCsvUrl,\n sectionOverrideHistoryUrl,\n} from './urls';\nimport { pageSize, paramKeys } from './constants';\nimport messages from './messages';\n\nimport * as utils from './utils';\n\nconst { get, post, stringifyUrl } = utils;\n\n/*********************************************************************************\n * GET Actions\n *********************************************************************************/\nconst assignmentTypes = (courseId) => get(urls.getAssignmentTypesUrl(courseId));\nconst cohorts = (courseId) => get(urls.getCohortsUrl(courseId));\nconst roles = (courseId) => get(urls.getRolesUrl(courseId));\nconst tracks = (courseId) => get(urls.getTracksUrl(courseId));\n\n/**\n * fetch.gradebookData(courseId, searchText, cohort, track, options)\n * fetches updated gradebook data based on current filter selections.\n * Raises an error if assignment grade limits are set, but not assignment.\n * @param {string} courseId - course identifier\n * @param {string} searchText - search text filter\n * @param {nunber} cohort - selected cohort filter\n * @param {string} track - selected track filter\n * @param {object} options - additional optional filter values\n * @return {Promise} - get response\n */\nconst gradebookData = (courseId, searchText, cohort, track, options = {}) => {\n if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {\n throw new Error(messages.errors.missingAssignment);\n }\n const queryParams = {\n [paramKeys.pageSize]: pageSize,\n [paramKeys.userContains]: searchText,\n [paramKeys.cohortId]: cohort,\n [paramKeys.enrollmentMode]: track,\n [paramKeys.courseGradeMax]: options.courseGradeMax,\n [paramKeys.courseGradeMin]: options.courseGradeMin,\n [paramKeys.excludedCourseRoles]: options.includeCourseRoleMembers ? null : ['all'],\n [paramKeys.assignment]: options.assignment,\n [paramKeys.assignmentGradeMax]: options.assignmentGradeMax,\n [paramKeys.assignmentGradeMin]: options.assignmentGradeMin,\n };\n return get(stringifyUrl(urls.getGradebookUrl(courseId), queryParams));\n};\n\n/**\n * fetch.gradeBulkOperationHistory(courseId)\n * fetches bulk operation history and raises an error if the operation fails\n * @param {string} courseId - course identifier\n * @return {Promise} - get response\n */\nconst gradeBulkOperationHistory = (courseId) => get(urls.getBulkHistoryUrl(courseId))\n .then(response => response.data)\n .catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));\n\n/**\n * fetch.gradeOverrideHistory(subsectionId, userId)\n * fetches grade override history for a given user on a given subsection\n * @param {string} subsectionId - subsection identifier\n * @param {string} userId - user identifier\n * @return {Promise} - get response\n */\nconst gradeOverrideHistory = (subsectionId, userId) => (\n get(sectionOverrideHistoryUrl(subsectionId, userId))\n);\n\n/*********************************************************************************\n * POST Actions\n *********************************************************************************/\n/**\n * updateGradebookData(courseId, updateData)\n * sends an update message with new grades overrides\n * @param {string} courseId - course identifier\n * @param {object[]} updateData\n * {\n * user_id: <int>,\n * usage_id: <string>\n * grade: {\n * earned_all_override: <int>\n * possible_all_override: <int>\n * earned_graded_override: <int>\n * possible_graded_override: <int>\n * }\n * }\n * @return {Promise} - post response\n */\nconst updateGradebookData = (courseId, updateData) => post(urls.getBulkUpdateUrl(courseId), updateData);\n\n/**\n * uploadGradeCsv(courseId, formData)\n * Posts form data to grade csv url. On success, forwards response data.\n * Reject promise with result on failure.\n * @param {string} courseId - course identifier\n * @param {object} formData - new grade data\n * @return {Promise} - post response\n */\nconst uploadGradeCsv = (courseId, formData) => (\n post(gradeCsvUrl(courseId), formData).then((result) => {\n if (result.status === 200 && !result.data.error_messages.length) {\n return result.data;\n }\n return Promise.reject(result);\n })\n);\n\nexport default StrictDict({\n fetch: StrictDict({\n assignmentTypes,\n cohorts,\n gradebookData,\n gradeBulkOperationHistory,\n gradeOverrideHistory,\n roles,\n tracks,\n }),\n updateGradebookData,\n uploadGradeCsv,\n});\n"]}
@@ -1,19 +1,19 @@
1
1
  export function getUrlPrefix(): string;
2
- export function getBulkGradesUrl(): string;
2
+ export function getBulkGradesUrl(courseId: any): string;
3
3
  export function getEnrollmentUrl(): string;
4
4
  export function getGradesUrl(): string;
5
- export function getGradebookUrl(): string;
6
- export function getBulkUpdateUrl(): string;
7
- export function getInterventionUrl(): string;
8
- export function getCohortsUrl(): string;
9
- export function getTracksUrl(): string;
10
- export function getBulkHistoryUrl(): string;
11
- export function getAssignmentTypesUrl(): string;
12
- export function getRolesUrl(): string;
13
- export function bulkGradesUrlByRow(rowId: string): string;
14
- export function gradeCsvUrl(options?: {}): string;
15
- export function interventionExportCsvUrl(options?: {}): string;
5
+ export function getGradebookUrl(courseId: any): string;
6
+ export function getBulkUpdateUrl(courseId: any): string;
7
+ export function getInterventionUrl(courseId: any): string;
8
+ export function getCohortsUrl(courseId: any): string;
9
+ export function getTracksUrl(courseId: any): string;
10
+ export function getBulkHistoryUrl(courseId: any): string;
11
+ export function getAssignmentTypesUrl(courseId: any): string;
12
+ export function getRolesUrl(courseId: any): string;
13
+ export function bulkGradesUrlByRow(courseId: string, rowId: string): string;
14
+ export function gradeCsvUrl(courseId: any, options?: {}): string;
15
+ export function interventionExportCsvUrl(courseId: any, options?: {}): string;
16
16
  export function sectionOverrideHistoryUrl(subsectionId: any, userId: any): string;
17
- export function instructorDashboardUrl(): string;
17
+ export function instructorDashboardUrl(courseId: any): string;
18
18
  declare const _default: any;
19
19
  export default _default;
@@ -2,32 +2,30 @@ import { StrictDict } from '../../../utils';
2
2
  import { historyRecordLimit } from './constants';
3
3
  import { filterQuery, stringifyUrl } from './utils';
4
4
  import { getSiteConfig } from '@openedx/frontend-base';
5
- // Evaluated at call time: with client-side navigation, this module can be
6
- // imported before the URL reflects the gradebook route.
7
- const getCourseId = () => window.location.pathname.split('/').filter(Boolean).pop() || '';
8
5
  export const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;
9
- export const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${getCourseId()}/`;
6
+ export const getBulkGradesUrl = (courseId) => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;
10
7
  export const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;
11
8
  export const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;
12
- export const getGradebookUrl = () => `${getGradesUrl()}gradebook/${getCourseId()}/`;
13
- export const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;
14
- export const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;
15
- export const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${getCourseId()}/cohorts/`;
16
- export const getTracksUrl = () => `${getEnrollmentUrl()}course/${getCourseId()}?include_expired=1`;
17
- export const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;
18
- export const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });
19
- export const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId: getCourseId() });
9
+ export const getGradebookUrl = (courseId) => `${getGradesUrl()}gradebook/${courseId}/`;
10
+ export const getBulkUpdateUrl = (courseId) => `${getGradebookUrl(courseId)}bulk-update`;
11
+ export const getInterventionUrl = (courseId) => `${getBulkGradesUrl(courseId)}intervention/`;
12
+ export const getCohortsUrl = (courseId) => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;
13
+ export const getTracksUrl = (courseId) => `${getEnrollmentUrl()}course/${courseId}?include_expired=1`;
14
+ export const getBulkHistoryUrl = (courseId) => `${getBulkUpdateUrl(courseId)}history/`;
15
+ export const getAssignmentTypesUrl = (courseId) => stringifyUrl(`${getGradebookUrl(courseId)}grading-info`, { graded_only: true });
16
+ export const getRolesUrl = (courseId) => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });
20
17
  /**
21
- * bulkGradesUrlByCourseAndRow(courseId, rowId)
18
+ * bulkGradesUrlByRow(courseId, rowId)
22
19
  * returns the bulkGrades url with the given rowId.
20
+ * @param {string} courseId - course identifier
23
21
  * @param {string} rowId - row/error identifier
24
22
  * @return {string} - bulk grades fetch url
25
23
  */
26
- export const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });
27
- export const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));
28
- export const interventionExportCsvUrl = (options = {}) => (stringifyUrl(getInterventionUrl(), filterQuery(options)));
24
+ export const bulkGradesUrlByRow = (courseId, rowId) => stringifyUrl(getBulkGradesUrl(courseId), { error_id: rowId });
25
+ export const gradeCsvUrl = (courseId, options = {}) => stringifyUrl(getBulkGradesUrl(courseId), filterQuery(options));
26
+ export const interventionExportCsvUrl = (courseId, options = {}) => (stringifyUrl(getInterventionUrl(courseId), filterQuery(options)));
29
27
  export const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(`${getGradesUrl()}subsection/${subsectionId}/`, { user_id: userId, history_record_limit: historyRecordLimit });
30
- export const instructorDashboardUrl = () => (`${getSiteConfig().lmsBaseUrl}/courses/${getCourseId()}/instructor`);
28
+ export const instructorDashboardUrl = (courseId) => (`${getSiteConfig().lmsBaseUrl}/courses/${courseId}/instructor`);
31
29
  export default StrictDict({
32
30
  getUrlPrefix,
33
31
  getBulkGradesUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\nimport { historyRecordLimit } from './constants';\nimport { filterQuery, stringifyUrl } from './utils';\nimport { getSiteConfig } from '@openedx/frontend-base';\n\n// Evaluated at call time: with client-side navigation, this module can be\n// imported before the URL reflects the gradebook route.\nconst getCourseId = () => window.location.pathname.split('/').filter(Boolean).pop() || '';\n\nexport const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;\nexport const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${getCourseId()}/`;\nexport const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;\nexport const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;\nexport const getGradebookUrl = () => `${getGradesUrl()}gradebook/${getCourseId()}/`;\nexport const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;\nexport const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;\nexport const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${getCourseId()}/cohorts/`;\nexport const getTracksUrl = () => `${getEnrollmentUrl()}course/${getCourseId()}?include_expired=1`;\nexport const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;\nexport const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });\nexport const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId: getCourseId() });\n/**\n * bulkGradesUrlByCourseAndRow(courseId, rowId)\n * returns the bulkGrades url with the given rowId.\n * @param {string} rowId - row/error identifier\n * @return {string} - bulk grades fetch url\n */\nexport const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });\n\nexport const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));\n\nexport const interventionExportCsvUrl = (options = {}) => (\n stringifyUrl(getInterventionUrl(), filterQuery(options))\n);\n\nexport const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(\n `${getGradesUrl()}subsection/${subsectionId}/`,\n { user_id: userId, history_record_limit: historyRecordLimit },\n);\n\nexport const instructorDashboardUrl = () => (\n `${getSiteConfig().lmsBaseUrl}/courses/${getCourseId()}/instructor`\n);\n\nexport default StrictDict({\n getUrlPrefix,\n getBulkGradesUrl,\n getEnrollmentUrl,\n getGradesUrl,\n getGradebookUrl,\n getBulkUpdateUrl,\n getInterventionUrl,\n getCohortsUrl,\n getTracksUrl,\n getBulkHistoryUrl,\n getAssignmentTypesUrl,\n getRolesUrl,\n bulkGradesUrlByRow,\n gradeCsvUrl,\n interventionExportCsvUrl,\n sectionOverrideHistoryUrl,\n});\n"]}
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\nimport { historyRecordLimit } from './constants';\nimport { filterQuery, stringifyUrl } from './utils';\nimport { getSiteConfig } from '@openedx/frontend-base';\n\nexport const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;\nexport const getBulkGradesUrl = (courseId) => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;\nexport const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;\nexport const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;\nexport const getGradebookUrl = (courseId) => `${getGradesUrl()}gradebook/${courseId}/`;\nexport const getBulkUpdateUrl = (courseId) => `${getGradebookUrl(courseId)}bulk-update`;\nexport const getInterventionUrl = (courseId) => `${getBulkGradesUrl(courseId)}intervention/`;\nexport const getCohortsUrl = (courseId) => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;\nexport const getTracksUrl = (courseId) => `${getEnrollmentUrl()}course/${courseId}?include_expired=1`;\nexport const getBulkHistoryUrl = (courseId) => `${getBulkUpdateUrl(courseId)}history/`;\nexport const getAssignmentTypesUrl = (courseId) => stringifyUrl(`${getGradebookUrl(courseId)}grading-info`, { graded_only: true });\nexport const getRolesUrl = (courseId) => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });\n/**\n * bulkGradesUrlByRow(courseId, rowId)\n * returns the bulkGrades url with the given rowId.\n * @param {string} courseId - course identifier\n * @param {string} rowId - row/error identifier\n * @return {string} - bulk grades fetch url\n */\nexport const bulkGradesUrlByRow = (courseId, rowId) => stringifyUrl(getBulkGradesUrl(courseId), { error_id: rowId });\n\nexport const gradeCsvUrl = (courseId, options = {}) => stringifyUrl(getBulkGradesUrl(courseId), filterQuery(options));\n\nexport const interventionExportCsvUrl = (courseId, options = {}) => (\n stringifyUrl(getInterventionUrl(courseId), filterQuery(options))\n);\n\nexport const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(\n `${getGradesUrl()}subsection/${subsectionId}/`,\n { user_id: userId, history_record_limit: historyRecordLimit },\n);\n\nexport const instructorDashboardUrl = (courseId) => (\n `${getSiteConfig().lmsBaseUrl}/courses/${courseId}/instructor`\n);\n\nexport default StrictDict({\n getUrlPrefix,\n getBulkGradesUrl,\n getEnrollmentUrl,\n getGradesUrl,\n getGradebookUrl,\n getBulkUpdateUrl,\n getInterventionUrl,\n getCohortsUrl,\n getTracksUrl,\n getBulkHistoryUrl,\n getAssignmentTypesUrl,\n getRolesUrl,\n bulkGradesUrlByRow,\n gradeCsvUrl,\n interventionExportCsvUrl,\n sectionOverrideHistoryUrl,\n});\n"]}
@@ -1,8 +1,3 @@
1
- export const courseId: string;
2
1
  export const events: any;
3
2
  export const eventNames: any;
4
3
  export const trackingCategory: "gradebook";
5
- export namespace pageViewEvent {
6
- export { trackingCategory as category };
7
- export { courseId as page };
8
- }
@@ -1,5 +1,4 @@
1
1
  import { StrictDict } from '../../../utils';
2
- export const courseId = window.location.pathname.slice(1);
3
2
  export const events = StrictDict({
4
3
  receivedRoles: 'receivedRoles',
5
4
  receivedGrades: 'receivedGrades',
@@ -22,5 +21,4 @@ export const eventNames = StrictDict({
22
21
  [events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',
23
22
  });
24
23
  export const trackingCategory = 'gradebook';
25
- export const pageViewEvent = { category: trackingCategory, page: courseId };
26
24
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/data/services/segment/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC/B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sBAAsB;IAC5C,aAAa,EAAE,eAAe;IAC9B,sBAAsB,EAAE,wBAAwB;IAChD,4BAA4B,EAAE,8BAA8B;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,gCAAgC;IACzD,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,+CAA+C;IACzE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,4CAA4C;IACnE,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,wDAAwD;IAC1F,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,qDAAqD;IACpF,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,qCAAqC;IAC7D,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,+CAA+C;IAChF,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,+CAA+C;CACvF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport const courseId = window.location.pathname.slice(1);\n\nexport const events = StrictDict({\n receivedRoles: 'receivedRoles',\n receivedGrades: 'receivedGrades',\n updateSucceeded: 'updateSucceeded',\n updateFailed: 'updateFailed',\n uploadOverrideSucceeded: 'uploadOverrideSucceeded',\n uploadOverrideFailed: 'uploadOverrideFailed',\n filterApplied: 'filterApplied',\n gradesReportDownloaded: 'gradesReportDownloaded',\n interventionReportDownloaded: 'interventionReportDownloaded',\n});\n\nexport const eventNames = StrictDict({\n [events.receivedGrades]: 'edx.gradebook.grades.displayed',\n [events.updateSucceeded]: 'edx.gradebook.grades.grade_override.succeeded',\n [events.updateFailed]: 'edx.gradebook.grades.grade_override.failed',\n [events.uploadOverrideSucceeded]: 'edx.gradebook.grades.upload.grades_overrides.succeeded',\n [events.uploadOverrideFailed]: 'edx.gradebook.grades.upload.grades_overrides.failed',\n [events.filterApplied]: 'edx.gradebook.grades.filter_applied',\n [events.gradesReportDownloaded]: 'edx.gradebook.reports.grade_export.downloaded',\n [events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',\n});\n\nexport const trackingCategory = 'gradebook';\n\nexport const pageViewEvent = { category: trackingCategory, page: courseId };\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/data/services/segment/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC/B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sBAAsB;IAC5C,aAAa,EAAE,eAAe;IAC9B,sBAAsB,EAAE,wBAAwB;IAChD,4BAA4B,EAAE,8BAA8B;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,gCAAgC;IACzD,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,+CAA+C;IACzE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,4CAA4C;IACnE,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,wDAAwD;IAC1F,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,qDAAqD;IACpF,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,qCAAqC;IAC7D,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,+CAA+C;IAChF,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,+CAA+C;CACvF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport const events = StrictDict({\n receivedRoles: 'receivedRoles',\n receivedGrades: 'receivedGrades',\n updateSucceeded: 'updateSucceeded',\n updateFailed: 'updateFailed',\n uploadOverrideSucceeded: 'uploadOverrideSucceeded',\n uploadOverrideFailed: 'uploadOverrideFailed',\n filterApplied: 'filterApplied',\n gradesReportDownloaded: 'gradesReportDownloaded',\n interventionReportDownloaded: 'interventionReportDownloaded',\n});\n\nexport const eventNames = StrictDict({\n [events.receivedGrades]: 'edx.gradebook.grades.displayed',\n [events.updateSucceeded]: 'edx.gradebook.grades.grade_override.succeeded',\n [events.updateFailed]: 'edx.gradebook.grades.grade_override.failed',\n [events.uploadOverrideSucceeded]: 'edx.gradebook.grades.upload.grades_overrides.succeeded',\n [events.uploadOverrideFailed]: 'edx.gradebook.grades.upload.grades_overrides.failed',\n [events.filterApplied]: 'edx.gradebook.grades.filter_applied',\n [events.gradesReportDownloaded]: 'edx.gradebook.reports.grade_export.downloaded',\n [events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',\n});\n\nexport const trackingCategory = 'gradebook';\n"]}
@@ -1,14 +1,14 @@
1
- export function trackGradesDisplayed({ assignmentType, cohort, track, prev, next, }: {
1
+ export function trackGradesDisplayed(courseId: any, { assignmentType, cohort, track, prev, next, }: {
2
2
  assignmentType: any;
3
3
  cohort: any;
4
4
  track: any;
5
5
  prev: any;
6
6
  next: any;
7
7
  }): void;
8
- export function trackGradeOverrideSucceeded(updatedGrades: any): void;
9
- export function trackGradeOverrideFailed(error: any): void;
10
- export function trackUploadOverrideSucceeded(): void;
11
- export function trackUploadOverrideFailed(error: any): void;
12
- export function trackFilterApplied(): void;
13
- export function trackGradesReportDownloaded(): void;
14
- export function trackInterventionReportDownloaded(): void;
8
+ export function trackGradeOverrideSucceeded(courseId: any, updatedGrades: any): void;
9
+ export function trackGradeOverrideFailed(courseId: any, error: any): void;
10
+ export function trackUploadOverrideSucceeded(courseId: any): void;
11
+ export function trackUploadOverrideFailed(courseId: any, error: any): void;
12
+ export function trackFilterApplied(courseId: any): void;
13
+ export function trackGradesReportDownloaded(courseId: any): void;
14
+ export function trackInterventionReportDownloaded(courseId: any): void;
@@ -1,32 +1,32 @@
1
1
  import { sendTrackEvent } from '@openedx/frontend-base';
2
- import { courseId, events, eventNames, trackingCategory, } from './constants';
2
+ import { events, eventNames, trackingCategory, } from './constants';
3
3
  /**
4
4
  * Segment analytics, emitted directly via `@openedx/frontend-base`
5
5
  * (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped
6
6
  * Redux actions to Segment events. Event names + base properties (category + the
7
7
  * `courseId` label) mirror the old `redux-beacon` mapping exactly.
8
8
  */
9
- const baseProperties = () => ({ category: trackingCategory, label: courseId });
9
+ const baseProperties = (courseId) => ({ category: trackingCategory, label: courseId });
10
10
  /**
11
11
  * Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,
12
12
  * which fired per fetch with the filters it ran under and the page cursors.
13
13
  */
14
- export const trackGradesDisplayed = ({ assignmentType, cohort, track, prev, next, }) => sendTrackEvent(eventNames[events.receivedGrades], Object.assign(Object.assign({}, baseProperties()), { assignmentType, cohort, track, prev, next }));
14
+ export const trackGradesDisplayed = (courseId, { assignmentType, cohort, track, prev, next, }) => sendTrackEvent(eventNames[events.receivedGrades], Object.assign(Object.assign({}, baseProperties(courseId)), { assignmentType, cohort, track, prev, next }));
15
15
  /** Grade override saved from the edit modal succeeded. */
16
- export const trackGradeOverrideSucceeded = (updatedGrades) => sendTrackEvent(eventNames[events.updateSucceeded], Object.assign(Object.assign({}, baseProperties()), { updatedGrades }));
16
+ export const trackGradeOverrideSucceeded = (courseId, updatedGrades) => sendTrackEvent(eventNames[events.updateSucceeded], Object.assign(Object.assign({}, baseProperties(courseId)), { updatedGrades }));
17
17
  /** Grade override save failed. */
18
- export const trackGradeOverrideFailed = (error) => sendTrackEvent(eventNames[events.updateFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
18
+ export const trackGradeOverrideFailed = (courseId, error) => sendTrackEvent(eventNames[events.updateFailed], Object.assign(Object.assign({}, baseProperties(courseId)), { error }));
19
19
  /** Bulk grade CSV override upload succeeded. */
20
- export const trackUploadOverrideSucceeded = () => sendTrackEvent(eventNames[events.uploadOverrideSucceeded], baseProperties());
20
+ export const trackUploadOverrideSucceeded = (courseId) => sendTrackEvent(eventNames[events.uploadOverrideSucceeded], baseProperties(courseId));
21
21
  /** Bulk grade CSV override upload failed. */
22
- export const trackUploadOverrideFailed = (error) => sendTrackEvent(eventNames[events.uploadOverrideFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
22
+ export const trackUploadOverrideFailed = (courseId, error) => sendTrackEvent(eventNames[events.uploadOverrideFailed], Object.assign(Object.assign({}, baseProperties(courseId)), { error }));
23
23
  /**
24
24
  * A filter was applied. Mirrors the legacy mapping, which fired this only from the
25
25
  * course-grade-limit apply action.
26
26
  */
27
- export const trackFilterApplied = () => sendTrackEvent(eventNames[events.filterApplied], baseProperties());
27
+ export const trackFilterApplied = (courseId) => sendTrackEvent(eventNames[events.filterApplied], baseProperties(courseId));
28
28
  /** Grades CSV export was downloaded. */
29
- export const trackGradesReportDownloaded = () => sendTrackEvent(eventNames[events.gradesReportDownloaded], baseProperties());
29
+ export const trackGradesReportDownloaded = (courseId) => sendTrackEvent(eventNames[events.gradesReportDownloaded], baseProperties(courseId));
30
30
  /** Intervention report was downloaded. */
31
- export const trackInterventionReportDownloaded = () => sendTrackEvent(eventNames[events.interventionReportDownloaded], baseProperties());
31
+ export const trackInterventionReportDownloaded = (courseId) => sendTrackEvent(eventNames[events.interventionReportDownloaded], baseProperties(courseId));
32
32
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/data/services/segment/events.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EACL,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAC/C,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAC1C,EAAE,EAAE,CAAC,cAAc,CAClB,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,kCAE5B,cAAc,EAAE,KAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAEjE,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,cAAc,CAC1E,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,kCAC7B,cAAc,EAAE,KAAE,aAAa,IACrC,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAC/D,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,kCAC1B,cAAc,EAAE,KAAE,KAAK,IAC7B,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,EAAE,CAAC,cAAc,CAC9D,UAAU,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAC1C,cAAc,EAAE,CACjB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAChE,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,kCAClC,cAAc,EAAE,KAAE,KAAK,IAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,cAAc,CACpD,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAChC,cAAc,EAAE,CACjB,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE,CAAC,cAAc,CAC7D,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,EACzC,cAAc,EAAE,CACjB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,EAAE,CAAC,cAAc,CACnE,UAAU,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAC/C,cAAc,EAAE,CACjB,CAAC","sourcesContent":["import { sendTrackEvent } from '@openedx/frontend-base';\n\nimport {\n courseId, events, eventNames, trackingCategory,\n} from './constants';\n\n/**\n * Segment analytics, emitted directly via `@openedx/frontend-base`\n * (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped\n * Redux actions to Segment events. Event names + base properties (category + the\n * `courseId` label) mirror the old `redux-beacon` mapping exactly.\n */\nconst baseProperties = () => ({ category: trackingCategory, label: courseId });\n\n/**\n * Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,\n * which fired per fetch with the filters it ran under and the page cursors.\n */\nexport const trackGradesDisplayed = ({\n assignmentType, cohort, track, prev, next,\n}) => sendTrackEvent(\n eventNames[events.receivedGrades],\n {\n ...baseProperties(), assignmentType, cohort, track, prev, next,\n },\n);\n\n/** Grade override saved from the edit modal succeeded. */\nexport const trackGradeOverrideSucceeded = (updatedGrades) => sendTrackEvent(\n eventNames[events.updateSucceeded],\n { ...baseProperties(), updatedGrades },\n);\n\n/** Grade override save failed. */\nexport const trackGradeOverrideFailed = (error) => sendTrackEvent(\n eventNames[events.updateFailed],\n { ...baseProperties(), error },\n);\n\n/** Bulk grade CSV override upload succeeded. */\nexport const trackUploadOverrideSucceeded = () => sendTrackEvent(\n eventNames[events.uploadOverrideSucceeded],\n baseProperties(),\n);\n\n/** Bulk grade CSV override upload failed. */\nexport const trackUploadOverrideFailed = (error) => sendTrackEvent(\n eventNames[events.uploadOverrideFailed],\n { ...baseProperties(), error },\n);\n\n/**\n * A filter was applied. Mirrors the legacy mapping, which fired this only from the\n * course-grade-limit apply action.\n */\nexport const trackFilterApplied = () => sendTrackEvent(\n eventNames[events.filterApplied],\n baseProperties(),\n);\n\n/** Grades CSV export was downloaded. */\nexport const trackGradesReportDownloaded = () => sendTrackEvent(\n eventNames[events.gradesReportDownloaded],\n baseProperties(),\n);\n\n/** Intervention report was downloaded. */\nexport const trackInterventionReportDownloaded = () => sendTrackEvent(\n eventNames[events.interventionReportDownloaded],\n baseProperties(),\n);\n"]}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/data/services/segment/events.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EACL,MAAM,EAAE,UAAU,EAAE,gBAAgB,GACrC,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,EAC7C,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAC1C,EAAE,EAAE,CAAC,cAAc,CAClB,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,kCAE5B,cAAc,CAAC,QAAQ,CAAC,KAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAEzE,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,CAAC,cAAc,CACpF,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,kCAC7B,cAAc,CAAC,QAAQ,CAAC,KAAE,aAAa,IAC7C,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CACzE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,kCAC1B,cAAc,CAAC,QAAQ,CAAC,KAAE,KAAK,IACrC,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CACtE,UAAU,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAC1C,cAAc,CAAC,QAAQ,CAAC,CACzB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAC1E,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,kCAClC,cAAc,CAAC,QAAQ,CAAC,KAAE,KAAK,IACrC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAC5D,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAChC,cAAc,CAAC,QAAQ,CAAC,CACzB,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CACrE,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,EACzC,cAAc,CAAC,QAAQ,CAAC,CACzB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAC3E,UAAU,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAC/C,cAAc,CAAC,QAAQ,CAAC,CACzB,CAAC","sourcesContent":["import { sendTrackEvent } from '@openedx/frontend-base';\n\nimport {\n events, eventNames, trackingCategory,\n} from './constants';\n\n/**\n * Segment analytics, emitted directly via `@openedx/frontend-base`\n * (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped\n * Redux actions to Segment events. Event names + base properties (category + the\n * `courseId` label) mirror the old `redux-beacon` mapping exactly.\n */\nconst baseProperties = (courseId) => ({ category: trackingCategory, label: courseId });\n\n/**\n * Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,\n * which fired per fetch with the filters it ran under and the page cursors.\n */\nexport const trackGradesDisplayed = (courseId, {\n assignmentType, cohort, track, prev, next,\n}) => sendTrackEvent(\n eventNames[events.receivedGrades],\n {\n ...baseProperties(courseId), assignmentType, cohort, track, prev, next,\n },\n);\n\n/** Grade override saved from the edit modal succeeded. */\nexport const trackGradeOverrideSucceeded = (courseId, updatedGrades) => sendTrackEvent(\n eventNames[events.updateSucceeded],\n { ...baseProperties(courseId), updatedGrades },\n);\n\n/** Grade override save failed. */\nexport const trackGradeOverrideFailed = (courseId, error) => sendTrackEvent(\n eventNames[events.updateFailed],\n { ...baseProperties(courseId), error },\n);\n\n/** Bulk grade CSV override upload succeeded. */\nexport const trackUploadOverrideSucceeded = (courseId) => sendTrackEvent(\n eventNames[events.uploadOverrideSucceeded],\n baseProperties(courseId),\n);\n\n/** Bulk grade CSV override upload failed. */\nexport const trackUploadOverrideFailed = (courseId, error) => sendTrackEvent(\n eventNames[events.uploadOverrideFailed],\n { ...baseProperties(courseId), error },\n);\n\n/**\n * A filter was applied. Mirrors the legacy mapping, which fired this only from the\n * course-grade-limit apply action.\n */\nexport const trackFilterApplied = (courseId) => sendTrackEvent(\n eventNames[events.filterApplied],\n baseProperties(courseId),\n);\n\n/** Grades CSV export was downloaded. */\nexport const trackGradesReportDownloaded = (courseId) => sendTrackEvent(\n eventNames[events.gradesReportDownloaded],\n baseProperties(courseId),\n);\n\n/** Intervention report was downloaded. */\nexport const trackInterventionReportDownloaded = (courseId) => sendTrackEvent(\n eventNames[events.interventionReportDownloaded],\n baseProperties(courseId),\n);\n"]}
@@ -1,2 +1,2 @@
1
- export function getLocalizedSlash(): "/" | "\\";
1
+ export function getLocalizedSlash(): "\\" | "/";
2
2
  export function getLocalizedPercentSign(): "‏%" | "%";
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { default as gradebookApp } from './app';
2
2
  export { default as gradebookRoutes } from './routes';
3
+ export { default as Gradebook } from './Gradebook';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { default as gradebookApp } from './app';
2
2
  export { default as gradebookRoutes } from './routes';
3
+ export { default as Gradebook } from './Gradebook';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC","sourcesContent":["export { default as gradebookApp } from './app';\nexport { default as gradebookRoutes } from './routes';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { default as gradebookApp } from './app';\nexport { default as gradebookRoutes } from './routes';\nexport { default as Gradebook } from './Gradebook';\n"]}
@@ -0,0 +1,3 @@
1
+ import { SlotOperation } from '@openedx/frontend-base';
2
+ declare const slots: SlotOperation[];
3
+ export default slots;
package/dist/slots.js ADDED
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { lazy, Suspense } from 'react';
3
+ import { WidgetOperationTypes } from '@openedx/frontend-base';
4
+ import { Spinner } from '@openedx/paragon';
5
+ // Lazy so the gradebook bundle isn't pulled into hosts that never render this slot.
6
+ const Gradebook = lazy(() => import('./Gradebook'));
7
+ // Slot id renders gradebook MFE inside student grades tab on ccx coach dashboard
8
+ const studentGradesSlotId = 'org.openedx.frontend.slot.ccxCoach.studentGrades.v1';
9
+ // Framed spinner instead of a blank tab while the chunk loads.
10
+ const GradebookWidgetFallback = () => (_jsx("div", { className: "d-flex justify-content-center p-4", children: _jsx(Spinner, { animation: "border", variant: "dark", screenReaderText: "Loading gradebook" }) }));
11
+ // Own Suspense boundary: the host slot doesn't provide one.
12
+ const GradebookWidget = ({ courseId, onBack }) => (_jsx(Suspense, { fallback: _jsx(GradebookWidgetFallback, {}), children: _jsx(Gradebook, { courseId: courseId, onBack: onBack }) }));
13
+ const slots = [
14
+ {
15
+ slotId: studentGradesSlotId,
16
+ id: 'org.openedx.frontend.widget.gradebook.studentGrades.v1',
17
+ op: WidgetOperationTypes.APPEND,
18
+ component: GradebookWidget,
19
+ },
20
+ ];
21
+ export default slots;
22
+ //# sourceMappingURL=slots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slots.js","sourceRoot":"","sources":["../src/slots.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAiB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,oFAAoF;AACpF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAEpD,iFAAiF;AACjF,MAAM,mBAAmB,GAAG,qDAAqD,CAAC;AAOlF,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,CACpC,cAAK,SAAS,EAAC,mCAAmC,YAChD,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,gBAAgB,EAAC,mBAAmB,GAAG,GAC9E,CACP,CAAC;AAEF,4DAA4D;AAC5D,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAwB,EAAE,EAAE,CAAC,CACtE,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,uBAAuB,KAAG,YAC7C,KAAC,SAAS,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAI,GACxC,CACZ,CAAC;AAEF,MAAM,KAAK,GAAoB;IAC7B;QACE,MAAM,EAAE,mBAAmB;QAC3B,EAAE,EAAE,wDAAwD;QAC5D,EAAE,EAAE,oBAAoB,CAAC,MAAM;QAC/B,SAAS,EAAE,eAAe;KAC3B;CACF,CAAC;AAEF,eAAe,KAAK,CAAC","sourcesContent":["import { lazy, Suspense } from 'react';\nimport { SlotOperation, WidgetOperationTypes } from '@openedx/frontend-base';\nimport { Spinner } from '@openedx/paragon';\n\n// Lazy so the gradebook bundle isn't pulled into hosts that never render this slot.\nconst Gradebook = lazy(() => import('./Gradebook'));\n\n// Slot id renders gradebook MFE inside student grades tab on ccx coach dashboard\nconst studentGradesSlotId = 'org.openedx.frontend.slot.ccxCoach.studentGrades.v1';\n\ninterface GradebookWidgetProps {\n courseId: string;\n onBack?: () => void;\n}\n\n// Framed spinner instead of a blank tab while the chunk loads.\nconst GradebookWidgetFallback = () => (\n <div className=\"d-flex justify-content-center p-4\">\n <Spinner animation=\"border\" variant=\"dark\" screenReaderText=\"Loading gradebook\" />\n </div>\n);\n\n// Own Suspense boundary: the host slot doesn't provide one.\nconst GradebookWidget = ({ courseId, onBack }: GradebookWidgetProps) => (\n <Suspense fallback={<GradebookWidgetFallback />}>\n <Gradebook courseId={courseId} onBack={onBack} />\n </Suspense>\n);\n\nconst slots: SlotOperation[] = [\n {\n slotId: studentGradesSlotId,\n id: 'org.openedx.frontend.widget.gradebook.studentGrades.v1',\n op: WidgetOperationTypes.APPEND,\n component: GradebookWidget,\n },\n];\n\nexport default slots;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/frontend-app-gradebook",
3
- "version": "2.0.0-alpha.4",
3
+ "version": "2.0.0-alpha.6",
4
4
  "author": "Open edX",
5
5
  "license": "AGPL-3.0",
6
6
  "description": "edx editable gradebook-ui to manipulate grade overrides on subsections",
@@ -62,7 +62,7 @@
62
62
  "sass": "^1.49.0"
63
63
  },
64
64
  "peerDependencies": {
65
- "@openedx/frontend-base": "^2.0.0-alpha.2 || 0.0.0-dev",
65
+ "@openedx/frontend-base": "^2.0.0-alpha.15 || 0.0.0-dev",
66
66
  "@openedx/paragon": "^23",
67
67
  "@tanstack/react-query": "^5",
68
68
  "react": "^18",
@@ -1,10 +0,0 @@
1
- import { QueryClient } from '@tanstack/react-query';
2
- /**
3
- * Application-wide React Query client.
4
- *
5
- * Defaults are promoted here (rather than repeated per hook) to keep individual
6
- * query hooks lean: cache server data for 5 minutes and skip retries on 4xx.
7
- */
8
- export declare const makeQueryClient: () => QueryClient;
9
- declare const queryClient: QueryClient;
10
- export default queryClient;
@@ -1,34 +0,0 @@
1
- import { QueryClient } from '@tanstack/react-query';
2
- /**
3
- * isClientError(error)
4
- * True for 4xx responses, which are not worth retrying (bad request, auth,
5
- * not found, etc.). Server (5xx) and network errors remain retryable.
6
- */
7
- const isClientError = (error) => {
8
- var _a;
9
- const status = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status;
10
- return typeof status === 'number' && status >= 400 && status < 500;
11
- };
12
- /**
13
- * Application-wide React Query client.
14
- *
15
- * Defaults are promoted here (rather than repeated per hook) to keep individual
16
- * query hooks lean: cache server data for 5 minutes and skip retries on 4xx.
17
- */
18
- export const makeQueryClient = () => new QueryClient({
19
- defaultOptions: {
20
- queries: {
21
- staleTime: 5 * 60 * 1000, // 5 minutes
22
- refetchOnWindowFocus: false,
23
- retry: (failureCount, error) => {
24
- if (isClientError(error)) {
25
- return false;
26
- }
27
- return failureCount < 3;
28
- },
29
- },
30
- },
31
- });
32
- const queryClient = makeQueryClient();
33
- export default queryClient;
34
- //# sourceMappingURL=queryClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queryClient.js","sourceRoot":"","sources":["../../src/data/queryClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAUpD;;;;GAIG;AACH,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE;;IAChD,MAAM,MAAM,GAAG,MAAC,KAAuB,aAAvB,KAAK,uBAAL,KAAK,CAAoB,QAAQ,0CAAE,MAAM,CAAC;IAC1D,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAgB,EAAE,CAAC,IAAI,WAAW,CAAC;IAChE,cAAc,EAAE;QACd,OAAO,EAAE;YACP,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;YACtC,oBAAoB,EAAE,KAAK;YAC3B,KAAK,EAAE,CAAC,YAAoB,EAAE,KAAc,EAAE,EAAE;gBAC9C,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,YAAY,GAAG,CAAC,CAAC;YAC1B,CAAC;SACF;KACF;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;AAEtC,eAAe,WAAW,CAAC","sourcesContent":["import { QueryClient } from '@tanstack/react-query';\n\n/**\n * Shape of the subset of an Axios-style error we inspect to decide retries.\n * We only need the HTTP status, so we avoid a hard dependency on axios types.\n */\ninterface HttpErrorLike {\n response?: { status?: number };\n}\n\n/**\n * isClientError(error)\n * True for 4xx responses, which are not worth retrying (bad request, auth,\n * not found, etc.). Server (5xx) and network errors remain retryable.\n */\nconst isClientError = (error: unknown): boolean => {\n const status = (error as HttpErrorLike)?.response?.status;\n return typeof status === 'number' && status >= 400 && status < 500;\n};\n\n/**\n * Application-wide React Query client.\n *\n * Defaults are promoted here (rather than repeated per hook) to keep individual\n * query hooks lean: cache server data for 5 minutes and skip retries on 4xx.\n */\nexport const makeQueryClient = (): QueryClient => new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n refetchOnWindowFocus: false,\n retry: (failureCount: number, error: unknown) => {\n if (isClientError(error)) {\n return false;\n }\n return failureCount < 3;\n },\n },\n },\n});\n\nconst queryClient = makeQueryClient();\n\nexport default queryClient;\n"]}
@@ -1,3 +0,0 @@
1
- import { AppProvider } from '@openedx/frontend-base';
2
- declare const providers: AppProvider[];
3
- export default providers;
package/dist/providers.js DELETED
@@ -1,13 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { QueryClientProvider } from '@tanstack/react-query';
3
- import queryClient from './data/queryClient';
4
- /**
5
- * Wraps the app subtree in the configured query client (5-minute staleTime, no
6
- * refetch on focus, no retries on 4xx — see `src/data/queryClient.ts`),
7
- * shadowing the shell's default client.
8
- */
9
- // eslint-disable-next-line react/prop-types
10
- const QueryProvider = ({ children }) => (_jsx(QueryClientProvider, { client: queryClient, children: children }));
11
- const providers = [QueryProvider];
12
- export default providers;
13
- //# sourceMappingURL=providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD;;;;GAIG;AACH,4CAA4C;AAC5C,MAAM,aAAa,GAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACnD,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YAAG,QAAQ,GAAuB,CAC3E,CAAC;AAEF,MAAM,SAAS,GAAkB,CAAC,aAAa,CAAC,CAAC;AAEjD,eAAe,SAAS,CAAC","sourcesContent":["import { QueryClientProvider } from '@tanstack/react-query';\nimport { AppProvider } from '@openedx/frontend-base';\n\nimport queryClient from '@src/data/queryClient';\n\n/**\n * Wraps the app subtree in the configured query client (5-minute staleTime, no\n * refetch on focus, no retries on 4xx — see `src/data/queryClient.ts`),\n * shadowing the shell's default client.\n */\n// eslint-disable-next-line react/prop-types\nconst QueryProvider: AppProvider = ({ children }) => (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n);\n\nconst providers: AppProvider[] = [QueryProvider];\n\nexport default providers;\n"]}