diff --git a/src/main/java/org/olat/course/editor/_content/status.html b/src/main/java/org/olat/course/editor/_content/status.html index 45a65b2ef1769e7041b3c16102c836d6c27014aa..94cfd03b213e99b25760f42173c6cd22e6ceeebc 100644 --- a/src/main/java/org/olat/course/editor/_content/status.html +++ b/src/main/java/org/olat/course/editor/_content/status.html @@ -27,7 +27,7 @@ <i class="o_icon o_icon-fw o_icon_warn"></i> $r.translate("toggle.coursestatus.warnings", $warningsCount) </h4> - <ul class="list-unstyled"> + <ul class="o_warning list-unstyled"> #foreach($elem in $warningIsForNode) <li> #set ($counter = $velocityCount - 1) diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java index ed34240d1d6004ee7131ef72ca44ec3f7aa86c25..b656f66768c98818ebc0fd5ed97afa154c499610 100644 --- a/src/main/java/org/olat/course/nodes/GTACourseNode.java +++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java @@ -72,6 +72,8 @@ import org.olat.course.nodes.gta.GTAType; import org.olat.course.nodes.gta.Task; import org.olat.course.nodes.gta.TaskHelper; import org.olat.course.nodes.gta.TaskList; +import org.olat.course.nodes.gta.model.TaskDefinition; +import org.olat.course.nodes.gta.model.TaskDefinitionList; import org.olat.course.nodes.gta.ui.BulkDownloadToolController; import org.olat.course.nodes.gta.ui.GTAAssessmentDetailsController; import org.olat.course.nodes.gta.ui.GTAEditController; @@ -273,6 +275,26 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses File taskDirectory = gtaManager.getTasksDirectory(course.getCourseEnvironment(), this); if(!TaskHelper.hasDocuments(taskDirectory)) { addStatusErrorDescription("error.missing.tasks", GTAEditController.PANE_TAB_ASSIGNMENT, sdList); + } else { + TaskDefinitionList taskList = (TaskDefinitionList)config.get(GTACourseNode.GTASK_TASKS); + if(taskList == null || taskList.getTasks() == null || taskList.getTasks().isEmpty()) { + addStatusErrorDescription("error.missing.tasks", GTAEditController.PANE_TAB_ASSIGNMENT, sdList); + } else { + String[] filenames = taskDirectory.list(); + for(TaskDefinition taskDef: taskList.getTasks()) { + boolean found = false; + for(String filename:filenames) { + if(filename.equals(taskDef.getFilename())) { + found = true; + break; + } + } + + if(!found) { + addStatusWarningDescription("error.missing.file", GTAEditController.PANE_TAB_ASSIGNMENT, sdList); + } + } + } } } @@ -313,6 +335,14 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses status.add(sd); } + private void addStatusWarningDescription(String key, String pane, List<StatusDescription> status) { + String[] params = new String[] { getShortTitle() }; + StatusDescription sd = new StatusDescription(StatusDescription.WARNING, key, key, params, PACKAGE_GTA); + sd.setDescriptionForUnit(getIdent()); + sd.setActivateableViewIdentifier(pane); + status.add(sd); + } + /** * * The files are exported in export/{node ident}/tasks and export/{node ident}/solutions diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAssignmentEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAssignmentEditController.java index 3d07c59c8d4d185b5f9472021a9b2925b64ca3c9..898f5c98443593843c651367ff8200c2780d4416 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAssignmentEditController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAssignmentEditController.java @@ -35,7 +35,9 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; @@ -47,6 +49,10 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +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.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; @@ -79,6 +85,7 @@ public class GTAAssignmentEditController extends FormBasicController { private FlexiTableElement taskDefTableEl; private TaskDefinitionTableModel taskModel; private SingleSelection typeEl, previewEl, samplingEl; + private WarningFlexiCellRenderer fileExistsRenderer; private CloseableModalController cmc; private NewTaskController newTaskCtrl; @@ -134,7 +141,8 @@ public class GTAAssignmentEditController extends FormBasicController { FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.title.i18nKey(), TDCols.title.ordinal())); - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.file.i18nKey(), TDCols.file.ordinal())); + fileExistsRenderer = new WarningFlexiCellRenderer(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TDCols.file.i18nKey(), TDCols.file.ordinal(), fileExistsRenderer)); columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit", TDCols.edit.ordinal(), "edit", new BooleanCellRenderer( new StaticFlexiCellRenderer(translate("edit"), "edit"), @@ -203,6 +211,7 @@ public class GTAAssignmentEditController extends FormBasicController { } private void updateModel() { + fileExistsRenderer.setFilenames(tasksFolder.list()); taskModel.setObjects(taskList.getTasks()); taskDefTableEl.reset(); } @@ -442,4 +451,37 @@ public class GTAAssignmentEditController extends FormBasicController { updateModel(); fireEvent(ureq, Event.DONE_EVENT); } + + private class WarningFlexiCellRenderer implements FlexiCellRenderer { + + private String[] tasks; + + public void setFilenames(String[] tasks) { + this.tasks = tasks; + } + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + + if(cellValue instanceof String) { + String filename = (String)cellValue; + boolean found = false; + + if(tasks != null && tasks.length > 0) { + for(String task:tasks) { + if(task.equals(filename)) { + found = true; + break; + } + } + } + + if(!found) { + target.append("<i class='o_icon o_icon_warn'> </i> "); + } + StringHelper.escapeHtml(target, filename); + } + } + } } \ No newline at end of file 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 26595032f3a5cd43b6e4ee71e9da88bc36c17970..41380e93a60f83580e5c7d3b7e7d47f7b7ae90cc 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 @@ -61,6 +61,7 @@ error.editor.atLeastOne=Sie m\u00FCssen mindestens einen Editortyp w\u00E4hlen. error.file.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists error.file.invalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid error.max.documents=Sie d\u00FCrfen nicht mehr als <b>{0}</b> Dokument(e) abgeben. Aber sie k\u00F6nnen noch ein Dokument austauschen oder editieren. +error.missing.file=Es fehlt die Datei einer Aufgabe error.missing.group=Sie haben noch keine Gruppe gew\u00E4hlt error.missing.score.config=Fehlende Bewertungskonfiguration error.missing.solutions=Sie haben noch keine L\u00F6sungen hochgeladen 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 21050ca85123cd43faadd841598db9eaf397a918..63646a43a84135898dae9b09be04cd4791939d82 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 @@ -63,6 +63,7 @@ error.editor.atLeastOne=You must choose at least one kind of editor. error.file.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists error.file.invalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid error.max.documents=You are not allowed to submit more than <b>{0}</b> Documents. You may edit or change a document. +error.missing.file=The file of a task is missing error.missing.group=You have not selected a group yet error.missing.score.config=Missing score configuration error.missing.solutions=You have not submitted any solutions yet