package net.rrm.ehour.ui.manage.department; import com.google.common.collect.Lists; import net.rrm.ehour.domain.UserDepartment; import net.rrm.ehour.exception.ObjectNotFoundException; import net.rrm.ehour.sort.UserDepartmentComparator; 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.model.AdminBackingBean; 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 net.rrm.ehour.user.service.UserService; 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; public abstract class AbstractDepartmentManagePageTemplate<T extends AdminBackingBean> extends AbstractTabbedManagePage<T> { private static final String DEPT_SELECTOR_ID = "deptSelector"; private static final long serialVersionUID = -6686097898699382233L; @SpringBean private UserService userService; private EntrySelectorPanel entrySelectorPanel; public AbstractDepartmentManagePageTemplate() { super(new ResourceModel("admin.dept.title"), new ResourceModel("admin.dept.addDepartment"), new ResourceModel("admin.dept.editDepartment"), new ResourceModel("admin.dept.noEditEntrySelected")); } @Override protected void onInitialize() { super.onInitialize(); GreyRoundedBorder greyBorder = new GreyRoundedBorder("entrySelectorFrame", new ResourceModel("admin.dept.title")); addOrReplace(greyBorder); entrySelectorPanel = constructEntrySelectorBuilder().build(); greyBorder.addOrReplace(entrySelectorPanel); } protected EntrySelectorBuilder constructEntrySelectorBuilder() { EntrySelectorPanel.ClickHandler clickHandler = new EntrySelectorPanel.ClickHandler() { @Override public void onClick(EntrySelectorData.EntrySelectorRow row, AjaxRequestTarget target) throws ObjectNotFoundException { Integer departmentId = (Integer) row.getId(); getTabbedPanel().setEditBackingBean(createEditBean(departmentId)); getTabbedPanel().switchTabOnAjaxTarget(target, AddEditTabbedPanel.TABPOS_EDIT); } }; return EntrySelectorBuilder.startAs(DEPT_SELECTOR_ID) .withData(createSelectorData(getUserDepartments())) .onClick(clickHandler); } protected EntrySelectorData createSelectorData(List<UserDepartment> userDepartments) { List<Header> headers = Lists.newArrayList(new Header("admin.dept.code"), new Header("admin.dept.name"), new Header("admin.dept.users", EntrySelectorData.ColumnType.NUMERIC)); List<EntrySelectorData.EntrySelectorRow> rows = Lists.newArrayList(); for (UserDepartment department : userDepartments) { List<String> cells = Lists.newArrayList(department.getCode(), department.getName(), Integer.toString(department.getUsers() == null ? 0 : department.getUsers().size())); rows.add(new EntrySelectorData.EntrySelectorRow(cells, department.getDepartmentId())); } return new EntrySelectorData(headers, rows); } @Override protected void onFilterChanged(InactiveFilterChangedEvent inactiveFilterChangedEvent, AjaxRequestTarget target) { throw new IllegalArgumentException("Not supported"); } @Override public Boolean ajaxEventReceived(AjaxEvent ajaxEvent) { AjaxEventType type = ajaxEvent.getEventType(); if (type == DepartmentAjaxEventType.DEPARTMENT_DELETED || type == DepartmentAjaxEventType.DEPARTMENT_UPDATED) { entrySelectorPanel.updateData(createSelectorData(getUserDepartments())); entrySelectorPanel.reRender(ajaxEvent.getTarget()); getTabbedPanel().succesfulSave(ajaxEvent.getTarget()); } return true; } protected abstract T createEditBean(Integer deptId) throws ObjectNotFoundException; private List<UserDepartment> getUserDepartments() { List<UserDepartment> userDepartments = userService.getUserDepartments(); Collections.sort(userDepartments, new UserDepartmentComparator()); return userDepartments; } protected final UserService getUserService() { return userService; } }