diff --git a/src/pages-and-resources/proctoring/Settings.jsx b/src/pages-and-resources/proctoring/Settings.jsx
index bb909dacb..26471bcfa 100644
--- a/src/pages-and-resources/proctoring/Settings.jsx
+++ b/src/pages-and-resources/proctoring/Settings.jsx
@@ -13,6 +13,7 @@ import {
ActionRow, Alert, Badge, Form, Hyperlink, ModalDialog, StatefulButton,
} from '@edx/paragon';
+import ExamsApiService from '../../data/services/ExamsApiService';
import StudioApiService from '../../data/services/StudioApiService';
import Loading from '../../generic/Loading';
import ConnectionErrorAlert from '../../generic/ConnectionErrorAlert';
@@ -36,7 +37,9 @@ function ProctoringSettings({ intl, onClose }) {
const [loaded, setLoaded] = useState(false);
const [loadingConnectionError, setLoadingConnectionError] = useState(false);
const [loadingPermissionError, setLoadingPermissionError] = useState(false);
+ const [allowLtiProviders, setAllowLtiProviders] = useState(false);
const [availableProctoringProviders, setAvailableProctoringProviders] = useState([]);
+ const [ltiProctoringProviders, setLtiProctoringProviders] = useState([]);
const [courseStartDate, setCourseStartDate] = useState('');
const [saveSuccess, setSaveSuccess] = useState(false);
const [saveError, setSaveError] = useState(false);
@@ -85,6 +88,10 @@ function ProctoringSettings({ intl, onClose }) {
}
}
+ function isLtiProvider(provider) {
+ return ltiProctoringProviders.some(p => p.name === provider);
+ }
+
function setFocusToProctortrackEscalationEmailInput() {
if (proctoringEscalationEmailInputRef && proctoringEscalationEmailInputRef.current) {
proctoringEscalationEmailInputRef.current.focus();
@@ -92,23 +99,35 @@ function ProctoringSettings({ intl, onClose }) {
}
function postSettingsBackToServer() {
- const dataToPostBack = {
+ const providerIsLti = isLtiProvider(formValues.proctoringProvider);
+ const studioDataToPostBack = {
proctored_exam_settings: {
enable_proctored_exams: formValues.enableProctoredExams,
- proctoring_provider: formValues.proctoringProvider,
+ // lti providers are managed outside edx-platform, lti_external indicates this
+ proctoring_provider: providerIsLti ? 'lti_external' : formValues.proctoringProvider,
create_zendesk_tickets: formValues.createZendeskTickets,
},
};
if (isEdxStaff) {
- dataToPostBack.proctored_exam_settings.allow_proctoring_opt_out = formValues.allowOptingOut;
+ studioDataToPostBack.proctored_exam_settings.allow_proctoring_opt_out = formValues.allowOptingOut;
}
if (formValues.proctoringProvider === 'proctortrack') {
- dataToPostBack.proctored_exam_settings.proctoring_escalation_email = formValues.proctortrackEscalationEmail === '' ? null : formValues.proctortrackEscalationEmail;
+ studioDataToPostBack.proctored_exam_settings.proctoring_escalation_email = formValues.proctortrackEscalationEmail === '' ? null : formValues.proctortrackEscalationEmail;
}
+ // only save back to exam service if necessary
setSubmissionInProgress(true);
- StudioApiService.saveProctoredExamSettingsData(courseId, dataToPostBack).then(() => {
+ const saveOperations = [StudioApiService.saveProctoredExamSettingsData(courseId, studioDataToPostBack)];
+ if (allowLtiProviders && ExamsApiService.isAvailable()) {
+ saveOperations.push(
+ ExamsApiService.saveCourseExamConfiguration(
+ courseId, { provider: providerIsLti ? formValues.proctoringProvider : null },
+ ),
+ );
+ }
+ Promise.all(saveOperations)
+ .then(() => {
setSaveSuccess(true);
setSaveError(false);
setSubmissionInProgress(false);
@@ -178,6 +197,11 @@ function ProctoringSettings({ intl, onClose }) {
return markDisabled;
}
+ function getProviderDisplayLabel(provider) {
+ // if a display label exists for this provider return it
+ return ltiProctoringProviders.find(p => p.name === provider)?.verbose_name || provider;
+ }
+
function getProctoringProviderOptions(providers) {
return providers.map(provider => (
));
}
@@ -344,7 +368,7 @@ function ProctoringSettings({ intl, onClose }) {
)}
{/* CREATE ZENDESK TICKETS */}
- { isEdxStaff && formValues.enableProctoredExams && (
+ { isEdxStaff && formValues.enableProctoredExams && !isLtiProvider(formValues.proctoringProvider) && (