/* * 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.manage.assignment; import com.google.common.collect.Lists; import net.rrm.ehour.config.EhourConfig; import net.rrm.ehour.domain.ProjectAssignment; import net.rrm.ehour.domain.User; import net.rrm.ehour.project.service.ProjectAssignmentService; import net.rrm.ehour.sort.ProjectAssignmentComparator; import net.rrm.ehour.ui.common.border.GreyRoundedWideBorder; import net.rrm.ehour.ui.common.event.EventPublisher; import net.rrm.ehour.ui.common.event.PayloadAjaxEvent; import net.rrm.ehour.ui.common.model.DateModel; import net.rrm.ehour.ui.common.model.MessageResourceModel; import net.rrm.ehour.ui.common.panel.AbstractBasePanel; import net.rrm.ehour.ui.common.session.EhourWebSession; import net.rrm.ehour.ui.common.util.WebUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.border.Border; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.spring.injection.annot.SpringBean; import java.util.ArrayList; import java.util.Collections; import java.util.Currency; import java.util.List; /** * List of existing assignments */ @SuppressWarnings("serial") public class AssignmentListPanel extends AbstractBasePanel<Void> { private static final long serialVersionUID = -8798859357268916546L; @SpringBean private ProjectAssignmentService projectAssignmentService; private EhourConfig config; private ListView<ProjectAssignment> assignmentListView; private User user; private final Border greyBorder; public AssignmentListPanel(String id, User user) { super(id); this.user = user; config = EhourWebSession.getEhourConfig(); setOutputMarkupId(true); greyBorder = new GreyRoundedWideBorder("border", new StringResourceModel("admin.assignment.assignmentsFor", this, null, new Object[]{new Model<>(user.getFullName())}) ); greyBorder.setOutputMarkupId(true); add(greyBorder); List<ProjectAssignment> projectAssignments = getProjectAssignments(user); List<ProjectAssignment> filteredAssignments = filterAssignments(projectAssignments); greyBorder.add(getProjectAssignmentLists(filteredAssignments)); greyBorder.add(createFooter("footer", filteredAssignments.size(), projectAssignments.size())); greyBorder.add(createActiveCheckbox()); } public void updateList(AjaxRequestTarget target, User user) { List<ProjectAssignment> projectAssignments = getProjectAssignments(user); List<ProjectAssignment> filteredAssignments = filterAssignments(projectAssignments); assignmentListView.setList(filteredAssignments); greyBorder.addOrReplace(createFooter("footer", filteredAssignments.size(), projectAssignments.size())); target.add(greyBorder); } private List<ProjectAssignment> filterAssignments(List<ProjectAssignment> projectAssignments) { Boolean hideInactive = getEhourWebSession().getHideInactiveSelections(); List<ProjectAssignment> filteredAssignments = Lists.newArrayList(); if (hideInactive) { for (ProjectAssignment projectAssignment : projectAssignments) { if (projectAssignment.isBookable()) { filteredAssignments.add(projectAssignment); } } return filteredAssignments; } else { return projectAssignments; } } private Label createFooter(String id, int shown, int total) { Label label = new Label(id, new MessageResourceModel("admin.assignment.footer", this, shown, total)); label.setOutputMarkupId(true); return label; } private AjaxCheckBox createActiveCheckbox() { return new AjaxCheckBox("filterToggle", new Model<>(getEhourWebSession().getHideInactiveSelections())) { private static final long serialVersionUID = 2585047163449150793L; @Override protected void onUpdate(AjaxRequestTarget target) { getEhourWebSession().setHideInactiveSelections(Boolean.valueOf(getValue())); updateList(target, user); } }; } private ListView<ProjectAssignment> getProjectAssignmentLists(final List<ProjectAssignment> projectAssignments) { assignmentListView = new ListView<ProjectAssignment>("assignments", projectAssignments) { @Override protected void populateItem(ListItem<ProjectAssignment> item) { final ProjectAssignment assignment = item.getModelObject(); AjaxLink<Void> link = new AjaxLink<Void>("itemLink") { @Override public void onClick(AjaxRequestTarget target) { EventPublisher.publishAjaxEvent(AssignmentListPanel.this, new PayloadAjaxEvent<>(AssignmentAjaxEventType.ASSIGNMENT_EDIT, assignment)); } }; AjaxLink<Void> imgLink = new AjaxLink<Void>("imgLink") { @Override public void onClick(AjaxRequestTarget target) { EventPublisher.publishAjaxEvent(AssignmentListPanel.this, new PayloadAjaxEvent<>(AssignmentAjaxEventType.ASSIGNMENT_EDIT, assignment)); } }; item.add(imgLink); item.add(link); link.add(new Label("project", assignment.getProject().getFullName())); item.add(new Label("customer", assignment.getProject().getCustomer().getFullName())); Label dateStart = new Label("dateStart", new DateModel(assignment.getDateStart(), config, DateModel.DATESTYLE_FULL_SHORT)); dateStart.setEscapeModelStrings(false); item.add(dateStart); Label dateEnd = new Label("dateEnd", new DateModel(assignment.getDateEnd(), config, DateModel.DATESTYLE_FULL_SHORT)); dateEnd.setEscapeModelStrings(false); item.add(dateEnd); item.add(new Label("assignmentType", new ResourceModel(WebUtils.getResourceKeyForProjectAssignmentType(assignment.getAssignmentType())))); item.add(new Label("role", (StringUtils.isBlank(assignment.getRole())) ? "--" : assignment.getRole())); item.add(new Label("currency", Currency.getInstance(config.getCurrency()).getSymbol(config.getCurrency()))); item.add(new Label("rate", new Model<>(assignment.getHourlyRate()))); } }; return assignmentListView; } private List<ProjectAssignment> getProjectAssignments(User user) { List<ProjectAssignment> assignments = user.getUserId() != null ? projectAssignmentService.getProjectAssignmentsForUser(user) : Lists.<ProjectAssignment>newArrayList(); if (assignments != null) { Collections.sort(assignments, new ProjectAssignmentComparator(ProjectAssignmentComparator.ASSIGNMENT_COMPARE_CUSTDATEPRJ)); setVisible(true); } else { assignments = new ArrayList<>(); } return assignments; } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(CssHeaderItem.forReference(new CssResourceReference(AssignmentListPanel.class, "assignment_admin.css"))); } }