/**
* <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.reminder.ui;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
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.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.form.flexible.impl.elements.table.TextFlexiCellRenderer;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.components.velocity.VelocityContainer;
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.closablewrapper.CloseableCalloutWindowController;
import org.olat.core.gui.control.generic.dtabs.Activateable2;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.StringHelper;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.reminder.model.ReminderRow;
import org.olat.course.reminder.ui.CourseReminderTableModel.ReminderCols;
import org.olat.modules.reminder.Reminder;
import org.olat.modules.reminder.ReminderService;
import org.olat.modules.reminder.model.ReminderInfos;
import org.olat.repository.RepositoryEntry;
import org.olat.util.logging.activity.LoggingResourceable;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 01.04.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class CourseReminderListController extends FormBasicController implements Activateable2 {
private FormLink addButton;
private FlexiTableElement tableEl;
private CourseReminderTableModel tableModel;
private final TooledStackedPanel toolbarPanel;
private ToolsController toolsCtrl;
private DialogBoxController deleteDialogBox;
private CourseReminderEditController reminderEditCtrl;
private CloseableCalloutWindowController toolsCalloutCtrl;
private CourseSendReminderListController sendReminderListCtrl;
private final AtomicInteger counter = new AtomicInteger();
private RepositoryEntry repositoryEntry;
@Autowired
private ReminderService reminderManager;
public CourseReminderListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repositoryEntry, TooledStackedPanel toolbarPanel) {
super(ureq, wControl, "reminder_list");
this.toolbarPanel = toolbarPanel;
this.repositoryEntry = repositoryEntry;
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
formLayout.setElementCssClass("o_sel_course_reminder_list");
addButton = uifactory.addFormLink("add.reminder", formLayout, Link.BUTTON);
addButton.setIconLeftCSS("o_icon o_icon_add");
addButton.setElementCssClass("o_sel_add_course_reminder");
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, ReminderCols.id.i18nKey(), ReminderCols.id.ordinal(),
true, ReminderCols.id.name()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ReminderCols.description.i18nKey(), ReminderCols.description.ordinal(),
"edit", true, ReminderCols.description.name(), new StaticFlexiCellRenderer("edit", new TextFlexiCellRenderer())));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ReminderCols.creator.i18nKey(), ReminderCols.creator.ordinal(),
true, ReminderCols.creator.name()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ReminderCols.creationDate.i18nKey(), ReminderCols.creationDate.ordinal(),
true, ReminderCols.creationDate.name()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, ReminderCols.lastModified.i18nKey(), ReminderCols.lastModified.ordinal(),
true, ReminderCols.lastModified.name()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ReminderCols.send.i18nKey(), ReminderCols.send.ordinal(),
true, ReminderCols.send.name()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ReminderCols.tools.i18nKey(), ReminderCols.tools.ordinal()));
tableModel = new CourseReminderTableModel(columnsModel);
tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
updateModel();
}
private void updateModel() {
List<ReminderInfos> reminders = reminderManager.getReminderInfos(repositoryEntry);
List<ReminderRow> rows = new ArrayList<>(reminders.size());
for(ReminderInfos reminder:reminders) {
FormLink toolsLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "tools", "", null, null, Link.NONTRANSLATED);
toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg");
toolsLink.setElementCssClass("o_sel_course_reminder_tools");
toolsLink.setTitle(translate("tools"));
ReminderRow row = new ReminderRow(reminder, toolsLink);
toolsLink.setUserObject(row);
rows.add(row);
}
tableModel.setObjects(rows);
tableEl.reset();
tableEl.setVisible(rows.size() > 0);
}
@Override
protected void doDispose() {
//
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
if(entries == null || entries.isEmpty()) return;
ContextEntry entry = entries.get(0);
String entryPoint = entry.getOLATResourceable().getResourceableTypeName();
if("SentReminders".equalsIgnoreCase(entryPoint)) {
Long key = entry.getOLATResourceable().getResourceableId();
doSendReminderList(ureq, key);
}
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(addButton == source) {
doAddReminder(ureq);
} else if(source instanceof FormLink) {
FormLink link = (FormLink)source;
String cmd = link.getCmd();
if("tools".equals(cmd)) {
ReminderRow row = (ReminderRow)link.getUserObject();
doOpenTools(ureq, row, link);
}
} else if(source == tableEl) {
if(event instanceof SelectionEvent) {
SelectionEvent se = (SelectionEvent)event;
String cmd = se.getCommand();
ReminderRow row = tableModel.getObject(se.getIndex());
if("edit".equals(cmd)) {
doEdit(ureq, row);
}
}
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void formOK(UserRequest ureq) {
//
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(reminderEditCtrl == source) {
if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
//do
updateModel();
}
toolbarPanel.popController(reminderEditCtrl);
cleanUp();
} else if(deleteDialogBox == source) {
if (DialogBoxUIFactory.isYesEvent(event)) {
doDelete((ReminderRow)deleteDialogBox.getUserObject());
}
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(reminderEditCtrl);
removeAsListenerAndDispose(toolsCalloutCtrl);
removeAsListenerAndDispose(toolsCtrl);
reminderEditCtrl = null;
toolsCalloutCtrl = null;
toolsCtrl = null;
}
private void doOpenTools(UserRequest ureq, ReminderRow row, FormLink link) {
removeAsListenerAndDispose(toolsCtrl);
removeAsListenerAndDispose(toolsCalloutCtrl);
toolsCtrl = new ToolsController(ureq, getWindowControl(), row);
listenTo(toolsCtrl);
toolsCalloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(),
toolsCtrl.getInitialComponent(), link.getFormDispatchId(), "", true, "");
listenTo(toolsCalloutCtrl);
toolsCalloutCtrl.activate();
}
private void doAddReminder(UserRequest ureq) {
removeAsListenerAndDispose(reminderEditCtrl);
Reminder newReminder = reminderManager.createReminder(repositoryEntry, getIdentity());
reminderEditCtrl = new CourseReminderEditController(ureq, getWindowControl(), newReminder);
listenTo(reminderEditCtrl);
toolbarPanel.pushController(translate("new.reminder"), reminderEditCtrl);
}
private void doSendReminderList(UserRequest ureq, Long reminderKey) {
removeAsListenerAndDispose(sendReminderListCtrl);
OLATResourceable ores = OresHelper.createOLATResourceableInstance("SentReminders", reminderKey);
ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
Reminder reminder = reminderManager.loadByKey(reminderKey);
sendReminderListCtrl = new CourseSendReminderListController(ureq, bwControl, reminder);
listenTo(sendReminderListCtrl);
addToHistory(ureq, sendReminderListCtrl);
toolbarPanel.pushController(translate("send.reminder"), sendReminderListCtrl);
}
private void doConfirmDelete(UserRequest ureq, ReminderRow row) {
String desc = StringHelper.escapeHtml(row.getDescription());
deleteDialogBox = activateYesNoDialog(ureq, null, translate("dialog.modal.delete.text", desc), deleteDialogBox);
deleteDialogBox.setUserObject(row);
}
private void doDelete(ReminderRow row) {
Reminder reminder = reminderManager.loadByKey(row.getKey());
reminderManager.delete(reminder);
updateModel();
}
private void doEdit(UserRequest ureq, ReminderRow row) {
removeAsListenerAndDispose(reminderEditCtrl);
Reminder reminder = reminderManager.loadByKey(row.getKey());
reminderEditCtrl = new CourseReminderEditController(ureq, getWindowControl(), reminder);
listenTo(reminderEditCtrl);
toolbarPanel.pushController(translate("edit.reminder"), reminderEditCtrl);
}
private void doDuplicate(ReminderRow row) {
Reminder reminder = reminderManager.loadByKey(row.getKey());
reminderManager.duplicate(reminder, getIdentity());
updateModel();
}
private void doSend(ReminderRow row) {
Reminder reminder = reminderManager.loadByKey(row.getKey());
reminderManager.sendReminder(reminder);
updateModel();
}
private class ToolsController extends BasicController {
private ReminderRow row;
private final VelocityContainer mainVC;
public ToolsController(UserRequest ureq, WindowControl wControl, ReminderRow row) {
super(ureq, wControl);
this.row = row;
mainVC = createVelocityContainer("tools");
List<String> links = new ArrayList<>();
addLink("edit", "edit", "o_icon o_icon-fw o_icon_edit", links, "o_sel_course_reminder_edit");
addLink("duplicate", "duplicate", "o_icon o_icon-fw o_icon_copy", links, "o_sel_course_reminder_duplicate");
addLink("send", "send", "o_icon o_icon-fw o_icon_send", links, "o_sel_course_reminder_send");
addLink("show.sent", "show.sent", "o_icon o_icon-fw o_icon_show_send", links, "o_sel_course_reminder_showsent");
addLink("delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links, "o_sel_course_reminder_delete");
mainVC.contextPut("links", links);
putInitialPanel(mainVC);
}
private void addLink(String name, String cmd, String iconCSS, List<String> links, String elementCssClass) {
Link link = LinkFactory.createLink(name, cmd, getTranslator(), mainVC, this, Link.LINK);
if(iconCSS != null) {
link.setIconLeftCSS(iconCSS);
}
if(elementCssClass != null) {
link.setElementCssClass(elementCssClass);
}
mainVC.put(name, link);
links.add(name);
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
fireEvent(ureq, Event.DONE_EVENT);
if(source instanceof Link) {
Link link = (Link)source;
String cmd = link.getCommand();
toolsCalloutCtrl.deactivate();
cleanUp();
if("edit".equals(cmd)) {
doEdit(ureq, row);
} else if("show.sent".equals(cmd)) {
doSendReminderList(ureq, row.getKey());
} else if("delete".equals(cmd)) {
doConfirmDelete(ureq, row);
} else if("duplicate".equals(cmd)) {
doDuplicate(row);
} else if("send".equals(cmd)) {
doSend(row);
}
}
}
}
}