diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index 6fad12792a935bded0ad15b15bfc40d3a8cfe521..e4a007b82a11285c5c2e07f8a317b86c9b1718f0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -1,5 +1,6 @@ #Sat Jan 22 17:01:28 CET 2011 actualPoints=Actual score +attemptsleft=$org.olat.modules.iq\:attemptsleft assessment.comment.legend=Please use the following text box if you need to provide any additional information, comments or feedback during this test: assessment.item.status.review=Review assessment.item.status.notSeen=Not seen diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java index 37446b11ac27f924aa314cd3f85b8ce1a5118be4..ee314a6339377a0642bc30c7b5162952ec6214cb 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java @@ -23,6 +23,7 @@ import org.olat.core.gui.UserRequest; import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; +import uk.ac.ed.ph.jqtiplus.running.ItemProcessingContext; import uk.ac.ed.ph.jqtiplus.running.TestSessionController; import uk.ac.ed.ph.jqtiplus.state.ItemSessionState; import uk.ac.ed.ph.jqtiplus.state.TestPlanNode; @@ -92,6 +93,11 @@ public class AssessmentTreeComponent extends AssessmentObjectComponent { TestSessionState sessionState = getTestSessionController().getTestSessionState(); return sessionState.getItemSessionStates().get(nodeKey); } + + public ItemProcessingContext getItemSessionState(TestPlanNode itemRefNode) { + ItemProcessingContext itemProcessingContext = getTestSessionController().getItemProcessingContext(itemRefNode); + return itemProcessingContext; + } @Override protected void doDispatchRequest(UserRequest ureq) { diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java index 38ae144236f7cd20adc4f9cd2ffecb7520770a94..3180808913c5f13718b53e4a2417222c16c27bd5 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java @@ -28,6 +28,7 @@ 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.AssessmentTestSession; import org.olat.ims.qti21.model.CandidateTestEventType; import org.olat.ims.qti21.model.jpa.CandidateEvent; @@ -38,6 +39,8 @@ 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.test.NavigationMode; import uk.ac.ed.ph.jqtiplus.node.test.TestPart; +import uk.ac.ed.ph.jqtiplus.running.ItemProcessingContext; +import uk.ac.ed.ph.jqtiplus.running.ItemSessionController; import uk.ac.ed.ph.jqtiplus.running.TestSessionController; import uk.ac.ed.ph.jqtiplus.state.ItemSessionState; import uk.ac.ed.ph.jqtiplus.state.TestPlanNode; @@ -157,16 +160,32 @@ public class AssessmentTreeComponentRenderer extends AssessmentObjectComponentRe } sb.append("<span class='questionTitle'>").append(itemNode.getSectionPartTitle()).append("</span>"); - ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey()); + + ItemProcessingContext itemProcessingContext = component.getItemSessionState(itemNode); + ItemSessionState itemSessionState = itemProcessingContext.getItemSessionState();; if(enable) { sb.append("</a>"); } else { sb.append("</span>"); } - + //attempts int numOfAttempts = itemSessionState.getNumAttempts(); - sb.append("<span class='o_assessmentitem_attempts'>").append(numOfAttempts).append("</span>"); + int maxAttempts = 0; + if(itemProcessingContext instanceof ItemSessionController) { + ItemSessionController itemSessionController = (ItemSessionController)itemProcessingContext; + maxAttempts = itemSessionController.getItemSessionControllerSettings().getMaxAttempts(); + } + + sb.append("<span class='o_assessmentitem_attempts'"); + if(maxAttempts > 0) { + String title = translator.translate("attemptsleft", new String[] { Integer.toString((maxAttempts - numOfAttempts)) }); + sb.append(" title=\"").append(StringHelper.escapeHtml(title)).append("\">") + .append("<i class='o_icon o_icon_attempt_limit'> </i> "); + } else { + sb.append(">"); + } + sb.append(numOfAttempts).append("</span>"); //status renderItemStatus(sb, itemSessionState, options, translator);