/**
* <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 static org.olat.course.reminder.ui.CourseSendReminderListController.USER_PROPS_ID;
import static org.olat.course.reminder.ui.CourseSendReminderListController.USER_PROPS_OFFSET;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.olat.basesecurity.BaseSecurity;
import org.olat.basesecurity.BaseSecurityModule;
import org.olat.core.gui.UserRequest;
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.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.FlexiColumnModel;
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.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.id.Identity;
import org.olat.core.id.Roles;
import org.olat.core.id.UserConstants;
import org.olat.core.util.mail.MailHelper;
import org.olat.core.util.mail.MailerResult;
import org.olat.course.reminder.model.SentReminderRow;
import org.olat.course.reminder.ui.CourseSendReminderTableModel.SendCols;
import org.olat.modules.reminder.Reminder;
import org.olat.modules.reminder.ReminderService;
import org.olat.modules.reminder.SentReminder;
import org.olat.repository.RepositoryEntry;
import org.olat.user.UserManager;
import org.olat.user.propertyhandlers.UserPropertyHandler;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 07.04.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class CourseReminderLogsController extends FormBasicController {
private FlexiTableElement tableEl;
private CourseSendReminderTableModel tableModel;
private final TooledStackedPanel toolbarPanel;
private CourseReminderEditController reminderEditCtrl;
private final boolean isAdministrativeUser;
private final RepositoryEntry repositoryEntry;
private final List<UserPropertyHandler> userPropertyHandlers;
@Autowired
private UserManager userManager;
@Autowired
private BaseSecurity securityManager;
@Autowired
private ReminderService reminderService;
@Autowired
private BaseSecurityModule securityModule;
public CourseReminderLogsController(UserRequest ureq, WindowControl wControl,
RepositoryEntry repositoryEntry, TooledStackedPanel toolbarPanel) {
super(ureq, wControl, "send_reminder_list");
this.repositoryEntry = repositoryEntry;
this.toolbarPanel = toolbarPanel;
setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
Roles roles = ureq.getUserSession().getRoles();
isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser);
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(SendCols.status.i18nKey(), SendCols.status.ordinal(),
true, SendCols.status.name(), new StatusCellRenderer()));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(SendCols.reminder.i18nKey(), SendCols.reminder.ordinal(),
"reminder", true, SendCols.reminder.name(), new StaticFlexiCellRenderer("reminder", new TextFlexiCellRenderer())));
if(isAdministrativeUser) {
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(SendCols.username.i18nKey(), SendCols.username.ordinal(),
true, SendCols.username.name()));
}
int i=0;
for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) {
int colIndex = USER_PROPS_OFFSET + i++;
if (userPropertyHandler == null) continue;
String propName = userPropertyHandler.getName();
boolean visible = userManager.isMandatoryUserProperty(USER_PROPS_ID , userPropertyHandler);
FlexiColumnModel col;
if(UserConstants.FIRSTNAME.equals(propName)
|| UserConstants.LASTNAME.equals(propName)) {
col = new DefaultFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(),
colIndex, userPropertyHandler.getName(), true, propName,
new StaticFlexiCellRenderer(userPropertyHandler.getName(), new TextFlexiCellRenderer()));
} else {
col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, true, propName);
}
columnsModel.addFlexiColumnModel(col);
}
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(SendCols.sendTime.i18nKey(), SendCols.sendTime.ordinal(),
true, SendCols.sendTime.name()));
//user properties
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("resend", translate("resend"), "resend"));
tableModel = new CourseSendReminderTableModel(columnsModel);
tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
tableEl.setElementCssClass("o_sel_course_sent_reminder_log_list");
updateModel();
}
protected void updateModel() {
List<SentReminder> sentReminders = reminderService.getSentReminders(repositoryEntry);
List<SentReminderRow> rows = new ArrayList<>(sentReminders.size());
for(SentReminder sentReminder:sentReminders) {
Identity identity = sentReminder.getIdentity();
Reminder reminder = sentReminder.getReminder();
SentReminderRow row = new SentReminderRow(reminder, sentReminder, identity, userPropertyHandlers, getLocale());
rows.add(row);
}
tableModel.setObjects(rows);
tableEl.reset();
tableEl.setVisible(rows.size() > 0);
}
@Override
protected void doDispose() {
//
}
@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();
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(reminderEditCtrl);
reminderEditCtrl = null;
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(source == tableEl) {
if(event instanceof SelectionEvent) {
SelectionEvent se = (SelectionEvent)event;
String cmd = se.getCommand();
SentReminderRow row = tableModel.getObject(se.getIndex());
if("reminder".equals(cmd)) {
doOpenReminder(ureq, row);
} else if("resend".equals(cmd)) {
doResend(row);
}
}
}
super.formInnerEvent(ureq, source, event);
}
private void doOpenReminder(UserRequest ureq, SentReminderRow row) {
removeAsListenerAndDispose(reminderEditCtrl);
Reminder reminder = reminderService.loadByKey(row.getReminderKey());
reminderEditCtrl = new CourseReminderEditController(ureq, getWindowControl(), reminder);
listenTo(reminderEditCtrl);
toolbarPanel.pushController(translate("edit.reminder"), reminderEditCtrl);
}
private void doResend(SentReminderRow row) {
Reminder reloadedReminder = reminderService.loadByKey(row.getReminderKey());
Identity id = securityManager.loadIdentityByKey(row.getIdentityKey());
List<Identity> identitiesToRemind = Collections.singletonList(id);
MailerResult result = reminderService.sendReminder(reloadedReminder, identitiesToRemind);
if(result.getReturnCode() != MailerResult.OK) {
MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
} else {
showInfo("reminder.resend");
}
}
@Override
protected void formOK(UserRequest ureq) {
//
}
}