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:
parent
9e87a571fb
commit
c907bf24c6
9 changed files with 497 additions and 2 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Add table
Reference in a new issue