/*
* 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 net.rrm.ehour.domain.ProjectAssignment;
import net.rrm.ehour.domain.User;
import net.rrm.ehour.exception.ObjectNotFoundException;
import net.rrm.ehour.exception.ParentChildConstraintException;
import net.rrm.ehour.project.service.ProjectAssignmentManagementService;
import net.rrm.ehour.project.service.ProjectAssignmentService;
import net.rrm.ehour.project.service.ProjectAssignmentValidationException;
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.event.PayloadAjaxEvent;
import net.rrm.ehour.ui.common.model.AdminBackingBean;
import net.rrm.ehour.ui.common.panel.AbstractFormSubmittingPanel;
import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import java.util.List;
/**
* Assignment panel displaying the list and the tabbed form for adding/editing
*/
@SuppressWarnings("serial")
public class AssignmentPanel extends AbstractFormSubmittingPanel<Void> {
private static final long serialVersionUID = -3721224427697057895L;
private static final Logger LOGGER = Logger.getLogger(AssignmentPanel.class);
@SpringBean
private ProjectAssignmentService assignmentService;
@SpringBean
private ProjectAssignmentManagementService projectAssignmentManagementService;
private AddEditTabbedPanel<AssignmentAdminBackingBean> tabbedPanel;
private AssignmentListPanel listPanel;
public AssignmentPanel(String id, final User user) {
super(id);
setOutputMarkupId(true);
listPanel = new AssignmentListPanel("assignmentList", user);
add(listPanel);
tabbedPanel = new AddEditTabbedPanel<AssignmentAdminBackingBean>("assignmentTabs",
new ResourceModel("admin.assignment.newAssignment"),
new ResourceModel("admin.assignment.editAssignment"),
new ResourceModel("admin.assignment.noEditEntrySelected")) {
@Override
protected Panel getAddPanel(String panelId) {
return new AssignmentFormPanel(panelId,
new CompoundPropertyModel<>(getAddBackingBean()));
}
@Override
protected Panel getEditPanel(String panelId) {
return new AssignmentFormPanel(panelId,
new CompoundPropertyModel<>(getEditBackingBean()));
}
@Override
protected AssignmentAdminBackingBean createAddBackingBean() {
return AssignmentAdminBackingBean.createAssignmentAdminBackingBean(user);
}
@Override
protected AssignmentAdminBackingBean createEditBackingBean() {
return AssignmentAdminBackingBean.createAssignmentAdminBackingBean(user);
}
};
add(tabbedPanel);
}
@Override
public Boolean ajaxEventReceived(AjaxEvent ajaxEvent) {
AjaxEventType type = ajaxEvent.getEventType();
if (type == AssignmentAjaxEventType.ASSIGNMENT_EDIT) {
if (editAssignment(ajaxEvent)) {
return false;
}
} else if (type == AssignmentAjaxEventType.ASSIGNMENT_DELETED || type == AssignmentAjaxEventType.ASSIGNMENT_UPDATED) {
modifyAssignment(ajaxEvent, type);
}
return true;
}
@SuppressWarnings("unchecked")
private boolean editAssignment(AjaxEvent ajaxEvent) {
try {
ProjectAssignment assignment = ((PayloadAjaxEvent<ProjectAssignment>) ajaxEvent).getPayload();
tabbedPanel.setEditBackingBean(new AssignmentAdminBackingBean(assignmentService.getProjectAssignment(assignment.getAssignmentId())));
tabbedPanel.switchTabOnAjaxTarget(ajaxEvent.getTarget(), AddEditTabbedPanel.TABPOS_EDIT);
} catch (ObjectNotFoundException e) {
LOGGER.error("While getting assignment", e);
return true;
}
return false;
}
@SuppressWarnings("unchecked")
private void modifyAssignment(AjaxEvent ajaxEvent, AjaxEventType type) {
AssignmentAdminBackingBean backingBean = (AssignmentAdminBackingBean) ((PayloadAjaxEvent<AdminBackingBean>) ajaxEvent).getPayload();
AjaxRequestTarget target = ajaxEvent.getTarget();
try {
if (type == AssignmentAjaxEventType.ASSIGNMENT_UPDATED) {
persistAssignment(backingBean);
} else {
deleteAssignment(backingBean);
}
listPanel.updateList(target, backingBean.getUser());
tabbedPanel.succesfulSave(target);
} catch (ProjectAssignmentValidationException e) {
AssignmentPersistenceError persistenceError = new AssignmentPersistenceError(target);
send(this, Broadcast.BREADTH, persistenceError);
LOGGER.warn("Cannot persist assignment", e);
} catch (Exception e) {
AssignmentPersistenceError persistenceError = new AssignmentPersistenceError(target);
send(this, Broadcast.BREADTH, persistenceError);
LOGGER.warn("While deleting assignment", e);
}
}
private void persistAssignment(AssignmentAdminBackingBean backingBean) throws ProjectAssignmentValidationException {
if (backingBean.isNewAssignment()) {
List<ProjectAssignment> projectAssignmentsForSave = backingBean.getProjectAssignmentsForSave();
for (ProjectAssignment projectAssignment : projectAssignmentsForSave) {
projectAssignmentManagementService.persistNewProjectAssignment(projectAssignment);
}
} else {
projectAssignmentManagementService.persistUpdatedProjectAssignment(backingBean.getProjectAssignmentForSave());
}
}
private void deleteAssignment(AssignmentAdminBackingBean backingBean) throws ObjectNotFoundException, ParentChildConstraintException {
projectAssignmentManagementService.deleteProjectAssignment(backingBean.getProjectAssignment());
}
}