Skip to content

Commit

Permalink
WIP: show all submissions of a solution
Browse files Browse the repository at this point in the history
  • Loading branch information
SemaiCZE committed Nov 15, 2017
1 parent 13bf271 commit ae88f7a
Show file tree
Hide file tree
Showing 12 changed files with 210 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,11 @@ import {
FormattedNumber
} from 'react-intl';
import { Table } from 'react-bootstrap';
import { Link } from 'react-router';
import classnames from 'classnames';

import withLinks from '../../../hoc/withLinks';
import AssignmentStatusIcon from '../../Assignments/Assignment/AssignmentStatusIcon';

const EvaluationTable = ({
evaluations,
referenceSolutionId,
exerciseId,
links: { REFERENCE_SOLUTION_EVALUATION_URI_FACTORY }
}) =>
const EvaluationTable = ({ evaluations, renderButtons }) =>
<Table>
<thead>
<tr>
Expand Down Expand Up @@ -81,21 +74,7 @@ const EvaluationTable = ({
/>
</i>
</td>}
<td className="text-right">
<Link
to={REFERENCE_SOLUTION_EVALUATION_URI_FACTORY(
exerciseId,
referenceSolutionId,
e.id
)}
className="btn btn-flat btn-default btn-xs"
>
<FormattedMessage
id="app.evaluationTable.showDetails"
defaultMessage="Show details"
/>
</Link>
</td>
{renderButtons && renderButtons(e.id)}
</tr>
)}

