diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java index 471a4f3e81e6715ccf38d370ef2ba9861687449a..cbf91dab3bfa9223d158f0fd5e5a8ecf4adfe40f 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java @@ -370,7 +370,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen if (ureq != null) { allChats = ureq.getUserSession().getChats(); } - if (allChats == null || allChats.size() == 0) { + if (allChats == null || allChats.isEmpty()) { startButton.setEnabled (true); mainVC.contextPut("hasChatWindowOpen", false); } else { @@ -522,10 +522,12 @@ public class QTI21AssessmentRunController extends BasicController implements Gen if(!displayCtrl.isResultsVisible()) { doExitAssessment(ureq, event, true); initAssessment(ureq); + fireEvent(ureq, Event.CHANGED_EVENT); } } else if(QTI21Event.CLOSE_RESULTS.equals(qe.getCommand())) { doExitAssessment(ureq, event, true); initAssessment(ureq); + fireEvent(ureq, Event.CHANGED_EVENT); } } } diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java index 4a69f27582e4e280028c34745dbb162093537d1e..6705c352da43ba5d46619056f1a579637f4c5237 100644 --- a/src/main/java/org/olat/course/run/RunMainController.java +++ b/src/main/java/org/olat/course/run/RunMainController.java @@ -876,8 +876,8 @@ public class RunMainController extends MainLayoutBasicController implements Gene if(entries.size() > 1) { entries = entries.subList(1, entries.size()); } - updateTreeAndContent(ureq, cn, null, entries, firstEntry.getTransientState()); - } else if (currentCourseNode.equals(cn)) { + currentCourseNode = updateTreeAndContent(ureq, cn, null, entries, firstEntry.getTransientState()); + } else { // consume our entry if(entries.size() > 1) { entries = entries.subList(1, entries.size()); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/FeedbacksEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/FeedbacksEditorController.java index 3ec419a9340dbf098b3e60e08c71f2730b2c0802..ffc9d09dcbc2d91e9fee5291b8b37ef2d93bfa74 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/FeedbacksEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/FeedbacksEditorController.java @@ -51,6 +51,7 @@ import org.olat.ims.qti21.model.xml.ModalFeedbackCondition; import org.olat.ims.qti21.model.xml.ResponseIdentifierForFeedback; import org.olat.ims.qti21.model.xml.ResponseIdentifierForFeedback.Answer; import org.olat.ims.qti21.model.xml.TestFeedbackBuilder; +import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.ui.ResourcesMapper; import org.olat.ims.qti21.ui.components.FlowFormItem; import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent; @@ -120,7 +121,9 @@ public class FeedbacksEditorController extends FormBasicController implements Sy addCorrectSolutionButton.setVisible(enable.isEnabled(ModalFeedbackType.correctSolution)); dropdownEl.addElement(addCorrectSolutionButton); - addCorrectButton = uifactory.addFormLink("add.correct.feedback", formLayout, Link.LINK); + boolean sc = (itemBuilder instanceof SingleChoiceAssessmentItemBuilder); + String addCorrectLabel = "add.correct.feedback" + (sc ? ".single" : ""); + addCorrectButton = uifactory.addFormLink("add.correct.feedback", addCorrectLabel, null, formLayout, Link.LINK); addCorrectButton.setElementCssClass("o_sel_add_correct"); addCorrectButton.setVisible(enable.isEnabled(ModalFeedbackType.correct)); dropdownEl.addElement(addCorrectButton); @@ -321,7 +324,12 @@ public class FeedbacksEditorController extends FormBasicController implements Sy formLayout = FormLayoutContainer.createDefaultFormLayout_2_10(feedbackType.name(), getTranslator()); parentFormLayout.add(formLayout); formLayout.setRootForm(mainForm); - formLayout.setFormTitle(translate("form.imd." + feedbackType.name() + ".text")); + + String formTitle = "form.imd." + feedbackType.name(); + if(feedbackType == ModalFeedbackType.correct && itemBuilder instanceof SingleChoiceAssessmentItemBuilder) { + formTitle += ".single"; + } + formLayout.setFormTitle(translate(formTitle + ".text")); String title = feedbackBuilder == null ? "" : feedbackBuilder.getTitle(); titleEl = uifactory.addTextElement("title_".concat(id), "form.imd.feedback.title", -1, title, formLayout); @@ -335,7 +343,12 @@ public class FeedbacksEditorController extends FormBasicController implements Sy textEl.getEditorConfiguration().setSimplestTextModeAllowed(TextMode.oneLine); textEl.setEnabled(!restrictedEdit && !readOnly); textEl.setVisible(!restrictedEdit && !readOnly); - textEl.setHelpTextKey("feedback." + feedbackType.name() + ".help", null); + + String helpText = "feedback." + feedbackType.name(); + if(feedbackType == ModalFeedbackType.correct && itemBuilder instanceof SingleChoiceAssessmentItemBuilder) { + helpText += ".single"; + } + textEl.setHelpTextKey(helpText + ".help", null); textEl.setHelpUrlForManualPage("Test editor QTI 2.1 in detail#details_testeditor_feedback"); textEl.setElementCssClass("o_sel_assessment_item_" + feedbackType.name() + "_feedback"); RichTextConfiguration richTextConfig2 = textEl.getEditorConfiguration(); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties index 1455ffac3359f7e7a38dbfd28ba7b8e1cad3e3a1..95c122fcaafbae6d03f1d9bd236f2244fc1ce7a9 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties @@ -5,8 +5,9 @@ add=Hinzuf\u00FCgen add.additional.feedback=Bedingtes Feedback hinzuf\u00FCgen add.answered.feedback=Feedback bei Antwort hinzuf\u00FCgen add.correct.feedback=Feedback bei Wahl aller korrekten Antworten hinzuf\u00FCgen +add.correct.feedback.single=Feedback bei Wahl der korrekten Antwort hinzuf\u00FCgen add.correctSolution.feedback=Korrekte L\u00F6sung hinzuf\u00FCgen -add.empty.feedback=Feedback bei Wahl keiner Antworten hinzuf\u00FCgen +add.empty.feedback=Feedback bei keiner Antwort hinzuf\u00FCgen add.feedback.menu=Feedback hinzuf\u00FCgen add.hint.feedback=L\u00F6sungshinweis add.incorrect.feedback=Feedback bei Wahl einer falschen Antwort hinzuf\u00FCgen @@ -53,6 +54,7 @@ essay.rows=H\u00F6he (Anzahl Zeilen) export.qpool.successful=$org.olat.ims.qti.editor\:export.qpool.successful feedback.answered.help=Feedback bei Antwort\: Dieses Feedback erscheint sobald der Benutzer eine Antwort gibt. feedback.correct.help=Feedback bei Wahl aller korrekten Antworten\: Dieses Feedback erscheint nur dann, wenn alle Antworten korrekt sind. +feedback.correct.single.help=Feedback bei Wahl der korrekten Antwort\: Dieses Feedback erscheint nur dann, wenn die Antwort korrekt sind. feedback.correctSolution.help=Korrekte L\u00F6sung\: Diese L\u00F6sung wird automatisch dann angezeigt, wenn die Antwort falsch ist. feedback.empty.help=Feedback bei leere Antwort\: Dieses Feedback erscheint solange die Antwort leer ist. feedback.hint.help=L\u00F6sungshinweis\: F\u00FCr den Testteilnehmer erscheint eine Schaltfl\u00E4che, welche er aufrufen kann, solange die Antwort noch nicht gesendet worden ist. @@ -98,12 +100,13 @@ form.imd.condition=Bedingung(en) form.imd.correct.kprim=Richtig form.imd.correct.spots=Korrekte Spots form.imd.correct.text=Feedback bei Wahl aller korrekten Antworten +form.imd.correct.single.text=Feedback bei Wahl der korrekten Antwort form.imd.correct.title=Titel form.imd.correctSolution.text=Korrekte L\u00F6sung form.imd.correctSolution.text.word=$\:form.imd.correctSolution.text (nur f\u00FCr Word Export) form.imd.correctSolution.title=Titel form.imd.descr=Frage -form.imd.empty.text=Feedback bei Wahl keiner Antworten +form.imd.empty.text=Feedback bei keiner Antwort form.imd.empty.title=Titel form.imd.feedback.text=Feedback form.imd.feedback.title=Titel diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties index 9981badb5148402de4fee4e71b0285f4167c4a50..907eccead297bbe93764ce89039cbc5b90116827 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties @@ -3,6 +3,7 @@ add=Add add.additional.feedback=Add feedback with conditions add.answered.feedback=Add feedback by answer add.correct.feedback=Add a feedback for all correct answers +add.correct.feedback.single=Add feedback for correct answer add.correctSolution.feedback=Add correct solution add.empty.feedback=Add feedback by empty answer add.feedback.menu=Add feedback @@ -51,6 +52,9 @@ error.upper.tolerance=The upper bound need to be bigger than the solution. export.qpool.successful=$org.olat.ims.qti.editor\:export.qpool.successful feedback.answered.help=Feedback by answer\: this feedback is shown automatically if the user give an answer. feedback.correct.help=Feedback for all correct answers\: The feedback appears only if all answer are correct. +feedback.correct.help=Feedback for all correct answers\: The feedback appears only if all answer are correct. + + feedback.correctSolution.help=Correct solution\: The solution is shown automatically, if the answer is wrong. feedback.empty.help=Feedback by empty\: this feedback is shown if the user give an empty answer. feedback.hint.help=Hint\: For the hint a button appears, which can be opened, as long as the answer is not submitted yet. @@ -97,6 +101,7 @@ form.imd.condition=Condition(s) form.imd.correct.kprim=True form.imd.correct.spots=Correct spots form.imd.correct.text=Feedback for all correct answers +form.imd.correct.single.text=Feedback for correct answer form.imd.correct.title=Title form.imd.correctSolution.text=Correct solution form.imd.correctSolution.text.word=$\:form.imd.correctSolution.text (only for Word export) diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java index d111561f3ef22db3b44ad946b271c971ed17e58c..bad61cfc8352140ec8776086b3c6acb2e2b37c74 100644 --- a/src/main/java/org/olat/repository/handlers/CourseHandler.java +++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java @@ -340,7 +340,7 @@ public class CourseHandler implements RepositoryHandler { RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class); OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(resource); RepositoryEntry importedRepositoryEntry = repositoryService.create(owner, null, - importExport.getResourceName(), importExport.getDisplayName(), importExport.getDescription(), ores, 0, organisation); + importExport.getResourceName(), importExport.getDisplayName(), importExport.getDescription(), ores, RepositoryEntry.ACC_OWNERS, organisation); // set the new shared folder reference CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig(); @@ -374,7 +374,7 @@ public class CourseHandler implements RepositoryHandler { OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(resource); RepositoryEntry importedRepositoryEntry = repositoryService.create(owner, - null, importExport.getResourceName(), importExport.getDisplayName(), importExport.getDescription(), ores, 0, organisation); + null, importExport.getResourceName(), importExport.getDisplayName(), importExport.getDescription(), ores, RepositoryEntry.ACC_OWNERS, organisation); // set the new glossary reference CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig(); diff --git a/src/test/java/org/olat/restapi/ForumTest.java b/src/test/java/org/olat/restapi/ForumTest.java index 1748a7838864d0b3684ca696b5a4e963dce8a4ef..6464d668660e8f70193d9adab8439f515cbef06e 100644 --- a/src/test/java/org/olat/restapi/ForumTest.java +++ b/src/test/java/org/olat/restapi/ForumTest.java @@ -56,7 +56,9 @@ import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.junit.Assert; import org.junit.Before; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; @@ -80,6 +82,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class ForumTest extends OlatJerseyTestCase { private static final OLog log = Tracing.createLoggerFor(ForumTest.class);