ItEr17S14CUListadoTiposPartesTraballo: Added basic support for CRUD operations over a WorkReportType.

Javier Moran Rua <jmoran@igalia.com>: Added the option to access to WorkReportType CRUD operations in
 CustomMenuController
This commit is contained in:
Manuel Rego Casasnovas 2009-07-16 12:55:51 +02:00 committed by Javier Moran Rua
parent 9e87a571fb
commit c907bf24c6
9 changed files with 497 additions and 2 deletions

View file

@ -50,4 +50,11 @@ public class WorkReportType {
public void setCriterionTypes(Set<CriterionType> criterionTypes) {
this.criterionTypes = criterionTypes;
}
public void forceLoadCriterionTypes() {
for (CriterionType criterionType : criterionTypes) {
criterionType.getName();
}
}
}

View file

@ -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",

View file

@ -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 <mrego@igalia.com>
*/
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<WorkReportType> 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<CriterionType> getCriterionTypes();
/**
* Sets the {@link Set} of {@link CriterionType} for the current
* {@link WorkReportType}.
*
* @param criterionTypes
* A {@link Set} of {@link CriterionType}
*/
void setCriterionTypes(Set<CriterionType> criterionTypes);
/**
* Check if it's or not editing a {@link WorkReportType}
*
* @return true if it's editing a {@link WorkReportType}
*/
boolean isEditing();
}

View file

@ -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 <mrego@igalia.com>
*/
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<WorkReportType> getWorkReportTypes() {
return workReportTypeModel.getWorkReportTypes();
}
public WorkReportType getWorkReportType() {
return workReportTypeModel.getWorkReportType();
}
public Set<CriterionType> getAssignedCriterionTypes() {
WorkReportType workReportType = getWorkReportType();
if (workReportType == null) {
return new HashSet<CriterionType>();
}
Set<CriterionType> criterionTypes = workReportType.getCriterionTypes();
if (criterionTypes == null) {
return new HashSet<CriterionType>();
}
return criterionTypes;
}
public Set<CriterionType> getUnassignedCriterionTypes() {
Set<CriterionType> criterionTypes = workReportTypeModel
.getCriterionTypes();
Set<CriterionType> 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<CriterionType> 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;
}
}

View file

@ -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 <mrego@igalia.com>
*/
@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class WorkReportTypeModel implements IWorkReportTypeModel {
@Autowired
private CriterionTypeService criterionTypeService;
private WorkReportType workReportType;
private ClassValidator<WorkReportType> workReportTypeValidator = new ClassValidator<WorkReportType>(
WorkReportType.class);
@Autowired
private WorkReportTypeDAO workReportTypeDAO;
private boolean editing = false;
@Override
public WorkReportType getWorkReportType() {
return this.workReportType;
}
@Override
@Transactional(readOnly = true)
public List<WorkReportType> 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<CriterionType> getCriterionTypes() {
return new HashSet<CriterionType>(criterionTypeService.getAll());
}
@Override
public void setCriterionTypes(Set<CriterionType> criterionTypes) {
workReportType.setCriterionTypes(criterionTypes);
}
@Override
public boolean isEditing() {
return this.editing;
}
}

View file

@ -41,7 +41,8 @@
<menu label="${c:l('mainmenu.work_reports')}">
<menupopup>
<menuitem label="${c:l('mainmenu.work_report_list')}" />
<menuitem label="${c:l('mainmenu.work_report_types')}" />
<menuitem label="${c:l('mainmenu.work_report_types')}"
href="/workreports/workRerpotTypes.zul" />
<menuitem label="${c:l('mainmenu.work_report_import')}" />
</menupopup>
</menu>

View file

@ -0,0 +1,31 @@
<window id="${arg.top_id}" title="${arg.title}" border="normal">
<vbox>
<hbox>
<label value="Name" />
<textbox
value="@{controller.workReportType.name}" />
</hbox>
<label value="Criterion types" />
<twowayselector
id="criterionTypesSelector"
assignedObjects="@{controller.assignedCriterionTypes}"
assignedTitle="Assigned criterion types"
unassignedObjects="@{controller.unassignedCriterionTypes}"
unassignedTitle="Unassigned criterion types"
columns="name"
/>
<hbox>
<button onClick="controller.save();"
label="${arg.save_button_label}" />
<button onClick="controller.cancel();"
label="${arg.cancel_button_label}" />
</hbox>
</vbox>
</window>

View file

@ -0,0 +1,25 @@
<window id="${arg.top_id}" title="List">
<grid id="listing" model="@{controller.workReportTypes}" mold="paging"
pageSize="5">
<columns>
<column label="Name" sort="auto(name)" />
<column label="Operations" />
</columns>
<rows>
<row self="@{each='workReportType'}" value="@{workReportType}">
<label value="@{workReportType.name}" />
<hbox>
<button label="Edit"
onClick="controller.goToEditForm(self.parent.parent.value);">
</button>
<button label="Remove"
onClick="controller.confirmRemove(self.parent.parent.value);">
</button>
</hbox>
</row>
</rows>
</grid>
<button id="show_create_form" onClick="controller.goToCreateForm();"
label="Create">
</button>
</window>

View file

@ -0,0 +1,36 @@
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<?page id="List"?>
<?init class="org.zkoss.zk.ui.util.Composition" arg0="/common/layout/template_v02.zul"?>
<?link rel="stylesheet" type="text/css" href="/common/css/navalpro_v01.css"?>
<?link rel="stylesheet" type="text/css" href="/common/css/navalpro_zk.css"?>
<?link rel="stylesheet" type="text/css" href="/resources/css/resources.css"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?component name="list" inline="true" macroURI="_listWorkReportTypes.zul"?>
<?component name="edition" inline="true" macroURI="_editWorkReportType.zul"?>
<zk>
<window self="@{define(content)}"
apply="org.navalplanner.web.workreports.WorkReportTypeCRUDController">
<vbox id="messagesContainer"></vbox>
<list top_id="listWindow" />
<edition top_id="createWindow" title="Create"
save_button_label="Save" cancel_button_label="Cancel" />
<edition top_id="editWindow" title="Edit"
save_button_label="Save" cancel_button_label="Cancel" />
<window visible="@{controller.confirmingRemove}"
id="confirmRemove" title="Confirmación" width="500px"
position="center">
<vbox>
<hbox>
¿Do you want to delete <label value="@{controller.workReportType.name}"/>?
</hbox>
<hbox>
<button label="Yes"
onClick="controller.remove(controller.workReportType);" />
<button label="No"
onClick="controller.cancelRemove();" />
</hbox>
</vbox>
</window>
</window>
</zk>