diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java index b58161a1e77ec6456d2ed2f6a84e1a7b48ee493e..e20103834643436b01288cf6dd962998e76bcfe0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java @@ -81,6 +81,7 @@ import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.assessment.Role; +import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.ui.event.CompleteAssessmentTestSessionEvent; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; @@ -287,7 +288,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { if(event instanceof CompleteAssessmentTestSessionEvent) { CompleteAssessmentTestSessionEvent catse = (CompleteAssessmentTestSessionEvent)event; if(courseNode != null) { - doUpdateCourseNode(correctionCtrl.getAssessmentTestSession(), catse.getAssessmentTest()); + doUpdateCourseNode(correctionCtrl.getAssessmentTestSession(), catse.getAssessmentTest(), AssessmentEntryStatus.done); } else { doUpdateEntry(correctionCtrl.getAssessmentTestSession()); } @@ -377,7 +378,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { stackPanel.pushController(translate("correction"), correctionCtrl); } - private void doUpdateCourseNode(AssessmentTestSession session, AssessmentTest assessmentTest) { + private void doUpdateCourseNode(AssessmentTestSession session, AssessmentTest assessmentTest, AssessmentEntryStatus entryStatus) { Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest); ScoreEvaluation scoreEval = courseNode.getUserScoreEvaluation(assessedUserCourseEnv); @@ -388,8 +389,9 @@ public class QTI21AssessmentDetailsController extends FormBasicController { boolean calculated = finalScore.compareTo(BigDecimal.valueOf(cutValue.doubleValue())) >= 0; passed = Boolean.valueOf(calculated); } + AssessmentEntryStatus finalStatus = entryStatus == null ? scoreEval.getAssessmentStatus() : entryStatus; ScoreEvaluation manualScoreEval = new ScoreEvaluation(score, passed, - scoreEval.getAssessmentStatus(), null, scoreEval.getFullyAssessed(), + finalStatus, null, scoreEval.getFullyAssessed(), scoreEval.getCurrentRunCompletion(), scoreEval.getCurrentRunStatus(), session.getKey()); courseNode.updateUserScoreEvaluation(manualScoreEval, assessedUserCourseEnv, getIdentity(), false, Role.coach); } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java index de4e2eef23cefe651bed0b05e301e00746f18d93..ec5597a015b6bd3ddeeef0abdcb324208fe78aec 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java @@ -74,6 +74,7 @@ import uk.ac.ed.ph.jqtiplus.state.TestSessionState; public class CorrectionIdentityAssessmentItemController extends FormBasicController { private FormLink saveNextQuestionButton; + private FormLink saveBackOverviewButton; private final String mapperUri; private final URI assessmentObjectUri; @@ -146,10 +147,12 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl uifactory.addFormCancelButton("cancel", formLayout, ureq, getWindowControl()); uifactory.addFormSubmitButton("save", formLayout); saveNextQuestionButton = uifactory.addFormLink("save.next", formLayout, Link.BUTTON); + saveBackOverviewButton = uifactory.addFormLink("save.back", formLayout, Link.BUTTON); } protected void updateNext(boolean nextEnable) { - saveNextQuestionButton.setEnabled(nextEnable); + saveNextQuestionButton.setVisible(nextEnable); + saveBackOverviewButton.setVisible(!nextEnable); } @Override @@ -175,6 +178,10 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl doSave(); fireEvent(ureq, Event.CHANGED_EVENT); fireEvent(ureq, new NextAssessmentItemEvent()); + } else if(saveBackOverviewButton == source) { + doSave(); + fireEvent(ureq, Event.CHANGED_EVENT); + fireEvent(ureq, Event.BACK_EVENT); } else { super.formInnerEvent(ureq, source, event); } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java index 597bd9c50514a7a896ec887be1c837dc1f1a741a..5087e5b005b4b547c3e035b7ca6353c77bcd6604 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java @@ -44,6 +44,7 @@ import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; @@ -97,10 +98,14 @@ import uk.ac.ed.ph.jqtiplus.types.Identifier; public class CorrectionIdentityAssessmentItemListController extends FormBasicController { private FormLink saveButton; + private FormLink backLink; + private FormLink backOverviewButton; private FlexiTableElement tableEl; private final TooledStackedPanel stackPanel; private CorrectionIdentityAssessmentItemTableModel tableModel; - + + private CloseableModalController cmc; + private ConfirmSaveTestsController confirmSaveTestCtrl; private CorrectionIdentityAssessmentItemNavigationController identityItemCtrl; private final String title; @@ -172,9 +177,11 @@ public class CorrectionIdentityAssessmentItemListController extends FormBasicCon tableEl.setExportEnabled(true); tableEl.setAndLoadPersistedPreferences(ureq, "corr-identity-assessment-item-list"); + backLink = uifactory.addFormLink("back", formLayout, Link.LINK_BACK); if(saveEnabled) { - uifactory.addFormCancelButton("cancel", formLayout, ureq, getWindowControl()); - saveButton = uifactory.addFormLink("save", formLayout, Link.BUTTON); + saveButton = uifactory.addFormLink("save.tests", formLayout, Link.BUTTON); + } else { + backOverviewButton = uifactory.addFormLink("back.overview", formLayout, Link.BUTTON); } } @@ -259,9 +266,24 @@ public class CorrectionIdentityAssessmentItemListController extends FormBasicCon } else if(event == Event.CHANGED_EVENT) { fireEvent(ureq, event); } + } else if(confirmSaveTestCtrl == source) { + if(event == Event.DONE_EVENT) { + doSaveTests(ureq); + } + cmc.deactivate(); + cleanUp(); + } else if(cmc == source) { + cleanUp(); } super.event(ureq, source, event); } + + private void cleanUp() { + removeAsListenerAndDispose(confirmSaveTestCtrl); + removeAsListenerAndDispose(cmc); + confirmSaveTestCtrl = null; + cmc = null; + } @Override protected void formOK(UserRequest ureq) { @@ -285,14 +307,41 @@ public class CorrectionIdentityAssessmentItemListController extends FormBasicCon } } } else if(saveButton == source) { - AssessmentTestSession candidateSession = getAssessmentTestSession(); - List<AssessmentTestSession> sessions = Collections.singletonList(candidateSession); - AssessmentTest assessmentTest = model.getResolvedAssessmentTest().getRootNodeLookup().extractIfSuccessful(); - fireEvent(ureq, new CompleteAssessmentTestSessionEvent(sessions, assessmentTest, AssessmentEntryStatus.done)); + doConfirmSaveTests(ureq); + } else if(backLink == source || backOverviewButton == source) { + fireEvent(ureq, Event.BACK_EVENT); } super.formInnerEvent(ureq, source, event); } + + private void doConfirmSaveTests(UserRequest ureq) { + if(confirmSaveTestCtrl != null) return; + + int notCorrectedQuestions = 0; + List<CorrectionIdentityAssessmentItemRow> rows = tableModel.getObjects(); + for(CorrectionIdentityAssessmentItemRow row:rows) { + if(!row.isCorrected()) { + notCorrectedQuestions += 1; + } + } + + confirmSaveTestCtrl = new ConfirmSaveTestsController(ureq, getWindowControl(), notCorrectedQuestions > 0); + listenTo(confirmSaveTestCtrl); + + cmc = new CloseableModalController(getWindowControl(), "close", confirmSaveTestCtrl.getInitialComponent(), + true, translate("save.tests")); + listenTo(cmc); + cmc.activate(); + } + + private void doSaveTests(UserRequest ureq) { + AssessmentTestSession candidateSession = getAssessmentTestSession(); + List<AssessmentTestSession> sessions = Collections.singletonList(candidateSession); + AssessmentTest assessmentTest = model.getResolvedAssessmentTest().getRootNodeLookup().extractIfSuccessful(); + fireEvent(ureq, new CompleteAssessmentTestSessionEvent(sessions, assessmentTest, AssessmentEntryStatus.done)); + } + private void doSelect(UserRequest ureq, CorrectionIdentityAssessmentItemRow row) { removeAsListenerAndDispose(identityItemCtrl); doUnlock(); diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java index b26ffb034785fcc454eefc68970a0ecbe848e0ae..83164aeaecfa37356c403466cca7683d836b6f48 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java @@ -52,6 +52,7 @@ import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; public class CorrectionIdentityAssessmentItemNavigationController extends BasicController { private final Link backLink; + private final Link backOverviewButton; private final Link nextItemLink; private final Link previousItemLink; private final VelocityContainer mainVC; @@ -74,6 +75,9 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC backLink = LinkFactory.createLinkBack(mainVC, this); backLink.setElementCssClass("o_correction_navigation_back"); mainVC.put("back", backLink); + backOverviewButton = LinkFactory.createButton("back.overview", mainVC, this); + backOverviewButton.setElementCssClass("o_correction_navigation_next"); + mainVC.put("back.overview", backOverviewButton); previousItemLink = LinkFactory.createButton("previous.item", mainVC, this); previousItemLink.setIconLeftCSS("o_icon o_icon_previous"); @@ -118,10 +122,8 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC if(itemCtrl == source) { if(event instanceof NextAssessmentItemEvent) { doNext(ureq); - } else if(event == Event.CHANGED_EVENT) { - fireEvent(ureq, Event.CHANGED_EVENT); - } else if(event == Event.CANCELLED_EVENT) { - fireEvent(ureq, Event.CANCELLED_EVENT); + } else if(event == Event.CHANGED_EVENT || event == Event.CANCELLED_EVENT || event == Event.BACK_EVENT) { + fireEvent(ureq, event); } } super.event(ureq, source, event); @@ -129,7 +131,7 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC @Override protected void event(UserRequest ureq, Component source, Event event) { - if(backLink == source) { + if(backLink == source || backOverviewButton == source) { fireEvent(ureq, Event.BACK_EVENT); } else if(previousItemLink == source) { doPrevious(ureq); @@ -154,8 +156,10 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC previousItemLink.setCustomDisplayText(previousText); previousItemLink.setEnabled(previousEnable); nextItemLink.setCustomDisplayText(nextText); - nextItemLink.setEnabled(nextEnable); + nextItemLink.setVisible(nextEnable); + backOverviewButton.setVisible(!nextEnable); itemCtrl.updateNext(nextEnable); + mainVC.setDirty(true);//update the whole navigation bar } private void doPrevious(UserRequest ureq) { @@ -178,7 +182,9 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC AssessmentItemListEntry nextEntry = assessmentEntryList.get(index); fireEvent(ureq, new SelectAssessmentItemEvent(nextEntry)); } else { - nextItemLink.setEnabled(false); + nextItemLink.setVisible(false); + backOverviewButton.setVisible(true); + mainVC.setDirty(true);//update the whole navigation bar } } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java index d3e9dd261172f738cf4d6e78e0023d82884f1020..144e77122cbac95d5ada67f8558d7606e0d346ec 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java @@ -367,7 +367,6 @@ public class CorrectionIdentityListController extends FormBasicController { cmc = new CloseableModalController(getWindowControl(), "close", confirmSaveTestCtrl.getInitialComponent(), true, translate("save.tests")); - cmc.activate(); listenTo(cmc); cmc.activate(); } 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 ede8b8599207ec92b0798842acfd306b031cdbd5..6c67f673f6a88cf8da33824905bd1d7fb818e5da 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 @@ -5,5 +5,6 @@ $r.render("cancel") $r.render("save") $r.render("save.next") + $r.render("save.back") </div> </div> \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item_list.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item_list.html index 4d317642c9c12dbc2c5434b5b15b77e413c72214..1a732b8053f5b09ccaf7cbd55add2428ef48f4d3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item_list.html +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item_list.html @@ -1,12 +1,16 @@ +<div class="clearfix"> + $r.render("back") +</div> + <h4><i class="o_icon o_icon-fw o_icon_user"> </i> $r.escapeHtml($title)</h4> $r.render("table") -#if($r.visible("cancel") || $r.visible("save")) +#if($r.visible("save.tests") || $r.visible("back.overview")) <div class="o_button_group"> - #if($r.visible("cancel")) - $r.render("cancel") + #if($r.visible("save.tests")) + $r.render("save.tests") #end - #if($r.visible("save")) - $r.render("save") + #if($r.visible("back.overview")) + $r.render("back.overview") #end </div> #end \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/corrections_navigation.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/corrections_navigation.html index 135415c1edc6087132254278907c22065de57d40..5448565c3def5ab82a069637f754dc32c8bf437a 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/corrections_navigation.html +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/corrections_navigation.html @@ -12,6 +12,7 @@ </select> </div> $r.render("next.item") + $r.render("back.overview") </div> $r.render("items") 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 92f8d5277f0e32c26c932ce3277246417008ae2b..bf3579a36e2d535d8e74f97c88eb0543c9ff3679 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 @@ -1,5 +1,6 @@ #Tue Nov 15 16:25:36 CET 2016 assessed.identity=Benutzer +back.overview=Zur\u00FCck zur \u00DCbersicht number.assessed.identity={0}. Benutzer comment=Kommentar comment.help=Dieser Kommentar ist sichbar f\u00FCr den Benutzer in der Testzusammenfassung sowie f\u00FCr andere Betreuer. @@ -21,6 +22,7 @@ not.responded=Die Frage wurde nicht beantwortet overview.tests=\u00DCbersicht und abschliessen previous.item=Vorherige Frage previous.user=Vorheriger Benutzer +save.back=Speichern und zur \u00DCbersicht save.next=Speichern und n\u00E4chste Frage save.tests=Als endg\u00FCltiges Resultat speichern score=Punkte 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 928c78e7c2d8d5e87c3ea60a91ef4c536ccfe676..45e2507241db0e086f7a6870a3646017fc4f255c 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 @@ -1,5 +1,6 @@ #Tue Mar 13 18:56:55 CET 2018 assessed.identity=assessed user +back.overview=Back to overview comment=Comment comment.help=Comments are visible to user as to other coaches. comment.test=Test comment @@ -21,6 +22,7 @@ override.score=Override score overview.tests=Overview and closing previous.item=Previous question previous.user=Previous user +save.back=Save and back to overview save.next=Save and next question save.tests=Save results as completed score=Score