/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <p>
*/
package org.olat.group.delete;
import java.util.List;
import org.apache.velocity.VelocityContext;
import org.olat.admin.user.delete.service.UserDeletionManager;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.form.Form;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.gui.components.table.StaticColumnDescriptor;
import org.olat.core.gui.components.table.Table;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableEvent;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.table.TableMultiSelectEvent;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.ControllerEventListener;
import org.olat.core.gui.control.DefaultController;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.formelements.IntegerElement;
import org.olat.core.gui.translator.PackageTranslator;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.UserConstants;
import org.olat.core.util.Util;
import org.olat.core.util.mail.MailNotificationEditController;
import org.olat.core.util.mail.MailTemplate;
import org.olat.group.BusinessGroup;
import org.olat.group.delete.service.GroupDeletionManager;
import org.olat.group.ui.BGTranslatorFactory;
import org.olat.group.ui.main.BGMainController;
/**
* Controller for tab 'Learning-resource selection'
*
* @author Christian Guretzki
*/
public class SelectionController extends DefaultController implements ControllerEventListener {
private static final String PACKAGE = Util.getPackageName(SelectionController.class);
private static final String PACKAGE_MAIN_CONTROLLER = Util.getPackageName(BGMainController.class);
private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(PACKAGE);
private static final String ACTION_SINGLESELECT_CHOOSE = "ssc";
private static final String ACTION_MULTISELECT_CHOOSE = "msc";
private static final String KEY_EMAIL_SUBJECT = "delete.announcement.email.subject";
private static final String KEY_EMAIL_BODY = "delete.announcement.email.body";
private VelocityContainer myContent;
private Panel deleteSelectionPanel;
private SelectionForm selectionForm;
private TableController tableCtr;
private GroupDeleteTableModel redtm;
private PackageTranslator pT;
private VelocityContainer selectionListContent;
private Link editParameterLink;
private MailNotificationEditController deleteGroupMailCtr;
private List selectedGroups;
private CloseableModalController cmc;
private PackageTranslator tableModelTypeTranslator;
/**
* @param ureq
* @param wControl
* @param cancelbutton
*/
public SelectionController(UserRequest ureq, WindowControl wControl) {
super(wControl);
pT = new PackageTranslator(PACKAGE, ureq.getLocale(), new PackageTranslator(PACKAGE_MAIN_CONTROLLER, ureq.getLocale()) );
myContent = new VelocityContainer("deleteselection", VELOCITY_ROOT + "/panel.html", pT, this);
//used to translate the BusinessGroup.getType() String in the table model
tableModelTypeTranslator = BGTranslatorFactory.createBGPackageTranslator(PACKAGE, /*doesnt matter*/BusinessGroup.TYPE_BUDDYGROUP, ureq.getLocale());
deleteSelectionPanel = new Panel("deleteSelectionPanel");
deleteSelectionPanel.addListener(this);
myContent.put("panel", deleteSelectionPanel);
initializeTableController(ureq);
initializeContent();
setInitialComponent(myContent);
}
private void initializeContent() {
updateGroupList();
selectionListContent = new VelocityContainer("selectionlist", VELOCITY_ROOT + "/selectionlist.html", pT, this);
selectionListContent.put("repositorylist", tableCtr.getInitialComponent() );
selectionListContent.contextPut("header", pT.translate("selection.delete.header",
new String[] { Integer.toString(GroupDeletionManager.getInstance().getLastUsageDuration()) }));
editParameterLink = LinkFactory.createButtonXSmall("button.editParameter", selectionListContent, this);
deleteSelectionPanel.setContent(selectionListContent);
}
/**
* @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
* org.olat.core.gui.components.Component,
* org.olat.core.gui.control.Event)
*/
public void event(UserRequest ureq, Component source, Event event) {
if (source == editParameterLink) {
selectionForm = new SelectionForm("selectionform", pT);
selectionForm.addListener(this);
cmc = new CloseableModalController(getWindowControl(), pT.translate("close"), selectionForm, true, pT.translate("edit.parameter.header"));
cmc.activate();
} else if (source == selectionForm) {
if (event == Form.EVNT_VALIDATION_OK) {
GroupDeletionManager.getInstance().setLastUsageDuration(selectionForm.getLastUsageDuration());
GroupDeletionManager.getInstance().setDeleteEmailDuration(selectionForm.getDeleteEmailDuration());
initializeContent();
} else if (event == Form.EVNT_FORM_CANCELLED) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
cmc.deactivate();
}
}
/**
* @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
* org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
*/
public void event(UserRequest ureq, Controller source, Event event) {
if (source == tableCtr) {
if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
TableEvent te = (TableEvent) event;
if (te.getActionId().equals(ACTION_SINGLESELECT_CHOOSE)) {
int rowid = te.getRowId();
GroupDeletionManager.getInstance().setLastUsageNowFor((BusinessGroup) redtm.getObject(rowid));
updateGroupList();
}
} else if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) {
TableMultiSelectEvent tmse = (TableMultiSelectEvent) event;
if (tmse.getAction().equals(ACTION_MULTISELECT_CHOOSE)) {
handleEmailButtonEvent(ureq, tmse);
}
}
initializeContent();
} else if (source == deleteGroupMailCtr) {
if (event == Event.DONE_EVENT) {
String warningMessage = GroupDeletionManager.getInstance().sendDeleteEmailTo(selectedGroups, deleteGroupMailCtr.getMailTemplate(),
deleteGroupMailCtr.isTemplateChanged(), KEY_EMAIL_SUBJECT, KEY_EMAIL_BODY, ureq.getIdentity(), pT);
cmc.deactivate();
if(deleteGroupMailCtr.getMailTemplate() != null) {
// when mailtemplate is null, user decides to send no email => no status message
if (warningMessage.length() > 0 ) {
this.getWindowControl().setWarning(pT.translate("delete.email.announcement.warning.header") + warningMessage);
} else {
this.getWindowControl().setInfo(pT.translate("selection.feedback.msg"));
}
}
updateGroupList();
} else if (event == Event.CANCELLED_EVENT) {
cmc.deactivate();
} else {
throw new RuntimeException("unknown event ::" + event.getCommand());
}
}
}
private void handleEmailButtonEvent(UserRequest ureq, TableMultiSelectEvent tmse) {
if (redtm.getObjects(tmse.getSelection()).size() != 0) {
selectedGroups = redtm.getObjects(tmse.getSelection());
if (deleteGroupMailCtr != null) {
deleteGroupMailCtr.dispose();
}
MailTemplate deleteMailTemplate = createMailTemplate(pT.translate(KEY_EMAIL_SUBJECT), pT.translate(KEY_EMAIL_BODY));
deleteMailTemplate.addToContext("lastloginduration", Integer.toString(UserDeletionManager.getInstance().getLastLoginDuration() ));
deleteMailTemplate.addToContext("durationdeleteemail", Integer.toString(UserDeletionManager.getInstance().getDeleteEmailDuration() ));
deleteGroupMailCtr = new MailNotificationEditController(getWindowControl(), ureq, deleteMailTemplate, true);
deleteGroupMailCtr.addControllerListener(this);
cmc = new CloseableModalController(getWindowControl(), pT.translate("close"), deleteGroupMailCtr.getInitialComponent());
cmc.activate();
} else {
getWindowControl().setWarning(pT.translate("nothing.selected.msg"));
}
}
private void initializeTableController(UserRequest ureq) {
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableConfig.setTableEmptyMessage(pT.translate("error.no.repository.found"));
if (tableCtr != null) tableCtr.dispose();
tableCtr = new TableController(tableConfig, ureq, getWindowControl(), pT, this);
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.bgname", 0, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.description", 1, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.type", 2, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.lastusage", 3, null, ureq.getLocale()));
tableCtr.addMultiSelectAction("action.delete.selection", ACTION_MULTISELECT_CHOOSE);
tableCtr.addColumnDescriptor(new StaticColumnDescriptor(ACTION_SINGLESELECT_CHOOSE, "table.header.action", myContent
.getTranslator().translate("action.activate")));
tableCtr.setMultiSelect(true);
}
/**
* @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
*/
protected void doDispose() {
if (tableCtr != null) {
tableCtr.dispose();
tableCtr = null;
}
}
public void updateGroupList() {
List l = GroupDeletionManager.getInstance().getDeletableGroups(GroupDeletionManager.getInstance().getLastUsageDuration());
redtm = new GroupDeleteTableModel(l, tableModelTypeTranslator);
tableCtr.setTableDataModel(redtm);
}
/**
* Create default template which fill in context 'firstname' , 'lastname' and 'username'.
* @param subject
* @param body
* @return
*/
private MailTemplate createMailTemplate(String subject, String body) {
return new MailTemplate(subject, body, null) {
@Override
public void putVariablesInMailContext(VelocityContext context, Identity identity) {
context.put("firstname", identity.getUser().getProperty(UserConstants.FIRSTNAME, null));
context.put("lastname", identity.getUser().getProperty(UserConstants.LASTNAME, null));
context.put("username", identity.getName());
}
};
}
}
class SelectionForm extends Form {
private IntegerElement lastUsageDuration;
private IntegerElement emailDuration;
/**
* @param name
* @param cancelbutton
* @param isAdmin if true, no field must be filled in at all, otherwise
* validation takes place
*/
public SelectionForm(String name, Translator translator) {
super(name, translator);
lastUsageDuration = new IntegerElement("edit.parameter.form.lastusage.duration", GroupDeletionManager.getInstance().getLastUsageDuration());
addFormElement("lastUsageDuration", lastUsageDuration);
emailDuration = new IntegerElement("edit.parameter.form.email.duration", GroupDeletionManager.getInstance().getDeleteEmailDuration());
addFormElement("emailDuration", emailDuration);
addSubmitKey("edit.parameter.form.submit", "submit");
setCancelButton();
}
public int getDeleteEmailDuration() {
return emailDuration.getIntvalue();
}
public int getLastUsageDuration() {
return lastUsageDuration.getIntvalue();
}
/**
* @see org.olat.core.gui.components.Form#validate(org.olat.core.gui.UserRequest)
*/
public boolean validate() {
return lastUsageDuration.isInteger("error.lastusage.duration") && emailDuration.isInteger("error.lastlogin.duration");
}
}