From 9f61475f9ac869e1fe77afef1a86474f9dcac9bb Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Wed, 13 Apr 2011 01:04:41 +0200 Subject: [PATCH] [Bug #969] Substitute autocomplete box for select box in Cost Categories. Hours type are now shown as a select box. FEA: ItEr74S04BugFixing --- .../daos/ITypeOfWorkHoursDAO.java | 2 + .../daos/TypeOfWorkHoursDAO.java | 7 ++ .../entities/TypeOfWorkHours.java | 7 +- .../CostCategoryCRUDController.java | 84 +++++++++++++------ .../web/costcategories/CostCategoryModel.java | 11 +++ .../costcategories/ICostCategoryModel.java | 3 + 6 files changed, 86 insertions(+), 28 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java index 10c2302a6..fb8f65d7f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java @@ -53,4 +53,6 @@ public interface ITypeOfWorkHoursDAO extends TypeOfWorkHours findUniqueByName(String name) throws InstanceNotFoundException; + + List hoursTypeByNameAsc(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java index 90b493020..93f9aeec4 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java @@ -26,6 +26,7 @@ import java.util.List; import org.apache.commons.lang.Validate; import org.hibernate.Criteria; +import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -127,4 +128,10 @@ public class TypeOfWorkHoursDAO extends IntegrationEntityDAO return found; } + @Override + public List hoursTypeByNameAsc() { + return getSession().createCriteria(TypeOfWorkHours.class) + .addOrder(Order.asc("name")).list(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/TypeOfWorkHours.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/TypeOfWorkHours.java index de4a4fe83..a340b9ba8 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/TypeOfWorkHours.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/TypeOfWorkHours.java @@ -33,6 +33,7 @@ import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; /** * @author Jacobo Aragunde Perez + * @author Diego Pino GarcĂ­a */ public class TypeOfWorkHours extends IntegrationEntity { @@ -139,4 +140,8 @@ public class TypeOfWorkHours extends IntegrationEntity { } } -} + public String toString() { + return name; + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java index 42ea2c740..5b2ef612b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryCRUDController.java @@ -43,24 +43,28 @@ import org.navalplanner.web.common.Level; import org.navalplanner.web.common.MessagesForUser; import org.navalplanner.web.common.OnlyOneVisible; import org.navalplanner.web.common.Util; -import org.navalplanner.web.common.components.Autocomplete; import org.navalplanner.web.util.ValidationExceptionPrinter; import org.navalplanner.web.workreports.WorkReportCRUDController; +import org.zkoss.ganttz.util.ComponentsFinder; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.CheckEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; -import org.zkoss.zul.Comboitem; import org.zkoss.zul.Datebox; import org.zkoss.zul.Decimalbox; import org.zkoss.zul.Grid; +import org.zkoss.zul.ListModel; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listitem; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import org.zkoss.zul.Rows; +import org.zkoss.zul.SimpleListModel; import org.zkoss.zul.Textbox; import org.zkoss.zul.api.Hbox; import org.zkoss.zul.api.Window; @@ -93,6 +97,8 @@ public class CostCategoryCRUDController extends GenericForwardComposer private Grid listCostCategories; + private ListModel allHoursType; + private HourCostListRenderer hourCostListRenderer = new HourCostListRenderer(); @Override @@ -124,6 +130,11 @@ public class CostCategoryCRUDController extends GenericForwardComposer } } }); + initializeHoursType(); + } + + private void initializeHoursType() { + allHoursType = new SimpleListModel(costCategoryModel.getAllHoursType()); } @Override @@ -245,41 +256,60 @@ public class CostCategoryCRUDController extends GenericForwardComposer } /** - * Append a Autocomplete @{link TypeOfWorkHours} to row + * Append Selectbox of @{link TypeOfWorkHours} to row + * * @param row */ - private void appendAutocompleteType(final Row row) { - final Autocomplete autocomplete = new Autocomplete(); - autocomplete.setAutodrop(true); - autocomplete.applyProperties(); - autocomplete.setFinder("TypeOfWorkHoursFinder"); - autocomplete.setConstraint("no empty:" + _("A type must be selected")); + private void appendHoursType(final Row row) { + final HourCost hourCost = (HourCost) row.getValue(); + final Listbox lbHoursType = new Listbox(); + lbHoursType.setMold("select"); + lbHoursType.setModel(allHoursType); + lbHoursType.renderAll(); + lbHoursType.applyProperties(); - // Getter, show type selected - if (getTypeOfWorkHours(row) != null) { - autocomplete.setSelectedItem(getTypeOfWorkHours(row)); + // First time is rendered, select first item + TypeOfWorkHours type = hourCost.getType(); + if (hourCost.isNewObject() && type == null) { + Listitem item = lbHoursType.getItemAtIndex(0); + item.setSelected(true); + setHoursType(hourCost, item); + } else { + // If hoursCost has a type, select item with that type + Listitem item = ComponentsFinder.findItemByValue(lbHoursType, type); + if (item != null) { + lbHoursType.selectItem(item); + } } - // Setter, set type selected to HourCost.type - autocomplete.addEventListener("onSelect", new EventListener() { + lbHoursType.addEventListener(Events.ON_SELECT, new EventListener() { @Override public void onEvent(Event event) throws Exception { - final Comboitem comboitem = autocomplete.getSelectedItem(); - - if(comboitem != null) { - // Update hourCost - HourCost hourCost = (HourCost) row.getValue(); - hourCost.setType((TypeOfWorkHours) comboitem.getValue()); - row.setValue(hourCost); - - // Update the hourPrice in the hourCost - hourCost.setPriceCost(((TypeOfWorkHours) comboitem.getValue()).getDefaultPrice()); - Util.reloadBindings(listHourCosts); + Listitem item = lbHoursType.getSelectedItem(); + if (item != null) { + setHoursType((HourCost) row.getValue(), item); } } + }); - row.appendChild(autocomplete); + + row.appendChild(lbHoursType); + } + + private void setHoursType(HourCost hourCost, Listitem item) { + TypeOfWorkHours value = item != null ? (TypeOfWorkHours) item + .getValue() : null; + hourCost.setType(value); + if (value != null) { + // Update the hourPrice in the hourCost + hourCost.setPriceCost(value.getDefaultPrice()); + Util.reloadBindings(listHourCosts); + } else { + hourCost.setPriceCost(BigDecimal.ZERO); + throw new WrongValueException(item.getParent(), + _("Please, select an item")); + } } /** @@ -541,7 +571,7 @@ public class CostCategoryCRUDController extends GenericForwardComposer // Create boxes appendTextboxCode(row); - appendAutocompleteType(row); + appendHoursType(row); appendDecimalboxCost(row); appendDateboxInitDate(row); appendDateboxEndDate(row); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryModel.java index 57150a9a7..8d3f6043a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/CostCategoryModel.java @@ -33,8 +33,10 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.daos.ICostCategoryDAO; import org.navalplanner.business.costcategories.daos.IResourcesCostCategoryAssignmentDAO; +import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; import org.navalplanner.business.costcategories.entities.CostCategory; import org.navalplanner.business.costcategories.entities.HourCost; +import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; import org.navalplanner.web.common.IntegrationEntityModel; import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification; import org.springframework.beans.factory.annotation.Autowired; @@ -66,6 +68,9 @@ public class CostCategoryModel extends IntegrationEntityModel implements @Autowired private IConfigurationDAO configurationDAO; + @Autowired + private ITypeOfWorkHoursDAO typeOfWorkHoursDAO; + @Override public List getCostCategories() { return costCategoryDAO.list(CostCategory.class); @@ -131,6 +136,12 @@ public class CostCategoryModel extends IntegrationEntityModel implements return hourCosts; } + @Override + @Transactional(readOnly = true) + public List getAllHoursType() { + return typeOfWorkHoursDAO.hoursTypeByNameAsc(); + } + @Override public CostCategory getCostCategory() { return costCategory; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ICostCategoryModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ICostCategoryModel.java index cacef385d..99a761da2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ICostCategoryModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ICostCategoryModel.java @@ -28,6 +28,7 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.entities.CostCategory; import org.navalplanner.business.costcategories.entities.HourCost; +import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; import org.navalplanner.web.common.IIntegrationEntityModel; /** @@ -66,4 +67,6 @@ public interface ICostCategoryModel extends IIntegrationEntityModel { void validateHourCostsOverlap() throws ValidationException; + List getAllHoursType(); + } \ No newline at end of file