Expand All @@ -113,9 +92,7 @@ const EvaluationTable = ({

EvaluationTable.propTypes = {
evaluations: PropTypes.array.isRequired,
referenceSolutionId: PropTypes.string.isRequired,
exerciseId: PropTypes.string.isRequired,
links: PropTypes.object
renderButtons: PropTypes.func
};

export default withLinks(EvaluationTable);
export default EvaluationTable;
Original file line number Diff line number Diff line change
@@ -1,48 +1,55 @@
import React, { Component } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, intlShape, injectIntl } from 'react-intl';
import { FormattedMessage } from 'react-intl';
import { Link } from 'react-router';

import Box from '../../widgets/Box';
import EvaluationTable from '../EvaluationTable';
import withLinks from '../../../hoc/withLinks';

const messages = defineMessages({
title: {
id: 'app.referenceSolutionEvaluation.title',
defaultMessage: 'Evaluations of reference solution'
}
});

class ReferenceSolutionEvaluations extends Component {
render() {
const {
evaluations,
referenceSolutionId,
exerciseId,
intl: { formatMessage }
} = this.props;

return (
<Box
title={formatMessage(messages.title)}
noPadding={true}
collapsable={true}
isOpen={true}
>
<EvaluationTable
evaluations={evaluations}
referenceSolutionId={referenceSolutionId}
exerciseId={exerciseId}
/>
</Box>
);
}
}
const ReferenceSolutionEvaluations = ({
evaluations,
referenceSolutionId,
exerciseId,
links: { REFERENCE_SOLUTION_EVALUATION_URI_FACTORY }
}) =>
<Box
title={
<FormattedMessage
id="app.referenceSolutionEvaluation.title"
defaultMessage="Evaluations of reference solution"
/>
}
noPadding={true}
collapsable={true}
isOpen={true}
>
<EvaluationTable
evaluations={evaluations}
renderButtons={id =>
<td className="text-right">
<Link
to={REFERENCE_SOLUTION_EVALUATION_URI_FACTORY(
exerciseId,
referenceSolutionId,
id
)}
className="btn btn-flat btn-default btn-xs"
>
<FormattedMessage
id="app.evaluationTable.showDetails"
defaultMessage="Show details"
/>
</Link>
</td>}
/>
</Box>;

ReferenceSolutionEvaluations.propTypes = {
evaluations: PropTypes.array.isRequired,
referenceSolutionId: PropTypes.string.isRequired,
exerciseId: PropTypes.string.isRequired,
intl: intlShape.isRequired
links: PropTypes.object
};

export default injectIntl(ReferenceSolutionEvaluations);
export default withLinks(ReferenceSolutionEvaluations);
44 changes: 24 additions & 20 deletions src/components/Submissions/SubmissionDetail/SubmissionDetail.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,40 @@ import EvaluationDetail from '../EvaluationDetail';
import CompilationLogs from '../CompilationLogs';

class SubmissionDetail extends Component {
state = { openFileId: null };
state = { openFileId: null, activeSubmissionId: null };
openFile = id => this.setState({ openFileId: id });
hideFile = () => this.setState({ openFileId: null });

componentWillMount() {
this.setState({
activeSubmissionId: this.props.submission.lastSubmission.id
});
}

render() {
const {
submission: {
id,
note = '',
solution: { createdAt, userId, files, ...restSolution },
lastSubmission: {
submittedBy,
evaluation,
isCorrect,
evaluationStatus,
...restLastSub
},
maxPoints,
bonusPoints,
accepted,
runtimeEnvironmentId,
submissions
},
assignment,
isSupervisor
isSupervisor,
evaluations
} = this.props;
const { openFileId } = this.state;
const { openFileId, activeSubmissionId } = this.state;
const {
submittedBy,
evaluation,
isCorrect,
evaluationStatus,
...restSub
} = evaluations.toJS()[activeSubmissionId].data;

return (
<div>
Expand Down Expand Up @@ -104,9 +111,7 @@ class SubmissionDetail extends Component {
{isSupervisor &&
<Row>
<Col lg={6} md={12}>
<DownloadResultArchiveContainer
submissionId={restLastSub.id}
/>
<DownloadResultArchiveContainer submissionId={restSub.id} />
</Col>
</Row>}
{isSupervisor &&
Expand All @@ -116,6 +121,8 @@ class SubmissionDetail extends Component {
submissionId={id}
submission={{ submissions }}
assignmentId={assignment.id}
activeSubmissionId={activeSubmissionId}
onSelect={id => this.setState({ activeSubmissionId: id })}
/>
</Col>
</Row>}
Expand All @@ -136,12 +143,8 @@ SubmissionDetail.propTypes = {
submission: PropTypes.shape({
id: PropTypes.string.isRequired,
note: PropTypes.string,
lastSubmission: PropTypes.shape({
evaluationStatus: PropTypes.string.isRequired,
submittedBy: PropTypes.string,
evaluation: PropTypes.object,
isCorrect: PropTypes.bool
}).isRequired,
lastSubmission: PropTypes.shape({ id: PropTypes.string.isRequired })
.isRequired,
solution: PropTypes.shape({
createdAt: PropTypes.number.isRequired,
userId: PropTypes.string.isRequired,
Expand All @@ -151,7 +154,8 @@ SubmissionDetail.propTypes = {
runtimeEnvironmentId: PropTypes.string
}).isRequired,
assignment: PropTypes.object.isRequired,
isSupervisor: PropTypes.bool
isSupervisor: PropTypes.bool,
evaluations: PropTypes.object.isRequired
};

export default SubmissionDetail;
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import Button from '../../widgets/FlatButton';

import Box from '../../widgets/Box';
import EvaluationTable from '../../ReferenceSolutions/EvaluationTable';
import withLinks from '../../../hoc/withLinks';

const SubmissionEvaluations = ({
evaluations,
submissionId,
assignmentId,
activeSubmissionId,
onSelect,
links: { REFERENCE_SOLUTION_EVALUATION_URI_FACTORY }
}) =>
<Box
title={
<FormattedMessage
id="app.submissionEvaluation.title"
defaultMessage="Other submissions of this solution"
/>
}
noPadding={true}
collapsable={true}
isOpen={true}
>
<EvaluationTable
evaluations={evaluations}
renderButtons={id =>
<td className="text-right">
{id === activeSubmissionId
? <Button bsStyle="success" bsSize="xs" disabled>
<FormattedMessage
id="app.submissionEvaluation.active"
defaultMessage="Active"
/>
</Button>
: <Button
bsStyle="primary"
bsSize="xs"
onClick={() => onSelect(id)}
>
<FormattedMessage
id="app.submissionEvaluation.select"
defaultMessage="Select"
/>
</Button>}
</td>}
/>
</Box>;

SubmissionEvaluations.propTypes = {
evaluations: PropTypes.array.isRequired,
submissionId: PropTypes.string.isRequired,
assignmentId: PropTypes.string.isRequired,
activeSubmissionId: PropTypes.string.isRequired,
onSelect: PropTypes.func.isRequired,
links: PropTypes.object
};

export default withLinks(SubmissionEvaluations);
1 change: 1 addition & 0 deletions src/components/Submissions/SubmissionEvaluations/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default from './SubmissionEvaluations';
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl';
import { Field } from 'redux-form';
import { Row, Col, HelpBlock } from 'react-bootstrap';
import { KiloBytesTextField, SecondsTextField } from '../Fields';
import ReferenceSolutionsEvaluationsResults from '../../Submissions/ReferenceSolutionsEvaluationsResults';
import ReferenceSolutionsEvaluationsResults from '../../ReferenceSolutions/ReferenceSolutionsEvaluationsResults';

const sortTests = tests => {
return tests.sort((a, b) => a.localeCompare(b));
Expand All @@ -21,7 +21,7 @@ const HardwareGroupFields = ({
referenceSolutionsEvaluations[hardwareGroup];
return (
<Row>
{sortTests(Object.keys(tests)).map((testName, j) => (
{sortTests(Object.keys(tests)).map((testName, j) =>
<Col lg={6} key={j}>
<h4>
<FormattedMessage
Expand All @@ -30,7 +30,7 @@ const HardwareGroupFields = ({
/>{' '}
<b>{testName}</b>
</h4>
{Object.keys(tests[testName]).map((taskId, k) => (
{Object.keys(tests[testName]).map((taskId, k) =>
<div key={k}>
<Field
name={`${prefix}.tests.${testName}.${taskId}.time`}
Expand All @@ -55,27 +55,25 @@ const HardwareGroupFields = ({
}
/>

{referenceSolutionsEvaluationsResults && (
{referenceSolutionsEvaluationsResults &&
<ReferenceSolutionsEvaluationsResults
testId={testName}
taskId={taskId}
results={referenceSolutionsEvaluationsResults}
/>
)}
/>}

{!referenceSolutionsEvaluationsResults && (
{!referenceSolutionsEvaluationsResults &&
<HelpBlock>
<FormattedMessage
id="app.hardwareGroupFields.noReferenceSolutions"
defaultMessage="There are no reference solutions' evaluations' for test '{testName}' and its task '{taskId}'."
values={{ testName, taskId }}
/>
</HelpBlock>
)}
</HelpBlock>}
</div>
))}
)}
</Col>
))}
)}
</Row>
);
};
Expand Down
Loading

0 comments on commit ae88f7a

Please sign in to comment.