/**
* <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.HashMap;
import java.util.List;
import java.util.Map;
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.modules.portfolio.BinderConfiguration;
import org.olat.modules.portfolio.BinderSecurityCallback;
import org.olat.modules.portfolio.Category;
import org.olat.modules.portfolio.CategoryToElement;
import org.olat.modules.portfolio.Page;
import org.olat.modules.portfolio.ui.model.PortfolioElementRow;
/**
*
* Initial date: 22.07.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class DeletedPageListController extends AbstractPageListController {
private FormLink deleteButton;
private CloseableModalController cmc;
private DialogBoxController confirmDeleteCtrl;
private RestorePageController restorePageCtrl;
public DeletedPageListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
BinderSecurityCallback secCallback) {
super(ureq, wControl, stackPanel, secCallback, BinderConfiguration.createDeletedPagesConfig(), "deleted_pages", false);
initForm(ureq);
loadModel(ureq, null);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
super.initForm(formLayout, listener, ureq);
model.getTableColumnModel().addFlexiColumnModel(new DefaultFlexiColumnModel("restore.page", translate("restore.page"), "restore"));
tableEl.setMultiSelect(true);
deleteButton = uifactory.addFormLink("delete.def.page", "delete.def.page", null, formLayout, Link.BUTTON);
deleteButton.setVisible(tableEl.getRendererType() == FlexiTableRendererType.classic);
tableEl.setSelectAllEnable(tableEl.getRendererType() == FlexiTableRendererType.classic);
}
@Override
protected void loadModel(UserRequest ureq, String searchString) {
Map<Long,Long> numberOfCommentsMap = portfolioService.getNumberOfCommentsOnOwnedPage(getIdentity());
List<CategoryToElement> categorizedElements = portfolioService.getCategorizedOwnedPages(getIdentity());
Map<OLATResourceable,List<Category>> categorizedElementMap = new HashMap<>();
for(CategoryToElement categorizedElement:categorizedElements) {
List<Category> categories = categorizedElementMap.get(categorizedElement.getCategorizedResource());
if(categories == null) {
categories = new ArrayList<>();
categorizedElementMap.put(categorizedElement.getCategorizedResource(), categories);
}
categories.add(categorizedElement.getCategory());
}
List<Page> pages = portfolioService.searchDeletedPages(getIdentity(), searchString);
List<PortfolioElementRow> rows = new ArrayList<>(pages.size());
for (Page page : pages) {
rows.add(forgePageRow(ureq, page, null, null, categorizedElementMap, numberOfCommentsMap));
}
disposeRows();//clean up the posters
model.setObjects(rows);
tableEl.reset();
tableEl.reloadData();
deleteButton.setVisible(tableEl.getRendererType() == FlexiTableRendererType.classic && model.getRowCount() > 0);
}
@Override
public void event(UserRequest ureq, Controller source, Event event) {
if(confirmDeleteCtrl == source) {
if(DialogBoxUIFactory.isYesEvent(event)) {
@SuppressWarnings("unchecked")
List<PortfolioElementRow> rows = (List<PortfolioElementRow>)confirmDeleteCtrl.getUserObject();
doDelete(ureq, rows);
}
} else if(restorePageCtrl == source) {
if(event == Event.DONE_EVENT) {
loadModel(ureq, null);
fireEvent(ureq, Event.CHANGED_EVENT);
}
cmc.deactivate();
cleanUp();
} else if(cmc == source) {
cleanUp();
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(restorePageCtrl);
removeAsListenerAndDispose(cmc);
restorePageCtrl = null;
cmc = null;
}
@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("select-page".equals(cmd)) {
PortfolioElementRow row = model.getObject(se.getIndex());
doOpenRow(ureq, row, false);
} else if("restore".equals(cmd)) {
PortfolioElementRow row = model.getObject(se.getIndex());
if(row.isPage()) {
doRestorePage(ureq, row);
}
}
}
} else if(deleteButton == source) {
doConfirmDelete(ureq);
}
super.formInnerEvent(ureq, source, event);
}
private void doRestorePage(UserRequest ureq, PortfolioElementRow row) {
Page reloadedPage = portfolioService.getPageByKey(row.getPage().getKey());
restorePageCtrl = new RestorePageController(ureq, getWindowControl(), reloadedPage);
listenTo(restorePageCtrl);
String title = translate("restore.page");
cmc = new CloseableModalController(getWindowControl(), null, restorePageCtrl.getInitialComponent(), true, title, true);
listenTo(cmc);
cmc.activate();
}
private void doConfirmDelete(UserRequest ureq) {
List<PortfolioElementRow> rows = getSelectedRows();
if(rows.isEmpty()) {
showWarning("page.atleastone");
} else if (rows.size() == 1) {
String title = translate("delete.def.page.confirm.title");
String text = translate("delete.def.page.confirm.descr", new String[]{
StringHelper.escapeHtml(rows.get(0).getPage().getTitle())
});
confirmDeleteCtrl = activateYesNoDialog(ureq, title, text, confirmDeleteCtrl);
confirmDeleteCtrl.setUserObject(rows);
} else {
StringBuilder names = new StringBuilder();
for(PortfolioElementRow row:rows) {
if(names.length() > 0) names.append(", ");
names.append(StringHelper.escapeHtml(row.getPage().getTitle()));
}
String title = translate("delete.def.pages.confirm.title", new String[] { Integer.toString(rows.size()) });
String text = translate("delete.def.pages.confirm.descr", new String[]{ names.toString() });
confirmDeleteCtrl = activateYesNoDialog(ureq, title, text, confirmDeleteCtrl);
confirmDeleteCtrl.setUserObject(rows);
}
}
private void doDelete(UserRequest ureq, List<PortfolioElementRow> rows) {
for(PortfolioElementRow row:rows) {
portfolioService.deletePage(row.getPage());
}
loadModel(ureq, null);
}
}