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