ItEr18S11CUIntroducionPartesTraballoManualmenteItEr17S16: Adds WorkReport Form (create new WorkReport and WorkReportLines)

Javier Moran Rua <jmoran@igalia.com>: Just a few formatting fixings.
This commit is contained in:
Diego Pino Garcia 2009-07-28 13:53:09 +02:00 committed by Javier Moran Rua
parent adb994ffff
commit 13a08d21cf
19 changed files with 965 additions and 104 deletions

View file

@ -1,19 +1,20 @@
package org.navalplanner.business.resources.entities;
import java.util.Set;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.hibernate.validator.NotEmpty;
import org.navalplanner.business.resources.entities.ResourceEnum;
import org.navalplanner.business.resources.services.CriterionTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* Base implementation of {@link ICriterionType} <br />
* @author Diego Pino García <dpino@igalia.com>
*/
@Component
public class CriterionType implements ICriterionType<Criterion> {
public class CriterionType implements ICriterionType<Criterion> {
private Long id;
@ -36,6 +37,8 @@ import org.springframework.stereotype.Component;
private ResourceEnum resource = ResourceEnum.getDefault();
private Set<Criterion> criterions;
public CriterionType() {
}
@ -44,13 +47,9 @@ import org.springframework.stereotype.Component;
this.name = name;
}
public CriterionType(
String name,
boolean allowHierarchy,
boolean allowSimultaneousCriterionsPerResource,
boolean allowAdding,
boolean allowEditing,
ResourceEnum resource) {
public CriterionType(String name, boolean allowHierarchy,
boolean allowSimultaneousCriterionsPerResource,
boolean allowAdding, boolean allowEditing, ResourceEnum resource) {
this.allowHierarchy = allowHierarchy;
this.allowSimultaneousCriterionsPerResource = allowSimultaneousCriterionsPerResource;
@ -61,13 +60,11 @@ import org.springframework.stereotype.Component;
}
public static CriterionType asCriterionType(ICriterionType criterionType) {
return new CriterionType(
criterionType.getName(),
criterionType.allowHierarchy(),
criterionType.allowSimultaneousCriterionsPerResource(),
criterionType.allowAdding(),
criterionType.allowEditing(),
CriterionType.getResource(criterionType));
return new CriterionType(criterionType.getName(), criterionType
.allowHierarchy(), criterionType
.allowSimultaneousCriterionsPerResource(), criterionType
.allowAdding(), criterionType.allowEditing(), CriterionType
.getResource(criterionType));
}
private static ResourceEnum getResource(ICriterionType criterionType) {
@ -89,6 +86,14 @@ import org.springframework.stereotype.Component;
return name;
}
public Set<Criterion> getCriterions() {
return criterions;
}
public void setCriterions(Set<Criterion> criterions) {
this.criterions = criterions;
}
@Override
public boolean allowHierarchy() {
return allowHierarchy;
@ -119,11 +124,10 @@ import org.springframework.stereotype.Component;
}
public static Criterion createCriterion(
PredefinedCriterionTypes predefinedCriterionType,
String name) {
PredefinedCriterionTypes predefinedCriterionType, String name) {
CriterionType criterionType = CriterionType.
asCriterionType(predefinedCriterionType);
CriterionType criterionType = CriterionType
.asCriterionType(predefinedCriterionType);
return Criterion.withNameAndType(name, criterionType);
}
@ -169,9 +173,8 @@ import org.springframework.stereotype.Component;
CriterionType criterionType = (CriterionType) o;
return new EqualsBuilder()
.append(criterionType.getName(), this.getName())
.isEquals();
return new EqualsBuilder().append(criterionType.getName(),
this.getName()).isEquals();
}
@Override

View file

@ -1,6 +1,7 @@
package org.navalplanner.business.workreports.entities;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
@ -8,68 +9,78 @@ import java.util.Set;
*/
public class WorkReport {
private Long id;
private Long id;
@SuppressWarnings("unused")
private long version;
@SuppressWarnings("unused")
private long version;
Date date;
Date date;
String place;
String place;
WorkReportType workReportType;
String responsible;
Set<WorkReportLine> workReportLines;
WorkReportType workReportType;
public WorkReport() {
Set<WorkReportLine> workReportLines = new HashSet<WorkReportLine>();
}
public WorkReport() {
public WorkReport(Date date, String place, WorkReportType workReportType,
Set<WorkReportLine> workReportLines) {
this.date = date;
this.place = place;
this.workReportType = workReportType;
this.workReportLines = workReportLines;
}
}
public Long getId() {
return id;
}
public WorkReport(Date date, String place, WorkReportType workReportType,
Set<WorkReportLine> workReportLines) {
this.date = date;
this.place = place;
this.workReportType = workReportType;
this.workReportLines = workReportLines;
}
public long getVersion() {
return version;
}
public Long getId() {
return id;
}
public Date getDate() {
return date;
}
public long getVersion() {
return version;
}
public void setDate(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
public String getPlace() {
return place;
}
public void setDate(Date date) {
this.date = date;
}
public void setPlace(String place) {
this.place = place;
}
public String getPlace() {
return place;
}
public WorkReportType getWorkReportType() {
return workReportType;
}
public void setPlace(String place) {
this.place = place;
}
public void setWorkReportType(WorkReportType workReportType) {
this.workReportType = workReportType;
}
public String getResponsible() {
return responsible;
}
public Set<WorkReportLine> getWorkReportLines() {
return workReportLines;
}
public void setResponsible(String responsible) {
this.responsible = responsible;
}
public void setWorkReportLines(Set<WorkReportLine> workReportLines) {
this.workReportLines = workReportLines;
}
public WorkReportType getWorkReportType() {
return workReportType;
}
public void setWorkReportType(WorkReportType workReportType) {
this.workReportType = workReportType;
}
public Set<WorkReportLine> getWorkReportLines() {
return workReportLines;
}
public void setWorkReportLines(Set<WorkReportLine> workReportLines) {
this.workReportLines = workReportLines;
}
}

View file

@ -1,5 +1,6 @@
package org.navalplanner.business.workreports.entities;
import java.util.HashSet;
import java.util.Set;
import org.navalplanner.business.orders.entities.OrderElement;
@ -25,7 +26,7 @@ public class WorkReportLine {
WorkReport workReport;
Set<Criterion> criterions;
Set<Criterion> criterions = new HashSet<Criterion>();
public WorkReportLine() {

View file

@ -9,31 +9,31 @@ import org.navalplanner.business.resources.entities.CriterionType;
*/
public class WorkReportType {
private Long id;
private Long id;
@SuppressWarnings("unused")
private long version;
@SuppressWarnings("unused")
private long version;
String name;
String name;
Set<CriterionType> criterionTypes;
Set<CriterionType> criterionTypes;
public WorkReportType() {
public WorkReportType() {
}
}
public WorkReportType(String name, Set<CriterionType> criterionTypes) {
this.name = name;
this.criterionTypes = criterionTypes;
}
public WorkReportType(String name, Set<CriterionType> criterionTypes) {
this.name = name;
this.criterionTypes = criterionTypes;
}
public Long getId() {
return id;
}
public Long getId() {
return id;
}
public long getVersion() {
return version;
}
public long getVersion() {
return version;
}
public String getName() {
return name;
@ -50,11 +50,4 @@ public class WorkReportType {
public void setCriterionTypes(Set<CriterionType> criterionTypes) {
this.criterionTypes = criterionTypes;
}
public void forceLoadCriterionTypes() {
for (CriterionType criterionType : criterionTypes) {
criterionType.getName();
}
}
}

View file

@ -62,6 +62,10 @@
<param name="enumClass">org.navalplanner.business.resources.entities.ResourceEnum</param>
</type>
</property>
<set name="criterions">
<key column="id_criterion_type" />
<one-to-many class="Criterion" />
</set>
</class>
</hibernate-mapping>

View file

@ -26,10 +26,11 @@
<property name="date"/>
<property name="place"/>
<property name="responsible"/>
<many-to-one name="workReportType" class="WorkReportType" column="WORK_REPORT_TYPE_ID" not-null="true"/>
<set name="workReportLines" cascade="all">
<set name="workReportLines" cascade="all" inverse="false">
<key column="WORK_REPORT_ID"/>
<one-to-many class="WorkReportLine"/>
</set>

View file

@ -20,7 +20,9 @@ public class OnlyOneVisible {
public void showOnly(Component component) {
for (Component c : components) {
c.setVisible(component != null && c.equals(component));
if (c != null) {
c.setVisible(component != null && c.equals(component));
}
}
}

View file

@ -0,0 +1,65 @@
package org.navalplanner.web.common.converters;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.workreports.daos.IWorkReportTypeDAO;
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.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class WorkReportTypeConverter implements Converter<WorkReportType> {
@Autowired
private IWorkReportTypeDAO workReportTypeDAO;
@Override
@Transactional(readOnly = true)
public WorkReportType asObject(String stringRepresentation) {
long id = Long.parseLong(stringRepresentation);
try {
WorkReportType workReportType = workReportTypeDAO.find(id);
forceLoadCriterionTypes(workReportType);
return workReportType;
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public String asString(WorkReportType entity) {
return entity.getId().toString();
}
@Override
public String asStringUngeneric(Object entity) {
return asString((WorkReportType) entity);
}
@Override
public Class<WorkReportType> getType() {
return WorkReportType.class;
}
/**
* Load @{link CriterionType} and its @{link Criterion}
*
* @param workReportType
*/
private void forceLoadCriterionTypes(WorkReportType workReportType) {
// Load CriterionType
for (CriterionType criterionType : workReportType.getCriterionTypes()) {
criterionType.getId();
// Load Criterion
for (Criterion criterion : criterionType.getCriterions()) {
criterion.getId();
}
}
}
}

View file

@ -0,0 +1,13 @@
package org.navalplanner.web.workreports;
import org.navalplanner.business.workreports.entities.WorkReportType;
import org.navalplanner.web.common.entrypoints.EntryPoint;
import org.navalplanner.web.common.entrypoints.EntryPoints;
@EntryPoints(page = "/workreports/workReport.zul", registerAs = "workReportCRUD")
public interface IWorkReportCRUDControllerEntryPoints {
@EntryPoint("edit")
public abstract void goToCreateForm(WorkReportType workReportType);
}

View file

@ -0,0 +1,72 @@
package org.navalplanner.web.workreports;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.workreports.entities.WorkReport;
import org.navalplanner.business.workreports.entities.WorkReportType;
/**
* Contract for {@link WorkRerportType}
*
* @author Diego Pino García <dpino@igalia.com>
*/
public interface IWorkReportModel {
/**
* Gets the current {@link WorkReport}.
*
* @return A {@link WorkReport}
*/
WorkReport getWorkReport();
/**
* Stores the current {@link WorkReport}.
*
* @throws ValidationException
* If validation fails
*/
void save() throws ValidationException;
/**
* Makes some operations needed before create a new {@link WorkReport}.
*/
void prepareForCreate(WorkReportType workReportType);
/**
* Makes some operations needed before edit a {@link WorkReport}.
*
* @param workReport
* The object to be edited
*/
void prepareEditFor(WorkReport workReport);
/**
* Finds an @{link OrdrElement} by code
*
* @param code
* @return
*/
OrderElement findOrderElement(String code);
/**
* Find a @{link Worker} by nif
*
* @param nif
* @return
* @throws InstanceNotFoundException
*/
Worker findWorker(String nif) throws InstanceNotFoundException;
/**
* Converts @{link Resource} to @{link Worker}
*
* @param resource
* @return
* @throws InstanceNotFoundException
*/
Worker asWorker(Resource resource) throws InstanceNotFoundException;
}

View file

@ -0,0 +1,12 @@
package org.navalplanner.web.workreports;
import org.navalplanner.web.common.entrypoints.EntryPoint;
import org.navalplanner.web.common.entrypoints.EntryPoints;
@EntryPoints(page = "/workreports/workReportTypes.zul", registerAs = "workReportTypeCRUD")
public interface IWorkReportTypeCRUDControllerEntryPoints {
@EntryPoint("list")
public abstract void goToList();
}

View file

@ -55,7 +55,7 @@ public interface IWorkReportTypeModel {
* @param workReportType
* The object to be edited
*/
void prepareEditFor(WorkReportType workReportType);
void prepareForEdit(WorkReportType workReportType);
/**
* Makes some operations needed before remove a {@link WorkReportType}.

View file

@ -0,0 +1,444 @@
package org.navalplanner.web.workreports;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.workreports.entities.WorkReport;
import org.navalplanner.business.workreports.entities.WorkReportLine;
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.entrypoints.IURLHandlerRegistry;
import org.navalplanner.web.common.entrypoints.URLHandler;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
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.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Rows;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Window;
/**
* Controller for CRUD actions over a {@link WorkReport}
*
* @author Diego Pino García <dpino@igalia.com>
*/
public class WorkReportCRUDController extends GenericForwardComposer implements
IWorkReportCRUDControllerEntryPoints {
private Window createWindow;
private IWorkReportModel workReportModel;
private IURLHandlerRegistry URLHandlerRegistry;
private OnlyOneVisible visibility;
private IMessagesForUser messagesForUser;
private Component messagesContainer;
private IWorkReportTypeCRUDControllerEntryPoints workReportTypeCRUD;
private WorkReportListRenderer workReportListRenderer = new WorkReportListRenderer();
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
messagesForUser = new MessagesForUser(messagesContainer);
comp.setVariable("controller", this, true);
final URLHandler<IWorkReportCRUDControllerEntryPoints> handler = URLHandlerRegistry
.getRedirectorFor(IWorkReportCRUDControllerEntryPoints.class);
handler.registerListener(this, page);
// Shows a blank page until createWindow is completely rendered
getVisibility().showOnly(null);
}
private OnlyOneVisible getVisibility() {
return (visibility == null) ? new OnlyOneVisible(createWindow)
: visibility;
}
public void save() {
try {
workReportModel.save();
messagesForUser.showMessage(Level.ERROR,
"Parte de traballo gardado");
} catch (ValidationException e) {
messagesForUser.showInvalidValues(e);
}
}
public void cancel() {
System.out.println("### Cancel");
workReportTypeCRUD.goToList();
}
public void goToCreateForm(WorkReportType workReportType) {
workReportModel.prepareForCreate(workReportType);
appendCriterionTypesToColumns(getCriterionTypes());
getVisibility().showOnly(createWindow);
Util.reloadBindings(createWindow);
}
private Set<CriterionType> getCriterionTypes() {
return getWorkReportType().getCriterionTypes();
}
private WorkReportType getWorkReportType() {
return getWorkReport().getWorkReportType();
}
public WorkReport getWorkReport() {
return workReportModel.getWorkReport();
}
/**
* Appends a set of {@link CriterionType} to columns header
*/
private void appendCriterionTypesToColumns(Set<CriterionType> criterionTypes) {
Grid grid = (Grid) createWindow.getFellow("listWorkReportLines");
for (CriterionType criterionType : criterionTypes) {
appendCriterionTypeToColumns(criterionType, grid.getColumns());
}
}
/**
* Appends a new {@link CriterionType} to columns header
*/
private void appendCriterionTypeToColumns(CriterionType criterionType,
Columns columns) {
Column column = new Column(criterionType.getName());
column.setParent(columns);
}
/**
* Adds a new {@link WorkReportLine} to the list of rows
*
* @param rows
*/
public void addWorkReportLine(Rows rows) {
WorkReportLine workReportLine = new WorkReportLine();
getWorkReportLines().add(workReportLine);
rows.appendChild(createRow(workReportLine));
}
public Set<WorkReportLine> getWorkReportLines() {
return (getWorkReport() != null) ? getWorkReport().getWorkReportLines()
: new HashSet<WorkReportLine>();
}
/**
* Returns a new row bound to to a {@link WorkReportLine}
*
* A row consists of a several textboxes plus several listboxes, one for
* every {@link CriterionType} associated with current @{link WorkReport}
*
* @param workReportLine
* @return
*/
private Row createRow(WorkReportLine workReportLine) {
Row row = new Row();
// Bind workReportLine to row
row.setValue(workReportLine);
appendTextboxResource(row);
appendTextboxOrder(row);
appendIntboxNumHours(row);
for (CriterionType criterionType : getCriterionTypes()) {
appendListboxCriterionType(criterionType, row);
}
return row;
}
/**
* Append a Textbox @{link Resource} to row
*
* @param row
*/
private void appendTextboxResource(Row row) {
Textbox txtResource = new Textbox();
bindTextboxResource(txtResource, (WorkReportLine) row.getValue());
row.appendChild(txtResource);
}
/**
* Binds Textbox @{link Resource} to a {@link WorkReportLine}
* {@link Resource}
*
* @param txtResource
* @param workReportLine
*/
private void bindTextboxResource(final Textbox txtResource,
final WorkReportLine workReportLine) {
Util.bind(txtResource, new Util.Getter<String>() {
@Override
public String get() {
return (workReportLine.getResource() != null) ? ((Worker) workReportLine
.getResource()).getNif()
: "";
}
}, new Util.Setter<String>() {
@Override
public void set(String value) {
if (value.length() > 0) {
Worker worker;
try {
worker = workReportModel.findWorker(value);
} catch (InstanceNotFoundException e) {
throw new WrongValueException(txtResource,
"Worker not found");
}
workReportLine.setResource(worker);
}
}
});
}
/**
* Append a Textbox @{link Order} to row
*
* @param row
*/
private void appendTextboxOrder(Row row) {
Textbox txtOrder = new Textbox();
bindTextboxOrder(txtOrder, (WorkReportLine) row.getValue());
row.appendChild(txtOrder);
}
/**
* Binds Textbox @{link Order} to a {@link WorkReportLine} {@link Order}
*
* @param txtOrder
* @param workReportLine
*/
private void bindTextboxOrder(final Textbox txtOrder,
final WorkReportLine workReportLine) {
Util.bind(txtOrder, new Util.Getter<String>() {
@Override
public String get() {
return (workReportLine.getOrderElement() != null) ? workReportLine
.getOrderElement().getCode()
: "";
}
}, new Util.Setter<String>() {
@Override
public void set(String value) {
if (value.length() > 0) {
OrderElement orderElement = workReportModel
.findOrderElement(value);
if (orderElement == null) {
throw new WrongValueException(txtOrder,
"OrderElement not found");
}
workReportLine.setOrderElement(orderElement);
}
}
});
}
/**
* Append a Intbox numHours to row
*
* @param row
*/
private void appendIntboxNumHours(Row row) {
Intbox intNumHours = new Intbox();
bindIntboxNumHours(intNumHours, (WorkReportLine) row.getValue());
row.appendChild(intNumHours);
}
/**
* Binds Intbox numHours to a {@link WorkReportLine} numHours
*
* @param intNumHours
* @param workReportLine
*/
private void bindIntboxNumHours(final Intbox intNumHours,
final WorkReportLine workReportLine) {
Util.bind(intNumHours, new Util.Getter<Integer>() {
@Override
public Integer get() {
return workReportLine.getNumHours();
}
}, new Util.Setter<Integer>() {
@Override
public void set(Integer value) {
workReportLine.setNumHours(value);
}
});
}
/**
* Appends a {@link CriterionType} listbox to row
*
* @param criterionType
* @param row
*/
private void appendListboxCriterionType(final CriterionType criterionType,
Row row) {
WorkReportLine workReportLine = (WorkReportLine) row.getValue();
Listbox listBox = createListboxCriterionType(criterionType,
getSelectedCriterion(workReportLine, criterionType));
bindListboxCriterionType(criterionType, listBox, workReportLine);
row.appendChild(listBox);
}
/**
* Determines which {@link Criterion} of @{link CriterionType} is selected
* in a @{link WorkReportLine}
*
* Notice that in a list of {@link Criterion} belonging to a @{link
* WorkReportLine}, only one {@link Criterion} for each
* {@link CriterionType} is possible
*
* @param workReportLine
* @param criterionType
*/
private Criterion getSelectedCriterion(WorkReportLine workReportLine,
CriterionType criterionType) {
for (Criterion criterion : workReportLine.getCriterions()) {
if (criterionType.equals(criterion.getType())) {
return criterion;
}
}
return null;
}
/**
* Create a listbox of {@link Criterion} for a {@link CriterionType}
*
* @param criterionType
* @param workReportLine
* needed to determine which {@link Criterion} should be set to
* selected
* @return
*/
private Listbox createListboxCriterionType(CriterionType criterionType,
Criterion selectedCriterion) {
Listbox listBox = new Listbox();
listBox.setRows(1);
listBox.setMold("select");
// Add empty option to list
List<Criterion> criterions = new ArrayList<Criterion>(criterionType
.getCriterions());
criterions.add(0, new Criterion(" ", criterionType));
// Adds a new item to list for each criterion
for (Criterion criterion : criterions) {
Listitem listItem = new Listitem();
listItem.setLabel(criterion.getName());
listItem.setValue(criterion);
listItem.setParent(listBox);
if (criterion.equals(selectedCriterion)) {
listBox.setSelectedItem(listItem);
}
}
return listBox;
}
/**
* Updates the list of {@link Criterion} of a {@link WorkReportLine} when a
* new @{link Criterion} is selected
*
* @param criterionType
* needed to determine which {@link Criterion} inside the list
* should be updated
* @param listBox
* @param workReportLine
*/
private void bindListboxCriterionType(final CriterionType criterionType,
final Listbox listBox, final WorkReportLine workReportLine) {
listBox.addEventListener("onSelect", new EventListener() {
@Override
public void onEvent(Event arg0) throws Exception {
Listitem listItem = listBox.getSelectedItem();
// There only can be one criterion for each criterion type
for (Criterion criterion : workReportLine.getCriterions()) {
if (criterionType.equals(criterion.getType())) {
workReportLine.getCriterions().remove(criterion);
}
}
workReportLine.getCriterions().add(
(Criterion) listItem.getValue());
}
});
}
public WorkReportListRenderer getRenderer() {
return workReportListRenderer;
}
/**
* RowRenderer for a @{WorkReportLine} element
*
* @author Diego Pino García <dpino@igalia.com>
*
*/
public class WorkReportListRenderer implements RowRenderer {
@Override
public void render(Row row, Object data) throws Exception {
WorkReportLine workReportLine = (WorkReportLine) data;
// Convert Resource to Worker
if (workReportLine.getResource() instanceof Resource) {
workReportLine.setResource(workReportModel
.asWorker(workReportLine.getResource()));
}
row.setValue(workReportLine);
// Create textboxes
appendTextboxResource(row);
appendTextboxOrder(row);
appendIntboxNumHours(row);
// Get criterion types for each row and append to it
// CriterionTypes
for (CriterionType criterionType : getCriterionTypes()) {
appendListboxCriterionType(criterionType, row);
}
}
}
}

View file

@ -0,0 +1,154 @@
package org.navalplanner.web.workreports;
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.orders.daos.OrderElementDao;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.resources.daos.impl.WorkerDaoHibernate;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.workreports.daos.WorkReportDAO;
import org.navalplanner.business.workreports.entities.WorkReport;
import org.navalplanner.business.workreports.entities.WorkReportLine;
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 WorkReport}.
*
* @author Diego Pino García <dpino@igalia.com>
*/
@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class WorkReportModel implements IWorkReportModel {
private WorkReport workReport;
private ClassValidator<WorkReport> workReportValidator = new ClassValidator<WorkReport>(
WorkReport.class);
@Autowired
private WorkReportDAO workReportDAO;
@Autowired
private OrderElementDao orderElementDAO;
@Autowired
private WorkerDaoHibernate workerDAO;
private boolean editing = false;
@Override
public WorkReport getWorkReport() {
return workReport;
}
@Override
@Transactional(readOnly = true)
public void prepareForCreate(WorkReportType workReportType) {
editing = false;
workReport = new WorkReport();
workReport.setWorkReportType(workReportType);
}
@Override
@Transactional(readOnly = true)
public void prepareEditFor(WorkReport workReport) {
editing = true;
Validate.notNull(workReport);
workReport = getFromDB(workReport);
}
@Transactional(readOnly = true)
private WorkReport getFromDB(WorkReport workReport) {
return getFromDB(workReport.getId());
}
@Transactional(readOnly = true)
private WorkReport getFromDB(Long id) {
try {
WorkReport workReport = workReportDAO.find(id);
forceLoadEntities(workReport);
return workReport;
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
/**
* Load entities that will be needed in the conversation
*
* @param workReport
*/
private void forceLoadEntities(WorkReport workReport) {
// Load WorkReportType
workReport.getWorkReportType().getName();
// Load CriterionTypes
for (CriterionType criterionType : workReport.getWorkReportType()
.getCriterionTypes()) {
criterionType.getId();
// Load Criterions
for (Criterion criterion : criterionType.getCriterions()) {
criterion.getId();
}
}
// Load WorkReportLines
for (WorkReportLine workReportLine : workReport.getWorkReportLines()) {
workReportLine.getId();
workReportLine.getResource().getId();
workReportLine.getOrderElement().getId();
// Load Criterions
for (Criterion criterion : workReportLine.getCriterions()) {
criterion.getId();
}
}
}
@Override
@Transactional
public void save() throws ValidationException {
InvalidValue[] invalidValues = workReportValidator
.getInvalidValues(workReport);
if (invalidValues.length > 0) {
throw new ValidationException(invalidValues);
}
workReportDAO.save(workReport);
}
@Override
@Transactional
public OrderElement findOrderElement(String orderCode) {
String[] parts = orderCode.split("-");
OrderElement parent = orderElementDAO.findByCode(parts[0]);
for (int i = 1; i < parts.length && parent != null; i++) {
OrderElement child = orderElementDAO.findByCode(parent, parts[i]);
parent = child;
}
return parent;
}
@Override
@Transactional
public Worker findWorker(String nif) throws InstanceNotFoundException {
return workerDAO.findUniqueByNif(nif);
}
@Override
@Transactional
public Worker asWorker(Resource resource) throws InstanceNotFoundException {
return workerDAO.find(resource.getId());
}
}

View file

@ -13,6 +13,8 @@ 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.navalplanner.web.common.entrypoints.IURLHandlerRegistry;
import org.navalplanner.web.common.entrypoints.URLHandler;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.api.Window;
@ -22,7 +24,8 @@ import org.zkoss.zul.api.Window;
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class WorkReportTypeCRUDController extends GenericForwardComposer {
public class WorkReportTypeCRUDController extends GenericForwardComposer
implements IWorkReportTypeCRUDControllerEntryPoints {
private Window listWindow;
@ -42,6 +45,10 @@ public class WorkReportTypeCRUDController extends GenericForwardComposer {
private Component messagesContainer;
private IWorkReportCRUDControllerEntryPoints workReportCRUD;
private IURLHandlerRegistry URLHandlerRegistry;
public List<WorkReportType> getWorkReportTypes() {
return workReportTypeModel.getWorkReportTypes();
}
@ -79,11 +86,14 @@ public class WorkReportTypeCRUDController extends GenericForwardComposer {
super.doAfterCompose(comp);
messagesForUser = new MessagesForUser(messagesContainer);
comp.setVariable("controller", this, true);
final URLHandler<IWorkReportTypeCRUDControllerEntryPoints> handler = URLHandlerRegistry
.getRedirectorFor(IWorkReportTypeCRUDControllerEntryPoints.class);
handler.registerListener(this, page);
getVisibility().showOnly(listWindow);
}
public void cancel() {
goToList();
// TODO: Check if hoursgroup has criterions
}
public void goToList() {
@ -92,7 +102,7 @@ public class WorkReportTypeCRUDController extends GenericForwardComposer {
}
public void goToEditForm(WorkReportType workReportType) {
workReportTypeModel.prepareEditFor(workReportType);
workReportTypeModel.prepareForEdit(workReportType);
getVisibility().showOnly(editWindow);
Util.reloadBindings(editWindow);
}
@ -178,4 +188,8 @@ public class WorkReportTypeCRUDController extends GenericForwardComposer {
return visibility;
}
public void goToEditNewWorkReportForm(WorkReportType workReportType) {
workReportCRUD.goToCreateForm(workReportType);
}
}

View file

@ -68,12 +68,11 @@ public class WorkReportTypeModel implements IWorkReportTypeModel {
@Override
@Transactional(readOnly = true)
public void prepareEditFor(WorkReportType workReportType) {
public void prepareForEdit(WorkReportType workReportType) {
editing = true;
Validate.notNull(workReportType);
this.workReportType = getFromDB(workReportType);
this.workReportType.forceLoadCriterionTypes();
}
@Override

View file

@ -0,0 +1,50 @@
<window id="${arg.top_id}" title="${arg.title}" border="normal">
<vbox>
<hbox>
<grid fixedLayout="false">
<rows>
<row>
<label value="Responsable:"
style="font-weight:bold;" />
<textbox
value="@{controller.workReport.responsible}" />
</row>
<row>
<label value="Fecha:" style="font-weight:bold;" />
<datebox value="@{controller.workReport.date}" />
</row>
</rows>
</grid>
</hbox>
<hbox>
<button label="Añadir"
onClick="controller.addWorkReportLine(listWorkReportLines.rows);"
style="margin-top: -30px; margin-left: 300px" />
</hbox>
<grid id="listWorkReportLines"
model="@{controller.workReportLines}"
rowRenderer="@{controller.renderer}" mold="paging"
pageSize="10">
<columns>
<column label="Recurso" />
<column label="Código" />
<column label="Horas" />
<!-- Extra CriterionType columns are loaded loaded dynamically -->
</columns>
<!-- List of rows is created or loaded dynamically -->
</grid>
<hbox>
<button onClick="controller.save();"
label="${arg.save_button_label}" />
<button onClick="controller.cancel();"
label="${arg.cancel_button_label}" />
</hbox>
</vbox>
</window>

View file

@ -15,6 +15,11 @@
<button label="Remove"
onClick="controller.confirmRemove(self.parent.parent.value);">
</button>
<button label="Alta parte"
onClick="controller.goToEditNewWorkReportForm(self.parent.parent.value);">
</button>
</hbox>
</row>
</rows>
@ -22,4 +27,4 @@
<button id="show_create_form" onClick="controller.goToCreateForm();"
label="Create">
</button>
</window>
</window>

View file

@ -0,0 +1,18 @@
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<?page id="work_report_admin"?>
<?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="edition" inline="true" macroURI="_editWorkReport.zul"?>
<zk>
<window self="@{define(content)}"
apply="org.navalplanner.web.workreports.WorkReportCRUDController">
<vbox id="messagesContainer"></vbox>
<edition top_id="createWindow" title="Create"
save_button_label="Save" cancel_button_label="Cancel" />
</window>
</zk>