Skip to content
Snippets Groups Projects
Commit d3c8d517 authored by srosse's avatar srosse
Browse files

OO-3457: enhance the correction workflow with more buttons

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