Skip to content

Commit

Permalink
Adding shadow assignments to students' group overviews at dashboard.
Browse files Browse the repository at this point in the history
  • Loading branch information
krulis-martin committed Oct 3, 2021
1 parent 1c4c6be commit 41e1539
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 25 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export { default } from './AssignmentTableRow';
export { default as LoadingAssignmentTableRow } from './LoadingAssignmentTableRow';
export { default as NoAssignmentTableRow } from './NoAssignmentTableRow';
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -113,7 +113,23 @@ class AssignmentsTable extends Component {
{someAssignmentsAreLoading ? (
<LoadingAssignmentTableRow colSpan={10} />
) : (
assignmentsPreprocessedAll.length === 0 && <NoAssignmentTableRow />
assignmentsPreprocessedAll.length === 0 && (
<tr>
<td className="text-center">
{showGroups ? (
<FormattedMessage
id="app.assignmentsTable.noAssignmentsInAnyGroup"
defaultMessage="This exercise has no assigments in any of the groups you can see."
/>
) : (
<FormattedMessage
id="app.assignmentsTable.noAssignments"
defaultMessage="There are no assignments yet."
/>
)}
</td>
</tr>
)
)}

{!someAssignmentsAreLoading &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const ShadowAssignmentsTable = ({
<tr>
<th className="shrink-col" />
<th>
<FormattedMessage id="generic.name" defaultMessage="Name" />
<FormattedMessage id="app.assignments.name" defaultMessage="Assignment name" />
</th>
<th>
<FormattedMessage id="generic.created" defaultMessage="Created" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 : (
<ResourceRenderer
resource={stats}
loading={
Expand Down Expand Up @@ -65,14 +72,15 @@ AssignmentsTableContainer.propTypes = {
groupId: PropTypes.string.isRequired,
userId: PropTypes.string,
onlyCurrent: PropTypes.bool,
hideEmpty: PropTypes.bool,
assignments: ImmutablePropTypes.list,
assignmentEnvironmentsSelector: PropTypes.func,
stats: ImmutablePropTypes.map,
loadAsync: PropTypes.func.isRequired,
};

export default connect(
(state, { groupId, userId = null }) => ({
(state, { groupId }) => ({
assignments: groupsAssignmentsSelector(state, groupId),
assignmentEnvironmentsSelector: assignmentEnvironmentsSelector(state),
stats: createGroupsStatsSelector(groupId)(state),
Expand Down
Original file line number Diff line number Diff line change
@@ -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 : (
<ResourceRenderer
resource={shadowAssignments}
loading={
<div className="text-center p-2">
<LoadingIcon gapRight />
<FormattedMessage id="generic.loading" defaultMessage="Loading..." />
</div>
}>
{() => (
<ShadowAssignmentsTable
shadowAssignments={shadowAssignments}
isAdmin={isGroupAdmin || isGroupSupervisor}
userId={userId}
/>
)}
</ResourceRenderer>
);
}
}

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);
2 changes: 2 additions & 0 deletions src/containers/ShadowAssignmentsTableContainer/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import ShadowAssignmentsTableContainer from './ShadowAssignmentsTableContainer';
export default ShadowAssignmentsTableContainer;
3 changes: 2 additions & 1 deletion src/locales/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -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. <a>Zobrazit vše.</a>",
"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í?",
Expand Down
3 changes: 2 additions & 1 deletion src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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. <a>Show all.</a>",
"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?",
Expand Down
6 changes: 5 additions & 1 deletion src/pages/Dashboard/Dashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -135,7 +136,10 @@ class Dashboard extends Component {
</div>
}
unlimitedHeight>
<AssignmentsTableContainer userId={user.id} groupId={groupId} onlyCurrent />
<>
<AssignmentsTableContainer userId={user.id} groupId={groupId} onlyCurrent hideEmpty />
<ShadowAssignmentsTableContainer userId={user.id} groupId={groupId} hideEmpty />
</>
</Box>
))}
</div>
Expand Down

0 comments on commit 41e1539

Please sign in to comment.