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