//
// 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 static com.bloatit.framework.webprocessor.context.Context.tr;
import java.util.EnumSet;
import com.bloatit.data.DaoBug.Level;
import com.bloatit.data.DaoMilestone;
import com.bloatit.framework.exceptions.highlevel.ShallNotPassException;
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.HtmlParagraph;
import com.bloatit.framework.webprocessor.components.PlaceHolderElement;
import com.bloatit.framework.webprocessor.components.advanced.HtmlGenericTableModel;
import com.bloatit.framework.webprocessor.components.advanced.HtmlGenericTableModel.ColumnGenerator;
import com.bloatit.framework.webprocessor.components.advanced.HtmlGenericTableModel.StringColumnGenerator;
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.components.meta.HtmlNode;
import com.bloatit.framework.webprocessor.context.Context;
import com.bloatit.model.Member;
import com.bloatit.model.Milestone;
import com.bloatit.model.Release;
import com.bloatit.model.admin.MilestoneAdminListFactory;
import com.bloatit.model.right.UnauthorizedOperationException;
import com.bloatit.model.right.UnauthorizedPublicAccessException;
import com.bloatit.web.linkable.IndexPage;
import com.bloatit.web.linkable.master.Breadcrumb;
import com.bloatit.web.url.MilestoneAdminPageUrl;
@ParamContainer("admin/milestones")
public final class MilestoneAdminPage extends IdentifiablesAdminPage<DaoMilestone, Milestone, MilestoneAdminListFactory> {
@RequestParam(role = RequestParam.Role.POST)
@Optional("NOT_SELECTED")
private final DisplayableMilestoneState milestoneState;
private final MilestoneAdminPageUrl url;
public MilestoneAdminPage(final MilestoneAdminPageUrl url) {
super(url, new MilestoneAdminListFactory());
this.url = url;
milestoneState = url.getMilestoneState();
if (milestoneState != null && milestoneState != DisplayableMilestoneState.NOT_SELECTED) {
getFactory().stateEquals(DisplayableMilestoneState.getState(milestoneState));
Context.getSession().addParameter(url.getMilestoneStateParameter());
}
}
@Override
protected String createPageTitle() {
return tr("Administration Kudosable");
}
@Override
public boolean isStable() {
return true;
}
@Override
protected void addActions(final HtmlDropDown dropDown, final HtmlBranch block) {
// Add actions into the drop down
dropDown.addDropDownElements(new AdminActionManager().milestoneActions());
}
@Override
protected void addFormFilters(final HtmlBranch form) {
final FieldData stateData = url.getMilestoneStateParameter().pickFieldData();
final HtmlDropDown stateInput = new HtmlDropDown(stateData.getName());
stateInput.addErrorMessages(stateData.getErrorMessages());
stateInput.addDropDownElements(EnumSet.allOf(DisplayableMilestoneState.class));
stateInput.setLabel(tr("Filter by milestone state"));
form.add(stateInput);
}
@Override
protected void addColumns(final HtmlGenericTableModel<Milestone> tableModel) {
final MilestoneAdminPageUrl clonedUrl = url.clone();
clonedUrl.setOrderByStr("milestoneState");
tableModel.addColumn(clonedUrl.getHtmlLink(tr("milestoneState")), new StringColumnGenerator<Milestone>() {
@Override
public String getStringBody(final Milestone element) {
return String.valueOf(element.getMilestoneState());
}
});
tableModel.addColumn(tr("description"), new StringColumnGenerator<Milestone>() {
@Override
public String getStringBody(final Milestone element) {
return element.getDescription();
}
});
tableModel.addColumn(tr("Release"), new ColumnGenerator<Milestone>() {
@Override
public HtmlNode getBody(final Milestone element) {
final PlaceHolderElement place = new PlaceHolderElement();
for (final Release release : element.getReleases()) {
place.add(new HtmlParagraph(release.getVersion() + " "
+ Context.getLocalizator().getDate(release.getCreationDate()).toString(FormatStyle.MEDIUM)));
}
return place;
}
});
tableModel.addColumn(tr("Should validated"), new ColumnGenerator<Milestone>() {
@Override
public HtmlNode getBody(final Milestone element) {
final PlaceHolderElement place = new PlaceHolderElement();
for (final Level level : EnumSet.allOf(Level.class)) {
try {
if (element.partIsValidated(level)) {
place.add(new HtmlParagraph(level.toString() + " -> VALIDATED"));
} else {
if (element.shouldValidatePart(level)) {
place.add(new HtmlParagraph(level.toString() + " -> SHOULD"));
} else {
place.add(new HtmlParagraph(level.toString() + " -> SHOULDN'T"));
}
}
} catch (final UnauthorizedPublicAccessException e) {
throw new ShallNotPassException(e);
} catch (final UnauthorizedOperationException e) {
throw new ShallNotPassException(e);
}
}
return place;
}
});
}
@Override
protected Breadcrumb createBreadcrumb(final Member member) {
return MilestoneAdminPage.generateBreadcrumb();
}
private static Breadcrumb generateBreadcrumb() {
final Breadcrumb breadcrumb = IndexPage.generateBreadcrumb();
breadcrumb.pushLink(new MilestoneAdminPageUrl().getHtmlLink(tr("Milestone administration")));
return breadcrumb;
}
}