From 4831753727be3185cc2f84ddce3c1e53a490d05b Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 24 May 2017 09:43:01 +0200 Subject: [PATCH] OO-2745: show the correct solution feedback in the results report --- .../qti21/ui/AssessmentResultController.java | 1 + .../AssessmentObjectComponentRenderer.java | 2 +- .../InteractionResultComponent.java | 9 ++++ .../InteractionResultComponentRenderer.java | 53 +++++++++++++++++++ .../components/InteractionResultFormItem.java | 8 +++ 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentResultController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentResultController.java index f6409c078a5..ede9032ef3e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentResultController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentResultController.java @@ -379,6 +379,7 @@ public class AssessmentResultController extends FormBasicController { String solutionId = "solutionItem" + count++; InteractionResultFormItem formItem = new InteractionResultFormItem(solutionId, interaction, resolvedAssessmentItem); formItem.setShowSolution(true); + formItem.setShowCorrectSolution(true); initInteractionResultFormItem(formItem, sessionState); layoutCont.add(solutionId, formItem); solutionFormItem = formItem; diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java index 086cbe015c8..2042a5bf980 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java @@ -277,7 +277,7 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent } } - private void renderTestItemModalFeedback_correctSolution(AssessmentRenderer renderer, StringOutput sb, ModalFeedback modalFeedback, + protected void renderTestItemModalFeedback_correctSolution(AssessmentRenderer renderer, StringOutput sb, ModalFeedback modalFeedback, AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, ItemSessionState itemSessionState, URLBuilder ubu, Translator translator) { diff --git a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponent.java index 020d7308cba..e4cc6f59db7 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponent.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponent.java @@ -49,6 +49,7 @@ public class InteractionResultComponent extends AssessmentObjectComponent { private ItemSessionState itemSessionState; private boolean showSolution; + private boolean showCorrectSolution; public InteractionResultComponent(String name, Interaction interaction, ResolvedAssessmentItem resolvedAssessmentItem, InteractionResultFormItem qtiItem) { @@ -66,6 +67,14 @@ public class InteractionResultComponent extends AssessmentObjectComponent { this.showSolution = showSolution; } + public boolean isShowCorrectSolution() { + return showCorrectSolution; + } + + public void setShowCorrectSolution(boolean showCorrectSolution) { + this.showCorrectSolution = showCorrectSolution; + } + public ResolvedAssessmentTest getResolvedAssessmentTest() { return resolvedAssessmentTest; } diff --git a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponentRenderer.java index 61782b5f8e6..aa2eb8a49cd 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultComponentRenderer.java @@ -25,13 +25,19 @@ import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; +import org.olat.core.util.StringHelper; +import org.olat.ims.qti21.QTI21Constants; +import uk.ac.ed.ph.jqtiplus.attribute.Attribute; import uk.ac.ed.ph.jqtiplus.node.content.basic.Block; import uk.ac.ed.ph.jqtiplus.node.content.basic.Flow; import uk.ac.ed.ph.jqtiplus.node.content.variable.PrintedVariable; +import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; +import uk.ac.ed.ph.jqtiplus.node.item.ModalFeedback; import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.state.ItemSessionState; +import uk.ac.ed.ph.jqtiplus.types.Identifier; /** * @@ -64,6 +70,53 @@ public class InteractionResultComponentRenderer extends AssessmentObjectComponen } else if(interaction instanceof Flow) { renderFlow(assessmentRenderer, sb, cmp, resolvedAssessmentItem, itemSessionState, (Flow)interaction, ubu, translator); } + + if(cmp.isShowCorrectSolution()) { + AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful(); + for(ModalFeedback modalFeedback:assessmentItem.getModalFeedbacks()) { + Identifier outcomeIdentifier = modalFeedback.getOutcomeIdentifier(); + if(QTI21Constants.CORRECT_SOLUTION_IDENTIFIER.equals(outcomeIdentifier)) { + sb.append("<div class='modalFeedback'>"); + renderAssessmentItemCorrectSolutionModalFeedback(assessmentRenderer, sb, modalFeedback, + cmp, resolvedAssessmentItem, itemSessionState, ubu, translator); + sb.append("</div>"); + } + } + } + } + + /** + * A special rendering of "correct solution" feedback for the results report (without the open / close part). + * @param renderer + * @param sb + * @param modalFeedback + * @param component + * @param resolvedAssessmentItem + * @param itemSessionState + * @param ubu + * @param translator + */ + private void renderAssessmentItemCorrectSolutionModalFeedback(AssessmentRenderer renderer, StringOutput sb, ModalFeedback modalFeedback, + AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, ItemSessionState itemSessionState, + URLBuilder ubu, Translator translator) { + + sb.append("<div class='modalFeedback o_togglebox_wrapper clearfix'>"); + Attribute<?> title = modalFeedback.getAttributes().get("title"); + String feedbackTitle = null; + if(title != null && title.getValue() != null) { + feedbackTitle = title.getValue().toString(); + } + if(!StringHelper.containsNonWhitespace(feedbackTitle)) { + feedbackTitle = translator.translate("correct.solution"); + } + + sb.append("<h5>").append(StringHelper.escapeHtml(feedbackTitle)).append("</h5>"); + sb.append("<div id='modal-correct-solution'><div class='o_togglebox_content clearfix'>"); + + modalFeedback.getFlowStatics().forEach((flow) + -> renderFlow(renderer, sb, component, resolvedAssessmentItem, itemSessionState, flow, ubu, translator)); + + sb.append("</div></div></div>"); } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultFormItem.java b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultFormItem.java index 26a1a60f652..cf44422a722 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultFormItem.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/InteractionResultFormItem.java @@ -74,6 +74,14 @@ public class InteractionResultFormItem extends AssessmentObjectFormItem { public void setShowSolution(boolean showSolution) { component.setShowSolution(showSolution); } + + public boolean isShowCorrectSolution() { + return component.isShowCorrectSolution(); + } + + public void setShowCorrectSolution(boolean showCorrectSolution) { + component.setShowCorrectSolution(showCorrectSolution); + } @Override public InteractionResultComponent getComponent() { -- GitLab