From 41e1539e740cb075e7d38a956c09d9023adb0305 Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Wed, 29 Sep 2021 15:04:48 +0200 Subject: [PATCH] Adding shadow assignments to students' group overviews at dashboard. --- .../NoAssignmentTableRow.js | 15 ---- .../Assignment/AssignmentTableRow/index.js | 1 - .../AssignmentsTable/AssignmentsTable.js | 20 +++++- .../ShadowAssignmentsTable.js | 2 +- .../AssignmentsTableContainer.js | 14 +++- .../ShadowAssignmentsTableContainer.js | 68 +++++++++++++++++++ .../ShadowAssignmentsTableContainer/index.js | 2 + src/locales/cs.json | 3 +- src/locales/en.json | 3 +- src/pages/Dashboard/Dashboard.js | 6 +- 10 files changed, 109 insertions(+), 25 deletions(-) delete mode 100644 src/components/Assignments/Assignment/AssignmentTableRow/NoAssignmentTableRow.js create mode 100644 src/containers/ShadowAssignmentsTableContainer/ShadowAssignmentsTableContainer.js create mode 100644 src/containers/ShadowAssignmentsTableContainer/index.js diff --git a/src/components/Assignments/Assignment/AssignmentTableRow/NoAssignmentTableRow.js b/src/components/Assignments/Assignment/AssignmentTableRow/NoAssignmentTableRow.js deleted file mode 100644 index b7091a99f..000000000 --- a/src/components/Assignments/Assignment/AssignmentTableRow/NoAssignmentTableRow.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import { FormattedMessage } from 'react-intl'; - -const NoAssignmentTableRow = () => ( - - - - - -); - -export default NoAssignmentTableRow; diff --git a/src/components/Assignments/Assignment/AssignmentTableRow/index.js b/src/components/Assignments/Assignment/AssignmentTableRow/index.js index e4a006b77..df5737eb1 100644 --- a/src/components/Assignments/Assignment/AssignmentTableRow/index.js +++ b/src/components/Assignments/Assignment/AssignmentTableRow/index.js @@ -1,3 +1,2 @@ export { default } from './AssignmentTableRow'; export { default as LoadingAssignmentTableRow } from './LoadingAssignmentTableRow'; -export { default as NoAssignmentTableRow } from './NoAssignmentTableRow'; diff --git a/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js b/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js index 71fb21d5e..10347c0f9 100644 --- a/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js +++ b/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js @@ -5,7 +5,7 @@ import { Table, Modal } from 'react-bootstrap'; import { FormattedMessage, injectIntl } from 'react-intl'; import { isReady, isLoading, getJsData } from '../../../../redux/helpers/resourceManager'; -import AssignmentTableRow, { NoAssignmentTableRow, LoadingAssignmentTableRow } from '../AssignmentTableRow'; +import AssignmentTableRow, { LoadingAssignmentTableRow } from '../AssignmentTableRow'; import CommentThreadContainer from '../../../../containers/CommentThreadContainer'; import { compareAssignmentsReverted, isBeforeDeadline } from '../../../helpers/assignments'; import { LocalizedExerciseName } from '../../../helpers/LocalizedNames'; @@ -113,7 +113,23 @@ class AssignmentsTable extends Component { {someAssignmentsAreLoading ? ( ) : ( - assignmentsPreprocessedAll.length === 0 && + assignmentsPreprocessedAll.length === 0 && ( + + + {showGroups ? ( + + ) : ( + + )} + + + ) )} {!someAssignmentsAreLoading && diff --git a/src/components/Assignments/ShadowAssignment/ShadowAssignmentsTable/ShadowAssignmentsTable.js b/src/components/Assignments/ShadowAssignment/ShadowAssignmentsTable/ShadowAssignmentsTable.js index aeeb938f7..bc2c87ca0 100644 --- a/src/components/Assignments/ShadowAssignment/ShadowAssignmentsTable/ShadowAssignmentsTable.js +++ b/src/components/Assignments/ShadowAssignment/ShadowAssignmentsTable/ShadowAssignmentsTable.js @@ -23,7 +23,7 @@ const ShadowAssignmentsTable = ({ - + diff --git a/src/containers/AssignmentsTableContainer/AssignmentsTableContainer.js b/src/containers/AssignmentsTableContainer/AssignmentsTableContainer.js index 9b5b6e82d..e05c22b07 100644 --- a/src/containers/AssignmentsTableContainer/AssignmentsTableContainer.js +++ b/src/containers/AssignmentsTableContainer/AssignmentsTableContainer.js @@ -33,8 +33,15 @@ class AssignmentsTableContainer extends Component { } render() { - const { userId = null, assignments, assignmentEnvironmentsSelector, stats, onlyCurrent } = this.props; - return ( + const { + userId = null, + assignments, + assignmentEnvironmentsSelector, + stats, + onlyCurrent = false, + hideEmpty = false, + } = this.props; + return hideEmpty && assignments.size === 0 ? null : ( ({ + (state, { groupId }) => ({ assignments: groupsAssignmentsSelector(state, groupId), assignmentEnvironmentsSelector: assignmentEnvironmentsSelector(state), stats: createGroupsStatsSelector(groupId)(state), diff --git a/src/containers/ShadowAssignmentsTableContainer/ShadowAssignmentsTableContainer.js b/src/containers/ShadowAssignmentsTableContainer/ShadowAssignmentsTableContainer.js new file mode 100644 index 000000000..4e8fa59c9 --- /dev/null +++ b/src/containers/ShadowAssignmentsTableContainer/ShadowAssignmentsTableContainer.js @@ -0,0 +1,68 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; +import { FormattedMessage } from 'react-intl'; + +import ShadowAssignmentsTable from '../../components/Assignments/ShadowAssignment/ShadowAssignmentsTable'; +import ResourceRenderer from '../../components/helpers/ResourceRenderer'; +import { LoadingIcon } from '../../components/icons'; + +import { fetchShadowAssignmentsForGroup } from '../../redux/modules/shadowAssignments'; +import { groupsShadowAssignmentsSelector } from '../../redux/selectors/groups'; +import { loggedUserIsSupervisorOfSelector, loggedUserIsAdminOfSelector } from '../../redux/selectors/usersGroups'; + +class ShadowAssignmentsTableContainer extends Component { + componentDidMount() { + this.props.loadAsync(); + } + + componentDidUpdate(prevProps) { + if (this.props.groupId !== prevProps.groupId || this.props.userId !== prevProps.userId) { + this.props.loadAsync(); + } + } + + render() { + const { userId, shadowAssignments, isGroupAdmin, isGroupSupervisor, hideEmpty = false } = this.props; + return hideEmpty && shadowAssignments.size === 0 ? null : ( + + + + + }> + {() => ( + + )} + + ); + } +} + +ShadowAssignmentsTableContainer.propTypes = { + groupId: PropTypes.string.isRequired, + userId: PropTypes.string.isRequired, + hideEmpty: PropTypes.bool, + shadowAssignments: ImmutablePropTypes.list, + isGroupAdmin: PropTypes.bool, + isGroupSupervisor: PropTypes.bool, + loadAsync: PropTypes.func.isRequired, +}; + +export default connect( + (state, { groupId }) => ({ + shadowAssignments: groupsShadowAssignmentsSelector(state, groupId), + isGroupSupervisor: loggedUserIsSupervisorOfSelector(state)(groupId), + isGroupAdmin: loggedUserIsAdminOfSelector(state)(groupId), + }), + (dispatch, { groupId, userId = null }) => ({ + loadAsync: () => dispatch(fetchShadowAssignmentsForGroup(groupId)), + }) +)(ShadowAssignmentsTableContainer); diff --git a/src/containers/ShadowAssignmentsTableContainer/index.js b/src/containers/ShadowAssignmentsTableContainer/index.js new file mode 100644 index 000000000..316cef534 --- /dev/null +++ b/src/containers/ShadowAssignmentsTableContainer/index.js @@ -0,0 +1,2 @@ +import ShadowAssignmentsTableContainer from './ShadowAssignmentsTableContainer'; +export default ShadowAssignmentsTableContainer; diff --git a/src/locales/cs.json b/src/locales/cs.json index 555a1e165..132c6dd0e 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -144,7 +144,8 @@ "app.assignments.points": "Body", "app.assignments.secondDeadline": "Druhý termín", "app.assignments.showHiddenPastAssignments": "Celkem {count} {count, plural, one {zadaná úloha byla skryta} =2 {zadané úlohy byly skryty} =3 {zadané úlohy byly skryty} =4 {zadané úlohy byly skryty} other {zadaných úloh bylo skryto}}, protože {count, plural, one {má termín} other {mají termíny}} v minulosti. Zobrazit vše.", - "app.assignmentsTable.noAssignments": "Tato úloha není zadána v žádné vámi viditelné skupině.", + "app.assignmentsTable.noAssignments": "Zatím zde nejsou žádné zadné úlohy.", + "app.assignmentsTable.noAssignmentsInAnyGroup": "Tato úloha není zadána v žádné vámi viditelné skupině.", "app.assignmentsTableRow.loading": "Načítají se zadané úlohy...", "app.asyncJobs.abort": "Zrušit asynchronní úkol", "app.asyncJobs.list.abortConfirm": "Opravdu si přejete zrušit daný úkol spouštěný na pozadí?", diff --git a/src/locales/en.json b/src/locales/en.json index 67e2452f8..b199e0252 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -144,7 +144,8 @@ "app.assignments.points": "Points", "app.assignments.secondDeadline": "Second deadline", "app.assignments.showHiddenPastAssignments": "There are {count} hidden {count, plural, one {assignment} other {assignments}} which {count, plural, one {has} other {have}} pass the deadline. Show all.", - "app.assignmentsTable.noAssignments": "This exercise has no assigments in any of the groups you can see.", + "app.assignmentsTable.noAssignments": "There are no assignments yet.", + "app.assignmentsTable.noAssignmentsInAnyGroup": "This exercise has no assigments in any of the groups you can see.", "app.assignmentsTableRow.loading": "Loading assignments...", "app.asyncJobs.abort": "Abort background job", "app.asyncJobs.list.abortConfirm": "Do you really wish to abort selected background job?", diff --git a/src/pages/Dashboard/Dashboard.js b/src/pages/Dashboard/Dashboard.js index 79a1d1cd5..6578f881a 100644 --- a/src/pages/Dashboard/Dashboard.js +++ b/src/pages/Dashboard/Dashboard.js @@ -15,6 +15,7 @@ import StudentsListContainer from '../../containers/StudentsListContainer'; import FetchManyResourceRenderer from '../../components/helpers/FetchManyResourceRenderer'; import GroupsNameContainer from '../../containers/GroupsNameContainer'; import AssignmentsTableContainer from '../../containers/AssignmentsTableContainer'; +import ShadowAssignmentsTableContainer from '../../containers/ShadowAssignmentsTableContainer'; import { fetchUserIfNeeded } from '../../redux/modules/users'; import { fetchAllGroups } from '../../redux/modules/groups'; @@ -135,7 +136,10 @@ class Dashboard extends Component { } unlimitedHeight> - + <> + + + ))}