diff --git a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java index f9f420dd5503060c278c1a26d281c4c7b78b9a73..a296be6242d9d7535ce13c92fb4ebc84cf7e0ec4 100644 --- a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java +++ b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java @@ -379,6 +379,9 @@ public class VelocityRenderDecorator implements Closeable { return sb; } + public String mathJax(String targetDomId) { + return Formatter.elementLatexFormattingScript(targetDomId); + } /** * e.g. "/olat/" diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html index bb9236d7a007ec4e89a788c394505baad892aaae..4c48b7f8c29cab81e267d20e0ec6c510095f5369 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html +++ b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html @@ -1,4 +1,4 @@ -<div class="o_assessment_test_results"> +<div id="o_assessment_test_results_$r.getCId()" class="o_assessment_test_results"> <a id="o_result_overview" title="$r.translateInAttribute("head.assessment.details")"></a> <div class="o_header_with_buttons o_qti_assessment_title"> @@ -547,4 +547,6 @@ /* ]]> */ </script> #end -</div> ## END of o_assessment_test_results \ No newline at end of file +</div> ## END of o_assessment_test_results +$r.mathJax("o_assessment_test_results_${r.getCId()}") + diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java index d18d46ce6a272fe3d60326c6a270eb2c0e551dc5..b520f60f58da6a5b318ef3f4219f702936e34e9d 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java @@ -80,6 +80,8 @@ import uk.ac.ed.ph.jqtiplus.state.TestPlanNode; import uk.ac.ed.ph.jqtiplus.state.TestPlanNodeKey; import uk.ac.ed.ph.jqtiplus.state.TestSessionState; import uk.ac.ed.ph.jqtiplus.types.Identifier; +import uk.ac.ed.ph.jqtiplus.types.ResponseData; +import uk.ac.ed.ph.jqtiplus.types.StringResponseData; import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; /** @@ -170,6 +172,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle viewSolutionButton = uifactory.addFormLink("view.solution", formLayout); viewSolutionButton.setIconLeftCSS("o_icon o_icon_open_togglebox"); + viewSolutionButton.setVisible(hasSolution()); solutionItem = initFormExtendedTextInteraction(testPlanNodeKey, testSessionState, testSession, formLayout); solutionItem.setVisible(false); @@ -273,6 +276,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle if(formLayout instanceof FormLayoutContainer) { FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; layoutCont.contextPut("interactionWrapper", wrapper); + layoutCont.contextPut("autoSaved", Boolean.valueOf(isAutoSaved(testPlanNodeKey, testSessionState))); } } @@ -310,6 +314,49 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle return feedbackItem; } + private boolean isAutoSaved(TestPlanNodeKey testPlanNodeKey, TestSessionState testSessionState) { + for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) { + if(!(interaction instanceof ExtendedTextInteraction)) { + return false; + } + } + + ItemSessionState sessionState = testSessionState.getItemSessionStates().get(testPlanNodeKey); + if(sessionState == null) { + return false; + } + Map<Identifier, ResponseData> raws = sessionState.getRawResponseDataMap(); + if(raws == null || raws.isEmpty()) { + return false; + } + + for(ResponseData data:raws.values()) { + if(data instanceof StringResponseData) { + StringResponseData stringData = (StringResponseData)data; + if(stringData.getResponseData() != null) { + for(String string:stringData.getResponseData()) { + if(StringHelper.containsNonWhitespace(string)) { + return true; + } + } + } + } + } + + return false; + } + + private boolean hasSolution() { + for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) { + if(!(interaction instanceof ExtendedTextInteraction) + && !(interaction instanceof DrawingInteraction) + && !(interaction instanceof UploadInteraction)) { + return true; + } + } + return false; + } + private boolean hasCorrectSolution() { for(ModalFeedback modalFeedback:assessmentItem.getModalFeedbacks()) { Identifier outcomeIdentifier = modalFeedback.getOutcomeIdentifier(); @@ -473,7 +520,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle solutionItem.setVisible(false); } else { viewSolutionButton.setIconLeftCSS("o_icon o_icon_close_togglebox"); - solutionItem.setVisible(true); + solutionItem.setVisible(hasSolution()); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html index 6c67f673f6a88cf8da33824905bd1d7fb818e5da..f7b1090bb5a271dd3c561026918686f3a648d188 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html @@ -1,4 +1,4 @@ -<div class="o_assessmentitem_wrapper clearfix"> +<div id="o_assessmentitem_$r.getCId()" class="o_assessmentitem_wrapper clearfix"> <h4 class="itemTitle"><i class="o_icon $labelCssClass"> </i> $r.escapeHtml($label)</h4> $r.render("interactions") <div class="o_button_group o_assessmentitem_scoring_buttons"> @@ -7,4 +7,5 @@ $r.render("save.next") $r.render("save.back") </div> -</div> \ No newline at end of file +</div> +$r.mathJax("o_assessmentitem_${r.getCId()}") \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html index 5d2a0d398e9ebee8c0689d9f3d4cab8ad0112c37..29eb57ed7ab7e6a8504489cd7adac2d4589904e7 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html @@ -1,5 +1,6 @@ #if(!${interactionWrapper.isItemSessionStateFinal()}) - <div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted")</div> + <div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted") + #if($r.isTrue($autoSaved))<br>$r.translate("warning.not.submitted.autosave")#end</div> #end <div class="o_qti_item_body clearfix">$r.render("answer")</div> @@ -10,9 +11,13 @@ <div class="o_assessmentitem_controls"> </div> #end #elseif($r.visible("view.correct.solution")) - <div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div> -#else + #if($r.visible("view.solution")) + <div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div> + #end +#elseif($r.visible("view.solution")) <div class="o_assessmentitem_controls">$r.render("view.solution")</div> +#else + <div class="o_assessmentitem_controls"> </div> #end #if($r.visible("view.correct.solution")) diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties index 63eeb5b19ff3ab8d92a812eac1435c03e59468a9..1c91f19ef5c589f83ef554be7702fb13dc0c79a6 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties @@ -47,6 +47,7 @@ tool.unreview.all=Markierung aufheben view.correct.solution=Korrekte L\u00F6sung ansehen view.solution=L\u00F6sung ansehen warning.not.submitted=Diese Frage wurde vom Benutzer nicht beantwortet +warning.not.submitted.autosave=<strong>Hinweis:</strong> Die im Antwortfeld erfassten Inhalte wurden automatisch gespeichert. warning.no.assessment.item=Es gibt nichts zu korrigieren waring.atleast.one=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen. warning.assessment.item.locked=Antwort ist bereit von einem anderen Benutzer gesperrt: {0} diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties index 9eea6feec63bdb47550ba17711a8b1ecb8dec9b4..a9ae630696f757f702eef9e7eb43f20215ad11df 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties @@ -51,3 +51,4 @@ warning.assessment.item.locked=The answer is currently locked by an other user\: warning.confirm.save=$\:confirm.save You have still uncorrected questions. warning.no.assessment.item=There is nothing to correct. warning.not.submitted=This question has not been answered by the user +warning.not.submitted.autosave=<strong>Note:</strong> The contents entered in the answer field were automatically saved.