From ca86c140654062dc00e09f718f7e0ce0372ef735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 25 May 2009 18:45:57 +0200 Subject: [PATCH] ItEr09S09AdministracionGrupos: It allows to add and remove workers for a criterion which its type allows multiple active values. --- .../criterion/CriterionAdminController.java | 5 +- .../criterion/CriterionEditController.java | 20 +--- .../criterion/CriterionWorkersController.java | 109 ++++++++++++++++++ .../resources/criterion/CriterionsModel.java | 98 +++++++++------- .../resources/criterion/ICriterionsModel.java | 17 +-- .../webapp/resources/criterions/_edition.zul | 4 +- .../webapp/resources/criterions/_workers.zul | 23 ++-- 7 files changed, 196 insertions(+), 80 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionAdminController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionAdminController.java index 0a252b9aa..913d76aca 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionAdminController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionAdminController.java @@ -187,13 +187,14 @@ public class CriterionAdminController extends GenericForwardComposer { onlyOneVisible = new OnlyOneVisible(listing, editComponent, createComponent, workersComponent); onlyOneVisible.showOnly(listing); - comp.setVariable("controller", this, true); + comp.setVariable("controller", this, false); + workers = new CriterionWorkersController(criterionsModel); + workers.doAfterCompose(comp.getFellow("workersComponent")); messagesForUser = new MessagesForUser(messagesContainer); listing = (Grid) comp.getFellow("listing"); reload(); listing.setRowRenderer(getRowRenderer()); edition = new CriterionEditController(criterionsModel); - workers = new CriterionWorkersController(criterionsModel); } private void reload() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionEditController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionEditController.java index 004769dd7..190d88d5e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionEditController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionEditController.java @@ -1,8 +1,10 @@ package org.navalplanner.web.resources.criterion; import org.apache.commons.lang.Validate; +import org.navalplanner.business.resources.entities.Criterion; import org.zkoss.zk.ui.util.GenericForwardComposer; + public class CriterionEditController extends GenericForwardComposer { private final ICriterionsModel criterionsModel; @@ -12,25 +14,11 @@ public class CriterionEditController extends GenericForwardComposer { this.criterionsModel = criterionsModel; } - public void setCriterionName(String name) { - criterionsModel.setNameForCriterion(name); - } - - public String getCriterionName() { - return criterionsModel.getNameForCriterion(); + public Criterion getCriterion() { + return criterionsModel.getCriterion(); } public boolean isEditing() { return criterionsModel.isEditing(); } - - public boolean isCriterionActive() { - return criterionsModel.isCriterionActive(); - } - - public void setCriterionActive(boolean active) { - criterionsModel.setCriterionActive(active); - } - - } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java index e616b1e5e..e479dbf01 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionWorkersController.java @@ -1,14 +1,51 @@ package org.navalplanner.web.resources.criterion; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.web.common.Util; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.ListModelList; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.api.Button; +import org.zkoss.zul.api.Listbox; +import org.zkoss.zul.api.Listitem; +import org.zkoss.zul.api.Window; public class CriterionWorkersController extends GenericForwardComposer { private final ICriterionsModel criterionsModel; + private Window workersWindow; + + private Listbox list; + + private Button saveListButton; + + private Button cancelListButton; + + public void showList(Event event) { + loadDataToList(); + try { + workersWindow.doModal(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public List getAllWorkers() { + return criterionsModel.getAllWorkers(); + } + public CriterionWorkersController(ICriterionsModel criterionsModel) { this.criterionsModel = criterionsModel; } @@ -18,4 +55,76 @@ public class CriterionWorkersController extends GenericForwardComposer { .getResourcesSatisfyingCurrentCriterionOfType(Worker.class); } + public boolean isChangeAssignmentsDisabled() { + return criterionsModel.isChangeAssignmentsDisabled(); + } + + @Override + public void doAfterCompose(final Component comp) throws Exception { + super.doAfterCompose(comp); + list = (Listbox) workersWindow.getFellow("list"); + loadDataToList(); + saveListButton = (Button) workersWindow.getFellow("saveList"); + cancelListButton = (Button) workersWindow.getFellow("cancelList"); + saveListButton.addEventListener("onClick", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + Collection items = (Collection) list + .getItems(); + List selectedWorkers = new ArrayList(); + List unSelectedWorkers = new ArrayList(); + for (Listitem listitem : items) { + if (listitem.isSelected()) { + selectedWorkers.add((Worker) listitem.getValue()); + } else { + unSelectedWorkers.add((Worker) listitem.getValue()); + } + } + criterionsModel.activateAll(selectedWorkers); + criterionsModel.deactivateAll(unSelectedWorkers); + workersWindow.setVisible(false); + Util.reloadBindings(comp); + } + }); + cancelListButton.addEventListener("onClick", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + workersWindow.setVisible(false); + } + }); + } + + private void loadDataToList() { + List allWorkers = getAllWorkers(); + final HashSet workersForCurrentCriterionIds = new HashSet( + asIds(getWorkersForCurrentCriterion())); + list.setModel(new ListModelList(allWorkers)); + list.setItemRenderer(new ListitemRenderer() { + + @Override + public void render(org.zkoss.zul.Listitem item, Object data) + throws Exception { + Resource r = (Resource) data; + item.setValue(data); + item.setSelected(workersForCurrentCriterionIds.contains(r + .getId())); + Listcell cell = new Listcell(); + cell.setParent(item); + Worker worker = (Worker) data; + cell.setLabel(worker.getSurname() + ", " + + worker.getFirstName()); + } + }); + } + + private static Set asIds(Collection resources) { + HashSet result = new HashSet(); + for (Resource resource : resources) { + result.add(resource.getId()); + } + return result; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionsModel.java index c4057bb95..dc755b2c6 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/CriterionsModel.java @@ -7,13 +7,16 @@ import java.util.List; import org.apache.commons.lang.Validate; import org.hibernate.validator.ClassValidator; import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.bootstrap.ICriterionsBootstrap; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionWithItsType; import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.CriterionService; +import org.navalplanner.business.resources.services.ResourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -37,12 +40,13 @@ public class CriterionsModel implements ICriterionsModel { @Autowired private CriterionService criterionService; + @Autowired + private ResourceService resourceService; + private ICriterionType criterionType; private Criterion criterion; - private String nameForCriterion; - @Override @Transactional(readOnly = true) public List> getTypes() { @@ -60,15 +64,11 @@ public class CriterionsModel implements ICriterionsModel { return criterion; } - @Override - public void setNameForCriterion(String name) { - this.nameForCriterion = name; - } - @Override public void prepareForCreate(ICriterionType criterionType) { this.criterionType = criterionType; - this.criterion = null; + this.criterion = (Criterion) criterionType + .createCriterionWithoutNameYet(); } @Override @@ -90,42 +90,13 @@ public class CriterionsModel implements ICriterionsModel { @Override @Transactional public void saveCriterion() throws ValidationException { - if (criterionType != null) { - create(); - } else { - saveEdit(); - } - criterion = null; - criterionType = null; - } - - private void saveEdit() { - criterionService.save(criterion); - } - - private void create() throws ValidationException { - Criterion criterion = (Criterion) criterionType - .createCriterion(nameForCriterion); InvalidValue[] invalidValues = criterionValidator .getInvalidValues(criterion); if (invalidValues.length > 0) throw new ValidationException(invalidValues); criterionService.save(criterion); - } - - @Override - public String getNameForCriterion() { - if (criterion == null) { - return ""; - } - return criterion.getName(); - } - - @Override - public boolean isCriterionActive() { - if (criterion == null) - return false; - return criterion.isActive(); + criterion = null; + criterionType = null; } @Override @@ -133,11 +104,6 @@ public class CriterionsModel implements ICriterionsModel { return criterion != null; } - @Override - public void setCriterionActive(boolean active) { - criterion.setActive(active); - } - @Override public boolean isApplyableToWorkers(Criterion criterion) { ICriterionType type = getTypeFor(criterion); @@ -151,4 +117,48 @@ public class CriterionsModel implements ICriterionsModel { return new ArrayList(); return criterionService.getResourcesSatisfying(klass, criterion); } + + @Override + public List getAllWorkers() { + return resourceService.getWorkers(); + } + + @Override + public boolean isChangeAssignmentsDisabled() { + return criterionType == null + || !criterionType.allowMultipleActiveCriterionsPerResource(); + } + + @Override + @Transactional + public void activateAll(Collection resources) { + for (Resource resource : resources) { + Resource reloaded = find(resource.getId()); + reloaded + .activate(new CriterionWithItsType(criterionType, criterion)); + resourceService.saveResource(reloaded); + } + } + + @Override + @Transactional + public void deactivateAll(Collection resources) { + for (Resource resource : resources) { + Resource reloaded = find(resource.getId()); + reloaded.deactivate(new CriterionWithItsType(criterionType, + criterion)); + resourceService.saveResource(reloaded); + } + } + + private Resource find(Long id) { + Resource reloaded; + try { + reloaded = resourceService.findResource(id); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + return reloaded; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/ICriterionsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/ICriterionsModel.java index f6c6989a4..22cedc0b4 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/ICriterionsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/criterion/ICriterionsModel.java @@ -7,6 +7,7 @@ import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.resources.entities.Worker; /** * CriterionsModel contract
@@ -26,21 +27,21 @@ public interface ICriterionsModel { ICriterionType getTypeFor(Criterion criterion); - String getNameForCriterion(); - - void setNameForCriterion(String name); - void saveCriterion() throws ValidationException; boolean isEditing(); - boolean isCriterionActive(); - - void setCriterionActive(boolean active); - boolean isApplyableToWorkers(Criterion criterion); List getResourcesSatisfyingCurrentCriterionOfType( Class klass); + List getAllWorkers(); + + boolean isChangeAssignmentsDisabled(); + + void activateAll(Collection selected); + + void deactivateAll(Collection unSelectedWorkers); + } diff --git a/navalplanner-webapp/src/main/webapp/resources/criterions/_edition.zul b/navalplanner-webapp/src/main/webapp/resources/criterions/_edition.zul index 2cd82a177..956fa2369 100644 --- a/navalplanner-webapp/src/main/webapp/resources/criterions/_edition.zul +++ b/navalplanner-webapp/src/main/webapp/resources/criterions/_edition.zul @@ -1,8 +1,8 @@ diff --git a/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul b/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul index dd50d309a..4c40b3290 100644 --- a/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul +++ b/navalplanner-webapp/src/main/webapp/resources/criterions/_workers.zul @@ -1,8 +1,7 @@ - + + mold="paging" pageSize="5" apply="${controller.workers}"> - @@ -12,12 +11,20 @@ + + + + + + + + + + +