Skip to content

Commit

Permalink
Fork button hidden for supervisors + refactoring in Exercise detail p…
Browse files Browse the repository at this point in the history
…age.

Buttons for reference solution are displayed based on privilegeHints.
Bug fixed in EditAssignment form.
  • Loading branch information
Martin Krulis committed Oct 28, 2017
1 parent 57d01d7 commit d280f2a
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [],
Expand All @@ -26,27 +27,38 @@ const ReferenceSolutionsList = ({
/>
</th>
<th />
<th />
</tr>
</thead>
<tbody>
{referenceSolutions
.sort((a, b) => a.uploadedAt - b.uploadedAt)
.map(({ id, uploadedAt, description, canDelete }) =>
<tr key={id}>
<td className="text-center">
<Icon name="file-code-o" />
</td>
<td>
{description}
</td>
<td>
<FormattedDate value={new Date(uploadedAt * 1000)} /> &nbsp;{' '}
<FormattedTime value={new Date(uploadedAt * 1000)} />
</td>
<td className="text-right">
{renderButtons(id, canDelete)}
</td>
</tr>
.map(
({
id,
uploadedAt,
description,
permissionHints,
solution: { userId }
}) =>
<tr key={id}>
<td className="text-center">
<Icon name="file-code-o" />
</td>
<td>
{description}
</td>
<td>
<FormattedDate value={new Date(uploadedAt * 1000)} /> &nbsp;{' '}
<FormattedTime value={new Date(uploadedAt * 1000)} />
</td>
<td>
<UsersNameContainer userId={userId} />
</td>
<td className="text-right">
{renderButtons(id, permissionHints)}
</td>
</tr>
)}
</tbody>
</Table>;
Expand Down
2 changes: 1 addition & 1 deletion src/pages/EditAssignment/EditAssignment.js
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
37 changes: 16 additions & 21 deletions src/pages/Exercise/Exercise.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -130,7 +126,7 @@ class Exercise extends Component {
exercise,
submitting,
supervisedGroups,
isAuthorOfExercise,
canEditExercise,
referenceSolutions,
intl: { formatMessage },
initCreateReferenceSolution,
Expand Down Expand Up @@ -187,8 +183,8 @@ class Exercise extends Component {
<div>
<Row>
<Col sm={12}>
<div>
{isAuthorOfExercise(exercise.id) &&
{canEditExercise(exercise.id) &&
<div>
<ButtonGroup>
<LinkContainer
to={EXERCISE_EDIT_URI_FACTORY(exercise.id)}
Expand All @@ -214,12 +210,12 @@ class Exercise extends Component {
/>
</Button>
</LinkContainer>
</ButtonGroup>}
<ForkExerciseButtonContainer
exerciseId={exercise.id}
forkId={forkId}
/>
</div>
</ButtonGroup>
<ForkExerciseButtonContainer
exerciseId={exercise.id}
forkId={forkId}
/>
</div>}
<p />
</Col>
</Row>
Expand Down Expand Up @@ -353,7 +349,7 @@ class Exercise extends Component {
referenceSolutions.length > 0
? <ReferenceSolutionsList
referenceSolutions={referenceSolutions}
renderButtons={(solutionId, canDelete) =>
renderButtons={(solutionId, permissionHints) =>
<div>
<Button
bsSize="xs"
Expand All @@ -371,7 +367,8 @@ class Exercise extends Component {
defaultMessage="View detail"
/>
</Button>
{canDelete &&
{permissionHints &&
permissionHints.delete !== false &&
<Confirm
id={solutionId}
onConfirmed={() =>
Expand Down Expand Up @@ -441,15 +438,14 @@ 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,
initCreateReferenceSolution: PropTypes.func.isRequired,
exercisePipelines: ImmutablePropTypes.map,
createExercisePipeline: PropTypes.func,
links: PropTypes.object,
isAdmin: PropTypes.bool.isRequired,
deleteReferenceSolution: PropTypes.func.isRequired
};

Expand All @@ -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 } }) => ({
Expand Down
4 changes: 3 additions & 1 deletion src/pages/ReferenceSolution/ReferenceSolution.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ class ReferenceSolution extends Component {
const referenceSolution = referenceSolutions.find(
solution => solution.id === referenceSolutionId
);
const permissionHints = referenceSolution.permissionHints;
return (
<div>
<Row>
Expand Down Expand Up @@ -150,7 +151,8 @@ class ReferenceSolution extends Component {
defaultMessage="Refresh"
/>
</Button>
{referenceSolution.canEvaluate &&
{permissionHints &&
permissionHints.evaluate !== false &&
<Button
bsStyle="success"
className="btn-flat"
Expand Down

0 comments on commit d280f2a

Please sign in to comment.