diff --git a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java index 47d99bcb33a3b445bb8d98d26684ee4c0104e66c..6722b1c3286040a2a60c8b84c50f03f75e0d566b 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java @@ -90,6 +90,14 @@ public interface AssessmentModeManager { */ public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry); + /** + * + * @param entry + * @param from + * @return + */ + public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry, Date from); + /** * Load the assessment mode for a specific user now. * diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java index e10d273222e762c73ee75e528a55624b92509024..cb38397010ca9160ceff4ea6b76a16fa57ee121f 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java @@ -143,6 +143,19 @@ public class AssessmentModeDAO { .getResultList(); } + public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry, Date from) { + StringBuilder sb = new StringBuilder(); + sb.append("select mode from courseassessmentmode mode") + .append(" where mode.repositoryEntry.key=:entryKey and mode.begin>=:from") + .append(" order by mode.begin asc"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), AssessmentMode.class) + .setParameter("entryKey", entry.getKey()) + .setParameter("from", from) + .getResultList(); + } + public List<AssessmentMode> getAssessmentModes(Date now) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.MILLISECOND, 0); diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java index 58aa2d7c90b04773be326e44c40bf590a66125fc..66ef8198781b2cca3d90d32c17e4bf34e1fe5cb9 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java @@ -183,6 +183,11 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager { public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry) { return assessmentModeDao.getAssessmentModeFor(entry); } + + @Override + public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry, Date from) { + return assessmentModeDao.getAssessmentModeFor(entry, from); + } @Override public List<AssessmentMode> getAssessmentModeFor(IdentityRef identity) { diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java index 037985697901429a9d50a981376f5a9714b75179..bc2528f4d804e0bd00a53bc944cd1fad3f9f1557 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java @@ -61,6 +61,7 @@ public class AssessmentCourseOverviewController extends BasicController { private final VelocityContainer mainVC; private final AssessmentToReviewSmallController toReviewCtrl; + private final AssessmentModeOverviewListController assessmentModeListCtrl; private final AssessmentCourseStatisticsSmallController statisticsCtrl; private Link assessedIdentitiesLink, assessableCoureNodesLink, assessedGroupsLink, passedLink, failedLink; @@ -156,6 +157,12 @@ public class AssessmentCourseOverviewController extends BasicController { assessedGroupsLink.setCustomDisplayText(translate("assessment.tool.numOfAssessedGroups", new String[]{ Integer.toString(numOfGroups) })); assessedGroupsLink.setIconLeftCSS("o_icon o_icon_group o_icon-fw"); } + + assessmentModeListCtrl = new AssessmentModeOverviewListController(ureq, getWindowControl(), courseEntry); + listenTo(assessmentModeListCtrl); + if(assessmentModeListCtrl.getNumOfAssessmentModes() > 0) { + mainVC.put("assessmentModes", assessmentModeListCtrl.getInitialComponent()); + } putInitialPanel(mainVC); } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListController.java new file mode 100644 index 0000000000000000000000000000000000000000..3de04e81cebf741a388c92ae0feea5f30eea244f --- /dev/null +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListController.java @@ -0,0 +1,124 @@ +/** + * <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.assessment.ui.tool; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import org.olat.commons.calendar.CalendarUtils; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.util.Util; +import org.olat.course.assessment.AssessmentMode; +import org.olat.course.assessment.AssessmentModeManager; +import org.olat.course.assessment.ui.mode.AssessmentModeListController; +import org.olat.course.assessment.ui.mode.ModeStatusCellRenderer; +import org.olat.course.assessment.ui.mode.TimeCellRenderer; +import org.olat.course.assessment.ui.tool.AssessmentModeOverviewListTableModel.ModeCols; +import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Small list of the assessment planed today and in the future for the + * coaches. + * + * Initial date: 15 déc. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AssessmentModeOverviewListController extends FormBasicController { + + private FlexiTableElement tableEl; + private AssessmentModeOverviewListTableModel model; + + private RepositoryEntry courseEntry; + + @Autowired + private AssessmentModeManager asssessmentModeManager; + + public AssessmentModeOverviewListController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry) { + super(ureq, wControl, "assessment_modes", Util.createPackageTranslator(AssessmentModeListController.class, ureq.getLocale())); + this.courseEntry = courseEntry; + initForm(ureq); + loadModel(); + } + + public int getNumOfAssessmentModes() { + return model == null ? 0 : model.getRowCount(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + //add the table + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.status, new ModeStatusCellRenderer())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.name)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.begin)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.end)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.leadTime, new TimeCellRenderer(getTranslator()))); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ModeCols.followupTime, new TimeCellRenderer(getTranslator()))); + + model = new AssessmentModeOverviewListTableModel(columnsModel); + tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 10, false, getTranslator(), formLayout); + tableEl.setCustomizeColumns(false); + tableEl.setNumOfRowsEnabled(false); + } + + private void loadModel() { + Date today = CalendarUtils.removeTime(new Date()); + List<AssessmentMode> modes = asssessmentModeManager.getAssessmentModeFor(courseEntry, today); + if(modes.size() > 10) { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, 1); + Date tomorrow = CalendarUtils.removeTime(cal.getTime()); + + List<AssessmentMode> nextModes = new ArrayList<>(25); + for(AssessmentMode mode:modes) { + Date begin = mode.getBegin(); + if(tomorrow.after(begin) || nextModes.size() < 10) { + nextModes.add(mode); + } + } + modes = nextModes; + } + model.setObjects(modes); + tableEl.reset(true, true, true); + } + + @Override + protected void doDispose() { + // + } + + + @Override + protected void formOK(UserRequest ureq) { + // + } +} diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListTableModel.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListTableModel.java new file mode 100644 index 0000000000000000000000000000000000000000..8efee07b337e89b35c6735107833a72678225bbf --- /dev/null +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentModeOverviewListTableModel.java @@ -0,0 +1,90 @@ +/** + * <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.assessment.ui.tool; + +import java.util.Collections; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.course.assessment.AssessmentMode; +import org.olat.course.assessment.model.EnhancedStatus; + +/** + * + * Initial date: 15 déc. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AssessmentModeOverviewListTableModel extends DefaultFlexiTableDataModel<AssessmentMode> { + + public AssessmentModeOverviewListTableModel(FlexiTableColumnModel columnModel) { + super(columnModel); + } + + @Override + public Object getValueAt(int row, int col) { + AssessmentMode mode = getObject(row); + switch(ModeCols.values()[col]) { + case status: return new EnhancedStatus(mode.getStatus(), Collections.emptyList()); + case name: return mode.getName(); + case begin: return mode.getBegin(); + case end: return mode.getEnd(); + case leadTime: return mode.getLeadTime(); + case followupTime: return mode.getFollowupTime(); + default: return "ERROR"; + } + } + + @Override + public DefaultFlexiTableDataModel<AssessmentMode> createCopyWithEmptyList() { + return new AssessmentModeOverviewListTableModel(getTableColumnModel()); + } + + public enum ModeCols implements FlexiSortableColumnDef { + status("table.header.status"), + name("table.header.name"), + begin("table.header.begin"), + end("table.header.end"), + leadTime("table.header.leadTime"), + followupTime("table.header.followupTime"); + + private final String i18nKey; + + private ModeCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + @Override + public String i18nHeaderKey() { + return i18nKey; + } + + @Override + public boolean sortable() { + return true; + } + + @Override + public String sortKey() { + return name(); + } + } +} diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java index 044a461c5f2861c81548a6677d3d8c48a2fd1e3c..076728f7c782302d69dc663dc0513e890aaca0cb 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java @@ -19,6 +19,7 @@ */ package org.olat.course.assessment.ui.tool; +import java.util.Date; import java.util.List; import org.olat.core.gui.UserRequest; @@ -41,6 +42,7 @@ import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; +import org.olat.course.assessment.AssessmentModeManager; import org.olat.course.assessment.AssessmentModule; import org.olat.course.assessment.EfficiencyStatementAssessmentController; import org.olat.course.assessment.bulk.BulkAssessmentOverviewController; @@ -50,6 +52,7 @@ import org.olat.modules.assessment.ui.AssessmentToolContainer; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; import org.olat.modules.assessment.ui.event.UserSelectionEvent; import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -76,6 +79,9 @@ public class AssessmentToolController extends MainLayoutBasicController implemen private UserCourseEnvironment coachUserEnv; + @Autowired + private AssessmentModeManager assessmentModeManager; + public AssessmentToolController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, RepositoryEntry courseEntry, UserCourseEnvironment coachUserEnv, AssessmentToolSecurityCallback assessmentCallback) { super(ureq, wControl); @@ -95,10 +101,17 @@ public class AssessmentToolController extends MainLayoutBasicController implemen putInitialPanel(overviewCtrl.getInitialComponent()); } + public void assessmentModeMessage() { + if(assessmentModeManager.isInAssessmentMode(courseEntry, new Date())) { + stackPanel.setMessage(translate("assessment.mode.now")); + stackPanel.setMessageCssClass("o_warning"); + } + } + public void initToolbar() { overviewLink = LinkFactory.createToolLink("overview", translate("overview"), this/*, "o_icon_user"*/); overviewLink.setElementCssClass("o_sel_assessment_tool_overview"); - segmentButtonsCmp.addButton(overviewLink, false); + segmentButtonsCmp.addButton(overviewLink, true); usersLink = LinkFactory.createToolLink("users", translate("users"), this/*, "o_icon_user"*/); usersLink.setElementCssClass("o_sel_assessment_tool_users"); diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_content/assessment_modes.html b/src/main/java/org/olat/course/assessment/ui/tool/_content/assessment_modes.html new file mode 100644 index 0000000000000000000000000000000000000000..70b44984f8a1afe211af2431dc7c7fb1e7a6a944 --- /dev/null +++ b/src/main/java/org/olat/course/assessment/ui/tool/_content/assessment_modes.html @@ -0,0 +1,6 @@ +<div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"><i class="o_icon o_icon_assessment_mode"> </i> $r.translate("assessment.modes.overview")</h4> + </div> + $r.render("table") +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html index 341ea6cf9a1ff62c72ac813a93efa2f30952412b..153fa7d9d9314da1e544bf5f70c561aa601c34d3 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html +++ b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html @@ -61,7 +61,11 @@ $r.contextHelpWithWrapper("Using Course Tools#_bewertungswerkzeug") #end </table> </div> - <div class="col-sm-6"></div> + <div class="col-sm-6"> + #if($r.available("assessmentModes")) + $r.render("assessmentModes") + #end + </div> #end </div> </div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties index a8b0304810f7c380e522a3a191c8d5f6671cc183..1ee20818a8dcd0df4974344c5c89a51fe648244b 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties @@ -1,4 +1,6 @@ #Fri Sep 30 15:06:20 CEST 2016 +assessment.mode.now=Es gibt derzeit eine Pr\u00FCfung. +assessment.modes.overview=Pr\u00FCfungsmodus assessment.status.done=$org.olat.modules.assessment.ui\:assessment.status.done assessment.status.inProgress=$org.olat.modules.assessment.ui\:assessment.status.inProgress assessment.status.inReview=$org.olat.modules.assessment.ui\:assessment.status.inReview diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties index 1bb237421e668f886de320d50b572c8506bb2005..0f76d24076af2a7cd9958b84598d209d5bc8ba05 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties @@ -1,4 +1,6 @@ #Thu Dec 07 19:14:03 CET 2017 +assessment.mode.now=There is currently an assessment. +assessment.modes.overview=Assessment mode assessment.status.done=$org.olat.modules.assessment.ui\:assessment.status.done assessment.status.inProgress=$org.olat.modules.assessment.ui\:assessment.status.inProgress assessment.status.inReview=$org.olat.modules.assessment.ui\:assessment.status.inReview diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 52555e83e29ca20adf74a327942a2e54e6a07aff..89192a05bf730fb93aad7052914d3671bb956a2c 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -403,6 +403,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im cc.removeCurrentCustomCSSFromView(); } setCustomCSS(null); + setCourseClosedMessage(getUserCourseEnvironment()); } @Override @@ -436,6 +437,10 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im getRunMainController().initToolbar(); } + setCourseClosedMessage(uce); + } + + private void setCourseClosedMessage(UserCourseEnvironment uce) { if(uce != null && uce.isCourseReadOnly()) { toolbarPanel.setMessage(translate("course.closed")); toolbarPanel.setMessageCssClass("o_warning"); @@ -951,6 +956,9 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im lecturesAdminCtrl.configurationChangesConsumed(); initToolbar();// add/remove lectures link from the toolbar } + if(pop.getController() == assessmentToolCtr) { + setCourseClosedMessage(getUserCourseEnvironment()); + } if(pop.getController() != getRunMainController()) { toolControllerDone(ureq); } @@ -1603,6 +1611,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im ctrl.activate(ureq, null, null); listenTo(ctrl); assessmentToolCtr = pushController(ureq, translate("command.openassessment"), ctrl); + assessmentToolCtr.assessmentModeMessage(); currentToolCtr = assessmentToolCtr; setActiveTool(assessmentLink); ctrl.initToolbar();