feat: created Grading page (#557)

This commit is contained in:
Peter Kulko
2023-08-14 21:44:01 +03:00
committed by GitHub
parent 484b141328
commit f9bc5c4927
77 changed files with 3521 additions and 94 deletions

View File

@@ -0,0 +1,43 @@
/* eslint-disable import/prefer-default-export */
import { camelCaseObject, getConfig } from '@edx/frontend-platform';
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { deepConvertingKeysToSnakeCase } from '../../utils';
const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;
export const getGradingSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_grading/${courseId}`;
export const getCourseSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_settings/${courseId}`;
/**
* Get's grading setting for a course.
* @param {string} courseId
* @returns {Promise<Object>}
*/
export async function getGradingSettings(courseId) {
const { data } = await getAuthenticatedHttpClient()
.get(getGradingSettingsApiUrl(courseId));
return camelCaseObject(data);
}
/**
* Send`s grading setting for a course.
* @param {string} courseId
* @param {object} settings
* @returns {Promise<Object>}
*/
export async function sendGradingSettings(courseId, settings) {
const { data } = await getAuthenticatedHttpClient()
.post(getGradingSettingsApiUrl(courseId), deepConvertingKeysToSnakeCase(settings));
return camelCaseObject(data);
}
/**
* Get course settings.
* @param {string} courseId
* @returns {Promise<Object>}
*/
export async function getCourseSettings(courseId) {
const { data } = await getAuthenticatedHttpClient()
.get(getCourseSettingsApiUrl(courseId));
return camelCaseObject(data);
}

View File

@@ -0,0 +1,13 @@
const getLoadingStatus = (state) => state.gradingSettings.loadingStatus;
const getGradingSettings = (state) => state.gradingSettings.gradingSettings.courseDetails;
const getCourseAssignmentLists = (state) => state.gradingSettings.gradingSettings.courseAssignmentLists;
const getSavingStatus = (state) => state.gradingSettings.savingStatus;
const getCourseSettings = (state) => state.gradingSettings.courseSettings;
export {
getLoadingStatus,
getGradingSettings,
getCourseAssignmentLists,
getSavingStatus,
getCourseSettings,
};

View File

@@ -0,0 +1,43 @@
/* eslint-disable no-param-reassign */
import { createSlice } from '@reduxjs/toolkit';
import { RequestStatus } from '../../data/constants';
const slice = createSlice({
name: 'gradingSettings',
initialState: {
loadingStatus: RequestStatus.IN_PROGRESS,
savingStatus: '',
gradingSettings: {},
courseSettings: {},
},
reducers: {
updateLoadingStatus: (state, { payload }) => {
state.loadingStatus = payload.status;
},
updateSavingStatus: (state, { payload }) => {
state.savingStatus = payload.status;
},
fetchGradingSettingsSuccess: (state, { payload }) => {
Object.assign(state.gradingSettings, payload);
},
sendGradingSettingsSuccess: (state, { payload }) => {
Object.assign(state.gradingSettings, payload);
},
fetchCourseSettingsSuccess: (state, { payload }) => {
Object.assign(state.courseSettings, payload);
},
},
});
export const {
updateLoadingStatus,
updateSavingStatus,
fetchGradingSettingsSuccess,
sendGradingSettingsSuccess,
fetchCourseSettingsSuccess,
} = slice.actions;
export const {
reducer,
} = slice;

View File

@@ -0,0 +1,55 @@
import { RequestStatus } from '../../data/constants';
import {
getGradingSettings,
sendGradingSettings,
getCourseSettings,
} from './api';
import {
sendGradingSettingsSuccess,
updateLoadingStatus,
updateSavingStatus,
fetchGradingSettingsSuccess,
fetchCourseSettingsSuccess,
} from './slice';
export function fetchGradingSettings(courseId) {
return async (dispatch) => {
dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));
try {
const settingValues = await getGradingSettings(courseId);
dispatch(fetchGradingSettingsSuccess(settingValues));
dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));
} catch (error) {
dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));
}
};
}
export function sendGradingSetting(courseId, settings) {
return async (dispatch) => {
dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));
try {
const settingValues = await sendGradingSettings(courseId, settings);
dispatch(sendGradingSettingsSuccess(settingValues));
dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));
} catch (error) {
dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));
}
};
}
export function fetchCourseSettingsQuery(courseId) {
return async (dispatch) => {
dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));
try {
const settingsValues = await getCourseSettings(courseId);
dispatch(fetchCourseSettingsSuccess(settingsValues));
dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));
return true;
} catch (error) {
dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));
return false;
}
};
}