/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.web.workreports;
import static org.libreplan.web.I18nHelper._;
import java.util.ConcurrentModificationException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.labels.entities.Label;
import org.libreplan.business.labels.entities.LabelType;
import org.libreplan.business.workreports.entities.HoursManagementEnum;
import org.libreplan.business.workreports.entities.PositionInWorkReportEnum;
import org.libreplan.business.workreports.entities.WorkReportLabelTypeAssignment;
import org.libreplan.business.workreports.entities.WorkReportType;
import org.libreplan.business.workreports.valueobjects.DescriptionField;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.EnumsListitemRenderer;
import org.libreplan.web.common.IMessagesForUser;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.MessagesForUser;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.Autocomplete;
import org.libreplan.web.common.components.NewDataSortableGrid;
import org.libreplan.web.common.entrypoints.EntryPointsHandler;
import org.libreplan.web.common.entrypoints.IURLHandlerRegistry;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Button;
import org.zkoss.zul.Column;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Rows;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.Window;
/**
* Controller for CRUD actions over a {@link WorkReportType}.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class WorkReportTypeCRUDController
extends BaseCRUDController<WorkReportType>
implements IWorkReportTypeCRUDControllerEntryPoints {
private NewDataSortableGrid listDescriptionFields;
private NewDataSortableGrid listWorkReportLabelTypeAssignments;
private Textbox name;
private Textbox code;
private Vbox orderedListFieldsAndLabels;
private Tab tabSortedLabelsAndFields;
private Tab tabReportStructure;
private IMessagesForUser messagesForUserSortedLabelsAndFields;
private IWorkReportTypeModel workReportTypeModel;
private IWorkReportCRUDControllerEntryPoints workReportCRUD;
private IURLHandlerRegistry URLHandlerRegistry;
private DescriptionFieldRowRenderer descriptionFieldRowRenderer = new DescriptionFieldRowRenderer();
private WorkReportLabelTypeAssignmentRowRenderer workReportLabelTypeAssignmentRowRenderer =
new WorkReportLabelTypeAssignmentRowRenderer();
private OrderedFieldsAndLabelsRowRenderer orderedFieldsAndLabelsRowRenderer = new OrderedFieldsAndLabelsRowRenderer();
public WorkReportTypeCRUDController(){
workReportTypeModel = (IWorkReportTypeModel) SpringUtil.getBean("workReportTypeModel");
workReportCRUD = (IWorkReportCRUDControllerEntryPoints) SpringUtil.getBean("workReportCRUD");
URLHandlerRegistry = (IURLHandlerRegistry) SpringUtil.getBean("URLHandlerRegistry");
}
public List<WorkReportType> getWorkReportTypes() {
return workReportTypeModel.getWorkReportTypesExceptPersonalAndJiraTimesheets();
}
public WorkReportType getWorkReportType() {
return workReportTypeModel.getWorkReportType();
}
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
final EntryPointsHandler<IWorkReportTypeCRUDControllerEntryPoints> handler =
URLHandlerRegistry.getRedirectorFor(IWorkReportTypeCRUDControllerEntryPoints.class);
handler.register(this, page);
}
@Override
protected void save() throws ValidationException {
workReportTypeModel.save();
}
@Override
protected void beforeSaving() throws ValidationException {
isAllValid();
}
private boolean thereAreWorkReportsFor(WorkReportType workReportType) {
return workReportTypeModel.thereAreWorkReportsFor(workReportType);
}
public boolean isReadOnly() {
return thereAreWorkReportsFor(getWorkReportType());
}
public boolean isEditable() {
return (!thereAreWorkReportsFor(getWorkReportType()));
}
private void loadComponents(Window window) {
if (!window.equals(listWindow)) {
name = (Textbox) window.getFellow("name");
code = (Textbox) window.getFellow("code");
listDescriptionFields = (NewDataSortableGrid) window.getFellow("listDescriptionFields");
listWorkReportLabelTypeAssignments =
(NewDataSortableGrid) window.getFellow("listWorkReportLabelTypeAssignments");
orderedListFieldsAndLabels = (Vbox) window.getFellow("orderedListFieldsAndLabels");
Component containerMessageSortedLabelsAndFields = window.getFellow("containerMessageSortedLabelsAndFields");
messagesForUserSortedLabelsAndFields = new MessagesForUser(containerMessageSortedLabelsAndFields);
tabSortedLabelsAndFields = (Tab) window.getFellow("tabSortedLabelsAndFields");
tabReportStructure = (Tab) window.getFellow("tabReportStructure");
}
}
public void goToEditNewWorkReportForm(WorkReportType workReportType) {
workReportCRUD.goToCreateForm(workReportType);
}
/**
* Operations to manage the description fiels of the edited workReportType.
*/
public List<DescriptionField> getDescriptionFields() {
return workReportTypeModel.getDescriptionFields();
}
public void addNewDescriptionField() {
workReportTypeModel.addNewDescriptionField();
Util.reloadBindings(listDescriptionFields);
}
private void removeDescriptionField(DescriptionField descriptionField) {
workReportTypeModel.removeDescriptionField(descriptionField);
Util.reloadBindings(listDescriptionFields);
}
public DescriptionFieldRowRenderer getDescriptionFieldsRowRender() {
return descriptionFieldRowRenderer;
}
public class DescriptionFieldRowRenderer implements RowRenderer {
@Override
public void render(Row row, Object data, int i) {
final DescriptionField descriptionField = (DescriptionField) data;
row.setValue(descriptionField);
if (isReadOnly()) {
appendLabelNameDescriptionField(row);
appendLabelLengthDescriptionField(row);
appendLabelPositionDescriptionField(row);
} else {
appendTextboBoxNameDescriptionField(row);
appendIntBoxLengthDescriptionField(row);
appendListboxPositionDescriptionField(row);
appendRemoveButtonDescriptionField(row);
}
}
}
private void appendLabelNameDescriptionField(Row row) {
org.zkoss.zul.Label labelName = new org.zkoss.zul.Label();
labelName.setValue(((DescriptionField) row.getValue()).getFieldName());
labelName.setParent(row);
}
private void appendLabelLengthDescriptionField(Row row) {
org.zkoss.zul.Label labelLength = new org.zkoss.zul.Label();
labelLength.setValue(((DescriptionField) row.getValue()).getLength().toString());
labelLength.setParent(row);
}
private void appendLabelPositionDescriptionField(Row row) {
org.zkoss.zul.Label labelPosition = new org.zkoss.zul.Label();
labelPosition.setParent(row);
if (workReportTypeModel.isHeadingDescriptionField(row.getValue())) {
labelPosition.setValue(_(PositionInWorkReportEnum.HEADING.toString()));
} else {
labelPosition.setValue(_(PositionInWorkReportEnum.LINE.toString()));
}
}
private void appendTextboBoxNameDescriptionField(final Row row) {
Textbox boxName = new Textbox();
boxName.setHflex("1");
boxName.setParent(row);
boxName.setConstraint(validateIfExistTheSameFieldName(row.getValue()));
Util.bind(
boxName,
() -> {
return ((DescriptionField) row.getValue()).getFieldName();
},
value -> {
((DescriptionField) row.getValue()).setFieldName(value);
});
}
private void appendIntBoxLengthDescriptionField(final Row row) {
Intbox boxLength = new Intbox();
boxLength.setHflex("1");
boxLength.setReadonly(isReadOnly());
boxLength.setParent(row);
boxLength.setConstraint("no negative, no zero");
Util.bind(
boxLength,
() -> {
return ((DescriptionField) row.getValue()).getLength();
},
value -> {
((DescriptionField) row.getValue()).setLength(value);
});
}
private void appendListboxPositionDescriptionField(final Row row) {
final DescriptionField descriptionField = row.getValue();
final Listbox listPosition = createListPosition();
listPosition.setParent(row);
if (workReportTypeModel.isHeadingDescriptionField(descriptionField)) {
listPosition.setSelectedItem(listPosition.getItemAtIndex(0));
} else {
listPosition.setSelectedItem(listPosition.getItemAtIndex(1));
}
listPosition.addEventListener(Events.ON_SELECT, (EventListener) event -> {
changePositionDescriptionField(listPosition.getSelectedItem(), descriptionField);
Util.reloadBindings(listDescriptionFields);
});
}
private void appendRemoveButtonDescriptionField(final Row row) {
final DescriptionField descriptionField = row.getValue();
final Button removeButton = createRemoveButton();
removeButton.setParent(row);
removeButton.addEventListener(
Events.ON_CLICK, (EventListener) event -> removeDescriptionField(descriptionField));
}
private Listbox createListPosition() {
final Listbox listPosition = new Listbox();
listPosition.setMold("select");
listPosition.setModel(new SimpleListModel<>(getPositionInWorkReportEnums()));
listPosition.setItemRenderer(new EnumsListitemRenderer());
return listPosition;
}
private Button createRemoveButton() {
Button removeButton = new Button();
removeButton.setSclass("icono");
removeButton.setImage("/common/img/ico_borrar1.png");
removeButton.setHoverImage("/common/img/ico_borrar.png");
removeButton.setTooltiptext(_("Delete"));
return removeButton;
}
private void changePositionDescriptionField(Listitem selectedItem, DescriptionField descriptionField) {
PositionInWorkReportEnum newPosition = selectedItem.getValue();
workReportTypeModel.changePositionDescriptionField(newPosition, descriptionField);
}
/* Operations to manage the label of the edited workReportType */
private Map<LabelType, List<Label>> getMapLabelTypes() {
return workReportTypeModel.getMapLabelTypes();
}
public Set<WorkReportLabelTypeAssignment> getWorkReportLabelTypeAssignments() {
return workReportTypeModel.getWorkReportLabelTypeAssignments();
}
public void addNewWorkReportLabelTypeAssignment() {
workReportTypeModel.addNewWorkReportLabelTypeAssignment();
Util.reloadBindings(listWorkReportLabelTypeAssignments);
}
private void removeWorkReportLabelTypeAssignment(WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
workReportTypeModel.removeWorkReportLabelTypeAssignment(workReportLabelTypeAssignment);
Util.reloadBindings(listWorkReportLabelTypeAssignments);
}
public WorkReportLabelTypeAssignmentRowRenderer getWorkReportLabelTypeAssignmentRowRender() {
return workReportLabelTypeAssignmentRowRenderer;
}
public class WorkReportLabelTypeAssignmentRowRenderer implements RowRenderer {
@Override
public void render(Row row, Object data, int i) {
final WorkReportLabelTypeAssignment workReportLabelTypeAssignment = (WorkReportLabelTypeAssignment) data;
row.setValue(workReportLabelTypeAssignment);
if (isReadOnly()) {
appendLabelType(row);
appendLabelPosition(row);
appendLabel(row);
} else {
appendComboboxLabelTypes(row);
appendComboboxPositionLabel(row);
appendComboboxLabels(row);
appendRemoveButtonWorkReportLabelTypeAssignment(row);
}
}
}
private void appendLabelType(Row row) {
org.zkoss.zul.Label labelType = new org.zkoss.zul.Label();
labelType.setParent(row);
labelType.setValue(((WorkReportLabelTypeAssignment) row.getValue()).getLabelType().getName());
}
private void appendLabelPosition(Row row) {
org.zkoss.zul.Label labelPosition = new org.zkoss.zul.Label();
labelPosition.setParent(row);
labelPosition.setValue(_(workReportTypeModel.getLabelAssignmentPosition(row.getValue()).toString()));
}
private void appendLabel(Row row) {
org.zkoss.zul.Label label = new org.zkoss.zul.Label();
label.setParent(row);
label.setValue(((WorkReportLabelTypeAssignment) row.getValue()).getDefaultLabel().getName());
}
private void appendComboboxLabelTypes(final Row row) {
final WorkReportLabelTypeAssignment workReportLabelTypeAssignment = row.getValue();
final Combobox comboLabelTypes = createComboboxLabelTypes(workReportLabelTypeAssignment);
comboLabelTypes.setParent(row);
comboLabelTypes.addEventListener(Events.ON_CHANGE, (EventListener) event -> {
changeLabelType(comboLabelTypes.getSelectedItem(), workReportLabelTypeAssignment);
validateIfExistTheSameLabelType(comboLabelTypes, workReportLabelTypeAssignment);
Util.reloadBindings(listWorkReportLabelTypeAssignments);
});
}
private void appendComboboxLabels(final Row row) {
final WorkReportLabelTypeAssignment workReportLabelTypeAssignment = row.getValue();
Comboitem selectedItemType = ((Autocomplete) row.getFirstChild()).getSelectedItem();
LabelType selectedLabelType = null;
if (selectedItemType != null) {
selectedLabelType = selectedItemType.getValue();
}
final Combobox comboLabels = createComboboxLabels(selectedLabelType, workReportLabelTypeAssignment);
comboLabels.setParent(row);
comboLabels.addEventListener(Events.ON_CHANGE, (EventListener) event -> {
changeLabel(comboLabels.getSelectedItem(), workReportLabelTypeAssignment);
Util.reloadBindings(listWorkReportLabelTypeAssignments);
});
}
private void appendComboboxPositionLabel(final Row row) {
final WorkReportLabelTypeAssignment workReportLabelTypeAssignment = row.getValue();
final Listbox listPosition = this.createListPosition();
listPosition.setParent(row);
if (workReportLabelTypeAssignment.getLabelsSharedByLines()) {
listPosition.setSelectedItem(listPosition.getItemAtIndex(0));
} else {
listPosition.setSelectedItem(listPosition.getItemAtIndex(1));
}
listPosition.addEventListener(Events.ON_SELECT, (EventListener) event -> {
changePositionLabel(listPosition.getSelectedItem(), workReportLabelTypeAssignment);
Util.reloadBindings(listWorkReportLabelTypeAssignments);
});
}
private void appendRemoveButtonWorkReportLabelTypeAssignment(final Row row) {
final WorkReportLabelTypeAssignment workReportLabelTypeAssignment = row.getValue();
final Button removeButton = createRemoveButton();
removeButton.setParent(row);
removeButton.addEventListener(
Events.ON_CLICK,
(EventListener) event -> removeWorkReportLabelTypeAssignment(workReportLabelTypeAssignment));
}
private Autocomplete createComboboxLabelTypes(WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
Autocomplete comboLabelTypes = new Autocomplete();
comboLabelTypes.setButtonVisible(true);
final Set<LabelType> listLabelType = getMapLabelTypes().keySet();
for (LabelType labelType : listLabelType) {
Comboitem comboItem = new Comboitem();
comboItem.setValue(labelType);
comboItem.setLabel(labelType.getName());
comboItem.setParent(comboLabelTypes);
if ( (workReportLabelTypeAssignment.getLabelType() != null) &&
(workReportLabelTypeAssignment.getLabelType().equals(labelType)) ) {
comboLabelTypes.setSelectedItem(comboItem);
}
}
return comboLabelTypes;
}
private Autocomplete createComboboxLabels(LabelType labelType,
WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
Autocomplete comboLabels = new Autocomplete();
comboLabels.setButtonVisible(true);
if (labelType != null) {
final List<Label> listLabel = this.getMapLabelTypes().get(labelType);
for (Label label : listLabel) {
Comboitem comboItem = new Comboitem();
comboItem.setValue(label);
comboItem.setLabel(label.getName());
comboItem.setParent(comboLabels);
if ( (workReportLabelTypeAssignment.getDefaultLabel() != null) &&
(workReportLabelTypeAssignment.getDefaultLabel().equals(label)) ) {
comboLabels.setSelectedItem(comboItem);
}
}
}
return comboLabels;
}
private void changePositionLabel(Listitem selectedItem, WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
PositionInWorkReportEnum newPosition = selectedItem.getValue();
workReportTypeModel.setLabelAssignmentPosition(workReportLabelTypeAssignment, newPosition);
}
private void changeLabelType(Comboitem selectedItem, WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
LabelType labelType = null;
if (selectedItem != null) {
labelType = selectedItem.getValue();
}
workReportLabelTypeAssignment.setLabelType(labelType);
workReportLabelTypeAssignment.setDefaultLabel(null);
}
private void changeLabel(Comboitem selectedItem, WorkReportLabelTypeAssignment workReportLabelTypeAssignment) {
Label defaultLabel = null;
if (selectedItem != null) {
defaultLabel = selectedItem.getValue();
}
workReportLabelTypeAssignment.setDefaultLabel(defaultLabel);
}
/**
* Operations to manage the requirements fields
*/
public HoursManagementEnum[] getHoursManagementEnums() {
return HoursManagementEnum.values();
}
public PositionInWorkReportEnum[] getPositionInWorkReportEnums() {
return PositionInWorkReportEnum.values();
}
public PositionInWorkReportEnum getDatePosition() {
return workReportTypeModel.getDatePosition();
}
public void setDatePosition(PositionInWorkReportEnum position) {
workReportTypeModel.setDatePosition(position);
}
public PositionInWorkReportEnum getResourcePosition() {
return workReportTypeModel.getResourcePosition();
}
public void setResourcePosition(PositionInWorkReportEnum position) {
workReportTypeModel.setResourcePosition(position);
}
public PositionInWorkReportEnum getOrderElementPosition() {
return workReportTypeModel.getOrderElementPosition();
}
public void setOrderElementPosition(PositionInWorkReportEnum position) {
workReportTypeModel.setOrderElementPosition(position);
}
/**
* Operations to the data validations.
*/
public Constraint validateWorkReportTypeName() {
return (comp, value) -> {
try {
workReportTypeModel.validateWorkReportTypeName((String) value);
} catch (IllegalArgumentException e) {
throw new WrongValueException(comp, _(e.getMessage()));
}
};
}
public Constraint validateWorkReportTypeCode() {
return (comp, value) -> {
try {
workReportTypeModel.validateWorkReportTypeCode((String) value);
} catch (IllegalArgumentException e) {
throw new WrongValueException(comp, _(e.getMessage()));
}
};
}
public void validateIfExistTheSameLabelType(
final Combobox comboLabelTypes, final WorkReportLabelTypeAssignment workReportLabelTypeAssignment)
throws WrongValueException {
if ( (getWorkReportType() != null) &&
(getWorkReportType().existRepeatedLabelType(workReportLabelTypeAssignment)) ) {
workReportLabelTypeAssignment.setLabelType(null);
throw new WrongValueException(comboLabelTypes, _("Label type already assigned"));
}
}
public Constraint validateIfExistTheSameFieldName(final DescriptionField descriptionField) {
return (comp, value) -> {
descriptionField.setFieldName((String) value);
if ((getWorkReportType() != null) && (getWorkReportType().existSameFieldName(descriptionField))) {
descriptionField.setFieldName(null);
throw new WrongValueException(comp, _("A description field with the same name already exists."));
}
};
}
private boolean isAllValid() {
// Validate workReportType name
if (!name.isValid()) {
selectTab(tabReportStructure);
showInvalidWorkReportTypeName();
return false;
}
if (!code.isValid()) {
selectTab(tabReportStructure);
showInvalidWorkReportTypeCode();
return false;
}
// Validate the descriptionFields and the WorkReportLabelTypeAssignments
return ((validateDescriptionFields()) && (validateWorkReportLabelTypeAssignments())) &&
validateIndexLabelsAndFields();
}
private boolean validateDescriptionFields() {
DescriptionField descriptionField = workReportTypeModel.validateFieldNameLineFields();
if (descriptionField != null) {
selectTab(tabReportStructure);
showInvalidDescriptionFieldName(descriptionField);
return false;
}
descriptionField = workReportTypeModel.validateLengthLineFields();
if (descriptionField != null) {
selectTab(tabReportStructure);
showInvalidDescriptionFieldLength(descriptionField);
return false;
}
return true;
}
private boolean validateWorkReportLabelTypeAssignments() {
WorkReportLabelTypeAssignment labelTypeAssignment = workReportTypeModel.validateLabelTypes();
if (labelTypeAssignment != null) {
selectTab(tabReportStructure);
String errorMessage = "The label type must unique and not null.";
showInvalidWorkReportLabelTypeAssignment(0, errorMessage, labelTypeAssignment);
return false;
}
WorkReportLabelTypeAssignment labelAssignment = workReportTypeModel.validateLabels();
if (labelAssignment != null) {
selectTab(tabReportStructure);
String errorMessage = "The label must not null.";
showInvalidWorkReportLabelTypeAssignment(2, errorMessage, labelAssignment);
return false;
}
return true;
}
private boolean validateIndexLabelsAndFields() {
if (!workReportTypeModel.validateTheIndexFieldsAndLabels()) {
selectTab(tabSortedLabelsAndFields);
showMessageSortedLabelsAndFields();
return false;
}
return true;
}
private void showInvalidWorkReportTypeName() {
try {
workReportTypeModel.validateWorkReportTypeName(name.getValue());
} catch (IllegalArgumentException e) {
throw new WrongValueException(name, _(e.getMessage()));
}
}
private void showInvalidWorkReportTypeCode() {
try {
workReportTypeModel.validateWorkReportTypeCode(code.getValue());
} catch (IllegalArgumentException e) {
throw new WrongValueException(code, _(e.getMessage()));
}
}
private void showInvalidDescriptionFieldName(DescriptionField field) {
// Find which row contains the description field inside grid
Row row = findRowByValue(listDescriptionFields.getRows(), field);
Textbox fieldName = null;
if (row != null) {
fieldName = (Textbox) row.getFirstChild();
}
throw new WrongValueException(fieldName, _("The field name must be unique and not empty"));
}
private void showInvalidDescriptionFieldLength(DescriptionField field) {
// Find which row contains the description field inside grid
Row row = findRowByValue(listDescriptionFields.getRows(), field);
Intbox fieldName = null;
if (row != null) {
fieldName = (Intbox) row.getChildren().get(1);
}
throw new WrongValueException(fieldName, _("The length must be greater than 0 and not empty"));
}
private void showInvalidWorkReportLabelTypeAssignment(int combo,
String message,
WorkReportLabelTypeAssignment labelType) {
Row row = findRowByValue(listWorkReportLabelTypeAssignments.getRows(), labelType);
Combobox comboLabelType = null;
if (row != null) {
comboLabelType = (Combobox) row.getChildren().get(combo);
}
throw new WrongValueException(comboLabelType, _(message));
}
private Row findRowByValue(Rows rows, Object value) {
List<Row> listRows = rows.getChildren();
for (Row row : listRows) {
if (value.equals(row.getValue())) {
return row;
}
}
return null;
}
/* Operations to manage the ordered list of fields and labels */
public void reloadOrderedListFieldsAndLabels() {
Util.reloadBindings(orderedListFieldsAndLabels);
}
public List<Object> headingFieldsAndLabels(){
return workReportTypeModel.getOrderedListHeading();
}
public List<Object> linesFieldsAndLabels() {
return workReportTypeModel.getOrderedListLines();
}
public OrderedFieldsAndLabelsRowRenderer getOrderedFieldsAndLabelsRowRenderer() {
return orderedFieldsAndLabelsRowRenderer;
}
public class OrderedFieldsAndLabelsRowRenderer implements RowRenderer {
@Override
public void render(Row row, Object data, int i) {
row.setValue(data);
String name = _("Unallocated name");
String type;
if (data instanceof DescriptionField) {
if ( (((DescriptionField) data).getFieldName() != null) ||
(!((DescriptionField) data).getFieldName().isEmpty()) ) {
name = ((DescriptionField) data).getFieldName();
}
type = _("Text field");
} else {
if ( (((WorkReportLabelTypeAssignment) data).getLabelType() != null) &&
(((WorkReportLabelTypeAssignment) data).getDefaultLabel() != null) ) {
String labelType = ((WorkReportLabelTypeAssignment) data).getLabelType().getName();
String label = ((WorkReportLabelTypeAssignment) data).getDefaultLabel().getName();
name = labelType + " :: " + label;
}
type = _("Label");
}
appendNewLabel(row, name);
appendNewLabel(row, type);
appendOperationsFieldOrLabel(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 appendOperationsFieldOrLabel(final Row row) {
Hbox hbox = new Hbox();
hbox.setParent(row);
Button downbutton = new Button("", "/common/img/ico_subir1.png");
downbutton.setHoverImage("/common/img/ico_subir.png");
downbutton.setParent(hbox);
downbutton.setSclass("icono");
downbutton.addEventListener(Events.ON_CLICK, (EventListener) event -> {
boolean intoHeading = intoHeading(row.getGrid());
workReportTypeModel.upFieldOrLabel(row.getValue(), intoHeading);
Util.reloadBindings(row.getGrid());
});
Button upbutton = new Button("", "/common/img/ico_bajar1.png");
upbutton.setHoverImage("/common/img/ico_bajar.png");
upbutton.setParent(hbox);
upbutton.setSclass("icono");
upbutton.addEventListener(Events.ON_CLICK, (EventListener) event -> {
boolean intoHeading = intoHeading(row.getGrid());
workReportTypeModel.downFieldOrLabel(row.getValue(), intoHeading);
Util.reloadBindings(row.getGrid());
});
}
private boolean intoHeading(Grid grid) {
return !grid.getId().equals("linesFieldsAndLabels");
}
private void showMessageSortedLabelsAndFields() {
reloadOrderedListFieldsAndLabels();
if (messagesForUserSortedLabelsAndFields != null) {
messagesForUserSortedLabelsAndFields.showMessage(
Level.ERROR,
_("Index fields and labels must be unique and consecutive"));
}
}
private void selectTab(Tab tab) {
if (tab != null) {
tab.setSelected(true);
}
}
public void sortWorkReportTypes() {
Column columnName = (Column) listWindow.getFellow("workReportTypeName");
if (columnName != null) {
if (columnName.getSortDirection().equals("ascending")) {
columnName.sort(false, false);
columnName.setSortDirection("ascending");
} else if (columnName.getSortDirection().equals("descending")) {
columnName.sort(true, false);
columnName.setSortDirection("descending");
}
}
}
public void onCheckGenerateCode(Event e) {
CheckEvent ce = (CheckEvent) e;
if (ce.isChecked()) {
// We have to auto-generate the code for new objects
try {
workReportTypeModel.setCodeAutogenerated(ce.isChecked());
} catch (ConcurrentModificationException err) {
messagesForUser.showMessage(Level.ERROR, err.getMessage());
}
}
Util.reloadBindings(code);
}
@Override
protected String getEntityType() {
return _("Timesheets Template");
}
@Override
protected String getPluralEntityType() {
return _("Timesheets Templates");
}
@Override
protected void initCreate() {
workReportTypeModel.prepareForCreate();
loadComponents(editWindow);
}
@Override
protected void initEdit(WorkReportType workReportType) {
workReportTypeModel.initEdit(workReportType);
loadComponents(editWindow);
}
@Override
protected WorkReportType getEntityBeingEdited() {
return workReportTypeModel.getWorkReportType();
}
@Override
protected boolean beforeDeleting(WorkReportType workReportType) {
if (thereAreWorkReportsFor(workReportType)) {
Messagebox.show(
_("Cannot delete timesheet template. There are some timesheets bound to it."),
_("Warning"), Messagebox.OK, Messagebox.EXCLAMATION);
return false;
}
return true;
}
@Override
protected void delete(WorkReportType workReportType) throws InstanceNotFoundException {
workReportTypeModel.confirmRemove(workReportType);
final Grid workReportTypes = (Grid) listWindow.getFellowIfAny("listing");
if (workReportTypes != null) {
Util.reloadBindings(workReportTypes);
}
}
}