diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java index 61f8dfb1b5acbdc31d569d2b7a886de2eb7e7c2b..bdc1595ee794675ed7e14dbeb72c1f8f561f6827 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java @@ -35,6 +35,8 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.modal.DialogBoxController; +import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.course.assessment.AssessmentHelper; import org.olat.fileresource.FileResourceManager; import org.olat.ims.qti.process.AssessmentInstance; @@ -70,14 +72,17 @@ public class QTI21EditForm extends FormBasicController { private MultipleSelectionElement showResultsOnHomePage; private MultipleSelectionElement scoreInfo, showResultsDateDependentButton; private DateChooser startDateElement, endDateElement; - private MultipleSelectionElement testDateDependentButton; + private MultipleSelectionElement testDateDependentEl; private DateChooser startTestDateElement, endTestDateElement; private StaticTextElement minScoreEl, maxScoreEl, cutValueEl; private MultipleSelectionElement showResultsOnFinishEl, assessmentResultsOnFinishEl; + private FormLayoutContainer reportLayout; private final boolean needManualCorrection; private final ModuleConfiguration modConfig; private final QTI21DeliveryOptions deliveryOptions; + + private DialogBoxController confirmTestDateCtrl; @Autowired private QTI21Service qtiService; @@ -100,7 +105,7 @@ public class QTI21EditForm extends FormBasicController { formLayout.add(testLayout); initFormInfos(testLayout); - FormLayoutContainer reportLayout = FormLayoutContainer.createDefaultFormLayout("report", getTranslator()); + reportLayout = FormLayoutContainer.createDefaultFormLayout("report", getTranslator()); reportLayout.setElementCssClass("o_qti_21_configuration"); reportLayout.setFormTitle(translate("report.config")); reportLayout.setRootForm(mainForm); @@ -119,9 +124,10 @@ public class QTI21EditForm extends FormBasicController { protected void initFormReport(FormItemContainer formLayout) { boolean testDateDependent = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST); - testDateDependentButton = uifactory.addCheckboxesHorizontal("qti_datetest", "qti.form.test.date", formLayout, new String[]{"xx"}, new String[]{null}); - testDateDependentButton.select("xx", testDateDependent); - testDateDependentButton.addActionListener(FormEvent.ONCLICK); + testDateDependentEl = uifactory.addCheckboxesHorizontal("qti_datetest", "qti.form.test.date", formLayout, new String[]{"xx"}, new String[]{null}); + testDateDependentEl.select("xx", testDateDependent); + testDateDependentEl.setHelpTextKey("qti.form.test.date.help", null); + testDateDependentEl.addActionListener(FormEvent.ONCLICK); Date startTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE); startTestDateElement = uifactory.addDateChooser("qti_form_start_test_date", "qti.form.date.start", startTestDate, formLayout); @@ -229,15 +235,31 @@ public class QTI21EditForm extends FormBasicController { // } + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if(confirmTestDateCtrl == source) { + if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) { + update(); + reportLayout.setDirty(true); + } else { + testDateDependentEl.uncheckAll(); + } + } + super.event(ureq, source, event); + } + @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = super.validateFormLogic(ureq); startTestDateElement.clearError(); - if(testDateDependentButton.isSelected(0)) { + if(testDateDependentEl.isSelected(0)) { if(startTestDateElement.getDate() == null) { startTestDateElement.setErrorKey("form.legende.mandatory", null); allOk &= false; + } else if(endTestDateElement.getDate() != null && startTestDateElement.getDate().after(endTestDateElement.getDate())) { + startTestDateElement.setErrorKey("error.begin.after.end", null); + allOk &= false; } } @@ -246,6 +268,9 @@ public class QTI21EditForm extends FormBasicController { if(startDateElement.getDate() == null) { startDateElement.setErrorKey("form.legende.mandatory", null); allOk &= false; + } else if(endDateElement.getDate() != null && startDateElement.getDate().after(endDateElement.getDate())) { + startDateElement.setErrorKey("error.begin.after.end", null); + allOk &= false; } } @@ -256,9 +281,14 @@ public class QTI21EditForm extends FormBasicController { protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(showResultsOnFinishEl == source || showResultsOnHomePage == source - || showResultsDateDependentButton == source - || testDateDependentButton == source) { + || showResultsDateDependentButton == source) { update(); + } else if(testDateDependentEl == source) { + if(testDateDependentEl.isAtLeastSelected(1)) { + confirmTestDates(ureq); + } else { + update(); + } } super.formInnerEvent(ureq, source, event); } @@ -271,8 +301,8 @@ public class QTI21EditForm extends FormBasicController { resetDateChooser(startDateElement, showResultsDateDependentButton); resetDateChooser(endDateElement, showResultsDateDependentButton); - resetDateChooser(startTestDateElement, testDateDependentButton); - resetDateChooser(endTestDateElement, testDateDependentButton); + resetDateChooser(startTestDateElement, testDateDependentEl); + resetDateChooser(endTestDateElement, testDateDependentEl); } private void resetDateChooser(DateChooser dateElement, MultipleSelectionElement parentEl) { @@ -334,10 +364,16 @@ public class QTI21EditForm extends FormBasicController { update(); } + + private void confirmTestDates(UserRequest ureq) { + String title = translate("qti.form.test.date"); + String text = translate("qti.form.test.date.confirm"); + confirmTestDateCtrl = activateOkCancelDialog(ureq, title, text, confirmTestDateCtrl); + } @Override protected void formOK(UserRequest ureq) { - modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, testDateDependentButton.isSelected(0)); + modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, testDateDependentEl.isSelected(0)); modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE, startTestDateElement.getDate()); modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE, endTestDateElement.getDate()); diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties index a6bfcc3a716063fd46175f4e30e3829f154636c3..4fb33f3acac63995f5e623e3e6a4e82203f5a2aa 100644 --- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties @@ -49,6 +49,7 @@ disclaimer=Information disclaimer.file.invalid=Gewisse Informationen k\u00F6nnen nicht angezeigt werden weil die referenzierte Datei {0} nicht mehr vorhanden ist. Bitte benachrichtigen Sie die Kursleitung. error.assessment.pulled=Das Test wurde von Ihrem Tutor eingezogen. error.assessment.stopped=Das Test wurde beendet. +error.begin.after.end=Das Beginn-Datum muss vor dem Ende-Datum liegen. error.entry.locked=Die gew\u00E4hlte Lernressource wird momentan von {0} editiert. Bitte w\u00E4hlen Sie eine andere Lernressource oder versuchen Sie es sp\u00E4ter nochmals. error.reopean.failed=Wieder\u00F6ffnen des Tests k\u00F6nnte nicht gemacht werden error.self.undefined.long=Es ist kein Selbsttest f\u00FCr "{0}" definiert. W\u00E4hlen Sie einen unter "Selbsttest-Konfiguration" aus. @@ -144,6 +145,8 @@ qti.form.summary.detailed=Detailliert (mit L\u00F6sungen) qti.form.summary.none=Keine Eingabe notwendig. qti.form.summary.section=Sektionszusammenfassung (ohne L\u00F6sungen) qti.form.test.date=Testzeitraum festlegen +qti.form.test.date.confirm=W\u00E4hrend dem Testzeitraum kann der Test gestartet werden. Sobald die "bis-Zeit" erreicht ist, wird der Test automatisch beendet. Dies auch dann, wenn die definierte Testzeit noch nicht aufgebraucht ist. +qti.form.test.date.help=$\:qti.form.test.date.confirm qti.form.test.title=Test reopen=Erneut starten reopen.explanation=Dieser Test wurde beendet. Sie k\u00F6nnen den Test erneut starten. Der Testteilnehmende kann den Test dann dort weiterf\u00FChren, wo er aufgeh\u00F6rt hat. Falls der Test auf 1 Versuch beschr\u00E4nkt ist, m\u00FCssen außerdem die Versuche zur\u00FCckgesetzt werden, damit der Testteilnehmende den Test weiterf\u00FChren kann. diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties index a93bf18231b11a2c19ef9805c2a07e60899ae145..0a8e8e7f86489c13239170d6b2803ea30766c634 100644 --- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties @@ -47,6 +47,7 @@ disclaimer=Information disclaimer.file.invalid=Some information cannot be displayed because the referenced file {0} is not available anymore. Please contact your course administrator. error.assessment.pulled=The assessment is finished. error.assessment.stopped=Your tutor pull your test. +error.begin.after.end=The start date must be before the end date. error.entry.locked=The learning resource selected is currently edited by {0}. Please select another learning resource or try again later. error.reopean.failed=Reopeing the test cannot be done. error.resource.corrupted=The learning resource cannot be interpreted. It seems corrupted or with the wrong format. @@ -142,6 +143,8 @@ qti.form.summary.section=Section abstract (without solutions) qti.form.summary.sections=Section summary qti.form.summary.solutions=Solution qti.form.test.date=Set assessment period +qti.form.test.date.confirm=During the test period the test can be started. As soon as the "until-time" is reached, the test will be finished automatically. This occurs also if the time limit is not yet reached. +qti.form.test.date.help=$\:qti.form.test.date.confirm qti.form.test.title=Test reopen=Start again reopen.explanation=This test has been finished. You can restart the test. The test participant continues the test where he left it. If the test is limited to 1 attempt, the number of attempts must be reset so the test participants can continue the test. diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_fr.properties index 447a54aba29c8ec6b083fedfc1adbc1b54c49e28..8e1da36c37156d2fe36363a5f8da91ef7b06fc88 100644 --- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_fr.properties @@ -45,6 +45,7 @@ disclaimer=Mentions l\u00E9gales disclaimer.file.invalid=Certaines informations ne peuvent pas \u00EAtre affich\u00E9es, car le fichier r\u00E9f\u00E9renci\u00E9 {0} n'est plus existant. Veuillez pr\u00E9venir la direction du cours. error.assessment.pulled=Le test a \u00E9t\u00E9 retir\u00E9 par votre coach. error.assessment.stopped=Le test est termin\u00E9. +error.begin.after.end=La date de d\u00E9but doit se trouver avant la date de fin. error.entry.locked=La ressource d'\u00E9tude choisie est actuellement \u00E9dit\u00E9e par un utilisateur. Veuillez choisir une autre ressource d'\u00E9tude SVP. error.resource.corrupted=L'object didactique n'a pas pu \u00EAtre lu. Il semble soit corrompu soit au mauvais format. error.self.undefined.long=Aucun auto-test d\u00E9fini pour "{0}". Choisissez dans "Configuration auto-test".