ItEr41S08CUAltaFormularioCalidadeItEr40S09 : Add master/details and constraints of the property quality form type 'by percentage'.

This commit is contained in:
Susana Montes Pedreira 2009-12-28 18:01:14 +01:00 committed by Javier Moran Rua
parent 442ac2f7fe
commit e32eb78452
10 changed files with 561 additions and 109 deletions

View file

@ -2,9 +2,11 @@ package org.navalplanner.business.qualityforms.entities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.Validate;
import org.hibernate.validator.AssertTrue;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Valid;
import org.navalplanner.business.common.BaseEntity;
@ -74,4 +76,62 @@ public class TaskQualityForm extends BaseEntity {
}
}
@SuppressWarnings("unused")
@AssertTrue(message = "dates must be consecutive.")
public boolean checkConstraintCorrectConsecutivesDate() {
for (TaskQualityFormItem item : taskQualityFormItems) {
if (!isCorrectConsecutiveDate(item)) {
return false;
}
}
return true;
}
@SuppressWarnings("unused")
@AssertTrue(message = "dates must be consecutive.")
public boolean checkConstraintConsecutivePassedItems() {
for (TaskQualityFormItem item : taskQualityFormItems) {
if (!isCorrectConsecutivePassed(item)) {
return false;
}
}
return true;
}
public boolean isCorrectConsecutivePassed(TaskQualityFormItem item) {
if (item.getPassed()) {
return (isPassedPreviousItem(item));
}
return true;
}
public boolean isCorrectConsecutiveDate(TaskQualityFormItem item) {
if (item.getPassed()) {
return ((isPassedPreviousItem(item)) && (isLaterToPreviousItemDate(item)));
}
return (item.getDate() == null);
}
public boolean isPassedPreviousItem(TaskQualityFormItem item) {
Integer previousPosition = item.getPosition() - 1;
if ((previousPosition >= 0)
&& (previousPosition < taskQualityFormItems.size())) {
return taskQualityFormItems.get(previousPosition).getPassed();
}
return true;
}
public boolean isLaterToPreviousItemDate(TaskQualityFormItem item) {
Integer previousPosition = item.getPosition() - 1;
if ((previousPosition >= 0)
&& (previousPosition < taskQualityFormItems.size())) {
Date previousDate = taskQualityFormItems.get(previousPosition)
.getDate();
return ((previousDate != null) && (item.getDate() != null) && ((previousDate
.before(item.getDate())) || (previousDate.equals(item
.getDate()))));
}
return true;
}
}

View file

