diff --git a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js index 8423aa24a..ffb94f210 100644 --- a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js +++ b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js @@ -21,6 +21,7 @@ const SupplementaryFilesTableHeaderRow = () => defaultMessage="Uploaded at" /> +
{externalId}
+ {externalId} +
dispatch(init(userId, exerciseId)), createExercisePipeline: () => - dispatch(createPipeline({ exerciseId: exerciseId })) + dispatch(createPipeline({ exerciseId: exerciseId })), + deleteReferenceSolution: (exerciseId, solutionId) => + dispatch(deleteReferenceSolution(exerciseId, solutionId)) }) )(Exercise) ) diff --git a/src/redux/modules/referenceSolutions.js b/src/redux/modules/referenceSolutions.js index d9057321b..99d5d0911 100644 --- a/src/redux/modules/referenceSolutions.js +++ b/src/redux/modules/referenceSolutions.js @@ -17,6 +17,13 @@ const { actions, reduceActions } = factory({ * Actions */ +export const additionalActionTypes = { + REMOVE: 'recodex/referenceSolutions/REMOVE', + REMOVE_PENDING: 'recodex/referenceSolutions/REMOVE_PENDING', + REMOVE_FULFILLED: 'recodex/referenceSolutions/REMOVE_FULFILLED', + REMOVE_REJECTED: 'recodex/referenceSolutions/REMOVE_REJECTED' +}; + export const fetchReferenceSolutions = actions.fetchResource; export const fetchReferenceSolutionsIfNeeded = actions.fetchOneIfNeeded; // fetch solutions for one exercise @@ -29,6 +36,14 @@ export const evaluateReferenceSolution = (solutionId, isDebug = false) => meta: { solutionId } }); +export const deleteReferenceSolution = (exerciseId, solutionId) => + createApiAction({ + type: additionalActionTypes.REMOVE, + endpoint: `/reference-solutions/${solutionId}`, + method: 'DELETE', + meta: { exerciseId, solutionId } + }); + /** * Reducer */ @@ -46,7 +61,14 @@ const reducer = handleActions( } return data.push(fromJS(payload)); }) - : state + : state, + [additionalActionTypes.REMOVE_FULFILLED]: ( + state, + { payload, meta: { exerciseId, solutionId } } + ) => + state.updateIn(['resources', exerciseId, 'data'], solutions => + solutions.filter(solution => solution.toJS().id !== solutionId) + ) }), initialState ); diff --git a/src/redux/modules/supplementaryFiles.js b/src/redux/modules/supplementaryFiles.js index bc5e28a83..3ad0feb22 100644 --- a/src/redux/modules/supplementaryFiles.js +++ b/src/redux/modules/supplementaryFiles.js @@ -17,7 +17,9 @@ export const actionTypes = { ADD_FILES: 'recodex/supplementaryFiles/ADD_FILES', ADD_FILES_PENDING: 'recodex/supplementaryFiles/ADD_FILES_PENDING', ADD_FILES_FULFILLED: 'recodex/supplementaryFiles/ADD_FILES_FULFILLED', - ADD_FILES_FAILED: 'recodex/supplementaryFiles/ADD_FILES_REJECTED' + ADD_FILES_FAILED: 'recodex/supplementaryFiles/ADD_FILES_REJECTED', + REMOVE_FILE: 'recodex/supplementaryFiles/REMOVE_FILE', + REMOVE_FILE_FULFILLED: 'recodex/supplementaryFiles/REMOVE_FILE_FULFILLED' }; export const fetchSupplementaryFilesForExercise = exerciseId => @@ -42,6 +44,14 @@ export const addSupplementaryFiles = (exerciseId, files) => } }); +export const removeSupplementaryFile = fileId => + createApiAction({ + type: actionTypes.REMOVE_FILE, + endpoint: `/uploaded-files/${fileId}`, + method: 'DELETE', + meta: { fileId } + }); + /** * Reducer */ @@ -56,7 +66,11 @@ const reducer = handleActions( createRecord({ data, state: resourceStatus.FULFILLED }) ), state - ) + ), + [actionTypes.REMOVE_FILE_FULFILLED]: ( + state, + { payload, meta: { fileId } } + ) => state.deleteIn(['resources', fileId]) }), initialState );