Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 22 additions & 55 deletions src/components/Groups/GroupExamPending/GroupExamPending.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ import DateTime from '../../widgets/DateTime';
import Explanation from '../../widgets/Explanation';

import { isStudentRole } from '../../helpers/usersRoles.js';
import {
LOCK_TYPE,
LOCK_TITLE,
LOCK_EXPLANATION,
STUDENT_INFO,
LOCKED_STUDENT_INFO,
LOCKED_ELSEWHERE_STUDENT_INFO,
} from '../helpers/groupExamMessages.js';
import withLinks from '../../../helpers/withLinks.js';

const REFRESH_INTERVAL = 1; // [s]
Expand Down Expand Up @@ -51,9 +59,9 @@ class GroupExamPending extends Component {
render() {
const {
id,
privateData: { examBegin, examEnd, examLockStrict },
privateData: { examBegin, examEnd, examLockType },
currentUser: {
privateData: { groupLock, isGroupLockStrict, ipLock, role },
privateData: { groupLock, groupLockType, ipLock, role },
},
links: { GROUP_ASSIGNMENTS_URI_FACTORY },
} = this.props;
Expand All @@ -66,6 +74,7 @@ class GroupExamPending extends Component {
id="app.groupExams.lockedElsewhere"
defaultMessage="You are already locked for an exam in a different group (you can see this group in a read-only mode now)."
/>
{LOCKED_ELSEWHERE_STUDENT_INFO[groupLockType] ? <> {LOCKED_ELSEWHERE_STUDENT_INFO[groupLockType]}</> : null}{' '}
<Link to={GROUP_ASSIGNMENTS_URI_FACTORY(groupLock)}>
<LinkIcon gapLeft={2} className="text-primary" />
</Link>
Expand Down Expand Up @@ -106,17 +115,7 @@ class GroupExamPending extends Component {
id="app.groupExams.lockedStudentInfo"
defaultMessage="You may now see and submit solutions to exam assignments."
/>{' '}
{isGroupLockStrict ? (
<FormattedMessage
id="app.groupExams.lockedStudentInfoStrict"
defaultMessage="You may not access any other groups until the exam lock expires."
/>
) : (
<FormattedMessage
id="app.groupExams.lockedStudentInfoRegular"
defaultMessage="You may access other groups in read-only mode until the exam lock expires."
/>
)}
{LOCKED_STUDENT_INFO[groupLockType] || ''}
</div>

{ipLock && (
Expand Down Expand Up @@ -150,17 +149,7 @@ class GroupExamPending extends Component {
id="app.groupExams.studentInfo"
defaultMessage="You need to lock yourself in to see the exam assignments. When locked, your actions will be restricted to your current IP address."
/>{' '}
{examLockStrict ? (
<FormattedMessage
id="app.groupExams.studentInfoStrict"
defaultMessage="Furthermore, you will not be able to access other groups until the exam lock expires."
/>
) : (
<FormattedMessage
id="app.groupExams.studentInfoRegular"
defaultMessage="Furthermore, you will be able to access other groups in a read-only mode until the exam lock expires."
/>
)}
{STUDENT_INFO[examLockType] || ''}
</p>
</td>
</tr>
Expand Down Expand Up @@ -213,37 +202,15 @@ class GroupExamPending extends Component {
</tr>
<tr>
<td className="fw-bold text-nowrap">
<FormattedMessage id="app.groupExams.locking" defaultMessage="Lock type" />:
<FormattedMessage id="app.groupExams.lockType" defaultMessage="Access limit" />:
</td>
<td className="px-2 py-1 text-nowrap">
<em>
{examLockStrict ? (
<FormattedMessage id="app.groupExams.lockStrict" defaultMessage="strict" />
) : (
<FormattedMessage id="app.groupExams.lockRegular" defaultMessage="regular" />
)}
</em>
<Explanation
id="lock-explain"
title={
examLockStrict ? (
<FormattedMessage id="app.groupExams.lockStrictTitle" defaultMessage="Strict lock" />
) : (
<FormattedMessage id="app.groupExams.lockRegularTitle" defaultMessage="Regular lock" />
)
}>
{examLockStrict ? (
<FormattedMessage
id="app.groupExams.lockStrictExplanation"
defaultMessage="Users taking the exam will not be allowed to access any other group, not even for reading (so that are cut of source codes they submitted before the exam)."
/>
) : (
<FormattedMessage
id="app.groupExams.lockRegularExplanation"
defaultMessage="Users taking the exam will be able to access other groups in read-only mode (for instance to utilize pieces of previously submitted code)."
/>
)}
</Explanation>
<em>{LOCK_TYPE[examLockType] || '???'}</em>
{LOCK_EXPLANATION[examLockType] ? (
<Explanation id="lock-explain" title={LOCK_TITLE[examLockType] || ''}>
{LOCK_EXPLANATION[examLockType] || ''}
</Explanation>
) : null}
</td>
</tr>
</tbody>
Expand All @@ -260,14 +227,14 @@ GroupExamPending.propTypes = {
privateData: PropTypes.shape({
examBegin: PropTypes.number,
examEnd: PropTypes.number,
examLockStrict: PropTypes.bool,
examLockType: PropTypes.string,
}).isRequired,
archived: PropTypes.bool,
currentUser: PropTypes.shape({
privateData: PropTypes.shape({
ipLock: PropTypes.string,
groupLock: PropTypes.string,
isGroupLockStrict: PropTypes.bool,
groupLockType: PropTypes.string,
role: PropTypes.string,
}).isRequired,
}),
Expand Down
61 changes: 15 additions & 46 deletions src/components/Groups/GroupExamStatus/GroupExamStatus.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { getErrorMessage } from '../../../locales/apiErrorMessages.js';

import { isStudentRole } from '../../helpers/usersRoles.js';
import { hasPermissions, shallowCompare } from '../../../helpers/common.js';
import { LOCK_TYPE, LOCK_TITLE, LOCK_EXPLANATION, LOCKED_STUDENT_INFO } from '../helpers/groupExamMessages.js';

const REFRESH_INTERVAL = 1; // [s]

Expand Down Expand Up @@ -48,9 +49,9 @@ class GroupExamStatus extends Component {
};

examFormSubmit = data => {
const { begin, end, strict } = transformExamData(data);
const { begin, end, type } = transformExamData(data);
const { examInProgress } = this.state;
return this.props.setExamPeriod(examInProgress ? null : begin, end, examInProgress ? null : strict).then(res => {
return this.props.setExamPeriod(examInProgress ? null : begin, end, examInProgress ? null : type).then(res => {
this.examModalClose();
return Promise.resolve(res);
});
Expand Down Expand Up @@ -122,7 +123,7 @@ class GroupExamStatus extends Component {
pending,
removeExamPeriod,
currentUser: {
privateData: { ipLock, groupLock, isGroupLockStrict, role },
privateData: { ipLock, groupLock, groupLockType, role },
},
} = this.props;
const isStudent = isStudentRole(role);
Expand Down Expand Up @@ -174,37 +175,15 @@ class GroupExamStatus extends Component {
{!isStudent && (
<tr>
<td className="fw-bold">
<FormattedMessage id="app.groupExams.locking" defaultMessage="Lock type" />:
<FormattedMessage id="app.groupExams.lockType" defaultMessage="Access limit" />:
</td>
<td className="p-2">
<em>
{group.privateData.examLockStrict ? (
<FormattedMessage id="app.groupExams.lockStrict" defaultMessage="strict" />
) : (
<FormattedMessage id="app.groupExams.lockRegular" defaultMessage="regular" />
)}
</em>
<Explanation
id="lock-explain"
title={
group.privateData.examLockStrict ? (
<FormattedMessage id="app.groupExams.lockStrictTitle" defaultMessage="Strict lock" />
) : (
<FormattedMessage id="app.groupExams.lockRegularTitle" defaultMessage="Regular lock" />
)
}>
{group.privateData.examLockStrict ? (
<FormattedMessage
id="app.groupExams.lockStrictExplanation"
defaultMessage="Users taking the exam will not be allowed to access any other group, not even for reading (so that are cut of source codes they submitted before the exam)."
/>
) : (
<FormattedMessage
id="app.groupExams.lockRegularExplanation"
defaultMessage="Users taking the exam will be able to access other groups in read-only mode (for instance to utilize pieces of previously submitted code)."
/>
)}
</Explanation>
<em>{LOCK_TYPE[group.privateData.examLockType] || '???'}</em>
{LOCK_EXPLANATION[group.privateData.examLockType] ? (
<Explanation id="lock-explain" title={LOCK_TITLE[group.privateData.examLockType] || ''}>
{LOCK_EXPLANATION[group.privateData.examLockType] || ''}
</Explanation>
) : null}
</td>
</tr>
)}
Expand Down Expand Up @@ -321,17 +300,7 @@ class GroupExamStatus extends Component {
id="app.groupExams.lockedStudentInfo"
defaultMessage="You may now see and submit solutions to exam assignments."
/>{' '}
{isGroupLockStrict ? (
<FormattedMessage
id="app.groupExams.lockedStudentInfoStrict"
defaultMessage="You may not access any other groups until the exam lock expires."
/>
) : (
<FormattedMessage
id="app.groupExams.lockedStudentInfoRegular"
defaultMessage="You may access other groups in read-only mode until the exam lock expires."
/>
)}
{LOCKED_STUDENT_INFO[groupLockType] || ''}
</div>
</>
) : (
Expand Down Expand Up @@ -379,7 +348,7 @@ class GroupExamStatus extends Component {
? prepareExamInitValues(
group.privateData.examBegin,
group.privateData.examEnd,
group.privateData.examLockStrict || false
group.privateData.examLockType || 'visible'
)
: prepareExamInitValues()
}
Expand All @@ -404,14 +373,14 @@ GroupExamStatus.propTypes = {
privateData: PropTypes.shape({
examBegin: PropTypes.number,
examEnd: PropTypes.number,
examLockStrict: PropTypes.bool,
examLockType: PropTypes.string,
}).isRequired,
}).isRequired,
currentUser: PropTypes.shape({
privateData: PropTypes.shape({
ipLock: PropTypes.string,
groupLock: PropTypes.string,
isGroupLockStrict: PropTypes.bool,
groupLockType: PropTypes.string,
role: PropTypes.string,
}).isRequired,
}).isRequired,
Expand Down
9 changes: 2 additions & 7 deletions src/components/Groups/GroupExamsTable/GroupExamsTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { lruMemoize } from 'reselect';
import DateTime from '../../widgets/DateTime';
import Button from '../../widgets/TheButton';
import { VisibleIcon } from '../../icons';
import { LOCK_TYPE } from '../helpers/groupExamMessages.js';

const sortExams = lruMemoize(exams => {
const sorted = [...exams];
Expand Down Expand Up @@ -43,13 +44,7 @@ const GroupExamsTable = ({ exams = null, selected = null, linkFactory = null })
<DateTime unixTs={exam.end} showSeconds />
</td>
<td>
<em>
{exam.strict ? (
<FormattedMessage id="app.groupExams.lockStrict" defaultMessage="strict" />
) : (
<FormattedMessage id="app.groupExams.lockRegular" defaultMessage="regular" />
)}
</em>
<em>{LOCK_TYPE[exam.type] || '???'}</em>
</td>
{linkFactory && (
<td className="text-end">
Expand Down
Loading
Loading