/**
* <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.modules.portfolio.ui;
import java.util.ArrayList;
import java.util.List;
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.FormLink;
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.FlexiTableRenderEvent;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType;
import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
import org.olat.core.gui.components.link.Link;
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.closablewrapper.CloseableModalController;
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.util.StringHelper;
import org.olat.core.util.resource.OresHelper;
import org.olat.modules.portfolio.Binder;
import org.olat.modules.portfolio.BinderConfiguration;
import org.olat.modules.portfolio.BinderRef;
import org.olat.modules.portfolio.BinderSecurityCallback;
import org.olat.modules.portfolio.BinderSecurityCallbackFactory;
import org.olat.modules.portfolio.BinderStatus;
import org.olat.modules.portfolio.model.BinderStatistics;
import org.olat.modules.portfolio.ui.event.DeleteBinderEvent;
import org.olat.modules.portfolio.ui.event.RestoreBinderEvent;
import org.olat.modules.portfolio.ui.model.BinderRow;
/**
*
* Initial date: 3 nov. 2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class DeletedBinderController extends BinderListController {
private FormLink deleteButton;
private DialogBoxController confirmRestoreBinderCtrl;
private ConfirmDeleteBinderController deleteBinderCtrl;
public DeletedBinderController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel) {
super(ureq, wControl, stackPanel);
}
@Override
public int getNumOfBinders() {
return model.getRowCount();
}
@Override
protected String getTableId() {
return "portfolio-deleted-binder-list";
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
super.initForm(formLayout, listener, ureq);
model.getTableColumnModel().addFlexiColumnModel(new DefaultFlexiColumnModel("restore.binder", translate("restore.binder"), "restore"));
tableEl.setAvailableRendererTypes(FlexiTableRendererType.custom, FlexiTableRendererType.classic);
tableEl.setMultiSelect(true);
deleteButton = uifactory.addFormLink("delete.binder", "delete.binder", null, formLayout, Link.BUTTON);
deleteButton.setVisible(tableEl.getRendererType() == FlexiTableRendererType.classic);
tableEl.setSelectAllEnable(tableEl.getRendererType() == FlexiTableRendererType.classic);
}
@Override
protected void loadModel() {
List<BinderStatistics> binderRows = portfolioService.searchOwnedDeletedBinders(getIdentity());
List<BinderRow> rows = new ArrayList<>(binderRows.size());
for(BinderStatistics binderRow:binderRows) {
rows.add(forgePortfolioRow(binderRow));
}
model.setObjects(rows);
tableEl.reset();
tableEl.reloadData();
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(binderCtrl == source) {
if(event instanceof RestoreBinderEvent || event instanceof DeleteBinderEvent) {
loadModel();
fireEvent(ureq, event);
}
} else if(deleteBinderCtrl == source) {
if(event == Event.DONE_EVENT) {
doDelete(deleteBinderCtrl.getBinderStatistics());
loadModel();
}
cmc.deactivate();
cleanUp();
} else if(confirmRestoreBinderCtrl == source) {
if(DialogBoxUIFactory.isYesEvent(event)) {
doRestore((BinderRow)confirmRestoreBinderCtrl.getUserObject());
loadModel();
}
}
super.event(ureq, source, event);
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(tableEl == source) {
if(event instanceof FlexiTableRenderEvent) {
FlexiTableRenderEvent se = (FlexiTableRenderEvent)event;
deleteButton.setVisible(se.getRendererType() == FlexiTableRendererType.classic
&& model.getRowCount() > 0);
tableEl.setSelectAllEnable(tableEl.getRendererType() == FlexiTableRendererType.classic);
} else if(event instanceof SelectionEvent) {
SelectionEvent se = (SelectionEvent)event;
String cmd = se.getCommand();
if("restore".equals(cmd)) {
BinderRow row = model.getObject(se.getIndex());
doConfirmRestoreBinder(ureq, row);
}
}
} else if(deleteButton == source) {
doConfirmDelete(ureq);
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void cleanUp() {
super.cleanUp();
removeAsListenerAndDispose(deleteBinderCtrl);
deleteBinderCtrl = null;
}
private void doConfirmDelete(UserRequest ureq) {
if(deleteBinderCtrl != null) return;
List<BinderRow> rows = getSelectedRows();
if(rows.isEmpty()) {
showWarning("binder.atleastone");
} else {
List<BinderStatistics> stats = new ArrayList<>(rows.size());
for(BinderRow row:rows) {
stats.add(row.getStatistics());
}
deleteBinderCtrl = new ConfirmDeleteBinderController(ureq, getWindowControl(), stats);
listenTo(deleteBinderCtrl);
String title = translate("delete.binder");
cmc = new CloseableModalController(getWindowControl(), null, deleteBinderCtrl.getInitialComponent(), true, title, true);
listenTo(cmc);
cmc.activate();
}
}
private void doDelete(List<BinderStatistics> stats) {
for(BinderStatistics stat:stats) {
portfolioService.deleteBinder(stat);
}
showInfo("delete.binder.success");
}
@Override
protected BinderController doOpenBinder(UserRequest ureq, BinderRef row) {
Binder binder = portfolioService.getBinderByKey(row.getKey());
return doOpenBinder(ureq, binder);
}
@Override
protected BinderController doOpenBinder(UserRequest ureq, Binder binder) {
if(binder == null) {
showWarning("warning.portfolio.not.found");
return null;
} else {
removeAsListenerAndDispose(binderCtrl);
OLATResourceable binderOres = OresHelper.createOLATResourceableInstance("Binder", binder.getKey());
WindowControl swControl = addToHistory(ureq, binderOres, null);
BinderSecurityCallback secCallback = BinderSecurityCallbackFactory.getCallbackForDeletedBinder();
BinderConfiguration config = BinderConfiguration.createConfig(binder);
binderCtrl = new BinderController(ureq, swControl, stackPanel, secCallback, binder, config);
listenTo(binderCtrl);
stackPanel.pushController(binder.getTitle(), binderCtrl);
return binderCtrl;
}
}
private void doConfirmRestoreBinder(UserRequest ureq, BinderRow row) {
String title = translate("restore.binder.confirm.title");
String text = translate("restore.binder.confirm.descr", new String[]{ StringHelper.escapeHtml(row.getTitle()) });
confirmRestoreBinderCtrl = activateYesNoDialog(ureq, title, text, confirmRestoreBinderCtrl);
confirmRestoreBinderCtrl.setUserObject(row);
}
private void doRestore(BinderRow row) {
Binder binder = portfolioService.getBinderByKey(row.getKey());
binder.setBinderStatus(BinderStatus.open);
binder = portfolioService.updateBinder(binder);
showInfo("restore.binder.success");
}
}