From d280f2a3f7e453d764afe3902c148d2edb3548ff Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Sun, 29 Oct 2017 00:04:39 +0200 Subject: [PATCH] Fork button hidden for supervisors + refactoring in Exercise detail page. Buttons for reference solution are displayed based on privilegeHints. Bug fixed in EditAssignment form. --- .../ReferenceSolutionsList.js | 44 ++++++++++++------- src/pages/EditAssignment/EditAssignment.js | 2 +- src/pages/Exercise/Exercise.js | 37 +++++++--------- .../ReferenceSolution/ReferenceSolution.js | 4 +- 4 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js b/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js index 8c73801f5..9d6788593 100644 --- a/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js +++ b/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { FormattedMessage, FormattedDate, FormattedTime } from 'react-intl'; import { Table } from 'react-bootstrap'; import Icon from 'react-fontawesome'; +import UsersNameContainer from '../../../containers/UsersNameContainer'; const ReferenceSolutionsList = ({ referenceSolutions = [], @@ -26,27 +27,38 @@ const ReferenceSolutionsList = ({ /> + {referenceSolutions .sort((a, b) => a.uploadedAt - b.uploadedAt) - .map(({ id, uploadedAt, description, canDelete }) => - - - - - - {description} - - -  {' '} - - - - {renderButtons(id, canDelete)} - - + .map( + ({ + id, + uploadedAt, + description, + permissionHints, + solution: { userId } + }) => + + + + + + {description} + + +  {' '} + + + + + + + {renderButtons(id, permissionHints)} + + )} ; diff --git a/src/pages/EditAssignment/EditAssignment.js b/src/pages/EditAssignment/EditAssignment.js index 67d20fe4f..b3aae4be6 100644 --- a/src/pages/EditAssignment/EditAssignment.js +++ b/src/pages/EditAssignment/EditAssignment.js @@ -210,7 +210,7 @@ export default withLinks( loadAsync: () => EditAssignment.loadAsync({ assignmentId }, dispatch), editAssignment: (version, data) => { // convert deadline times to timestamps - let processedData = Object.assign({}, data, { + const processedData = Object.assign({}, data, { firstDeadline: moment(data.firstDeadline).unix(), secondDeadline: moment(data.secondDeadline).unix(), submissionsCountLimit: Number(data.submissionsCountLimit), diff --git a/src/pages/Exercise/Exercise.js b/src/pages/Exercise/Exercise.js index 7deb39302..ba551e783 100644 --- a/src/pages/Exercise/Exercise.js +++ b/src/pages/Exercise/Exercise.js @@ -44,11 +44,7 @@ import { fetchHardwareGroups } from '../../redux/modules/hwGroups'; import { create as assignExercise } from '../../redux/modules/assignments'; import { exerciseSelector } from '../../redux/selectors/exercises'; import { referenceSolutionsSelector } from '../../redux/selectors/referenceSolutions'; -import { - canEditExercise, - isSupervisor, - isSuperAdmin -} from '../../redux/selectors/users'; +import { canEditExercise } from '../../redux/selectors/users'; import { deletePipeline, fetchExercisePipelines, @@ -130,7 +126,7 @@ class Exercise extends Component { exercise, submitting, supervisedGroups, - isAuthorOfExercise, + canEditExercise, referenceSolutions, intl: { formatMessage }, initCreateReferenceSolution, @@ -187,8 +183,8 @@ class Exercise extends Component {
-
- {isAuthorOfExercise(exercise.id) && + {canEditExercise(exercise.id) && +
- } - -
+ + +
}

@@ -353,7 +349,7 @@ class Exercise extends Component { referenceSolutions.length > 0 ? + renderButtons={(solutionId, permissionHints) =>

- {canDelete && + {permissionHints && + permissionHints.delete !== false && @@ -441,7 +438,7 @@ Exercise.propTypes = { push: PropTypes.func.isRequired, exercise: ImmutablePropTypes.map, supervisedGroups: PropTypes.object, - isAuthorOfExercise: PropTypes.func.isRequired, + canEditExercise: PropTypes.func.isRequired, referenceSolutions: ImmutablePropTypes.map, intl: intlShape.isRequired, submitting: PropTypes.bool, @@ -449,7 +446,6 @@ Exercise.propTypes = { exercisePipelines: ImmutablePropTypes.map, createExercisePipeline: PropTypes.func, links: PropTypes.object, - isAdmin: PropTypes.bool.isRequired, deleteReferenceSolution: PropTypes.func.isRequired }; @@ -464,11 +460,10 @@ export default withLinks( exercise: exerciseSelector(exerciseId)(state), submitting: isSubmitting(state), supervisedGroups: supervisorOfSelector(userId)(state), - isAuthorOfExercise: exerciseId => + canEditExercise: exerciseId => canEditExercise(userId, exerciseId)(state), referenceSolutions: referenceSolutionsSelector(exerciseId)(state), - exercisePipelines: exercisePipelinesSelector(exerciseId)(state), - isAdmin: isSupervisor(userId)(state) || isSuperAdmin(userId)(state) + exercisePipelines: exercisePipelinesSelector(exerciseId)(state) }; }, (dispatch, { params: { exerciseId } }) => ({ diff --git a/src/pages/ReferenceSolution/ReferenceSolution.js b/src/pages/ReferenceSolution/ReferenceSolution.js index 24889512a..6371744a1 100644 --- a/src/pages/ReferenceSolution/ReferenceSolution.js +++ b/src/pages/ReferenceSolution/ReferenceSolution.js @@ -111,6 +111,7 @@ class ReferenceSolution extends Component { const referenceSolution = referenceSolutions.find( solution => solution.id === referenceSolutionId ); + const permissionHints = referenceSolution.permissionHints; return (
@@ -150,7 +151,8 @@ class ReferenceSolution extends Component { defaultMessage="Refresh" /> - {referenceSolution.canEvaluate && + {permissionHints && + permissionHints.evaluate !== false &&