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 > }