From 4b34acead0afdeee42f0a2ee58657c9592b5bb46 Mon Sep 17 00:00:00 2001
From: Petr Stefan
Date: Sat, 24 Feb 2018 15:23:49 +0100
Subject: [PATCH] Student stats visible to students
---
.../Groups/ResultsTable/ResultsTable.js | 25 +++--------
.../Groups/ResultsTable/ResultsTableRow.js | 42 ++++++++----------
.../Groups/StudentsView/StudentsView.js | 28 ++++++++++++
.../Groups/SupervisorsView/SupervisorsView.js | 21 ---------
.../ResultsTableContainer.js | 44 +++++++++----------
src/pages/Dashboard/Dashboard.js | 1 +
src/pages/Group/Group.js | 1 +
src/redux/modules/stats.js | 2 +-
8 files changed, 78 insertions(+), 86 deletions(-)
diff --git a/src/components/Groups/ResultsTable/ResultsTable.js b/src/components/Groups/ResultsTable/ResultsTable.js
index f078c3e5b..def1e4ee9 100644
--- a/src/components/Groups/ResultsTable/ResultsTable.js
+++ b/src/components/Groups/ResultsTable/ResultsTable.js
@@ -6,17 +6,15 @@ import { Link } from 'react-router';
import { FormattedMessage } from 'react-intl';
import ResultsTableRow from './ResultsTableRow';
-import LoadingResultsTableRow from './LoadingResultsTableRow';
import NoResultsAvailableRow from './NoResultsAvailableRow';
import withLinks from '../../../hoc/withLinks';
-import ResourceRenderer from '../../helpers/ResourceRenderer';
import { LocalizedExerciseName } from '../../helpers/LocalizedNames';
import styles from './ResultsTable.less';
const ResultsTable = ({
assignments = List(),
users = [],
- submissions,
+ stats,
links: { SUPERVISOR_STATS_URI_FACTORY }
}) => {
const assignmentsArray = assignments.sort(
@@ -53,21 +51,12 @@ const ResultsTable = ({
{users.length !== 0 &&
assignments.length !== 0 &&
users.map(user =>
- submissions[user.id][key]
- )}
- loading={}
- >
- {(...userSubmissions) =>
- }
-
+ userId={user.id}
+ assignmentsIds={assignmentsIds}
+ userStats={stats.find(stat => stat.userId === user.id)}
+ />
)}
@@ -77,7 +66,7 @@ const ResultsTable = ({
ResultsTable.propTypes = {
assignments: PropTypes.array.isRequired,
users: PropTypes.array.isRequired,
- submissions: PropTypes.object.isRequired,
+ stats: PropTypes.array.isRequired,
links: PropTypes.object
};
diff --git a/src/components/Groups/ResultsTable/ResultsTableRow.js b/src/components/Groups/ResultsTable/ResultsTableRow.js
index c8f64b7d1..96b7c9007 100644
--- a/src/components/Groups/ResultsTable/ResultsTableRow.js
+++ b/src/components/Groups/ResultsTable/ResultsTableRow.js
@@ -2,45 +2,41 @@ import React from 'react';
import PropTypes from 'prop-types';
import UsersNameContainer from '../../../containers/UsersNameContainer';
-const ResultsTableRow = ({ userId, assignmentsIds, submissions }) => {
- var totalPoints = 0;
+const ResultsTableRow = ({ userId, assignmentsIds, userStats }) => {
return (
|
{assignmentsIds.map(assignmentId => {
- const submission = submissions
- .filter(s => s !== null)
- .filter(s => s.exerciseAssignmentId === assignmentId)[0];
- const points =
- submission &&
- submission !== null &&
- submission.lastSubmission.evaluation &&
- Number.isInteger(submission.lastSubmission.evaluation.points)
- ? submission.lastSubmission.evaluation.points
- : '-';
- const bonusPoints =
- submission && submission !== null ? submission.bonusPoints : 0;
- totalPoints += points !== '-' ? points : 0;
- totalPoints += bonusPoints;
+ const assignmentData =
+ userStats && userStats.assignments
+ ? userStats.assignments.find(
+ assignment => assignment.id === assignmentId
+ )
+ : {};
return (
- {points}
- {bonusPoints > 0 &&
+ {assignmentData.points &&
+ Number.isInteger(assignmentData.points.gained)
+ ? assignmentData.points.gained
+ : '-'}
+ {assignmentData.points &&
+ assignmentData.points.bonus > 0 &&
- +{bonusPoints}
+ +{assignmentData.points.bonus}
}
- {bonusPoints < 0 &&
+ {assignmentData.points &&
+ assignmentData.points.bonus < 0 &&
- {bonusPoints}
+ {assignmentData.points.bonus}
}
|
);
})}
- {totalPoints}
+ {userStats && userStats.points ? userStats.points.gained : '-'}/{userStats && userStats.points ? userStats.points.total : '-'}
|
@@ -50,7 +46,7 @@ const ResultsTableRow = ({ userId, assignmentsIds, submissions }) => {
ResultsTableRow.propTypes = {
userId: PropTypes.string.isRequired,
assignmentsIds: PropTypes.array.isRequired,
- submissions: PropTypes.array.isRequired
+ userStats: PropTypes.object
};
export default ResultsTableRow;
diff --git a/src/components/Groups/StudentsView/StudentsView.js b/src/components/Groups/StudentsView/StudentsView.js
index 61d0bab82..9853802ff 100644
--- a/src/components/Groups/StudentsView/StudentsView.js
+++ b/src/components/Groups/StudentsView/StudentsView.js
@@ -9,6 +9,8 @@ import AssignmentsTable from '../../Assignments/Assignment/AssignmentsTable';
import StudentsListContainer from '../../../containers/StudentsListContainer';
import LeaveJoinGroupButtonContainer from '../../../containers/LeaveJoinGroupButtonContainer';
import { getLocalizedName } from '../../../helpers/getLocalizedData';
+import ResourceRenderer from '../../helpers/ResourceRenderer';
+import ResultsTableContainer from '../../../containers/ResultsTableContainer';
const StudentsView = ({
group,
@@ -16,6 +18,7 @@ const StudentsView = ({
assignments,
bestSubmissions,
isAdmin = false,
+ users,
intl: { locale }
}) =>
@@ -78,12 +81,37 @@ const StudentsView = ({
+
+
+
+ }
+ isOpen
+ unlimitedHeight
+ noPadding
+ >
+
+ {(...assignments) =>
+ }
+
+
+
+
;
StudentsView.propTypes = {
group: PropTypes.object.isRequired,
assignments: ImmutablePropTypes.list.isRequired,
statuses: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
+ users: PropTypes.array.isRequired,
isAdmin: PropTypes.bool,
bestSubmissions: PropTypes.object,
intl: PropTypes.shape({ locale: PropTypes.string.isRequired }).isRequired
diff --git a/src/components/Groups/SupervisorsView/SupervisorsView.js b/src/components/Groups/SupervisorsView/SupervisorsView.js
index b99fabc77..66b515f23 100644
--- a/src/components/Groups/SupervisorsView/SupervisorsView.js
+++ b/src/components/Groups/SupervisorsView/SupervisorsView.js
@@ -12,7 +12,6 @@ import AddStudent from '../AddStudent';
import SearchExercise from '../SearchExercise';
import AdminAssignmentsTable from '../../Assignments/AdminAssignmentsTable';
import ExercisesSimpleList from '../../../components/Exercises/ExercisesSimpleList';
-import ResultsTableContainer from '../../../containers/ResultsTableContainer';
import Button from '../../../components/widgets/FlatButton';
import { AddIcon, EditIcon, DeleteIcon } from '../../../components/icons';
import AssignExerciseButton from '../../../components/buttons/AssignExerciseButton';
@@ -45,26 +44,6 @@ const SupervisorsView = ({
-
-
-
- }
- isOpen
- unlimitedHeight
- noPadding
- >
-
- {(...assignments) =>
- }
-
-
-
-
user.id !== newProps.users[i].id)
- ) {
+ if (this.props.groupId !== newProps.groupId) {
this.props.loadAsync();
}
}
- static loadAsync = ({ users, assignments }, dispatch) => {
- assignments.map(assignment =>
- dispatch(fetchBestSubmissions(assignment.id))
- );
- };
+ static loadAsync = ({ groupId }, dispatch) =>
+ dispatch(fetchGroupsStats(groupId));
render() {
- const { users, assignments, submissions } = this.props;
+ const { users, assignments, stats } = this.props;
return (
-
+
+ {groupStats =>
+ }
+
);
}
}
@@ -41,16 +39,16 @@ class ResultsTableContainer extends Component {
ResultsTableContainer.propTypes = {
users: PropTypes.array.isRequired,
assignments: PropTypes.array.isRequired,
- submissions: PropTypes.object,
+ groupId: PropTypes.string.isRequired,
+ stats: PropTypes.object.isRequired,
loadAsync: PropTypes.func
};
export default connect(
- (state, { users, assignments }) => ({
- submissions: getBestSubmissionsAssoc(assignments, users)(state)
+ (state, { groupId }) => ({
+ stats: createGroupsStatsSelector(groupId)(state)
}),
- (dispatch, { users, assignments }) => ({
- loadAsync: () =>
- ResultsTableContainer.loadAsync({ users, assignments }, dispatch)
+ (dispatch, { groupId }) => ({
+ loadAsync: () => ResultsTableContainer.loadAsync({ groupId }, dispatch)
})
)(ResultsTableContainer);
diff --git a/src/pages/Dashboard/Dashboard.js b/src/pages/Dashboard/Dashboard.js
index 397fa482a..15c61eab6 100644
--- a/src/pages/Dashboard/Dashboard.js
+++ b/src/pages/Dashboard/Dashboard.js
@@ -258,6 +258,7 @@ class Dashboard extends Component {
}
+ unlimitedHeight
>
}