//
// Copyright (c) 2011 Linkeos.
//
// This file is part of Elveos.org.
// Elveos.org is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at your
// option) any later version.
//
// Elveos.org is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
// You should have received a copy of the GNU General Public License along
// with Elveos.org. If not, see http://www.gnu.org/licenses/.
//
package com.bloatit.web.linkable.admin;
import java.util.EnumSet;
import com.bloatit.data.DaoUserContent;
import com.bloatit.framework.utils.i18n.DateLocale.FormatStyle;
import com.bloatit.framework.webprocessor.annotations.Optional;
import com.bloatit.framework.webprocessor.annotations.ParamContainer;
import com.bloatit.framework.webprocessor.annotations.RequestParam;
import com.bloatit.framework.webprocessor.components.advanced.HtmlGenericTableModel;
import com.bloatit.framework.webprocessor.components.advanced.HtmlGenericTableModel.StringColumnGenerator;
import com.bloatit.framework.webprocessor.components.form.Displayable;
import com.bloatit.framework.webprocessor.components.form.FieldData;
import com.bloatit.framework.webprocessor.components.form.HtmlDropDown;
import com.bloatit.framework.webprocessor.components.meta.HtmlBranch;
import com.bloatit.framework.webprocessor.context.Context;
import com.bloatit.model.Team;
import com.bloatit.model.UserContentInterface;
import com.bloatit.model.admin.UserContentAdminListFactory;
import com.bloatit.web.url.UserContentAdminPageUrl;
@ParamContainer("admin/usercontent")
public abstract class UserContentAdminPage<U extends DaoUserContent, V extends UserContentInterface, T extends UserContentAdminListFactory<U, V>>
extends IdentifiablesAdminPage<U, V, UserContentAdminListFactory<U, V>> {
public enum OrderByUserContent implements Displayable {
NOTHING(tr("No order")), //
MEMBER(tr("Member")), //
TEAM(tr("Team")), //
DATE(tr("Creation date")), //
TYPE(tr("Type"));
private String displayName;
@Override
public String getDisplayName() {
return Context.tr(displayName);
}
private OrderByUserContent(final String displayName) {
this.displayName = displayName;
}
// Fake tr
private static String tr(final String fake) {
return fake;
}
}
@RequestParam
@Optional("WITHOUT")
private final DisplayableFilterType filterDeleted;
@RequestParam
@Optional("NO_FILTER")
private final DisplayableFilterType filterFile;
@RequestParam
@Optional("NO_FILTER")
private final DisplayableFilterType filterTeam;
private final T factory;
private final UserContentAdminPageUrl url;
protected UserContentAdminPage(final UserContentAdminPageUrl url, final T factory) {
super(url, factory);
this.url = url;
this.factory = factory;
filterDeleted = url.getFilterDeleted();
filterFile = url.getFilterFile();
filterTeam = url.getFilterTeam();
// Save parameters
Context.getSession().addParameter(url.getOrderByStrParameter());
Context.getSession().addParameter(url.getAscParameter());
Context.getSession().addParameter(url.getFilterDeletedParameter());
Context.getSession().addParameter(url.getFilterFileParameter());
Context.getSession().addParameter(url.getFilterTeamParameter());
if (filterDeleted == DisplayableFilterType.WITH) {
factory.deletedOnly();
} else if (filterDeleted == DisplayableFilterType.WITHOUT) {
factory.nonDeletedOnly();
}
if (filterFile == DisplayableFilterType.WITH) {
factory.withoutFile();
} else if (filterFile == DisplayableFilterType.WITHOUT) {
factory.withFile();
}
if (filterTeam == DisplayableFilterType.WITH) {
factory.withAnyTeam();
} else if (filterTeam == DisplayableFilterType.WITHOUT) {
factory.withNoTeam();
}
}
protected void addAsTeamFilter(final HtmlBranch filterForm, final UserContentAdminPageUrl url) {
final FieldData groupAsTeamData = url.getFilterTeamParameter().pickFieldData();
final HtmlDropDown groupAsTeam = new HtmlDropDown(groupAsTeamData.getName());
groupAsTeam.addErrorMessages(groupAsTeamData.getErrorMessages());
groupAsTeam.addDropDownElements(EnumSet.allOf(DisplayableFilterType.class));
groupAsTeam.setLabel(Context.tr("Filter by Content created as a group"));
filterForm.add(groupAsTeam);
}
protected void addHasFileFilter(final HtmlBranch filterForm, final UserContentAdminPageUrl url) {
final FieldData groupFileData = url.getFilterFileParameter().pickFieldData();
final HtmlDropDown groupFile = new HtmlDropDown(groupFileData.getName());
groupFile.addErrorMessages(groupFileData.getErrorMessages());
groupFile.addDropDownElements(EnumSet.allOf(DisplayableFilterType.class));
groupFile.setLabel(Context.tr("Filter by Content with file"));
filterForm.add(groupFile);
}
protected void addIsDeletedFilter(final HtmlBranch filterForm, final UserContentAdminPageUrl url) {
final FieldData groupDeletedData = url.getFilterDeletedParameter().pickFieldData();
final HtmlDropDown groupDeleted = new HtmlDropDown(groupDeletedData.getName());
groupDeleted.addDropDownElements(EnumSet.allOf(DisplayableFilterType.class));
groupDeleted.addErrorMessages(groupDeletedData.getErrorMessages());
groupDeleted.setLabel(Context.tr("Filter by deleted content"));
filterForm.add(groupDeleted);
}
@Override
protected void addTypeColumn(final HtmlGenericTableModel<V> tableModel) {
tableModel.addColumn(Context.tr("Type"), new StringColumnGenerator<V>() {
@Override
public String getStringBody(final V element) {
return element.getClass().getSimpleName();
}
});
}
protected void addIsDeletedColumn(final HtmlGenericTableModel<V> tableModel, final UserContentAdminPageUrl clonedUrl) {
clonedUrl.setOrderByStr("isDeleted");
tableModel.addColumn(clonedUrl.getHtmlLink(Context.tr("Deleted")), new StringColumnGenerator<V>() {
@SuppressWarnings("synthetic-access")
@Override
public String getStringBody(final V element) {
// try {
return String.valueOf(element.isDeleted());
// FIXME: isDeleted no more nedd admin rigth. There was a reason
// to request admin rigth ?
// } catch (final UnauthorizedOperationException e) {
// getSession().notifyWarning("HAHAHA !");
// throw new
// ShallNotPassException("UnauthorizedOperationException on admin page",
// e);
// }
}
});
}
protected void addNbFilesColumn(final HtmlGenericTableModel<V> tableModel) {
tableModel.addColumn(Context.tr("Nb files"), new StringColumnGenerator<V>() {
@Override
public String getStringBody(final V element) {
return String.valueOf(element.getFiles().size());
}
});
}
protected void addCreationDateColumn(final HtmlGenericTableModel<V> tableModel, final UserContentAdminPageUrl clonedUrl) {
clonedUrl.setOrderByStr("creationDate");
tableModel.addColumn(clonedUrl.getHtmlLink(Context.tr("Creation date")), new StringColumnGenerator<V>() {
@Override
public String getStringBody(final V element) {
return Context.getLocalizator().getDate(element.getCreationDate()).toString(FormatStyle.MEDIUM);
}
});
}
protected void addAsTeamColumn(final HtmlGenericTableModel<V> tableModel, final UserContentAdminPageUrl clonedUrl) {
clonedUrl.setOrderByStr("asTeam");
tableModel.addColumn(clonedUrl.getHtmlLink(Context.tr("asTeam")), new StringColumnGenerator<V>() {
@Override
public String getStringBody(final V element) {
final Team asTeam = element.getAsTeam();
if (asTeam != null) {
return asTeam.getLogin();
}
return "null";
}
});
}
protected UserContentAdminPageUrl addAuthorColumn(final HtmlGenericTableModel<V> tableModel) {
final UserContentAdminPageUrl clonedUrl = url.clone();
clonedUrl.setOrderByStr("m.login");
tableModel.addColumn(clonedUrl.getHtmlLink(Context.tr("Author")), new StringColumnGenerator<V>() {
@Override
public String getStringBody(final V element) {
return element.getMember().getLogin();
}
});
return clonedUrl;
}
@Override
protected void addActions(final HtmlDropDown dropDown, final HtmlBranch actionTeam) {
// redefine me in subclasses.
dropDown.addDropDownElements(new AdminActionManager().userContentActions());
}
@Override
protected abstract void addColumns(HtmlGenericTableModel<V> tableModel);
@Override
protected abstract void addFormFilters(HtmlBranch form);
@Override
protected T getFactory() {
return factory;
}
}