From c2380f985200e64ed3b6ec88d0ed8a7b17fd38d2 Mon Sep 17 00:00:00 2001
From: Martin Krulis
Date: Mon, 12 Feb 2018 01:11:49 +0100
Subject: [PATCH] Fixing bug and improving SIS course containers (so that
teaching students can see both containers).
---
.../SisIntegrationContainer.js | 276 ++++++------
.../SisSupervisorGroupsContainer.js | 413 +++++++++---------
src/locales/cs.json | 50 ++-
src/locales/en.json | 50 ++-
src/pages/Dashboard/Dashboard.js | 2 +-
5 files changed, 463 insertions(+), 328 deletions(-)
diff --git a/src/containers/SisIntegrationContainer/SisIntegrationContainer.js b/src/containers/SisIntegrationContainer/SisIntegrationContainer.js
index a5d5c4115..39b9cf0cf 100644
--- a/src/containers/SisIntegrationContainer/SisIntegrationContainer.js
+++ b/src/containers/SisIntegrationContainer/SisIntegrationContainer.js
@@ -2,21 +2,24 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { FormattedMessage, injectIntl } from 'react-intl';
-import Box from '../../components/widgets/Box';
-import { Table } from 'react-bootstrap';
-import Button from '../../components/widgets/FlatButton';
import { LinkContainer } from 'react-router-bootstrap';
import Icon from 'react-fontawesome';
+import { Table } from 'react-bootstrap';
+import Box from '../../components/widgets/Box';
+import Button from '../../components/widgets/FlatButton';
-import UsersNameContainer from '../UsersNameContainer';
+import { fetchGroupsIfNeeded } from '../../redux/modules/groups';
import { fetchSisStatusIfNeeded } from '../../redux/modules/sisStatus';
import { fetchSisSubscribedGroups } from '../../redux/modules/sisSubscribedGroups';
import { sisStateSelector } from '../../redux/selectors/sisStatus';
import { sisSubscribedGroupsSelector } from '../../redux/selectors/sisSubscribedGroups';
import { loggedInUserIdSelector } from '../../redux/selectors/auth';
-import ResourceRenderer from '../../components/helpers/ResourceRenderer';
+import { groupDataAccessorSelector } from '../../redux/selectors/groups';
+
+import UsersNameContainer from '../UsersNameContainer';
import LeaveJoinGroupButtonContainer from '../LeaveJoinGroupButtonContainer';
-import { getLocalizedName } from '../../helpers/getLocalizedData';
+import { getGroupCanonicalLocalizedName } from '../../helpers/getLocalizedData';
+import ResourceRenderer from '../../components/helpers/ResourceRenderer';
import withLinks from '../../hoc/withLinks';
@@ -25,7 +28,7 @@ class SisIntegrationContainer extends Component {
this.props.loadData(this.props.currentUserId);
}
- static loadData = (dispatch, loggedInUserId) => {
+ static loadData = (dispatch, loggedInUserId) =>
dispatch(fetchSisStatusIfNeeded())
.then(res => res.value)
.then(
@@ -33,15 +36,26 @@ class SisIntegrationContainer extends Component {
accessible &&
terms.map(({ year, term }) =>
dispatch(fetchSisSubscribedGroups(loggedInUserId, year, term))
+ .then(res => res.value)
+ .then(groups =>
+ groups
+ .filter(
+ group =>
+ group.parentGroupsIds && group.parentGroupsIds.length > 0
+ )
+ .map(group =>
+ dispatch(fetchGroupsIfNeeded(...group.parentGroupsIds))
+ )
+ )
)
);
- };
render() {
const {
sisStatus,
currentUserId,
sisGroups,
+ groupsAccessor,
links: { GROUP_URI_FACTORY },
intl: { locale }
} = this.props;
@@ -49,127 +63,139 @@ class SisIntegrationContainer extends Component {
}
collapsable
- noPadding
- isOpen
+ unlimitedHeight
+ isOpen={false}
>
-
- {sisStatus =>
-
- {!sisStatus.accessible &&
-
-
-
}
- {sisStatus.accessible &&
- sisStatus.terms.map((term, i) =>
-
-
- {' '}
- {`${term.year}-${term.term}`}
-
-
- {groups =>
-
- {groups && groups.length > 0
- ?
-
-
-
-
- |
-
-
- |
-
+
+
+
+
+
+ {sisStatus =>
+
+ {!sisStatus.accessible &&
+
+
+ }
+ {sisStatus.accessible &&
+ sisStatus.terms.map((term, i) =>
+
+
+ {' '}
+ {`${term.year}-${term.term}`}
+
+
+ {groups =>
+
+ {groups && groups.length > 0
+ ?
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+ |
+
+
+
+ {groups &&
+ groups.map((group, i) =>
+
+
+ {getGroupCanonicalLocalizedName(
+ group,
+ groupsAccessor,
+ locale
+ )}
+ |
+
+
+ {group.sisCode}
+
+ |
+
+ {group.primaryAdminsIds.map(id =>
+
+ )}
+ |
+
+
+
+
+
+
+
+ |
+
+ )}
+
+
+ : |
- |
-
-
-
- {groups &&
- groups.map((group, i) =>
-
-
- {getLocalizedName(group, locale)}
- |
-
-
- {group.sisCode}
-
- |
-
- {group.primaryAdminsIds.map(id =>
-
- )}
- |
-
-
-
-
-
-
-
- |
-
- )}
-
-
- :
}
-
}
-
-
- )}
-
}
-
+
+
+ }
+ }
+
+
+ )}
+ }
+
+
);
}
@@ -180,6 +206,7 @@ SisIntegrationContainer.propTypes = {
currentUserId: PropTypes.string,
loadData: PropTypes.func.isRequired,
sisGroups: PropTypes.func.isRequired,
+ groupsAccessor: PropTypes.func.isRequired,
links: PropTypes.object,
intl: PropTypes.shape({ locale: PropTypes.string.isRequired }).isRequired
};
@@ -192,7 +219,8 @@ export default withLinks(
sisStatus: sisStateSelector(state),
currentUserId,
sisGroups: (year, term) =>
- sisSubscribedGroupsSelector(currentUserId, year, term)(state)
+ sisSubscribedGroupsSelector(currentUserId, year, term)(state),
+ groupsAccessor: groupDataAccessorSelector(state)
};
},
dispatch => ({
diff --git a/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js b/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js
index a38787407..815657e2f 100644
--- a/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js
+++ b/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js
@@ -104,219 +104,230 @@ class SisSupervisorGroupsContainer extends Component {
}
collapsable
- noPadding
unlimitedHeight
isOpen={false}
>
-
- {sisStatus =>
-
- {!sisStatus.accessible &&
-
-
-
}
- {sisStatus.accessible &&
- sisStatus.terms.map((term, i) =>
-
-
- {' '}
- {`${term.year}-${term.term}`}
-
-
- {courses =>
-
- {courses && Object.keys(courses).length > 0
- ?
- {Object.values(courses).map((course, i) =>
-
-
- {course.groups.length > 0 &&
- }
-
- {getLocalizedData(
- course.course.captions,
- locale
- )}{' '}
- ({course.course.code}
){' '}
+
+
+
+
+
+ {sisStatus =>
+
+ {!sisStatus.accessible &&
+
+
+
}
+ {sisStatus.accessible &&
+ sisStatus.terms.map((term, i) =>
+
+
+ {' '}
+ {`${term.year}-${term.term}`}
+
+
+ {courses =>
+
+ {courses && Object.keys(courses).length > 0
+ ?
+ {Object.values(courses).map((course, i) =>
+
+
+ {course.groups.length > 0 &&
+ }
+
+ {getLocalizedData(
+ course.course.captions,
+ locale
+ )}{' '}
+ ({course.course.code}
){' '}
+
-
-
- {
- getLocalizedData(days, locale)[
- course.course.dayOfWeek
- ]
- }{' '}
- {course.course.time}{' '}
- {course.course.fortnightly
- ? getLocalizedData(oddEven, locale)[
- course.course.oddWeeks ? 0 : 1
+
+ {
+ getLocalizedData(days, locale)[
+ course.course.dayOfWeek
]
- : ''}
+ }{' '}
+ {course.course.time}{' '}
+ {course.course.fortnightly
+ ? getLocalizedData(
+ oddEven,
+ locale
+ )[
+ course.course.oddWeeks ? 0 : 1
+ ]
+ : ''}
+
-
- }
- eventKey={i}
- bsStyle={
- course.course.type === 'lecture'
- ? 'info'
- : 'success'
- }
- >
- {course.groups.length > 0
- ?
-
-
-
-
- |
-
+ }
+ eventKey={i}
+ bsStyle={
+ course.course.type === 'lecture'
+ ? 'info'
+ : 'success'
+ }
+ >
+ {course.groups.length > 0
+ ?
+
+
+
+
+ |
+
+
+ |
+ |
+
+
+
+ {course.groups.map((group, i) =>
+
+
+ {getGroupCanonicalLocalizedName(
+ group,
+ groupsAccessor,
+ locale
+ )}
+ |
+
+ {group.primaryAdminsIds.map(
+ id =>
+
+ )}
+ |
+
+
+
+
+
+
+ |
+
+ )}
+
+
+ : |
- |
-
-
-
- {course.groups.map((group, i) =>
-
-
- {getGroupCanonicalLocalizedName(
- group,
- groupsAccessor,
- locale
- )}
- |
-
- {group.primaryAdminsIds.map(
- id =>
-
- )}
- |
-
-
-
-
-
-
- |
-
- )}
-
-
- : }
-
-
-
- {possibleParents =>
-
- createGroup(
- course.course.code,
- data,
- currentUserId,
- term.year,
- term.term
- )}
- groups={possibleParents}
- groupsAccessor={groupsAccessor}
- />}
-
-
-
-
- bindGroup(
- course.course.code,
- data,
- currentUserId,
- term.year,
- term.term
+
+
+
}
+
+
+
-
-
-
- )}
-
- : }
- }
-
-
- )}
- }
-
+ >
+ {possibleParents =>
+
+ createGroup(
+ course.course.code,
+ data,
+ currentUserId,
+ term.year,
+ term.term
+ )}
+ groups={possibleParents}
+ groupsAccessor={groupsAccessor}
+ />}
+
+
+
+
+ bindGroup(
+ course.course.code,
+ data,
+ currentUserId,
+ term.year,
+ term.term
+ )}
+ groups={groups}
+ groupsAccessor={groupsAccessor}
+ />
+
+
+
+ )}
+
+ :
}
+
}
+
+
+ )}
+
}
+
+
);
}
diff --git a/src/locales/cs.json b/src/locales/cs.json
index e8907b65c..4db9ca115 100644
--- a/src/locales/cs.json
+++ b/src/locales/cs.json
@@ -18,6 +18,16 @@
"app.addLicence.validation.note": "Popis nemůže být prázdný.",
"app.addLicence.validation.validUntilEmpty": "Konec platnosti licence musí být nastaven.",
"app.addLicence.validation.validUntilInThePast": "Platnost licence musí být v budoucnosti.",
+ "app.addSisTermForm.failed": "Cannot save the new SIS term.",
+ "app.addSisTermForm.processing": "Saving ...",
+ "app.addSisTermForm.submit": "Save new term",
+ "app.addSisTermForm.success": "The term is saved.",
+ "app.addSisTermForm.summer": "Summer term",
+ "app.addSisTermForm.term": "Term:",
+ "app.addSisTermForm.title": "Add new term",
+ "app.addSisTermForm.validation.year": "The year must be an integer.",
+ "app.addSisTermForm.winter": "Winter term",
+ "app.addSisTermForm.year": "Year:",
"app.additionalExerciseFilesTable.description": "Additional exercise files are files which can be used within exercise description using links provided below. Additional files can be viewed or downloaded by students.",
"app.additionalExerciseFilesTable.title": "Additional exercise files",
"app.additionalFiles.deleteButton": "Delete",
@@ -150,7 +160,10 @@
"app.createGroup.validation.thresholdBetweenZeroHundred": "Procentuální hranice musí být celé číslo od 0 do 100.",
"app.createGroup.validation.thresholdMustBeInteger": "Procentuální hranice musí být celé číslo.",
"app.createGroupForm.validation.noLocalizedText": "Please add at least one localized text describing the group.",
- "app.dashboard.sisGroups": "SIS groups with ReCodEx mapping",
+ "app.dashboard.sisGroupsStudent": "SIS Courses - Student",
+ "app.dashboard.sisGroupsStudentExplain": "SIS courses you are enrolled to in particular semesters and which have correspondig groups in ReCodEx.",
+ "app.dashboard.sisGroupsTeacher": "SIS Courses - Teacher",
+ "app.dashboard.sisGroupsTeacherExplain": "SIS courses you teach in particular semesters and which have mapping to ReCodEx. You may create new groups with binding or bind existing groups to these courses.",
"app.dashboard.studentOf": "Skupiny kde jste studentem",
"app.dashboard.supervisorOf": "Skupiny kde jste cvičícím",
"app.deleteButton.confirm": "Opravdu toto chcete smazat? Tato operace nemůže být vrácena.",
@@ -386,6 +399,18 @@
"app.editSimpleLimitsForm.success": "Limity uloženy.",
"app.editSimpleLimitsForm.validating": "Validuji ...",
"app.editSimpleLimitsForm.validation.timeSum": "Součet časových limitů ({sum}) překračuje povolené maximum ({max}).",
+ "app.editSisTerm.advertiseUntil": "Advertise this term to students until:",
+ "app.editSisTerm.beginning": "Beginning of the term:",
+ "app.editSisTerm.close": "Close",
+ "app.editSisTerm.end": "End of the term:",
+ "app.editSisTerm.save": "Save",
+ "app.editSisTerm.saving": "Saving ...",
+ "app.editSisTerm.successs": "Saved",
+ "app.editSisTerm.title": "Edit SIS Term",
+ "app.editSisTerm.validation.advertiseInLimits": "The term can be advertised only in its period.",
+ "app.editSisTerm.validation.noAdvertiseUntil": "End date of advertising the term is required.",
+ "app.editSisTerm.validation.noBeginning": "Start of the term is required.",
+ "app.editSisTerm.validation.noEnd": "End of the term is required.",
"app.editTestsForm.failed": "Ukládání selhalo. Prosím, opakujte akci později.",
"app.editTestsForm.isUniform": "Použít rovnoměrné rozdělení bodů mezi testy.",
"app.editTestsForm.reset": "Obnovit původní",
@@ -502,6 +527,7 @@
"app.exercise.referenceSolutionTitle": "Přehled referenčního řešení",
"app.exercise.referenceSolutionsBox": "Referenční řešení",
"app.exercise.runtimes": "Podporovaná běhová prostředí:",
+ "app.exercise.title": "Exercise",
"app.exercise.updatedAt": "Naposledy změněno:",
"app.exercise.uploadReferenceSolutionBox": "Vytvořit referenční řešení",
"app.exercise.version": "Verze:",
@@ -638,10 +664,13 @@
"app.failedSubmissionDetail.title": "Načtení vyhodnocení úlohy se nezdařilo",
"app.failureList.headCreatedAt": "Created at",
"app.failureList.headDescription": "Description",
+ "app.failureList.headLink": "Link",
"app.failureList.headResolutionNote": "Resolution note",
"app.failureList.headResolvedAt": "Resolved at",
"app.failureList.headType": "Type",
"app.failureList.noFailures": "There are no failures in this list.",
+ "app.failureListItem.referenceAssignment": "Reference assignment",
+ "app.failureListItem.studentAssignment": "Student assignment",
"app.faq.description": "ReCodEx FAQ",
"app.faq.title": "FAQ",
"app.feedbackAndBugs.contribution": "If you are interested in frontend web development, feel free to fix the bug itself and send a pull request! Any help will be much appreciated!",
@@ -655,6 +684,7 @@
"app.fields.limits.memory": "Paměť [KiB]:",
"app.fields.limits.time": "Čas [s]:",
"app.filesTable.addFiles": "Save files",
+ "app.filesTable.downloadArchive": "Download all",
"app.filesTable.empty": "There are no uploaded files yet.",
"app.filesTable.title": "Attached files",
"app.footer.copyright": "Copyright © 2016-2017 ReCodEx. Všechna práva vyhrazena.",
@@ -937,6 +967,7 @@
"app.search.title": "Hledat:",
"app.sidebar.menu.admin.failures": "Submission Failures",
"app.sidebar.menu.admin.instances": "Instance",
+ "app.sidebar.menu.admin.sis": "SIS Integration",
"app.sidebar.menu.admin.users": "Uživatelé",
"app.sidebar.menu.createAccount": "Zaregistrovat se",
"app.sidebar.menu.dashboard": "Přehled",
@@ -963,11 +994,17 @@
"app.sisCreateGroupForm.success": "The group was created.",
"app.sisCreateGroupForm.title": "Create ReCodEx group from SIS",
"app.sisIntegration.courseId": "Course ID",
+ "app.sisIntegration.deleteButton": "Delete",
+ "app.sisIntegration.deleteConfirm": "Are you sure you want to delete the SIS term?",
+ "app.sisIntegration.description": "Integration with university SIS system",
+ "app.sisIntegration.editButton": "Edit",
"app.sisIntegration.groupAdmins": "Group Administrators",
"app.sisIntegration.groupDetail": "See group's page",
"app.sisIntegration.groupName": "Name",
+ "app.sisIntegration.list": "SIS Terms",
"app.sisIntegration.noAccessible": "Your account does not support SIS integration. Please, log in using CAS-UK.",
"app.sisIntegration.noSisGroups": "Currently there are no ReCodEx groups matching your SIS subjects for this time period.",
+ "app.sisIntegration.title": "SIS Integration",
"app.sisIntegration.yearTerm": "Year and term:",
"app.sisSupervisor.groupAdmins": "Group Administrators",
"app.sisSupervisor.groupDetail": "See group's page",
@@ -975,6 +1012,8 @@
"app.sisSupervisor.noAccessible": "Your account does not support SIS integration. Please, log in using CAS-UK.",
"app.sisSupervisor.noSisGroups": "Currently there are no ReCodEx groups matching this SIS lecture.",
"app.sisSupervisor.yearTerm": "Year and term:",
+ "app.solutionArchiveInfoBox.description": "All submitted source files in one ZIP archive",
+ "app.solutionArchiveInfoBox.title": "Solution archive",
"app.sourceCodeViewer.downloadButton": "Stáhnout soubor",
"app.sourceCodeViewer.incompleteWarning": "Zdrojový soubor je příliš velký, a proto zde nemůže být zobrazen. Použijte tlačítko 'Stáhnout soubor', pokud si jej chcete prohlédnout celý.",
"app.sourceCodeViewer.loading": "Načítání ...",
@@ -1015,6 +1054,7 @@
"app.submissionFailures.resolveSaving": "Saving ...",
"app.submissionFailures.resolveSuccesss": "Saved",
"app.submissionFailures.resolveTitle": "Resolve Failure",
+ "app.submissionFailures.sendEmail": "Send email",
"app.submissionFailures.title": "Submission Failures",
"app.submissionStatus.accepted": "Toto řešení bylo připnuto cvičícím.",
"app.submissions.testResultsTable.correctness": "Správnost odevzdaného řešení (rozhodnutí sudího)",
@@ -1074,6 +1114,14 @@
"app.tabbedArrayField.empty": "Nyní zde není žádná položka.",
"app.tabbedArrayField.reallyRemoveQuestion": "Opravdu chcete tuto položku odstranit?",
"app.tabbedArrayField.remove": "Odstranit",
+ "app.termsList.advertiseUntil": "Advertise Until",
+ "app.termsList.end": "End",
+ "app.termsList.noTerms": "There are no SIS terms in this list.",
+ "app.termsList.start": "Start",
+ "app.termsList.summer": "Summer",
+ "app.termsList.term": "Term",
+ "app.termsList.winter": "Winter",
+ "app.termsList.year": "Year",
"app.user.description": "Postup uživatele ve všech skupinách.",
"app.user.examineGroupsInstance": "Najít své skupiny",
"app.user.groupDetail": "Přejít na detail skupiny",
diff --git a/src/locales/en.json b/src/locales/en.json
index 74a415da5..e7078f95c 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -18,6 +18,16 @@
"app.addLicence.validation.note": "Note cannot be empty.",
"app.addLicence.validation.validUntilEmpty": "End of licence's valid period must be set.",
"app.addLicence.validation.validUntilInThePast": "End of licence's valid period must be in the future.",
+ "app.addSisTermForm.failed": "Cannot save the new SIS term.",
+ "app.addSisTermForm.processing": "Saving ...",
+ "app.addSisTermForm.submit": "Save new term",
+ "app.addSisTermForm.success": "The term is saved.",
+ "app.addSisTermForm.summer": "Summer term",
+ "app.addSisTermForm.term": "Term:",
+ "app.addSisTermForm.title": "Add new term",
+ "app.addSisTermForm.validation.year": "The year must be an integer.",
+ "app.addSisTermForm.winter": "Winter term",
+ "app.addSisTermForm.year": "Year:",
"app.additionalExerciseFilesTable.description": "Additional exercise files are files which can be used within exercise description using links provided below. Additional files can be viewed or downloaded by students.",
"app.additionalExerciseFilesTable.title": "Additional exercise files",
"app.additionalFiles.deleteButton": "Delete",
@@ -150,7 +160,10 @@
"app.createGroup.validation.thresholdBetweenZeroHundred": "Threshold must be an integer in between 0 and 100.",
"app.createGroup.validation.thresholdMustBeInteger": "Threshold must be an integer.",
"app.createGroupForm.validation.noLocalizedText": "Please add at least one localized text describing the group.",
- "app.dashboard.sisGroups": "SIS groups with ReCodEx mapping",
+ "app.dashboard.sisGroupsStudent": "SIS Courses - Student",
+ "app.dashboard.sisGroupsStudentExplain": "SIS courses you are enrolled to in particular semesters and which have correspondig groups in ReCodEx.",
+ "app.dashboard.sisGroupsTeacher": "SIS Courses - Teacher",
+ "app.dashboard.sisGroupsTeacherExplain": "SIS courses you teach in particular semesters and which have mapping to ReCodEx. You may create new groups with binding or bind existing groups to these courses.",
"app.dashboard.studentOf": "Groups you are student of",
"app.dashboard.supervisorOf": "Groups you supervise",
"app.deleteButton.confirm": "Are you sure you want to delete the resource? This cannot be undone.",
@@ -386,6 +399,18 @@
"app.editSimpleLimitsForm.success": "Limits Saved",
"app.editSimpleLimitsForm.validating": "Validating ...",
"app.editSimpleLimitsForm.validation.timeSum": "The sum of time limits ({sum}) exceeds allowed maximum ({max}).",
+ "app.editSisTerm.advertiseUntil": "Advertise this term to students until:",
+ "app.editSisTerm.beginning": "Beginning of the term:",
+ "app.editSisTerm.close": "Close",
+ "app.editSisTerm.end": "End of the term:",
+ "app.editSisTerm.save": "Save",
+ "app.editSisTerm.saving": "Saving ...",
+ "app.editSisTerm.successs": "Saved",
+ "app.editSisTerm.title": "Edit SIS Term",
+ "app.editSisTerm.validation.advertiseInLimits": "The term can be advertised only in its period.",
+ "app.editSisTerm.validation.noAdvertiseUntil": "End date of advertising the term is required.",
+ "app.editSisTerm.validation.noBeginning": "Start of the term is required.",
+ "app.editSisTerm.validation.noEnd": "End of the term is required.",
"app.editTestsForm.failed": "Saving failed. Please try again later.",
"app.editTestsForm.isUniform": "Using uniform point distribution for all tests",
"app.editTestsForm.reset": "Reset",
@@ -502,6 +527,7 @@
"app.exercise.referenceSolutionTitle": "Reference solution overview",
"app.exercise.referenceSolutionsBox": "Reference solutions",
"app.exercise.runtimes": "Supported runtime environments:",
+ "app.exercise.title": "Exercise",
"app.exercise.updatedAt": "Last updated at:",
"app.exercise.uploadReferenceSolutionBox": "Create reference solution",
"app.exercise.version": "Version:",
@@ -638,10 +664,13 @@
"app.failedSubmissionDetail.title": "Cannot load evaluation of the solution",
"app.failureList.headCreatedAt": "Created at",
"app.failureList.headDescription": "Description",
+ "app.failureList.headLink": "Link",
"app.failureList.headResolutionNote": "Resolution note",
"app.failureList.headResolvedAt": "Resolved at",
"app.failureList.headType": "Type",
"app.failureList.noFailures": "There are no failures in this list.",
+ "app.failureListItem.referenceAssignment": "Reference assignment",
+ "app.failureListItem.studentAssignment": "Student assignment",
"app.faq.description": "ReCodEx FAQ",
"app.faq.title": "FAQ",
"app.feedbackAndBugs.contribution": "If you are interested in frontend web development, feel free to fix the bug itself and send a pull request! Any help will be much appreciated!",
@@ -655,6 +684,7 @@
"app.fields.limits.memory": "Memory [KiB]:",
"app.fields.limits.time": "Time [s]:",
"app.filesTable.addFiles": "Save files",
+ "app.filesTable.downloadArchive": "Download all",
"app.filesTable.empty": "There are no uploaded files yet.",
"app.filesTable.title": "Attached files",
"app.footer.copyright": "Copyright © 2016-2017 ReCodEx. All rights reserved.",
@@ -937,6 +967,7 @@
"app.search.title": "Search:",
"app.sidebar.menu.admin.failures": "Submission Failures",
"app.sidebar.menu.admin.instances": "Instances",
+ "app.sidebar.menu.admin.sis": "SIS Integration",
"app.sidebar.menu.admin.users": "Users",
"app.sidebar.menu.createAccount": "Create account",
"app.sidebar.menu.dashboard": "Dashboard",
@@ -963,11 +994,17 @@
"app.sisCreateGroupForm.success": "The group was created.",
"app.sisCreateGroupForm.title": "Create ReCodEx group from SIS",
"app.sisIntegration.courseId": "Course ID",
+ "app.sisIntegration.deleteButton": "Delete",
+ "app.sisIntegration.deleteConfirm": "Are you sure you want to delete the SIS term?",
+ "app.sisIntegration.description": "Integration with university SIS system",
+ "app.sisIntegration.editButton": "Edit",
"app.sisIntegration.groupAdmins": "Group Administrators",
"app.sisIntegration.groupDetail": "See group's page",
"app.sisIntegration.groupName": "Name",
+ "app.sisIntegration.list": "SIS Terms",
"app.sisIntegration.noAccessible": "Your account does not support SIS integration. Please, log in using CAS-UK.",
"app.sisIntegration.noSisGroups": "Currently there are no ReCodEx groups matching your SIS subjects for this time period.",
+ "app.sisIntegration.title": "SIS Integration",
"app.sisIntegration.yearTerm": "Year and term:",
"app.sisSupervisor.groupAdmins": "Group Administrators",
"app.sisSupervisor.groupDetail": "See group's page",
@@ -975,6 +1012,8 @@
"app.sisSupervisor.noAccessible": "Your account does not support SIS integration. Please, log in using CAS-UK.",
"app.sisSupervisor.noSisGroups": "Currently there are no ReCodEx groups matching this SIS lecture.",
"app.sisSupervisor.yearTerm": "Year and term:",
+ "app.solutionArchiveInfoBox.description": "All submitted source files in one ZIP archive",
+ "app.solutionArchiveInfoBox.title": "Solution archive",
"app.sourceCodeViewer.downloadButton": "Download file",
"app.sourceCodeViewer.incompleteWarning": "The selected source file is too large. Only a leading part of the file is displayed here. Use the download button to get the whole file.",
"app.sourceCodeViewer.loading": "Loading ...",
@@ -1015,6 +1054,7 @@
"app.submissionFailures.resolveSaving": "Saving ...",
"app.submissionFailures.resolveSuccesss": "Saved",
"app.submissionFailures.resolveTitle": "Resolve Failure",
+ "app.submissionFailures.sendEmail": "Send email",
"app.submissionFailures.title": "Submission Failures",
"app.submissionStatus.accepted": "This solution was marked by one of the supervisors as accepted.",
"app.submissions.testResultsTable.correctness": "Correctness of the result (verdict of the judge)",
@@ -1074,6 +1114,14 @@
"app.tabbedArrayField.empty": "There is currently no item.",
"app.tabbedArrayField.reallyRemoveQuestion": "Do you really want to delete this item?",
"app.tabbedArrayField.remove": "Remove",
+ "app.termsList.advertiseUntil": "Advertise Until",
+ "app.termsList.end": "End",
+ "app.termsList.noTerms": "There are no SIS terms in this list.",
+ "app.termsList.start": "Start",
+ "app.termsList.summer": "Summer",
+ "app.termsList.term": "Term",
+ "app.termsList.winter": "Winter",
+ "app.termsList.year": "Year",
"app.user.description": "All of the user's progress in all groups.",
"app.user.examineGroupsInstance": "Find your groups",
"app.user.groupDetail": "Show group's detail",
diff --git a/src/pages/Dashboard/Dashboard.js b/src/pages/Dashboard/Dashboard.js
index 636b17dd7..0befdcb60 100644
--- a/src/pages/Dashboard/Dashboard.js
+++ b/src/pages/Dashboard/Dashboard.js
@@ -197,7 +197,7 @@ class Dashboard extends Component {
}
- {student && }
+
{studentOf.size > 0 &&