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 - ? - - - - - - - - - {groups && - groups.map((group, i) => - - - - - - - )} - -
- - - - +
+

+ +

+ + {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 => + + )} + + + + + + + +
+ :
+

+ -

-
- {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 - ? - - - - - - - - {course.groups.map((group, i) => - - - - - - )} - -
- - + } + 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 => + + )} + + + + + + +
+ :
+

+ -

-
- {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 &&