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 f6409c078a50cc1cb7b5e182fa84b03575e7557e..ede9032ef3eb526bd3be2b6eb0b8b03ee1cb4cfb 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 086cbe015c847efef9359c2ce324aa319d79bc2e..2042a5bf980285bec5f91a2f31a8e5319d02d5e3 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 020d7308cbaada6390637781779079e9abea556a..e4cc6f59db703021267f112e2c596621057e65e6 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 61782b5f8e622779ccf04f3ffab53a86b3627a9c..aa2eb8a49cd604511a17ad6ec62d73e9ec7a60c2 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 26a1a60f652c81c8da18a0bc3c7ac9d7a4745e55..cf44422a722eb848ff64cff0d602ee4f7ba5b0b0 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() {