/** * <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.mode; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; 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.elements.FormLink; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; 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.FlexiTableColumnModel; 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; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledStackedPanel; 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.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; import org.olat.course.assessment.AssessmentMode; import org.olat.course.assessment.AssessmentMode.Status; import org.olat.course.assessment.AssessmentModeCoordinationService; import org.olat.course.assessment.AssessmentModeManager; import org.olat.course.assessment.AssessmentModeNotificationEvent; import org.olat.course.assessment.model.TransientAssessmentMode; import org.olat.course.assessment.ui.mode.AssessmentModeListModel.Cols; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; /** * * Initial date: 12.12.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class AssessmentModeListController extends FormBasicController implements GenericEventListener { private FlexiTableElement tableEl; private FormLink addLink, deleteLink; private AssessmentModeListModel model; private final TooledStackedPanel toolbarPanel; private DialogBoxController startDialogBox, stopDialogBox,deleteDialogBox; private AssessmentModeEditController editCtrl; private final RepositoryEntry entry; @Autowired private AssessmentModeManager assessmentModeMgr; @Autowired private AssessmentModeCoordinationService assessmentModeCoordinationService; public AssessmentModeListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry entry) { super(ureq, wControl, "mode_list"); this.entry = entry; this.toolbarPanel = toolbarPanel; toolbarPanel.addListener(this); initForm(ureq); loadModel(); CoordinatorManager.getInstance().getCoordinator().getEventBus() .registerFor(this, getIdentity(), AssessmentModeNotificationEvent.ASSESSMENT_MODE_NOTIFICATION); } @Override protected void doDispose() { toolbarPanel.removeListener(this); //deregister for assessment mode CoordinatorManager.getInstance().getCoordinator().getEventBus() .deregisterFor(this, AssessmentModeNotificationEvent.ASSESSMENT_MODE_NOTIFICATION); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { addLink = uifactory.addFormLink("add", "add", "add.mode", null, formLayout, Link.BUTTON); addLink.setElementCssClass("o_sel_assessment_mode_add"); addLink.setIconLeftCSS("o_icon o_icon_add"); deleteLink = uifactory.addFormLink("delete", "delete", "delete.mode", null, formLayout, Link.BUTTON); deleteLink.setIconLeftCSS("o_icon o_icon_delete"); //add the table FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.status.i18nKey(), Cols.status.ordinal(), true, Cols.status.name(), new ModeStatusCellRenderer())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name.i18nKey(), Cols.name.ordinal(), true, Cols.name.name())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.begin.i18nKey(), Cols.begin.ordinal(), true, Cols.begin.name())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.end.i18nKey(), Cols.end.ordinal(), true, Cols.end.name())); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.leadTime.i18nKey(), Cols.leadTime.ordinal(), true, Cols.leadTime.name(), new TimeCellRenderer(getTranslator()))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.followupTime.i18nKey(), Cols.followupTime.ordinal(), true, Cols.followupTime.name(), new TimeCellRenderer(getTranslator()))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.target.i18nKey(), Cols.target.ordinal(), true, Cols.target.name(), new TargetAudienceCellRenderer(getTranslator()))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("start", Cols.start.ordinal(), "start", new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("start"), "start"), null))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("stop", Cols.stop.ordinal(), "stop", new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("stop"), "stop"), null))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", translate("edit"), "edit")); model = new AssessmentModeListModel(columnsModel, getTranslator(), assessmentModeCoordinationService); tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 20, false, getTranslator(), formLayout); tableEl.setMultiSelect(true); tableEl.setSelectAllEnable(true); } private void loadModel() { List<AssessmentMode> modes = assessmentModeMgr.getAssessmentModeFor(entry); model.setObjects(modes); tableEl.reloadData(); // don't show table and button if there is nothing tableEl.setVisible(modes.size() > 0); deleteLink.setVisible(modes.size() > 0); } @Override public void event(Event event) { if (event instanceof AssessmentModeNotificationEvent) { AssessmentModeNotificationEvent amne = (AssessmentModeNotificationEvent)event; TransientAssessmentMode mode = amne.getAssessementMode(); if(mode.getRepositoryEntryKey().equals(entry.getKey()) && model.updateModeStatus(amne.getAssessementMode())) { tableEl.getComponent().setDirty(true); } } } @Override public void event(UserRequest ureq, Controller source, Event event) { if(editCtrl == source) { loadModel(); toolbarPanel.popUpToController(this); removeAsListenerAndDispose(editCtrl); editCtrl = null; } else if(deleteDialogBox == source) { if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { @SuppressWarnings("unchecked") List<AssessmentMode> rows = (List<AssessmentMode>)deleteDialogBox.getUserObject(); doDelete(rows); } } else if(startDialogBox == source) { if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { AssessmentMode row = (AssessmentMode)startDialogBox.getUserObject(); doStart(row); } } else if(stopDialogBox == source) { if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { AssessmentMode row = (AssessmentMode)stopDialogBox.getUserObject(); doStop(row); } } super.event(ureq, source, event); } @Override public void event(UserRequest ureq, Component source, Event event) { if(source == toolbarPanel) { if(event instanceof PopEvent) { PopEvent pe = (PopEvent)event; if(pe.getController() == editCtrl) { loadModel(); } } } else { super.event(ureq, source, event); } } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(addLink == source) { doAdd(ureq); } else if(deleteLink == source) { Set<Integer> index = tableEl.getMultiSelectedIndex(); if(index == null || index.isEmpty()) { showWarning("error.atleastone"); } else { List<AssessmentMode> rows = new ArrayList<AssessmentMode>(index.size()); for(Integer i:index) { rows.add(model.getObject(i.intValue())); } doConfirmDelete(ureq, rows); } } else if(tableEl == source) { if(event instanceof SelectionEvent) { SelectionEvent se = (SelectionEvent)event; String cmd = se.getCommand(); AssessmentMode row = model.getObject(se.getIndex()); if("edit".equals(cmd)) { doEdit(ureq, row); } else if("start".equals(cmd)) { doConfirmStart(ureq, row); } else if("stop".equals(cmd)) { doConfirmStop(ureq, row); } } } super.formInnerEvent(ureq, source, event); } @Override protected void formOK(UserRequest ureq) { // } private void doAdd(UserRequest ureq) { removeAsListenerAndDispose(editCtrl); AssessmentMode newMode = assessmentModeMgr.createAssessmentMode(entry); editCtrl = new AssessmentModeEditController(ureq, getWindowControl(), entry.getOlatResource(), newMode); listenTo(editCtrl); toolbarPanel.pushController(translate("new.mode"), editCtrl); } private void doConfirmDelete(UserRequest ureq, List<AssessmentMode> modeToDelete) { StringBuilder sb = new StringBuilder(); boolean canDelete = true; for(AssessmentMode mode:modeToDelete) { if(sb.length() > 0) sb.append(", "); sb.append(mode.getName()); Status status = mode.getStatus(); if(status == Status.leadtime || status == Status.assessment || status == Status.followup) { canDelete = false; } } if(canDelete) { String names = StringHelper.escapeHtml(sb.toString()); String title = translate("confirm.delete.title"); String text = translate("confirm.delete.text", names); deleteDialogBox = activateYesNoDialog(ureq, title, text, deleteDialogBox); deleteDialogBox.setUserObject(modeToDelete); } else { showWarning("error.in.assessment"); } } private void doDelete(List<AssessmentMode> modesToDelete) { for(AssessmentMode modeToDelete:modesToDelete) { assessmentModeMgr.delete(modeToDelete); } loadModel(); tableEl.deselectAll(); } private void doEdit(UserRequest ureq, AssessmentMode mode) { removeAsListenerAndDispose(editCtrl); editCtrl = new AssessmentModeEditController(ureq, getWindowControl(), entry.getOlatResource(), mode); listenTo(editCtrl); String title = translate("form.mode.title", new String[]{ mode.getName() }); toolbarPanel.pushController(title, editCtrl); } private void doConfirmStart(UserRequest ureq, AssessmentMode mode) { String title = translate("confirm.start.title"); String text = translate("confirm.start.text"); startDialogBox = activateYesNoDialog(ureq, title, text, startDialogBox); startDialogBox.setUserObject(mode); } private void doStart(AssessmentMode mode) { assessmentModeCoordinationService.startAssessment(mode); loadModel(); } private void doConfirmStop(UserRequest ureq, AssessmentMode mode) { String title = translate("confirm.stop.title"); String text = translate("confirm.stop.text"); stopDialogBox = activateYesNoDialog(ureq, title, text, stopDialogBox); stopDialogBox.setUserObject(mode); } private void doStop(AssessmentMode mode) { assessmentModeCoordinationService.stopAssessment(mode); loadModel(); } }