diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleAddUpdateWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleAddUpdateWindow.java index fb03902b1..7e3051555 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleAddUpdateWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleAddUpdateWindow.java @@ -32,8 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; import org.vaadin.spring.events.EventBus; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.AbstractField; @@ -84,9 +82,15 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se private CommonDialogWindow window; - private String oldDescriptionValue; + private String originalDescriptionValue; - private String oldVendorValue; + private String originalVendorValue; + + private String originalNameValue; + + private String originalVersionValue; + + private String originalComboBoxValue; private Boolean editSwModule = Boolean.FALSE; @@ -135,26 +139,31 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se nameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); nameTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_NAME); - nameTextField.addTextChangeListener(this::listenerNameTextFieldChanged); + nameTextField.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalNameValue)); + nameTextField.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, nameTextField)); /* version text field */ versionTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.version"), "", ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("textfield.version"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); versionTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_VERSION); - versionTextField.addTextChangeListener(this::listenerVersionTextFieldChanged); + versionTextField + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalVersionValue)); + versionTextField.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, versionTextField)); /* Vendor text field */ vendorTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.vendor"), "", ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.vendor"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); vendorTextField.setId(SPUIComponentIdProvider.SOFT_MODULE_VENDOR); + vendorTextField + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalVendorValue)); descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style", ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.ADD_SW_MODULE_DESCRIPTION); - addDescriptionTextChangeListener(); - addVendorTextChangeListener(); + descTextArea + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalDescriptionValue)); typeComboBox = SPUIComponentProvider.getComboBox(i18n.get("upload.swmodule.type"), "", "", null, null, true, null, i18n.get("upload.swmodule.type")); @@ -162,43 +171,40 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se typeComboBox.setStyleName(SPUIDefinitions.COMBO_BOX_SPECIFIC_STYLE + " " + ValoTheme.COMBOBOX_TINY); typeComboBox.setNewItemsAllowed(Boolean.FALSE); typeComboBox.setImmediate(Boolean.TRUE); - typeComboBox.addValueChangeListener(this::listenerTypeComboBoxChanged); - populateTypeNameCombo(); - - resetOldValues(); - } - - private void listenerNameTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, nameTextField); - } - - private void listenerVersionTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, versionTextField); - } - - private void listenerTypeComboBoxChanged(final ValueChangeEvent event) { - window.checkMandatoryComboBox(event, typeComboBox); + typeComboBox.addValueChangeListener( + event -> window.checkMandatoryEditedValue(event, typeComboBox, originalComboBoxValue)); } private void populateTypeNameCombo() { typeComboBox.setContainerDataSource(HawkbitCommonUtil.createLazyQueryContainer( new BeanQueryFactory(SoftwareModuleTypeBeanQuery.class))); typeComboBox.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); - } - private void resetOldValues() { - oldDescriptionValue = null; - oldVendorValue = null; + private void resetComponents() { + + vendorTextField.clear(); + nameTextField.clear(); + versionTextField.clear(); + descTextArea.clear(); + typeComboBox.clear(); + + originalDescriptionValue = null; + originalVendorValue = null; + originalComboBoxValue = null; + originalNameValue = null; + originalVersionValue = null; if (window != null) { - window.resetMandatoryAndEditedFields(); + window.reset(); } } private void createWindow() { + resetComponents(); + final Label madatoryStarLabel = new Label("*"); madatoryStarLabel.setStyleName("v-caption v-required-field-indicator"); madatoryStarLabel.setWidth(null); @@ -223,9 +229,9 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se /* add main layout to the window */ window = SPUIComponentProvider.getWindow(i18n.get("upload.caption.add.new.swmodule"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveOrUpdate(), event -> closeThisWindow(), null, - getMandatoryFields(formLayout), null, i18n); + getMandatoryFields(formLayout), geEditedFields(), i18n); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); - nameTextField.focus(); + typeComboBox.focus(); } private Map getMandatoryFields(final FormLayout formLayout) { @@ -234,18 +240,20 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), Boolean.FALSE); } } return requiredFields; } - private void addDescriptionTextChangeListener() { - descTextArea.addTextChangeListener(event -> window.setSaveButtonEnabled(hasDescriptionChanged(event))); - } - - private void addVendorTextChangeListener() { - vendorTextField.addTextChangeListener(event -> window.setSaveButtonEnabled(hasVendorChanged(event))); + private Map geEditedFields() { + final Map editedFields = new HashMap<>(); + editedFields.put(typeComboBox.getId(), Boolean.FALSE); + editedFields.put(nameTextField.getId(), Boolean.FALSE); + editedFields.put(vendorTextField.getId(), Boolean.FALSE); + editedFields.put(versionTextField.getId(), Boolean.FALSE); + editedFields.put(descTextArea.getId(), Boolean.FALSE); + return editedFields; } /** @@ -309,13 +317,13 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getVendor())); descTextArea.setValue(swModle.getDescription() == null ? HawkbitCommonUtil.SP_STRING_EMPTY : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getDescription())); - oldDescriptionValue = descTextArea.getValue(); - oldVendorValue = vendorTextField.getValue(); + originalDescriptionValue = descTextArea.getValue(); + originalVendorValue = vendorTextField.getValue(); + originalComboBoxValue = swModle.getType().getName(); if (swModle.getType().isDeleted()) { typeComboBox.addItem(swModle.getType().getName()); } typeComboBox.setValue(swModle.getType().getName()); - window.setSaveButtonEnabled(Boolean.FALSE); } /** @@ -324,7 +332,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se private void closeThisWindow() { window.close(); UI.getCurrent().removeWindow(window); - window.setSaveButtonEnabled(false); } /** @@ -361,15 +368,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se } else { addNewBaseSoftware(); } - window.setSaveButtonEnabled(false); - } - - private boolean hasDescriptionChanged(final TextChangeEvent event) { - return !(event.getText().equals(oldDescriptionValue) && vendorTextField.getValue().equals(oldVendorValue)); - } - - private boolean hasVendorChanged(final TextChangeEvent event) { - return !(event.getText().equals(oldVendorValue) && descTextArea.getValue().equals(oldDescriptionValue)); } public FormLayout getFormLayout() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java index 6527a37be..694399b47 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java @@ -44,7 +44,6 @@ import com.vaadin.ui.UI; /** * Header of Software module table. - * */ @SpringComponent @ViewScope diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java index bfd48113d..d8b32efc4 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java @@ -34,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.shared.ui.colorpicker.Color; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; @@ -92,13 +91,15 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_NAME, true, "", i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); tagName.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_NAME); - tagName.addTextChangeListener(this::listenerTagNameTextFieldChanged); + tagName.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagName())); + tagName.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, tagName)); typeKey = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_KEY, true, "", i18n.get("textfield.key"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); typeKey.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_KEY); - typeKey.addTextChangeListener(this::typeKeyTextFieldChanged); + typeKey.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTypeKey())); + typeKey.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, typeKey)); tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_DESC, false, "", @@ -106,19 +107,11 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout tagDesc.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(this::listenerTagDescTextAreaChanged); + tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagDesc())); singleMultiOptionGroup(); } - private void listenerTagNameTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, tagName); - } - - private void typeKeyTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, typeKey); - } - @Override protected void buildLayout() { @@ -142,7 +135,7 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), Boolean.FALSE); } } return requiredFields; @@ -164,6 +157,7 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout } else { assignOptiongroup.setEnabled(true); } + assignOptiongroup.select(singleAssignStr); } /** @@ -195,18 +189,19 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout @Override protected void setTagDetails(final String targetTagSelected) { tagName.setValue(targetTagSelected); + setOriginalTagName(targetTagSelected); final SoftwareModuleType selectedTypeTag = swTypeManagementService .findSoftwareModuleTypeByName(targetTagSelected); if (null != selectedTypeTag) { tagDesc.setValue(selectedTypeTag.getDescription()); - setTagDescOriginal(selectedTypeTag.getDescription()); + setOriginalTagDesc(selectedTypeTag.getDescription()); typeKey.setValue(selectedTypeTag.getKey()); + setOriginalTypeKey(selectedTypeTag.getKey()); if (selectedTypeTag.getMaxAssignments() == Integer.MAX_VALUE) { assignOptiongroup.setValue(multiAssignStr); } else { assignOptiongroup.setValue(singleAssignStr); } - setColorPickerComponentsColor(selectedTypeTag.getColour()); } } @@ -245,7 +240,7 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout updateSWModuleType(existingSMTypeByName); } - window.setSaveButtonEnabled(false); + // window.setSaveButtonEnabled(false); } private void createNewSWModuleType() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java index 05d97a0de..7602f0a83 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java @@ -11,8 +11,10 @@ package org.eclipse.hawkbit.ui.common; import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; +import java.util.Collections; import java.util.Map; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; @@ -22,16 +24,14 @@ import org.eclipse.hawkbit.ui.management.targettable.TargetAddUpdateWindowLayout import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; -import org.springframework.beans.factory.annotation.Autowired; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.server.FontAwesome; import com.vaadin.shared.ui.colorpicker.Color; +import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractOrderedLayout; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.AbstractTextField; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickListener; @@ -74,9 +74,8 @@ public class CommonDialogWindow extends Window implements Serializable { private Map requiredFields; - private final Map editedFields; + private Map editedFields; - @Autowired private final I18N i18n; /** @@ -104,41 +103,155 @@ public class CommonDialogWindow extends Window implements Serializable { this.saveButtonClickListener = saveButtonClickListener; this.cancelButtonClickListener = cancelButtonClickListener; this.requiredFields = requiredFields; + if (requiredFields == null) { + this.requiredFields = Collections.emptyMap(); + } + this.editedFields = editedFields; + if (editedFields == null) { + this.editedFields = Collections.emptyMap(); + } this.i18n = i18n; init(); } - public void checkMandatoryTextField(final TextChangeEvent event, final AbstractTextField textfield) { - - if (StringUtils.isNotBlank(event.getText())) { - if (StringUtils.isNotBlank(textfield.getCaption())) { - requiredFields.put(textfield.getCaption(), Boolean.TRUE); - } - getRequiredFields().put(textfield.getId(), Boolean.TRUE); - } else { - if (StringUtils.isNotBlank(textfield.getCaption())) { - requiredFields.put(textfield.getCaption(), Boolean.FALSE); - } - requiredFields.put(textfield.getId(), Boolean.FALSE); + /** + * Checks if all mandatory fields are filled, and if there are changes in + * the current field. If yes, the save button will be enabled. + * + * @param event + * TextChangeEvent + * @param originalValue + * original Value of the current field + */ + public void checkMandatoryEditedTextField(final TextChangeEvent event, final String originalValue) { + final Component component = event.getComponent(); + if (!(component instanceof AbstractComponent)) { + throw new IllegalStateException("Only AbstractComponent not allow"); } - checkMandatoryFieldsFilled(); + + if (requiredFields.containsKey(component.getId())) { + final boolean isTextChangeNotEmpty = StringUtils.isNotBlank(event.getText()); + setRequiredFieldChangeValue((AbstractComponent) component, isTextChangeNotEmpty); + } + checkChanges(component.getId(), event.getText(), originalValue); + checkSaveButtonEnabled(); } - public void checkMandatoryComboBox(final ValueChangeEvent event, final AbstractSelect select) { - - if (event.getProperty().getValue() != null) { - if (StringUtils.isNotBlank(select.getCaption())) { - requiredFields.put(select.getCaption(), Boolean.TRUE); - } - requiredFields.put(select.getId(), Boolean.TRUE); - } else { - if (StringUtils.isNotBlank(select.getCaption())) { - requiredFields.put(select.getCaption(), Boolean.FALSE); - } - requiredFields.put(select.getId(), Boolean.FALSE); + /** + * Checks if all mandatory fields are filled, and if there are changes in + * the current field. If yes, the save button will be enabled. + * + * @param event + * ValueChangeEvent + * @param component + * current Component + * @param originalValue + * original Value of the current field + */ + public void checkMandatoryEditedValue(final ValueChangeEvent event, final AbstractComponent component, + final String originalValue) { + final boolean isChangedValueNotNull = event.getProperty().getValue() != null; + if (requiredFields.containsKey(component.getId())) { + setRequiredFieldChangeValue(component, isChangedValueNotNull); } - checkMandatoryFieldsFilled(); + if (event.getProperty().getValue() != null) { + checkChanges(component.getId(), event.getProperty().getValue().toString(), originalValue); + } else { + checkChanges(component.getId(), null, originalValue); + } + checkSaveButtonEnabled(); + } + + /** + * Checks if all mandatory fields are filled, and if there are changes in + * the current field. (Boolean) If yes, the save button will be enabled. + * + * @param event + * ValueChangeEvent + * @param component + * current Component + * @param originalValue + * original Boolean Value of the current field + */ + public void checkMandatoryEditedValueBoolean(final ValueChangeEvent event, final AbstractComponent component, + final Boolean originalValue) { + final boolean isChangedValueNotNull = event.getProperty().getValue() != null; + if (requiredFields.containsKey(component.getId())) { + setRequiredFieldChangeValue(component, isChangedValueNotNull); + } + final Boolean changed = (Boolean) event.getProperty().getValue(); + editedFields.put(component.getId(), BooleanUtils.compare(changed, originalValue) != 0); + checkSaveButtonEnabled(); + } + + /** + * Updates the map of required fields if a value is set. (e.g. on Update + * when editing a component) + * + * @param event + * ValueChangeEvent + * @param component + * current Component + */ + public void setRequiredFieldWhenUpdate(final ValueChangeEvent event, final AbstractComponent component) { + final boolean isChangedValueNotNull = event.getProperty().getValue() != null; + setRequiredFieldChangeValue(component, isChangedValueNotNull); + } + + /** + * * Updates the map of required fields if a value is set. (e.g. on Update + * when editing a component) + * + * @param fieldId + * Id of the current component + * @param filled + * Boolean if field is filled + */ + public void updateRequiredFields(final String fieldId, final Boolean filled) { + + requiredFields.put(fieldId, filled); + checkSaveButtonEnabled(); + } + + /** + * Checks if Color is changed + * + * @param fieldId + * Id of the current component + * @param newColor + * new Color + * @param oldColor + * old Color + */ + public void checkColorChange(final String fieldId, final Color newColor, final Color oldColor) { + editedFields.put(fieldId, !newColor.equals(oldColor)); + checkSaveButtonEnabled(); + } + + /** + * Updates the map of fields which can be edited. + * + * @param fieldId + * Id of the current component + * @param hasTextValueChanged + * Boolean if value has changed + */ + public void updateEditedFields(final String fieldId, final Boolean hasTextValueChanged) { + editedFields.put(fieldId, hasTextValueChanged); + checkSaveButtonEnabled(); + } + + /** + * Resets the map of mandatory and edited Fields and disable the save button + */ + public void reset() { + saveButton.setEnabled(false); + resetFields(); + } + + private void setRequiredFieldChangeValue(final AbstractComponent component, final boolean isTextChangeNotEmpty) { + requiredFields.put(component.getId(), isTextChangeNotEmpty); } /** @@ -146,69 +259,23 @@ public class CommonDialogWindow extends Window implements Serializable { * mandatory fields are filled the save button is enabled. Otherwise the * save button is disabled. */ - private void checkMandatoryFieldsFilled() { + private void checkSaveButtonEnabled() { + saveButton.setEnabled(!requiredFields.containsValue(Boolean.FALSE) && editedFields.containsValue(Boolean.TRUE)); + } + private void checkChanges(final String fieldName, final String newText, final String oldText) { + final boolean hasTextValueChanged = (StringUtils.isNotBlank(newText) && !newText.equals(oldText)) + || (StringUtils.isNotBlank(oldText) && !oldText.equals(newText)); + editedFields.put(fieldName, hasTextValueChanged); + } + + private void resetFields() { for (final Map.Entry entry : requiredFields.entrySet()) { - if (entry.getValue() == null || entry.getValue().equals(Boolean.FALSE)) { - saveButton.setEnabled(false); - return; - } + entry.setValue(Boolean.FALSE); } - saveButton.setEnabled(true); - } - private void checkExistsChanges() { - - if (editedFields == null) { - return; - } for (final Map.Entry entry : editedFields.entrySet()) { - if (entry.getValue() != null && entry.getValue().equals(Boolean.TRUE)) { - saveButton.setEnabled(true); - return; - } - } - saveButton.setEnabled(false); - } - - public void updateRequiredFields(final String fieldId, final Boolean filled) { - - requiredFields.put(fieldId, filled); - checkMandatoryFieldsFilled(); - } - - public void checkChanges(final String fieldName, final String newText, final String oldText) { - - if ((StringUtils.isNotBlank(newText) && !newText.equals(oldText)) - || (StringUtils.isNotBlank(oldText) && !oldText.equals(newText))) { - editedFields.put(fieldName, Boolean.TRUE); - } else { - editedFields.put(fieldName, Boolean.FALSE); - } - checkExistsChanges(); - } - - public void checkColorChange(final String fieldName, final Color newColor, final Color oldColor) { - - if (newColor.equals(oldColor)) { - editedFields.put(fieldName, Boolean.FALSE); - } else { - editedFields.put(fieldName, Boolean.TRUE); - } - checkExistsChanges(); - } - - public void resetMandatoryAndEditedFields() { - resetFields(requiredFields); - resetFields(editedFields); - } - - private void resetFields(final Map fields) { - // Reset mandatory fields are filled marker / fields are edited marker - if (fields != null) { - for (final Map.Entry entry : fields.entrySet()) { - entry.setValue(null); - } + entry.setValue(Boolean.FALSE); } } @@ -258,20 +325,22 @@ public class CommonDialogWindow extends Window implements Serializable { private void createMandatoryLabel() { - if (existsMandatoryFieldsInWindowContent()) { - final Label mandatoryLabel = new Label(i18n.get("label.mandatory.field")); - mandatoryLabel.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_TINY); - - if (content instanceof TargetAddUpdateWindowLayout) { - ((TargetAddUpdateWindowLayout) content).getFormLayout().addComponent(mandatoryLabel); - } else if (content instanceof SoftwareModuleAddUpdateWindow) { - ((SoftwareModuleAddUpdateWindow) content).getFormLayout().addComponent(mandatoryLabel); - } else if (content instanceof AbstractCreateUpdateTagLayout) { - ((AbstractCreateUpdateTagLayout) content).getMainLayout().addComponent(mandatoryLabel); - } - - mainLayout.addComponent(mandatoryLabel); + if (!existsMandatoryFieldsInWindowContent()) { + return; } + + final Label mandatoryLabel = new Label(i18n.get("label.mandatory.field")); + mandatoryLabel.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_TINY); + + if (content instanceof TargetAddUpdateWindowLayout) { + ((TargetAddUpdateWindowLayout) content).getFormLayout().addComponent(mandatoryLabel); + } else if (content instanceof SoftwareModuleAddUpdateWindow) { + ((SoftwareModuleAddUpdateWindow) content).getFormLayout().addComponent(mandatoryLabel); + } else if (content instanceof AbstractCreateUpdateTagLayout) { + ((AbstractCreateUpdateTagLayout) content).getMainLayout().addComponent(mandatoryLabel); + } + + mainLayout.addComponent(mandatoryLabel); } private void createCancelButton() { @@ -292,18 +361,14 @@ public class CommonDialogWindow extends Window implements Serializable { saveButton.setSizeUndefined(); saveButton.addStyleName("default-color"); saveButton.addClickListener(saveButtonClickListener); - saveButton.setEnabled(!existsMandatoryFieldsInWindowContent()); + saveButton.setEnabled(false); buttonsLayout.addComponent(saveButton); buttonsLayout.setComponentAlignment(saveButton, Alignment.MIDDLE_RIGHT); buttonsLayout.setExpandRatio(saveButton, 1.0F); } private boolean existsMandatoryFieldsInWindowContent() { - - if (requiredFields != null && requiredFields.size() > 0) { - return true; - } - return false; + return !requiredFields.isEmpty(); } private void addHelpLink() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/CreateUpdateDistSetTypeLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/CreateUpdateDistSetTypeLayout.java index 303ca1bb2..9c6486200 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/CreateUpdateDistSetTypeLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/CreateUpdateDistSetTypeLayout.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; @@ -41,7 +40,6 @@ import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import com.vaadin.data.Item; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.util.IndexedContainer; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; @@ -93,6 +91,8 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private IndexedContainer originalSelectedTableContainer; + private String originalTypeKey; + @Override protected void createRequiredComponents() { @@ -102,13 +102,15 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_NAME, true, "", i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); tagName.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_NAME); - tagName.addTextChangeListener(this::listenerTagNameTextFieldChanged); + tagName.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagName())); + tagName.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, tagName)); typeKey = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_KEY, true, "", i18n.get("textfield.key"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); typeKey.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_KEY); - typeKey.addTextChangeListener(this::listenerTypeKeyTextFieldChanged); + typeKey.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTypeKey)); + typeKey.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, typeKey)); tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_DESC, false, "", @@ -116,16 +118,7 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout tagDesc.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(this::listenerTagDescTextAreaChanged); - } - - private void listenerTagNameTextFieldChanged(final TextChangeEvent event) { - - window.checkMandatoryTextField(event, tagName); - } - - private void listenerTypeKeyTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, typeKey); + tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagDesc())); } @Override @@ -279,14 +272,7 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout for (final Long id : selectedIds) { addTargetTableData(id); } - if (optiongroup.getValue().equals(updateTypeStr)) { - updateMandatoryFields(); - window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); - } else { - if (!selectedTableContainer.getItemIds().isEmpty()) { - window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); - } - } + window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); } } @@ -298,19 +284,20 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout for (final Long id : selectedIds) { addSourceTableData(id); selectedTable.removeItem(id); - if (optiongroup.getValue().equals(updateTypeStr)) { - updateMandatoryFields(); - window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); - } + window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); } } } private Boolean hasContentChanged() { + if (originalSelectedTableContainer == null) { + originalSelectedTableContainer = new IndexedContainer(); + } for (final Iterator itemIterator = selectedTableContainer.getItemIds().iterator(); itemIterator.hasNext();) { final long itemId = (Long) itemIterator.next(); if (!originalSelectedTableContainer.containsId(itemId)) { + window.updateEditedFields(selectedTable.getId(), Boolean.TRUE); return Boolean.TRUE; } } @@ -319,23 +306,17 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout .hasNext();) { final long itemId = (Long) itemIterator.next(); if (selectedTableContainer.size() > 0 && !selectedTableContainer.containsId(itemId)) { + window.updateEditedFields(selectedTable.getId(), Boolean.TRUE); return Boolean.TRUE; } } + if (selectedTableContainer.size() > 0) { + window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); + } return Boolean.FALSE; } - private void updateMandatoryFields() { - - if (StringUtils.isNotBlank(tagName.getValue())) { - window.getRequiredFields().put("Name", Boolean.TRUE); - } - if (StringUtils.isNotBlank(typeKey.getValue())) { - window.getRequiredFields().put("Key", Boolean.TRUE); - } - } - @SuppressWarnings("unchecked") private void getSourceTableData() { @@ -543,6 +524,7 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout super.optionValueChanged(event); if (updateTypeStr.equals(event.getProperty().getValue())) { + window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); selectedTable.getContainerDataSource().removeAllItems(); getSourceTableData(); distTypeSelectLayout.setEnabled(false); @@ -600,14 +582,15 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout protected void setTagDetails(final String distSetTypeSelected) { tagName.setValue(distSetTypeSelected); + setOriginalTagName(distSetTypeSelected); getSourceTableData(); selectedTable.getContainerDataSource().removeAllItems(); final DistributionSetType selectedTypeTag = fetchDistributionSetType(distSetTypeSelected); if (null != selectedTypeTag) { tagDesc.setValue(selectedTypeTag.getDescription()); - setTagDescOriginal(selectedTypeTag.getDescription()); + setOriginalTagDesc(selectedTypeTag.getDescription()); typeKey.setValue(selectedTypeTag.getKey()); - setTypeKeyOriginal(selectedTypeTag.getKey()); + setOriginalTypeKey(selectedTypeTag.getKey()); if (distributionSetManagement.countDistributionSetsByType(selectedTypeTag) <= 0) { distTypeSelectLayout.setEnabled(true); selectedTable.setEnabled(true); @@ -669,7 +652,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout } else { updateDistributionSetType(existingDistTypeByKey); } - window.setSaveButtonEnabled(false); } } @@ -687,14 +669,24 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), Boolean.FALSE); } } // Selected SoftwareModulesType - requiredFields.put(selectedTable.getId(), null); + requiredFields.put(selectedTable.getId(), Boolean.FALSE); return requiredFields; } + @Override + protected Map getEditedFields() { + final Map changeMap = new HashMap<>(); + changeMap.put(tagName.getId(), Boolean.FALSE); + changeMap.put(colorPickerLayout.getId(), Boolean.FALSE); + changeMap.put(tagDesc.getId(), Boolean.FALSE); + changeMap.put(selectedTable.getId(), Boolean.FALSE); + return changeMap; + } + @Override protected void previewButtonClicked() { if (!tagPreviewBtnClicked) { @@ -729,4 +721,14 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout optiongroup.setId(SPUIDefinitions.CREATE_OPTION_GROUP_DISTRIBUTION_SET_TYPE_ID); } + @Override + public String getOriginalTypeKey() { + return originalTypeKey; + } + + @Override + public void setOriginalTypeKey(final String originalTypeKey) { + this.originalTypeKey = originalTypeKey; + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/AbstractCreateUpdateTagLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/AbstractCreateUpdateTagLayout.java index 195d173ed..6beb7d5b7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/AbstractCreateUpdateTagLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/AbstractCreateUpdateTagLayout.java @@ -36,7 +36,6 @@ import org.vaadin.spring.events.EventBus; import com.google.common.base.Strings; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.server.Page; import com.vaadin.shared.ui.colorpicker.Color; import com.vaadin.ui.AbstractField; @@ -110,8 +109,9 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected String tagNameValue; protected String tagDescValue; - protected Color selectedColorOriginal; - private String tagDescOriginal; + private Color originalSelectedColor; + private String originalTagDesc; + private String originalTagName; protected void createWindow() { reset(); @@ -126,7 +126,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), null); } } return requiredFields; @@ -134,8 +134,9 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected Map getEditedFields() { final Map changeMap = new HashMap<>(); - changeMap.put(tagDesc.getCaption(), Boolean.FALSE); + changeMap.put(tagName.getId(), Boolean.FALSE); changeMap.put(colorPickerLayout.getId(), Boolean.FALSE); + changeMap.put(tagDesc.getId(), Boolean.FALSE); return changeMap; } @@ -192,7 +193,8 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_NAME, true, "", i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); tagName.setId(SPUIDefinitions.NEW_TARGET_TAG_NAME); - tagName.addTextChangeListener(this::listenerTagNameTextFieldChanged); + tagName.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTagName)); + tagName.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, tagName)); tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_DESC, false, "", i18n.get("textfield.description"), @@ -200,7 +202,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagDesc.setId(SPUIDefinitions.NEW_TARGET_TAG_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(this::listenerTagDescTextAreaChanged); + tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTagDesc)); tagNameComboBox = SPUIComponentProvider.getComboBox(null, "", "", null, null, false, "", i18n.get("label.combobox.tag")); @@ -214,16 +216,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagColorPreviewBtn.setStyleName(TAG_DYNAMIC_STYLE); } - private void listenerTagNameTextFieldChanged(final TextChangeEvent event) { - - window.checkMandatoryTextField(event, tagName); - } - - protected void listenerTagDescTextAreaChanged(final TextChangeEvent event) { - - window.checkChanges(tagDesc.getCaption(), event.getText(), tagDescOriginal); - } - protected void buildLayout() { mainLayout = new GridLayout(3, 2); @@ -352,7 +344,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); } - window.setSaveButtonEnabled(false); + window.reset(); // close the color picker layout tagPreviewBtnClicked = false; // reset the selected color - Set default color @@ -383,7 +375,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagPreviewBtnClicked = false; if (window != null) { - window.resetMandatoryAndEditedFields(); + window.reset(); } } @@ -474,13 +466,12 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent colorPickerLayout.getColorSelect().setColor(colorPickerLayout.getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), selectedColorOriginal); + window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), originalSelectedColor); } protected void closeWindow() { window.close(); UI.getCurrent().removeWindow(window); - window.setSaveButtonEnabled(false); } /** @@ -687,23 +678,39 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent } public Color getSelectedColorOriginal() { - return selectedColorOriginal; + return originalSelectedColor; } public void setSelectedColorOriginal(final Color selectedColorOriginal) { - this.selectedColorOriginal = selectedColorOriginal; - } - - public String getTagDescOriginal() { - return tagDescOriginal; - } - - public void setTagDescOriginal(final String tagDescOriginal) { - this.tagDescOriginal = tagDescOriginal; + this.originalSelectedColor = selectedColorOriginal; } public GridLayout getMainLayout() { return mainLayout; } + public Color getOriginalSelectedColor() { + return originalSelectedColor; + } + + public void setOriginalSelectedColor(final Color originalSelectedColor) { + this.originalSelectedColor = originalSelectedColor; + } + + public String getOriginalTagDesc() { + return originalTagDesc; + } + + public void setOriginalTagDesc(final String originalTagDesc) { + this.originalTagDesc = originalTagDesc; + } + + public String getOriginalTagName() { + return originalTagName; + } + + public void setOriginalTagName(final String originalTagName) { + this.originalTagName = originalTagName; + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/CreateUpdateTypeLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/CreateUpdateTypeLayout.java index ea77d885b..556347e4f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/CreateUpdateTypeLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/layouts/CreateUpdateTypeLayout.java @@ -33,10 +33,8 @@ import com.vaadin.ui.components.colorpicker.ColorSelector; import com.vaadin.ui.themes.ValoTheme; /** - * * Superclass defining common properties and methods for creating/updating * types. - * */ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { @@ -45,7 +43,7 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { protected String createTypeStr; protected String updateTypeStr; protected TextField typeKey; - protected String typeKeyOriginal; + protected String originalTypeKey; public static final String TYPE_NAME_DYNAMIC_STYLE = "new-tag-name"; private static final String TYPE_DESC_DYNAMIC_STYLE = "new-tag-desc"; @@ -152,14 +150,13 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { } else { typeKey.setEnabled(true); tagName.setEnabled(true); - window.setSaveButtonEnabled(true); tagName.clear(); tagDesc.clear(); typeKey.clear(); comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); } - window.setSaveButtonEnabled(false); + window.reset(); restoreComponentStyles(); getPreviewButtonColor(ColorPickerConstants.DEFAULT_COLOR); getColorPickerLayout().getSelPreview() @@ -186,7 +183,8 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { createDynamicStyleForComponents(tagName, typeKey, tagDesc, colorPickedPreview); getColorPickerLayout().getColorSelect().setColor(getColorPickerLayout().getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), selectedColorOriginal); + window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), + getOriginalSelectedColor()); } /** @@ -324,22 +322,12 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { // is implemented in the inherited class } - @Override - public Color getSelectedColorOriginal() { - return selectedColorOriginal; + public String getOriginalTypeKey() { + return originalTypeKey; } - @Override - public void setSelectedColorOriginal(final Color selectedColorOriginal) { - this.selectedColorOriginal = selectedColorOriginal; - } - - public String getTypeKeyOriginal() { - return typeKeyOriginal; - } - - public void setTypeKeyOriginal(final String typeKeyOriginal) { - this.typeKeyOriginal = typeKeyOriginal; + public void setOriginalTypeKey(final String originalTypeKey) { + this.originalTypeKey = originalTypeKey; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java index 03dce184c..90dd8a6a6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java @@ -8,10 +8,8 @@ */ package org.eclipse.hawkbit.ui.management.dstable; -import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; @@ -44,10 +42,6 @@ import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition; import org.vaadin.spring.events.EventBus; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.event.FieldEvents.TextChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.AbstractField; @@ -62,8 +56,7 @@ import com.vaadin.ui.UI; import com.vaadin.ui.themes.ValoTheme; /** - * - * + * WindowContent for adding/editing a Distribution */ @SpringComponent @ViewScope @@ -104,12 +97,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { private String originalDistDescription; private Boolean originalReqMigStep; private String originalDistSetType; - private final List changedComponents = new ArrayList<>(); - private ValueChangeListener reqMigStepCheckboxListerner; - private TextChangeListener descTextAreaListener; - private TextChangeListener distNameTextFieldListener; - private TextChangeListener distVersionTextFieldListener; - private ValueChangeListener distsetTypeNameComboBoxListener; private FormLayout formLayout; @@ -139,7 +126,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { formLayout.addComponent(reqMigStepCheckbox); setCompositionRoot(formLayout); - distNameTextField.focus(); } @@ -151,43 +137,42 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { true, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); distNameTextField.setId(SPUIComponentIdProvider.DIST_ADD_NAME); distNameTextField.setNullRepresentation(""); - distNameTextField.addTextChangeListener(this::listenerDistNameTextFieldChanged); + distNameTextField.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalDistName)); + distNameTextField.addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, distNameTextField)); distVersionTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.version"), "", ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("textfield.version"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); distVersionTextField.setId(SPUIComponentIdProvider.DIST_ADD_VERSION); distVersionTextField.setNullRepresentation(""); - distVersionTextField.addTextChangeListener(this::listenerDistVersionTextFieldChanged); + distVersionTextField + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalDistVersion)); + distVersionTextField + .addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, distVersionTextField)); distsetTypeNameComboBox = SPUIComponentProvider.getComboBox(i18n.get("label.combobox.type"), "", "", null, "", false, "", i18n.get("label.combobox.type")); distsetTypeNameComboBox.setImmediate(true); distsetTypeNameComboBox.setNullSelectionAllowed(false); distsetTypeNameComboBox.setId(SPUIComponentIdProvider.DIST_ADD_DISTSETTYPE); + populateDistSetTypeNameCombo(); + distsetTypeNameComboBox.addValueChangeListener( + event -> window.checkMandatoryEditedValue(event, distsetTypeNameComboBox, originalDistSetType)); descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style", ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.DIST_ADD_DESC); descTextArea.setNullRepresentation(""); + descTextArea + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalDistDescription)); reqMigStepCheckbox = SPUIComponentProvider.getCheckBox(i18n.get("checkbox.dist.required.migration.step"), "dist-checkbox-style", null, false, ""); reqMigStepCheckbox.addStyleName(ValoTheme.CHECKBOX_SMALL); reqMigStepCheckbox.setId(SPUIComponentIdProvider.DIST_ADD_MIGRATION_CHECK); - } - - private void listenerDistNameTextFieldChanged(final TextChangeEvent event) { - if (!editDistribution) { - window.checkMandatoryTextField(event, distNameTextField); - } - } - - private void listenerDistVersionTextFieldChanged(final TextChangeEvent event) { - if (!editDistribution) { - window.checkMandatoryTextField(event, distVersionTextField); - } + reqMigStepCheckbox.addValueChangeListener( + event -> window.checkMandatoryEditedValueBoolean(event, reqMigStepCheckbox, originalReqMigStep)); } /** @@ -209,26 +194,17 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { return disttypeContainer; } - private void enableSaveButton() { - window.setSaveButtonEnabled(true); - } - private DistributionSetType getDefaultDistributionSetType() { final TenantMetaData tenantMetaData = systemManagement.getTenantMetadata(); return tenantMetaData.getDefaultDsType(); } - private void disableSaveButton() { - window.setSaveButtonEnabled(false); - } - private void saveDistribution() { if (editDistribution) { updateDistribution(); } else { addNewDistribution(); } - window.setSaveButtonEnabled(false); } /** @@ -262,19 +238,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { } } - private void addListeners() { - reqMigStepCheckboxListerner = event -> checkValueChanged(originalReqMigStep, event); - descTextAreaListener = event -> checkValueChanged(originalDistDescription, event); - distNameTextFieldListener = event -> checkValueChanged(originalDistName, event); - distVersionTextFieldListener = event -> checkValueChanged(originalDistVersion, event); - distsetTypeNameComboBoxListener = event -> checkValueChanged(originalDistSetType, event); - reqMigStepCheckbox.addValueChangeListener(reqMigStepCheckboxListerner); - descTextArea.addTextChangeListener(descTextAreaListener); - distNameTextField.addTextChangeListener(distNameTextFieldListener); - distVersionTextField.addTextChangeListener(distVersionTextFieldListener); - distsetTypeNameComboBox.addValueChangeListener(distsetTypeNameComboBoxListener); - } - /** * Add new Distribution set. */ @@ -308,7 +271,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { private void closeThisWindow() { window.close(); UI.getCurrent().removeWindow(window); - window.setSaveButtonEnabled(false); } /** @@ -381,7 +343,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { if (distSetTypeName == null) { distsetTypeNameComboBox.addStyleName(SPUIStyleDefinitions.SP_COMBOFIELD_ERROR); } - notificationMessage.displayValidationError(i18n.get("message.mandatory.check")); return false; } @@ -391,7 +352,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { private void discardDistribution() { /* Just close this window */ - distsetTypeNameComboBox.removeValueChangeListener(distsetTypeNameComboBoxListener); closeThisWindow(); } @@ -407,14 +367,15 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { distsetTypeNameComboBox.removeStyleName(SPUIStyleDefinitions.SP_COMBOFIELD_ERROR); descTextArea.clear(); reqMigStepCheckbox.clear(); - if (window != null) { - window.setSaveButtonEnabled(true); - } - removeListeners(); - changedComponents.clear(); + + originalDistDescription = null; + originalDistName = null; + originalDistSetType = null; + originalDistVersion = null; + originalReqMigStep = Boolean.FALSE; if (window != null) { - window.resetMandatoryAndEditedFields(); + window.reset(); } } @@ -422,71 +383,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { populateDistSetTypeNameCombo(); } - private void removeListeners() { - reqMigStepCheckbox.removeValueChangeListener(reqMigStepCheckboxListerner); - descTextArea.removeTextChangeListener(descTextAreaListener); - distNameTextField.removeTextChangeListener(distNameTextFieldListener); - distVersionTextField.removeTextChangeListener(distVersionTextFieldListener); - } - - public void setOriginalDistName(final String originalDistName) { - this.originalDistName = originalDistName; - } - - public void setOriginalDistVersion(final String originalDistVersion) { - this.originalDistVersion = originalDistVersion; - } - - public void setOriginalDistDescription(final String originalDistDescription) { - this.originalDistDescription = originalDistDescription; - } - - private void checkValueChanged(final String originalValue, final TextChangeEvent event) { - if (editDistribution) { - final String newValue = event.getText(); - if (!originalValue.equalsIgnoreCase(newValue)) { - changedComponents.add(event.getComponent()); - } else { - changedComponents.remove(event.getComponent()); - } - enableDisableSaveButton(); - } - } - - private void checkValueChanged(final Boolean originalValue, final ValueChangeEvent event) { - if (editDistribution) { - if (!originalValue.equals(event.getProperty().getValue())) { - changedComponents.add(reqMigStepCheckbox); - } else { - changedComponents.remove(reqMigStepCheckbox); - } - enableDisableSaveButton(); - } - } - - private void checkValueChanged(final String originalValue, final ValueChangeEvent event) { - if (editDistribution) { - if (!originalValue.equals(event.getProperty().getValue())) { - changedComponents.add(distsetTypeNameComboBox); - } else { - changedComponents.remove(distsetTypeNameComboBox); - } - enableDisableSaveButton(); - } - } - - private void enableDisableSaveButton() { - if (changedComponents.isEmpty()) { - disableSaveButton(); - } else { - enableSaveButton(); - } - } - - private void setOriginalReqMigStep(final Boolean originalReqMigStep) { - this.originalReqMigStep = originalReqMigStep; - } - /** * populate data. * @@ -495,7 +391,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { public void populateValuesOfDistribution(final Long editDistId) { this.editDistId = editDistId; editDistribution = Boolean.TRUE; - window.setSaveButtonEnabled(false); final DistributionSet distSet = distributionSetManagement.findDistributionSetByIdWithDetails(editDistId); if (distSet != null) { distNameTextField.setValue(distSet.getName()); @@ -508,23 +403,24 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { if (distSet.getDescription() != null) { descTextArea.setValue(distSet.getDescription()); } - setOriginalDistName(distSet.getName()); - setOriginalDistVersion(distSet.getVersion()); - setOriginalDistDescription(distSet.getDescription()); - setOriginalReqMigStep(distSet.isRequiredMigrationStep()); - setOriginalDistSetTYpe(distSet.getType().getName()); - addListeners(); + originalDistName = distSet.getName(); + originalDistVersion = distSet.getVersion(); + originalDistDescription = distSet.getDescription(); + originalReqMigStep = distSet.isRequiredMigrationStep(); + originalDistSetType = distSet.getType().getName(); + window.updateEditedFields(distsetTypeNameComboBox.getId(), Boolean.FALSE); + window.updateEditedFields(reqMigStepCheckbox.getId(), Boolean.FALSE); } } public CommonDialogWindow getWindow() { eventBus.publish(this, DragEvent.HIDE_DROP_HINT); - populateRequiredComponents(); - resetComponents(); window = SPUIComponentProvider.getWindow(i18n.get("caption.add.new.dist"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), event -> discardDistribution(), - null, getMandatoryFields(), null, i18n); + null, getMandatoryFields(), getEditedFields(), i18n); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); + populateRequiredComponents(); + resetComponents(); return window; } @@ -534,12 +430,22 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), Boolean.FALSE); } } return requiredFields; } + private Map getEditedFields() { + final Map editedFields = new HashMap<>(); + editedFields.put(distsetTypeNameComboBox.getId(), Boolean.FALSE); + editedFields.put(distNameTextField.getId(), Boolean.FALSE); + editedFields.put(distVersionTextField.getId(), Boolean.FALSE); + editedFields.put(descTextArea.getId(), Boolean.FALSE); + editedFields.put(reqMigStepCheckbox.getId(), Boolean.FALSE); + return editedFields; + } + /** * Populate DistributionSet Type name combo. */ @@ -549,12 +455,4 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { distsetTypeNameComboBox.setValue(getDefaultDistributionSetType().getName()); } - /** - * @param originalDistSetTYpe - * the originalDistSetTYpe to set - */ - public void setOriginalDistSetTYpe(final String originalDistSetType) { - this.originalDistSetType = originalDistSetType; - } - } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/CreateUpdateDistributionTagLayoutWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/CreateUpdateDistributionTagLayoutWindow.java index 3bee67345..0bcee9d09 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/CreateUpdateDistributionTagLayoutWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/CreateUpdateDistributionTagLayoutWindow.java @@ -32,9 +32,7 @@ import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.UI; /** - * * Class for Create/Update Tag Layout of distribution set - * */ @SpringComponent @ViewScope @@ -98,7 +96,6 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat updateExistingTag(existingDistTag); } } - window.setSaveButtonEnabled(false); } /** @@ -157,10 +154,11 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat @Override public void setTagDetails(final String distTagSelected) { tagName.setValue(distTagSelected); + setOriginalTagName(distTagSelected); final DistributionSetTag selectedDistTag = tagManagement.findDistributionSetTag(distTagSelected); if (null != selectedDistTag) { tagDesc.setValue(selectedDistTag.getDescription()); - setTagDescOriginal(selectedDistTag.getDescription()); + setOriginalTagDesc(selectedDistTag.getDescription()); if (null == selectedDistTag.getColour()) { setTagColor(getColorPickerLayout().getDefaultColor(), ColorPickerConstants.DEFAULT_COLOR); setSelectedColorOriginal(getColorPickerLayout().getDefaultColor()); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetAddUpdateWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetAddUpdateWindowLayout.java index 07360ed70..6c2193adb 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetAddUpdateWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetAddUpdateWindowLayout.java @@ -14,7 +14,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.Target; @@ -35,15 +34,12 @@ import org.eclipse.hawkbit.ui.utils.UINotification; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.EventBus; -import com.vaadin.event.FieldEvents.TextChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.VaadinSessionScope; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.FormLayout; -import com.vaadin.ui.Label; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; @@ -57,7 +53,7 @@ import com.vaadin.ui.themes.ValoTheme; @VaadinSessionScope public class TargetAddUpdateWindowLayout extends CustomComponent { private static final long serialVersionUID = -6659290471705262389L; - + @Autowired private I18N i18n; @@ -69,10 +65,10 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { @Autowired private transient UINotification uINotification; - + @Autowired private transient EntityFactory entityFactory; - + private TextField controllerIDTextField; private TextField nameTextField; private TextArea descTextArea; @@ -81,47 +77,47 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { private FormLayout formLayout; private CommonDialogWindow window; - private String oldTargetName; - private String oldTargetDesc; - + private String originalTargetName; + private String originalTargetDesc; + private String originalControllerId; + /** * Initialize the Add Update Window Component for Target. */ public void init() { - /* create components */ createRequiredComponents(); - /* display components in layout */ buildLayout(); - /* register all listeners related to the Window */ - addListeners(); setCompositionRoot(formLayout); } private void createRequiredComponents() { /* Textfield for controller Id */ - controllerIDTextField = SPUIComponentProvider.getTextField( i18n.get("prompt.target.id"), "", ValoTheme.TEXTFIELD_TINY, true, null, - i18n.get("prompt.target.id"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); + controllerIDTextField = SPUIComponentProvider.getTextField(i18n.get("prompt.target.id"), "", + ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("prompt.target.id"), true, + SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); controllerIDTextField.setId(SPUIComponentIdProvider.TARGET_ADD_CONTROLLER_ID); - controllerIDTextField.addTextChangeListener(this::listenerControllerIDTextFieldChanged); + controllerIDTextField + .addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalControllerId)); + controllerIDTextField + .addValueChangeListener(event -> window.setRequiredFieldWhenUpdate(event, controllerIDTextField)); /* Textfield for target name */ - nameTextField = SPUIComponentProvider.getTextField( i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY, false, null, - i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); + nameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY, + false, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); nameTextField.setId(SPUIComponentIdProvider.TARGET_ADD_NAME); + nameTextField.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTargetName)); /* Textarea for target description */ - descTextArea = SPUIComponentProvider.getTextArea( i18n.get("textfield.description"), "text-area-style", ValoTheme.TEXTFIELD_TINY, false, null, - i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); + descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style", + ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.description"), + SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.TARGET_ADD_DESC); descTextArea.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY); - } - - private void listenerControllerIDTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, controllerIDTextField); + descTextArea.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTargetDesc)); } private void buildLayout() { - + /* * The main layout of the window contains mandatory info, textboxes * (controller Id, name & description) and action buttons layout @@ -131,56 +127,10 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { formLayout.addComponent(controllerIDTextField); formLayout.addComponent(nameTextField); formLayout.addComponent(descTextArea); - + controllerIDTextField.focus(); } - private void addListeners() { - - addTargetNameChangeListner(); - addTargetDescChangeListner(); - } - - private void addTargetNameChangeListner() { - nameTextField.addTextChangeListener(new TextChangeListener() { - - /** - * - */ - private static final long serialVersionUID = 1761855781481115921L; - - @Override - public void textChange(final TextChangeEvent event) { - if (event.getText().equals(oldTargetName) && descTextArea.getValue().equals(oldTargetDesc)) { - window.setSaveButtonEnabled(false); - } else { - window.setSaveButtonEnabled(true); - } - - } - }); - } - - private void addTargetDescChangeListner() { - descTextArea.addTextChangeListener(new TextChangeListener() { - - /** - * - */ - private static final long serialVersionUID = 5770734934988115068L; - - @Override - public void textChange(final TextChangeEvent event) { - if (event.getText().equals(oldTargetDesc) && nameTextField.getValue().equals(oldTargetName)) { - window.setSaveButtonEnabled(false); - } else { - window.setSaveButtonEnabled(true); - } - - } - }); - } - /** * Update the Target if modified. */ @@ -210,7 +160,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { } else { addNewTarget(); } - window.setSaveButtonEnabled(false); } private void discardTargetListner() { @@ -244,37 +193,49 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { public Window getWindow() { eventBus.publish(this, DragEvent.HIDE_DROP_HINT); window = SPUIComponentProvider.getWindow(i18n.get("caption.add.new.target"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), event -> discardTargetListner(), null, getMandatoryFields(), null, i18n); + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), + event -> discardTargetListner(), null, getMandatoryFields(), getEditedFields(), i18n); return window; } - + private Map getMandatoryFields() { final Map requiredFields = new HashMap<>(); final Iterator iterate = formLayout.iterator(); while (iterate.hasNext()) { final Component c = iterate.next(); if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getCaption(), null); + requiredFields.put(c.getId(), Boolean.FALSE); } } return requiredFields; } - + + private Map getEditedFields() { + final Map editedFields = new HashMap<>(); + editedFields.put(controllerIDTextField.getId(), Boolean.FALSE); + editedFields.put(nameTextField.getId(), Boolean.FALSE); + editedFields.put(descTextArea.getId(), Boolean.FALSE); + return editedFields; + } + /** * clear all fields of Target Edit Window. */ public void resetComponents() { nameTextField.clear(); nameTextField.removeStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - controllerIDTextField.setEnabled(true); - controllerIDTextField.setReadOnly(false); + controllerIDTextField.setEnabled(Boolean.TRUE); controllerIDTextField.removeStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); controllerIDTextField.clear(); descTextArea.clear(); editTarget = Boolean.FALSE; + originalControllerId = null; + originalTargetDesc = null; + originalTargetName = null; + if (window != null) { - window.resetMandatoryAndEditedFields(); + window.reset(); } } @@ -282,7 +243,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { editTarget = Boolean.FALSE; window.close(); UI.getCurrent().removeWindow(window); - window.setSaveButtonEnabled(false); } private void setTargetValues(final Target target, final String name, final String description) { @@ -303,7 +263,8 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { private boolean duplicateCheck(final String newControlllerId) { final Target existingTarget = targetManagement.findTargetByControllerID(newControlllerId.trim()); if (existingTarget != null) { - uINotification.displayValidationError(i18n.get("message.target.duplicate.check", new Object[] {newControlllerId})); + uINotification.displayValidationError( + i18n.get("message.target.duplicate.check", new Object[] { newControlllerId })); return false; } else { return true; @@ -319,15 +280,15 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { editTarget = Boolean.TRUE; final Target target = targetManagement.findTargetByControllerID(controllerId); controllerIDTextField.setValue(target.getControllerId()); - controllerIDTextField.setReadOnly(Boolean.TRUE); + controllerIDTextField.setEnabled(Boolean.FALSE); nameTextField.setValue(target.getName()); if (target.getDescription() != null) { descTextArea.setValue(target.getDescription()); } - window.setSaveButtonEnabled(Boolean.FALSE); - oldTargetDesc = descTextArea.getValue(); - oldTargetName = nameTextField.getValue(); + originalTargetDesc = descTextArea.getValue(); + originalTargetName = nameTextField.getValue(); + originalControllerId = controllerIDTextField.getValue(); window.addStyleName("target-update-window"); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/CreateUpdateTargetTagLayoutWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/CreateUpdateTargetTagLayoutWindow.java index 81c0c72ae..781e13ef6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/CreateUpdateTargetTagLayoutWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/CreateUpdateTargetTagLayoutWindow.java @@ -88,10 +88,11 @@ public class CreateUpdateTargetTagLayoutWindow extends AbstractCreateUpdateTagLa @Override public void setTagDetails(final String targetTagSelected) { tagName.setValue(targetTagSelected); + setOriginalTagName(targetTagSelected); final TargetTag selectedTargetTag = tagManagement.findTargetTag(targetTagSelected); if (null != selectedTargetTag) { tagDesc.setValue(selectedTargetTag.getDescription()); - setTagDescOriginal(selectedTargetTag.getDescription()); + setOriginalTagDesc(selectedTargetTag.getDescription()); if (null == selectedTargetTag.getColour()) { setTagColor(getColorPickerLayout().getDefaultColor(), ColorPickerConstants.DEFAULT_COLOR); setSelectedColorOriginal(getColorPickerLayout().getDefaultColor()); @@ -115,7 +116,6 @@ public class CreateUpdateTargetTagLayoutWindow extends AbstractCreateUpdateTagLa updateExistingTag(existingTag); } } - window.setSaveButtonEnabled(false); } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java index c1efa9f4b..18e06814a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java @@ -75,9 +75,7 @@ import com.vaadin.ui.UI; import com.vaadin.ui.themes.ValoTheme; /** - * * Rollout add or update popup layout. - * */ @SpringComponent @ViewScope @@ -150,19 +148,21 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private TextArea targetFilterQuery; - private Boolean updateMode = Boolean.FALSE; + private String originalDistributionSet; - private String distributionSetOriginal; + private Object originalActionGroup; - private Object actionGroupOriginal; + private String originalRolloutName; - private String rolloutNameOriginal; + private String originalErrorThreshold; - private String errorThresholdOriginal;; + private String originalTriggerThreshold; - private String triggerThresholdOriginal; + private String originalDescription; - private String descriptionOriginal; + private String originalTargetFilterQueryCombo; + + private String originalNoOfGroups; /** * Create components and layout. @@ -174,6 +174,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } public CommonDialogWindow getWindow() { + window = SPUIComponentProvider.getWindow(i18n.get("caption.configure.rollout"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onRolloutSave(), event -> onDiscard(), uiProperties.getLinks().getDocumentation().getRolloutView(), getMandatoryFields(), getEditedFields(), @@ -181,25 +182,14 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { return window; } - public CommonDialogWindow createUpdateWindow() { - updateMode = Boolean.TRUE; - return getWindow(); - } - - public CommonDialogWindow createAddWindow() { - updateMode = Boolean.FALSE; - return getWindow(); - } - private Map getMandatoryFields() { final Map requiredFields = new HashMap<>(); - requiredFields.put(rolloutName.getId(), null); - requiredFields.put(distributionSet.getId(), null); - requiredFields.put(targetFilterQueryCombo.getId(), null); - requiredFields.put(noOfGroups.getId(), null); - requiredFields.put(triggerThreshold.getId(), null); - requiredFields.put(errorThreshold.getId(), null); - + requiredFields.put(rolloutName.getId(), Boolean.FALSE); + requiredFields.put(distributionSet.getId(), Boolean.FALSE); + requiredFields.put(targetFilterQueryCombo.getId(), Boolean.FALSE); + requiredFields.put(noOfGroups.getId(), Boolean.FALSE); + requiredFields.put(triggerThreshold.getId(), Boolean.FALSE); + requiredFields.put(errorThreshold.getId(), Boolean.FALSE); return requiredFields; } @@ -224,7 +214,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { rolloutForEdit = null; if (window != null) { - window.resetMandatoryAndEditedFields(); + window.reset(); } } @@ -319,13 +309,8 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private void listenerActionGroupValueChanged(final ValueChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryComboBox(event, actionTypeOptionGroupLayout.getActionTypeOptionGroup()); - } - if (event.getProperty().getValue() != null) { - window.checkChanges(actionTypeOptionGroupLayout.getActionTypeOptionGroup().getId(), - event.getProperty().getValue().toString(), actionGroupOriginal.toString()); - } + window.checkMandatoryEditedValue(event, actionTypeOptionGroupLayout.getActionTypeOptionGroup(), + originalActionGroup.toString()); } } @@ -346,9 +331,16 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { filterField.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY); filterField.setEnabled(false); filterField.setSizeUndefined(); + filterField.addValueChangeListener(event -> listenerFilterFieldValueChanged(event, filterField)); return filterField; } + private void listenerFilterFieldValueChanged(final ValueChangeEvent event, final TextArea filterField) { + if (window != null) { + window.setRequiredFieldWhenUpdate(event, targetFilterQueryCombo); + } + } + private Label createTotalTargetsLabel() { final Label targetCountLabel = SPUIComponentProvider.getLabel("", SPUILabelDefinitions.SP_LABEL_SIMPLE); targetCountLabel.addStyleName(ValoTheme.LABEL_TINY + " " + "rollout-target-count-message"); @@ -404,9 +396,9 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { totalTargetsCount = 0L; totalTargetsLabel.setVisible(false); } - onGroupNumberChange(); - - window.checkMandatoryComboBox(event, targetFilterQueryCombo); + onGroupNumberChange(event); + window.setRequiredFieldWhenUpdate(event, targetFilterQueryCombo); + window.checkMandatoryEditedValue(event, targetFilterQueryCombo, originalTargetFilterQueryCombo); } private String getTotalTargetMessage() { @@ -618,11 +610,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private void listenerDescriptionTextFieldChanged(final TextChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryTextField(event, description); - return; - } - window.checkChanges(description.getId(), event.getText(), descriptionOriginal); + window.checkMandatoryEditedTextField(event, originalDescription); } } @@ -633,16 +621,19 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { errorField.setMaxLength(7); errorField.setSizeUndefined(); errorField.addTextChangeListener(this::listenerErrorThresholdTextFieldChanged); + errorField.addValueChangeListener(event -> listenerErrorThresholdValueChanged(event, errorField)); return errorField; } private void listenerErrorThresholdTextFieldChanged(final TextChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryTextField(event, errorThreshold); - return; - } - window.checkChanges(errorThreshold.getId(), event.getText(), errorThresholdOriginal); + window.checkMandatoryEditedTextField(event, originalErrorThreshold); + } + } + + private void listenerErrorThresholdValueChanged(final ValueChangeEvent event, final TextField errorField) { + if (window != null) { + window.setRequiredFieldWhenUpdate(event, errorField); } } @@ -653,16 +644,19 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { thresholdField.setSizeUndefined(); thresholdField.setMaxLength(3); thresholdField.addTextChangeListener(this::listenerTriggerThresholdTextFieldChanged); + thresholdField.addValueChangeListener(event -> listenerTriggerTresholdValueChanged(event, thresholdField)); return thresholdField; } + private void listenerTriggerTresholdValueChanged(final ValueChangeEvent event, final TextField thresholdField) { + if (window != null) { + window.setRequiredFieldWhenUpdate(event, thresholdField); + } + } + private void listenerTriggerThresholdTextFieldChanged(final TextChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryTextField(event, triggerThreshold); - return; - } - window.checkChanges(triggerThreshold.getId(), event.getText(), triggerThresholdOriginal); + window.checkMandatoryEditedTextField(event, originalTriggerThreshold); } } @@ -672,28 +666,27 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroupsField.addValidator(new GroupNumberValidator()); noOfGroupsField.setSizeUndefined(); noOfGroupsField.setMaxLength(3); - noOfGroupsField.addValueChangeListener(evevt -> onGroupNumberChange()); + noOfGroupsField.addValueChangeListener(this::onGroupNumberChange); noOfGroupsField.addTextChangeListener(this::listenerNoOfGroupsTextFieldChanged); return noOfGroupsField; } private void listenerNoOfGroupsTextFieldChanged(final TextChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryTextField(event, noOfGroups); - return; - } - window.checkChanges(noOfGroups.getId(), event.getText(), noOfGroups.getValue()); + window.checkMandatoryEditedTextField(event, originalNoOfGroups); } } - private void onGroupNumberChange() { + private void onGroupNumberChange(final ValueChangeEvent event) { if (noOfGroups.isValid() && !Strings.isNullOrEmpty(noOfGroups.getValue())) { groupSizeLabel.setValue(getTargetPerGroupMessage(String.valueOf(getGroupSize()))); groupSizeLabel.setVisible(true); } else { groupSizeLabel.setVisible(false); } + if (window != null) { + window.setRequiredFieldWhenUpdate(event, noOfGroups); + } } private ComboBox createDistributionSetCombo() { @@ -710,14 +703,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private void listenerDistributionSetChanged(final ValueChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryComboBox(event, distributionSet); - return; - } - if (event.getProperty().getValue() != null) { - window.checkChanges(distributionSet.getId(), event.getProperty().getValue().toString(), - distributionSetOriginal); - } + window.checkMandatoryEditedValue(event, distributionSet, originalDistributionSet); } } @@ -732,7 +718,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { return new LazyQueryContainer( new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_DIST_ID_NAME), distributionQF); - } private TextField createRolloutNameField() { @@ -740,16 +725,19 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { rolloutNameField.setId(SPUIComponentIdProvider.ROLLOUT_NAME_FIELD_ID); rolloutNameField.setSizeUndefined(); rolloutNameField.addTextChangeListener(this::listenerRolloutNameTextFieldChanged); + rolloutNameField.addValueChangeListener(event -> listenerRolloutNameValueChanged(event, rolloutNameField)); return rolloutNameField; } private void listenerRolloutNameTextFieldChanged(final TextChangeEvent event) { if (window != null) { - if (!updateMode) { - window.checkMandatoryTextField(event, rolloutName); - return; - } - window.checkChanges(rolloutName.getId(), event.getText(), rolloutNameOriginal); + window.checkMandatoryEditedTextField(event, originalRolloutName); + } + } + + private void listenerRolloutNameValueChanged(final ValueChangeEvent event, final TextField rolloutNameField) { + if (window != null) { + window.setRequiredFieldWhenUpdate(event, rolloutNameField); } } @@ -851,7 +839,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { description.setValue(rolloutForEdit.getDescription()); distributionSet.setValue(DistributionSetIdName.generate(rolloutForEdit.getDistributionSet())); final List rolloutGroups = rolloutForEdit.getRolloutGroups(); - setThresoldValues(rolloutGroups); + setThresholdValues(rolloutGroups); setActionType(rolloutForEdit); if (rolloutForEdit.getStatus() != RolloutStatus.READY) { disableRequiredFieldsOnEdit(); @@ -870,30 +858,28 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void setOriginalValues() { - distributionSetOriginal = distributionSet.getValue().toString(); - actionGroupOriginal = actionTypeOptionGroupLayout.getActionTypeOptionGroup().getValue(); - rolloutNameOriginal = rolloutName.getValue(); - triggerThresholdOriginal = triggerThreshold.getValue(); - errorThresholdOriginal = errorThreshold.getValue(); - descriptionOriginal = description.getValue(); + originalDistributionSet = distributionSet.getValue().toString(); + originalActionGroup = actionTypeOptionGroupLayout.getActionTypeOptionGroup().getValue(); + originalRolloutName = rolloutName.getValue(); + originalTriggerThreshold = triggerThreshold.getValue(); + originalErrorThreshold = errorThreshold.getValue(); + originalDescription = description.getValue(); + originalNoOfGroups = noOfGroups.getValue(); + if (targetFilterQueryCombo.getValue() != null) { + originalTargetFilterQueryCombo = targetFilterQueryCombo.getValue().toString(); + } } private Map getEditedFields() { final Map changeMap = new HashMap<>(); - if (rolloutForEdit == null) { - return changeMap; - } - if (rolloutForEdit.getStatus() != RolloutStatus.READY) { - changeMap.put(rolloutName.getId(), Boolean.FALSE); - changeMap.put(description.getId(), Boolean.FALSE); - } else { - changeMap.put(rolloutName.getId(), Boolean.FALSE); - changeMap.put(distributionSet.getId(), Boolean.FALSE); - changeMap.put(triggerThreshold.getId(), Boolean.FALSE); - changeMap.put(errorThreshold.getId(), Boolean.FALSE); - changeMap.put(description.getId(), Boolean.FALSE); - changeMap.put(actionTypeOptionGroupLayout.getActionTypeOptionGroup().getId(), Boolean.FALSE); - } + changeMap.put(rolloutName.getId(), Boolean.FALSE); + changeMap.put(distributionSet.getId(), Boolean.FALSE); + changeMap.put(targetFilterQueryCombo.getId(), Boolean.FALSE); + changeMap.put(noOfGroups.getId(), Boolean.FALSE); + changeMap.put(triggerThreshold.getId(), Boolean.FALSE); + changeMap.put(errorThreshold.getId(), Boolean.FALSE); + changeMap.put(description.getId(), Boolean.FALSE); + changeMap.put(actionTypeOptionGroupLayout.getActionTypeOptionGroup().getId(), Boolean.FALSE); return changeMap; } @@ -933,7 +919,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { /** * @param rolloutGroups */ - private void setThresoldValues(final List rolloutGroups) { + private void setThresholdValues(final List rolloutGroups) { if (null != rolloutGroups && !rolloutGroups.isEmpty()) { errorThreshold.setValue(rolloutGroups.get(0).getErrorConditionExp()); triggerThreshold.setValue(rolloutGroups.get(0).getSuccessConditionExp()); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java index d3b17da5f..b40c3d93d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java @@ -67,9 +67,7 @@ import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent; import com.vaadin.ui.renderers.HtmlRenderer; /** - * * Rollout list grid component. - * */ @SpringComponent @ViewScope @@ -159,7 +157,6 @@ public class RolloutListGrid extends AbstractGrid { } item.getItemProperty(ROLLOUT_RENDERER_DATA) .setValue(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString())); - } @Override @@ -200,7 +197,6 @@ public class RolloutListGrid extends AbstractGrid { rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.ACTION, String.class, FontAwesome.CIRCLE_O.getHtml(), false, false); - } @Override @@ -292,7 +288,6 @@ public class RolloutListGrid extends AbstractGrid { for (final Object propertyId : columnsToBeHidden) { getColumn(propertyId).setHidden(true); } - } @Override @@ -315,7 +310,6 @@ public class RolloutListGrid extends AbstractGrid { final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class); customObjectRenderer.addClickListener(this::onClickOfRolloutName); getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer); - } private void createRolloutStatusToFontMap() { @@ -437,8 +431,8 @@ public class RolloutListGrid extends AbstractGrid { } private void onUpdate(final ContextMenuData contextMenuData) { + final CommonDialogWindow addTargetWindow = addUpdateRolloutWindow.getWindow(); addUpdateRolloutWindow.populateData(contextMenuData.getRolloutId()); - final CommonDialogWindow addTargetWindow = addUpdateRolloutWindow.createUpdateWindow(); addTargetWindow.setCaption(i18n.get("caption.update.rollout")); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); @@ -684,7 +678,6 @@ public class RolloutListGrid extends AbstractGrid { public Class getPresentationType() { return String.class; } - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java index 22c57740f..1a3d2d7a5 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java @@ -92,7 +92,7 @@ public class RolloutListHeader extends AbstractGridHeader { @Override protected void addNewItem(final ClickEvent event) { addUpdateRolloutWindow.resetComponents(); - final Window addTargetWindow = addUpdateRolloutWindow.createAddWindow(); + final Window addTargetWindow = addUpdateRolloutWindow.getWindow(); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE);