diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java index 859320d2dc7d61879d3f51abd814267e36882bda..183a262f1a96f6e940d41f5efc73e354144d1162 100644 --- a/src/main/java/org/olat/course/nodes/GTACourseNode.java +++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java @@ -152,6 +152,8 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Persi public static final String GTASK_SUBMISSION_TEXT = "grouptask.submission.text"; public static final String GTASK_SUBMISSION_MAIL_CONFIRMATION = "grouptask.submission.mail.confirmation"; + public static final String GTASK_MAX_REVISED_DOCS = "grouptask.max.revised.docs"; + public static final String GTASK_SOLUTIONS = "grouptask.solutions"; diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAEditController.java index 64a4512a35fe1759a55fd534af7818bb4a09c62b..4eccde43d93e70ef4330bde872470402258f1619 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAEditController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAEditController.java @@ -52,17 +52,20 @@ public class GTAEditController extends ActivateableTabbableDefaultController { public static final String PANE_TAB_WORKLOW = "pane.tab.workflow"; public static final String PANE_TAB_ASSIGNMENT = "pane.tab.assignment"; public static final String PANE_TAB_SUBMISSION = "pane.tab.submission"; + public static final String PANE_TAB_REVIEW_AND_CORRECTIONS = "pane.tab.review"; public static final String PANE_TAB_GRADING = "pane.tab.grading"; public static final String PANE_TAB_SOLUTIONS = "pane.tab.solutions"; public static final String PANE_TAB_HIGHSCORE = "pane.tab.highscore"; public static final String[] paneKeys = { PANE_TAB_ACCESSIBILITY, PANE_TAB_WORKLOW, PANE_TAB_ASSIGNMENT, - PANE_TAB_SUBMISSION, PANE_TAB_GRADING, PANE_TAB_SOLUTIONS + PANE_TAB_SUBMISSION, PANE_TAB_REVIEW_AND_CORRECTIONS, PANE_TAB_GRADING, + PANE_TAB_SOLUTIONS }; - private int workflowPos, assignmentPos, submissionPos, gradingPos, solutionsPos, highScoreTabPosition; + private int workflowPos, assignmentPos, submissionPos, revisionPos, gradingPos, solutionsPos, highScoreTabPosition; private TabbedPane myTabbedPane; private GTAWorkflowEditController workflowCtrl; + private GTARevisionAndCorrectionEditController revisionCtrl; private GTAAssignmentEditController assignmentCtrl; private GTASubmissionEditController submissionCtrl; private MSEditFormController manualAssessmentCtrl; @@ -99,6 +102,9 @@ public class GTAEditController extends ActivateableTabbableDefaultController { //submission submissionCtrl = new GTASubmissionEditController(ureq, getWindowControl(), config); listenTo(submissionCtrl); + //revision + revisionCtrl = new GTARevisionAndCorrectionEditController(ureq, getWindowControl(), config); + listenTo(revisionCtrl); //grading manualAssessmentCtrl = new MSEditFormController(ureq, getWindowControl(), config); listenTo(manualAssessmentCtrl); @@ -125,6 +131,7 @@ public class GTAEditController extends ActivateableTabbableDefaultController { workflowPos = tabbedPane.addTab(translate(PANE_TAB_WORKLOW), workflowCtrl.getInitialComponent()); assignmentPos = tabbedPane.addTab(translate(PANE_TAB_ASSIGNMENT), assignmentCtrl.getInitialComponent()); submissionPos = tabbedPane.addTab(translate(PANE_TAB_SUBMISSION), submissionCtrl.getInitialComponent()); + revisionPos = tabbedPane.addTab(translate(PANE_TAB_REVIEW_AND_CORRECTIONS), revisionCtrl.getInitialComponent()); gradingPos = tabbedPane.addTab(translate(PANE_TAB_GRADING), manualAssessmentCtrl.getInitialComponent()); solutionsPos = tabbedPane.addTab(translate(PANE_TAB_SOLUTIONS), solutionsCtrl.getInitialComponent()); highScoreTabPosition = myTabbedPane.addTab(translate(PANE_TAB_HIGHSCORE), highScoreNodeConfigController.getInitialComponent()); @@ -134,6 +141,7 @@ public class GTAEditController extends ActivateableTabbableDefaultController { private void updateEnabledDisabledTabs() { myTabbedPane.setEnabled(assignmentPos, config.getBooleanSafe(GTACourseNode.GTASK_ASSIGNMENT)); myTabbedPane.setEnabled(submissionPos, config.getBooleanSafe(GTACourseNode.GTASK_SUBMIT)); + myTabbedPane.setEnabled(revisionPos, config.getBooleanSafe(GTACourseNode.GTASK_REVIEW_AND_CORRECTION)); myTabbedPane.setEnabled(gradingPos, config.getBooleanSafe(GTACourseNode.GTASK_GRADING)); myTabbedPane.setEnabled(solutionsPos, config.getBooleanSafe(GTACourseNode.GTASK_SAMPLE_SOLUTION)); myTabbedPane.setEnabled(highScoreTabPosition, config.getBooleanSafe(MSCourseNode.CONFIG_KEY_HAS_SCORE_FIELD)); @@ -190,6 +198,15 @@ public class GTAEditController extends ActivateableTabbableDefaultController { listenTo(submissionCtrl); myTabbedPane.replaceTab(submissionPos, submissionCtrl.getInitialComponent()); } + } else if(revisionCtrl == source) { + if(event == Event.DONE_EVENT) { + fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); + } else if(event == Event.CANCELLED_EVENT) { + removeAsListenerAndDispose(revisionCtrl); + revisionCtrl = new GTARevisionAndCorrectionEditController(ureq, getWindowControl(), config); + listenTo(revisionCtrl); + myTabbedPane.replaceTab(revisionPos, revisionCtrl.getInitialComponent()); + } } else if(manualAssessmentCtrl == source) { if (event == Event.DONE_EVENT){ manualAssessmentCtrl.updateModuleConfiguration(config); 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 95b6db4a889e2c2dffea9328092cf37bd232a460..7de126bf68c9b40b9aca58e596c8a7abb3795e0f 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 @@ -167,7 +167,8 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity()); documentsContainer = gtaManager.getRevisedDocumentsContainer(courseEnv, gtaNode, iteration, getIdentity()); } - uploadRevisionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, + int maxDocs = gtaNode.getModuleConfiguration().getIntegerSafe(GTACourseNode.GTASK_MAX_REVISED_DOCS, -1); + uploadRevisionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, maxDocs, gtaNode, courseEnv, assessedUserCourseEnv.isCourseReadOnly(), null, "document"); listenTo(uploadRevisionsCtrl); mainVC.put("uploadRevisions", uploadRevisionsCtrl.getInitialComponent()); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTARevisionAndCorrectionEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTARevisionAndCorrectionEditController.java new file mode 100644 index 0000000000000000000000000000000000000000..e7cd0a39c40d483ca6cb7c891e77072fdf0e9d42 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTARevisionAndCorrectionEditController.java @@ -0,0 +1,122 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.gta.ui; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.TextElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +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.util.StringHelper; +import org.olat.course.nodes.GTACourseNode; +import org.olat.modules.ModuleConfiguration; + +/** + * + * Initial date: 4 août 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class GTARevisionAndCorrectionEditController extends FormBasicController { + + private TextElement maxNumberOfDocsEl; + + private final ModuleConfiguration config; + + public GTARevisionAndCorrectionEditController(UserRequest ureq, WindowControl wControl, ModuleConfiguration config) { + super(ureq, wControl, LAYOUT_BAREBONE); + + this.config = config; + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + //configuration + FormLayoutContainer configCont = FormLayoutContainer.createDefaultFormLayout("config", getTranslator()); + configCont.setRootForm(mainForm); + configCont.setFormTitle(translate("editor.revisions.title")); + configCont.setFormContextHelp("Assessment#_task_abgabe"); + formLayout.add(configCont); + + int maxDocs = config.getIntegerSafe(GTACourseNode.GTASK_MAX_REVISED_DOCS, -1); + String maxVal = ""; + if(maxDocs > 0) { + maxVal = Integer.toString(maxDocs); + } + maxNumberOfDocsEl = uifactory.addTextElement("max.documents", "max.documents", 5, maxVal, configCont); + + //save + FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonsCont.setRootForm(mainForm); + configCont.add(buttonsCont); + uifactory.addFormSubmitButton("save", buttonsCont); + uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl()); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected boolean validateFormLogic(UserRequest ureq) { + boolean allOk = true; + + maxNumberOfDocsEl.clearError(); + String maxVal = maxNumberOfDocsEl.getValue(); + if(StringHelper.containsNonWhitespace(maxVal)) { + try { + int val = Integer.parseInt(maxVal); + if(val <= 0 || val > 12) { + maxNumberOfDocsEl.setErrorKey("error.number.format", null); + allOk &= false; + } + } catch (NumberFormatException e) { + //can happen + allOk &= false; + maxNumberOfDocsEl.setErrorKey("error.number.format", null); + } + } + + return allOk & super.validateFormLogic(ureq); + } + + @Override + protected void formOK(UserRequest ureq) { + String maxVal = maxNumberOfDocsEl.getValue(); + if(StringHelper.isLong(maxVal)) { + try { + int val = Integer.parseInt(maxVal); + config.setIntValue(GTACourseNode.GTASK_MAX_REVISED_DOCS, val); + } catch (NumberFormatException e) { + //can happen + } + } else { + config.remove(GTACourseNode.GTASK_MAX_REVISED_DOCS); + } + + fireEvent(ureq, Event.DONE_EVENT); + } +} 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 4e512a6b539edd826d736f8e52f4ea4f9d4a8fbf..bf94c85a03f6a2675daa23a5ba02e74c38e66b57 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 @@ -78,6 +78,7 @@ download.task=Aufgabe herunterladen download.task.infos={0} ({1} MB) edit.task=Aufgabe bearbeiten editor.title=Abgabe Konfiguration +editor.revisions.title=R\u00FCckgabe Konfiguration embedded.editor=Abgabe mit OpenOLAT Texteditor enabled=eingeschaltet error.assignment.closed=Zuweisung ist geschlossen. @@ -129,6 +130,7 @@ open.group=Gruppe \u00F6ffnen pane.tab.accessibility=Zugang pane.tab.assignment=Aufgabenstellung pane.tab.grading=Bewertung +pane.tab.review=R\u00FCckgabe und Feedback pane.tab.solutions=Musterl\u00F6sung pane.tab.submission=Abgabe pane.tab.workflow=Workflow 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 cf6f93144b0492b382a6aa6513508fffac47b7ae..659c57eb909053c16f77e2551ee0d23b3820df64 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 @@ -78,6 +78,7 @@ download.task=Download task download.task.infos={0} ({1} MB) edit.task=Edit task editor.title=Submission configuration +editor.revisions.title=Revision configuration embedded.editor=Submit with OpenOLAT text editor enabled=enabled error.assignment.closed=Assignment is closed @@ -129,6 +130,7 @@ open.group=Open group pane.tab.accessibility=Access pane.tab.assignment=Assignment pane.tab.grading=Grading +pane.tab.review=Revisions and feedback pane.tab.solutions=Sample solutions pane.tab.submission=Submission pane.tab.workflow=Workflow