diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportType.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportType.java index 067ba5857..15002faf8 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportType.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportType.java @@ -50,4 +50,11 @@ public class WorkReportType { public void setCriterionTypes(Set criterionTypes) { this.criterionTypes = criterionTypes; } + + public void forceLoadCriterionTypes() { + for (CriterionType criterionType : criterionTypes) { + criterionType.getName(); + } + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java index afc96e12a..876c18d05 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java @@ -97,7 +97,9 @@ public class CustomMenuController extends Div { l.add(ci); ci = new CustomMenuItem("mainmenu.work_reports", - "/navalplanner-webapp/"); + "/navalplanner-webapp/workreports/workReportTypes.zul"); + ci.appendChildren(new CustomMenuItem("mainmenu.work_report_types", + "navalplanner-webapp/workreports/workReportTypes.zul")); l.add(ci); ci = new CustomMenuItem("mainmenu.quality_management", diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/IWorkReportTypeModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/IWorkReportTypeModel.java new file mode 100644 index 000000000..54aff666d --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/IWorkReportTypeModel.java @@ -0,0 +1,91 @@ +package org.navalplanner.web.workreports; + +import java.util.List; +import java.util.Set; + +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.workreports.entities.WorkReportType; + +/** + * Contract for {@link WorkRerportType} + * + * @author Manuel Rego Casasnovas + */ +public interface IWorkReportTypeModel { + + /** + * Gets the current {@link WorkReportType}. + * + * @return A {@link WorkReportType} + */ + WorkReportType getWorkReportType(); + + /** + * Gets the {@link List} of {@link WorkReportType}. + * + * @return A {@link List} of {@link WorkReportType} + */ + List getWorkReportTypes(); + + /** + * Stores the current {@link WorkReportType}. + * + * @throws ValidationException + * If validation fails + */ + void save() throws ValidationException; + + /** + * Deletes the {@link WorkReportType} passed as parameter. + * + * @param workReportType + * The object to be removed + */ + void remove(WorkReportType workReportType); + + /** + * Makes some operations needed before create a new {@link WorkReportType}. + */ + void prepareForCreate(); + + /** + * Makes some operations needed before edit a {@link WorkReportType}. + * + * @param workReportType + * The object to be edited + */ + void prepareEditFor(WorkReportType workReportType); + + /** + * Makes some operations needed before remove a {@link WorkReportType}. + * + * @param workReportType + * The object to be removed + */ + void prepareForRemove(WorkReportType workReportType); + + /** + * Gets the {@link Set} of all {@link CriterionType} + * + * @return A {@link Set} of {@link CriterionType} + */ + Set getCriterionTypes(); + + /** + * Sets the {@link Set} of {@link CriterionType} for the current + * {@link WorkReportType}. + * + * @param criterionTypes + * A {@link Set} of {@link CriterionType} + */ + void setCriterionTypes(Set criterionTypes); + + /** + * Check if it's or not editing a {@link WorkReportType} + * + * @return true if it's editing a {@link WorkReportType} + */ + boolean isEditing(); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeCRUDController.java new file mode 100644 index 000000000..2f9868364 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeCRUDController.java @@ -0,0 +1,181 @@ +package org.navalplanner.web.workreports; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.workreports.entities.WorkReportType; +import org.navalplanner.web.common.IMessagesForUser; +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.TwoWaySelector; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.api.Window; + +/** + * Controller for CRUD actions over a {@link WorkReportType} + * + * @author Manuel Rego Casasnovas + */ +public class WorkReportTypeCRUDController extends GenericForwardComposer { + + private Window listWindow; + + private Window createWindow; + + private Window editWindow; + + private Window confirmRemove; + + private boolean confirmingRemove = false; + + private IWorkReportTypeModel workReportTypeModel; + + private OnlyOneVisible visibility; + + private IMessagesForUser messagesForUser; + + private Component messagesContainer; + + public List getWorkReportTypes() { + return workReportTypeModel.getWorkReportTypes(); + } + + public WorkReportType getWorkReportType() { + return workReportTypeModel.getWorkReportType(); + } + + public Set getAssignedCriterionTypes() { + WorkReportType workReportType = getWorkReportType(); + if (workReportType == null) { + return new HashSet(); + } + + Set criterionTypes = workReportType.getCriterionTypes(); + if (criterionTypes == null) { + return new HashSet(); + } + + return criterionTypes; + } + + public Set getUnassignedCriterionTypes() { + Set criterionTypes = workReportTypeModel + .getCriterionTypes(); + Set assignedCriterionTypes = getAssignedCriterionTypes(); + if (assignedCriterionTypes != null) { + criterionTypes.removeAll(assignedCriterionTypes); + } + return criterionTypes; + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + messagesForUser = new MessagesForUser(messagesContainer); + comp.setVariable("controller", this, true); + getVisibility().showOnly(listWindow); + } + + public void cancel() { + goToList(); + } + + public void goToList() { + Util.reloadBindings(listWindow); + getVisibility().showOnly(listWindow); + } + + public void goToEditForm(WorkReportType workReportType) { + workReportTypeModel.prepareEditFor(workReportType); + getVisibility().showOnly(editWindow); + Util.reloadBindings(editWindow); + } + + public void save() { + try { + Set criterionTypes = getCriterionTypesSelector() + .getAssignedObjects(); + + workReportTypeModel.setCriterionTypes(criterionTypes); + workReportTypeModel.save(); + messagesForUser.showMessage(Level.INFO, "work report type saved"); + goToList(); + } catch (ValidationException e) { + messagesForUser.showInvalidValues(e); + } + } + + private TwoWaySelector getCriterionTypesSelector() { + if (workReportTypeModel.isEditing()) { + return (TwoWaySelector) editWindow + .getFellow("criterionTypesSelector"); + } else { + return (TwoWaySelector) createWindow + .getFellow("criterionTypesSelector"); + } + } + + public void confirmRemove(WorkReportType workReportType) { + workReportTypeModel.prepareForRemove(workReportType); + showConfirmingWindow(); + } + + public void cancelRemove() { + confirmingRemove = false; + confirmRemove.setVisible(false); + Util.reloadBindings(confirmRemove); + } + + public boolean isConfirmingRemove() { + return confirmingRemove; + } + + private void hideConfirmingWindow() { + confirmingRemove = false; + Util.reloadBindings(confirmRemove); + } + + private void showConfirmingWindow() { + confirmingRemove = true; + try { + Util.reloadBindings(confirmRemove); + confirmRemove.doModal(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void remove(WorkReportType workReportType) { + workReportTypeModel.remove(workReportType); + hideConfirmingWindow(); + Util.reloadBindings(listWindow); + messagesForUser.showMessage(Level.INFO, "removed " + + workReportType.getName()); + } + + public void goToEditForm() { + getVisibility().showOnly(editWindow); + Util.reloadBindings(editWindow); + } + + public void goToCreateForm() { + workReportTypeModel.prepareForCreate(); + getVisibility().showOnly(createWindow); + Util.reloadBindings(createWindow); + } + + private OnlyOneVisible getVisibility() { + if (visibility == null) { + visibility = new OnlyOneVisible(listWindow, createWindow, + editWindow); + } + return visibility; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeModel.java new file mode 100644 index 000000000..7fd37abb2 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/workreports/WorkReportTypeModel.java @@ -0,0 +1,121 @@ +package org.navalplanner.web.workreports; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +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.entities.CriterionType; +import org.navalplanner.business.resources.services.CriterionTypeService; +import org.navalplanner.business.workreports.daos.WorkReportTypeDAO; +import org.navalplanner.business.workreports.entities.WorkReportType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Model for UI operations related to {@link WorkReportType}. + * + * @author Manuel Rego Casasnovas + */ +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class WorkReportTypeModel implements IWorkReportTypeModel { + + @Autowired + private CriterionTypeService criterionTypeService; + + private WorkReportType workReportType; + + private ClassValidator workReportTypeValidator = new ClassValidator( + WorkReportType.class); + + @Autowired + private WorkReportTypeDAO workReportTypeDAO; + + private boolean editing = false; + + @Override + public WorkReportType getWorkReportType() { + return this.workReportType; + } + + @Override + @Transactional(readOnly = true) + public List getWorkReportTypes() { + return workReportTypeDAO.list(WorkReportType.class); + } + + @Override + public void prepareForCreate() { + editing = false; + this.workReportType = new WorkReportType(); + } + + private WorkReportType getFromDB(WorkReportType workReportType) { + try { + return workReportTypeDAO.find(workReportType.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + @Transactional(readOnly = true) + public void prepareEditFor(WorkReportType workReportType) { + editing = true; + Validate.notNull(workReportType); + + this.workReportType = getFromDB(workReportType); + this.workReportType.forceLoadCriterionTypes(); + } + + @Override + public void prepareForRemove(WorkReportType workReportType) { + this.workReportType = workReportType; + } + + @Override + @Transactional + public void save() throws ValidationException { + InvalidValue[] invalidValues = workReportTypeValidator + .getInvalidValues(workReportType); + if (invalidValues.length > 0) { + throw new ValidationException(invalidValues); + } + + workReportTypeDAO.save(workReportType); + } + + @Override + @Transactional + public void remove(WorkReportType workReportType) { + try { + workReportTypeDAO.remove(workReportType.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public Set getCriterionTypes() { + return new HashSet(criterionTypeService.getAll()); + } + + @Override + public void setCriterionTypes(Set criterionTypes) { + workReportType.setCriterionTypes(criterionTypes); + } + + @Override + public boolean isEditing() { + return this.editing; + } + +} diff --git a/navalplanner-webapp/src/main/webapp/common/layout/template.zul b/navalplanner-webapp/src/main/webapp/common/layout/template.zul index 5842789ac..effbba174 100644 --- a/navalplanner-webapp/src/main/webapp/common/layout/template.zul +++ b/navalplanner-webapp/src/main/webapp/common/layout/template.zul @@ -41,7 +41,8 @@ - + diff --git a/navalplanner-webapp/src/main/webapp/workreports/_editWorkReportType.zul b/navalplanner-webapp/src/main/webapp/workreports/_editWorkReportType.zul new file mode 100644 index 000000000..245fe3536 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/workreports/_editWorkReportType.zul @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul b/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul new file mode 100644 index 000000000..5f8eceec1 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/workreports/workReportTypes.zul @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + ¿Do you want to delete + +