From 065f4adf8cf33e743d338908057058ffb9340dd6 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 30 May 2016 18:03:31 +0200 Subject: [PATCH] OO-2011: student must confirm submission of a revision --- ...ipantRevisionAndCorrectionsController.java | 47 +++++++++++++++++-- .../gta/ui/_i18n/LocalStrings_de.properties | 4 ++ .../gta/ui/_i18n/LocalStrings_en.properties | 4 ++ .../gta/ui/_i18n/LocalStrings_fr.properties | 6 ++- .../selenium/page/course/GroupTaskPage.java | 16 +++++-- .../selenium/page/graphene/OOGraphene.java | 5 +- 6 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java index 7236d850f1e..06278cc82af 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java @@ -33,7 +33,11 @@ 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.controller.BasicController; +import org.olat.core.gui.control.generic.modal.DialogBoxController; +import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.Identity; +import org.olat.core.util.StringHelper; +import org.olat.core.util.io.SystemFilenameFilter; import org.olat.core.util.vfs.VFSContainer; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -61,9 +65,10 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl private Link submitRevisionButton; private final VelocityContainer mainVC; - - private DirectoryController correctionsCtrl, revisionsCtrl; + + private DialogBoxController confirmSubmitDialog; private SubmitDocumentsController uploadRevisionsCtrl; + private DirectoryController correctionsCtrl, revisionsCtrl; private Task assignedTask; private final boolean businessGroupTask; @@ -210,16 +215,50 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl Task aTask = uploadRevisionsCtrl.getAssignedTask(); gtaManager.log("Revision", (SubmitEvent)event, aTask, getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode); } + } else if(confirmSubmitDialog == source) { + if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) { + doSubmitRevisions(); + fireEvent(ureq, Event.DONE_EVENT); + } + cleanUp(); } super.event(ureq, source, event); } + + private void cleanUp() { + removeAsListenerAndDispose(confirmSubmitDialog); + confirmSubmitDialog = null; + } @Override protected void event(UserRequest ureq, Component source, Event event) { if(submitRevisionButton == source) { - doSubmitRevisions(); - fireEvent(ureq, Event.DONE_EVENT); + doConfirmSubmit(ureq); + } + } + + private void doConfirmSubmit(UserRequest ureq) { + int iteration = assignedTask.getRevisionLoop(); + String title = translate("run.submit.revision.button"); + String text; + if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup); + File[] submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + if(submittedDocuments.length == 0) { + text = "<div class='o_warning'>" + translate("run.submit.revision.confirm.warning.group", new String[]{ StringHelper.escapeHtml(assessedGroup.getName()) }) + "</div>"; + } else { + text = translate("run.submit.revision.confirm.group", new String[]{ StringHelper.escapeHtml(assessedGroup.getName()) }); + } + } else { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity()); + File[] submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + if(submittedDocuments.length == 0) { + text = "<div class='o_warning'>" + translate("run.submit.revision.confirm.warning") + "</div>"; + } else { + text = translate("run.submit.revision.confirm"); + } } + confirmSubmitDialog = activateOkCancelDialog(ureq, title, text, confirmSubmitDialog); } private void doSubmitRevisions() { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties index 9889a36f57d..78d965d71c4 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties @@ -187,6 +187,10 @@ run.submit.individual.description.all=Geben Sie Ihre L\u00F6sung ab indem Sie en run.submit.individual.description.editor=Schreiben Sie Ihre L\u00F6sung direkt im Editor. run.submit.individual.description.upload=Laden Sie Ihre L\u00F6sung als fertiges Dokument hoch. run.submit.revision.button=\u00DCberarbeitung abgeben +run.submit.revision.confirm=Bitte best\u00E4tigen Sie die Abgabe der \u00DCberarbeitung. Die Abgabe der \u00DCberarbeitung ist endg\u00FCltig und kann nicht zur\u00FCckgezogen werden. +run.submit.revision.confirm.group=$\:run.submit.revision.confirm<br/>Dies ist eine Gruppenaufgabe\! Die hier getroffene Auswahl ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! +run.submit.revision.confirm.warning=Sie haben noch kein Dokument hochgeladen bzw. erstellt. M\u00F6chten Sie trotzdem die \u00FCberarbeitende Aufgabe abgeben? Die \u00DCberarbeitung ist endg\u00FCltig und kann nicht widerrufen werden. <br/><br/> Sie k\u00F6nnen danach keine Dokumente mehr hochladen.<br/> +run.submit.revision.confirm.warning.group=$\:run.submit.revision.confirm.warning<br/>Dies ist eine Gruppenaufgabe\! Die hier getroffene Auswahl ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! run.submitted.description=Die folgenden L\u00F6sungen wurden von Ihnen abgegeben\: run.submitted.nofiles=Die Abgabe erfolgte ohne Dokumente. sample.solution=Musterl\u00F6sungen diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties index b2672131ea9..63e9ac34dec 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties @@ -187,6 +187,10 @@ run.submit.individual.description.all=Submit your solution by either uploading a run.submit.individual.description.editor=Submit your solution by using the editor to write your solution right here. run.submit.individual.description.upload=Submit your solution by uploading a document you created on your computer. run.submit.revision.button=Submit revision +run.submit.revision.confirm=Please confirm the submission for this revision. The submission of the revision is final and can not be undone. +run.submit.revision.confirm.group=$\:run.submit.revision.confirm<br/>This is a group task\! The submitted document is valid for all members of the group "{0}"\! +run.submit.revision.confirm.warning=You have not yet uploaded / created a document. Do you still wish to submit? The submission of the revised task is final and can not be undone. <br/> The drop box is closed. You will not be able to upload any documents. +run.submit.revision.confirm.warning.group=$\:run.submit.revision.confirm.warning<br/>This is a group task\! The submitted document is valid for all members of the group "{0}"\! run.submitted.description=The following solutions have been submitted by you\: run.submitted.nofiles=The submission was done without documents sample.solution=Sample solution diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_fr.properties index 5656b4eeb8c..0cdab105201 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_fr.properties @@ -180,12 +180,16 @@ run.submit.button=Transmettre le devoir run.submit.confirm=Le d\u00E9p\u00F4t de votre devoir est d\u00E9finitif. run.submit.confirm.group=$\:run.submit.confirm<br/>C'est un devoir de groupe\! La s\u00E9lection effectu\u00E9e ici est valable pour tous les participants du groupe "{0}"\! run.submit.confirm.warning=Vous n'avez pas t\u00E9l\u00E9charger ou cr\u00E9er de document. Souhaitez toujours soumettre votre devoir? La remise du devoir est d\u00E9finitive et ne peut \u00EAtre r\u00E9voqu\u00E9e. Vous ne pourrez plus t\u00E9l\u00E9charger de documents ensuite. -run.submit.confirm.warning.group=$\:run.submit.confirm.warning<br/>C'ist un de vor de groupe\! Les actions effectu\u00E9es ici le sont au nom de tous les membres du groupe "{0}"\! +run.submit.confirm.warning.group=$\:run.submit.confirm.warning<br/>C'est un devoir de groupe\! Les actions effectu\u00E9es ici le sont au nom de tous les membres du groupe "{0}"\! run.submit.due.date=D\u00E9lai de d\u00E9p\u00F4t\: {0} run.submit.individual.description.all=Entrez votre solution soit en t\u00E9l\u00E9chargeant un document ou en utilisant l'\u00E9diteur int\u00E9gr\u00E9 mis \u00E0 votre disposition. run.submit.individual.description.editor=Ecrivez directement votre solution dans l'\u00E9diteur. run.submit.individual.description.upload=T\u00E9l\u00E9chargez un document termin\u00E9 en tant que solution. run.submit.revision.button=Soumettre les remaniements +run.submit.revision.confirm=Le d\u00E9p\u00F4t de votre ou vos documents remani\u00E9s est d\u00E9finitif. +run.submit.revision.confirm.group=$\:run.submit.revision.confirm<br/>C'est un devoir de groupe\! La s\u00E9lection effectu\u00E9e ici est valable pour tous les participants du groupe "{0}"\! +run.submit.revision.confirm.warning=Vous n'avez pas t\u00E9l\u00E9charger ou cr\u00E9er de document. Souhaitez toujours soumettre votre devoir remani\u00E9? La remise du devoir est d\u00E9finitive et ne peut \u00EAtre r\u00E9voqu\u00E9e. Vous ne pourrez plus t\u00E9l\u00E9charger de documents ensuite. +run.submit.revision.confirm.warning.group=$\:run.submit.revision.confirm.warning<br/>C'est un devoir de groupe\! Les actions effectu\u00E9es ici le sont au nom de tous les membres du groupe "{0}"\! run.submitted.description=Vous avez rendus les solutions suivantes\: run.submitted.nofiles=Le devoir a \u00E9t\u00E9 soumis sans le moindre document. sample.solution=Solutions diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java index 0a3639b4490..1811add270f 100644 --- a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java +++ b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java @@ -128,10 +128,7 @@ public class GroupTaskPage { OOGraphene.waitBusy(browser); //confirm - By confirmButtonBy = By.cssSelector("div.modal-dialog div.modal-footer a"); - List<WebElement> buttonsEl = browser.findElements(confirmButtonBy); - buttonsEl.get(0).click(); - OOGraphene.waitBusy(browser); + confirmDialog(); OOGraphene.waitAndCloseBlueMessageWindow(browser); return this; } @@ -140,6 +137,17 @@ public class GroupTaskPage { By submitBy = By.cssSelector("#o_step_revision_content .o_sel_course_gta_submit_revisions"); browser.findElement(submitBy).click(); OOGraphene.waitBusy(browser); + return confirmDialog(); + } + + /** + * Confirm a yes / no dialog box + */ + private GroupTaskPage confirmDialog() { + By confirmButtonBy = By.cssSelector("div.modal-dialog div.modal-footer a"); + OOGraphene.waitElement(confirmButtonBy, 5, browser); + browser.findElement(confirmButtonBy).click(); + OOGraphene.waitBusy(browser); return this; } diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java index 794a1403647..b13e0c4e5d4 100644 --- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java +++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java @@ -44,7 +44,8 @@ import org.openqa.selenium.WebElement; */ public class OOGraphene { - private static final long poolingDuration = 25; + private static final long poolingDuration = 25;//ms + private static final long waitTinyDuration = 15;//seconds private static final By closeBlueBoxButtonBy = By.cssSelector("div.o_alert_info div.o_sel_info_message a.o_alert_close"); private static final By closeModalDialogButtonBy = By.cssSelector("div.modal-dialog div.modal-header button.close"); @@ -84,7 +85,7 @@ public class OOGraphene { // top.tinymce.get('o_fi1000000416').setContent('<p>Hacked</p>'); // <div id="o_fi1000000416_diw" class="o_richtext_mce"> <iframe id="o_fi1000000416_ifr"> public static final void tinymce(String content, WebDriver browser) { - Graphene.waitModel(browser).withTimeout(5, TimeUnit.SECONDS) + Graphene.waitModel(browser).withTimeout(waitTinyDuration, TimeUnit.SECONDS) .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until(new TinyMCELoadedPredicate()); ((JavascriptExecutor)browser).executeScript("top.tinymce.activeEditor.setContent('" + content + "')"); } -- GitLab