/*
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.ui.report.page;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import net.rrm.ehour.domain.UserRole;
import net.rrm.ehour.report.criteria.ReportCriteria;
import net.rrm.ehour.report.criteria.UserSelectedCriteria;
import net.rrm.ehour.ui.common.event.AjaxEvent;
import net.rrm.ehour.ui.common.model.KeyResourceModel;
import net.rrm.ehour.ui.common.model.MessageResourceModel;
import net.rrm.ehour.ui.common.session.EhourWebSession;
import net.rrm.ehour.ui.report.builder.ReportTabFactory;
import net.rrm.ehour.ui.report.builder.ReportTabs;
import net.rrm.ehour.ui.report.panel.criteria.ReportCriteriaAjaxEventType;
import net.rrm.ehour.ui.report.panel.criteria.ReportCriteriaBackingBean;
import net.rrm.ehour.ui.report.panel.criteria.ReportCriteriaPanel;
import net.rrm.ehour.ui.report.panel.criteria.ReportTabbedPanel;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.head.CssReferenceHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.spring.injection.annot.SpringBean;
import java.util.ArrayList;
import java.util.List;
import static net.rrm.ehour.ui.report.panel.criteria.ReportCriteriaPanel.ReportTypeChangeEvent;
@AuthorizeInstantiation(value = {UserRole.ROLE_USER, UserRole.ROLE_REPORT, UserRole.ROLE_PROJECTMANAGER})
public class ReportPage extends AbstractReportPage<ReportCriteriaBackingBean> {
private static final long serialVersionUID = 6614404841734599622L;
private static final CssResourceReference REPORT_CSS = new CssResourceReference(ReportPage.class, "report.css");
private ReportTabbedPanel tabPanel;
@SpringBean
private ReportTabs reportTabs;
public ReportPage() {
super(new ResourceModel("report.global.title"));
}
@Override
public void onEvent(IEvent<?> event) {
if (event.getPayload() instanceof ReportTypeChangeEvent) {
ReportTypeChangeEvent e = (ReportTypeChangeEvent)event.getPayload();
reset();
e.target.add(tabPanel);
}
}
@Override
protected void onInitialize() {
super.onInitialize();
reset();
}
@Override
protected void onRenderHead(IHeaderResponse response) {
response.render(CssReferenceHeaderItem.forReference(REPORT_CSS));
}
private void reset() {
final ReportCriteria reportCriteria = getReportCriteria();
final IModel<ReportCriteriaBackingBean> model = new CompoundPropertyModel<>(new ReportCriteriaBackingBean(reportCriteria));
setDefaultModel(model);
List<ITab> tabList = new ArrayList<>();
tabList.add(new AbstractTab(getReportTitle(reportCriteria.getUserSelectedCriteria())) {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public Panel getPanel(String panelId) {
return new ReportCriteriaPanel(panelId, model);
}
});
tabPanel = new ReportTabbedPanel("reportContainer", tabList);
addOrReplace(tabPanel);
}
private IModel<String> getReportTitle(UserSelectedCriteria userSelectedCriteria) {
if (userSelectedCriteria.isForPm()) {
return new KeyResourceModel("report.criteria.title.pm");
} else if (userSelectedCriteria.isForGlobalReport()) {
return new KeyResourceModel("report.criteria.title.global");
} else {
return new MessageResourceModel("report.criteria.title.user", this, EhourWebSession.getUser().getFullName());
}
}
@Override
public Boolean ajaxEventReceived(AjaxEvent ajaxEvent) {
if (ajaxEvent.getEventType() == ReportCriteriaAjaxEventType.CRITERIA_UPDATED) {
updateCriteria(ajaxEvent);
} else if (ajaxEvent.getEventType() == ReportCriteriaAjaxEventType.CRITERIA_RESET) {
resetCriteria(ajaxEvent);
}
return false;
}
private void resetCriteria(AjaxEvent ajaxEvent) {
getEhourWebSession().setUserSelectedCriteria(null);
reset();
ajaxEvent.getTarget().add(tabPanel);
}
private void updateCriteria(AjaxEvent ajaxEvent) {
ReportCriteriaBackingBean backingBean = (ReportCriteriaBackingBean) getDefaultModelObject();
clearTabs();
addReportTabs(backingBean);
ajaxEvent.getTarget().add(tabPanel);
}
/**
* Clear tabs except for the first one
*/
private void clearTabs() {
List<ITab> tabs = tabPanel.getTabs();
while (tabs.size() > 1) {
tabs.remove(1);
}
}
private void addReportTabs(ReportCriteriaBackingBean backingBean) {
List<ReportTabFactory> tabFactories = reportTabs.getTabFactories();
List<ITab> tabs = Lists.newArrayList();
for (ReportTabFactory tabFactory : tabFactories) {
Optional<ITab> reportTab = tabFactory.createReportTab(backingBean.getReportCriteria());
if (reportTab.isPresent()) {
tabs.add(reportTab.get());
}
}
addTabs(tabs);
tabPanel.setSelectedTab(1);
}
private void addTabs(List<ITab> tabs) {
for (ITab iTab : tabs) {
tabPanel.addTab(iTab);
}
}
}