feat: created Grading page (#557)
This commit is contained in:
43
src/grading-settings/data/api.js
Normal file
43
src/grading-settings/data/api.js
Normal 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);
|
||||
}
|
||||
13
src/grading-settings/data/selectors.js
Normal file
13
src/grading-settings/data/selectors.js
Normal 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,
|
||||
};
|
||||
43
src/grading-settings/data/slice.js
Normal file
43
src/grading-settings/data/slice.js
Normal 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;
|
||||
55
src/grading-settings/data/thunks.js
Normal file
55
src/grading-settings/data/thunks.js
Normal 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;
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user