ItEr09S09AdministracionGrupos: It allows to add and remove workers for a criterion which its type allows multiple active values.

This commit is contained in:
Óscar González Fernández 2009-05-25 18:45:57 +02:00 committed by Javier Moran Rua
parent 5d874c61df
commit ca86c14065
7 changed files with 196 additions and 80 deletions

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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<Worker> 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<? extends Listitem> items = (Collection<? extends Listitem>) list
.getItems();
List<Worker> selectedWorkers = new ArrayList<Worker>();
List<Worker> unSelectedWorkers = new ArrayList<Worker>();
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<Worker> allWorkers = getAllWorkers();
final HashSet<Long> workersForCurrentCriterionIds = new HashSet<Long>(
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<Long> asIds(Collection<? extends Resource> resources) {
HashSet<Long> result = new HashSet<Long>();
for (Resource resource : resources) {
result.add(resource.getId());
}
return result;
}
}

View file

@ -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<ICriterionType<?>> 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<T>();
return criterionService.getResourcesSatisfying(klass, criterion);
}
@Override
public List<Worker> getAllWorkers() {
return resourceService.getWorkers();
}
@Override
public boolean isChangeAssignmentsDisabled() {
return criterionType == null
|| !criterionType.allowMultipleActiveCriterionsPerResource();
}
@Override
@Transactional
public void activateAll(Collection<? extends Resource> 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<? extends Resource> 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;
}
}

View file

@ -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 <br />
@ -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);
<T extends Resource> List<T> getResourcesSatisfyingCurrentCriterionOfType(
Class<T> klass);
List<Worker> getAllWorkers();
boolean isChangeAssignmentsDisabled();
void activateAll(Collection<? extends Resource> selected);
void deactivateAll(Collection<? extends Resource> unSelectedWorkers);
}

View file

@ -1,8 +1,8 @@
<vbox id="${arg.top_id}">
<hbox>
<label value="name" />
<textbox value="@{controller.edition.criterionName}" />
<checkbox checked="@{controller.edition.criterionActive}"
<textbox value="@{controller.edition.criterion.name}" />
<checkbox checked="@{controller.edition.criterion.active}"
visible="@{controller.edition.editing}">
</checkbox>
</hbox>

View file

@ -1,8 +1,7 @@
<zk>
<vbox id="${arg.top_id}" apply="${controller.workers}">
<grid model="@{controller.workers.workersForCurrentCriterion}"
id="${arg.top_id}" mold="paging" pageSize="5">
mold="paging" pageSize="5" apply="${controller.workers}">
<columns>
<column label="operations" />
<column label="First Name" sort="auto(firstName)" />
<column label="Surname" sort="auto(surname)" />
<column label="nif" sort="auto(nif)" />
@ -12,12 +11,20 @@
<label value="@{worker.firstName}" />
<label value="@{worker.surname}" />
<label value="@{worker.nif}" />
<hbox>
<button label="Edit"></button>
</hbox>
</row>
</rows>
</grid>
<button id="adminButton" label="Administrar" disabled="@{controller.workers.changeAssignmentsDisabled}" onClick="controller.workers.showList(event);"></button>
<window visible="false" id="workersWindow">
<listbox id="list" model="@{controller.workers.allWorkers}" mold="paging" multiple="true" checkmark="true">
<listhead>
<listheader label="Name" sort="auto(surname)"></listheader>
</listhead>
</listbox>
<button label="Gardar" id="saveList"></button>
<button label="Cancelar" id="cancelList"></button>
</window>
<button onClick="controller.cancel();"
label="${arg.cancel_button_label}" />
</zk>
label="${arg.cancel_button_label}" />
</vbox>