@ -11,9 +11,9 @@ import org.navalplanner.business.INewObject;
public class TaskQualityFormItem implements INewObject {
public final static String propertyName = "name";
public final static String propertyDate = "date";
public final static String propertyPercentage = "percentage";
public final static String propertyPassed = "passed";
static TaskQualityFormItem create(QualityFormItem qualityFormItem) {
TaskQualityFormItem taskQualityFormItem = new TaskQualityFormItem(
@ -109,4 +109,13 @@ public class TaskQualityFormItem implements INewObject {
return false;
}
@SuppressWarnings("unused")
@AssertTrue(message = "date not specified")
public boolean checkConstraintIfDateCanBeNull() {
if ((passed == null) || (!passed)) {
return true;
} else {
return (date != null);
}
}
}

View file

@ -22,23 +22,41 @@ package org.navalplanner.web.orders;
import static org.navalplanner.web.I18nHelper._;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.qualityforms.entities.QualityForm;
import org.navalplanner.business.qualityforms.entities.TaskQualityForm;
import org.navalplanner.business.qualityforms.entities.TaskQualityFormItem;
import org.navalplanner.business.resources.entities.CriterionSatisfaction;
import org.navalplanner.web.common.ConstraintChecker;
import org.navalplanner.web.common.IMessagesForUser;
import org.navalplanner.web.common.Level;
import org.navalplanner.web.common.MessagesForUser;
import org.navalplanner.web.common.Util;
import org.navalplanner.web.common.components.Autocomplete;
import org.navalplanner.web.common.components.bandboxsearch.BandboxSearch;
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.event.Events;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Detail;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.SimpleListModel;
/**
* Controller for showing OrderElement assigned task quality forms
@ -56,23 +74,30 @@ public class AssignedTaskQualityFormsToOrderElementController extends
private IAssignedTaskQualityFormsToOrderElementModel assignedTaskQualityFormsToOrderElementModel;
private Autocomplete cbQualityForms;
private Grid assignedTaskQualityForms;
private Grid editedTaskQualityFormItems;
private BandboxSearch bdQualityForms;
private TaskQualityFormItemsRowRenderer taskQualityFormItemsRowRenderer = new TaskQualityFormItemsRowRenderer();
private TaskQualityFormsRowRenderer taskQualityFormsRowRenderer = new TaskQualityFormsRowRenderer();
private IMessagesForUser messages;
private Component messagesContainerTaskQualityForms;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setVariable("assignedTaskQualityFormsController", this, true);
messages = new MessagesForUser(messagesContainerTaskQualityForms);
this.reloadTaskQualityForms();
}
public void openWindow(IOrderElementModel orderElementModel) {
setOrderElementModel(orderElementModel);
openWindow(getOrderElement());
}
private void openWindow(OrderElement orderElement) {
@ -172,12 +197,6 @@ public class AssignedTaskQualityFormsToOrderElementController extends
reloadTaskQualityForms();
}
public void editTaskQualityForm(TaskQualityForm taskQualityForm) {
assignedTaskQualityFormsToOrderElementModel
.setTaskQualityForm(taskQualityForm);
Util.reloadBindings(editedTaskQualityFormItems);
}
public List<TaskQualityForm> getTaskQualityForms() {
return assignedTaskQualityFormsToOrderElementModel
.getTaskQualityForms();
@ -188,20 +207,341 @@ public class AssignedTaskQualityFormsToOrderElementController extends
.getNotAssignedQualityForms();
}
public List<TaskQualityFormItem> getTaskQualityFormItems() {
return assignedTaskQualityFormsToOrderElementModel
.getTaskQualityFormItems();
}
private void reloadTaskQualityForms() {
Util.reloadBindings(bdQualityForms);
Util.reloadBindings(assignedTaskQualityForms);
assignedTaskQualityFormsToOrderElementModel
.clearEditTaskQualityFormItems();
Util.reloadBindings(editedTaskQualityFormItems);
}
public void close() {
}
public TaskQualityFormsRowRenderer getTaskQualityFormsRowRenderer() {
return taskQualityFormsRowRenderer;
}
public class TaskQualityFormsRowRenderer implements RowRenderer {
@Override
public void render(Row row, Object data) throws Exception {
TaskQualityForm taskQualityForm = (TaskQualityForm) data;
row.setValue(data);
appendDetails(row, taskQualityForm);
appendNewLabel(row, taskQualityForm.getQualityForm().getName());
appendNewLabel(row, taskQualityForm.getQualityForm()
.getQualityFormType().toString());
appendOperations(row);
}
}
private void appendDetails(Row row, TaskQualityForm taskQualityForm) {
Detail details = new Detail();
details.setParent(row);
details.appendChild(appendGridItems(row, taskQualityForm));
details.setOpen(false);
}
private Grid appendGridItems(Row row, TaskQualityForm taskQualityForm) {
Grid gridItems = new Grid();
gridItems.setMold("paging");
gridItems.setPageSize(5);
gridItems.setFixedLayout(true);
renderColumns(gridItems);
gridItems.setRowRenderer(getTaskQualityFormItemsRowRenderer());
gridItems.setModel(new SimpleListModel(taskQualityForm
.getTaskQualityFormItems().toArray()));
return gridItems;
}
private void renderColumns(Grid gridItems) {
Columns columns = gridItems.getColumns();
// Create listhead first time is rendered
if (columns == null) {
columns = new Columns();
}
// Delete all headers
columns.getChildren().clear();
columns.setSizable(true);
// Add static headers
Column columnName = new Column();
columnName.setLabel(_("Name"));
columnName.setSort("auto=(name)");
columnName.setSortDirection("ascending");
columns.appendChild(columnName);
Column columnPosition = new Column();
columnPosition.setLabel(_("Position"));
columns.appendChild(columnPosition);
Column columnPercentage = new Column();
columnPercentage.setLabel(_("Percentage"));
columns.appendChild(columnPercentage);
Column columnPassed = new Column();
columnPassed.setLabel(_("Passed"));
columns.appendChild(columnPassed);
Column columnDate = new Column();
columnDate.setLabel(_("Date"));
columns.appendChild(columnDate);
columns.setParent(gridItems);
}
private void appendOperations(final Row row) {
Button buttonRemove = new Button();
buttonRemove.setParent(row);
buttonRemove.setClass("icono");
buttonRemove.setImage("/common/img/ico_borrar1.png");
buttonRemove.setHoverImage("/common/img/ico_borrar.png");
buttonRemove.setTooltiptext(_("Delete"));
buttonRemove.addEventListener(Events.ON_CLICK, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
confirmRemove((TaskQualityForm) row.getValue());
}
});
}
public TaskQualityFormItemsRowRenderer getTaskQualityFormItemsRowRenderer() {
return taskQualityFormItemsRowRenderer;
}
public class TaskQualityFormItemsRowRenderer implements RowRenderer {
@Override
public void render(Row row, Object data) throws Exception {
TaskQualityFormItem item = (TaskQualityFormItem) data;
row.setValue(data);
appendNewLabel(row, item.getName());
appendNewLabel(row, item.getPosition().toString());
appendNewLabel(row, item.getPercentage().toString());
appendCheckPassed(row);
appendDate(row);
}
}
private void appendNewLabel(Row row, String label) {
org.zkoss.zul.Label labelName = new org.zkoss.zul.Label();
labelName.setParent(row);
labelName.setValue(label);
}
private void appendDate(final Row row) {
Datebox date = new Datebox();
date.setParent(row);
final TaskQualityForm taskQualityForm = getTaskQualityFormByRow(row);
final TaskQualityFormItem item = (TaskQualityFormItem) row.getValue();
date.setDisabled(assignedTaskQualityFormsToOrderElementModel
.isDisabledDateItem(taskQualityForm, item));
Util.bind(date, new Util.Getter<Date>() {
@Override
public Date get() {
return item.getDate();
}
}, new Util.Setter<Date>() {
@Override
public void set(Date value) {
item.setDate(value);
}
});
date.setConstraint(checkConsecutiveDate(row));
}
private void appendCheckPassed(final Row row) {
Checkbox checkbox = new Checkbox();
checkbox.setParent(row);
final TaskQualityForm taskQualityForm = getTaskQualityFormByRow(row);
final TaskQualityFormItem item = (TaskQualityFormItem) row.getValue();
checkbox.setDisabled(assignedTaskQualityFormsToOrderElementModel
.isDisabledPassedItem(taskQualityForm, item));
Util.bind(checkbox, new Util.Getter<Boolean>() {
@Override
public Boolean get() {
return item.getPassed();
}
}, new Util.Setter<Boolean>() {
@Override
public void set(Boolean value) {
item.setPassed(value);
}
});
checkbox.addEventListener(Events.ON_CHECK, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
assignedTaskQualityFormsToOrderElementModel
.updatePassedTaskQualityFormItems(taskQualityForm);
Util.reloadBindings(assignedTaskQualityForms);
}
});
}
private Constraint checkConsecutiveDate(final Row row) {
return new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
final TaskQualityFormItem item = (TaskQualityFormItem) row
.getValue();
final TaskQualityForm taskQualityForm = getTaskQualityFormByRow(row);
if (taskQualityForm != null) {
item.setDate((Date) value);
if (((Date) value == null)
&& (!item.checkConstraintIfDateCanBeNull())) {
item.setDate(null);
throw new WrongValueException(comp,
_("The date cannot be null."));
}
if (!taskQualityForm.isCorrectConsecutiveDate(item)) {
item.setDate(null);
throw new WrongValueException(
comp,
_("The date must be later the previous item date, and previous the later item date."));
}
}
}
};
}
private TaskQualityForm getTaskQualityFormByRow(final Row row) {
try {
return (TaskQualityForm) ((Row) row.getGrid().getParent()
.getParent()).getValue();
} catch (Exception e) {
return null;
}
}
// Operations to confirm and validate
public boolean confirm() {
return (validateConstraints() && validate());
}
private boolean validateConstraints() {
return ConstraintChecker.isValid(self);
}
/**
* Shows invalid values for {@link CriterionSatisfaction} entities
* @param e
*/
private boolean validate() throws ValidationException {
try {
assignedTaskQualityFormsToOrderElementModel.validate();
reloadTaskQualityForms();
} catch (ValidationException e) {
showInvalidValues(e);
return false;
} catch (IllegalStateException e) {
messages.showMessage(Level.ERROR, e.getMessage());
return false;
} catch (IllegalArgumentException e) {
messages.showMessage(Level.ERROR, e.getMessage());
return false;
}
return true;
}
/**
* Shows invalid values for {@link TaskQualityForm} entities
* @param e
*/
private void showInvalidValues(ValidationException e) {
for (InvalidValue invalidValue : e.getInvalidValues()) {
Object value = invalidValue.getBean();
if (value instanceof TaskQualityForm) {
showInvalidValue(invalidValue, (TaskQualityForm) value);
}
}
}
private void showInvalidValue(InvalidValue invalidValue,
TaskQualityForm taskQualityForm) {
if (assignedTaskQualityForms != null) {
// Find which row contains TaskQualityForm inside grid
Row row = findRowOfTaskQualityForm(assignedTaskQualityForms
.getRows().getChildren(), taskQualityForm);
if (row != null) {
String itemName = (String) invalidValue.getValue();
String propertyName = invalidValue.getPropertyName();
Row rowItem = findRowOfTaskQualityFormItem(row, itemName);
if (rowItem != null) {
if (TaskQualityFormItem.propertyDate.equals(propertyName)) {
Datebox datebox = getDatebox(rowItem);
throw new WrongValueException(datebox, invalidValue
.getMessage());
}
if (TaskQualityFormItem.propertyPassed.equals(propertyName)) {
Checkbox checkbox = getCheckbox(rowItem);
throw new WrongValueException(checkbox, invalidValue
.getMessage());
}
}
}
}
}
private Row findRowOfTaskQualityForm(List<Row> rows,
TaskQualityForm taskQualityForm) {
for (Row row : rows) {
if (taskQualityForm.equals(row.getValue())) {
return row;
}
}
return null;
}
private Row findRowOfTaskQualityFormItem(Row rowTaskQualityForm,
String itemName) {
Grid gridItems = (Grid) rowTaskQualityForm.getFirstChild()
.getFirstChild();
List<Row> rows = (List<Row>) gridItems.getRows().getChildren();
for (Row row : rows) {
TaskQualityFormItem item = (TaskQualityFormItem) row.getValue();
if ((item != null) && (itemName.equals(item.getName()))) {
return row;
}
}
return null;
}
private void openDetails(Row row) {
if (row.getValue() instanceof TaskQualityForm) {
((Detail) row.getFirstChild()).setOpen(true);
} else {
((Detail) row.getGrid().getParent()).setOpen(true);
}
}
private Datebox getDatebox(Row row) {
return (Datebox) row.getChildren().get(4);
}
private Checkbox getCheckbox(Row row) {
return (Checkbox) row.getChildren().get(3);
}
}

View file

@ -20,10 +20,14 @@
package org.navalplanner.web.orders;
import static org.navalplanner.web.I18nHelper._;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.validator.InvalidValue;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.orders.daos.IOrderElementDAO;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.qualityforms.daos.IQualityFormDAO;
@ -68,7 +72,6 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
@Transactional(readOnly = true)
public void init(OrderElement orderElement) {
this.orderElement = orderElement;
this.taskQualityForm = null;
initializeOrderElement(this.orderElement);
}
@ -155,24 +158,85 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
this.orderModel = orderModel;
}
// Operations to manage the task quality form items
private TaskQualityForm taskQualityForm;
public void setTaskQualityForm(TaskQualityForm taskQualityForm) {
this.taskQualityForm = taskQualityForm;
}
@Override
public void clearEditTaskQualityFormItems() {
this.taskQualityForm = null;
}
@Override
public List<TaskQualityFormItem> getTaskQualityFormItems() {
if (this.taskQualityForm != null) {
return taskQualityForm.getTaskQualityFormItems();
public boolean isDisabledPassedItem(TaskQualityForm taskQualityForm,
TaskQualityFormItem item) {
if ((taskQualityForm == null) || ((item == null))) {
return true;
}
return new ArrayList<TaskQualityFormItem>();
return (!(item.getPassed() || taskQualityForm
.isPassedPreviousItem(item)));
}
public boolean isDisabledDateItem(TaskQualityForm taskQualityForm,
TaskQualityFormItem item) {
if ((taskQualityForm == null) || ((item == null))) {
return true;
}
return (!item.getPassed());
}
public void updatePassedTaskQualityFormItems(TaskQualityForm taskQualityForm) {
if (taskQualityForm != null) {
Integer position = getFirstNotPassedPosition(taskQualityForm);
List<TaskQualityFormItem> items = taskQualityForm
.getTaskQualityFormItems();
for (int i = position; i < items.size(); i++) {
items.get(i).setPassed(false);
items.get(i).setDate(null);
}
}
}
private Integer getFirstNotPassedPosition(TaskQualityForm taskQualityForm) {
Integer position = 0;
for (TaskQualityFormItem item : taskQualityForm
.getTaskQualityFormItems()) {
if (!item.getPassed()) {
return position;
}
position++;
}
return position;
}
// Operation to confirm and validate
@Override
public void validate() {
if (getOrderElement() != null) {
for (TaskQualityForm taskQualityForm : orderElement
.getTaskQualityForms()) {
validateTaskQualityForm(taskQualityForm);
}
}
}
private void validateTaskQualityForm(TaskQualityForm taskQualityForm) {
validateTaskQualityFormItems(taskQualityForm);
}
private void validateTaskQualityFormItems(TaskQualityForm taskQualityForm) {
for (TaskQualityFormItem item : taskQualityForm
.getTaskQualityFormItems()) {
if (!taskQualityForm.isCorrectConsecutivePassed(item)) {
throw new ValidationException(new InvalidValue(
_("must be consecutive"), TaskQualityForm.class,
"passed", item.getName(), taskQualityForm));
}
if (!taskQualityForm.isCorrectConsecutiveDate(item)) {
throw new ValidationException(new InvalidValue(
_("must be consecutive"), TaskQualityForm.class,
"date", item.getName(), taskQualityForm));
}
if (!item.checkConstraintIfDateCanBeNull()) {
throw new ValidationException(new InvalidValue(
_("cannot be null"), TaskQualityForm.class, "date",
item.getName(), taskQualityForm));
}
}
}
}

View file

@ -24,6 +24,7 @@ import java.util.List;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.qualityforms.entities.QualityForm;
import org.navalplanner.business.qualityforms.entities.QualityFormItem;
import org.navalplanner.business.qualityforms.entities.TaskQualityForm;
import org.navalplanner.business.qualityforms.entities.TaskQualityFormItem;
@ -85,21 +86,33 @@ public interface IAssignedTaskQualityFormsToOrderElementModel {
void setOrderModel(IOrderModel orderModel);
/**
* Reset or clear the current {@link TaskQualityForm} selected for editing
* @param
*/
void clearEditTaskQualityFormItems();
/**
* Returns all the {@link TaskQualityFormItem} assigned the current
* {@link TaskQualityForm}
* @return
*/
List<TaskQualityFormItem> getTaskQualityFormItems();
/**
* Set {@link TaskQualityForm}
* Update the date and the property passed of all the
* {@link TaskQualityFormItem} of the {@ TaskQualityForm}
* @param taskQualityForm
*/
void setTaskQualityForm(TaskQualityForm taskQualityForm);
void updatePassedTaskQualityFormItems(TaskQualityForm taskQualityForm);
/**
* Check whether {@link QualityFormItem} the property passed must be
* disabled
* @param taskQualityForm
* ,item
*/
boolean isDisabledPassedItem(TaskQualityForm taskQualityForm,
TaskQualityFormItem item);
/**
* Check whether {@link QualityFormItem} date mustbe disabled
* @param taskQualityForm
* ,item
*/
boolean isDisabledDateItem(TaskQualityForm taskQualityForm,
TaskQualityFormItem item);
/**
* Check whether all {@link QualityForm} and its {@link QualityFormItem} are
* valid.
* @param
*/
void validate();
}

View file

@ -274,6 +274,10 @@ public class OrderCRUDController extends GenericForwardComposer {
if (!assignedCriterionRequirementController.close()) {
selectTab("tabRequirements");
}
selectTab("tabTaskQualityForm");
if (!assignedTaskQualityFormController.confirm()) {
return false;
}
try {
orderModel.save();
messagesForUser.showMessage(Level.INFO, _("Order saved"));

View file

@ -193,6 +193,10 @@ public class OrderElementController extends GenericForwardComposer {
selectTab("tabRequirements");
return;
}
selectTab("tabTaskQualityForm");
if (!assignedTaskQualityFormsController.confirm()) {
return;
}
close();
}

View file

@ -29,7 +29,7 @@
<window id="${arg.top_id}" title="${i18n:_('Edit order element')}"
width="950px" left="50px" top="50px"
closable="true" visible="false">
<tabbox height="620px">
<tabbox height="620px" id="tabboxOrderElement">
<tabs>
<tab id="tabDetails" label="${i18n:_('Details')}"></tab>
<tab label="${i18n:_('Assigned hours')}"></tab>
@ -37,7 +37,7 @@
<tab label="${i18n:_('Labels')}"></tab>
<tab id="tabRequirements" label="${i18n:_('Criterion Requirement')}"></tab>
<tab label="${i18n:_('Materials')}"></tab>
<tab label="${i18n:_('Task quality forms')}"></tab>
<tab id="tabTaskQualityForm" label="${i18n:_('Task quality forms')}"></tab>
</tabs>
<tabpanels>
<tabpanel>

View file

@ -37,7 +37,7 @@
<tab id="tabRequirements" label="${i18n:_('Criterion Requirement')}"
onClick = "controller.reloadHoursGroupOrder();"/>
<tab label="${i18n:_('Materials')}" />
<tab label="${i18n:_('Task quality forms')}" />
<tab id="tabTaskQualityForm" label="${i18n:_('Task quality forms')}" />
</tabs>
<tabpanels>
<tabpanel>

View file

@ -22,6 +22,7 @@
apply="org.navalplanner.web.orders.AssignedTaskQualityFormsToOrderElementController" >
<!-- Quality Forms-->
<vbox>
<vbox id="messagesContainerTaskQualityForms"/>
<panel title="${i18n:_('Task quality forms')}" border="normal">
<panelchildren>
<!-- Assign quality form -->
@ -36,60 +37,17 @@
</hbox>
</vbox>
<separator bar="false" spacing="40px" orient="vertical"/>
<newdatasortablegrid id="assignedTaskQualityForms" height="100px" fixedLayout="true"
<grid id="assignedTaskQualityForms" height="300px" fixedLayout="true"
rowRenderer = "@{assignedTaskQualityFormsController.taskQualityFormsRowRenderer}"
model="@{assignedTaskQualityFormsController.taskQualityForms}">
<columns>
<newdatasortablecolumn label="${i18n:_('Name')}" sort="auto(qualityForm.name)"/>
<newdatasortablecolumn label="${i18n:_('Type')}" />
<newdatasortablecolumn label="${i18n:_('Operations')}" />
<column width="25px"/>
<column label="${i18n:_('Task quality form name')}" sort="auto(qualityForm.name)"/>
<column label="${i18n:_('Type')}" />
<column label="${i18n:_('Operations')}" />
</columns>
<rows>
<row self="@{each='taskQualityForm'}" value="@{taskQualityForm}">
<label value="@{taskQualityForm.qualityForm.name}" />
<label value="@{taskQualityForm.qualityForm.qualityFormType}" />
</grid>
<hbox>
<button sclass="icono" image="/common/img/ico_editar1.png"
hoverImage="/common/img/ico_editar.png"
tooltiptext="${i18n:_('Edit')}"
onClick="assignedTaskQualityFormsController.editTaskQualityForm(self.parent.parent.value);">
</button>
<button sclass="icono" image="/common/img/ico_borrar1.png"
hoverImage="/common/img/ico_borrar.png"
tooltiptext="${i18n:_('Delete')}"
onClick="assignedTaskQualityFormsController.confirmRemove(self.parent.parent.value)">
</button>
</hbox>
</row>
</rows>
</newdatasortablegrid>
<separator bar="false" spacing="40px" orient="vertical"/>
<panel title="${i18n:_('Task quality form Item Edition')}" border="none">
<panelchildren>
<grid id="editedTaskQualityFormItems" height="100px" fixedLayout="true"
model="@{assignedTaskQualityFormsController.taskQualityFormItems}">
<columns>
<column label="${i18n:_('Name')}" sort="auto(name)"/>
<column label="${i18n:_('Position')}" />
<column label="${i18n:_('Percentage')}" />
<column label="${i18n:_('Passed')}" />
<column label="${i18n:_('Date')}" />
</columns>
<rows>
<row self="@{each='taskQualityFormItem'}" value="@{taskQualityFormItem}">
<label value="@{taskQualityFormItem.name}" />
<label value="@{taskQualityFormItem.position}" />
<label value="@{taskQualityFormItem.percentage}" />
<checkbox checked="@{taskQualityFormItem.passed}" />
<datebox value="@{taskQualityFormItem.date}"/>
</row>
</rows>
</grid>
</panelchildren>
</panel>
<separator bar="false" spacing="40px" orient="vertical"/>
</panelchildren>
</panel>