@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,96 @@
|
|
|
1
|
+
import type { FiltersSnapshot } from '../../../data/filtersSnapshot';
|
|
2
|
+
export declare const minGrade = "0";
|
|
3
|
+
export declare const maxGrade = "100";
|
|
4
|
+
/** A percent grade, or null when equal to the max. */
|
|
5
|
+
export declare const formatMaxCourseGrade: (percentGrade: string) => string | null;
|
|
6
|
+
/** A percent grade, or null when equal to the min. */
|
|
7
|
+
export declare const formatMinCourseGrade: (percentGrade: string) => string | null;
|
|
8
|
+
/** Same as `formatMaxCourseGrade` but also null when no assignment is selected. */
|
|
9
|
+
export declare const formatMaxAssignmentGrade: (percentGrade: string, options: {
|
|
10
|
+
assignmentId?: string | undefined;
|
|
11
|
+
}) => string | null;
|
|
12
|
+
/** Same as `formatMinCourseGrade` but also null when no assignment is selected. */
|
|
13
|
+
export declare const formatMinAssignmentGrade: (percentGrade: string, options: {
|
|
14
|
+
assignmentId?: string | undefined;
|
|
15
|
+
}) => string | null;
|
|
16
|
+
/** Round a number to two decimal places (defaults to 0). */
|
|
17
|
+
export declare const roundGrade: (val: number | undefined | null) => number;
|
|
18
|
+
/**
|
|
19
|
+
* subsectionGrade[format](subsection)
|
|
20
|
+
* Formats one subsection cell for the gradebook table.
|
|
21
|
+
* - `absolute`: rounded `earned/possible` if attempted, else `earned`.
|
|
22
|
+
* - `percent`: rounded `percent * 100`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const subsectionGrade: Record<string, (subsection: any) => string | number>;
|
|
25
|
+
/** One raw entry from the grade-override history endpoint. */
|
|
26
|
+
export interface RawGradeOverrideHistoryItem {
|
|
27
|
+
history_date: string;
|
|
28
|
+
history_user: string;
|
|
29
|
+
override_reason: string;
|
|
30
|
+
earned_graded_override: unknown;
|
|
31
|
+
}
|
|
32
|
+
/** Display-shaped grade-override history entry. */
|
|
33
|
+
export interface DisplayGradeOverrideHistoryItem {
|
|
34
|
+
date: string;
|
|
35
|
+
grader: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
adjustedGrade: unknown;
|
|
38
|
+
}
|
|
39
|
+
/** Map the raw override-history entries into what the edit modal renders. */
|
|
40
|
+
export declare const formatGradeOverrideForDisplay: (historyArray: RawGradeOverrideHistoryItem[]) => DisplayGradeOverrideHistoryItem[];
|
|
41
|
+
/** A section-breakdown entry inside a grade row. */
|
|
42
|
+
export interface SectionBreakdownEntry {
|
|
43
|
+
label?: string;
|
|
44
|
+
category?: string;
|
|
45
|
+
subsection_name?: string;
|
|
46
|
+
module_id?: string;
|
|
47
|
+
[key: string]: unknown;
|
|
48
|
+
}
|
|
49
|
+
/** Relevant assignment info the filter dropdown consumes. */
|
|
50
|
+
export interface AssignmentSummary {
|
|
51
|
+
label: string;
|
|
52
|
+
subsectionLabel: string;
|
|
53
|
+
type: string;
|
|
54
|
+
id: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* headingMapper(category, label)
|
|
58
|
+
* Returns a function that, given a section breakdown, returns the table headers
|
|
59
|
+
* for the current assignment-type + assignment-label filters.
|
|
60
|
+
*/
|
|
61
|
+
export declare const headingMapper: (category: string, label?: string) => (entry: SectionBreakdownEntry[] | null | undefined) => (string | undefined)[];
|
|
62
|
+
/** Section-breakdown of the first grades result (empty if none). */
|
|
63
|
+
export declare const getAssignmentsFromResultsSubstate: (results: {
|
|
64
|
+
section_breakdown?: SectionBreakdownEntry[];
|
|
65
|
+
}[]) => SectionBreakdownEntry[];
|
|
66
|
+
/** Reshape one section-breakdown entry into filter-friendly fields. */
|
|
67
|
+
export declare const chooseRelevantAssignmentData: ({ label, subsection_name: subsectionLabel, category: type, module_id: id, }: SectionBreakdownEntry) => AssignmentSummary;
|
|
68
|
+
/** Look up the relevant assignment data by id inside a grades results array. */
|
|
69
|
+
export declare const relevantAssignmentDataFromResults: (results: {
|
|
70
|
+
section_breakdown?: SectionBreakdownEntry[];
|
|
71
|
+
}[], id: string) => AssignmentSummary | undefined;
|
|
72
|
+
/** Whether a filter value equals the initial (default) value for that filter. */
|
|
73
|
+
export declare const isDefault: (name: string, value: unknown) => boolean;
|
|
74
|
+
/** Params object the `getGrades` API call consumes. */
|
|
75
|
+
export interface GradesFetchParams {
|
|
76
|
+
searchText: string | null;
|
|
77
|
+
cohort: string;
|
|
78
|
+
track: string;
|
|
79
|
+
options: {
|
|
80
|
+
assignment: string | undefined;
|
|
81
|
+
includeCourseRoleMembers: boolean;
|
|
82
|
+
assignmentGradeMax: string | null;
|
|
83
|
+
assignmentGradeMin: string | null;
|
|
84
|
+
courseGradeMax: string | null;
|
|
85
|
+
courseGradeMin: string | null;
|
|
86
|
+
searchText?: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* buildGradesFetchParams(snapshot)
|
|
91
|
+
* Build the `getGrades` params from a filters snapshot. Mirrors the legacy
|
|
92
|
+
* `selectors.root.localFilters` shape: assignment grade limits collapse to
|
|
93
|
+
* `null` when no assignment is selected or the value equals the min/max
|
|
94
|
+
* boundary; the course grade limits collapse to `null` at the boundaries.
|
|
95
|
+
*/
|
|
96
|
+
export declare const buildGradesFetchParams: (snapshot: FiltersSnapshot) => GradesFetchParams;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { StrictDict } from '../../../utils';
|
|
2
|
+
import { Headings, GradeFormats } from '../../../data/constants/grades';
|
|
3
|
+
import initialFilters from '../../../data/constants/filters';
|
|
4
|
+
import { formatDateForDisplay } from '../../../data/formatUtils';
|
|
5
|
+
import { getLocalizedSlash } from '../../../i18n/utils';
|
|
6
|
+
/* ------------------------------------------------------------------ *
|
|
7
|
+
* Grade formatting
|
|
8
|
+
* ------------------------------------------------------------------ */
|
|
9
|
+
export const minGrade = '0';
|
|
10
|
+
export const maxGrade = '100';
|
|
11
|
+
/** A percent grade, or null when equal to the max. */
|
|
12
|
+
export const formatMaxCourseGrade = (percentGrade) => (percentGrade === maxGrade ? null : percentGrade);
|
|
13
|
+
/** A percent grade, or null when equal to the min. */
|
|
14
|
+
export const formatMinCourseGrade = (percentGrade) => (percentGrade === minGrade ? null : percentGrade);
|
|
15
|
+
/** Same as `formatMaxCourseGrade` but also null when no assignment is selected. */
|
|
16
|
+
export const formatMaxAssignmentGrade = (percentGrade, options) => ((percentGrade === maxGrade || !options.assignmentId) ? null : percentGrade);
|
|
17
|
+
/** Same as `formatMinCourseGrade` but also null when no assignment is selected. */
|
|
18
|
+
export const formatMinAssignmentGrade = (percentGrade, options) => ((percentGrade === minGrade || !options.assignmentId) ? null : percentGrade);
|
|
19
|
+
/** Round a number to two decimal places (defaults to 0). */
|
|
20
|
+
export const roundGrade = (val) => (parseFloat((val || 0).toFixed(2)));
|
|
21
|
+
/**
|
|
22
|
+
* subsectionGrade[format](subsection)
|
|
23
|
+
* Formats one subsection cell for the gradebook table.
|
|
24
|
+
* - `absolute`: rounded `earned/possible` if attempted, else `earned`.
|
|
25
|
+
* - `percent`: rounded `percent * 100`.
|
|
26
|
+
*/
|
|
27
|
+
export const subsectionGrade = StrictDict({
|
|
28
|
+
[GradeFormats.absolute]: (subsection) => {
|
|
29
|
+
const earned = roundGrade(subsection.score_earned);
|
|
30
|
+
const possible = roundGrade(subsection.score_possible);
|
|
31
|
+
return subsection.attempted ? `${earned}${getLocalizedSlash()}${possible}` : `${earned}`;
|
|
32
|
+
},
|
|
33
|
+
[GradeFormats.percent]: (subsection) => {
|
|
34
|
+
var _a;
|
|
35
|
+
return (roundGrade(((_a = subsection.percent) !== null && _a !== void 0 ? _a : 0) * 100));
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
/** Map the raw override-history entries into what the edit modal renders. */
|
|
39
|
+
export const formatGradeOverrideForDisplay = (historyArray) => historyArray.map(item => ({
|
|
40
|
+
date: formatDateForDisplay(new Date(item.history_date)),
|
|
41
|
+
grader: item.history_user,
|
|
42
|
+
reason: item.override_reason,
|
|
43
|
+
adjustedGrade: item.earned_graded_override,
|
|
44
|
+
}));
|
|
45
|
+
/**
|
|
46
|
+
* headingMapper(category, label)
|
|
47
|
+
* Returns a function that, given a section breakdown, returns the table headers
|
|
48
|
+
* for the current assignment-type + assignment-label filters.
|
|
49
|
+
*/
|
|
50
|
+
export const headingMapper = (category, label = 'All') => {
|
|
51
|
+
const filters = {
|
|
52
|
+
all: (section) => !!section.label,
|
|
53
|
+
byCategory: (section) => (!!section.label && section.category === category),
|
|
54
|
+
byLabel: (section) => (!!section.label && section.label === label),
|
|
55
|
+
};
|
|
56
|
+
let filter;
|
|
57
|
+
if (label === 'All') {
|
|
58
|
+
filter = category === 'All' ? filters.all : filters.byCategory;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
filter = filters.byLabel;
|
|
62
|
+
}
|
|
63
|
+
const { username, fullName, email, totalGrade, } = Headings;
|
|
64
|
+
const filteredLabels = (entry) => (entry.filter(filter).map(s => s.label));
|
|
65
|
+
return (entry) => (entry
|
|
66
|
+
? [username, fullName, email, ...filteredLabels(entry), totalGrade]
|
|
67
|
+
: []);
|
|
68
|
+
};
|
|
69
|
+
/** Section-breakdown of the first grades result (empty if none). */
|
|
70
|
+
export const getAssignmentsFromResultsSubstate = (results) => ((results[0] || {}).section_breakdown || []);
|
|
71
|
+
/** Reshape one section-breakdown entry into filter-friendly fields. */
|
|
72
|
+
export const chooseRelevantAssignmentData = ({ label, subsection_name: subsectionLabel, category: type, module_id: id, }) => ({
|
|
73
|
+
label: label,
|
|
74
|
+
subsectionLabel: subsectionLabel,
|
|
75
|
+
type: type,
|
|
76
|
+
id: id,
|
|
77
|
+
});
|
|
78
|
+
/** Look up the relevant assignment data by id inside a grades results array. */
|
|
79
|
+
export const relevantAssignmentDataFromResults = (results, id) => (getAssignmentsFromResultsSubstate(results)
|
|
80
|
+
.map(chooseRelevantAssignmentData)
|
|
81
|
+
.find(assignment => assignment.id === id));
|
|
82
|
+
/** Whether a filter value equals the initial (default) value for that filter. */
|
|
83
|
+
export const isDefault = (name, value) => (value === initialFilters[name]);
|
|
84
|
+
/**
|
|
85
|
+
* buildGradesFetchParams(snapshot)
|
|
86
|
+
* Build the `getGrades` params from a filters snapshot. Mirrors the legacy
|
|
87
|
+
* `selectors.root.localFilters` shape: assignment grade limits collapse to
|
|
88
|
+
* `null` when no assignment is selected or the value equals the min/max
|
|
89
|
+
* boundary; the course grade limits collapse to `null` at the boundaries.
|
|
90
|
+
*/
|
|
91
|
+
export const buildGradesFetchParams = (snapshot) => {
|
|
92
|
+
const { assignment, assignmentGradeMin, assignmentGradeMax, courseGradeMin, courseGradeMax, cohort, track, includeCourseRoleMembers, searchValue, } = snapshot;
|
|
93
|
+
const assignmentId = assignment || undefined;
|
|
94
|
+
const opts = { assignmentId };
|
|
95
|
+
const options = Object.assign({ assignment: assignmentId, includeCourseRoleMembers, assignmentGradeMax: formatMaxAssignmentGrade(assignmentGradeMax, opts), assignmentGradeMin: formatMinAssignmentGrade(assignmentGradeMin, opts), courseGradeMax: formatMaxCourseGrade(courseGradeMax), courseGradeMin: formatMinCourseGrade(courseGradeMin) }, (searchValue !== '' && { searchText: searchValue }));
|
|
96
|
+
return {
|
|
97
|
+
searchText: options.searchText || null,
|
|
98
|
+
cohort,
|
|
99
|
+
track,
|
|
100
|
+
options,
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/components/GradesView/data/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;wEAEwE;AAExE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAoB,EAAiB,EAAE,CAAC,CAC3E,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAChD,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAoB,EAAiB,EAAE,CAAC,CAC3E,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAChD,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAAoB,EACpB,OAA8C,EAC/B,EAAE,CAAC,CAClB,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAC3E,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAAoB,EACpB,OAA8C,EAC/B,EAAE,CAAC,CAClB,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAC3E,CAAC;AAEF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAA8B,EAAU,EAAE,CAAC,CACpE,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,UAIzB,EAAU,EAAE;QACX,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACvD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,iBAAiB,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;IAC3F,CAAC;IACD,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,UAAgC,EAAU,EAAE;;QAAC,OAAA,CACpE,UAAU,CAAC,CAAC,MAAA,UAAU,CAAC,OAAO,mCAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAC5C,CAAA;KAAA;CACF,CAAyD,CAAC;AAsB3D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,YAA2C,EACR,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,IAAI,EAAE,oBAAoB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,EAAE,IAAI,CAAC,YAAY;IACzB,MAAM,EAAE,IAAI,CAAC,eAAe;IAC5B,aAAa,EAAE,IAAI,CAAC,sBAAsB;CAC3C,CAAC,CAAC,CAAC;AAuBJ;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAgB,EAChB,KAAK,GAAG,KAAK,EACb,EAAE;IACF,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,CAAC,OAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;QACxD,UAAU,EAAE,CAAC,OAA8B,EAAE,EAAE,CAAC,CAC9C,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACjD;QACD,OAAO,EAAE,CAAC,OAA8B,EAAE,EAAE,CAAC,CAC3C,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAC3C;KACF,CAAC;IAEF,IAAI,MAAmD,CAAC;IACxD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IACD,MAAM,EACJ,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GACtC,GAAG,QAAQ,CAAC;IACb,MAAM,cAAc,GAAG,CAAC,KAA8B,EAAE,EAAE,CAAC,CACzD,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACvC,CAAC;IAEF,OAAO,CAAC,KAAiD,EAA0B,EAAE,CAAC,CACpF,KAAK;QACH,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;QACnE,CAAC,CAAC,EAAE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,OAA0D,EACjC,EAAE,CAAC,CAC5B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAC3C,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,KAAK,EACL,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,EAAE,GACS,EAAqB,EAAE,CAAC,CAAC;IAC/C,KAAK,EAAE,KAAe;IACtB,eAAe,EAAE,eAAyB;IAC1C,IAAI,EAAE,IAAc;IACpB,EAAE,EAAE,EAAY;CACjB,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,OAA0D,EAC1D,EAAU,EACqB,EAAE,CAAC,CAClC,iCAAiC,CAAC,OAAO,CAAC;KACvC,GAAG,CAAC,4BAA4B,CAAC;KACjC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAC5C,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAc,EAAW,EAAE,CAAC,CAClE,KAAK,KAAM,cAA0C,CAAC,IAAI,CAAC,CAC5D,CAAC;AAsBF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAyB,EACN,EAAE;IACrB,MAAM,EACJ,UAAU,EACV,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,KAAK,EACb,wBAAwB,EACxB,WAAW,GACZ,GAAG,QAAQ,CAAC;IACb,MAAM,YAAY,GAAG,UAAU,IAAI,SAAS,CAAC;IAC7C,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,OAAO,mBACX,UAAU,EAAE,YAAY,EACxB,wBAAwB,EACxB,kBAAkB,EAAE,wBAAwB,CAAC,kBAAkB,EAAE,IAAI,CAAC,EACtE,kBAAkB,EAAE,wBAAwB,CAAC,kBAAkB,EAAE,IAAI,CAAC,EACtE,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC,EACpD,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC,IACjD,CAAC,WAAW,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CACvD,CAAC;IACF,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,MAAM;QACN,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nimport { Headings, GradeFormats } from '@src/data/constants/grades';\nimport initialFilters from '@src/data/constants/filters';\nimport { formatDateForDisplay } from '@src/data/formatUtils';\nimport { getLocalizedSlash } from '@src/i18n/utils';\nimport type { FiltersSnapshot } from '@src/data/filtersSnapshot';\n\n/* ------------------------------------------------------------------ *\n * Grade formatting\n * ------------------------------------------------------------------ */\n\nexport const minGrade = '0';\nexport const maxGrade = '100';\n\n/** A percent grade, or null when equal to the max. */\nexport const formatMaxCourseGrade = (percentGrade: string): string | null => (\n percentGrade === maxGrade ? null : percentGrade\n);\n\n/** A percent grade, or null when equal to the min. */\nexport const formatMinCourseGrade = (percentGrade: string): string | null => (\n percentGrade === minGrade ? null : percentGrade\n);\n\n/** Same as `formatMaxCourseGrade` but also null when no assignment is selected. */\nexport const formatMaxAssignmentGrade = (\n percentGrade: string,\n options: { assignmentId?: string | undefined },\n): string | null => (\n (percentGrade === maxGrade || !options.assignmentId) ? null : percentGrade\n);\n\n/** Same as `formatMinCourseGrade` but also null when no assignment is selected. */\nexport const formatMinAssignmentGrade = (\n percentGrade: string,\n options: { assignmentId?: string | undefined },\n): string | null => (\n (percentGrade === minGrade || !options.assignmentId) ? null : percentGrade\n);\n\n/** Round a number to two decimal places (defaults to 0). */\nexport const roundGrade = (val: number | undefined | null): number => (\n parseFloat((val || 0).toFixed(2))\n);\n\n/**\n * subsectionGrade[format](subsection)\n * Formats one subsection cell for the gradebook table.\n * - `absolute`: rounded `earned/possible` if attempted, else `earned`.\n * - `percent`: rounded `percent * 100`.\n */\nexport const subsectionGrade = StrictDict({\n [GradeFormats.absolute]: (subsection: {\n score_earned?: number;\n score_possible?: number;\n attempted?: boolean;\n }): string => {\n const earned = roundGrade(subsection.score_earned);\n const possible = roundGrade(subsection.score_possible);\n return subsection.attempted ? `${earned}${getLocalizedSlash()}${possible}` : `${earned}`;\n },\n [GradeFormats.percent]: (subsection: { percent?: number }): number => (\n roundGrade((subsection.percent ?? 0) * 100)\n ),\n}) as Record<string, (subsection: any) => string | number>;\n\n/* ------------------------------------------------------------------ *\n * Grade override history (edit modal)\n * ------------------------------------------------------------------ */\n\n/** One raw entry from the grade-override history endpoint. */\nexport interface RawGradeOverrideHistoryItem {\n history_date: string;\n history_user: string;\n override_reason: string;\n earned_graded_override: unknown;\n}\n\n/** Display-shaped grade-override history entry. */\nexport interface DisplayGradeOverrideHistoryItem {\n date: string;\n grader: string;\n reason: string;\n adjustedGrade: unknown;\n}\n\n/** Map the raw override-history entries into what the edit modal renders. */\nexport const formatGradeOverrideForDisplay = (\n historyArray: RawGradeOverrideHistoryItem[],\n): DisplayGradeOverrideHistoryItem[] => historyArray.map(item => ({\n date: formatDateForDisplay(new Date(item.history_date)),\n grader: item.history_user,\n reason: item.override_reason,\n adjustedGrade: item.earned_graded_override,\n}));\n\n/* ------------------------------------------------------------------ *\n * Table headings + assignment filter derivations\n * ------------------------------------------------------------------ */\n\n/** A section-breakdown entry inside a grade row. */\nexport interface SectionBreakdownEntry {\n label?: string;\n category?: string;\n subsection_name?: string;\n module_id?: string;\n [key: string]: unknown;\n}\n\n/** Relevant assignment info the filter dropdown consumes. */\nexport interface AssignmentSummary {\n label: string;\n subsectionLabel: string;\n type: string;\n id: string;\n}\n\n/**\n * headingMapper(category, label)\n * Returns a function that, given a section breakdown, returns the table headers\n * for the current assignment-type + assignment-label filters.\n */\nexport const headingMapper = (\n category: string,\n label = 'All',\n) => {\n const filters = {\n all: (section: SectionBreakdownEntry) => !!section.label,\n byCategory: (section: SectionBreakdownEntry) => (\n !!section.label && section.category === category\n ),\n byLabel: (section: SectionBreakdownEntry) => (\n !!section.label && section.label === label\n ),\n };\n\n let filter: (section: SectionBreakdownEntry) => boolean;\n if (label === 'All') {\n filter = category === 'All' ? filters.all : filters.byCategory;\n } else {\n filter = filters.byLabel;\n }\n const {\n username, fullName, email, totalGrade,\n } = Headings;\n const filteredLabels = (entry: SectionBreakdownEntry[]) => (\n entry.filter(filter).map(s => s.label)\n );\n\n return (entry: SectionBreakdownEntry[] | null | undefined): (string | undefined)[] => (\n entry\n ? [username, fullName, email, ...filteredLabels(entry), totalGrade]\n : []\n );\n};\n\n/** Section-breakdown of the first grades result (empty if none). */\nexport const getAssignmentsFromResultsSubstate = (\n results: { section_breakdown?: SectionBreakdownEntry[] }[],\n): SectionBreakdownEntry[] => (\n (results[0] || {}).section_breakdown || []\n);\n\n/** Reshape one section-breakdown entry into filter-friendly fields. */\nexport const chooseRelevantAssignmentData = ({\n label,\n subsection_name: subsectionLabel,\n category: type,\n module_id: id,\n}: SectionBreakdownEntry): AssignmentSummary => ({\n label: label as string,\n subsectionLabel: subsectionLabel as string,\n type: type as string,\n id: id as string,\n});\n\n/** Look up the relevant assignment data by id inside a grades results array. */\nexport const relevantAssignmentDataFromResults = (\n results: { section_breakdown?: SectionBreakdownEntry[] }[],\n id: string,\n): AssignmentSummary | undefined => (\n getAssignmentsFromResultsSubstate(results)\n .map(chooseRelevantAssignmentData)\n .find(assignment => assignment.id === id)\n);\n\n/** Whether a filter value equals the initial (default) value for that filter. */\nexport const isDefault = (name: string, value: unknown): boolean => (\n value === (initialFilters as Record<string, unknown>)[name]\n);\n\n/* ------------------------------------------------------------------ *\n * Grades fetch params (built from the filters snapshot)\n * ------------------------------------------------------------------ */\n\n/** Params object the `getGrades` API call consumes. */\nexport interface GradesFetchParams {\n searchText: string | null;\n cohort: string;\n track: string;\n options: {\n assignment: string | undefined;\n includeCourseRoleMembers: boolean;\n assignmentGradeMax: string | null;\n assignmentGradeMin: string | null;\n courseGradeMax: string | null;\n courseGradeMin: string | null;\n searchText?: string;\n };\n}\n\n/**\n * buildGradesFetchParams(snapshot)\n * Build the `getGrades` params from a filters snapshot. Mirrors the legacy\n * `selectors.root.localFilters` shape: assignment grade limits collapse to\n * `null` when no assignment is selected or the value equals the min/max\n * boundary; the course grade limits collapse to `null` at the boundaries.\n */\nexport const buildGradesFetchParams = (\n snapshot: FiltersSnapshot,\n): GradesFetchParams => {\n const {\n assignment,\n assignmentGradeMin, assignmentGradeMax,\n courseGradeMin, courseGradeMax,\n cohort, track,\n includeCourseRoleMembers,\n searchValue,\n } = snapshot;\n const assignmentId = assignment || undefined;\n const opts = { assignmentId };\n const options = {\n assignment: assignmentId,\n includeCourseRoleMembers,\n assignmentGradeMax: formatMaxAssignmentGrade(assignmentGradeMax, opts),\n assignmentGradeMin: formatMinAssignmentGrade(assignmentGradeMin, opts),\n courseGradeMax: formatMaxCourseGrade(courseGradeMax),\n courseGradeMin: formatMinCourseGrade(courseGradeMin),\n ...(searchValue !== '' && { searchText: searchValue }),\n };\n return {\n searchText: options.searchText || null,\n cohort,\n track,\n options,\n };\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function GradesView({ updateQueryParams }: {
|
|
2
|
+
updateQueryParams: any;
|
|
3
|
+
}): import("react").JSX.Element;
|
|
4
|
+
export namespace GradesView {
|
|
5
|
+
namespace propTypes {
|
|
6
|
+
let updateQueryParams: PropTypes.Validator<(...args: any[]) => any>;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export default GradesView;
|
|
10
|
+
import PropTypes from 'prop-types';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { useIntl } from '@openedx/frontend-base';
|
|
4
|
+
import { useFilters } from '../../data/filtersContext';
|
|
5
|
+
import BulkManagementControls from './BulkManagementControls';
|
|
6
|
+
import EditModal from './EditModal';
|
|
7
|
+
import FilterBadges from './FilterBadges';
|
|
8
|
+
import FilteredUsersLabel from './FilteredUsersLabel';
|
|
9
|
+
import FilterMenuToggle from './FilterMenuToggle';
|
|
10
|
+
import GradebookTable from './GradebookTable';
|
|
11
|
+
import ImportSuccessToast from './ImportSuccessToast';
|
|
12
|
+
import InterventionsReport from './InterventionsReport';
|
|
13
|
+
import PageButtons from './PageButtons';
|
|
14
|
+
import ScoreViewInput from './ScoreViewInput';
|
|
15
|
+
import SearchControls from './SearchControls';
|
|
16
|
+
import SpinnerIcon from './SpinnerIcon';
|
|
17
|
+
import StatusAlerts from './StatusAlerts';
|
|
18
|
+
import { useRefetchGrades } from './data/hooks';
|
|
19
|
+
import messages from './messages';
|
|
20
|
+
export const GradesView = ({ updateQueryParams }) => {
|
|
21
|
+
const { formatMessage } = useIntl();
|
|
22
|
+
const { resetFilters: resetContextFilters } = useFilters();
|
|
23
|
+
const fetchGrades = useRefetchGrades();
|
|
24
|
+
const handleFilterBadgeClose = (filterNames) => () => {
|
|
25
|
+
resetContextFilters(filterNames);
|
|
26
|
+
updateQueryParams(filterNames.reduce((obj, filterName) => (Object.assign(Object.assign({}, obj), { [filterName]: false })), {}));
|
|
27
|
+
fetchGrades();
|
|
28
|
+
};
|
|
29
|
+
return (_jsxs(_Fragment, { children: [_jsx(SpinnerIcon, {}), _jsx(InterventionsReport, {}), _jsx("h3", { className: "step-message-1", children: formatMessage(messages.filterStepHeading) }), _jsxs("div", { className: "d-flex justify-content-between flex-wrap", children: [_jsx(FilterMenuToggle, {}), _jsx(SearchControls, {})] }), _jsx(FilterBadges, { handleClose: handleFilterBadgeClose }), _jsx(StatusAlerts, {}), _jsx("h3", { children: formatMessage(messages.gradebookStepHeading) }), _jsxs("div", { className: "d-flex justify-content-between align-items-center mb-2", children: [_jsx(ScoreViewInput, {}), _jsx(BulkManagementControls, {})] }), _jsx(FilteredUsersLabel, {}), _jsx(GradebookTable, {}), _jsx(PageButtons, {}), _jsxs("p", { children: ["* ", formatMessage(messages.mastersHint)] }), _jsx(EditModal, {}), _jsx(ImportSuccessToast, {})] }));
|
|
30
|
+
};
|
|
31
|
+
GradesView.propTypes = {
|
|
32
|
+
updateQueryParams: PropTypes.func.isRequired,
|
|
33
|
+
};
|
|
34
|
+
export default GradesView;
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/GradesView/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,UAAU,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;IAEvC,MAAM,sBAAsB,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,EAAE;QACnD,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACjC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,iCAAM,GAAG,KAAE,CAAC,UAAU,CAAC,EAAE,KAAK,IAAG,EACtD,EAAE,CACH,CAAC,CAAC;QACH,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,WAAW,KAAG,EAEf,KAAC,mBAAmB,KAAG,EACvB,aAAI,SAAS,EAAC,gBAAgB,YAC3B,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GACvC,EAEL,eAAK,SAAS,EAAC,0CAA0C,aACvD,KAAC,gBAAgB,KAAG,EACpB,KAAC,cAAc,KAAG,IACd,EAEN,KAAC,YAAY,IAAC,WAAW,EAAE,sBAAsB,GAAI,EACrD,KAAC,YAAY,KAAG,EAEhB,uBAAK,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAM,EAEvD,eAAK,SAAS,EAAC,wDAAwD,aACrE,KAAC,cAAc,KAAG,EAClB,KAAC,sBAAsB,KAAG,IACtB,EAEN,KAAC,kBAAkB,KAAG,EAEtB,KAAC,cAAc,KAAG,EAElB,KAAC,WAAW,KAAG,EACf,8BAAM,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAK,EAC9C,KAAC,SAAS,KAAG,EAEb,KAAC,kBAAkB,KAAG,IACrB,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,UAAU,CAAC,SAAS,GAAG;IACrB,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;CAC7C,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { useFilters } from '@src/data/filtersContext';\n\nimport BulkManagementControls from './BulkManagementControls';\nimport EditModal from './EditModal';\nimport FilterBadges from './FilterBadges';\nimport FilteredUsersLabel from './FilteredUsersLabel';\nimport FilterMenuToggle from './FilterMenuToggle';\nimport GradebookTable from './GradebookTable';\nimport ImportSuccessToast from './ImportSuccessToast';\nimport InterventionsReport from './InterventionsReport';\nimport PageButtons from './PageButtons';\nimport ScoreViewInput from './ScoreViewInput';\nimport SearchControls from './SearchControls';\nimport SpinnerIcon from './SpinnerIcon';\nimport StatusAlerts from './StatusAlerts';\n\nimport { useRefetchGrades } from './data/hooks';\nimport messages from './messages';\n\nexport const GradesView = ({ updateQueryParams }) => {\n const { formatMessage } = useIntl();\n const { resetFilters: resetContextFilters } = useFilters();\n const fetchGrades = useRefetchGrades();\n\n const handleFilterBadgeClose = (filterNames) => () => {\n resetContextFilters(filterNames);\n updateQueryParams(filterNames.reduce(\n (obj, filterName) => ({ ...obj, [filterName]: false }),\n {},\n ));\n fetchGrades();\n };\n\n return (\n <>\n <SpinnerIcon />\n\n <InterventionsReport />\n <h3 className=\"step-message-1\">\n {formatMessage(messages.filterStepHeading)}\n </h3>\n\n <div className=\"d-flex justify-content-between flex-wrap\">\n <FilterMenuToggle />\n <SearchControls />\n </div>\n\n <FilterBadges handleClose={handleFilterBadgeClose} />\n <StatusAlerts />\n\n <h3>{formatMessage(messages.gradebookStepHeading)}</h3>\n\n <div className=\"d-flex justify-content-between align-items-center mb-2\">\n <ScoreViewInput />\n <BulkManagementControls />\n </div>\n\n <FilteredUsersLabel />\n\n <GradebookTable />\n\n <PageButtons />\n <p>* {formatMessage(messages.mastersHint)}</p>\n <EditModal />\n\n <ImportSuccessToast />\n </>\n );\n};\n\nGradesView.propTypes = {\n updateQueryParams: PropTypes.func.isRequired,\n};\n\nexport default GradesView;\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export default messages;
|
|
2
|
+
declare namespace messages {
|
|
3
|
+
namespace filterStepHeading {
|
|
4
|
+
let id: string;
|
|
5
|
+
let defaultMessage: string;
|
|
6
|
+
let description: string;
|
|
7
|
+
}
|
|
8
|
+
namespace gradebookStepHeading {
|
|
9
|
+
let id_1: string;
|
|
10
|
+
export { id_1 as id };
|
|
11
|
+
let defaultMessage_1: string;
|
|
12
|
+
export { defaultMessage_1 as defaultMessage };
|
|
13
|
+
let description_1: string;
|
|
14
|
+
export { description_1 as description };
|
|
15
|
+
}
|
|
16
|
+
namespace mastersHint {
|
|
17
|
+
let id_2: string;
|
|
18
|
+
export { id_2 as id };
|
|
19
|
+
let defaultMessage_2: string;
|
|
20
|
+
export { defaultMessage_2 as defaultMessage };
|
|
21
|
+
let description_2: string;
|
|
22
|
+
export { description_2 as description };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { defineMessages } from '@openedx/frontend-base';
|
|
2
|
+
const messages = defineMessages({
|
|
3
|
+
filterStepHeading: {
|
|
4
|
+
id: 'gradebook.GradesView.filterHeading',
|
|
5
|
+
defaultMessage: 'Step 1: Filter the Grade Report',
|
|
6
|
+
description: 'Filter controls container heading string',
|
|
7
|
+
},
|
|
8
|
+
gradebookStepHeading: {
|
|
9
|
+
id: 'gradebook.GradesView.gradebookStepHeading',
|
|
10
|
+
defaultMessage: 'Step 2: View or Modify Individual Grades',
|
|
11
|
+
description: 'Alert text for invalid minimum course grade',
|
|
12
|
+
},
|
|
13
|
+
mastersHint: {
|
|
14
|
+
id: 'gradebook.GradesView.mastersHint',
|
|
15
|
+
defaultMessage: "available for learners in the Master's track only",
|
|
16
|
+
description: 'Masters feature availability hint on Grades Tab',
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
export default messages;
|
|
20
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/components/GradesView/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,cAAc,EAAE,iCAAiC;QACjD,WAAW,EAAE,0CAA0C;KACxD;IACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,2CAA2C;QAC/C,cAAc,EAAE,0CAA0C;QAC1D,WAAW,EAAE,6CAA6C;KAC3D;IACD,WAAW,EAAE;QACX,EAAE,EAAE,kCAAkC;QACtC,cAAc,EAAE,mDAAmD;QACnE,WAAW,EAAE,iDAAiD;KAC/D;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n filterStepHeading: {\n id: 'gradebook.GradesView.filterHeading',\n defaultMessage: 'Step 1: Filter the Grade Report',\n description: 'Filter controls container heading string',\n },\n gradebookStepHeading: {\n id: 'gradebook.GradesView.gradebookStepHeading',\n defaultMessage: 'Step 2: View or Modify Individual Grades',\n description: 'Alert text for invalid minimum course grade',\n },\n mastersHint: {\n id: 'gradebook.GradesView.mastersHint',\n defaultMessage: \"available for learners in the Master's track only\",\n description: 'Masters feature availability hint on Grades Tab',\n },\n});\n\nexport default messages;\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const buttonStates: any;
|
|
2
|
+
export function NetworkButton({ className, label, onClick, import: isImport, }: string): import("react").JSX.Element;
|
|
3
|
+
export namespace NetworkButton {
|
|
4
|
+
namespace defaultProps {
|
|
5
|
+
export let className: string;
|
|
6
|
+
let _import: boolean;
|
|
7
|
+
export { _import as import };
|
|
8
|
+
}
|
|
9
|
+
namespace propTypes {
|
|
10
|
+
let className_1: PropTypes.Requireable<string>;
|
|
11
|
+
export { className_1 as className };
|
|
12
|
+
export let label: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
|
|
13
|
+
id: PropTypes.Requireable<string>;
|
|
14
|
+
defaultMessage: PropTypes.Requireable<string>;
|
|
15
|
+
description: PropTypes.Requireable<string>;
|
|
16
|
+
}>>>;
|
|
17
|
+
export let onClick: PropTypes.Validator<(...args: any[]) => any>;
|
|
18
|
+
let _import_1: PropTypes.Requireable<boolean>;
|
|
19
|
+
export { _import_1 as import };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export default NetworkButton;
|
|
23
|
+
import PropTypes from 'prop-types';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import { StatefulButton, Icon } from '@openedx/paragon';
|
|
5
|
+
import { FormattedMessage } from '@openedx/frontend-base';
|
|
6
|
+
import { useShouldShowSpinner } from '../GradesView/data/hooks';
|
|
7
|
+
import { StrictDict } from '../../utils';
|
|
8
|
+
export const buttonStates = StrictDict({
|
|
9
|
+
pending: 'pending',
|
|
10
|
+
default: 'default',
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* <NetworkButton />
|
|
14
|
+
* Simplified Download/Upload button, tied to the app's network status (showSpinner).
|
|
15
|
+
* Provides a button with a default `download` icon along with a label, which should
|
|
16
|
+
* be a transifex-friendly message object. If the `import` argument is passed, the default
|
|
17
|
+
* icon will be an upload icon.
|
|
18
|
+
* If the app is busy on a network task (showSpinner === true), the button will be disabled
|
|
19
|
+
* and show a spinner/working indicator.
|
|
20
|
+
* The buttons can also be passed an optional className for further css customization.
|
|
21
|
+
* @param {string} className - optional extra css class(es)
|
|
22
|
+
* @param {object} label - transifex-friendly message object
|
|
23
|
+
* @param {func} onClick - button on-click action
|
|
24
|
+
* @param {bool} import - should show import icon instead of download icon in default state.
|
|
25
|
+
*/
|
|
26
|
+
export const NetworkButton = ({ className, label, onClick, import: isImport, }) => {
|
|
27
|
+
const showSpinner = useShouldShowSpinner();
|
|
28
|
+
const labelNode = _jsx(FormattedMessage, Object.assign({}, label));
|
|
29
|
+
const labels = { default: labelNode, pending: labelNode };
|
|
30
|
+
const iconClass = 'fa mr-2';
|
|
31
|
+
const defaultIcon = isImport ? 'fa-upload' : 'fa-download';
|
|
32
|
+
const icons = {
|
|
33
|
+
pending: (_jsx(Icon, { className: classNames(iconClass, 'fa-spinner fa-spin') })),
|
|
34
|
+
default: (_jsx(Icon, { className: classNames(iconClass, defaultIcon) })),
|
|
35
|
+
};
|
|
36
|
+
const buttonState = showSpinner ? buttonStates.pending : buttonStates.default;
|
|
37
|
+
return (_jsx(StatefulButton, { labels: labels, variant: "outline-primary", disabledStates: [buttonStates.pending], className: classNames('ml-2', className), icons: icons, state: buttonState, onClick: onClick }));
|
|
38
|
+
};
|
|
39
|
+
NetworkButton.defaultProps = {
|
|
40
|
+
className: '',
|
|
41
|
+
import: false,
|
|
42
|
+
};
|
|
43
|
+
NetworkButton.propTypes = {
|
|
44
|
+
className: PropTypes.string,
|
|
45
|
+
label: PropTypes.shape({
|
|
46
|
+
id: PropTypes.string,
|
|
47
|
+
defaultMessage: PropTypes.string,
|
|
48
|
+
description: PropTypes.string,
|
|
49
|
+
}).isRequired,
|
|
50
|
+
onClick: PropTypes.func.isRequired,
|
|
51
|
+
import: PropTypes.bool,
|
|
52
|
+
};
|
|
53
|
+
export default NetworkButton;
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/NetworkButton/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,SAAS,EACT,KAAK,EACL,OAAO,EACP,MAAM,EAAE,QAAQ,GACjB,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAE3C,MAAM,SAAS,GAAG,KAAC,gBAAgB,oBAAK,KAAK,EAAI,CAAC;IAClD,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAE1D,MAAM,SAAS,GAAG,SAAS,CAAC;IAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC3D,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,CAAC,KAAC,IAAI,IAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,oBAAoB,CAAC,GAAI,CAAC;QAC3E,OAAO,EAAE,CAAC,KAAC,IAAI,IAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,GAAI,CAAC;KACnE,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;IAE9E,OAAO,CACL,KAAC,cAAc,IACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAC,iBAAiB,EACzB,cAAc,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EACtC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,aAAa,CAAC,YAAY,GAAG;IAC3B,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,aAAa,CAAC,SAAS,GAAG;IACxB,SAAS,EAAE,SAAS,CAAC,MAAM;IAC3B,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;QACrB,EAAE,EAAE,SAAS,CAAC,MAAM;QACpB,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,WAAW,EAAE,SAAS,CAAC,MAAM;KAC9B,CAAC,CAAC,UAAU;IACb,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IAClC,MAAM,EAAE,SAAS,CAAC,IAAI;CACvB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport { StatefulButton, Icon } from '@openedx/paragon';\nimport { FormattedMessage } from '@openedx/frontend-base';\n\nimport { useShouldShowSpinner } from '@src/components/GradesView/data/hooks';\nimport { StrictDict } from '@src/utils';\n\nexport const buttonStates = StrictDict({\n pending: 'pending',\n default: 'default',\n});\n\n/**\n * <NetworkButton />\n * Simplified Download/Upload button, tied to the app's network status (showSpinner).\n * Provides a button with a default `download` icon along with a label, which should\n * be a transifex-friendly message object. If the `import` argument is passed, the default\n * icon will be an upload icon.\n * If the app is busy on a network task (showSpinner === true), the button will be disabled\n * and show a spinner/working indicator.\n * The buttons can also be passed an optional className for further css customization.\n * @param {string} className - optional extra css class(es)\n * @param {object} label - transifex-friendly message object\n * @param {func} onClick - button on-click action\n * @param {bool} import - should show import icon instead of download icon in default state.\n */\nexport const NetworkButton = ({\n className,\n label,\n onClick,\n import: isImport,\n}) => {\n const showSpinner = useShouldShowSpinner();\n\n const labelNode = <FormattedMessage {...label} />;\n const labels = { default: labelNode, pending: labelNode };\n\n const iconClass = 'fa mr-2';\n const defaultIcon = isImport ? 'fa-upload' : 'fa-download';\n const icons = {\n pending: (<Icon className={classNames(iconClass, 'fa-spinner fa-spin')} />),\n default: (<Icon className={classNames(iconClass, defaultIcon)} />),\n };\n\n const buttonState = showSpinner ? buttonStates.pending : buttonStates.default;\n\n return (\n <StatefulButton\n labels={labels}\n variant=\"outline-primary\"\n disabledStates={[buttonStates.pending]}\n className={classNames('ml-2', className)}\n icons={icons}\n state={buttonState}\n onClick={onClick}\n />\n );\n};\n\nNetworkButton.defaultProps = {\n className: '',\n import: false,\n};\n\nNetworkButton.propTypes = {\n className: PropTypes.string,\n label: PropTypes.shape({\n id: PropTypes.string,\n defaultMessage: PropTypes.string,\n description: PropTypes.string,\n }).isRequired,\n onClick: PropTypes.func.isRequired,\n import: PropTypes.bool,\n};\n\nexport default NetworkButton;\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
$sidebar-width: 350px;
|
|
2
|
+
|
|
3
|
+
.sidebar-contents {
|
|
4
|
+
overflow-x: auto;
|
|
5
|
+
transition: margin 300ms cubic-bezier(0.4,0,0.2,1);
|
|
6
|
+
margin-left: 0;
|
|
7
|
+
.sidebar.open + & {
|
|
8
|
+
margin-left: $sidebar-width;
|
|
9
|
+
}
|
|
10
|
+
&.opening {
|
|
11
|
+
width: calc(100vw - #{$sidebar-width});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.sidebar-header {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: flex-start;
|
|
18
|
+
justify-content: space-between;
|
|
19
|
+
padding: 15px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.sidebar-container .collapsible {
|
|
23
|
+
margin-bottom: 1em;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.sidebar {
|
|
27
|
+
height: 100%;
|
|
28
|
+
width: $sidebar-width;
|
|
29
|
+
position: absolute;
|
|
30
|
+
transform: translateX(-$sidebar-width);
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
transition: transform 300ms cubic-bezier(0.4,0,0.2,1);
|
|
33
|
+
&.open {
|
|
34
|
+
transform: translateX(0%);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function WithSidebar({ children, sidebar }: JSX): import("react").JSX.Element;
|
|
2
|
+
export namespace WithSidebar {
|
|
3
|
+
namespace propTypes {
|
|
4
|
+
let children: PropTypes.Validator<NonNullable<PropTypes.ReactNodeLike>>;
|
|
5
|
+
let sidebar: PropTypes.Validator<NonNullable<PropTypes.ReactNodeLike>>;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export default WithSidebar;
|
|
9
|
+
import PropTypes from 'prop-types';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import { useGradebookUi } from '../../data/gradebookUiContext';
|
|
5
|
+
/**
|
|
6
|
+
* WithSidebar
|
|
7
|
+
* Simple wrapper around a content component, with a collapsible sidebar, whose
|
|
8
|
+
* open/closed state is drawn from the GradebookUiProvider.
|
|
9
|
+
*
|
|
10
|
+
* Wraps child react content in a container to enable the sidebar behavior.
|
|
11
|
+
*
|
|
12
|
+
* @param {JSX} children - page content
|
|
13
|
+
* @param {JSX} sidebar - sidebar content
|
|
14
|
+
*
|
|
15
|
+
* Ex Usage:
|
|
16
|
+
* <WithSidebar sidebar={sidebarContent}>{children}</WithSidebar>
|
|
17
|
+
*/
|
|
18
|
+
export const WithSidebar = ({ children, sidebar }) => {
|
|
19
|
+
const { filterMenuOpen: open, filterMenuTransitioning: transitioning, handleFilterMenuTransitionEnd, } = useGradebookUi();
|
|
20
|
+
// Derived states previously computed by the Redux `filterMenu` selectors.
|
|
21
|
+
const isClosed = !open && !transitioning;
|
|
22
|
+
const isOpening = transitioning && open;
|
|
23
|
+
const sidebarClassNames = classNames('sidebar', { open, 'd-none': isClosed });
|
|
24
|
+
const contentClassNames = classNames('sidebar-contents', 'position-relative', {
|
|
25
|
+
opening: isOpening,
|
|
26
|
+
});
|
|
27
|
+
return (_jsxs("div", { className: "d-flex sidebar-container page-gradebook", children: [_jsx("aside", { className: sidebarClassNames, onTransitionEnd: handleFilterMenuTransitionEnd, children: sidebar }), _jsx("div", { className: contentClassNames, children: children })] }));
|
|
28
|
+
};
|
|
29
|
+
WithSidebar.propTypes = {
|
|
30
|
+
children: PropTypes.node.isRequired,
|
|
31
|
+
sidebar: PropTypes.node.isRequired,
|
|
32
|
+
};
|
|
33
|
+
export default WithSidebar;
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/WithSidebar/index.jsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACnD,MAAM,EACJ,cAAc,EAAE,IAAI,EACpB,uBAAuB,EAAE,aAAa,EACtC,6BAA6B,GAC9B,GAAG,cAAc,EAAE,CAAC;IAErB,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;IACzC,MAAM,SAAS,GAAG,aAAa,IAAI,IAAI,CAAC;IAExC,MAAM,iBAAiB,GAAG,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9E,MAAM,iBAAiB,GAAG,UAAU,CAAC,kBAAkB,EAAE,mBAAmB,EAAE;QAC5E,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;IAEH,OAAO,CACL,eAAK,SAAS,EAAC,yCAAyC,aACtD,gBAAO,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,6BAA6B,YAC/E,OAAO,GACH,EACR,cAAK,SAAS,EAAE,iBAAiB,YAC7B,QAAQ,GACN,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,WAAW,CAAC,SAAS,GAAG;IACtB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACnC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;CACnC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport { useGradebookUi } from '@src/data/gradebookUiContext';\n\n/**\n * WithSidebar\n * Simple wrapper around a content component, with a collapsible sidebar, whose\n * open/closed state is drawn from the GradebookUiProvider.\n *\n * Wraps child react content in a container to enable the sidebar behavior.\n *\n * @param {JSX} children - page content\n * @param {JSX} sidebar - sidebar content\n *\n * Ex Usage:\n * <WithSidebar sidebar={sidebarContent}>{children}</WithSidebar>\n */\nexport const WithSidebar = ({ children, sidebar }) => {\n const {\n filterMenuOpen: open,\n filterMenuTransitioning: transitioning,\n handleFilterMenuTransitionEnd,\n } = useGradebookUi();\n\n // Derived states previously computed by the Redux `filterMenu` selectors.\n const isClosed = !open && !transitioning;\n const isOpening = transitioning && open;\n\n const sidebarClassNames = classNames('sidebar', { open, 'd-none': isClosed });\n const contentClassNames = classNames('sidebar-contents', 'position-relative', {\n opening: isOpening,\n });\n\n return (\n <div className=\"d-flex sidebar-container page-gradebook\">\n <aside className={sidebarClassNames} onTransitionEnd={handleFilterMenuTransitionEnd}>\n { sidebar }\n </aside>\n <div className={contentClassNames}>\n { children }\n </div>\n </div>\n );\n};\n\nWithSidebar.propTypes = {\n children: PropTypes.node.isRequired,\n sidebar: PropTypes.node.isRequired,\n};\n\nexport default WithSidebar;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const appId = "org.openedx.frontend.app.gradebook";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,oCAAoC,CAAC","sourcesContent":["export const appId = 'org.openedx.frontend.app.gradebook';\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default GradebookDataLoader;
|
|
2
|
+
/**
|
|
3
|
+
* <GradebookDataLoader />
|
|
4
|
+
* Headless component that eagerly mounts the main grades query for the routed
|
|
5
|
+
* GradebookPage subtree (where `courseId` is available via the router). Renders
|
|
6
|
+
* nothing; it exists so the grades fetch runs on page load regardless of which
|
|
7
|
+
* view is active. Wires the roles gate + current pagination cursor into the
|
|
8
|
+
* pure `useGrades` query.
|
|
9
|
+
*/
|
|
10
|
+
declare function GradebookDataLoader(): null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useGrades } from '../../components/GradesView/data/apiHook';
|
|
2
|
+
import { useCourseIdWithGate } from '../../data/apiHook';
|
|
3
|
+
import { useGradebookUi } from '../../data/gradebookUiContext';
|
|
4
|
+
/**
|
|
5
|
+
* <GradebookDataLoader />
|
|
6
|
+
* Headless component that eagerly mounts the main grades query for the routed
|
|
7
|
+
* GradebookPage subtree (where `courseId` is available via the router). Renders
|
|
8
|
+
* nothing; it exists so the grades fetch runs on page load regardless of which
|
|
9
|
+
* view is active. Wires the roles gate + current pagination cursor into the
|
|
10
|
+
* pure `useGrades` query.
|
|
11
|
+
*/
|
|
12
|
+
const GradebookDataLoader = () => {
|
|
13
|
+
const { courseId, enabled } = useCourseIdWithGate();
|
|
14
|
+
const { gradesPageEndpoint } = useGradebookUi();
|
|
15
|
+
useGrades(courseId, gradesPageEndpoint, { enabled });
|
|
16
|
+
return null;
|
|
17
|
+
};
|
|
18
|
+
export default GradebookDataLoader;
|
|
19
|
+
//# sourceMappingURL=GradebookDataLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GradebookDataLoader.js","sourceRoot":"","sources":["../../../src/containers/GradebookPage/GradebookDataLoader.jsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC/B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACpD,MAAM,EAAE,kBAAkB,EAAE,GAAG,cAAc,EAAE,CAAC;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC","sourcesContent":["import { useGrades } from '@src/components/GradesView/data/apiHook';\nimport { useCourseIdWithGate } from '@src/data/apiHook';\nimport { useGradebookUi } from '@src/data/gradebookUiContext';\n\n/**\n * <GradebookDataLoader />\n * Headless component that eagerly mounts the main grades query for the routed\n * GradebookPage subtree (where `courseId` is available via the router). Renders\n * nothing; it exists so the grades fetch runs on page load regardless of which\n * view is active. Wires the roles gate + current pagination cursor into the\n * pure `useGrades` query.\n */\nconst GradebookDataLoader = () => {\n const { courseId, enabled } = useCourseIdWithGate();\n const { gradesPageEndpoint } = useGradebookUi();\n useGrades(courseId, gradesPageEndpoint, { enabled });\n return null;\n};\n\nexport default GradebookDataLoader;\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import queryString from 'query-string';
|
|
3
|
+
import { useNavigate, useLocation } from 'react-router-dom';
|
|
4
|
+
import { useGradebookUi } from '../../data/gradebookUiContext';
|
|
5
|
+
import { views } from '../../data/constants/app';
|
|
6
|
+
import WithSidebar from '../../components/WithSidebar';
|
|
7
|
+
import GradebookHeader from '../../components/GradebookHeader';
|
|
8
|
+
import GradesView from '../../components/GradesView';
|
|
9
|
+
import GradebookFilters from '../../components/GradebookFilters';
|
|
10
|
+
import BulkManagementHistoryView from '../../components/BulkManagementHistoryView';
|
|
11
|
+
import GradebookDataLoader from './GradebookDataLoader';
|
|
12
|
+
/**
|
|
13
|
+
* <GradebookPage />
|
|
14
|
+
* Top-level view for the Gradebook MFE.
|
|
15
|
+
* Organizes a header and a pair of views (Grades and BulkManagement) with a toggle-able
|
|
16
|
+
* filter sidebar.
|
|
17
|
+
*/
|
|
18
|
+
export const GradebookPage = () => {
|
|
19
|
+
const navigate = useNavigate();
|
|
20
|
+
const location = useLocation();
|
|
21
|
+
const { activeView } = useGradebookUi();
|
|
22
|
+
const updateQueryParams = (queryParams) => {
|
|
23
|
+
const { pathname } = location;
|
|
24
|
+
const parsed = queryString.parse(location.search);
|
|
25
|
+
Object.keys(queryParams).forEach((key) => {
|
|
26
|
+
if (queryParams[key]) {
|
|
27
|
+
parsed[key] = queryParams[key];
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
delete parsed[key];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
navigate({ pathname, search: `?${queryString.stringify(parsed)}` });
|
|
34
|
+
};
|
|
35
|
+
return (_jsxs(_Fragment, { children: [_jsx(GradebookDataLoader, {}), _jsx(WithSidebar, { sidebar: _jsx(GradebookFilters, { updateQueryParams: updateQueryParams }), children: _jsxs("div", { className: "px-3 gradebook-content", children: [_jsx(GradebookHeader, {}), (activeView === views.bulkManagementHistory
|
|
36
|
+
? _jsx(BulkManagementHistoryView, {})
|
|
37
|
+
: _jsx(GradesView, { updateQueryParams: updateQueryParams }))] }) })] }));
|
|
38
|
+
};
|
|
39
|
+
export default GradebookPage;
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/GradebookPage/index.jsx"],"names":[],"mappings":";AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,WAAW,MAAM,6BAA6B,CAAC;AACtD,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,UAAU,MAAM,4BAA4B,CAAC;AACpD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,yBAAyB,MAAM,2CAA2C,CAAC;AAElF,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAExC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,mBAAmB,KAAG,EACvB,KAAC,WAAW,IACV,OAAO,EAAE,KAAC,gBAAgB,IAAC,iBAAiB,EAAE,iBAAiB,GAAI,YAEnE,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,eAAe,KAAG,EAClB,CAAC,UAAU,KAAK,KAAK,CAAC,qBAAqB;4BAC1C,CAAC,CAAC,KAAC,yBAAyB,KAAG;4BAC/B,CAAC,CAAC,KAAC,UAAU,IAAC,iBAAiB,EAAE,iBAAiB,GAAI,CACvD,IACG,GACM,IACb,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import queryString from 'query-string';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nimport { useGradebookUi } from '@src/data/gradebookUiContext';\nimport { views } from '@src/data/constants/app';\n\nimport WithSidebar from '@src/components/WithSidebar';\nimport GradebookHeader from '@src/components/GradebookHeader';\nimport GradesView from '@src/components/GradesView';\nimport GradebookFilters from '@src/components/GradebookFilters';\nimport BulkManagementHistoryView from '@src/components/BulkManagementHistoryView';\n\nimport GradebookDataLoader from './GradebookDataLoader';\n\n/**\n * <GradebookPage />\n * Top-level view for the Gradebook MFE.\n * Organizes a header and a pair of views (Grades and BulkManagement) with a toggle-able\n * filter sidebar.\n */\nexport const GradebookPage = () => {\n const navigate = useNavigate();\n const location = useLocation();\n const { activeView } = useGradebookUi();\n\n const updateQueryParams = (queryParams) => {\n const { pathname } = location;\n const parsed = queryString.parse(location.search);\n Object.keys(queryParams).forEach((key) => {\n if (queryParams[key]) {\n parsed[key] = queryParams[key];\n } else {\n delete parsed[key];\n }\n });\n navigate({ pathname, search: `?${queryString.stringify(parsed)}` });\n };\n\n return (\n <>\n <GradebookDataLoader />\n <WithSidebar\n sidebar={<GradebookFilters updateQueryParams={updateQueryParams} />}\n >\n <div className=\"px-3 gradebook-content\">\n <GradebookHeader />\n {(activeView === views.bulkManagementHistory\n ? <BulkManagementHistoryView />\n : <GradesView updateQueryParams={updateQueryParams} />\n )}\n </div>\n </WithSidebar>\n </>\n );\n};\n\nexport default GradebookPage;"]}
|