From 78ce1c956a9581aeedc09c471e8e9006cfe2f864 Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Tue, 28 Sep 2021 14:53:10 +0200 Subject: [PATCH] Proper reloading of exercise when ref. solution is submitted/deleted. --- .../SubmitSolutionContainer.js | 7 +++++-- src/pages/Exercise/Exercise.js | 16 +++++++++++----- src/redux/modules/exercises.js | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/containers/SubmitSolutionContainer/SubmitSolutionContainer.js b/src/containers/SubmitSolutionContainer/SubmitSolutionContainer.js index c7d98a5e0..a0a447c0c 100644 --- a/src/containers/SubmitSolutionContainer/SubmitSolutionContainer.js +++ b/src/containers/SubmitSolutionContainer/SubmitSolutionContainer.js @@ -243,6 +243,7 @@ SubmitSolutionContainer.propTypes = { presubmitSizeLimitOK: PropTypes.bool, progressObserverId: PropTypes.string, submitSolution: PropTypes.func.isRequired, + afterEvaluationStarts: PropTypes.func, presubmitSolution: PropTypes.func.isRequired, uploadedFiles: PropTypes.array, removedFiles: PropTypes.array, @@ -275,11 +276,13 @@ export default withLinks( progressObserverId: getProgressObserverId(state), }; }, - (dispatch, { id, userId, onSubmit, onReset, presubmitValidation }) => ({ + (dispatch, { id, userId, onSubmit, afterEvaluationStarts = null, onReset, presubmitValidation }) => ({ changeNote: note => dispatch(changeNote(note)), cancel: () => dispatch(cancel()), submitSolution: (note, files, runtimeEnvironmentId = null, entryPoint = null, progressObserverId = null) => - dispatch(onSubmit(userId, id, note, files, runtimeEnvironmentId, entryPoint, progressObserverId)), + dispatch(onSubmit(userId, id, note, files, runtimeEnvironmentId, entryPoint, progressObserverId)).then( + afterEvaluationStarts + ), presubmitSolution: files => dispatch(presubmitValidation(id, files)), reset: () => dispatch(resetUpload(id)) && dispatch(onReset(userId, id)), afterEvaluationFinishes: () => Promise.all([dispatch(fetchUsersSolutions(userId, id)), dispatch(canSubmit(id))]), diff --git a/src/pages/Exercise/Exercise.js b/src/pages/Exercise/Exercise.js index 22105fa93..f7404154e 100644 --- a/src/pages/Exercise/Exercise.js +++ b/src/pages/Exercise/Exercise.js @@ -24,6 +24,7 @@ import ForkExerciseForm from '../../components/forms/ForkExerciseForm'; import { isSubmitting } from '../../redux/selectors/submission'; import { fetchExerciseIfNeeded, + reloadExercise, forkExercise, attachExerciseToGroup, detachExerciseFromGroup, @@ -103,6 +104,7 @@ class Exercise extends Component { deleteReferenceSolution, groups, groupsAccessor, + reload, forkExercise, attachingGroupId, detachingGroupId, @@ -254,6 +256,7 @@ class Exercise extends Component { id={exercise.id} onSubmit={submitReferenceSolution} presubmitValidation={presubmitReferenceSolution} + afterEvaluationStarts={reload} onReset={init} isOpen={submitting} solutionFilesLimit={exercise.solutionFilesLimit} @@ -281,21 +284,22 @@ Exercise.propTypes = { exerciseId: PropTypes.string.isRequired, }).isRequired, }).isRequired, - loadAsync: PropTypes.func.isRequired, exercise: ImmutablePropTypes.map, forkedFrom: ImmutablePropTypes.map, runtimeEnvironments: ImmutablePropTypes.map, referenceSolutions: ImmutablePropTypes.map, intl: PropTypes.object.isRequired, submitting: PropTypes.bool, - initCreateReferenceSolution: PropTypes.func.isRequired, links: PropTypes.object, - deleteReferenceSolution: PropTypes.func.isRequired, - forkExercise: PropTypes.func.isRequired, groups: ImmutablePropTypes.map, groupsAccessor: PropTypes.func.isRequired, attachingGroupId: PropTypes.string, detachingGroupId: PropTypes.string, + loadAsync: PropTypes.func.isRequired, + reload: PropTypes.func.isRequired, + initCreateReferenceSolution: PropTypes.func.isRequired, + deleteReferenceSolution: PropTypes.func.isRequired, + forkExercise: PropTypes.func.isRequired, attachExerciseToGroup: PropTypes.func.isRequired, detachExerciseFromGroup: PropTypes.func.isRequired, }; @@ -335,8 +339,10 @@ export default withLinks( } ) => ({ loadAsync: userId => Exercise.loadAsync({ exerciseId }, dispatch, { userId }), + reload: () => dispatch(reloadExercise(exerciseId)), initCreateReferenceSolution: userId => dispatch(init(userId, exerciseId)), - deleteReferenceSolution: solutionId => dispatch(deleteReferenceSolution(solutionId)), + deleteReferenceSolution: solutionId => + dispatch(deleteReferenceSolution(solutionId)).then(() => dispatch(reloadExercise(exerciseId))), forkExercise: (forkId, data) => dispatch(forkExercise(exerciseId, forkId, data)), attachExerciseToGroup: groupId => dispatch(attachExerciseToGroup(exerciseId, groupId)), detachExerciseFromGroup: groupId => dispatch(detachExerciseFromGroup(exerciseId, groupId)), diff --git a/src/redux/modules/exercises.js b/src/redux/modules/exercises.js index ecc85576e..86adbba3e 100644 --- a/src/redux/modules/exercises.js +++ b/src/redux/modules/exercises.js @@ -54,6 +54,7 @@ export const additionalActionTypes = { export const loadExercise = actions.pushResource; export const fetchExercisesIfNeeded = actions.fetchIfNeeded; export const fetchExercise = actions.fetchResource; +export const reloadExercise = (id, meta = {}) => actions.fetchResource(id, { allowReload: true, ...meta }); export const fetchExerciseIfNeeded = actions.fetchOneIfNeeded; export const invalidateExercise = actions.invalidate;