package com.constellio.app.modules.tasks.ui.components.fields; import static com.constellio.app.ui.i18n.i18n.$; import java.util.Date; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.ui.entities.TaskReminderVO; import com.constellio.app.ui.framework.components.fields.date.JodaDateField; import com.vaadin.data.Property; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.data.fieldgroup.FieldGroup; import com.vaadin.data.fieldgroup.FieldGroup.CommitException; import com.vaadin.data.fieldgroup.PropertyId; import com.vaadin.data.util.AbstractProperty; import com.vaadin.data.util.BeanItem; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; import com.vaadin.ui.CustomField; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; public class TaskReminderFieldImpl extends CustomField<TaskReminderVO> implements TaskReminderField { private TaskReminderVO taskReminderVO; private BeanItem<TaskReminderVO> taskReminderItem; private FieldGroup fieldGroup; @PropertyId("fixedDate") private JodaDateField fixedDateField; @PropertyId("relativeDateMetadataCode") private ComboBox relativeDateMetadataCodeField; @PropertyId("numberOfDaysToRelativeDate") private TextField numberOfDaysToRelativeDateField; private Label numberOfDaysToRelativeDateLabel; @PropertyId("beforeRelativeDate") private ComboBox beforeRelativeDateField; @Override protected Component initContent() { if (taskReminderVO == null) { taskReminderVO = new TaskReminderVO(); } taskReminderItem = new BeanItem<>(taskReminderVO); fieldGroup = new FieldGroup(taskReminderItem); setPropertyDataSource(new AbstractProperty<TaskReminderVO>() { @Override public TaskReminderVO getValue() { boolean submittedValueValid = taskReminderVO.getFixedDate() != null || taskReminderVO.getRelativeDateMetadataCode() != null; return submittedValueValid ? taskReminderVO : null; } @Override public void setValue(TaskReminderVO newValue) throws com.vaadin.data.Property.ReadOnlyException { setInternalValue(newValue); taskReminderVO = newValue != null ? newValue : new TaskReminderVO(); if (fieldGroup != null) { taskReminderItem = new BeanItem<>(taskReminderVO); fieldGroup.setItemDataSource(taskReminderItem); } } @Override public Class<? extends TaskReminderVO> getType() { return TaskReminderVO.class; } }); VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setWidth("99%"); mainLayout.setHeightUndefined(); mainLayout.setSpacing(true); fixedDateField = new JodaDateField(); fixedDateField.setCaption($("TaskReminderField.fixedDate")); fixedDateField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { if (event.getProperty().getValue() != null) { numberOfDaysToRelativeDateField.setValue("0"); beforeRelativeDateField.setValue(null); relativeDateMetadataCodeField.setValue(null); } } }); HorizontalLayout relativeDateLayout = new HorizontalLayout(); relativeDateLayout.setCaption($("TaskReminderField.relativeDateMetadataCode")); relativeDateLayout.setSpacing(true); relativeDateMetadataCodeField = new ComboBox(); relativeDateMetadataCodeField.addItem(Task.START_DATE); relativeDateMetadataCodeField.addItem(Task.DUE_DATE); relativeDateMetadataCodeField.setItemCaption(Task.START_DATE, $("TaskReminderField.startDate")); relativeDateMetadataCodeField.setItemCaption(Task.DUE_DATE, $("TaskReminderField.dueDate")); relativeDateMetadataCodeField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { if (event.getProperty().getValue() != null) { fixedDateField.setValue(null); } } }); numberOfDaysToRelativeDateField = new TextField(); numberOfDaysToRelativeDateField.setWidth(3, Unit.EM); numberOfDaysToRelativeDateField.setConverter(Integer.class); numberOfDaysToRelativeDateLabel = new Label($("TaskReminderField.numberOfDaysToRelativeDate")); beforeRelativeDateField = new ComboBox(); beforeRelativeDateField.addItem(Boolean.TRUE); beforeRelativeDateField.addItem(Boolean.FALSE); beforeRelativeDateField.setItemCaption(Boolean.TRUE, $("TaskReminderField.beforeRelativeDate")); beforeRelativeDateField.setItemCaption(Boolean.FALSE, $("TaskReminderField.afterRelativeDate")); mainLayout.addComponents(fixedDateField, relativeDateLayout); relativeDateLayout.addComponents(numberOfDaysToRelativeDateField, numberOfDaysToRelativeDateLabel, beforeRelativeDateField, relativeDateMetadataCodeField); fieldGroup.bindMemberFields(this); return mainLayout; } @Override public Class<? extends TaskReminderVO> getType() { return TaskReminderVO.class; } private boolean isInvalidFieldValue() { boolean invalidFieldValue; Date fixedDateValue = fixedDateField.getValue(); String relativeDateMetadataCodeValue = (String) relativeDateMetadataCodeField.getValue(); if (fixedDateValue == null && relativeDateMetadataCodeValue == null) { invalidFieldValue = true; } else if (fixedDateValue != null && relativeDateMetadataCodeValue != null) { invalidFieldValue = true; } else { invalidFieldValue = false; } return invalidFieldValue; } @Override public void commit() throws SourceException, InvalidValueException { if (!isInvalidFieldValue()) { try { fieldGroup.commit(); } catch (CommitException e) { throw new InvalidValueException(e.getMessage()); } super.commit(); } } }