package com.constellio.app.modules.tasks.ui.components.fields; import static com.constellio.app.ui.i18n.i18n.$; import com.constellio.app.modules.tasks.ui.entities.TaskFollowerVO; import com.constellio.app.ui.framework.components.fields.lookup.LookupRecordField; import com.constellio.model.entities.records.wrappers.User; 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.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.CustomField; import com.vaadin.ui.VerticalLayout; public class TaskFollowerFieldImpl extends CustomField<TaskFollowerVO> implements TaskFollowerField { private TaskFollowerVO taskFollowerVO; private BeanItem<TaskFollowerVO> taskFollowerItem; private FieldGroup fieldGroup; @PropertyId("dirty") private CheckBox dirtyField; @PropertyId("followerId") private LookupRecordField followerIdField; @PropertyId("followTaskStatusModified") private CheckBox followTaskStatusModifiedField; @PropertyId("followTaskAssigneeModified") private CheckBox followTaskAssigneeModifiedField; @PropertyId("followSubTasksModified") private CheckBox followSubTasksModifiedField; @PropertyId("followTaskCompleted") private CheckBox followTaskCompletedField; @PropertyId("followTaskDeleted") private CheckBox followTaskDeletedField; @Override protected Component initContent() { if (taskFollowerVO == null) { taskFollowerVO = new TaskFollowerVO(); } taskFollowerItem = new BeanItem<>(taskFollowerVO); fieldGroup = new FieldGroup(taskFollowerItem); setPropertyDataSource(new AbstractProperty<TaskFollowerVO>() { @Override public TaskFollowerVO getValue() { boolean submittedValueValid = taskFollowerVO.getFollowerId() != null; return submittedValueValid ? taskFollowerVO : null; } @Override public void setValue(TaskFollowerVO newValue) throws com.vaadin.data.Property.ReadOnlyException { setInternalValue(newValue); taskFollowerVO = newValue != null ? newValue : new TaskFollowerVO(); if (fieldGroup != null) { taskFollowerItem = new BeanItem<>(taskFollowerVO); fieldGroup.setItemDataSource(taskFollowerItem); } } @Override public Class<? extends TaskFollowerVO> getType() { return TaskFollowerVO.class; } }); VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setWidth("99%"); mainLayout.setHeightUndefined(); mainLayout.setSpacing(true); dirtyField = new CheckBox(); dirtyField.setCaption($("TaskFollowerField.dirty")); dirtyField.setVisible(false); followerIdField = new LookupRecordField(User.SCHEMA_TYPE); followerIdField.setCaption($("TaskFollowerField.followerId")); followTaskStatusModifiedField = new CheckBox(); followTaskStatusModifiedField.setCaption($("TaskFollowerField.followTaskStatusModified")); followTaskAssigneeModifiedField = new CheckBox(); followTaskAssigneeModifiedField.setCaption($("TaskFollowerField.followTaskAssigneeModified")); followSubTasksModifiedField = new CheckBox(); followSubTasksModifiedField.setCaption($("TaskFollowerField.followSubTasksModified")); followTaskCompletedField = new CheckBox(); followTaskCompletedField.setCaption($("TaskFollowerField.followTaskCompleted")); followTaskDeletedField = new CheckBox(); followTaskDeletedField.setCaption($("TaskFollowerField.followTaskDeleted")); mainLayout.addComponent(dirtyField); mainLayout.addComponent(followerIdField); mainLayout.addComponent(followTaskStatusModifiedField); mainLayout.addComponent(followTaskAssigneeModifiedField); mainLayout.addComponent(followSubTasksModifiedField); mainLayout.addComponent(followTaskCompletedField); mainLayout.addComponent(followTaskDeletedField); fieldGroup.bindMemberFields(this); return mainLayout; } @Override public Class<? extends TaskFollowerVO> getType() { return TaskFollowerVO.class; } private boolean isInvalidFieldValue() { boolean invalidFieldValue; String followerIdValue = followerIdField.getValue(); Boolean followTaskStatusModifiedValue = (Boolean) followTaskStatusModifiedField.getValue(); Boolean followTaskAssigneeModifiedValue = followTaskAssigneeModifiedField.getValue(); Boolean followSubTasksModifiedValue = followSubTasksModifiedField.getValue(); Boolean followTaskCompletedValue = followTaskCompletedField.getValue(); Boolean followTaskDeletedValue = followTaskDeletedField.getValue(); if (followerIdValue == null && (Boolean.TRUE.equals(followTaskStatusModifiedValue) || Boolean.TRUE.equals(followTaskAssigneeModifiedValue) || Boolean.TRUE.equals(followSubTasksModifiedValue) || Boolean.TRUE.equals(followTaskCompletedValue) || Boolean.TRUE.equals(followTaskDeletedValue))) { invalidFieldValue = true; } else if (followerIdValue != null && Boolean.FALSE.equals(followTaskStatusModifiedValue) && Boolean.FALSE.equals(followTaskAssigneeModifiedValue) && Boolean.FALSE.equals(followSubTasksModifiedValue) && Boolean.FALSE.equals(followTaskCompletedValue) && Boolean.FALSE.equals(followTaskDeletedValue)) { 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(); } } }