package net.rrm.ehour.ui.manage.project;
import com.google.common.collect.Lists;
import net.rrm.ehour.domain.Project;
import net.rrm.ehour.exception.ObjectNotFoundException;
import net.rrm.ehour.project.service.ProjectService;
import net.rrm.ehour.sort.ProjectComparator;
import net.rrm.ehour.ui.common.border.GreyRoundedBorder;
import net.rrm.ehour.ui.common.component.AddEditTabbedPanel;
import net.rrm.ehour.ui.common.event.AjaxEvent;
import net.rrm.ehour.ui.common.event.AjaxEventType;
import net.rrm.ehour.ui.common.panel.entryselector.EntrySelectorData;
import net.rrm.ehour.ui.common.panel.entryselector.EntrySelectorPanel;
import net.rrm.ehour.ui.common.panel.entryselector.EntrySelectorPanel.EntrySelectorBuilder;
import net.rrm.ehour.ui.common.panel.entryselector.InactiveFilterChangedEvent;
import net.rrm.ehour.ui.manage.AbstractTabbedManagePage;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import java.util.Collections;
import java.util.List;
import static net.rrm.ehour.ui.common.panel.entryselector.EntrySelectorData.Header;
import static net.rrm.ehour.ui.common.panel.entryselector.EntrySelectorPanel.ClickHandler;
public abstract class AbstractProjectManagePageTemplate<T extends ProjectAdminBackingBean> extends AbstractTabbedManagePage<T> {
private static final long serialVersionUID = 9196677804018589806L;
private static final String PROJECT_SELECTOR_ID = "projectSelector";
private static final int TABPOS_USERS = 2;
private EntrySelectorPanel entrySelectorPanel;
@SpringBean
private ProjectService projectService;
public AbstractProjectManagePageTemplate() {
super(new ResourceModel("admin.project.title"),
new ResourceModel("admin.project.addProject"),
new ResourceModel("admin.project.editProject"),
new ResourceModel("admin.project.noEditEntrySelected"));
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
GreyRoundedBorder greyBorder = new GreyRoundedBorder("entrySelectorFrame", new ResourceModel("admin.project.title"));
addOrReplace(greyBorder);
EntrySelectorBuilder builder = constructEntrySelectorBuilder();
entrySelectorPanel = builder.build();
greyBorder.addOrReplace(entrySelectorPanel);
}
protected EntrySelectorBuilder constructEntrySelectorBuilder() {
ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(EntrySelectorData.EntrySelectorRow row, AjaxRequestTarget target) throws ObjectNotFoundException {
Integer projectId = (Integer) row.getId();
getTabbedPanel().setEditBackingBean(createEditBean(projectId));
getTabbedPanel().switchTabOnAjaxTarget(target, AddEditTabbedPanel.TABPOS_EDIT);
}
};
return EntrySelectorBuilder.startAs(PROJECT_SELECTOR_ID)
.onClick(clickHandler)
.withData(createSelectorData(getProjects(isHideInactive())))
.withInactiveTooltip(new ResourceModel("admin.project.hideInactive"));
}
protected abstract T createEditBean(Integer projectId) throws ObjectNotFoundException;
@SuppressWarnings("unchecked")
@Override
public Boolean ajaxEventReceived(AjaxEvent ajaxEvent) {
AjaxEventType type = ajaxEvent.getEventType();
if (type == ProjectAjaxEventType.PROJECT_UPDATED
|| type == ProjectAjaxEventType.PROJECT_CREATED
|| type == ProjectAjaxEventType.PROJECT_DELETED) {
// update project list
entrySelectorPanel.updateData(createSelectorData(getProjects(isHideInactive())));
entrySelectorPanel.reRender(ajaxEvent.getTarget());
getTabbedPanel().succesfulSave(ajaxEvent.getTarget());
}
return false;
}
@Override
protected void onFilterChanged(InactiveFilterChangedEvent inactiveFilterChangedEvent, AjaxRequestTarget target) {
entrySelectorPanel.updateData(createSelectorData(getProjects(inactiveFilterChangedEvent.hideInactiveFilter().isHideInactive())));
entrySelectorPanel.reRender(target);
}
@Override
protected void onTabSwitch(int index) {
if (index == AddEditTabbedPanel.TABPOS_ADD) {
getTabbedPanel().removeTab(TABPOS_USERS);
}
}
protected EntrySelectorData createSelectorData(List<Project> projects) {
List<Header> headers = Lists.newArrayList(new Header("admin.project.code.short"), new Header("admin.project.name"));
List<EntrySelectorData.EntrySelectorRow> rows = Lists.newArrayList();
for (Project project : projects) {
boolean active = project.isActive();
List<String> cells = Lists.newArrayList(project.getProjectCode(), project.getName());
rows.add(new EntrySelectorData.EntrySelectorRow(cells, project.getProjectId(), active));
}
return new EntrySelectorData(headers, rows);
}
private List<Project> getProjects(boolean hideInactive) {
List<Project> projects;
if (hideInactive) {
projects = projectService.getActiveProjects();
} else {
projects = projectService.getProjects();
}
Collections.sort(projects, new ProjectComparator());
return projects;
}
}