@openedx/frontend-app-gradebook 2.0.0-alpha.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.
- package/LICENSE +661 -0
- package/README.rst +279 -0
- package/dist/Main.d.ts +3 -0
- package/dist/Main.js +17 -0
- package/dist/Main.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.js +10 -0
- package/dist/app.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.d.ts +5 -0
- package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.js +20 -0
- package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/BulkManagementHistoryView.scss +6 -0
- package/dist/components/BulkManagementHistoryView/HistoryTable.d.ts +33 -0
- package/dist/components/BulkManagementHistoryView/HistoryTable.js +53 -0
- package/dist/components/BulkManagementHistoryView/HistoryTable.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/ResultsSummary.d.ts +16 -0
- package/dist/components/BulkManagementHistoryView/ResultsSummary.js +19 -0
- package/dist/components/BulkManagementHistoryView/ResultsSummary.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/data/api.d.ts +5 -0
- package/dist/components/BulkManagementHistoryView/data/api.js +16 -0
- package/dist/components/BulkManagementHistoryView/data/api.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/data/apiHook.d.ts +16 -0
- package/dist/components/BulkManagementHistoryView/data/apiHook.js +34 -0
- package/dist/components/BulkManagementHistoryView/data/apiHook.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/data/queryKeys.d.ts +5 -0
- package/dist/components/BulkManagementHistoryView/data/queryKeys.js +7 -0
- package/dist/components/BulkManagementHistoryView/data/queryKeys.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/data/utils.d.ts +34 -0
- package/dist/components/BulkManagementHistoryView/data/utils.js +45 -0
- package/dist/components/BulkManagementHistoryView/data/utils.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/index.d.ts +2 -0
- package/dist/components/BulkManagementHistoryView/index.js +12 -0
- package/dist/components/BulkManagementHistoryView/index.js.map +1 -0
- package/dist/components/BulkManagementHistoryView/messages.d.ts +24 -0
- package/dist/components/BulkManagementHistoryView/messages.js +20 -0
- package/dist/components/BulkManagementHistoryView/messages.js.map +1 -0
- package/dist/components/GradebookFilters/AssignmentFilter/index.d.ts +10 -0
- package/dist/components/GradebookFilters/AssignmentFilter/index.js +31 -0
- package/dist/components/GradebookFilters/AssignmentFilter/index.js.map +1 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.d.ts +19 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.js +31 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.js.map +1 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/index.d.ts +10 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/index.js +17 -0
- package/dist/components/GradebookFilters/AssignmentGradeFilter/index.js.map +1 -0
- package/dist/components/GradebookFilters/AssignmentTypeFilter/index.d.ts +10 -0
- package/dist/components/GradebookFilters/AssignmentTypeFilter/index.js +38 -0
- package/dist/components/GradebookFilters/AssignmentTypeFilter/index.js.map +1 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/hooks.d.ts +15 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js +34 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js.map +1 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/index.d.ts +10 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/index.js +17 -0
- package/dist/components/GradebookFilters/CourseGradeFilter/index.js.map +1 -0
- package/dist/components/GradebookFilters/GradebookFilters.scss +6 -0
- package/dist/components/GradebookFilters/PercentGroup.d.ts +22 -0
- package/dist/components/GradebookFilters/PercentGroup.js +16 -0
- package/dist/components/GradebookFilters/PercentGroup.js.map +1 -0
- package/dist/components/GradebookFilters/SelectGroup.d.ts +24 -0
- package/dist/components/GradebookFilters/SelectGroup.js +17 -0
- package/dist/components/GradebookFilters/SelectGroup.js.map +1 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.d.ts +16 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.js +46 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.js.map +1 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/index.d.ts +10 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/index.js +23 -0
- package/dist/components/GradebookFilters/StudentGroupsFilter/index.js.map +1 -0
- package/dist/components/GradebookFilters/data/api.d.ts +10 -0
- package/dist/components/GradebookFilters/data/api.js +27 -0
- package/dist/components/GradebookFilters/data/api.js.map +1 -0
- package/dist/components/GradebookFilters/data/apiHook.d.ts +16 -0
- package/dist/components/GradebookFilters/data/apiHook.js +24 -0
- package/dist/components/GradebookFilters/data/apiHook.js.map +1 -0
- package/dist/components/GradebookFilters/data/hooks.d.ts +7 -0
- package/dist/components/GradebookFilters/data/hooks.js +53 -0
- package/dist/components/GradebookFilters/data/hooks.js.map +1 -0
- package/dist/components/GradebookFilters/data/queryKeys.d.ts +10 -0
- package/dist/components/GradebookFilters/data/queryKeys.js +12 -0
- package/dist/components/GradebookFilters/data/queryKeys.js.map +1 -0
- package/dist/components/GradebookFilters/index.d.ts +10 -0
- package/dist/components/GradebookFilters/index.js +32 -0
- package/dist/components/GradebookFilters/index.js.map +1 -0
- package/dist/components/GradebookFilters/messages.d.ts +112 -0
- package/dist/components/GradebookFilters/messages.js +75 -0
- package/dist/components/GradebookFilters/messages.js.map +1 -0
- package/dist/components/GradebookHeader/hooks.d.ts +13 -0
- package/dist/components/GradebookHeader/hooks.js +28 -0
- package/dist/components/GradebookHeader/hooks.js.map +1 -0
- package/dist/components/GradebookHeader/index.d.ts +2 -0
- package/dist/components/GradebookHeader/index.js +14 -0
- package/dist/components/GradebookHeader/index.js.map +1 -0
- package/dist/components/GradebookHeader/messages.d.ts +48 -0
- package/dist/components/GradebookHeader/messages.js +35 -0
- package/dist/components/GradebookHeader/messages.js.map +1 -0
- package/dist/components/GradesView/BulkManagementControls/index.d.ts +2 -0
- package/dist/components/GradesView/BulkManagementControls/index.js +26 -0
- package/dist/components/GradesView/BulkManagementControls/index.js.map +1 -0
- package/dist/components/GradesView/BulkManagementControls/messages.d.ts +8 -0
- package/dist/components/GradesView/BulkManagementControls/messages.js +10 -0
- package/dist/components/GradesView/BulkManagementControls/messages.js.map +1 -0
- package/dist/components/GradesView/EditModal/HistoryHeader.d.ts +21 -0
- package/dist/components/GradesView/EditModal/HistoryHeader.js +20 -0
- package/dist/components/GradesView/EditModal/HistoryHeader.js.map +1 -0
- package/dist/components/GradesView/EditModal/ModalHeaders.d.ts +3 -0
- package/dist/components/GradesView/EditModal/ModalHeaders.js +26 -0
- package/dist/components/GradesView/EditModal/ModalHeaders.js.map +1 -0
- package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.d.ts +5 -0
- package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.js +23 -0
- package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.js.map +1 -0
- package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.d.ts +6 -0
- package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.js +25 -0
- package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.js.map +1 -0
- package/dist/components/GradesView/EditModal/OverrideTable/index.d.ts +5 -0
- package/dist/components/GradesView/EditModal/OverrideTable/index.js +39 -0
- package/dist/components/GradesView/EditModal/OverrideTable/index.js.map +1 -0
- package/dist/components/GradesView/EditModal/OverrideTable/messages.d.ts +32 -0
- package/dist/components/GradesView/EditModal/OverrideTable/messages.js +25 -0
- package/dist/components/GradesView/EditModal/OverrideTable/messages.js.map +1 -0
- package/dist/components/GradesView/EditModal/index.d.ts +2 -0
- package/dist/components/GradesView/EditModal/index.js +35 -0
- package/dist/components/GradesView/EditModal/index.js.map +1 -0
- package/dist/components/GradesView/EditModal/messages.d.ts +72 -0
- package/dist/components/GradesView/EditModal/messages.js +50 -0
- package/dist/components/GradesView/EditModal/messages.js.map +1 -0
- package/dist/components/GradesView/FilterBadges/FilterBadge.d.ts +9 -0
- package/dist/components/GradesView/FilterBadges/FilterBadge.js +27 -0
- package/dist/components/GradesView/FilterBadges/FilterBadge.js.map +1 -0
- package/dist/components/GradesView/FilterBadges/index.d.ts +8 -0
- package/dist/components/GradesView/FilterBadges/index.js +15 -0
- package/dist/components/GradesView/FilterBadges/index.js.map +1 -0
- package/dist/components/GradesView/FilterMenuToggle/index.d.ts +5 -0
- package/dist/components/GradesView/FilterMenuToggle/index.js +18 -0
- package/dist/components/GradesView/FilterMenuToggle/index.js.map +1 -0
- package/dist/components/GradesView/FilterMenuToggle/messages.d.ts +8 -0
- package/dist/components/GradesView/FilterMenuToggle/messages.js +10 -0
- package/dist/components/GradesView/FilterMenuToggle/messages.js.map +1 -0
- package/dist/components/GradesView/FilteredUsersLabel/index.d.ts +15 -0
- package/dist/components/GradesView/FilteredUsersLabel/index.js +27 -0
- package/dist/components/GradesView/FilteredUsersLabel/index.js.map +1 -0
- package/dist/components/GradesView/FilteredUsersLabel/messages.d.ts +8 -0
- package/dist/components/GradesView/FilteredUsersLabel/messages.js +10 -0
- package/dist/components/GradesView/FilteredUsersLabel/messages.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/Fields.d.ts +2 -0
- package/dist/components/GradesView/GradebookTable/Fields.js +32 -0
- package/dist/components/GradesView/GradebookTable/Fields.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/GradeButton.d.ts +26 -0
- package/dist/components/GradesView/GradebookTable/GradeButton.js +56 -0
- package/dist/components/GradesView/GradebookTable/GradeButton.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/LabelReplacements.d.ts +3 -0
- package/dist/components/GradesView/GradebookTable/LabelReplacements.js +42 -0
- package/dist/components/GradesView/GradebookTable/LabelReplacements.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/hooks.d.ts +11 -0
- package/dist/components/GradesView/GradebookTable/hooks.js +45 -0
- package/dist/components/GradesView/GradebookTable/hooks.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/index.d.ts +5 -0
- package/dist/components/GradesView/GradebookTable/index.js +16 -0
- package/dist/components/GradesView/GradebookTable/index.js.map +1 -0
- package/dist/components/GradesView/GradebookTable/messages.d.ts +64 -0
- package/dist/components/GradesView/GradebookTable/messages.js +45 -0
- package/dist/components/GradesView/GradebookTable/messages.js.map +1 -0
- package/dist/components/GradesView/GradesView.scss +156 -0
- package/dist/components/GradesView/ImportGradesButton/index.d.ts +5 -0
- package/dist/components/GradesView/ImportGradesButton/index.js +38 -0
- package/dist/components/GradesView/ImportGradesButton/index.js.map +1 -0
- package/dist/components/GradesView/ImportGradesButton/messages.d.ts +16 -0
- package/dist/components/GradesView/ImportGradesButton/messages.js +15 -0
- package/dist/components/GradesView/ImportGradesButton/messages.js.map +1 -0
- package/dist/components/GradesView/ImportSuccessToast/hooks.d.ts +10 -0
- package/dist/components/GradesView/ImportSuccessToast/hooks.js +31 -0
- package/dist/components/GradesView/ImportSuccessToast/hooks.js.map +1 -0
- package/dist/components/GradesView/ImportSuccessToast/index.d.ts +5 -0
- package/dist/components/GradesView/ImportSuccessToast/index.js +15 -0
- package/dist/components/GradesView/ImportSuccessToast/index.js.map +1 -0
- package/dist/components/GradesView/ImportSuccessToast/messages.d.ts +17 -0
- package/dist/components/GradesView/ImportSuccessToast/messages.js +15 -0
- package/dist/components/GradesView/ImportSuccessToast/messages.js.map +1 -0
- package/dist/components/GradesView/InterventionsReport/index.d.ts +2 -0
- package/dist/components/GradesView/InterventionsReport/index.js +27 -0
- package/dist/components/GradesView/InterventionsReport/index.js.map +1 -0
- package/dist/components/GradesView/InterventionsReport/messages.d.ts +25 -0
- package/dist/components/GradesView/InterventionsReport/messages.js +20 -0
- package/dist/components/GradesView/InterventionsReport/messages.js.map +1 -0
- package/dist/components/GradesView/PageButtons/index.d.ts +5 -0
- package/dist/components/GradesView/PageButtons/index.js +14 -0
- package/dist/components/GradesView/PageButtons/index.js.map +1 -0
- package/dist/components/GradesView/PageButtons/messages.d.ts +16 -0
- package/dist/components/GradesView/PageButtons/messages.js +15 -0
- package/dist/components/GradesView/PageButtons/messages.js.map +1 -0
- package/dist/components/GradesView/ScoreViewInput/index.d.ts +5 -0
- package/dist/components/GradesView/ScoreViewInput/index.js +20 -0
- package/dist/components/GradesView/ScoreViewInput/index.js.map +1 -0
- package/dist/components/GradesView/ScoreViewInput/messages.d.ts +24 -0
- package/dist/components/GradesView/ScoreViewInput/messages.js +20 -0
- package/dist/components/GradesView/ScoreViewInput/messages.js.map +1 -0
- package/dist/components/GradesView/SearchControls/hooks.d.ts +9 -0
- package/dist/components/GradesView/SearchControls/hooks.js +34 -0
- package/dist/components/GradesView/SearchControls/hooks.js.map +1 -0
- package/dist/components/GradesView/SearchControls/index.d.ts +5 -0
- package/dist/components/GradesView/SearchControls/index.js +14 -0
- package/dist/components/GradesView/SearchControls/index.js.map +1 -0
- package/dist/components/GradesView/SearchControls/messages.d.ts +16 -0
- package/dist/components/GradesView/SearchControls/messages.js +15 -0
- package/dist/components/GradesView/SearchControls/messages.js.map +1 -0
- package/dist/components/GradesView/SpinnerIcon.d.ts +5 -0
- package/dist/components/GradesView/SpinnerIcon.js +15 -0
- package/dist/components/GradesView/SpinnerIcon.js.map +1 -0
- package/dist/components/GradesView/StatusAlerts/index.d.ts +5 -0
- package/dist/components/GradesView/StatusAlerts/index.js +16 -0
- package/dist/components/GradesView/StatusAlerts/index.js.map +1 -0
- package/dist/components/GradesView/StatusAlerts/messages.d.ts +24 -0
- package/dist/components/GradesView/StatusAlerts/messages.js +20 -0
- package/dist/components/GradesView/StatusAlerts/messages.js.map +1 -0
- package/dist/components/GradesView/data/api.d.ts +44 -0
- package/dist/components/GradesView/data/api.js +64 -0
- package/dist/components/GradesView/data/api.js.map +1 -0
- package/dist/components/GradesView/data/apiHook.d.ts +92 -0
- package/dist/components/GradesView/data/apiHook.js +191 -0
- package/dist/components/GradesView/data/apiHook.js.map +1 -0
- package/dist/components/GradesView/data/hooks.d.ts +32 -0
- package/dist/components/GradesView/data/hooks.js +242 -0
- package/dist/components/GradesView/data/hooks.js.map +1 -0
- package/dist/components/GradesView/data/queryKeys.d.ts +13 -0
- package/dist/components/GradesView/data/queryKeys.js +15 -0
- package/dist/components/GradesView/data/queryKeys.js.map +1 -0
- package/dist/components/GradesView/data/utils.d.ts +96 -0
- package/dist/components/GradesView/data/utils.js +103 -0
- package/dist/components/GradesView/data/utils.js.map +1 -0
- package/dist/components/GradesView/index.d.ts +10 -0
- package/dist/components/GradesView/index.js +35 -0
- package/dist/components/GradesView/index.js.map +1 -0
- package/dist/components/GradesView/messages.d.ts +24 -0
- package/dist/components/GradesView/messages.js +20 -0
- package/dist/components/GradesView/messages.js.map +1 -0
- package/dist/components/NetworkButton/index.d.ts +23 -0
- package/dist/components/NetworkButton/index.js +54 -0
- package/dist/components/NetworkButton/index.js.map +1 -0
- package/dist/components/WithSidebar/WithSidebar.scss +36 -0
- package/dist/components/WithSidebar/index.d.ts +9 -0
- package/dist/components/WithSidebar/index.js +34 -0
- package/dist/components/WithSidebar/index.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/containers/GradebookPage/GradebookDataLoader.d.ts +10 -0
- package/dist/containers/GradebookPage/GradebookDataLoader.js +19 -0
- package/dist/containers/GradebookPage/GradebookDataLoader.js.map +1 -0
- package/dist/containers/GradebookPage/index.d.ts +2 -0
- package/dist/containers/GradebookPage/index.js +40 -0
- package/dist/containers/GradebookPage/index.js.map +1 -0
- package/dist/data/api.d.ts +20 -0
- package/dist/data/api.js +36 -0
- package/dist/data/api.js.map +1 -0
- package/dist/data/apiHook.d.ts +40 -0
- package/dist/data/apiHook.js +65 -0
- package/dist/data/apiHook.js.map +1 -0
- package/dist/data/constants/app.d.ts +13 -0
- package/dist/data/constants/app.js +58 -0
- package/dist/data/constants/app.js.map +1 -0
- package/dist/data/constants/errors.d.ts +2 -0
- package/dist/data/constants/errors.js +3 -0
- package/dist/data/constants/errors.js.map +1 -0
- package/dist/data/constants/filters.d.ts +15 -0
- package/dist/data/constants/filters.js +71 -0
- package/dist/data/constants/filters.js.map +1 -0
- package/dist/data/constants/filters.messages.d.ts +56 -0
- package/dist/data/constants/filters.messages.js +40 -0
- package/dist/data/constants/filters.messages.js.map +1 -0
- package/dist/data/constants/grades.d.ts +6 -0
- package/dist/data/constants/grades.js +17 -0
- package/dist/data/constants/grades.js.map +1 -0
- package/dist/data/filtersContext.d.ts +60 -0
- package/dist/data/filtersContext.js +212 -0
- package/dist/data/filtersContext.js.map +1 -0
- package/dist/data/filtersSnapshot.d.ts +20 -0
- package/dist/data/filtersSnapshot.js +15 -0
- package/dist/data/filtersSnapshot.js.map +1 -0
- package/dist/data/formatUtils.d.ts +15 -0
- package/dist/data/formatUtils.js +35 -0
- package/dist/data/formatUtils.js.map +1 -0
- package/dist/data/gradebookUiContext.d.ts +99 -0
- package/dist/data/gradebookUiContext.js +143 -0
- package/dist/data/gradebookUiContext.js.map +1 -0
- package/dist/data/queryClient.d.ts +10 -0
- package/dist/data/queryClient.js +34 -0
- package/dist/data/queryClient.js.map +1 -0
- package/dist/data/queryKeys.d.ts +11 -0
- package/dist/data/queryKeys.js +21 -0
- package/dist/data/queryKeys.js.map +1 -0
- package/dist/data/services/lms/api.d.ts +2 -0
- package/dist/data/services/lms/api.js +104 -0
- package/dist/data/services/lms/api.js.map +1 -0
- package/dist/data/services/lms/constants.d.ts +3 -0
- package/dist/data/services/lms/constants.js +16 -0
- package/dist/data/services/lms/constants.js.map +1 -0
- package/dist/data/services/lms/index.d.ts +2 -0
- package/dist/data/services/lms/index.js +8 -0
- package/dist/data/services/lms/index.js.map +1 -0
- package/dist/data/services/lms/messages.d.ts +2 -0
- package/dist/data/services/lms/messages.js +8 -0
- package/dist/data/services/lms/messages.js.map +1 -0
- package/dist/data/services/lms/urls.d.ts +19 -0
- package/dist/data/services/lms/urls.js +47 -0
- package/dist/data/services/lms/urls.js.map +1 -0
- package/dist/data/services/lms/utils.d.ts +4 -0
- package/dist/data/services/lms/utils.js +34 -0
- package/dist/data/services/lms/utils.js.map +1 -0
- package/dist/data/services/segment/constants.d.ts +8 -0
- package/dist/data/services/segment/constants.js +26 -0
- package/dist/data/services/segment/constants.js.map +1 -0
- package/dist/data/services/segment/events.d.ts +14 -0
- package/dist/data/services/segment/events.js +32 -0
- package/dist/data/services/segment/events.js.map +1 -0
- package/dist/data/utils.d.ts +10 -0
- package/dist/data/utils.js +14 -0
- package/dist/data/utils.js.map +1 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/utils.d.ts +2 -0
- package/dist/i18n/utils.js +21 -0
- package/dist/i18n/utils.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +8 -0
- package/dist/messages.js +10 -0
- package/dist/messages.js.map +1 -0
- package/dist/providers.d.ts +3 -0
- package/dist/providers.js +13 -0
- package/dist/providers.js.map +1 -0
- package/dist/routes.d.ts +11 -0
- package/dist/routes.js +16 -0
- package/dist/routes.js.map +1 -0
- package/dist/style.scss +13 -0
- package/dist/utils/StrictDict.d.ts +2 -0
- package/dist/utils/StrictDict.js +19 -0
- package/dist/utils/StrictDict.js.map +1 -0
- package/dist/utils/formatDate.d.ts +15 -0
- package/dist/utils/formatDate.js +19 -0
- package/dist/utils/formatDate.js.map +1 -0
- package/dist/utils/hoc.d.ts +3 -0
- package/dist/utils/hoc.js +21 -0
- package/dist/utils/hoc.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/keyStore.d.ts +2 -0
- package/dist/utils/keyStore.js +4 -0
- package/dist/utils/keyStore.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,34 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const BASE_KEY: readonly ["gradebook"];
|
|
2
|
+
/** Roles-based "can view the gradebook" permission gate (the fetch-cascade root). */
|
|
3
|
+
export declare const rolesQueryKeys: {
|
|
4
|
+
all: readonly ["gradebook"];
|
|
5
|
+
byCourse: (courseId: string) => readonly ["gradebook", string, "roles"];
|
|
6
|
+
};
|
|
7
|
+
/** Assignment types + grades-frozen / bulk-management flags (app-wide config). */
|
|
8
|
+
export declare const assignmentTypesQueryKeys: {
|
|
9
|
+
all: readonly ["gradebook"];
|
|
10
|
+
byCourse: (courseId: string) => readonly ["gradebook", string, "assignmentTypes"];
|
|
11
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Top-level (app-wide) query-key factories, mirroring the instructor dashboard's
|
|
2
|
+
// `src/data/queryKeys.ts`: shared server-state that multiple features gate on
|
|
3
|
+
// lives here (the roles permission gate + the assignment-types/config bundle used
|
|
4
|
+
// by the header, filters, and bulk-management views).
|
|
5
|
+
//
|
|
6
|
+
// Keys are namespaced under `BASE_KEY` and scoped by `courseId` so React Query
|
|
7
|
+
// caches independently per course and mutations can invalidate a whole course
|
|
8
|
+
// subtree via a broad prefix. The array shapes match the legacy
|
|
9
|
+
// `gradebookQueryKeys` so cache identity / invalidation is preserved.
|
|
10
|
+
export const BASE_KEY = ['gradebook'];
|
|
11
|
+
/** Roles-based "can view the gradebook" permission gate (the fetch-cascade root). */
|
|
12
|
+
export const rolesQueryKeys = {
|
|
13
|
+
all: BASE_KEY,
|
|
14
|
+
byCourse: (courseId) => [...BASE_KEY, courseId, 'roles'],
|
|
15
|
+
};
|
|
16
|
+
/** Assignment types + grades-frozen / bulk-management flags (app-wide config). */
|
|
17
|
+
export const assignmentTypesQueryKeys = {
|
|
18
|
+
all: BASE_KEY,
|
|
19
|
+
byCourse: (courseId) => [...BASE_KEY, courseId, 'assignmentTypes'],
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=queryKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../src/data/queryKeys.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,kFAAkF;AAClF,sDAAsD;AACtD,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,gEAAgE;AAChE,sEAAsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAU,CAAC;AAE/C,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU;CAC1E,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAU;CACpF,CAAC","sourcesContent":["// Top-level (app-wide) query-key factories, mirroring the instructor dashboard's\n// `src/data/queryKeys.ts`: shared server-state that multiple features gate on\n// lives here (the roles permission gate + the assignment-types/config bundle used\n// by the header, filters, and bulk-management views).\n//\n// Keys are namespaced under `BASE_KEY` and scoped by `courseId` so React Query\n// caches independently per course and mutations can invalidate a whole course\n// subtree via a broad prefix. The array shapes match the legacy\n// `gradebookQueryKeys` so cache identity / invalidation is preserved.\nexport const BASE_KEY = ['gradebook'] as const;\n\n/** Roles-based \"can view the gradebook\" permission gate (the fetch-cascade root). */\nexport const rolesQueryKeys = {\n all: BASE_KEY,\n byCourse: (courseId: string) => [...BASE_KEY, courseId, 'roles'] as const,\n};\n\n/** Assignment types + grades-frozen / bulk-management flags (app-wide config). */\nexport const assignmentTypesQueryKeys = {\n all: BASE_KEY,\n byCourse: (courseId: string) => [...BASE_KEY, courseId, 'assignmentTypes'] as const,\n};\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
import urls, { gradeCsvUrl, sectionOverrideHistoryUrl, } from './urls';
|
|
3
|
+
import { pageSize, paramKeys } from './constants';
|
|
4
|
+
import messages from './messages';
|
|
5
|
+
import * as utils from './utils';
|
|
6
|
+
const { get, post, stringifyUrl } = utils;
|
|
7
|
+
/*********************************************************************************
|
|
8
|
+
* GET Actions
|
|
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());
|
|
14
|
+
/**
|
|
15
|
+
* fetch.gradebookData(searchText, cohort, track, options)
|
|
16
|
+
* fetches updated gradebook data based on current filter selections.
|
|
17
|
+
* Raises an error if assignment grade limits are set, but not assignment.
|
|
18
|
+
* @param {string} searchText - search text filter
|
|
19
|
+
* @param {nunber} cohort - selected cohort filter
|
|
20
|
+
* @param {string} track - selected track filter
|
|
21
|
+
* @param {object} options - additional optional filter values
|
|
22
|
+
* @return {Promise} - get response
|
|
23
|
+
*/
|
|
24
|
+
const gradebookData = (searchText, cohort, track, options = {}) => {
|
|
25
|
+
if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {
|
|
26
|
+
throw new Error(messages.errors.missingAssignment);
|
|
27
|
+
}
|
|
28
|
+
const queryParams = {
|
|
29
|
+
[paramKeys.pageSize]: pageSize,
|
|
30
|
+
[paramKeys.userContains]: searchText,
|
|
31
|
+
[paramKeys.cohortId]: cohort,
|
|
32
|
+
[paramKeys.enrollmentMode]: track,
|
|
33
|
+
[paramKeys.courseGradeMax]: options.courseGradeMax,
|
|
34
|
+
[paramKeys.courseGradeMin]: options.courseGradeMin,
|
|
35
|
+
[paramKeys.excludedCourseRoles]: options.includeCourseRoleMembers ? null : ['all'],
|
|
36
|
+
[paramKeys.assignment]: options.assignment,
|
|
37
|
+
[paramKeys.assignmentGradeMax]: options.assignmentGradeMax,
|
|
38
|
+
[paramKeys.assignmentGradeMin]: options.assignmentGradeMin,
|
|
39
|
+
};
|
|
40
|
+
return get(stringifyUrl(urls.getGradebookUrl(), queryParams));
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* fetch.gradeBulkOperationHistory()
|
|
44
|
+
* fetches bulk operation history and raises an error if the operation fails
|
|
45
|
+
* @return {Promise} - get response
|
|
46
|
+
*/
|
|
47
|
+
const gradeBulkOperationHistory = () => get(urls.getBulkHistoryUrl())
|
|
48
|
+
.then(response => response.data)
|
|
49
|
+
.catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));
|
|
50
|
+
/**
|
|
51
|
+
* fetch.gradeOverrideHistory(subsectionId, userId)
|
|
52
|
+
* fetches grade override history for a given user on a given subsection
|
|
53
|
+
* @param {string} subsectionId - subsection identifier
|
|
54
|
+
* @param {string} userId - user identifier
|
|
55
|
+
* @return {Promise} - get response
|
|
56
|
+
*/
|
|
57
|
+
const gradeOverrideHistory = (subsectionId, userId) => (get(sectionOverrideHistoryUrl(subsectionId, userId)));
|
|
58
|
+
/*********************************************************************************
|
|
59
|
+
* POST Actions
|
|
60
|
+
*********************************************************************************/
|
|
61
|
+
/**
|
|
62
|
+
* updateGradebookData(updateData)
|
|
63
|
+
* sends an update message with new grades overrides
|
|
64
|
+
* @param {object[]} updateData
|
|
65
|
+
* {
|
|
66
|
+
* user_id: <int>,
|
|
67
|
+
* usage_id: <string>
|
|
68
|
+
* grade: {
|
|
69
|
+
* earned_all_override: <int>
|
|
70
|
+
* possible_all_override: <int>
|
|
71
|
+
* earned_graded_override: <int>
|
|
72
|
+
* possible_graded_override: <int>
|
|
73
|
+
* }
|
|
74
|
+
* }
|
|
75
|
+
* @return {Promise} - post response
|
|
76
|
+
*/
|
|
77
|
+
const updateGradebookData = (updateData) => post(urls.getBulkUpdateUrl(), updateData);
|
|
78
|
+
/**
|
|
79
|
+
* uploadGradeCsv(formData)
|
|
80
|
+
* Posts form data to grade csv url. On success, forwards response data.
|
|
81
|
+
* Reject promise with result on failure.
|
|
82
|
+
* @param {object} formData - new grade data
|
|
83
|
+
* @return {Promise} - post response
|
|
84
|
+
*/
|
|
85
|
+
const uploadGradeCsv = (formData) => (post(gradeCsvUrl(), formData).then((result) => {
|
|
86
|
+
if (result.status === 200 && !result.data.error_messages.length) {
|
|
87
|
+
return result.data;
|
|
88
|
+
}
|
|
89
|
+
return Promise.reject(result);
|
|
90
|
+
}));
|
|
91
|
+
export default StrictDict({
|
|
92
|
+
fetch: StrictDict({
|
|
93
|
+
assignmentTypes,
|
|
94
|
+
cohorts,
|
|
95
|
+
gradebookData,
|
|
96
|
+
gradeBulkOperationHistory,
|
|
97
|
+
gradeOverrideHistory,
|
|
98
|
+
roles,
|
|
99
|
+
tracks,
|
|
100
|
+
}),
|
|
101
|
+
updateGradebookData,
|
|
102
|
+
uploadGradeCsv,
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
export const pageSize = 25;
|
|
3
|
+
export const historyRecordLimit = 5;
|
|
4
|
+
export const paramKeys = StrictDict({
|
|
5
|
+
cohortId: 'cohort_id',
|
|
6
|
+
pageSize: 'page_size',
|
|
7
|
+
userContains: 'user_contains',
|
|
8
|
+
enrollmentMode: 'enrollment_mode',
|
|
9
|
+
assignment: 'assignment',
|
|
10
|
+
assignmentGradeMin: 'assignment_grade_min',
|
|
11
|
+
assignmentGradeMax: 'assignment_grade_max',
|
|
12
|
+
courseGradeMin: 'course_grade_min',
|
|
13
|
+
courseGradeMax: 'course_grade_max',
|
|
14
|
+
excludedCourseRoles: 'excluded_course_roles',
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/data/services/lms/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,sBAAsB;IAC1C,kBAAkB,EAAE,sBAAsB;IAC1C,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,mBAAmB,EAAE,uBAAuB;CAC7C,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport const pageSize = 25;\nexport const historyRecordLimit = 5;\n\nexport const paramKeys = StrictDict({\n cohortId: 'cohort_id',\n pageSize: 'page_size',\n userContains: 'user_contains',\n enrollmentMode: 'enrollment_mode',\n assignment: 'assignment',\n assignmentGradeMin: 'assignment_grade_min',\n assignmentGradeMax: 'assignment_grade_max',\n courseGradeMin: 'course_grade_min',\n courseGradeMax: 'course_grade_max',\n excludedCourseRoles: 'excluded_course_roles',\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/services/lms/index.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,eAAe,UAAU,CAAC;IACxB,GAAG;IACH,IAAI;CACL,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\nimport api from './api';\nimport urls from './urls';\n\nexport default StrictDict({\n api,\n urls,\n});\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
export default StrictDict({
|
|
3
|
+
errors: {
|
|
4
|
+
missingAssignment: ('Gradebook LMS API requires assignment to be set to filter by min/max assig. grade'),
|
|
5
|
+
unhandledResponse: 'unhandled response error',
|
|
6
|
+
},
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/data/services/lms/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,eAAe,UAAU,CAAC;IACxB,MAAM,EAAE;QACN,iBAAiB,EAAE,CACjB,mFAAmF,CACpF;QACD,iBAAiB,EAAE,0BAA0B;KAC9C;CACF,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport default StrictDict({\n errors: {\n missingAssignment: (\n 'Gradebook LMS API requires assignment to be set to filter by min/max assig. grade'\n ),\n unhandledResponse: 'unhandled response error',\n },\n});\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function getUrlPrefix(): string;
|
|
2
|
+
export function getBulkGradesUrl(): string;
|
|
3
|
+
export function getEnrollmentUrl(): string;
|
|
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;
|
|
16
|
+
export function sectionOverrideHistoryUrl(subsectionId: any, userId: any): string;
|
|
17
|
+
export function instructorDashboardUrl(): string;
|
|
18
|
+
declare const _default: any;
|
|
19
|
+
export default _default;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
import { historyRecordLimit } from './constants';
|
|
3
|
+
import { filterQuery, stringifyUrl } from './utils';
|
|
4
|
+
import { getSiteConfig } from '@openedx/frontend-base';
|
|
5
|
+
const courseId = window.location.pathname.split('/').filter(Boolean).pop() || '';
|
|
6
|
+
export const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;
|
|
7
|
+
export const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;
|
|
8
|
+
export const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;
|
|
9
|
+
export const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;
|
|
10
|
+
export const getGradebookUrl = () => `${getGradesUrl()}gradebook/${courseId}/`;
|
|
11
|
+
export const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;
|
|
12
|
+
export const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;
|
|
13
|
+
export const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;
|
|
14
|
+
export const getTracksUrl = () => `${getEnrollmentUrl()}course/${courseId}?include_expired=1`;
|
|
15
|
+
export const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;
|
|
16
|
+
export const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });
|
|
17
|
+
export const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });
|
|
18
|
+
/**
|
|
19
|
+
* bulkGradesUrlByCourseAndRow(courseId, rowId)
|
|
20
|
+
* returns the bulkGrades url with the given rowId.
|
|
21
|
+
* @param {string} rowId - row/error identifier
|
|
22
|
+
* @return {string} - bulk grades fetch url
|
|
23
|
+
*/
|
|
24
|
+
export const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });
|
|
25
|
+
export const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));
|
|
26
|
+
export const interventionExportCsvUrl = (options = {}) => (stringifyUrl(getInterventionUrl(), filterQuery(options)));
|
|
27
|
+
export const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(`${getGradesUrl()}subsection/${subsectionId}/`, { user_id: userId, history_record_limit: historyRecordLimit });
|
|
28
|
+
export const instructorDashboardUrl = () => (`${getSiteConfig().lmsBaseUrl}/courses/${courseId}/instructor`);
|
|
29
|
+
export default StrictDict({
|
|
30
|
+
getUrlPrefix,
|
|
31
|
+
getBulkGradesUrl,
|
|
32
|
+
getEnrollmentUrl,
|
|
33
|
+
getGradesUrl,
|
|
34
|
+
getGradebookUrl,
|
|
35
|
+
getBulkUpdateUrl,
|
|
36
|
+
getInterventionUrl,
|
|
37
|
+
getCohortsUrl,
|
|
38
|
+
getTracksUrl,
|
|
39
|
+
getBulkHistoryUrl,
|
|
40
|
+
getAssignmentTypesUrl,
|
|
41
|
+
getRolesUrl,
|
|
42
|
+
bulkGradesUrlByRow,
|
|
43
|
+
gradeCsvUrl,
|
|
44
|
+
interventionExportCsvUrl,
|
|
45
|
+
sectionOverrideHistoryUrl,
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +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\nconst courseId = window.location.pathname.split('/').filter(Boolean).pop() || '';\n\nexport const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;\nexport const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;\nexport const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;\nexport const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;\nexport const getGradebookUrl = () => `${getGradesUrl()}gradebook/${courseId}/`;\nexport const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;\nexport const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;\nexport const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;\nexport const getTracksUrl = () => `${getEnrollmentUrl()}course/${courseId}?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 });\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/${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"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import queryString from 'query-string';
|
|
2
|
+
import { getAuthenticatedHttpClient } from '@openedx/frontend-base';
|
|
3
|
+
import { filters } from '../../constants/filters';
|
|
4
|
+
/**
|
|
5
|
+
* get(url)
|
|
6
|
+
* simple wrapper providing an authenticated Http client get action
|
|
7
|
+
* @param {string} url - target url
|
|
8
|
+
*/
|
|
9
|
+
export const get = (...args) => getAuthenticatedHttpClient().get(...args);
|
|
10
|
+
/**
|
|
11
|
+
* post(url, data)
|
|
12
|
+
* simple wrapper providing an authenticated Http client post action
|
|
13
|
+
* @param {string} url - target url
|
|
14
|
+
* @param {object|string} data - post payload
|
|
15
|
+
*/
|
|
16
|
+
export const post = (...args) => getAuthenticatedHttpClient().post(...args);
|
|
17
|
+
/**
|
|
18
|
+
* stringifyUrl(url, query)
|
|
19
|
+
* simple wrapper around queryString.stringifyUrl that sets skip behavior
|
|
20
|
+
* @param {string} url - base url string
|
|
21
|
+
* @param {object} query - query parameters
|
|
22
|
+
*/
|
|
23
|
+
export const stringifyUrl = (url, query) => queryString.stringifyUrl({ url, query }, { skipNull: true, skipEmptyString: true });
|
|
24
|
+
/**
|
|
25
|
+
* filterQuery(options)
|
|
26
|
+
* Takes current filter object and returns it with only valid filters that are
|
|
27
|
+
* set and have non-'All' values
|
|
28
|
+
* @param {object} options - filter values
|
|
29
|
+
* @return {object} - valid filters that are set and do not equal 'All'
|
|
30
|
+
*/
|
|
31
|
+
export const filterQuery = (options) => Object.values(filters)
|
|
32
|
+
.filter(filter => options[filter] && options[filter] !== 'All')
|
|
33
|
+
.reduce((obj, filter) => (Object.assign(Object.assign({}, obj), { [filter]: options[filter] })), {});
|
|
34
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/data/services/lms/utils.js"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAClE,EAAE,GAAG,EAAE,KAAK,EAAE,EACd,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;KAC3D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;KAC9D,MAAM,CACL,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,iCAAM,GAAG,KAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAG,EACxD,EAAE,CACH,CAAC","sourcesContent":["import queryString from 'query-string';\nimport { getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { filters } from '@src/data/constants/filters';\n\n/**\n * get(url)\n * simple wrapper providing an authenticated Http client get action\n * @param {string} url - target url\n */\nexport const get = (...args) => getAuthenticatedHttpClient().get(...args);\n/**\n * post(url, data)\n * simple wrapper providing an authenticated Http client post action\n * @param {string} url - target url\n * @param {object|string} data - post payload\n */\nexport const post = (...args) => getAuthenticatedHttpClient().post(...args);\n\n/**\n * stringifyUrl(url, query)\n * simple wrapper around queryString.stringifyUrl that sets skip behavior\n * @param {string} url - base url string\n * @param {object} query - query parameters\n */\nexport const stringifyUrl = (url, query) => queryString.stringifyUrl(\n { url, query },\n { skipNull: true, skipEmptyString: true },\n);\n\n/**\n * filterQuery(options)\n * Takes current filter object and returns it with only valid filters that are\n * set and have non-'All' values\n * @param {object} options - filter values\n * @return {object} - valid filters that are set and do not equal 'All'\n */\nexport const filterQuery = (options) => Object.values(filters)\n .filter(filter => options[filter] && options[filter] !== 'All')\n .reduce(\n (obj, filter) => ({ ...obj, [filter]: options[filter] }),\n {},\n );\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
export const courseId = window.location.pathname.slice(1);
|
|
3
|
+
export const events = StrictDict({
|
|
4
|
+
receivedRoles: 'receivedRoles',
|
|
5
|
+
receivedGrades: 'receivedGrades',
|
|
6
|
+
updateSucceeded: 'updateSucceeded',
|
|
7
|
+
updateFailed: 'updateFailed',
|
|
8
|
+
uploadOverrideSucceeded: 'uploadOverrideSucceeded',
|
|
9
|
+
uploadOverrideFailed: 'uploadOverrideFailed',
|
|
10
|
+
filterApplied: 'filterApplied',
|
|
11
|
+
gradesReportDownloaded: 'gradesReportDownloaded',
|
|
12
|
+
interventionReportDownloaded: 'interventionReportDownloaded',
|
|
13
|
+
});
|
|
14
|
+
export const eventNames = StrictDict({
|
|
15
|
+
[events.receivedGrades]: 'edx.gradebook.grades.displayed',
|
|
16
|
+
[events.updateSucceeded]: 'edx.gradebook.grades.grade_override.succeeded',
|
|
17
|
+
[events.updateFailed]: 'edx.gradebook.grades.grade_override.failed',
|
|
18
|
+
[events.uploadOverrideSucceeded]: 'edx.gradebook.grades.upload.grades_overrides.succeeded',
|
|
19
|
+
[events.uploadOverrideFailed]: 'edx.gradebook.grades.upload.grades_overrides.failed',
|
|
20
|
+
[events.filterApplied]: 'edx.gradebook.grades.filter_applied',
|
|
21
|
+
[events.gradesReportDownloaded]: 'edx.gradebook.reports.grade_export.downloaded',
|
|
22
|
+
[events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',
|
|
23
|
+
});
|
|
24
|
+
export const trackingCategory = 'gradebook';
|
|
25
|
+
export const pageViewEvent = { category: trackingCategory, page: courseId };
|
|
26
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function trackGradesDisplayed({ assignmentType, cohort, track, prev, next, }: {
|
|
2
|
+
assignmentType: any;
|
|
3
|
+
cohort: any;
|
|
4
|
+
track: any;
|
|
5
|
+
prev: any;
|
|
6
|
+
next: any;
|
|
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;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { sendTrackEvent } from '@openedx/frontend-base';
|
|
2
|
+
import { courseId, events, eventNames, trackingCategory, } from './constants';
|
|
3
|
+
/**
|
|
4
|
+
* Segment analytics, emitted directly via `@openedx/frontend-base`
|
|
5
|
+
* (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped
|
|
6
|
+
* Redux actions to Segment events. Event names + base properties (category + the
|
|
7
|
+
* `courseId` label) mirror the old `redux-beacon` mapping exactly.
|
|
8
|
+
*/
|
|
9
|
+
const baseProperties = () => ({ category: trackingCategory, label: courseId });
|
|
10
|
+
/**
|
|
11
|
+
* Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,
|
|
12
|
+
* which fired per fetch with the filters it ran under and the page cursors.
|
|
13
|
+
*/
|
|
14
|
+
export const trackGradesDisplayed = ({ assignmentType, cohort, track, prev, next, }) => sendTrackEvent(eventNames[events.receivedGrades], Object.assign(Object.assign({}, baseProperties()), { assignmentType, cohort, track, prev, next }));
|
|
15
|
+
/** Grade override saved from the edit modal succeeded. */
|
|
16
|
+
export const trackGradeOverrideSucceeded = (updatedGrades) => sendTrackEvent(eventNames[events.updateSucceeded], Object.assign(Object.assign({}, baseProperties()), { updatedGrades }));
|
|
17
|
+
/** Grade override save failed. */
|
|
18
|
+
export const trackGradeOverrideFailed = (error) => sendTrackEvent(eventNames[events.updateFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
|
|
19
|
+
/** Bulk grade CSV override upload succeeded. */
|
|
20
|
+
export const trackUploadOverrideSucceeded = () => sendTrackEvent(eventNames[events.uploadOverrideSucceeded], baseProperties());
|
|
21
|
+
/** Bulk grade CSV override upload failed. */
|
|
22
|
+
export const trackUploadOverrideFailed = (error) => sendTrackEvent(eventNames[events.uploadOverrideFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
|
|
23
|
+
/**
|
|
24
|
+
* A filter was applied. Mirrors the legacy mapping, which fired this only from the
|
|
25
|
+
* course-grade-limit apply action.
|
|
26
|
+
*/
|
|
27
|
+
export const trackFilterApplied = () => sendTrackEvent(eventNames[events.filterApplied], baseProperties());
|
|
28
|
+
/** Grades CSV export was downloaded. */
|
|
29
|
+
export const trackGradesReportDownloaded = () => sendTrackEvent(eventNames[events.gradesReportDownloaded], baseProperties());
|
|
30
|
+
/** Intervention report was downloaded. */
|
|
31
|
+
export const trackInterventionReportDownloaded = () => sendTrackEvent(eventNames[events.interventionReportDownloaded], baseProperties());
|
|
32
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default simpleSelectorFactory;
|
|
2
|
+
/**
|
|
3
|
+
* Simple selector factory.
|
|
4
|
+
* Takes a list of string keys, and returns a simple slector for each.
|
|
5
|
+
*
|
|
6
|
+
* @function
|
|
7
|
+
* @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.
|
|
8
|
+
* @return {Object} - object of `{[key]: ({key}) => key}`
|
|
9
|
+
*/
|
|
10
|
+
declare function simpleSelectorFactory(transformer: any, keys: any | string[]): any;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple selector factory.
|
|
3
|
+
* Takes a list of string keys, and returns a simple slector for each.
|
|
4
|
+
*
|
|
5
|
+
* @function
|
|
6
|
+
* @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.
|
|
7
|
+
* @return {Object} - object of `{[key]: ({key}) => key}`
|
|
8
|
+
*/
|
|
9
|
+
const simpleSelectorFactory = (transformer, keys) => {
|
|
10
|
+
const selKeys = Array.isArray(keys) ? keys : Object.keys(keys);
|
|
11
|
+
return selKeys.reduce((obj, key) => (Object.assign(Object.assign({}, obj), { [key]: (state) => transformer(state)[key] })), { root: (state) => transformer(state) });
|
|
12
|
+
};
|
|
13
|
+
export default simpleSelectorFactory;
|
|
14
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/data/utils.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,iCACT,GAAG,KAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IACjD,EACF,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["/**\n * Simple selector factory.\n * Takes a list of string keys, and returns a simple slector for each.\n *\n * @function\n * @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.\n * @return {Object} - object of `{[key]: ({key}) => key}`\n */\nconst simpleSelectorFactory = (transformer, keys) => {\n const selKeys = Array.isArray(keys) ? keys : Object.keys(keys);\n return selKeys.reduce(\n (obj, key) => ({\n ...obj, [key]: (state) => transformer(state)[key],\n }),\n { root: (state) => transformer(state) },\n );\n};\n\nexport default simpleSelectorFactory;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './messages';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { default } from './messages';\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getLocale, isRtl } from '@openedx/frontend-base';
|
|
2
|
+
export const getLocalizedSlash = () => {
|
|
3
|
+
// For fractional grades
|
|
4
|
+
// if we are in a LTR language, we want to use a forward slash.
|
|
5
|
+
// If we are in a RTL language, we want to use a backslash instead
|
|
6
|
+
if (isRtl(getLocale())) {
|
|
7
|
+
return '\\';
|
|
8
|
+
}
|
|
9
|
+
return '/';
|
|
10
|
+
};
|
|
11
|
+
export const getLocalizedPercentSign = () => {
|
|
12
|
+
// LTR languages put the percent to the right of a number.
|
|
13
|
+
// RTL languages put the percent sign to the left of the number.
|
|
14
|
+
// We can place a non-printing unicode right-to-left marker next to the percent
|
|
15
|
+
// sign to make it print to the left of the number if we are currently in a LTR language
|
|
16
|
+
if (isRtl(getLocale())) {
|
|
17
|
+
return '\u200f%';
|
|
18
|
+
}
|
|
19
|
+
return '%';
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/i18n/utils.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,wBAAwB;IACxB,+DAA+D;IAC/D,kEAAkE;IAClE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,0DAA0D;IAC1D,gEAAgE;IAChE,+EAA+E;IAC/E,wFAAwF;IACxF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC","sourcesContent":["import { getLocale, isRtl } from '@openedx/frontend-base';\n\nexport const getLocalizedSlash = () => {\n // For fractional grades\n // if we are in a LTR language, we want to use a forward slash.\n // If we are in a RTL language, we want to use a backslash instead\n if (isRtl(getLocale())) {\n return '\\\\';\n }\n return '/';\n};\n\nexport const getLocalizedPercentSign = () => {\n // LTR languages put the percent to the right of a number.\n // RTL languages put the percent sign to the left of the number.\n // We can place a non-printing unicode right-to-left marker next to the percent\n // sign to make it print to the left of the number if we are currently in a LTR language\n if (isRtl(getLocale())) {\n return '\\u200f%';\n }\n return '%';\n};\n"]}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +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;AACtD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { default as gradebookApp } from './app';\nexport { default as gradebookRoutes } from './routes';\nexport { default as gradebookMessages } from './i18n';\n"]}
|